Skip to content

Color

Foreground

Body text reaches for --fg, headings for --fg, secondary text for --fg-muted. Captions use --fg-soft-aa (the AA-safe sibling).

--fg
#0D0D0D
--fg-muted
#5A5A5A
--fg-soft
#8C8C8C
--fg-soft-aa
#707070

Surface

Page is --bg. Cards, sheets, and modals lift to --bg-elev (sometimes --bg-2 for a warmer paper tone).

--bg
#FFFFFF
--bg-2
#F7F6F3
--bg-elev
#FFFFFF
--paper-warm
#F5F3EE

Lines

Hairline divides cards. Strong hairline is for emphasized rules.

--hairline
#EEEDEA
--hairline-strong
#DDDCD8

Accent

The accent is ink, not orange. Orange lives in the brand layer (see Brand tokens).

--accent
#0D0D0D
--accent-hover
#2A2A2A
--accent-press
#000000

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.

TokenValueRole
--accent#0D0D0Drest state
--accent-hover#2A2A2Ahover, focus-within
--accent-press#000000active, 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.

TokenValueRole
--paper-warm#F5F3EEwarm receipt / envelope ground
--neutral-150#F5F5F5neutral-cool panel (non-warm)
--surface-subtle#F5F5F4quiet block inside a card
--surface-mute#E7E5E4inactive tile, disabled ground
--surface-inverse#0A0A0Adark sheet, footer band
--surface-code#18181Bcode block ground (any theme)

Semantic ring

Authors reach for the semantic ring at callsites, not primitives:

SemanticResolves toUse
--surface-pagevar(--bg)page background
--surface-elevatedvar(--bg-elev)cards, modals
--surface-papervar(--bg-2)warm secondary panels
--text-primaryvar(--fg)headings, body
--text-secondaryvar(--fg-muted)secondary body
--text-tertiaryvar(--fg-soft-aa)captions (AA-safe)
--line-defaultvar(--hairline)1 px border
--line-strongvar(--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.

TokenValueRole
--text-heading#0D0D0Ddisplay, headings
--text-body#57534Ebody copy, paragraphs
--text-muted#78716Csecondary captions, metadata
--text-faint#A8A29Eplaceholder, disabled hint
--text-inverse#FFFFFFink on dark surface
--text-on-brand#FFFFFFink 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.

TokenValueRole
--border-hairrgba(0, 0, 0, 0.06)hairline over tinted panel
--border-strong#D6D3D1emphasised rule, card edge
--border-glassrgba(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.

TokenValueNotes
--stone-50#FAFAF9warmest paper
--stone-100#F5F5F4resolves --surface-subtle
--stone-150#F0EFEDbetween 100 and 200
--stone-200#E7E5E4resolves --surface-mute
--stone-300#D6D3D1resolves --border-strong
--stone-400#A8A29Eresolves --text-faint
--stone-500#78716Cresolves --text-muted
--stone-600#57534Eresolves --text-body
--stone-700#44403Cdeep ink for badges
--stone-800#292524near-black panel
--stone-900#1C1917absolute 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

TokenValueRole
--peach-1#FFEFE0hero tint
--peach-2#FFD9BCpricing wash
--peach-3#FFB587accent stop
--peach-4#F89866gradient floor
--peach-bgrgba(255,178,138,0.10)translucent peach ground
--peach-borderrgba(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.

TokenValueRole
--amber-1#FBF4DEwarmest amber tint
--amber-2#F4E0B0mid amber
--amber-3#E8C078saturated amber
--amber-4#D8A24Agradient floor

Lavender — Manage surface, AI tints

TokenValueRole
--lavender-1#F0EEF8Manage tint
--lavender-2#DEDAF0AI ground
--lavender-3#BFB7E2saturated lavender
--lavender-4#A89DD4gradient floor

Sage — Exit surface

TokenValueRole
--sage-1#ECF3E5Exit tint
--sage-2#D2E1C5wind-down ground
--sage-3#ADC796saturated sage
--sage-4#8FB078gradient 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.

TokenValueRole
--status-signed#3FBF6Esigned dot
--status-signed-text#1B7A47signed text
--status-pending#E8A845pending dot
--status-pending-text#8A5E1Cpending text
--status-draft#8C8C8Cdraft dot
--status-draft-text#5A5A5Adraft text
--status-filed#6E8AD8filed dot
--status-filed-text#3A5CB8filed 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.

TokenValueRole
--semantic-success#10B981generic success accent
--semantic-success-soft#E5ECE6success ground
--semantic-success-fg#627E68success text
--semantic-warning#F59E0Bwarning accent
--semantic-error#DC2626error accent
--semantic-info#2563EBinfo 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.

TokenValueRole
--lifecycle-create-base#1F8A5BCreate phase accent
--lifecycle-create-bgrgba(31,138,91,0.08)Create phase ground
--lifecycle-manage-base#2A6FDBManage phase accent
--lifecycle-manage-bgrgba(42,111,219,0.08)Manage phase ground
--lifecycle-exit-base#B0322BExit phase accent
--lifecycle-exit-bgrgba(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.

TokenValueRole
--method-get-base#2A6FDBGET text
--method-post-base#1F8A5BPOST text
--method-put-base#B45A1APUT text
--method-patch-base#B45A1APATCH text (shares PUT)
--method-delete-base#B0322BDELETE text
--http-status-ok-base#1F8A5B2xx accent
--http-status-ok-bgrgba(31,138,91,0.10)2xx ground
--http-status-ok-ringrgba(31,138,91,0.35)2xx focus ring
--http-status-redirect-base#6B72803xx accent
--http-status-redirect-bgrgba(107,114,128,0.10)3xx ground
--http-status-redirect-ringrgba(107,114,128,0.30)3xx focus ring
--http-status-error-base#B0322B4xx and 5xx accent
--http-status-error-bgrgba(176,50,43,0.10)4xx and 5xx ground
--http-status-error-ringrgba(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.

TokenValueRole
--matter-orange-hover#D04610orange button hover
--matter-orange-tint#FFF0EBsoft orange ground
--matter-orange-ringrgba(232, 81, 18, 0.16)orange focus ring
--matter-cyan#5AFFFFhigh-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.

TokenValueRole
--green-base#7B9E82brand-side success accent
--green-sage-bg#F2F5F2sage backdrop
--indigo-base#2C2854indigo accent
--rose-base#B56C6Brose accent
--rose-bg#F8F0F0rose 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.

TokenValueRole
--key-set-dot-base#5FA86Bactive key-set indicator
--key-set-dot-ringrgba(95,168,107,0.18)active key-set ring
Use var(--surface-elevated) and var(--text-primary) at callsites. The ring resolves correctly under dark theme.
Don't author against primitives (var(--fg)) in product code. Primitives are the back-room source of truth.

On this page