Colors
Two layers, like Material 3. Tonal scales are the raw paint. Semantic roles say what a color is for. Components only ever use roles, so you can retheme by remapping roles without touching a single component.
Semantic roles
Every role ships as four tokens: the color, on- (text on it), -container (a soft tint) and on-*-container.
Main actions, active states. Coral.
Supporting actions, links. Blue.
Highlights and special moments. Grape.
Playful pops, celebratory states. Lime.
Status
Completed, saved, live.
Needs attention, not broken.
Destructive or failed.
Neutral announcements.
Surfaces
Clay is about depth, so surfaces are defined by elevation, not by color alone. In dark mode raised surfaces get lighter and wells get darker, so depth still reads.
Usage
Pick a role with color, and an emphasis with variant.
<Button color="primary">Save</Button>
<Button variant="soft" color="danger">Delete</Button>
<Badge variant="soft" color="success">Live</Badge>
{/* Or straight from Tailwind */}
<div className="bg-primary-container text-on-primary-container" />Tonal scales
Generated in OKLCH by scripts/palette.mjs. The brand hex is pinned to its step (marked ●) and the rest is interpolated, so scales stay perceptually even. Use them as bg-coral-200 etc.
Contrast
Every pair is checked by scripts/contrast.mjs against WCAG 2. Light and dark themes are both audited. One deliberate call: text on coral is dark clay, because white on our coral is only 2.95:1.
| Theme | Sample | Pair | Ratio | WCAG |
|---|---|---|---|---|
| light | Aa | primary / on-primary | 5.71 | AA |
| light | Aa | primary-container / on-primary-container | 7.27 | AAA |
| light | Aa | secondary / on-secondary | 5.85 | AA |
| light | Aa | secondary-container / on-secondary-container | 8.05 | AAA |
| light | Aa | tertiary / on-tertiary | 5.58 | AA |
| light | Aa | tertiary-container / on-tertiary-container | 8.04 | AAA |
| light | Aa | accent / on-accent | 9.75 | AAA |
| light | Aa | accent-container / on-accent-container | 6.99 | AA |
| light | Aa | success / on-success | 4.90 | AA |
| light | Aa | success-container / on-success-container | 6.99 | AA |
| light | Aa | warning / on-warning | 8.27 | AAA |
| light | Aa | warning-container / on-warning-container | 7.04 | AAA |
| light | Aa | danger / on-danger | 6.16 | AA |
| light | Aa | danger-container / on-danger-container | 10.42 | AAA |
| light | Aa | info / on-info | 5.85 | AA |
| light | Aa | info-container / on-info-container | 8.05 | AAA |
| light | Aa | background / on-surface | 13.75 | AAA |
| light | Aa | surface / on-surface | 14.57 | AAA |
| light | Aa | surface / on-surface-muted | 5.76 | AA |
| light | Aa | surface-sunken / on-surface | 12.08 | AAA |
| light | Aa | surface-sunken / on-surface-muted | 4.78 | AA |
| light | Aa | surface-inverse / on-surface-inverse | 13.75 | AAA |
| dark | Aa | primary / on-primary | 5.71 | AA |
| dark | Aa | primary-container / on-primary-container | 9.10 | AAA |
| dark | Aa | secondary / on-secondary | 5.46 | AA |
| dark | Aa | secondary-container / on-secondary-container | 8.32 | AAA |
| dark | Aa | tertiary / on-tertiary | 5.66 | AA |
| dark | Aa | tertiary-container / on-tertiary-container | 8.32 | AAA |
| dark | Aa | accent / on-accent | 11.30 | AAA |
| dark | Aa | accent-container / on-accent-container | 10.43 | AAA |
| dark | Aa | success / on-success | 7.88 | AAA |
| dark | Aa | success-container / on-success-container | 10.43 | AAA |
| dark | Aa | warning / on-warning | 9.58 | AAA |
| dark | Aa | warning-container / on-warning-container | 9.85 | AAA |
| dark | Aa | danger / on-danger | 7.23 | AAA |
| dark | Aa | danger-container / on-danger-container | 9.10 | AAA |
| dark | Aa | info / on-info | 5.46 | AA |
| dark | Aa | info-container / on-info-container | 8.32 | AAA |
| dark | Aa | background / on-surface | 16.68 | AAA |
| dark | Aa | surface / on-surface | 15.03 | AAA |
| dark | Aa | surface / on-surface-muted | 7.85 | AAA |
| dark | Aa | surface-sunken / on-surface | 17.66 | AAA |
| dark | Aa | surface-sunken / on-surface-muted | 9.21 | AAA |
| dark | Aa | surface-inverse / on-surface-inverse | 18.05 | AAA |