Color
Foreground
Body text reaches for --fg, headings for --fg, secondary text for --fg-muted. Captions use --fg-soft-aa (the AA-safe sibling).
Surface
Page is --bg. Cards, sheets, and modals lift to --bg-elev (sometimes --bg-2 for a warmer paper tone).
Lines
Hairline divides cards. Strong hairline is for emphasized rules.
Accent
The accent is ink, not orange. Orange lives in the brand layer (see Brand tokens).
Accent state ramp
The ink accent darkens, not lightens, under interaction. Hover slides toward the soft #2A2A2A; press lands at pure #000000. Bind these at the component layer — primary buttons, action chips, primary links — not at callsites.
| Token | Value | Role |
|---|---|---|
--accent | #0D0D0D | rest state |
--accent-hover | #2A2A2A | hover, focus-within |
--accent-press | #000000 | active, mousedown |
Surface variations
Beyond --bg and --bg-elev, three surface primitives extend the paper grammar. --paper-warm is the warmest panel (a tone deeper than --bg-2) and powers receipt envelopes, founder-doc headers, and the marketing site's quiet bands. The brand layer adds --surface-inverse for dark sheets, --surface-code for code blocks against the dark theme, and --neutral-150 as a neutral-cool counterpart to the warm stone ramp.
| Token | Value | Role |
|---|---|---|
--paper-warm | #F5F3EE | warm receipt / envelope ground |
--neutral-150 | #F5F5F5 | neutral-cool panel (non-warm) |
--surface-subtle | #F5F5F4 | quiet block inside a card |
--surface-mute | #E7E5E4 | inactive tile, disabled ground |
--surface-inverse | #0A0A0A | dark sheet, footer band |
--surface-code | #18181B | code block ground (any theme) |
Semantic ring
Authors reach for the semantic ring at callsites, not primitives:
| Semantic | Resolves to | Use |
|---|---|---|
--surface-page | var(--bg) | page background |
--surface-elevated | var(--bg-elev) | cards, modals |
--surface-paper | var(--bg-2) | warm secondary panels |
--text-primary | var(--fg) | headings, body |
--text-secondary | var(--fg-muted) | secondary body |
--text-tertiary | var(--fg-soft-aa) | captions (AA-safe) |
--line-default | var(--hairline) | 1 px border |
--line-strong | var(--hairline-strong) | emphasized rule |
Text — semantic ramp
The brand layer publishes a six-stop text ramp keyed to role, not contrast level. Headings reach for --text-heading; body copy for --text-body; secondary captions for --text-muted; near-disabled hints for --text-faint. --text-inverse and --text-on-brand cover the dark-sheet and orange-button cases.
| Token | Value | Role |
|---|---|---|
--text-heading | #0D0D0D | display, headings |
--text-body | #57534E | body copy, paragraphs |
--text-muted | #78716C | secondary captions, metadata |
--text-faint | #A8A29E | placeholder, disabled hint |
--text-inverse | #FFFFFF | ink on dark surface |
--text-on-brand | #FFFFFF | ink on orange button |
Borders — semantic ramp
Three border primitives, two solids and one alpha. --border-hair is the 6 % ink alpha used wherever a divider must layer cleanly over a tinted panel. --border-glass is the rendered glass-card edge — the alpha is calibrated for the bloom-veil stack.
| Token | Value | Role |
|---|---|---|
--border-hair | rgba(0, 0, 0, 0.06) | hairline over tinted panel |
--border-strong | #D6D3D1 | emphasised rule, card edge |
--border-glass | rgba(229, 229, 229, 0.64) | glass-card border |
Stone ramp — neutral primitives
The stone ramp is the underlying neutral primitive surface. Eleven stops from --stone-50 (near-white) to --stone-900 (near-black). Authors don't reach for stone directly in product code — the semantic ramp (--text-body → --stone-600, --surface-mute → --stone-200, etc.) is the supported entry point. Stone is the brand layer's back room.
| Token | Value | Notes |
|---|---|---|
--stone-50 | #FAFAF9 | warmest paper |
--stone-100 | #F5F5F4 | resolves --surface-subtle |
--stone-150 | #F0EFED | between 100 and 200 |
--stone-200 | #E7E5E4 | resolves --surface-mute |
--stone-300 | #D6D3D1 | resolves --border-strong |
--stone-400 | #A8A29E | resolves --text-faint |
--stone-500 | #78716C | resolves --text-muted |
--stone-600 | #57534E | resolves --text-body |
--stone-700 | #44403C | deep ink for badges |
--stone-800 | #292524 | near-black panel |
--stone-900 | #1C1917 | absolute floor |
Bloom palette — extended stops
The four bloom families each publish a four-stop ramp at the primitive layer. The hero presentation (gradient class plus optional veil) lives at /foundations/bloom; the discrete stops below are the back-room values the gradients compose. Stops 1 and 2 are tints (sit behind text); stops 3 and 4 are saturated (decorative panels only, never with text).
Peach
| Token | Value | Role |
|---|---|---|
--peach-1 | #FFEFE0 | hero tint |
--peach-2 | #FFD9BC | pricing wash |
--peach-3 | #FFB587 | accent stop |
--peach-4 | #F89866 | gradient floor |
--peach-bg | rgba(255,178,138,0.10) | translucent peach ground |
--peach-border | rgba(255,178,138,0.25) | translucent peach edge |
Amber — Create surface
The amber stops compose the Create-phase gradient. Amber doesn't ship with a .bloom-amber-veil class; the gradient renders directly under display headlines, not body text.
| Token | Value | Role |
|---|---|---|
--amber-1 | #FBF4DE | warmest amber tint |
--amber-2 | #F4E0B0 | mid amber |
--amber-3 | #E8C078 | saturated amber |
--amber-4 | #D8A24A | gradient floor |
Lavender — Manage surface, AI tints
| Token | Value | Role |
|---|---|---|
--lavender-1 | #F0EEF8 | Manage tint |
--lavender-2 | #DEDAF0 | AI ground |
--lavender-3 | #BFB7E2 | saturated lavender |
--lavender-4 | #A89DD4 | gradient floor |
Sage — Exit surface
| Token | Value | Role |
|---|---|---|
--sage-1 | #ECF3E5 | Exit tint |
--sage-2 | #D2E1C5 | wind-down ground |
--sage-3 | #ADC796 | saturated sage |
--sage-4 | #8FB078 | gradient floor |
Status palette — primitive tokens
The status pills documented at /foundations/status resolve through a --status-* / --status-*-text pair per state. The dot uses the lighter sibling; the text uses the deeper sibling. Authors reach for the .status-* utility classes; these primitives are the back room those classes resolve to.
| Token | Value | Role |
|---|---|---|
--status-signed | #3FBF6E | signed dot |
--status-signed-text | #1B7A47 | signed text |
--status-pending | #E8A845 | pending dot |
--status-pending-text | #8A5E1C | pending text |
--status-draft | #8C8C8C | draft dot |
--status-draft-text | #5A5A5A | draft text |
--status-filed | #6E8AD8 | filed dot |
--status-filed-text | #3A5CB8 | filed text |
Semantic state colors
A generic four-stop semantic ramp (success / warning / error / info) sits beside the domain status palette. The status palette is the preferred surface for product flows; semantic state is for generic UI affordances — toast notifications, validation hints, form errors — where the underlying state isn't a Matter domain state.
| Token | Value | Role |
|---|---|---|
--semantic-success | #10B981 | generic success accent |
--semantic-success-soft | #E5ECE6 | success ground |
--semantic-success-fg | #627E68 | success text |
--semantic-warning | #F59E0B | warning accent |
--semantic-error | #DC2626 | error accent |
--semantic-info | #2563EB | info accent |
Lifecycle phase colors
The Create / Manage / Exit lifecycle has its own token family — used by phase chips, sidebar headings, and dynamic-card badges to keep the three phases visually distinct across the dashboard, docs, and MCP catalog. Each phase publishes a saturated *-base and a soft *-bg.
| Token | Value | Role |
|---|---|---|
--lifecycle-create-base | #1F8A5B | Create phase accent |
--lifecycle-create-bg | rgba(31,138,91,0.08) | Create phase ground |
--lifecycle-manage-base | #2A6FDB | Manage phase accent |
--lifecycle-manage-bg | rgba(42,111,219,0.08) | Manage phase ground |
--lifecycle-exit-base | #B0322B | Exit phase accent |
--lifecycle-exit-bg | rgba(176,50,43,0.08) | Exit phase ground |
HTTP method and status — primitive tokens
The HTTP method badge documented at /foundations/status and the response-status chip used in the docs API playground both resolve through these primitives. The --method-*-base tokens are the saturated text colors; the --http-status-* family covers ok (2xx), redirect (3xx), and error (4xx + 5xx) with a base / bg / ring triple per band.
| Token | Value | Role |
|---|---|---|
--method-get-base | #2A6FDB | GET text |
--method-post-base | #1F8A5B | POST text |
--method-put-base | #B45A1A | PUT text |
--method-patch-base | #B45A1A | PATCH text (shares PUT) |
--method-delete-base | #B0322B | DELETE text |
--http-status-ok-base | #1F8A5B | 2xx accent |
--http-status-ok-bg | rgba(31,138,91,0.10) | 2xx ground |
--http-status-ok-ring | rgba(31,138,91,0.35) | 2xx focus ring |
--http-status-redirect-base | #6B7280 | 3xx accent |
--http-status-redirect-bg | rgba(107,114,128,0.10) | 3xx ground |
--http-status-redirect-ring | rgba(107,114,128,0.30) | 3xx focus ring |
--http-status-error-base | #B0322B | 4xx and 5xx accent |
--http-status-error-bg | rgba(176,50,43,0.10) | 4xx and 5xx ground |
--http-status-error-ring | rgba(176,50,43,0.35) | 4xx and 5xx focus ring |
Brand accent — orange and cyan
The Matter orange lives in the brand layer; the canonical accent is ink. The orange family publishes a hover and press state, a tint for soft grounds, and a focus ring tuned to the same hue. --matter-cyan is a single high-energy accent reserved for marketing animations and the brand mark's interactive states — never for product chrome.
| Token | Value | Role |
|---|---|---|
--matter-orange-hover | #D04610 | orange button hover |
--matter-orange-tint | #FFF0EB | soft orange ground |
--matter-orange-ring | rgba(232, 81, 18, 0.16) | orange focus ring |
--matter-cyan | #5AFFFF | high-energy marketing accent |
Brand-extended accents
The brand layer also publishes a few non-orange accents for marketing surfaces and category chips on the docs site. green resolves into the success ramp and the sage backdrop; indigo is the Manage phase's marketing-side companion; rose is reserved for legal-document badges and the v2 marketing site's quiet warning states.
| Token | Value | Role |
|---|---|---|
--green-base | #7B9E82 | brand-side success accent |
--green-sage-bg | #F2F5F2 | sage backdrop |
--indigo-base | #2C2854 | indigo accent |
--rose-base | #B56C6B | rose accent |
--rose-bg | #F8F0F0 | rose ground |
Key-set dot — agent token affordance
A single token pair used by the agent-token UI to flag the currently active key set in dropdowns and the topbar. Green-leaning, ring-only — no fill — to distinguish from status dots.
| Token | Value | Role |
|---|---|---|
--key-set-dot-base | #5FA86B | active key-set indicator |
--key-set-dot-ring | rgba(95,168,107,0.18) | active key-set ring |
var(--surface-elevated) and var(--text-primary) at callsites. The ring resolves correctly under dark theme.var(--fg)) in product code. Primitives are the back-room source of truth.