Replace the top-bar menu popup with an off-canvas left drawer, opened by the hamburger or a narrow left-edge swipe (kept off the content area so month/week swipe stay free). The drawer hosts the calendar visibility list, a view switcher, group switching, and quick access to Settings/Accounts/Profile/ Groups/Server plus sync and logout. - extract the filter list into reusable CalendarFilterContent (shared by the drawer and the still-present CalendarFilterSheet); the sheet is now a thin wrapper - new CalendarDrawer view; CalendarHostView hosts it as a ZStack overlay with a scrim and edge-swipe gesture, and presents drawer destinations as sheets - opt-in surface colour: surfaceColor (device-local) tints the flat top bar; empty keeps the translucent .bar material. Settings row with an Auto reset. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
24 lines
829 B
Swift
24 lines
829 B
Swift
import SwiftUI
|
|
|
|
/// Modal wrapper around `CalendarFilterContent` (kept for contexts that still
|
|
/// present the filter as a sheet). The drawer embeds the same content directly.
|
|
struct CalendarFilterSheet: View {
|
|
let api: CalendarrAPI
|
|
let store: CalendarStore
|
|
@Environment(\.dismiss) private var dismiss
|
|
@AppStorage("appLanguage") private var appLang = "system"
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
CalendarFilterContent(api: api, store: store)
|
|
.navigationTitle(L10n.t("filter.title", appLang))
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .primaryAction) {
|
|
Button(L10n.t("nav.done", appLang)) { dismiss() }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|