Colors

Semantic token roles on a hex base — neutral surfaces with Bloom purple as the single brand override. The dark theme redeclares the surface ladder and chart/chain colors; the semantic tokens resolve per theme through the primitive layer.

Surface

4 tokens

Background

Background

--background

Card

Card

--card

Popover

Popover

--popover

Muted

Muted

--muted

Brand

3 tokens

Primary

Primary

--primary

Secondary

Secondary

--secondary

Accent

Accent

--accent

Status

8 tokens

Destructive

Destructive

--destructive

Destructive muted

Destructive muted

--destructive-muted

Success

Success

--success

Success muted

Success muted

--success-muted

Warning

Warning

--warning

Warning muted

Warning muted

--warning-muted

Info

Info

--info

Info muted

Info muted

--info-muted

Form

3 tokens

Border

--border

Input

--input

Ring

--ring

Chart

5 tokens

Chart 1

--chart-1

Chart 2

--chart-2

Chart 3

--chart-3

Chart 4

--chart-4

Chart 5

--chart-5

Chain identity

5 tokens

Ethereum

--chain-eth

BSC

--chain-bsc

Solana

--chain-solana

Base

--chain-base

Arbitrum

--chain-arbitrum

5 tokens

Sidebar

Sidebar

--sidebar

Sidebar primary

Sidebar primary

--sidebar-primary

Sidebar accent

Sidebar accent

--sidebar-accent

Sidebar border

--sidebar-border

Sidebar ring

--sidebar-ring

Substrate ladder

8 steps

The 8-step elevation cluster every component composes against. Light keeps surfaces 3–8 at #ffffff and separates levels via paired --shadow-surface-N drops; dark walks a true luminance ladder from #0c0c0e to #312f37. See /components/surfaces for the elevation showcase and per-level shadow recipes.

Surface 1

--surface-1

page bg

Surface 2

--surface-2

sunken / muted

Surface 3

--surface-3

card

Surface 4

--surface-4

raised card

Surface 5

--surface-5

dialog / sheet

Surface 6

--surface-6

raised modal

Surface 7

--surface-7

popover

Surface 8

--surface-8

maximum cap

data-substrate context

relative tokens

Interactive primitives read hover:bg-substrate-hover and aria-expanded:bg-substrate-active — both resolve relative to the nearest data-substrate="N" ancestor. Card declares data-substrate="3"; Dialog / Sheet / Drawer declare "5"; Popover / DropdownMenu / Menubar / NavigationMenu / HoverCard / Select content declare "7". Dark walks the surface ladder up one step for hover, two for active; light anchors hover and active to fixed dim values because surfaces 3–8 all read white in light.

Substrate

--substrate

matches container

Substrate hover

--substrate-hover

one step lift

Substrate active

--substrate-active

two steps lift

The swatches above show the page-level (no data-substrate ancestor) resolution. Hover the outline buttons in both panels — the lift inside the card lands on --surface-4 in dark; the page-root version lands on --surface-2.

data-substrate="3"

Inside Card

chip

no data-substrate

Page root

chip

Field recipe

shared idle pattern

The standard form-adjacent fill is bg-input/30 border border-border hover:bg-substrate-hover. Consumed by Badge variant="outline", every field primitive (Input, Textarea, Select, NumberField, InputGroup, CommandInput, InputOTPSlot, CurrencyPicker trigger), and non-Custom chips in LinkChips. Button variant="outline" shares the border + hover halves but stays bg-transparent at idle so the recipe doesn't compete with primary actions on the same row.

field chip another