feat: apply pink Opal design with reactive square persona
This commit is contained in:
1 parent
5b41b3924a
commit
74d2b63614
8 files changed
+199
-57
No files matched your search
@@ -7,13 +7,24 @@ struct LoginView: View {
|
||||
@State private var password = ""
|
||||
@State private var server = ""
|
||||
@State private var serverError: String?
|
||||
@Environment(\.dynamicTypeSize) private var typeSize
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
Form {
|
||||
Section {
|
||||
Text("Sign in to Hope").font(.title2.bold())
|
||||
Text("Use the account provided by your server administrator. Hermes is managed by your server.")
|
||||
.foregroundStyle(.secondary)
|
||||
VStack(alignment: .leading, spacing: Nearlight.s12) {
|
||||
Text("Sign in to Hope")
|
||||
.font(NearlightFont.welcome(typeSize))
|
||||
.foregroundStyle(Nearlight.ink)
|
||||
.accessibilityAddTraits(.isHeader)
|
||||
Text("Use the account provided by your server administrator. Hermes is managed by your server.")
|
||||
.font(.body)
|
||||
.foregroundStyle(Nearlight.quiet)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
.padding(.vertical, Nearlight.s16)
|
||||
.listRowBackground(Nearlight.ground)
|
||||
.listRowSeparator(.hidden)
|
||||
}
|
||||
Section("Account") {
|
||||
TextField("Username", text: $username).textContentType(.username)
|
||||
@@ -24,10 +35,20 @@ struct LoginView: View {
|
||||
password = ""
|
||||
Task { await auth.login(username: username, password: suppliedPassword) }
|
||||
}
|
||||
.font(NearlightFont.control(typeSize))
|
||||
.buttonStyle(.borderedProminent)
|
||||
.tint(Nearlight.rosewood)
|
||||
.foregroundStyle(Nearlight.onRosewood)
|
||||
.frame(minHeight: 44)
|
||||
.padding(.vertical, Nearlight.s4)
|
||||
.disabled(auth.isBusy || username.isEmpty || password.isEmpty)
|
||||
if auth.isBusy { ProgressView("Signing in…") }
|
||||
if let error = auth.error { Text(error).foregroundStyle(.red) }
|
||||
if auth.isBusy { ProgressView("Signing in…").tint(Nearlight.rosewood) }
|
||||
if let error = auth.error {
|
||||
Text(error).foregroundStyle(Nearlight.alert)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
}
|
||||
.listRowBackground(Nearlight.surface)
|
||||
Section("Server") {
|
||||
TextField("HTTPS server address", text: $server).keyboardType(.URL)
|
||||
.textInputAutocapitalization(.never).autocorrectionDisabled()
|
||||
@@ -37,17 +58,28 @@ struct LoginView: View {
|
||||
case .failure(let error): serverError = error.localizedDescription
|
||||
}
|
||||
}.disabled(auth.isBusy)
|
||||
if let serverError { Text(serverError).foregroundStyle(.red) }
|
||||
if let serverError {
|
||||
Text(serverError).foregroundStyle(Nearlight.alert)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
Text("Connections use HTTPS and secure WebSockets. A private server certificate must be trusted by this iPhone for conversations.")
|
||||
.font(.footnote).foregroundStyle(.secondary)
|
||||
.font(.footnote).foregroundStyle(Nearlight.quiet)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
if auth.config.baseURL.host == TLSPinning.host, auth.config.baseURL.port == 9178 {
|
||||
Link("Install Hope server certificate in Safari", destination: auth.config.baseURL.appendingPathComponent("hope-server.mobileconfig"))
|
||||
Text("Install Hope LAN Server Trust in Settings → General → VPN & Device Management. Then enable 192.168.86.2 in Settings → General → About → Certificate Trust Settings. Only trust this certificate for your own server.")
|
||||
.font(.footnote).foregroundStyle(.secondary)
|
||||
.font(.footnote).foregroundStyle(Nearlight.quiet)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
}
|
||||
.listRowBackground(Nearlight.surface)
|
||||
}
|
||||
.foregroundStyle(Nearlight.ink)
|
||||
.tint(Nearlight.rosewood)
|
||||
.scrollContentBackground(.hidden)
|
||||
.background(Nearlight.ground)
|
||||
.navigationTitle("Hope")
|
||||
.toolbarBackground(Nearlight.ground, for: .navigationBar)
|
||||
.onAppear { server = settings.serverURL }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user