Elevation

Three surface levels, one hover lift that means “this opens”, and one pressed state every control shares. Depth is a property of what a surface is and what it does, not of the component that happens to render it.

Three levels

Page < card < floating. The page is the darkest surface in both themes; a card sits one step above it; anything that floats over the page sits one more. In light the shadow does the separating; in dark the tint steps do.

LevelSurfaceClassesUsed for
0Pagebg-bg-mutedThe ground every route sits on.
1Cardbg-bg-default border-border-subtle shadow-smContent cards, tiles, settings panels, dialogs (with shadow-lg).
2Floatingbg-bg-float border-border-subtle shadow-mdMenus, popovers, tooltips, select lists, the command palette, toasts.
Page · bg-mutedlight
Card · bg-default + hairline + shadow-sm

Summer launch

Meta · 12 ads · $4,120

Floating · bg-float + hairline + shadow-md
Duplicate
Pause
Archive
Page · bg-muteddark
Card · bg-default + hairline + shadow-sm

Summer launch

Meta · 12 ads · $4,120

Floating · bg-float + hairline + shadow-md
Duplicate
Pause
Archive

Lift: clickable cards only

A card with an onClick or an href carries the `lift` utility: it rises 3 px onto the floating shadow on hover and settles back onto the card shadow on press. A read-only tile never lifts, so the lift itself says “this opens”. Never hand-roll hover:-translate-y-[3px] hover:shadow-md.

Ads report

Opens the report

Spend

Read-only tile

Press: one state for every control

The `press` utility darkens whatever fill a control has by 8% while it is held (10% white in dark), so it needs no per-variant colour and reads the same on brand blue, ink and a white outline. Button, IconButton and Chip carry it in their base classes. Never a scale-down.