- Add StatusBar.bordered style with theme colors and block appearance support
- Pass current environment to StatusBar rendering for dynamic theme updates
- Implement ButtonRow right-alignment with calculated left padding
- Add buttonBackground theme color for lighter buttons in block appearance
- Remove button borders and focus indicators for primary buttons in block appearance
- Add theme background colors to container body and button content
- Adjust theme colors: foregroundSecondary, statusBarForeground, buttonBackground
- Update Amber theme header/footer background to #1E110E
- Refactor Overlays demo to use real Button components with VStack layout
- Center alert modal with HStack and Spacer elements
Block appearance now uses:
- Top edge: ▄ (lower half block) colored with header background
- Bottom edge: ▀ (upper half block)
- Side borders: █ (full block)
- Header/Body separator: ▀ with FG=header BG, BG=transparent
- Body/Footer separator: ▄ with FG=footer BG, BG=transparent
This creates seamless visual transitions between sections.
Header and footer have darker backgrounds, body is transparent.
- Add ContainerView as unified base for container views
- Add ContainerStyle for separator and border configuration
- Add containerBackground and containerHeaderBackground to Theme
- Standard appearances: Title in top border, Footer as separate section
- Block appearance: Separate Header section with darker background
- Migrate Panel, Card, Alert, Dialog to use ContainerView
- All views now support optional footer with separator
- Add leftT and rightT characters to BorderStyle
- Update all preset styles with correct T-junction characters:
- line: ├ ┤
- doubleLine: ╠ ╣
- rounded: ├ ┤
- heavy: ┣ ┫
- block: █ █
- ascii: + +
- Menu title separator now connects to border with T-junctions
- Separator spans full width from left to right border
- Selection bar now uses full width (padded to content width)
- Selection background uses dimmed theme color (selectionBackground)
- Selection text is bold and highlighted with accent color
- Add selectionBackground to Theme protocol and all themes
- Remove arrow indicator, use pure background highlight for selection
Each theme now has a darker background with a subtle color tint:
- Green: #0F1A0F (dark with green tint)
- Amber: #1A150F (dark with amber/orange tint)
- White: #121418 (dark with cool/blue tint)
- Red: #1A0F0F (dark with red tint)
This gives each theme a more distinctive character while keeping
the backgrounds dark and easy on the eyes.
- Update all 4 phosphor themes (Green, Amber, White, Red) to use neutral
dark background (#1E1E1E) matching Spotnik reference
- Simplify theme names (remove 'Phosphor' suffix)
- Menu: Use theme.foreground for items, theme.accent for selection
- Button: Use theme colors for default focused style and focus indicator
- Panel/Card: Use theme.border as default border color
- BorderModifier: Use theme.border as default
All 189 tests passing.
- Remove DefaultTheme, DarkTheme, LightTheme
- GreenPhosphorTheme is now the default theme
- Theme cycling order: Green → Amber → White → Red → NCurses
- .default now maps to GreenPhosphorTheme
- ThemeManager is no longer a singleton
- Access via Environment: @Environment(\.themeManager)
- Type-safe setTheme() API: themeManager.setTheme(.amber)
- ThemeManager injected by AppRunner into environment
- Custom themes supported via init(themes:)
QuitBehavior:
- .always: Quit works from any screen (default)
- .rootOnly: Quit only works from main screen (no context pushed)
- Quit item hidden in status bar when not allowed
ThemeManager:
- Singleton for managing theme cycling
- cycleTheme() / cyclePreviousTheme() methods
- setTheme(at:) and setTheme(withId:) for direct access
- Automatically updates environment and triggers re-render
- 't' key now cycles themes in AppRunner
BREAKING CHANGE: Package name changed due to name collision with
existing rensbreur/SwiftTUI package.
Changes:
- Rename package from SwiftTUI to TUIKit in Package.swift
- Rename Sources/SwiftTUI to Sources/TUIKit
- Rename Sources/SwiftTUIExample to Sources/TUIKitExample
- Rename Tests/SwiftTUITests to Tests/TUIKitTests
- Rename SwiftTUI.swift to TUIKit.swift
- Update all imports: import SwiftTUI -> import TUIKit
- Update all code references: SwiftTUI.renderToBuffer -> TUIKit.renderToBuffer
- Update documentation comments
- Rename swiftTUIVersion to tuiKitVersion
All 181 tests passing.