mirror of
https://github.com/phranck/TUIkit.git
synced 2026-05-21 09:50:35 +00:00
87 lines
2.8 KiB
Swift
87 lines
2.8 KiB
Swift
//
|
|
// MainMenuPage.swift
|
|
// TUIkitExample
|
|
//
|
|
// The main menu page with navigation to all demos.
|
|
//
|
|
|
|
import TUIkit
|
|
|
|
/// The main menu page.
|
|
///
|
|
/// Displays a centered menu with all available demos and
|
|
/// feature highlight boxes at the bottom.
|
|
struct MainMenuPage: View {
|
|
@Binding var currentPage: DemoPage
|
|
@Binding var menuSelection: Int
|
|
|
|
var body: some View {
|
|
VStack(spacing: 1) {
|
|
HeaderView(
|
|
title: "TUIkit Example App",
|
|
subtitle: "A SwiftUI-like framework for Terminal User Interfaces"
|
|
)
|
|
|
|
Spacer(minLength: 1)
|
|
|
|
HStack {
|
|
Spacer()
|
|
Menu(
|
|
title: "Select a Demo",
|
|
items: [
|
|
MenuItem(label: "Text Styles", shortcut: "1"),
|
|
MenuItem(label: "Colors", shortcut: "2"),
|
|
MenuItem(label: "Container Views", shortcut: "3"),
|
|
MenuItem(label: "Overlays & Modals", shortcut: "4"),
|
|
MenuItem(label: "Layout System", shortcut: "5"),
|
|
MenuItem(label: "Buttons & Focus", shortcut: "6"),
|
|
MenuItem(label: "Spinners", shortcut: "7"),
|
|
MenuItem(label: "Block Theme Colors", shortcut: "8"),
|
|
],
|
|
selection: $menuSelection,
|
|
onSelect: { index in
|
|
// Navigate to the selected page
|
|
if let page = DemoPage(rawValue: index + 1) {
|
|
currentPage = page
|
|
}
|
|
},
|
|
selectedColor: .palette.accent,
|
|
// borderStyle uses appearance default
|
|
borderColor: .palette.border
|
|
)
|
|
Spacer()
|
|
}
|
|
|
|
Spacer(minLength: 1)
|
|
|
|
// Feature highlights (centered)
|
|
HStack {
|
|
Spacer()
|
|
HStack(spacing: 3) {
|
|
featureBox("Pure Swift", "No ncurses")
|
|
featureBox("Declarative", "SwiftUI-like")
|
|
featureBox("Composable", "View protocol")
|
|
}
|
|
Spacer()
|
|
}
|
|
|
|
Spacer()
|
|
}
|
|
}
|
|
|
|
/// Creates a small feature highlight box.
|
|
///
|
|
/// The border style is automatically derived from the current appearance.
|
|
private func featureBox(_ title: String, _ subtitle: String) -> some View {
|
|
VStack {
|
|
Text(title)
|
|
.bold()
|
|
.foregroundColor(.palette.accent)
|
|
Text(subtitle)
|
|
.foregroundColor(.palette.foregroundSecondary)
|
|
}
|
|
.padding(EdgeInsets(horizontal: 2, vertical: 1))
|
|
.border(color: .palette.border) // Uses appearance default borderStyle
|
|
}
|
|
}
|