Mobile Phase 6: app-wide light theme + [data-theme] toggle

Ship the light palette behind a :root[data-theme="light"] switch; dark
stays the default and brand identity. A pre-paint boot script applies
localStorage.venture_crm_theme (no flash, no prefers-color-scheme), and an
app-wide toggle lives in the desktop sidebar footer + the mobile top bar,
both driven by one theme state in App.

Method keeps dark mode byte-identical: :root grew to 44 themed color slots
whose dark values equal the original literals, then 319 hex literals were
migrated to var() across the JSX inline region and the <style> block. The
StageChip is now className-based (.stage-chip--{stage}); PIPELINE_STAGE_CHIP
is removed. Every light tint (stage/recency/note/priority/reminder/money)
uses the designer's exact values from the full Claude Design export
(store.js + the four *App.dc.html DCLogic palettes), now committed as
provenance under design/_imports/2026-06-19_zip-file/ (zip + screenshots
gitignored).

Mobile surfaces + chrome are fully var-based, so mobile light is complete.
Desktop light has known rough edges (bespoke <style> shades, the legacy
off-palette .badge-* family, dark-tuned shadows) folded into a new Phase 7
design-conformance pass.

Verified: render-smoke green; a jsdom interaction harness on the authed
shell exercised the toggle (boot-dark -> light+persist+relabel -> dark);
dark-identity, theme-parity, and no-undefined-var checks all green. Not yet
checked on a real phone/browser.
This commit is contained in:
Keysat
2026-06-19 16:38:30 -05:00
parent 7f711d1fae
commit e6a89450da
21 changed files with 5521 additions and 374 deletions
+15 -9
View File
@@ -9,7 +9,7 @@ not the visual language below.*
## 1. Visual theme
A dense, professional, **dark** venture-CRM workspace (a **light** theme is planned as an
A dense, professional, **dark** venture-CRM workspace (a **light** theme ships as an
optional toggle — see §8 — but dark is the default and the brand's primary identity) — calm,
data-forward, slightly
"terminal/financial." Cool blue-greys throughout, a single saturated blue as the only vivid
@@ -42,9 +42,9 @@ White (`#ffffff`) appears only as text on accent fills and in the brand mark.
`#10b981`/`#6ee7b7`. **Staleness** (last-contact age) overlays the same ramp: fresh grey →
due-soon amber `#e0b341` → danger-soft red `#e06c6c`/`#f87171`. Both are tinted-fill + tinted-
text badges, consistent with the badge rule above.
- **Light theme (planned)** mirrors every slot above in `tokens.tokens.json` `color.light` (e.g.
base `#eaeef3`, panel `#ffffff`, text-primary `#16202c`); accent `#3b82c4` is unchanged. Dark is
the default — see §8.
- **Light theme (implemented, P6)** mirrors every slot above in `tokens.tokens.json` `color.light`
(e.g. base `#eaeef3`, panel `#ffffff`, text-primary `#16202c`); accent `#3b82c4` is unchanged. Dark
is the default — see §8.
## 3. Typography
@@ -166,11 +166,17 @@ brief in `design/BRIEF.md`). The system:
- **Touch + safe areas:** 44px minimum primary touch targets; body type bumped 13→15px (§3);
sticky bottom nav respects `env(safe-area-inset-bottom)` and content gets bottom padding so
the nav never overlaps it.
- **Light theme — planned (adopted 2026-06-19).** Ship the light palette (`tokens.tokens.json`
`color.light`) behind a `[data-theme]` switch + a top-bar toggle. **Dark stays the default and
the brand's primary identity;** light is the optional alternative. It co-lands with the
inline-style→CSS migration (theming needs CSS custom properties, not per-element inline values).
Full per-component light tints (stage/staleness/note badges) are in `_imports/2026-06-19/`.
- **Light theme — implemented (P6, 2026-06-19).** The light palette (`tokens.tokens.json`
`color.light` + the per-component tints from the Claude Design export) ships behind a
`:root[data-theme="light"]` switch, applied by a pre-paint boot script from
`localStorage.venture_crm_theme` and toggled app-wide (desktop sidebar footer + mobile top-bar
icon). **Dark stays the default and the brand's primary identity;** light is the optional
alternative (no `prefers-color-scheme` auto-switch). Colors are driven by ~44 themed `:root` CSS
vars whose dark values equal the original literals (so dark mode is unchanged). **Known gaps
(Phase 7 conformance pass):** some bespoke desktop `<style>` shades (login glow/scrollbar/
table-hover/KPI), the legacy off-palette `.badge-*` family, and shadows are not yet themed.
Full per-component light tints (stage/staleness/note badges) live in
`_imports/2026-06-19_zip-file/` (`store.js` + the four `*App.dc.html` `DCLogic` palettes).
The gap between this section and the current `index.html` is the implementation backlog in
`ROADMAP.md` (incl. the inline-style→CSS migration and the locked pipeline-stages/flags spec).