summaryrefslogtreecommitdiff
path: root/Hutch/App/ThemeManager.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-12 19:47:57 -0500
committerChristian Cleberg <[email protected]>2026-04-12 19:47:57 -0500
commit1354f2464180ece6d13296a543a964ddf6d2d393 (patch)
tree5cf6ddb89c950941067e2a1080a150911d5fb4e7 /Hutch/App/ThemeManager.swift
parent4ad1b74c5887ddf0445fde29ffacfc6eb5d49b3f (diff)
downloadhutch-1354f2464180ece6d13296a543a964ddf6d2d393.tar.gz
hutch-1354f2464180ece6d13296a543a964ddf6d2d393.tar.bz2
hutch-1354f2464180ece6d13296a543a964ddf6d2d393.zip
feat: add theme and high-density display modes
Refs: https://todo.sr.ht/~ccleberg/hutch/24 Implements: https://todo.sr.ht/~ccleberg/hutch/25
Diffstat (limited to 'Hutch/App/ThemeManager.swift')
-rw-r--r--Hutch/App/ThemeManager.swift76
1 files changed, 76 insertions, 0 deletions
diff --git a/Hutch/App/ThemeManager.swift b/Hutch/App/ThemeManager.swift
new file mode 100644
index 0000000..ee74921
--- /dev/null
+++ b/Hutch/App/ThemeManager.swift
@@ -0,0 +1,76 @@
+import SwiftUI
+
+// MARK: - Theme & Density Types
+
+enum AppTheme: String, CaseIterable, Identifiable {
+ case system
+ case light
+ case dark
+
+ var id: String { rawValue }
+
+ var label: String {
+ switch self {
+ case .system: "System"
+ case .light: "Light"
+ case .dark: "Dark"
+ }
+ }
+
+ var colorScheme: ColorScheme? {
+ switch self {
+ case .system: nil
+ case .light: .light
+ case .dark: .dark
+ }
+ }
+}
+
+enum DisplayDensity: String, CaseIterable, Identifiable {
+ case standard
+ case compact
+
+ var id: String { rawValue }
+
+ var label: String {
+ switch self {
+ case .standard: "Standard"
+ case .compact: "Compact"
+ }
+ }
+}
+
+// MARK: - Environment Keys
+
+private struct DisplayDensityKey: EnvironmentKey {
+ static let defaultValue: DisplayDensity = .standard
+}
+
+extension EnvironmentValues {
+ var displayDensity: DisplayDensity {
+ get { self[DisplayDensityKey.self] }
+ set { self[DisplayDensityKey.self] = newValue }
+ }
+}
+
+// MARK: - Themed List Modifier
+
+/// Combined modifier for List/Form that applies compact section spacing.
+/// Apply once per List or Form.
+struct ThemedListStyle: ViewModifier {
+ @Environment(\.displayDensity) private var density
+
+ func body(content: Content) -> some View {
+ content
+ .listSectionSpacing(density == .compact ? .compact : .default)
+ .contentMargins(.vertical, density == .compact ? 2 : 8, for: .scrollContent)
+ .controlSize(density == .compact ? .small : .regular)
+ }
+}
+
+extension View {
+ /// Apply themed appearance (density spacing) to a List or Form.
+ func themedList() -> some View {
+ modifier(ThemedListStyle())
+ }
+}