Eine Designschicht statt hundertfach gesetzter Zahlen
Token für Schrift, Symbolgröße, Abstand, Radius und Bewegung, dazu sieben Bauteile, die vorher in jeder Kachel neu gebaut wurden — Karte, Abschnittstitel, Hinweis, Pillenknopf, Regler, Ablegefläche, Haarlinie. Symbole bekommen eine **eigene** Staffel und nicht die der Schrift: ein 9-Punkt-Symbol neben 9-Punkt-Text wirkt kleiner, nicht gleich groß. Beide in eine Staffel zu zwingen hieße, an jeder Stelle gegen sie zu arbeiten. Das Flächenrezept — Tint, Bänderung, Kante — stand zweimal da, einmal für das Panel und einmal für Fenster. Es ist jetzt `OnyxStone`, generisch über die Form, damit auch die animierende Notch-Silhouette es benutzen kann. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
49a3ff0548
commit
ecb39fbe5f
@@ -0,0 +1,68 @@
|
||||
import SwiftUI
|
||||
|
||||
/// Woraus die Fläche gemacht ist.
|
||||
///
|
||||
/// **Der Werkstoff, nicht die Form.** Ob Onyx oben als verschmolzene Notch
|
||||
/// oder als schwebende Insel sitzt, entscheidet `NotchStyle`; woraus diese
|
||||
/// Fläche besteht, steht hier. Beides zu vermengen hieße, eine Insel aus Glas
|
||||
/// nicht bauen zu können, ohne die Notch mitzuändern.
|
||||
///
|
||||
/// Drei Werkstoffe und keine einzelnen Regler. Deckkraft, Glanz und Kante
|
||||
/// hängen voneinander ab: viel Glanz auf einer deckenden Fläche sieht nach
|
||||
/// Fettfilm aus, eine kaum sichtbare Kante auf einer durchscheinenden lässt
|
||||
/// die Form ausfransen. Was man wählt, ist das Zusammenspiel — nicht drei
|
||||
/// Zahlen.
|
||||
public enum NotchMaterial: String, Codable, Sendable, CaseIterable {
|
||||
|
||||
/// Deckend schwarz. Die Voreinstellung, und die einzige, die mit der
|
||||
/// Hardware-Notch verschmilzt: alles andere hätte dort eine sichtbare
|
||||
/// Kante zum Gehäuse.
|
||||
case stone
|
||||
|
||||
/// Durchscheinend — der Hintergrund ist als Weichzeichnung zu ahnen.
|
||||
case blur
|
||||
|
||||
/// Stark durchscheinend, mit deutlichem Glanz und heller Kante.
|
||||
case glass
|
||||
|
||||
/// Wie deckend der Tint über der Vibrancy-Ebene liegt.
|
||||
public var fillOpacity: Double {
|
||||
switch self {
|
||||
case .stone: 1.0
|
||||
case .blur: 0.72
|
||||
case .glass: 0.42
|
||||
}
|
||||
}
|
||||
|
||||
/// Der Glanz von oben — die Bänderung des Steins.
|
||||
///
|
||||
/// Wächst mit der Durchlässigkeit: auf deckendem Schwarz genügt ein Hauch,
|
||||
/// auf Glas ist er das, was die Fläche überhaupt als Körper lesbar macht.
|
||||
public var sheen: Double {
|
||||
switch self {
|
||||
case .stone: 0.02
|
||||
case .blur: 0.04
|
||||
case .glass: 0.10
|
||||
}
|
||||
}
|
||||
|
||||
/// Die Kante.
|
||||
///
|
||||
/// Je durchlässiger die Fläche, desto mehr Arbeit muss die Kante leisten —
|
||||
/// sie ist dann das Einzige, was die Form von dem trennt, was durch sie
|
||||
/// hindurch zu sehen ist.
|
||||
public var edge: Color {
|
||||
switch self {
|
||||
case .stone: Onyx.Color.hairline
|
||||
case .blur: .white.opacity(0.12)
|
||||
case .glass: .white.opacity(0.20)
|
||||
}
|
||||
}
|
||||
|
||||
/// Ob die Vibrancy-Ebene überhaupt etwas beiträgt.
|
||||
///
|
||||
/// Bei `stone` nicht — dort liegt sie vollständig unter deckendem Schwarz.
|
||||
/// Das ist keine Verschwendung, sondern der Preis dafür, dass ein Wechsel
|
||||
/// des Werkstoffs kein Neuaufbau des Fensters ist.
|
||||
public var showsVibrancy: Bool { self != .stone }
|
||||
}
|
||||
Reference in New Issue
Block a user