From a3651a93647f006d43705959a2b19cf451c8d15f Mon Sep 17 00:00:00 2001 From: psavarmattas Date: Sat, 15 Aug 2026 20:30:08 +0100 Subject: [PATCH] feat(settings): Preferences appearance setting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reuses the existing local Appearance color-scheme picker instead of a second divergent implementation — this has always been a device-side preference in this app, not a server-synced one. --- Outpost/Features/Account/SettingsView.swift | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Outpost/Features/Account/SettingsView.swift b/Outpost/Features/Account/SettingsView.swift index 8677af2..27e6920 100644 --- a/Outpost/Features/Account/SettingsView.swift +++ b/Outpost/Features/Account/SettingsView.swift @@ -245,6 +245,8 @@ struct SettingsView: View { preferencesSubsection("Display") { languageRow + Divider() + appearanceRow } } .frame(maxWidth: 480, alignment: .leading) @@ -292,6 +294,30 @@ struct SettingsView: View { } } + /// Same `@AppStorage("outpost.appearance")` binding the standalone + /// Appearance section already uses — this is a local-only, device-side + /// preference (matches how this app has always handled it), not a + /// server-synced Outline preference, so it doesn't need its own + /// save call or error state. + private var appearanceRow: some View { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text("Appearance") + Text("Choose your preferred interface colour scheme.") + .font(.caption) + .foregroundStyle(.secondary) + } + Spacer() + Picker("Appearance", selection: $appearance) { + ForEach(AppAppearance.allCases) { option in + Text(option.label).tag(option) + } + } + .labelsHidden() + .frame(width: 200) + } + } + private var languageBinding: Binding { Binding( get: { session.userLanguage ?? "en_US" },