Design artifacts. Sandboxed iframe designs use public/design-starters/*/tokens.css — separate from the app shell.
Control decision tree
App-wide actions.stdbutton / .altbutton in app-buttons.css
Canvas chrome.cv-* in canvas.css — toolbars, inspector, pills
DropdownsAppListSelect / .app-dropdown — not native <select>
Legacystyles.css patterns — migrate, do not extend
Color
Semantic tokens for the active preview theme. Semantic greens/reds are for feedback only — not decorative chrome.
Text hierarchy
--colorInk / primary text
--text-secondarySecondary text
--text-tertiaryTertiary text
Surfaces
--bgPage background
--verylightbgSubtle surface
--popupbgPopup / panel
--headerbgHeader
--surface-chromeFrosted chrome
--scrim-defaultModal scrim
--scrim-denseDense scrim (no blur)
--modalbgModal tint
--skeleton-baseSkeleton base
Interactive / chrome
--hairlineHairline border
--bordercolorBorder
--buttonbgButton fill
--lighthoverHover fill
--stdbuttonbgPrimary fill (= ink)
--stdbuttoncolorPrimary fill text
--accentcolorAccent (= ink)
--focus-ringFocus ring
--control-font-sizeCanvas control text
--control-height-mdCanvas control height
Semantic (feedback only)
--color-successSuccess
--color-errorError
--color-warningWarning
Typography
Marketing display for logged-out landing heroes; canvas scale for in-product UI. Titles use --font-title (Space Grotesk Semibold); body and UI copy stay on --font-sans (Inter).
Inter 400 body · 500 UI · Space Grotesk 600 titles
Logged-out landing scale — larger than in-app canvas titles. Space Grotesk Semibold, tight tracking.
Create anything.
Generate, edit, and organize on an infinite canvas.
Seven steps from 2rem page titles down to 11px panel labels. Pick by structural depth: page list → settings section → top bar name → inspector group → uppercase row label — not by how “important” the copy feels.
2.2rem · Page titleMy Boards
20px · Section titleBoard settings
15px · Subsection titleSharing & access
14px · Chrome titleUntitled board
13px · Chat headingNext steps
13px · Inspector sectionLayout
12px · Panel labelLayers
Largest to smallest above. Page title is a step above everything else; chrome and chat sit between section copy and inspector labels. Panel labels are 11px, uppercase, secondary ink.
Sample
Rendered
Class
Token
Where
My Boards
2.2rem2.2rem
cv-heading-page
--text-page-title
.cv-list-title · .app-page-title
Board settings
20px20px
app-section-title
--text-section-title
Settings / modal sections
Sharing & access
15px15px
app-subsection-title
--text-subsection-title
Nested settings blocks
Untitled board
14px14px
cv-heading-chrome
--text-chrome-title
.cv-topbar-title
Next steps
13px13px
cv-heading-chat
--text-chat-heading
.cv-cc-md h1–h6
Layout
13px13px
cv-heading-section
--text-panel-title
.cv-inspector-section-title
Layers
12px12px
cv-heading-panel-label
--text-panel-label
.cv-layers-heading-row · uppercase
Spacing
4px base grid. Prefer tokens over raw pixel values.
--space-14px
--space-28px
--space-312px
--space-416px
--space-520px
--space-624px
--space-832px
--space-1040px
--space-1248px
--space-1664px
Border radius
Radius is contextual: --radius-md for inspector fields, --radius-lg for top-bar controls, --radius-full for toolbars and selection pills.
--radius-nonenone
--radius-smsm (4px)
--radius-mdmd (6px)
--radius-lglg (8px)
--radius-xlxl (12px)
--radius-2xl2xl (16px)
--radius-fullfull
Shadows
--shadow-sm
--shadow-md
--shadow-lg
--shadow-xl
Materials & blur
Frosted chrome, modal scrims, and floating bars use tokenized blur values. Always pair -webkit-backdrop-filter with backdrop-filter for Safari.