2026-02-19 22:38:45 -08:00
|
|
|
import SwiftUI
|
|
|
|
|
|
2026-02-20 00:09:02 -08:00
|
|
|
public struct SplitView: View {
|
|
|
|
|
@State private var viewModel = SybilViewModel()
|
|
|
|
|
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
|
|
|
|
|
|
2026-05-02 17:10:32 -07:00
|
|
|
@MainActor public init() {
|
2026-05-02 16:23:00 -07:00
|
|
|
SybilFontRegistry.registerIfNeeded()
|
2026-05-02 17:10:32 -07:00
|
|
|
SybilTheme.applySystemAppearance()
|
2026-05-02 16:23:00 -07:00
|
|
|
}
|
2026-02-20 00:09:02 -08:00
|
|
|
|
2026-02-19 22:38:45 -08:00
|
|
|
public var body: some View {
|
2026-02-20 00:09:02 -08:00
|
|
|
ZStack {
|
|
|
|
|
SybilTheme.backgroundGradient
|
|
|
|
|
.ignoresSafeArea()
|
|
|
|
|
|
|
|
|
|
if viewModel.isCheckingSession {
|
|
|
|
|
ProgressView("Checking session…")
|
|
|
|
|
.tint(SybilTheme.primary)
|
|
|
|
|
.foregroundStyle(SybilTheme.textMuted)
|
|
|
|
|
} else if !viewModel.isAuthenticated {
|
|
|
|
|
SybilConnectionView(viewModel: viewModel)
|
|
|
|
|
.padding()
|
|
|
|
|
} else if horizontalSizeClass == .compact {
|
|
|
|
|
SybilPhoneShellView(viewModel: viewModel)
|
|
|
|
|
} else {
|
|
|
|
|
NavigationSplitView {
|
|
|
|
|
SybilSidebarView(viewModel: viewModel)
|
|
|
|
|
} detail: {
|
|
|
|
|
SybilWorkspaceView(viewModel: viewModel)
|
|
|
|
|
}
|
|
|
|
|
.navigationSplitViewStyle(.balanced)
|
|
|
|
|
.tint(SybilTheme.primary)
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-05-02 16:23:00 -07:00
|
|
|
.font(.sybil(.body))
|
2026-05-02 17:10:32 -07:00
|
|
|
.preferredColorScheme(.dark)
|
2026-02-20 00:09:02 -08:00
|
|
|
.task {
|
|
|
|
|
await viewModel.bootstrap()
|
|
|
|
|
}
|
2026-02-19 22:38:45 -08:00
|
|
|
}
|
|
|
|
|
}
|