Persist accessible colour and motion preferences #80

Closed
opened 2026-09-13 21:03:48 +00:00 by xavierk · 1 comment
Owner

Parent

Implement Fenris TUI polish and hourly history

What to build

Each unprivileged user can select Amber, Nord or High Contrast and reduced motion, with choices surviving restart without altering evidence, collection or CLI facts. Covers TPH-10 and preference integration with TPH-2.

Implement the approved companion contract and applicable TPH acceptance amendments linked from the parent. Preserve the frozen redesign, lifecycle/security boundaries, existing evidence thresholds and mathematics except explicit approved accounting amendments. Reuse existing seams; any necessary prefactoring precedes behavior changes within this slice. No release, deployment, or parent-issue changes.

Acceptance criteria

  • Provide Amber/Nord/High Contrast presets with Amber default and amber default graph role. Themes style chrome/borders/accents/muted text and graph roles; status semantic colours/glyphs/text always win.
  • Provide accessible t preset and m motion controls with clickable equivalents, persistent user-scoped XDG TUI preferences, and Amber/normal-motion defaults when absent. Do not write observation store, helper, operational collector/device or package configuration.
  • Persist preferences safely; invalid/unreadable/unwritable user preference data must not crash the dashboard, corrupt previous preferences or affect monitoring. Failures are understandable rather than silently implying persistence succeeded.
  • Reduced motion makes Monitoring steady; normal motion permits only the approved dot cadence. Honour framework reduced-motion support and keep all text visible.
  • Preserve global action reachability and focus contrast in every preset. Expose theme roles for current/future graph rendering so this slice does not depend on completion of the graph ticket.
  • Headless interaction tests use temporary user config, change controls, restart and verify persistence/isolation. Test default and failure cases, status semantic precedence, framework/user reduced motion and identical CLI/collection behavior before and after preference changes. Reserve manual contrast/terminal feel checks for what fixtures cannot establish.

Blocked by

## Parent [Implement Fenris TUI polish and hourly history](https://git.bongbetic.com/xavierk/Fenris/issues/72) ## What to build Each unprivileged user can select Amber, Nord or High Contrast and reduced motion, with choices surviving restart without altering evidence, collection or CLI facts. Covers TPH-10 and preference integration with TPH-2. Implement the approved companion contract and applicable TPH acceptance amendments linked from the parent. Preserve the frozen redesign, lifecycle/security boundaries, existing evidence thresholds and mathematics except explicit approved accounting amendments. Reuse existing seams; any necessary prefactoring precedes behavior changes within this slice. No release, deployment, or parent-issue changes. ## Acceptance criteria - [ ] Provide Amber/Nord/High Contrast presets with Amber default and amber default graph role. Themes style chrome/borders/accents/muted text and graph roles; status semantic colours/glyphs/text always win. - [ ] Provide accessible t preset and m motion controls with clickable equivalents, persistent user-scoped XDG TUI preferences, and Amber/normal-motion defaults when absent. Do not write observation store, helper, operational collector/device or package configuration. - [ ] Persist preferences safely; invalid/unreadable/unwritable user preference data must not crash the dashboard, corrupt previous preferences or affect monitoring. Failures are understandable rather than silently implying persistence succeeded. - [ ] Reduced motion makes Monitoring steady; normal motion permits only the approved dot cadence. Honour framework reduced-motion support and keep all text visible. - [ ] Preserve global action reachability and focus contrast in every preset. Expose theme roles for current/future graph rendering so this slice does not depend on completion of the graph ticket. - [ ] Headless interaction tests use temporary user config, change controls, restart and verify persistence/isolation. Test default and failure cases, status semantic precedence, framework/user reduced motion and identical CLI/collection behavior before and after preference changes. Reserve manual contrast/terminal feel checks for what fixtures cannot establish. ## Blocked by - [Render truthful monitoring states in TUI and CLI](https://git.bongbetic.com/xavierk/Fenris/issues/78)
xavierk added the ready-for-agent label 2026-09-13 21:03:48 +00:00
xavierk added a new dependency 2026-09-13 21:04:20 +00:00
xavierk added a new dependency 2026-09-13 21:04:27 +00:00
xavierk self-assigned this 2026-09-14 11:00:12 +00:00
Author
Owner

Implemented persistent accessible colour and motion preferences for the Fenris TUI.

New files:

  • preferences.py: XDG user-scoped persistence with safe defaults
  • themes.py: Three Textual Theme objects (Amber/Nord/High Contrast) with graph colour roles

TUI changes:

  • t cycles presets, m toggles reduced motion, both persist across restart
  • Reduced motion wired to status composition
  • Footer updated with t theme and m motion controls

56 new tests covering persistence, themes, TUI integration, CLI isolation. All 590 existing tests pass.

Implemented persistent accessible colour and motion preferences for the Fenris TUI. New files: - preferences.py: XDG user-scoped persistence with safe defaults - themes.py: Three Textual Theme objects (Amber/Nord/High Contrast) with graph colour roles TUI changes: - t cycles presets, m toggles reduced motion, both persist across restart - Reduced motion wired to status composition - Footer updated with t theme and m motion controls 56 new tests covering persistence, themes, TUI integration, CLI isolation. All 590 existing tests pass.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: xavierk/Fenris#80