feat(mobile): mobile palette adopts canvas design SSOT (purple, warm-paper) + drift gate #2740
Reference in New Issue
Block a user
Delete Branch "feat/mobile-palette-canvas-ssot"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Make the mobile version (canvas
src/components/mobile/) adopt the same design as the desktop canvas, following SSOT.Divergence
The mobile screens used a separate hardcoded
palette.ts(MOL_LIGHT/MOL_DARK) from a Claude Design handoff — green accent#2f9e6a+ lighter warm-paper surfaces — while the desktop canvas (same app!) uses its@themetokens with the purple brand#7c3aed/#a78bfa.Change
Align the core palette (bg/surface/surface2/border/divider/text/text2/text3 + accent) byte-for-byte to the canvas
@themeSSOT insrc/app/globals.css.green/onlinemap to the canvasgood; status + tier badges remain mobile-specific (not part of the cross-surface brand).SSOT gate
palette.ssot.test.tsparses globals.css and asserts the mobile core tokens equal the canvas tokens — globals.css is the single source; the palette can't silently re-diverge (it once carried a green accent). Full mobile suite green (247 tests).Sibling: molecule-app PR #85 aligns the standalone mobile app to the same canvas tokens.
🤖 Generated with Claude Code
APPROVED: reviewed #2740 at head
d1ae9e81.The mobile palette core tokens now match the canvas @theme SSOT: warm-paper light surfaces/text/borders, near-black dark surfaces/text/borders, purple brand accent (#7c3aed/#a78bfa), and good/online mapping to the canvas good token. Status/tier badge colors remain intentionally mobile-specific and outside the cross-surface SSOT.
The drift gate is the right shape:
palette.ssot.test.tsparsescanvas/src/app/globals.cssdirectly instead of hardcoding a second token table, then asserts MOL_LIGHT/MOL_DARK core parity and guards against the old green accent. That should catch future silent divergence.Required CI is green (
CI / Canvas (Next.js)andCI / all-required). The advisory real-image lifecycle is red, but this change is palette/test-only and required CI is green. /sop-ack/sop-ack
/sop-ack
APPROVED (post-merge verification; PR merged while I was reviewing). Head
d1ae9e8123edaaebe1e71e2819b7baaad677e807.5-axis review: scope is narrow and directionally correct. Mobile core palette now adopts the canvas design SSOT for warm-paper / near-black surfaces, text, borders, purple brand accent, and good/online green, while intentionally leaving status/tier badge colors mobile-specific.
Gate logic is sound:
palette.ssot.test.tsparsescanvas/src/app/globals.cssrather than maintaining a second hardcoded token copy, selects the actual palette blocks that define--color-surface, and asserts mobile light/dark core tokens match@themeand[data-theme="dark"]. It also explicitly guards against the legacy green brand accent. This catches future drift without over-constraining mobile-only badge styling.CI check at review time:
CI / Canvas (Next.js)andCI / all-requiredwere green on this head. Remaining aggregate reds were expected gate/SOP state plus the known advisory Local Provision real-image red tracked separately as #2739, not a regression from this palette PR./sop-ack