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 } }