From 4920ec5aebb867c6819a01588e0438d7d9ca4575 Mon Sep 17 00:00:00 2001 From: Qiu Yuzhou Date: Tue, 13 Oct 2026 13:22:24 +0800 Subject: [PATCH] feat(ui): improve LAN credential inputs --- .../UI/Settings/LANListeningEditorSheet.swift | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/ShadowsocksX-NG2/App/UI/Settings/LANListeningEditorSheet.swift b/ShadowsocksX-NG2/App/UI/Settings/LANListeningEditorSheet.swift index 6f97c132..d39c8512 100644 --- a/ShadowsocksX-NG2/App/UI/Settings/LANListeningEditorSheet.swift +++ b/ShadowsocksX-NG2/App/UI/Settings/LANListeningEditorSheet.swift @@ -10,6 +10,7 @@ struct LANListeningEditorSheet: View { @Environment(\.dismiss) private var dismiss @State private var draft: LANListeningDraft @State private var saveError: String? + @State private var showPassword = false init(workflow: SettingsWorkflow, initialDraft: LANListeningDraft) { self.workflow = workflow @@ -80,12 +81,35 @@ struct LANListeningEditorSheet: View { HStack { Text("用户名") Spacer() - TextField("用户名", text: $draft.username).frame(width: 230) + TextField("用户名", text: $draft.username) + .frame(width: 230) + .autocorrectionDisabled() } HStack { Text("密码") Spacer() - SecureField("密码", text: $draft.password).frame(width: 230) + HStack(spacing: 8) { + Group { + if showPassword { + TextField("密码", text: $draft.password) + .background(PasswordAutofillOptOut()) + } else { + SecureField("密码", text: $draft.password) + .background(PasswordAutofillOptOut()) + } + } + .textContentType(nil) + .autocorrectionDisabled() + Button { + showPassword.toggle() + } label: { + Image(systemName: showPassword ? "eye.slash" : "eye") + } + .buttonStyle(.borderless) + .help(showPassword ? "隐藏密码" : "显示密码") + .accessibilityLabel(showPassword ? "隐藏密码" : "显示密码") + } + .frame(width: 230) } } .textFieldStyle(.roundedBorder)