1025 Commits

Author SHA1 Message Date
phranck 6b225313bf Update README.md 2026-04-24 16:48:20 +02:00
phranck d6bb8bb81c Docs: Restructure open plans to match spec (Preface → Spec → Design → Impl → Checklist)
- Rewrite project-analysis-improvements with Spec/Goal, Design, Implementation, Checklist sections; condense completed items (24/29) into preface summary, focus on 5 remaining items
- Rewrite mouse-support with full spec structure; consolidate Goal/Non-Goals/Constraints into Spec, merge Current State/Design Overview/API Sketch into Design, fold Phase Plan/Testing/Rollout into Implementation
- Rename 2026-02-26-mouse-support-plan.md to 2026-02-26-mouse-support.md (drop redundant -plan suffix per YYYY-MM-DD-kebab-case spec)
2026-04-23 20:08:58 +02:00
phranck 048708312b Chore: Track .claude/plans, CLAUDE.md, openspec in repo
- 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/)
2026-04-23 19:54:40 +02:00
phranck 65750f4781 update plans 2026-04-23 19:36:41 +02:00
phranck 6fbd708bbf Update README.md 2026-04-22 11:34:36 +02:00
phranck 7855c7e12c Update README.md 2026-04-21 22:00:42 +02:00
phranck e273e15de0 Docs: Refresh README to reflect current API surface
- 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
2026-04-21 21:56:11 +02:00
phranck a275e47dc8 updates README 2026-04-21 21:39:27 +02:00
phranck 271336a71e Updates LICENSE and README 2026-04-21 21:36:45 +02:00
phranck 7fd1968123 Chore: Ignore AI tooling caches and DocC build output
- Ignore per-developer AI config: .claude/, .cursor/, .serena/, .vscode/, .windsurfrules, AGENTS.md
- Ignore WHATS-NEXT.md (developer scratchpad)
- Ignore /docc-output/ (CI build artifact, not source)
2026-04-21 15:17:23 +02:00
phranck 0712d9e2d7 Docs: Update DocC fonts to Barlow 2026-03-10 19:31:50 +01:00
phranck 02719e6c98 Update status bar shortcut documentation 2026-03-10 16:34:23 +01:00
github-actions[bot] 400cc2ba00 chore: update test count badge to 1172 tests [skip ci] 2026-03-04 01:15:32 +00:00
phranck 73a6a1e091 Chore: Bump version to 0.6.0 v0.6.0 2026-03-04 02:15:17 +01:00
phranck a4c437f972 Fix: Tab-Navigation und Arrow-Key-Wrap in NavigationSplitView
- 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
2026-03-04 02:15:17 +01:00
github-actions[bot] c2019a5582 chore: update test count badge to 1170 tests [skip ci] 2026-02-27 07:08:33 +00:00
phranck 4d3eb28e19 fix: hotfix palette surface backgrounds and macOS-only unfair lock v0.5.2 2026-02-27 08:08:13 +01:00
phranck f58ee24e94 Chore: Bump version to 0.5.1 v0.5.1 2026-02-16 01:34:28 +01:00
phranck 0feb9e9ee9 Refactor: Extract shared hydration context setup into StateRegistration.withHydration
- Add StateRegistration.withHydration(context:_:) helper
- Replace duplicated save/set/restore pattern in renderToBuffer and measureChild
- Single source of truth for hydration context management
2026-02-16 01:32:10 +01:00
github-actions[bot] 5058d9e724 chore: update test count badge to 1165 tests [skip ci] 2026-02-16 00:30:38 +00:00
phranck f2b79d266d Fix: measureChild crashes on @Environment(Observable.self) lookups
- 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
2026-02-16 01:30:27 +01:00
github-actions[bot] 2667f91e2b chore: update test count badge to 1164 tests [skip ci] 2026-02-15 23:55:42 +00:00
phranck 340c65969f Feat: Add .onChange(of:) modifier
- Add onChange(of:initial:_:) with (V, V) -> Void and () -> Void variants
- Store previous values in StateStorage for cross-render-pass comparison
- Per-identity counter ensures chained .onChange modifiers get unique keys
- GC integration cleans up tracked values for removed views
- Add 7 tests covering change detection, initial parameter, and chaining
2026-02-16 00:55:29 +01:00
phranck c3cd00f15e Docs: Add dynamic release version badge to README 2026-02-16 00:03:14 +01:00
phranck b0b07ca09e Chore: Bump version to 0.5.0 v0.5.0 2026-02-16 00:01:16 +01:00
phranck 1db0e36bea Chore: Read TUIkit version from bundled VERSION file
- 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)
2026-02-15 23:59:00 +01:00
github-actions[bot] f64de94755 chore: update test count badge to 1157 tests [skip ci] 2026-02-15 22:49:49 +00:00
phranck 5ad97132b8 Feat: Add @Observable support with Observation framework
- 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
2026-02-15 23:49:34 +01:00
github-actions[bot] 7d09dd5565 chore: update test count badge to 1146 tests [skip ci] 2026-02-15 21:11:29 +00:00
phranck b964c642e7 Feat: Add @Environment property wrapper
- 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
2026-02-15 22:11:13 +01:00
github-actions[bot] 2ac89c3d7a chore: update test count badge to 1139 tests [skip ci] 2026-02-15 20:15:18 +00:00
phranck 561915b6d9 Feat: Add configurable quit shortcut
- 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
2026-02-15 21:15:01 +01:00
github-actions[bot] 47e4a19e1b chore: update test count badge to 1122 tests [skip ci] 2026-02-15 17:20:13 +00:00
phranck 8cf6507016 Feat: Add ContentUnavailableView
- 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
2026-02-15 18:19:55 +01:00
phranck e103e8cbd5 Chore: Bump version to 0.4.0 v0.4.0 2026-02-15 03:10:18 +01:00
phranck 790d46c059 Fix: Restore swiftlint:disable for false-positive empty_count
- count is an Int variable (pixel counter), not a collection .count
- CI treats empty_count as error level, causing build failure
2026-02-15 02:39:05 +01:00
phranck 8500dc52f5 Chore: Update project status and add Nunito fonts
- Update WHATS-NEXT.md with current status and reorganized backlog
- Update session-state.json checkpoint
- Add Nunito font files (woff2) for DocC documentation
2026-02-15 02:36:15 +01:00
phranck d9c8a934b5 Chore: Increase frame rate from ~35 FPS to ~42 FPS
- Reduce run loop sleep from 28ms to ~24ms
- Update notification and spinner timers to match
2026-02-15 02:35:26 +01:00
phranck db8ea40c0a Refactor: Fix SwiftLint warnings and refactor StatusBar to _StatusBarCore pattern
- Fix 80 SwiftLint warnings (159 -> 79): vertical_whitespace, prefer_self_in_static_references, modifier_order, trailing_newline, trailing_whitespace, prefer_for_where, unneeded_synthesized_initializer, redundant_type_annotation, implicit_optional_initialization, superfluous_disable_command, shorthand_optional_binding, syntactic_sugar, empty_string, vertical_whitespace_closing_braces, identifier_name in BadgeModifier
- Refactor StatusBar from direct Renderable to _StatusBarCore pattern (public View with real body wrapping private Renderable core)
2026-02-15 02:35:18 +01:00
phranck b935c1d05e Docs: Use colorful syntax highlighting in DocC theme
- Replace monochrome green syntax colors with Xcode-inspired palette
- Keywords pink, strings coral, numbers purple, types cyan
- Functions green, constants orange as brand accent
- Comments stay muted green for on-brand feel
2026-02-15 02:07:56 +01:00
phranck 3452f5bbd9 Docs: Add TUIkit green palette theme for DocC
- 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
2026-02-15 01:51:31 +01:00
phranck ea5706203c Docs: Rebuild all DocC diagrams with Typst
- Replace all Mermaid/D2 diagrams with Typst (fletcher) for better quality
- Transparent backgrounds for light and dark mode support
- Style D arrows: thin lines (0.7pt), small filled triangles, corner routing
- Subsystem init diagram: top-down vertical layout
- Runtime references diagram: annotation nodes instead of edge labels
- All 10 diagrams: pipeline, dispatch, event-loop, input-dispatch,
  keyboard-dispatch, subsystem-init, run-creates, main-loop,
  dep-ownership, dep-references
