Color¶
Every color in Tomoda comes from frontend/constants/Themes.ts. The system is token-based: components reference semantic names (primary, surface, text) and the active theme decides what hex to render.
Two themes ship today: dark (default — the brand's primary mode) and light. Both are first-class — every component is built to work in either.
Surface ladder¶
The "tonal layering" depth model. Each step up the ladder adds about 5-8% in luminance. To create depth, place a higher-tier surface on top of a lower-tier one — no shadow required.
Dark¶
Light¶
Brand accents¶
Primary — warm gold¶
The signature color. Reserved for earned attention: primary CTAs, active states, brand moments.
Primary CTAs use a 135° linear gradient from primary to primaryContainer — this gives the warm gold a metallic, brushed quality. Don't stop at flat fills.
Secondary — indigo¶
Used for non-primary interactive accents (links in certain contexts, secondary highlights). Picked deliberately as the cool complement to the warm gold.
Status colors¶
For success, warning, error states. Sized and saturated for clear differentiation in both modes.
Text¶
Three tiers per mode. Use the lowest-emphasis tier that still reads — every step up the contrast ladder is an attention cost.
Cozy Campfire — accent palette¶
A warm, autumn-toned set used for tag pills, earned-state highlights, decorative accents, and any moment where we want to gently introduce variety without leaving the brand temperature. Never use for chrome (backgrounds, app shell). Both dark- and light-mode variants are tuned for legibility against their respective base surfaces.
Dark mode¶
Light mode¶
Same palette, darkened for contrast against white surfaces. The semantic meaning of each token stays the same across modes.
Borders¶
Borders are intentionally subtle. The border and outlineVariant tokens are both rendered at 15% opacity — solid lines are forbidden by the no-line rule.
- Dark:
rgba(255, 255, 255, 0.15) - Light:
rgba(0, 0, 0, 0.10)
Map tiles¶
constants/MapStyles.ts ships a per-mode JSON array for Google Maps (mobile). On web, Leaflet styles are driven by the same theme tokens (custom CSS overrides on top of OpenStreetMap base tiles).
Adding a color¶
- Add the token to
frontend/constants/Themes.tsin both thedarkandlightblocks. Every token must have both-mode parity. - If it's a brand-level addition (a new accent), add a swatch entry to the appropriate section of this page in the same PR.
- If it's a semantic state (e.g.
info), updateComponentsto show which components use it. - Run
task docs:buildto verify swatches render correctly.