Files
TUIkit/Sources/TUIkitExample/Pages/ContainersPage.swift
T
phranck f77cd8bdec Chore: Unified file headers across all Swift files
Update IDETemplateMacros.plist and replace headers in 136 Swift files with
new format: 🖥️ TUIKit — Terminal UI Kit for Swift. Remove sdsd.swift template draft.
2026-02-03 20:48:29 +01:00

126 lines
5.3 KiB
Swift
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 🖥 TUIKit Terminal UI Kit for Swift
// ContainersPage.swift
//
// Created by LAYERED.work
// CC BY-NC-SA 4.0
import TUIkit
/// Container views demo page.
///
/// Shows various container views including:
/// - Card (bordered container with padding)
/// - Box (simple bordered container)
/// - Panel (container with title in border)
/// - ContainerView (with header and footer)
/// - Collapsible detail section demonstrating `@State` toggle
struct ContainersPage: View {
@State var showDetails: Bool = false
var body: some View {
VStack(spacing: 1) {
HeaderView(title: "Container Views Demo")
HStack(spacing: 2) {
// Card example
VStack(alignment: .leading) {
Text("Card").bold().foregroundColor(.palette.accent)
Card(borderColor: .palette.border) {
Text("A Card view").foregroundColor(.palette.foreground)
Text("with padding").foregroundColor(.palette.foregroundSecondary)
}
}
// Box example
VStack(alignment: .leading) {
Text("Box").bold().foregroundColor(.palette.accent)
Box(color: .palette.border) {
Text("Simple Box").foregroundColor(.palette.foreground)
}
}
// Panel example
VStack(alignment: .leading) {
Text("Panel").bold().foregroundColor(.palette.accent)
Panel("Info", titleColor: .palette.accent) {
Text("Title in border").foregroundColor(.palette.foreground)
}
}
}
HStack(spacing: 2) {
// Panel with Header and Footer (best for block appearance)
DemoSection("Panel (Header + Footer)") {
Panel("Settings", titleColor: .palette.accent) {
Text("Primary text (foreground)").foregroundColor(.palette.foreground)
Text("Secondary text (foregroundSecondary)").foregroundColor(.palette.foregroundSecondary)
Text("Tertiary text (foregroundTertiary)").foregroundColor(.palette.foregroundTertiary)
} footer: {
Text("Footer: Press Enter to confirm").foregroundColor(.palette.foreground)
}
}
// Alignment examples - uses different text lengths to show alignment
DemoSection("Content Alignment") {
HStack(spacing: 1) {
Box {
VStack(alignment: .leading) {
Text("Leading align").foregroundColor(.palette.foreground)
Text("short").foregroundColor(.palette.foregroundSecondary)
}
}
Box {
VStack(alignment: .center) {
Text("Center align").foregroundColor(.palette.foreground)
Text("short").foregroundColor(.palette.foregroundSecondary)
}
}
Box {
VStack(alignment: .trailing) {
Text("Trailing align").foregroundColor(.palette.foreground)
Text("short").foregroundColor(.palette.foregroundSecondary)
}
}
}
}
}
DemoSection("Collapsible Detail (@State)") {
VStack(alignment: .leading) {
HStack(spacing: 2) {
Button(showDetails ? "Hide Details" : "Show Details") {
showDetails.toggle()
}
Text(showDetails ? "expanded" : "collapsed")
.dim()
}
if showDetails {
Panel("Padding Examples", titleColor: .palette.accent) {
HStack(spacing: 1) {
Box {
Text("h:1 v:0").foregroundColor(.palette.foreground)
.padding(.horizontal, 1)
}
Box {
Text("h:1 v:1").foregroundColor(.palette.foreground)
.padding(EdgeInsets(horizontal: 1, vertical: 1))
}
Box {
Text("h:1 v:2").foregroundColor(.palette.foreground)
.padding(EdgeInsets(horizontal: 1, vertical: 2))
}
}
}
}
}
}
DemoSection("Appearance & BorderStyle") {
Text("BorderStyle is determined by Appearance. Press 'a' to cycle.").foregroundColor(.palette.foregroundSecondary)
}
Spacer()
}
}
}