import SwiftUI import OnyxDesign import OnyxWidgetKit /// Vorläufige Widgets für Phase 2. /// /// Sie tragen keine echten Daten — ihr Zweck ist zu belegen, dass Registry, /// Layout-Engine, Persistenz und Panelgröße zusammenspielen, bevor die Provider /// dazukommen. Jedes wird in seiner Phase durch das echte Widget ersetzt; die /// Kennungen bleiben dabei gleich, damit gespeicherte Layouts weitergelten. struct PlaceholderWidget: OnyxWidget { let id: String let displayName: String let symbolName: String let supportedSizes: [WidgetSize] /// In welcher Phase dieses Widget echt wird. let phase: String func makeView(size: WidgetSize) -> AnyView { AnyView( VStack(alignment: .leading, spacing: 6) { HStack(spacing: 6) { Image(systemName: symbolName) .font(.system(size: 12, weight: .medium)) .foregroundStyle(Onyx.Color.accent) Text(displayName) .font(Onyx.Font.caption) .foregroundStyle(Onyx.Color.textSecondary) } Spacer(minLength: 0) Text(phase) .font(Onyx.Font.caption) .foregroundStyle(Onyx.Color.textTertiary) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) ) } } @MainActor enum PlaceholderWidgets { /// Registriert nur noch die Karten, deren echte Fassung fehlt. Sobald ein /// Widget umgesetzt ist, verschwindet es hier — die Kennung bleibt gleich, /// damit gespeicherte Layouts weitergelten. static func registerAll() { let widgets: [PlaceholderWidget] = [ .init(id: "fans", displayName: "Lüfter", symbolName: "fan", supportedSizes: [.small, .medium], phase: "Phase 6"), .init(id: "audio", displayName: "Audio-Mixer", symbolName: "slider.horizontal.3", supportedSizes: [.medium, .large], phase: "Phase 7"), .init(id: "shelf", displayName: "Ablage", symbolName: "tray.full", supportedSizes: [.small, .medium], phase: "Phase 8"), .init(id: "airdrop", displayName: "AirDrop", symbolName: "shareplay", supportedSizes: [.small], phase: "Phase 8"), ] widgets.forEach { WidgetRegistry.shared.register($0) } } }