2026-02-15 01:18:54 +01:00
github-actions[bot] e4bec1e43e chore: update test count badge to 1113 tests [skip ci] 2026-02-14 23:13:28 +00:00
phranck 3aec350be0 Docs: Reduce render pipeline diagram size
- Re-rendered at scale 1 (was scale 2): 296x2270px instead of 592x4540px
2026-02-15 00:13:13 +01:00
phranck 5f91a3cae6 feat: add automated test count update workflow
- 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
2026-02-15 00:06:30 +01:00
phranck 7972f3a065 Docs: Redesign dependency graph diagrams for readability
- 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)
2026-02-14 23:18:32 +01:00
phranck d43e10fe19 Docs: Split subsystem init diagram into init + run
- Split single wide diagram into two: init() subsystems and run() components
- Redesigned init diagram: TD layout with horizontal subsystem row
- Added separate lifecycle-run-creates diagram (light + dark)
- Updated AppLifecycle.md with two @Image directives
2026-02-14 23:16:26 +01:00
phranck e3d739a1fb Docs: Change subsystem init diagram to left-to-right layout
- Recreated lifecycle-subsystem-init diagram with LR flow direction (light + dark)
2026-02-14 23:02:53 +01:00
phranck a140f4947a Docs: Audit and fix all DocC diagrams against actual code
- KeyboardShortcuts.md: 3 layers → 5 layers, fix FocusManager arrow key
  handling, recreate keyboard-event-dispatch diagram
- AppLifecycle.md: fix subsystem init (add AppState, AppHeaderState,
  separate init/run), fix terminal setup (add focus observer, timers),
  fix main loop (5 layers, re-render trigger table), rewrite key event
  dispatch (5 layers with Layer 0/3 mutual exclusivity), fix dependency
  graphs (complete subsystem list, correct layer references)
- RenderCycle.md: fix Step 1 (5 subsystems not 3), Step 2 (add
  RenderCache), Step 3 (complete environment code snippet), Step 9
  (add app header), Step 12 (add StateStorage GC, RenderCache cleanup),
  update trigger table (add timers, focus changes), recreate pipeline
  diagram with all 12 steps
- Recreated 7 diagrams as Mermaid renders (light + dark variants)
2026-02-14 22:42:58 +01:00
phranck 10cc6e8fce Docs: Replace event loop diagram with code-accurate Mermaid renders
- 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
2026-02-14 22:21:49 +01:00