- Whitelist .claude/plans/, .claude/CLAUDE.md, .claude/openspec/ via gitignore negation patterns
- Keep session-state.json, settings.local.json, memory.md, whats-next.md, .DS_Store ignored (per-developer / dynamic)
- Relocate mouse-support plan from plans/open/ to .claude/plans/open/ to consolidate plan directory
- Enables tuikit.dev dashboard to fetch plan metadata via GitHub Contents API (previously returned empty due to ignored .claude/)
- Switch hero badges to a green gradient (darker at the edges, brightest in
the centre) matching the banner's phosphor colour
- Correct the Hello example to use foregroundStyle, the actual public API
- Add ContentUnavailableView, ButtonRow and Toggle style variants
- Mention StatusBar compact/bordered styles and onKeyPress modifier/function
key support
- Fix the border style list to match BorderStyle's real constants
- Drop the @SceneStorage claim and document the UserDefaults storage backend
- Update test count to 1172 across 93 files
- Tab navigates within the active section first; only switches to the
next section when the current element is the last in its section
- Arrow keys (Up/Down) no longer wrap at section boundaries
- moveFocusInSection gains a wrap: Bool parameter and returns Bool
- Add tests: tabNavigatesWithinSectionFirst, arrowKeysDoNotWrapAtBoundary
- Add StateRegistration.withHydration(context:_:) helper
- Replace duplicated save/set/restore pattern in renderToBuffer and measureChild
- Single source of truth for hydration context management
- Skip Renderable views in body-traversal path (they use renderToBuffer, not body)
- Set up full hydration context before evaluating composite view body
- Renderable views now fall through to render-to-measure fallback correctly
- Add regression test with @Observable model in measureChild
- Add Sources/TUIkit/VERSION as single source of truth for version string
- Read version at runtime via Bundle.module instead of hardcoded string
- Remove unused TUIkitVersion constant from Package.swift
- Fix version mismatch (was 0.1.0, actual is 0.4.0)
- Replace custom Observable protocol and @Published with Apple's @Observable macro
- Add withObservationTracking in renderToBuffer for automatic per-property dependency tracking
- Add type-based @Environment(Type.self) and .environment(object) for observable objects
- Add ObjectEnvironmentModifier for injecting observable objects into the environment
- Add needsCacheClear flag to AppState for thread-safe cache invalidation
- Add cross-platform test script (scripts/test-linux.sh) for Docker-based Linux verification
- Add DemoAppHeader with system info display (OS, version, architecture)
- Consolidate Example App: extract ImageDemoHelpers, KeyboardHelpSection, ValueDisplayRow
- Add pre-push verification rule to CLAUDE.md
- Verified on both macOS and Linux (swift:6.0 container), 1155 tests passing
- Add @Environment<Value> property wrapper for declarative environment access
- Add StateRegistration.activeEnvironment for ambient context during body evaluation
- Set/restore activeEnvironment in renderToBuffer() and RenderLoop.render()
- Refactor RenderLoop.render() into focused helpers to fix function_body_length warning
- Add 7 tests covering default values, active environment, dynamic reads, and propagation
- Add QuitShortcut type with presets: .q, .escape, .ctrlQ, .ctrlC
- Replace hardcoded "q" quit key in InputHandler with configurable shortcut
- Add quitShortcut property to StatusBarState (default: .q)
- Status bar display updates automatically based on configured shortcut
- Add 17 tests covering all presets, matching logic, and integration
- Add ContentUnavailableView with SwiftUI-matching API (no systemImage)
- Full @ViewBuilder init for label, description, and actions
- String convenience inits and static .search preset
- Private _ContentUnavailableViewCore with Renderable pattern
- Add 9 tests covering all init variants and rendering
- Update WHATS-NEXT.md with current status and reorganized backlog
- Update session-state.json checkpoint
- Add Nunito font files (woff2) for DocC documentation
- Full color theming based on Green SystemPalette HSL values
- Light and dark mode variants for all 130+ color variables
- Navigation, code syntax, asides, badges, buttons, forms styled
- Subtle intro gradient instead of garish neon green
- Nunito as primary font, SF Mono for code
- Enable onThisPageNavigator and quickNavigation features
- Created update-test-counts.yml workflow
- Triggers on push to main (when Tests/ or Sources/ change) or daily at 2 AM UTC
- Counts @Test and @Suite annotations
- Updates README.md badges and test count locations
- Auto-commits with [skip ci] to prevent rebuild loops
- Can be manually triggered via workflow_dispatch
- Ownership: LR layout with 5 logical groups (Core, UI State, Theming, TUIContext, Runtime)
- References: LR layout with RenderLoop/InputHandler on left, subsystems on right
- Both diagrams now readable at DocC content width (light + dark)
- Event loop diagram now reflects actual AppRunner.run() flow: init subsystems, setup, start timers/observers, initial render, then main loop
- Added input dispatch diagram showing 5-layer first-consumer-wins model with hasTextInputFocus conditional branching
- Updated Architecture.md text to match code: correct subsystem list, two render trigger paths, Layer 0/3 mutual exclusivity
- Light and dark variants for both diagrams