The boards stack becomes the root screen: Settings moves from its own tab to a sheet behind a leading gearshape button, the sort pickers trade their text segments for symbols (hand.draw, textformat.abc, clock) with the words kept for accessibility, and every list now opens sorted by most recent change. UI tests re-aimed at the gear button and Done-button scoping fixed for the sheet-over-sheet nav bars — 4/4 green in the simulator. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
35 lines
1.3 KiB
Swift
35 lines
1.3 KiB
Swift
import SwiftUI
|
|
import IndieAbout
|
|
|
|
/// The About section (indie-about skill). Presented as a sheet from `BoardsTabView`'s gear
|
|
/// button, so it carries its own navigation stack and a Done button to dismiss itself.
|
|
struct SettingsScreen: View {
|
|
@Environment(BoardIndexStore.self) private var index
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
// Same voice as the Mac app's `AboutBox.configuration`; the changelog itself is
|
|
// the phone app's own (see project.yml — separate product, separate 1.0).
|
|
Section {
|
|
IndieAbout(configuration: .init(
|
|
copyrightText: "© 2026 rzen",
|
|
documents: [.license(extension: "md")],
|
|
changelogDocument: .changelog()
|
|
))
|
|
}
|
|
}
|
|
.navigationTitle("Settings")
|
|
.toolbar {
|
|
ToolbarItem(placement: .topBarTrailing) {
|
|
Button("Done") { dismiss() }
|
|
}
|
|
}
|
|
}
|
|
// Idempotent (BoardIndexStore.start()), and harmless if BoardsTabView already called it —
|
|
// defensive only, since the boards screen is always what starts the index now.
|
|
.task { index.start() }
|
|
}
|
|
}
|