// 🖥️ TUIKit — Terminal UI Kit for Swift // ContainersPage.swift // // Created by LAYERED.work // License: MIT import TUIkit /// Static row showing Card, Box, and Panel side by side. /// /// Purely palette-driven, no state — wrapped in `.equatable()` for /// subtree memoization during Spinner/Pulse animation frames. struct ContainerTypesRow: View, Equatable { var body: some View { HStack(spacing: 2) { VStack(alignment: .leading) { Text("Card").bold().foregroundStyle(.palette.accent) Card(borderColor: .palette.border) { Text("A Card view").foregroundStyle(.palette.foreground) Text("with padding").foregroundStyle(.palette.foregroundSecondary) } } VStack(alignment: .leading) { Text(".border()").bold().foregroundStyle(.palette.accent) Text("Simple bordered content") .foregroundStyle(.palette.foreground) .border() } VStack(alignment: .leading) { Text("Panel").bold().foregroundStyle(.palette.accent) Panel("Info", titleColor: .palette.accent) { Text("Title in border").foregroundStyle(.palette.foreground) } } } } } /// Static row showing a settings panel with footer and alignment examples. /// /// Purely palette-driven, no state — wrapped in `.equatable()` for /// subtree memoization during Spinner/Pulse animation frames. struct SettingsAndAlignmentRow: View, Equatable { var body: some View { HStack(spacing: 2) { DemoSection("Panel (Header + Footer)") { Panel("Settings", titleColor: .palette.accent) { Text("Primary text (foreground)").foregroundStyle(.palette.foreground) Text("Secondary text (foregroundSecondary)").foregroundStyle(.palette.foregroundSecondary) Text("Tertiary text (foregroundTertiary)").foregroundStyle(.palette.foregroundTertiary) } footer: { Text("Footer: Press Enter to confirm").foregroundStyle(.palette.foreground) } } DemoSection("Content Alignment") { HStack(spacing: 1) { VStack(alignment: .leading) { Text("Leading align").foregroundStyle(.palette.foreground) Text("short").foregroundStyle(.palette.foregroundSecondary) } .border() VStack(alignment: .center) { Text("Center align").foregroundStyle(.palette.foreground) Text("short").foregroundStyle(.palette.foregroundSecondary) } .border() VStack(alignment: .trailing) { Text("Trailing align").foregroundStyle(.palette.foreground) Text("short").foregroundStyle(.palette.foregroundSecondary) } .border() } } } } } /// Static row showing ProgressView examples. /// /// Purely palette-driven, no state — wrapped in `.equatable()` for /// subtree memoization during Spinner/Pulse animation frames. /// Static row showing ProgressView examples with all 6 styles. struct ProgressViewRow: View, Equatable { var body: some View { DemoSection("ProgressView") { VStack(alignment: .leading, spacing: 1) { ProgressView("Downloading files...", value: 0.73) ProgressView(value: 0.4) { Text("Build progress").foregroundStyle(.palette.foreground) } currentValueLabel: { Text("40%").foregroundStyle(.palette.foregroundSecondary) } VStack(alignment: .leading, spacing: 0) { Text("Styles:").dim() HStack(spacing: 1) { Text("block ").dim() ProgressView(value: 0.6).trackStyle(.block) } HStack(spacing: 1) { Text("blockFine").dim() ProgressView(value: 0.6).trackStyle(.blockFine) } HStack(spacing: 1) { Text("shade ").dim() ProgressView(value: 0.6).trackStyle(.shade) } HStack(spacing: 1) { Text("bar ").dim() ProgressView(value: 0.6).trackStyle(.bar) } HStack(spacing: 1) { Text("dot ").dim() ProgressView(value: 0.6).trackStyle(.dot) } } } } } } /// Container views demo page. /// /// Shows various container views including: /// - Card (bordered container with padding) /// - Box (simple bordered container) /// - Panel (container with title in border) /// - ProgressView (horizontal progress bar) /// - Collapsible detail section demonstrating `@State` toggle struct ContainersPage: View { @State var showDetails: Bool = false var body: some View { VStack(alignment: .leading, spacing: 1) { ContainerTypesRow().equatable() SettingsAndAlignmentRow().equatable() ProgressViewRow().equatable() 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) { Text("h:1 v:0").foregroundStyle(.palette.foreground) .padding(.horizontal, 1) .border() Text("h:1 v:1").foregroundStyle(.palette.foreground) .padding(EdgeInsets(horizontal: 1, vertical: 1)) .border() Text("h:1 v:2").foregroundStyle(.palette.foreground) .padding(EdgeInsets(horizontal: 1, vertical: 2)) .border() } } } } } DemoSection("Appearance & BorderStyle") { Text("BorderStyle is determined by Appearance. Press 'a' to cycle.").foregroundStyle(.palette.foregroundSecondary) } Spacer() } .appHeader { DemoAppHeader("Container Views Demo") } } }