Neues Library-Product ManaThemeUI (hängt nur an ManaTokens): - ManaAppearanceMode (system/light/dark, colorScheme/label/icon) - ManaAppearancePicker (segmentiert, Binding-basiert) - ManaThemeGallery (LazyVGrid aus Live-Vorschau-Karten je ManaTheme-Variant, Binding-basiert, Reduce-Motion + Haptik) Pure Views über Binding — die App behält Storage-Key + Farb-Resolution, die UI lebt einmal hier statt pro App kopiert. Erstextraktion aus der pageta-Galerie; Verein-Doktrin THEMING.md (jede App bietet alle Variants). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
44 lines
1.1 KiB
Swift
44 lines
1.1 KiB
Swift
import SwiftUI
|
|
|
|
/// Hell/Dunkel/System-Wahl für die App-Appearance — orthogonal zur
|
|
/// Theme-Variant (``ManaTokens/ManaTheme``). `.system` überlässt die
|
|
/// Entscheidung dem OS; sonst forciert die App via
|
|
/// `.preferredColorScheme(_:)`.
|
|
///
|
|
/// Die App persistiert den `rawValue` selbst (typisch `@AppStorage`
|
|
/// unter einem app-eigenen Key) und reicht eine `Binding` an
|
|
/// ``ManaAppearancePicker`` — das Paket schreibt keine UserDefaults.
|
|
public enum ManaAppearanceMode: String, CaseIterable, Identifiable, Sendable {
|
|
case system
|
|
case light
|
|
case dark
|
|
|
|
public var id: String { rawValue }
|
|
|
|
/// SwiftUI-Mapping: `.system` → `nil` (OS entscheidet), sonst explizit.
|
|
public var colorScheme: ColorScheme? {
|
|
switch self {
|
|
case .system: nil
|
|
case .light: .light
|
|
case .dark: .dark
|
|
}
|
|
}
|
|
|
|
/// Deutsches Label für den Picker.
|
|
public var label: String {
|
|
switch self {
|
|
case .system: "Automatisch"
|
|
case .light: "Hell"
|
|
case .dark: "Dunkel"
|
|
}
|
|
}
|
|
|
|
/// SF-Symbol für den Picker.
|
|
public var icon: String {
|
|
switch self {
|
|
case .system: "circle.lefthalf.filled"
|
|
case .light: "sun.max"
|
|
case .dark: "moon"
|
|
}
|
|
}
|
|
}
|