mirror of
https://github.com/phranck/TUIkit.git
synced 2026-06-20 09:54:37 +00:00
- Toggle struct with string initializer for SwiftUI API parity - ToggleStyle enum: .toggle (slider ●○) and .checkbox ([x]) - ToggleHandler for Space/Enter keyboard events - Focus indicator with pulsing accent dot (inherited from Button pattern) - Disabled state with tertiary color - .disabled() modifier for control - Comprehensive tests (17 tests, 571 total passing) - TogglePage example with both styles, disabled states, and live state demo - Added to main menu with shortcut key 7
108 lines
3.5 KiB
Swift
108 lines
3.5 KiB
Swift
// 🖥️ TUIKit — Terminal UI Kit for Swift
|
|
// MainMenuPage.swift
|
|
//
|
|
// Created by LAYERED.work
|
|
// License: MIT
|
|
|
|
import TUIkit
|
|
|
|
/// A small feature highlight box with a bold title and subtitle.
|
|
///
|
|
/// Used on the main menu to showcase key framework properties.
|
|
/// Stateless and palette-driven — wrapped in `.equatable()` for
|
|
/// subtree memoization during Spinner/Pulse animation frames.
|
|
struct FeatureBox: View, Equatable {
|
|
/// The bold headline text.
|
|
let title: String
|
|
|
|
/// The secondary description text.
|
|
let subtitle: String
|
|
|
|
init(_ title: String, _ subtitle: String) {
|
|
self.title = title
|
|
self.subtitle = subtitle
|
|
}
|
|
|
|
var body: some View {
|
|
VStack {
|
|
Text(title)
|
|
.bold()
|
|
.foregroundColor(.palette.accent)
|
|
Text(subtitle)
|
|
.foregroundColor(.palette.foregroundSecondary)
|
|
}
|
|
.padding(EdgeInsets(horizontal: 2, vertical: 1))
|
|
.border(color: .palette.border)
|
|
}
|
|
}
|
|
|
|
/// 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) {
|
|
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: "Toggles & Checkboxes", shortcut: "7"),
|
|
MenuItem(label: "Spinners", 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").equatable()
|
|
FeatureBox("Declarative", "SwiftUI-like").equatable()
|
|
FeatureBox("Composable", "View protocol").equatable()
|
|
}
|
|
Spacer()
|
|
}
|
|
|
|
Spacer()
|
|
}
|
|
.appHeader {
|
|
VStack {
|
|
HStack {
|
|
Text("TUIkit Example App").bold().foregroundColor(.palette.accent)
|
|
Spacer()
|
|
Text("TUIkit v\(tuiKitVersion)").foregroundColor(.palette.foregroundTertiary)
|
|
}
|
|
Text("A SwiftUI-like framework for Terminal User Interfaces")
|
|
.foregroundColor(.palette.foregroundSecondary)
|
|
.italic()
|
|
}
|
|
}
|
|
}
|
|
}
|