Files
letro-ios/compound-ios/Inspector/Sources/System Components/NavigationBarScreen.swift
2025-09-29 10:41:01 +01:00

111 lines
3.9 KiB
Swift

//
// Copyright 2023, 2024 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
// Please see LICENSE files in the repository root for full details.
//
import SwiftUI
import Compound
struct NavigationBarScreen: View {
enum TitleMode {
case large
case inline
case hidden
}
enum BackButtonMode {
case navigation
case cancellationAction
case hidden
}
@State private var titleMode = TitleMode.inline
@State private var backButtonMode = BackButtonMode.navigation
@State private var hasConfirmationAction = true
@State private var hasPrimaryAction = false
var body: some View {
Form {
Section {
ListRow(kind: .custom {
Text("This component may be rendered differently when running on macOS.")
.font(.compound.bodySM)
.foregroundColor(.compound.textSecondary)
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity)
.listRowBackground(Color.clear)
})
}
Section {
ListRow(label: .plain(title: "Title"),
kind: .picker(selection: $titleMode, items: [
(title: "Large", tag: .large),
(title: "Inline", tag: .inline),
(title: "Hidden", tag: .hidden)
]))
ListRow(label: .plain(title: "Back Button"),
kind: .picker(selection: $backButtonMode, items: [
(title: "Navigation", tag: .navigation),
(title: "Cancelation Action", tag: .cancellationAction),
(title: "Hidden", tag: .hidden)
]))
ListRow(label: .plain(title: "Confirmation Action"),
kind: .toggle($hasConfirmationAction))
ListRow(label: .plain(title: "Primary Action"),
kind: .toggle($hasPrimaryAction))
} header: {
Text("Configuration")
.compoundListSectionHeader()
}
Section {
ListRow(kind: .custom {
VStack {
Text("Empty section to make the form scrollable")
.font(.compound.bodySM)
.foregroundColor(.compound.textSecondary)
Spacer(minLength: 500)
}
.padding(ListRowPadding.insets)
})
}
}
.compoundList()
.navigationTitle(titleMode == .hidden ? "" : "Navigation Bar")
.navigationBarTitleDisplayMode(titleMode == .large ? .large : .inline)
.navigationBarBackButtonHidden(backButtonMode != .navigation)
.toolbar {
if hasConfirmationAction {
ToolbarItem(placement: .confirmationAction) {
Button("Confirm") { }
}
}
if hasPrimaryAction {
ToolbarItem(placement: .primaryAction) {
Button("Primary") { }
}
}
if backButtonMode == .cancellationAction {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") { }
}
}
}
}
}
struct NavigationBarScreen_Previews: PreviewProvider {
static var previews: some View {
NavigationStack {
NavigationBarScreen()
}
.previewLayout(.fixed(width: 375, height: 750))
}
}