Materials & surfaces

Five named surfaces. No color picker; every background in product is one of these tokens. If you need something else, we probably need a sixth.

The surfaces

Five tokens, one purpose each

Pick by role, not by color. Semantic tokens are what keep light and dark mode coherent — the names stay the same, the values flip.

Default
--bg-default

The page itself. Product canvas. 99% of product.

Canvas
--bg-canvas

The layer cards float on. Rails, list backgrounds, empty states.

Muted
--bg-muted

Secondary containers: disabled fields, read-only rows, code blocks.

Inverse
--bg-inverse

Primary CTA, nav pills, tooltips, dark hero bands.

Cream
--bg-cream

Marketing warmth. The one non-neutral we allow as a background — used on landing pages and the onboarding flow, nowhere else.

Layering

Depth without shadows

We step one surface level for every layer of containment. Shadow is for lift; surface is for nesting. Don't use the two interchangeably.

Canvas · the page
Default · main panel
Muted · inset section
Inverse · focal CTA
--bg-canvas
--bg-default
--bg-muted
--bg-inverse
Rules

Three principles

01

Never stack same-on-same

A default card on a default page needs a border or shadow to read. Use canvas underneath default, or step one level.

02

Inverse is a pattern, not a surface

Only for emphasis — primary CTA, dark hero, overlay. If you catch yourself filling half the screen with inverse, flip the model.

03

Cream is strictly brand

It lives in marketing and onboarding. It doesn't appear in product chrome, dashboards, or admin. Ever.