Colors
Four palettes — Iron Night, Birch Mist, Forest, Bloom — organised by role. A two-layer token architecture separates raw palette values from semantic aliases, so components never reference a colour directly. Click any swatch to copy its hex value.
Palette Tokens
Raw palette tokens define the colour vocabulary. In production code, use thesemantic layer instead — raw tokens are for brand moments and design showcases only.
Iron Night — Dark Surfaces
--in0-voidPrimary bg (dark); primary text (light)
--in1-ironElevated dark surfaces; panels, cards
--in2-slateActive lines, selections, highlights
--in3-ashSecondary text, placeholders (AA large only)
Birch Mist — Light Surfaces
--bm0-sandElevated light surface; inset fills; dark tertiary text
--bm1-mistCard fill, hover states; dark secondary text
--bm2-birchPrimary light bg; primary dark text; accent text
Forest — Accent
--fo0-gladeDark-mode primary accent — links, buttons (9.79:1 on void)
--fo1-fernLight-mode primary accent — buttons, links, CTAs
--fo2-forestAccent hover; card highlight bg (dark mode)
--fo3-deepwaterCode block bg (light); card highlight bg (light)
Bloom — Semantic States
--bl0-emberError, destructive actions
--bl1-ochreWarning, draft, pending
--bl2-grainAnnotation, decorator-weight info
--bl3-mossSuccess, published, active
--bl4-heatherSpecial states, beta, experimental
Semantic Token Layer
Components always reference semantic tokens — never palette tokens directly. The semantic layer resolves to the correct palette value per theme mode automatically. Surface depth patterns (data-surface) are documented onFoundations › Surfaces.
Token reference — light & dark
Light Mode (default)
:root,
[data-theme="light"] {
--color-bg: var(--bm2-birch); /* Page background */
--color-bg-panel: var(--bm1-mist); /* Cards, panels */
--color-bg-inset: var(--bm0-sand); /* Input fills */
--color-bg-code: var(--fo3-deepwater); /* Code block background */
--color-text: var(--in0-void); /* Primary text */
--color-text-secondary: var(--in2-slate); /* Supporting text */
--color-text-tertiary: var(--in3-ash); /* Placeholders, captions */
--color-border: var(--in3-ash); /* Default border */
--color-border-strong: var(--in1-iron); /* Prominent dividers */
--color-border-subtle: rgba(55,65,81,0.12); /* Hairline borders */
--color-ghost-border: rgba(55,65,81,0.25); /* Ghost button border */
--color-accent: var(--fo1-fern); /* Primary CTA, links */
--color-accent-hover: var(--fo2-forest); /* Accent hover */
--color-accent-text: var(--bm2-birch); /* Text on accent bg */
--color-error: var(--bl0-ember); /* Error, destructive */
--color-warning: var(--bl1-ochre); /* Warning, draft */
--color-success: var(--bl3-moss); /* Success, published */
}Dark Mode
[data-theme="dark"] {
--color-bg: var(--in0-void);
--color-bg-panel: var(--in1-iron);
--color-bg-inset: var(--in2-slate);
--color-bg-code: var(--in1-iron);
--color-text: var(--bm2-birch);
--color-text-secondary: var(--bm1-mist);
--color-text-tertiary: var(--bm0-sand);
--color-border: var(--in2-slate);
--color-border-strong: var(--bm0-sand);
--color-border-subtle: rgba(75,85,99,0.25);
--color-ghost-border: rgba(247,246,243,0.25);
--color-accent: var(--fo0-glade);
--color-accent-hover: var(--fo1-fern);
--color-accent-text: var(--in0-void);
--color-error: var(--bl0-ember);
--color-warning: var(--bl1-ochre);
--color-success: var(--bl3-moss);
}Accessibility
All semantic token pairs meet at least 4.5:1 contrast (WCAG 2.1 AA) in both themes. One exception — --color-text-tertiary — is AA Large only. The complete foreground/background contrast matrix, with colour chips and WCAG ratings for every pair, is on Foundations › Accessibility.
Usage Rules
- Never use Bloom colours as decorative accents — reserve them for semantic states only (error, warning, success, annotation).
- Iron Night tones must not appear as foreground text on light backgrounds — contrast is too low.
- Light-mode CTA:
--fo1-fernbackground with--bm2-birchtext (4.78:1 ✓). - Dark-mode CTA:
--fo0-gladebackground with--in0-voidtext (9.79:1 ✓). Both--color-accentand--color-accent-textresolve correctly in dark mode — no consumer-side override needed. - Components reference semantic tokens only. Palette tokens are for brand moments and one-off elements.