import SwiftUI import FlixyDesign /// Die Wurzelansicht. /// /// Legt fest, in welcher Form die Seitenleiste erscheint: auf dem iPhone als /// ausfahrbares Blatt, auf dem iPad dauerhaft neben dem Inhalt. Beide Wege /// nutzen dieselbe `SidebarView` — der Unterschied liegt nur im Rahmen. struct RootView: View { @Environment(\.horizontalSizeClass) private var sizeClass @State private var selection: SidebarDestination = .home @State private var isSidebarOpen = false /// Kommt in Phase 1 vom Server. Solange leer, blendet die Seitenleiste den /// Abschnitt aus, statt eine leere Überschrift zu zeigen. @State private var libraries: [SidebarDestination] = [] var body: some View { Group { if sizeClass == .regular { splitLayout } else { drawerLayout } } .background(Color.flixyCanvas) } /// iPad: die Seitenleiste ist Teil des Fensters und lässt sich über den /// Systemknopf einklappen. private var splitLayout: some View { NavigationSplitView { SidebarView(libraries: libraries, selection: $selection, showsHeader: false) {} .navigationTitle(Branding.appName) .toolbar(removing: .sidebarToggle) } detail: { NavigationStack { destination } } } /// iPhone: die Seitenleiste fährt über den Inhalt. private var drawerLayout: some View { DrawerContainer(isOpen: $isSidebarOpen) { SidebarView(libraries: libraries, selection: $selection) { isSidebarOpen = false } } content: { NavigationStack { destination .toolbar { ToolbarItem(placement: .topBarLeading) { Button { withAnimation(.snappy(duration: 0.28)) { isSidebarOpen = true } } label: { Image(systemName: "line.3.horizontal") } .accessibilityLabel(Text("sidebar.open")) } } } } } @ViewBuilder private var destination: some View { switch selection { case .home: PlaceholderScreen(destination: .home) case .library(let key, let title): PlaceholderScreen(destination: .library(key: key, title: title)) case .liveTV: PlaceholderScreen(destination: .liveTV) case .downloads: PlaceholderScreen(destination: .downloads) case .settings: PlaceholderScreen(destination: .settings) } } }