From 6eb780d1bd0520cc0ccd52b42f1d401b15285403 Mon Sep 17 00:00:00 2001 From: psmattas Date: Tue, 18 Aug 2026 14:18:26 +0100 Subject: [PATCH] feat(settings): Passkeys section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Informational only, per Outline itself — passkey/WebAuthn registration needs a browser context, so this stays web-only rather than a placeholder for missing native functionality. --- Outpost/Features/Account/SettingsView.swift | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Outpost/Features/Account/SettingsView.swift b/Outpost/Features/Account/SettingsView.swift index 433a4af..3c0e14b 100644 --- a/Outpost/Features/Account/SettingsView.swift +++ b/Outpost/Features/Account/SettingsView.swift @@ -82,6 +82,7 @@ struct SettingsView: View { case .profile: profileDetail case .preferences: preferencesDetail case .notifications: notificationsDetail + case .passkeys: passkeysDetail case .offlineSync: offlineSyncDetail case .advanced: advancedDetail case .about: aboutDetail @@ -715,6 +716,29 @@ struct SettingsView: View { } } + // MARK: - Passkeys + + /// Read-only on purpose — Outline only exposes passkey management from + /// its own web app (WebAuthn registration needs a browser context this + /// native app doesn't have), so this page is informational, not a + /// placeholder for missing functionality. + private var passkeysDetail: some View { + VStack(alignment: .leading, spacing: 16) { + sectionHeader + Text("Passkeys allow you to sign in safely without a password using your device's biometric authentication (Face ID, Touch ID, Windows Hello) or security key.") + .font(.subheadline) + .foregroundStyle(.secondary) + .frame(maxWidth: 480, alignment: .leading) + + Label("This setting can only be changed from the web version of Outline.", systemImage: "lock.fill") + .font(.callout) + .foregroundStyle(.secondary) + .padding(12) + .frame(maxWidth: 480, alignment: .leading) + .background(.quaternary.opacity(0.5), in: RoundedRectangle(cornerRadius: 8, style: .continuous)) + } + } + // MARK: - Offline & Sync private var offlineSyncDetail: some View {