Files
Flaro/Packages/FlixyKit/Sources/FlixyDesign/FlixyTheme.swift
T
GuidoandClaude Opus 5 7cfc6e0667 Akzentfarbe zieht sich durch
Picker-Werte leuchteten weiter in der Standardfarbe, während Schalter
und Symbole daneben schon die gewählte trugen. Zwei Ursachen, beide
behoben — welche davon im Einzelfall zog, ließ sich nicht nachstellen,
weil der Bildschirm hinter der Anmeldung liegt.

Erstens stand `.tint` im Scene-Body. Scene-Bodies werten Änderungen an
beobachteten Objekten nicht zuverlässig neu aus; nach einem Farbwechsel
blieb ein Teil der Oberfläche auf dem alten Wert stehen. Jetzt setzt
RootView Tönung und Akzent — eine View wertet zuverlässig neu aus.

Zweitens nahm der Vorgabewert der Umgebung blind die Standardfarbe.
Listen und Formulare zeichnen ihre Zeilen teilweise in einem eigenen
Darstellungskontext, in dem eigene Umgebungswerte verloren gehen; dort
erschien dann Mint statt der gewählten Farbe. Der Vorgabewert liest
jetzt die gespeicherte Auswahl.

Damit das nicht wieder auseinanderläuft, liegt die Speicherung an einer
Stelle: AccentOption.stored/store. Vorher hatte FlixyTheme eigene
Schlüssel — zwei Kopien derselben Namen driften auseinander, und zwar
unbemerkt.

Dazu setzen die Formulare die Tönung ausdrücklich, statt sich auf
Vererbung zu verlassen.

154 Tests, fünf davon zur Speicherung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 09:14:50 +02:00

43 lines
1.5 KiB
Swift

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 FlixyTheme {
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: FlixyColor.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)
}
}