import SwiftUI /// Was die eingeklappte Notch zeigt. /// /// **Unter der Notch, nicht daneben.** Neben ihr wären die Arme zwangsläufig /// gleich breit — die Silhouette zeichnet den Steg mittig um die Hardware, und /// verschieden breite Arme schöben die Lücke aus ihr heraus. Ein Symbol links /// und ein Balken rechts hieße dann 132 Punkte Schwarz für ein Symbol. Darunter /// hängt die Fläche frei und wird genau so breit, wie ihr Inhalt es braucht. /// /// **Die Größe steht im Protokoll, sie wird nicht gemessen.** Eine Notch, die /// sich an ihren Inhalt anpasst, müsste ihn erst zeichnen, seine Größe /// zurückmelden und sich dann bewegen — das ist ein Bild zu spät und sieht als /// Ruckeln aus. Wer eine Activity schreibt, weiß, wie groß sie wird. @MainActor public protocol NotchActivity: Sendable { /// Stabil: eine erneute Anmeldung mit derselben Kennung ersetzt die alte, /// statt sich anzureihen. var id: String { get } /// Höher verdrängt niedriger. var rank: Int { get } /// Wie lange sie steht. `nil` heißt: bis sie zurückgezogen wird. var duration: TimeInterval? { get } /// Die Fläche **unter** der Notch. Ist sie schmaler als die Notch, gibt /// diese das Maß vor — sonst hinge unter dem Steg ein schmalerer Zipfel. var size: CGSize { get } func makeContent() -> AnyView } /// Die Ränge, damit sie an einer Stelle stehen und nicht als Zahlen im Code. /// /// Die Ordnung ist keine Geschmacksfrage: was der Nutzer **selbst gerade /// ausgelöst** hat, muss er sehen — sonst wirkt der Regler kaputt. Was ihn /// warnt, steht darüber, weil er es sonst verpasst. Was nur begleitet, steht /// ganz unten. public enum ActivityRank { /// Läuft im Hintergrund mit, wenn sonst nichts ansteht. public static let ambient = 10 /// Ein Zustand, der sich von selbst geändert hat — Titelwechsel, Kopplung. public static let notice = 30 /// Eine Reaktion auf einen Handgriff — Lautstärke, Helligkeit. public static let response = 50 /// Etwas, das man nicht verpassen darf — Akku fast leer. public static let alert = 90 }