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>
30 lines
887 B
Swift
30 lines
887 B
Swift
import SwiftUI
|
|
|
|
/// Segmentierter Hell/Dunkel/Automatik-Wähler. Pure View — bindet an
|
|
/// eine app-gehaltene ``ManaAppearanceMode``-Auswahl (typisch
|
|
/// `@AppStorage`), persistiert selbst nichts.
|
|
///
|
|
/// ```swift
|
|
/// @AppStorage("myapp.appearance") private var raw = ManaAppearanceMode.system.rawValue
|
|
/// ManaAppearancePicker(selection: Binding(
|
|
/// get: { ManaAppearanceMode(rawValue: raw) ?? .system },
|
|
/// set: { raw = $0.rawValue }
|
|
/// ))
|
|
/// ```
|
|
public struct ManaAppearancePicker: View {
|
|
@Binding private var selection: ManaAppearanceMode
|
|
|
|
public init(selection: Binding<ManaAppearanceMode>) {
|
|
_selection = selection
|
|
}
|
|
|
|
public var body: some View {
|
|
Picker("Erscheinung", selection: $selection) {
|
|
ForEach(ManaAppearanceMode.allCases) { mode in
|
|
Label(mode.label, systemImage: mode.icon).tag(mode)
|
|
}
|
|
}
|
|
.pickerStyle(.segmented)
|
|
.labelsHidden()
|
|
}
|
|
}
|