import SwiftUI /// Hält die gewählte Akzentfarbe und sorgt dafür, dass sie lesbar bleibt. /// /// Nach außen gibt es nur `accent` — schon kontrastkorrigiert. Views sollen /// sich nie fragen müssen, ob die eingestellte Farbe dunkel genug ist, um /// darauf zu achten. @MainActor @Observable public final class FlaroTheme { private let defaults: UserDefaults /// Was in den Einstellungen ausgewählt ist — unkorrigiert, damit die /// Farbkachel genau das zeigt, was angetippt wurde. public private(set) var selection: AccentOption public init(defaults: UserDefaults = .standard) { self.defaults = defaults self.selection = AccentOption.stored(in: defaults) } /// Die Farbe, die tatsächlich gezeichnet wird. /// /// Bei den kuratierten Werten ändert die Korrektur nichts — sie erfüllen /// den Grenzwert bereits. Sie greift nur bei eigenen Farben. public var accent: RGB { Contrast.legible(selection.color, on: FlaroColor.canvas) } public var accentColor: Color { accent.swiftUIColor } /// Ob die Korrektur bei der aktuellen Auswahl eingegriffen hat. Der /// Einstellungsdialog kann darauf hinweisen, statt den Nutzer rätseln zu /// lassen, warum seine Farbe heller aussieht als gewählt. public var accentWasAdjusted: Bool { accent != selection.color } public func select(_ option: AccentOption) { selection = option option.store(in: defaults) } }