Left card: the brand as it lives in the app mock-up (each mode's actual CSS tokens, now on Material role names — surface-dim/bright, primary/secondary-container, outline-variant — derived by single flat color-mix(in oklch) landed at Material tones). Right card: the brand per the siteContext scheme registry — the single canonical color source (registry-only as of 7/14) — plus fonts and logo. Companion to /themes.
md.sys.color.*): primary · secondary-container · surface-dim/surface-bright · on-surface-variant · outline-variant. Component fills use md.comp.* tokens that reference those roles.color-mix(in oklch,…), the CSS-native analog of Material's HCT method. Neutrals (on-surface-variant, outline-variant) land on Material's exact tone values; containers & surface tiers sit at each brand's tuned depth.#00004d, SideDeal #d8002a, Meh #ff6000, Stores #00b1ff … the M3 structure, our palette.The Theme Builder stores 6 roles per scheme, per site today (3 pairs). The app uses the full Material 3 set — the extra roles are derived in this mock-up's CSS from those 6 anchors. To make the registry the single source of truth for the dev build, here's the delta.
| Material 3 role (app uses) | In the registry today | To cover the app |
|---|---|---|
| primary / on-primary | ✓ stored | — anchor |
| secondary / on-secondary | ✓ stored | — anchor |
| surface / on-surface | ✓ stored | — anchor |
| secondary-container | ✗ missing | add — tonal fill from secondary (chips, selected states) |
| primary-container / on-primary-container | ✗ missing | add — from primary (OutletStores chips) |
| surface-dim / surface-bright | ✗ missing | add — the two surface tiers (one tone step off surface) |
| on-surface-variant | ✗ missing | add — low-emphasis text/icons (neutral, M3 T30/T80) |
| outline-variant | ✗ missing | add — dividers & decorative borders (neutral, M3 T80/T30) |
| error / on-error / error-container | ✗ not stored | optional — M3's error roles; today status colors (success/warn/bad) are fixed semantic hexes, exempt |
color-mix(in oklch,…) tone recipe this mock-up uses — which mirrors Material's own “key colors → generated scheme” model and keeps the stored data small. Either way it's per-site (each brand keeps its own values). The component tokens (app-bar, price, active-indicator) stay app-side — they map system roles onto components, they aren't new registry data.