Skip to content

Foundations

Foundations

The token reference: colour, type, radius, elevation, controls, spacing, motion and focus. Every value is resolved live, so switch the colour mode or density in the top bar to compare.

Color

Semantic tokens resolved live in the current mode. Swatches sit on the page background, so translucent tokens show the colour they actually produce.

Surfaces

The page is surface-1 (white / #191919). Dark mode shows elevation by colour: page #191919, raised #1f1f1f, popover #303030. Inside a Panel the raised surfaces collapse to the page.

pagebg-page · bg-background--cds-page-bg…canvas = surface-1
surface-0bg-surface-0--cds-surface-0…recessed: wells, rails
surface-1bg-surface-1 · bg-card--cds-surface-1…page, cards
surface-2bg-surface-2--cds-surface-2…panels, card hover
surface-3bg-surface-3--cds-surface-3…raised page-level cards
popoverbg-popover · bg-surface-popover--cds-surface-popover…menus, dialogs, toasts, composer
panelbg-surface-panel--cds-surface-panel…side panels, sheets
sidebarbg-sidebar--sidebar…flat rail sidebar
card-linkbg-card-link--cds-fizzy-lake-color-card-link…link-card fill (hover / pressed layers)
backdropbg-backdrop--cds-backdrop…modal scrim
tooltipbg-tooltip--cds-tooltip-bg…ink in light, popover in dark

Text

Text roles are translucent ink (90 / 60 / 47% in light, 93 / 57 / 40% in dark). Inside controls secondary reads as ink; inside popups and the sidebar muted lifts to secondary. Placeholders are an opaque #878787.

Aa
primarytext-primary · text-foreground--cds-text-primary…
Aa
secondarytext-secondary · text-muted-foreground--cds-text-secondary…
Aa
mutedtext-muted--cds-text-muted…timestamps, captions
Aa
tertiarytext-tertiary--cds-fizzy-lake-color-tertiary…disclaimer links
Aa
placeholdertext-placeholder--cds-fizzy-lake-color-placeholder…opaque, both modes
Aa
disabledtext-disabled--cds-text-disabled…
Aa
accenttext-accent--cds-text-accent…links
Aa
dangertext-danger · text-destructive--cds-text-danger…
Aa
successtext-success--cds-text-success…
Aa
warningtext-warning--cds-text-warning…
Aa
protext-pro--cds-text-pro…
Aa
on-primarytext-on-primary--cds-on-primary…on fill-primary

Fills

Control fills. Primary is ink (not clay). Plain hover = ghost-hover, highlighted / selected rows = ghost-selected, hover on a selected row = selected-hover; a light ghost button hovers at 10%. Press states stack layers (layers-*).

fill-primarybg-fill-primary · bg-primary--cds-fill-primary…
fill-primary-hoverbg-fill-primary-hover--cds-fill-primary-hover…
fill-secondarybg-fill-secondary--cds-fill-secondary…v2: no ring or drop (FC-1)
fill-secondary-hoverbg-fill-secondary-hover--cds-fill-secondary-hover…
fill-ghost-hoverbg-fill-ghost-hover · bg-accent--cds-fill-ghost-hover…
fill-ghost-selectedbg-fill-ghost-selected--cds-fill-ghost-selected…
selected-hoverbg-selected-hover--cds-fizzy-lake-color-selected-hover…
button-ghost-hoverbg-fill-button-ghost-hover--cds-fill-button-ghost-hover…ghost button hover
button-layerlayers-1-fill-button-layer--cds-fill-button-layer…press layer
fill-controlbg-fill-control--cds-fill-control…
fill-fieldbg-fill-field--cds-fill-field…inputs
fill-disabledbg-fill-disabled--cds-fill-disabled…
fill-accentbg-fill-accent · bg-ring--cds-fill-accent…focus, checked
fill-dangerbg-fill-danger · bg-destructive--cds-fill-danger…
fill-successbg-fill-success--cds-fill-success…
fill-warningbg-fill-warning--cds-fill-warning…
fill-probg-fill-pro--cds-fill-pro…

Borders

Hairlines are translucent ink: border (8% / 4%) for card rings, popups and table rows; border-line (12%) for structural rules. Cards and panels draw rings with box-shadow (outer in light, inset in dark).

borderborder-border--cds-border…8% / 4% ink
border-lineborder-line--cds-border-line…12%: frame rows, bands
seamborder-seam--cds-fizzy-lake-color-seam…sidebar edge
border-strongborder-strong--cds-border-strong…hover, emphasis
border-strongerborder-stronger--cds-border-stronger…
border-accentborder-accent · ring-accent--cds-border-accent…
border-dangerborder-danger--cds-border-danger…
border-successborder-success--cds-border-success…
border-warningborder-warning--cds-border-warning…
border-proborder-pro--cds-border-pro…

Status & tints

Status backgrounds and tag tints are the hue's fill at a fixed alpha (12-16% light, 8-12% dark), paired with text-X. The -opaque tints mix the same amount into the page.

accent-tintbg-accent-tint--cds-bg-accent…
accent-mutedbg-accent-muted--cds-bg-accent-muted…fill-accent @ 10%
dangerbg-danger--cds-bg-danger…
successbg-success--cds-bg-success…
warningbg-warning--cds-bg-warning…
probg-pro--cds-bg-pro…
highlightbg-highlight--cds-bg-highlight…<mark>
neutralbg-neutral · bg-muted--cds-bg-neutral…chips, user bubble
tint-bluebg-tint-blue--cds-bg-tint-blue…
tint-violetbg-tint-violet--cds-bg-tint-violet…
tint-greenbg-tint-green--cds-bg-tint-green…
tint-orangebg-tint-orange--cds-bg-tint-orange…
accent-layerbg-accent-layer--cds-bg-accent-layer…fill-accent @ 6%: press layer
danger-layerbg-danger-layer--cds-bg-danger-layer…press layer

Brand

Clay is the brand fill (bg-brand, sidebar-primary). Illustration colours are identical in both modes.

brandbg-brand · bg-clay-emphasized--cds-fill-brand…
brand-hoverbg-brand-hover · bg-clay--cds-fill-brand-hover…
heatherbg-heather--cds-heather…
plumbg-plum--cds-plum…
cactusbg-cactus--cds-cactus…
mineralbg-mineral--cds-mineral…

shadcn-vue contract

The shadcn-vue variables every generated component reads, mapped onto cds tokens.

backgroundbg-background--background…= page
cardbg-card--card…= surface-1
popoverbg-popover--popover…= surface-popover
primarybg-primary--primary…= fill-primary
secondarybg-secondary--secondary…
mutedbg-muted--muted…= bg-neutral
accentbg-accent--accent…= fill-ghost-hover
destructivebg-destructive--destructive…= fill-danger
borderborder-border--border…
inputborder-input--input…
ringring-ring--ring…= fill-accent
sidebar-selectedbg-sidebar-selected--sidebar-selected…extra
sidebar-selected-hoverbg-[var(--sidebar-selected-hover)]--sidebar-selected-hover…extra

Charts

Mode-specific data palettes (bg-chart-*, fill-chart-*); shadcn chart-1 … chart-5 are the first five categorical colours.

Categoricalchart-1 … chart-8
Sequentialchart-seq-1 … 7
Divergingchart-div-1 … 7
Statuschart-good · warning · serious · critical

Typography

Role sizes pair a size with a line-height and follow density (switch to compact in the top bar). UI text is the system stack; Claude's voice is Source Serif 4, a free variable serif (wght 200-900, optical size 8-60); replies are serif by default at 15/21.

Role sizes

text-<role> sets size + line-height; leading-* still overrides the line-height.

Titletext-title…

Projects and recent chats

page and dialog titles

Headingtext-heading…

Section heading inside a panel

Prosetext-prose…

Long-form reading text and message bodies.

Bodytext-body…

The default UI text: buttons, menus, inputs and rows.

Footnotetext-footnote…

Secondary row text and descriptions.

Captiontext-caption…

Timestamps, counters, group labels.

Codetext-code…

const reply = await claude.complete(prompt)

mono + code size

Weights

text-<role>-<weight> adds the weight. v2 weight roles: -medium / font-medium = control 435, -semibold / font-semibold = header 520, font-badge = 540; serif, display and mono text opt out (500 / 580). In dark mode the variable-font wght axis drops (body 360, control 395, header 480, badge 520) while font-weight keeps its value, as on claude.ai.

Body regulartext-body-regular…

Regular 400

Body mediumtext-body-medium…

Control 435

-medium / font-medium = control role (dark wght 395)

Body semiboldtext-body-semibold…

Header 520

-semibold / font-semibold = header role (dark wght 480)

Heading semiboldtext-heading-semibold…

Header 520

Badgetext-caption font-badge…

Badge 540

font-badge (dark wght 520)

Caption mediumtext-caption-medium…

Caption medium

Footnote semiboldtext-footnote-semibold…

Footnote semibold

Serif: Claude's voice

font-display is the new-chat greeting. Dark mode lowers serif weights the way claude.ai does.

Loading Source Serif 4…
Displayfont-display…

Good evening, Ada

new-chat greeting: 38px, weight 330, opsz 48 (dark: weight 300, wght 290)

Serif titlefont-title…

A considered serif title

28px, weight 500, opsz 28 (dark: wght 460)

Serif headingfont-heading…

Serif heading

24px, weight 500, opsz 24 (dark: wght 460)

Reply bodyfont-claude-response-body…

Here is a short summary of what changed and why it matters for the release.

Claude's replies (serif by default): 15px / 21px (dark: wght 360)

Prose

.prose = cds long-form text in claude.ai's reply look (15/21, header-weight headings, neutral inline code, primary list markers, open ruled tables); data-prose-font="serif" switches to Claude's voice.

prose

Release notes

The composer now keeps drafts per chat, and links follow the accent colour. Inline code uses the mono stack; highlights use the warning tint.

  • Density follows the cds scale
  • Focus rings use Tab only
Quotes sit in text-secondary with a 4px rule.
prose · data-prose-font="serif"

Release notes

The composer now keeps drafts per chat, and links follow the accent colour. Inline code uses the mono stack; highlights use the warning tint.

  • Density follows the cds scale
  • Focus rings use Tab only
Quotes sit in text-secondary with a 4px rule.

Mono

font-mono = SF Mono, ui-monospace, Menlo, Consolas; ligatures are off for code.

const greeting = 'Hello' // != === => -> ligatures stay off
for (const turn of conversation) render(turn)

Radius

The cds radii are named and follow density and data-size: rounded (= rounded-control) is the control radius, 8px comfortable and 6px compact, and rounded-card adds 4px. rounded-xs to 2xl keep Tailwind's fixed values, as on claude.ai, so ported claude.ai markup keeps its corners.

control…rounded-control= rounded: buttons, inputs, menu items
card…rounded-cardcontrol + 4px: cards, menus, popovers
chip…rounded-chipnested-control height / 4
checkbox…rounded-checkbox
panel…rounded-panel
composer…rounded-composer
xs…rounded-xsTailwind, fixed
sm…rounded-smTailwind, fixed
md…rounded-mdTailwind, fixed
lg…rounded-lgTailwind, fixed
xl…rounded-xlTailwind, fixed
2xl…rounded-2xlTailwind, fixed
full…rounded-full

Elevation

Shadows deepen in dark mode (--cds-shadow-color), but v2 dark elevation is mostly surface colour (#191919 / #1f1f1f / #303030) and panels are flat (no shadow, radius 0). Rings draw card and field outlines with box-shadow: an outer 1px ring in light, an inset one in dark.

xsshadow-xsfield drop
smshadow-sm
mdshadow-md
lgshadow-lg
popovershadow-popovermenus
card-ringshadow-card-ringouter ring light / inset dark
panelshadow-panelring + popover
panel-mdshadow-panel-md
composershadow-composer
composer-focusshadow-composer-focus
fieldshadow-field
field-hovershadow-field-hover
field-invalidshadow-field-invalid
ring-accentshadow-ring-accent
drop-ringshadow-drop-ringfile drop target
drop-glowshadow-drop-glow

Controls

One control height drives buttons, inputs, selects and rows; nested controls (chips, inner buttons) use control-nested. All of it follows density; v2 controls are 28px where a fine pointer can hover and 32px on touch, while nav / list rows stay 32 (h-list-row) and the frame row is 45 / 48.

Control scale

Spacing names: h-control, size-control, min-h-control-nested, size-icon …

controlh-control28 fine pointer / 32 touch: buttons, inputs
…
list-rowh-list-rownav / list rows stay 32
…
frame-rowh-frame-row45 fine pointer / 48 touch
…
control-nestedh-control-nesteda control inside a control
…
iconh-iconicon box
…
checkboxh-checkbox
…
switchh-switch
…
avatar-smh-avatar-sm
…
avatar-mdh-avatar-md
…
avatar-lgh-avatar-lg
…
Button on the control scaleh-control + rounded-control: 28px / 8px comfortable on a fine pointer (32px on touch, V2-2), 24px / 6px compact. size xs / sm / lg map to the cds data-size steps.
…
data-size and data-step scopesEvery cds-sized utility under [data-size] (density-aware) or [data-step] (absolute) follows the scope: control height, radius, padding, body text.
data-size
xs
sm
default
lg
data-step
step 1
step 2
step 3
step 4
step 5

Spacing

Two density-aware scales. pad-* is inner padding, gap-* separates siblings (cds margins use it too). Use the spacing names with any utility (px-pad-sm, mt-gap-lg, start-pad-md) or the cds shorthands (p-md, gap-xs, m-lg).

Pad scale

pad-xsw-pad-xsp-xs · px-pad-xs
…
pad-smw-pad-smp-sm · px-pad-sm
…
pad-mdw-pad-mdp-md · px-pad-md
…
pad-lgw-pad-lgp-lg · px-pad-lg
…
pad-xlw-pad-xlp-xl · px-pad-xl
…

Gap scale

gap-xsw-gap-xsgap-xs · m-xs
…
gap-smw-gap-smgap-sm · m-sm
…
gap-mdw-gap-mdgap-md · m-md
…
gap-lgw-gap-lggap-lg · m-lg
…
gap-xlw-gap-xlgap-xl · m-xl
…

Motion

cds durations and curves as duration-* / ease-* utilities, plus claude.ai's animate-* presets. Turn on Reduce motion in the top bar: animations collapse to their end state and transitions marked motion-reduce:transition-none stop.

Durations × easingPick a curve, then Play (or hover a track). ease-out is the cds curve, not Tailwind's. Reduced motion removes the transition.
duration-fast 60ms
duration-snap 120ms
duration-base 200ms
duration-sheet 300ms
duration-slow 450ms

Keyframe presets

Same names and timings as claude.ai's utilities; replay with the button.

Chip
fade-in.3s legacy fade
Chip
chip-inrows rising 10px
Chip
check-pop-inovershoot pop
Chip
pill-drop-indrop 8px
Chip
cds-reveal-inbase + ease-out
Chip
cds-pill-inscale .8 + fade
Hello Claude
code-user-bubble-enterslow + overshoot
Hello Claude
lightbox-content-inscale-in .25s
cds-dot-pulsethinking dots
cds-skeletonskeleton breathe
pulse-dotstatus dot
cds-working-haloworking halo
layers-*v2 press model: hover adds one translucent layer over the fill, press adds two (layers-1 / layers-2-fill-button-layer). No scale.
press-squishv1 press: scale .975 on the cds spring (linear() easing). Kept as a utility; v2 buttons no longer squish (R20).

Focus

The cds focus ring is a 1px accent ring with a soft glow, separated from the control by a page-coloured inset. Apply it with focus-ring (focus-visible only) or shadow-focus; the shadcn-vue components use shadow-focus as well.

shadow-focusforced on, accent
Focused field
shadow-focus-dangerforced on, invalid
Invalid field
focus-ringpress Tab to see it
shadcn controlsButton and Input focus-visible