Files
ScarriffleandClaude Opus 5 9b600de9a9 Live Activities unter der Notch, nicht daneben
Neben ihr wären die Arme zwangsläufig gleich breit — die Silhouette zeichnet den
Steg mittig um die Hardware. 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 so
breit, wie ihr Inhalt es braucht.

Lautstärke, Strom, Titelwechsel und Helligkeit. Gemeldet wird nur, was sich
**geändert** hat: `PowerWatcher` schweigt beim ersten gelesenen Zustand, sonst
begrüßte Onyx jeden Start mit „am Netz".

Die Helligkeit kostete einen Spike. Von drei Wegen trägt nur `DisplayServices`,
und nur für den eingebauten Bildschirm. `CoreDisplay` — der Weg, den jede
Anleitung empfiehlt — gibt für alle Bildschirme 1.0 zurück, auch für den, der
auf 62 % stand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 21:05:13 +02:00

51 lines
2.1 KiB
Swift

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
}