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>
69 lines
2.4 KiB
Swift
69 lines
2.4 KiB
Swift
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 }
|
|
}
|