# COLOUR_SYSTEM.md ## 1. Palette philosophy Near-monochrome surfaces + **one** accent ("aurora" teal-green — a nod to Norway without cliché flags/fjords) + **one** functional secondary (amber, status-only). The accent behaves like a **status LED**: it marks liveness, focus, and action — it is never decoration or large fills. ## 2. Core tokens ### Dark theme (design lead) | Token | Value | Contrast vs surface-0 | Use | |---|---|---|---| | `surface-0` | `#0B0E14` | — | Page bg (blue-black, not pure black) | | `surface-1` | `#11151D` | — | Cards | | `surface-2` | `#171C26` | — | Nested panels, TL;DR | | `ink` | `#E8ECF2` | 15.4:1 | Headings, body | | `ink-muted` | `#9AA4B2` | 7.1:1 | Secondary text, captions | | `ink-faint` | `#5C6675` | 3.4:1 | Disabled, decorative only (never body) | | `border` | `#E8ECF2` @ 8% | — | Hairlines | | `accent` | `#3ECFAE` | 9.8:1 | Links, primary buttons (dark text on it), status dots, trace motif, focus rings | | `accent-ink` | `#062A22` | 12:1 on accent | Text on accent fills | | `amber` | `#E5A93D` | 8.3:1 | `IN DEVELOPMENT` chips, form warnings only | | `danger` | `#E5606B` | 5.6:1 | Form errors only | ### Light theme | Token | Value | Contrast vs surface-0 | Use | |---|---|---|---| | `surface-0` | `#FAFAF8` | — | Warm paper white | | `surface-1` | `#FFFFFF` | — | Cards | | `surface-2` | `#F1F2EF` | — | Nested panels | | `ink` | `#171A20` | 15.9:1 | Text | | `ink-muted` | `#555E6B` | 6.8:1 | Secondary | | `border` | `#171A20` @ 10% | — | Hairlines | | `accent` | `#0E8C72` | 4.9:1 | Links, buttons (white text: 5.1:1), focus | | `amber` | `#8A6114` | 5.6:1 | Status text (paired w/ `#F5E5C2` chip bg) | | `danger` | `#B3323E` | 6.2:1 | Errors | **Note:** the accent is *perceptually the same identity* in both themes but shifted per theme to hold WCAG AA (dark uses the luminous `#3ECFAE`; light uses the deepened `#0E8C72`). This is deliberate — never reuse the dark accent on white (2.1:1, fails). ## 3. Usage rules 1. **Accent budget:** ≤ 3 accent moments per viewport (e.g. hero: trace line + primary CTA + one chip dot). If a screen feels flat, fix hierarchy with type/spacing — not more accent. 2. **Large fills:** accent may fill only buttons and chips; never section backgrounds or headings-as-blocks. 3. **Text on accent:** always `accent-ink`/white per table; never accent-on-accent. 4. **Status semantics (fixed):** accent dot = active/live · amber dot = in development · muted dot = archived. Consistent across chips, timeline, project cards. 5. **Charts/diagrams:** surfaces + border + ink-muted, accent for the *one* flow being explained, amber for external systems (e.g. Gmail API node). Max 4 hues in any diagram. 6. **Duotone photo treatment (dark):** shadows → `#0B0E14`, highlights → warm neutral; accent never tints skin. 7. **Never colour-only meaning:** every status pairs dot + text label; errors pair colour + icon + message. ## 4. Gradients Exactly one permitted gradient: hero background halo — radial, accent @ 6% → transparent, anchored behind the trace motif. Everything else flat. (The Stripe lesson: one identity moment, not a gradient system.) ## 5. Accessibility audit summary - All body/secondary text ≥ 4.5:1 in both themes (see tables). - UI components/borders on interactive elements ≥ 3:1 against adjacent colours. - Focus ring `accent` at 2px passes 3:1 against both surface-0 values. - `ink-faint` is documented decorative-only. High-contrast/forced-colors mode: dot-grid and halo disabled, hairlines → CanvasText.