Theme reference
Per-theme tokens, typography, motion, control scale, and live component chrome. Catalog themes read from src/registry/core/themes/sites.tswith branches in recipes/; saved custom themes use their draft token overrides.
atelierAtelier · light modeAt a glance
Live component preview
Wrapped in themePreviewStyle so the canvas matches marketing and doc previews. Toggle theme and mode above to compare catalog themes and saved custom themes.
Canvas: Three-stop linear gradient from canvas → secondary → tertiary (typical dashboard page chrome).
Surface roles
How ink, surface, canvas, and accent relate on a typical page — rendered with the active theme tokens.
Canvas
Page canvas
Surface
Cards & panels
Border
Hairlines
Accent
Brand accent
Heading on surface
Body and muted text — ink and muted tokens on a surface panel.
Color palette
Injected on each component via themeStyleVars(theme, mode).
Ink
--atelier-ink
#2c2419
Muted
--atelier-muted
#8a7f72
Surface
--atelier-surface
#fffdf8
Canvas
--atelier-canvas
#f3ebe0
Canvas secondary
gradient stop
#ebe3d6
Canvas tertiary
gradient stop
#e2d8c8
Border
--atelier-border
#d9cfc0
Accent
--atelier-accent
#9a7222
Accent hover
--atelier-accent-hover
#7d5c18
Accent soft
--atelier-accent-soft
#c9a962
On accent
--atelier-on-accent
#fffdf8
Focus ring
--atelier-focus-ring
color-mix(in srgb, #c9a962 30%, transparent)
Danger
--atelier-danger
#b54a4a
Light vs dark
Core colors for both modes — use the mode toggle to preview components; this table showsraw token values from sites.ts.
| Token | Light | Dark |
|---|---|---|
Ink--atelier-ink | #2c2419 | #f5efe6 |
Muted--atelier-muted | #8a7f72 | #a89b8a |
Canvas--atelier-canvas | #f3ebe0 | #1e1914 |
Surface--atelier-surface | #fffdf8 | #2a231c |
Border--atelier-border | #d9cfc0 | #4a4035 |
Accent--atelier-accent | #9a7222 | #d4b872 |
Accent hover--atelier-accent-hover | #7d5c18 | #e8cc8a |
Danger--atelier-danger | #b54a4a | #e07a7a |
Typography
Shape
| Token | CSS variable | Value |
|---|---|---|
| Control radius | --atelier-radius | 0.875rem |
| Surface radius | --atelier-radius-lg | 1.125rem |
Motion
Easing and durations drive buttons, panels, tabs, and accordion height transitions.
| Token | CSS variable | Value |
|---|---|---|
| Easing | --atelier-ease | cubic-bezier(0.25, 0.8, 0.25, 1) |
| Fast duration | --atelier-dur-fast | 180ms |
| Panel duration | --atelier-dur-panel | 320ms |
| Enter duration | --atelier-dur-enter | 420ms |
Control scale
Minimum heights and type sizes from recipes/button.ts and recipes/field.ts for this theme.
| Control | Small | Medium | Large |
|---|---|---|---|
| Button | 36px · 12px text | 40px · 14px text | 44px · 16px text |
| Field | 44px · 14px text | 44px · 14px text | 44px · 14px text |
Recipe modules
Shared branches apply to every theme; dedicated files override chrome for catalog moods.
Usage in your app
Pass theme and mode on each component — no global globals.css token block required after copying core once.
import { Button } from "@/app/ui/button";
import { themeStyleVars } from "@/app/ui/core/themes";
<div style={themeStyleVars("atelier", "light")}>
<Button theme="atelier" mode="light" variant="primary">
Save
</Button>
</div>CSS variables (light)
Full set written by themeStyleVars("atelier", "light").
| Token | CSS variable | Value |
|---|---|---|
| Ink | --atelier-ink | #2c2419 |
| Muted | --atelier-muted | #8a7f72 |
| Surface | --atelier-surface | #fffdf8 |
| Canvas | --atelier-canvas | #f3ebe0 |
| Border | --atelier-border | #d9cfc0 |
| Accent | --atelier-accent | #9a7222 |
| Accent hover | --atelier-accent-hover | #7d5c18 |
| Accent soft | --atelier-accent-soft | #c9a962 |
| On accent | --atelier-on-accent | #fffdf8 |
| Focus ring | --atelier-focus-ring | color-mix(in srgb, #c9a962 30%, transparent) |
| Danger | --atelier-danger | #b54a4a |
| Control radius | --atelier-radius | 0.875rem |
| Surface radius | --atelier-radius-lg | 1.125rem |
| Easing | --atelier-ease | cubic-bezier(0.25, 0.8, 0.25, 1) |
| Fast duration | --atelier-dur-fast | 180ms |
| Panel duration | --atelier-dur-panel | 320ms |
| Enter duration | --atelier-dur-enter | 420ms |