Skip to content

49 - Themes And App Mode

State

frontend/src/stores/themeStore.ts is a persisted Zustand store with three related values:

ValueOptionsPurpose
modelight, darkUser preference in live mode
colorzinc, slate, stone, gray, neutral, red, rose, orange, green, blue, yellow, violetAccent theme
appModelive, analyzerBackend trading mode reflected in UI

The store persists under tradeboard-theme. Rehydration applies the .dark class, .analyzer class, and data-theme attribute to the document root.

Mode Rules

Live mode permits light/dark and accent changes. Analyzer mode applies its dedicated analyzer theme and suppresses user theme/accent mutations until the app returns to live mode. Backend mode is synchronized from /auth/analyzer-mode; toggles use a CSRF token and /auth/analyzer-toggle.

Mode-change listeners allow data-heavy pages to refetch or reset state when moving between live and analyzer sources.

CSS

frontend/src/index.css defines Tailwind variables, light/dark tokens, analyzer/sandbox overrides, and accent selectors. The frontend does not use DaisyUI or a separate Tailwind configuration file.

Controls

Theme and app-mode controls are rendered by frontend/src/components/layout/Navbar.tsx. Lucide icons and accessible labels describe light/dark actions. Accent choices set the store's color value rather than loading a separate stylesheet.

Invariants

  • Persist visual state across logout for continuity, but resynchronize trading app mode after authentication.
  • Never let a client-only color choice change backend analyzer/live behavior.
  • Analyzer/live toggle failures must leave the last confirmed app mode intact.
  • New accent names require both the TypeScript union and CSS variables/selectors.

Key Files

FilePurpose
frontend/src/stores/themeStore.tsPersisted state and backend mode sync
frontend/src/components/layout/Navbar.tsxUser controls
frontend/src/index.cssTheme, accent, and mode variables