Approachable minimalism on warm white. Compressed Inter at -2.125px, whisper borders, multi-layer 4-stack shadows, and a single saturated blue accent.
A complete design system, ready for your AI coding agent. Every primitive, token, and pattern below is generated straight from DESIGN.md — drop the file in your project and ship matching UI in minutes.
Prose-first token file — decisions live next to their reasoning.
Fine micro-scale (1–5px) for pills, editorial scale (12–21px) for the grid.
The system's own radius tokens — sm for chips and inputs, md for buttons, lg for cards, pill for fully-rounded CTAs.
Tokens describe the resting state. A real product needs every interaction state. Hover, focus, active, disabled, loading — all derived from the system's resting tokens.
1---2name: "Warm Canvas"3description: "Approachable minimalism on warm white. Compressed Inter at -2.125px, whisper borders, multi-layer 4-stack shadows, and a single saturated blue accent."4tags: [minimal, warm, productivity, saas]5colors:6 primary: "#000000"7 secondary: "#615d59"8 tertiary: "#0075de"9 neutral: "#ffffff"10 surface: "#ffffff"11typography:12 display: Inter13 body: Inter14 mono: "JetBrains Mono"15 scale:16 hero: "4rem / 1 / 700 / -2.125px"17 h1: "3rem / 1 / 700 / -1.5px"18 h2: "1.625rem / 1.23 / 700 / -0.625px"19 body: "1rem / 1.5 / 400 / 0"20radius:21 sm: 4px22 md: 8px23 lg: 12px24 pill: 9999px25shadows:26 card: "rgba(0,0,0,0.04) 0 4px 18px, rgba(0,0,0,0.027) 0 2.025px 7.85px, rgba(0,0,0,0.02) 0 0.8px 2.93px, rgba(0,0,0,0.01) 0 0.175px 1.04px"27 button: "rgba(0,117,222,0.15) 0 4px 12px"28borders:29 card: "1px solid rgba(0,0,0,0.1)"30 divider: rgba(0,0,0,0.1)31buttons:32 primary:33 background: #2F2F2F34 color: #FFFFFF35 border: none36 shape: rounded37 padding: 8px 16px38 font: 500 / 0.875rem39 secondary:40 background: #F7F6F341 color: #2F2F2F42 border: 1px solid #E9E5DC43 shape: rounded44 padding: 8px 16px45 font: 500 / 0.875rem46 outline:47 background: transparent48 color: #2F2F2F49 border: 1px solid #2F2F2F50 shape: rounded51 padding: 8px 16px52 font: 500 / 0.875rem53 ghost:54 background: transparent55 color: #78767356 border: none57 shape: rounded58 padding: 8px 12px59 font: 500 / 0.875rem60charts:61 variant: stepped62 stroke_width: 263 fill_opacity: 0.1264 gridlines: true65 bar_gap: 0px66 highlight: single67 dot_marker: false68fonts_url: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400&display=swap"69dependencies: ["lucide-react"]70---71 72# Warm Canvas73 74## AI Build Instructions75 76> **Read this section before writing any code.** The rules below77> are non-negotiable. Every value used in the UI must come from this78> file's frontmatter — never substitute, approximate, or invent new79> colors, fonts, radii, or shadows. If a value is missing, ask the80> user before adding one.81 82### 1 · Your role83 84You are building UI for a project that has adopted **Warm Canvas** as its85design system. Treat `DESIGN.md` as the single source of truth.86Your job is to translate the user's product requirements into87components and pages that look like they were designed by the same88person who authored this file.89 90### 2 · Token compliance91 92- Pull every color, font family, radius, shadow, and spacing value93 from the frontmatter at the top of this file.94- Use semantic roles (e.g. `primary`, `accent`, `muted`) — never95 hard-code hex values that bypass the system.96- When a token can be expressed as a CSS variable, declare it once97 in your global stylesheet and reference it everywhere downstream.98- The Google Fonts `<link>` is provided in the Typography section.99 Add it to `<head>` before any component renders.100 101### 3 · Component recipes102 103Use these recipes verbatim when building the corresponding component.104 105#### Buttons106 107Four variants are defined. Pick one — never blend variants or invent a fifth.108 109- **Primary** — rounded shape, bg `#2F2F2F`, text `#FFFFFF`, padding `8px 16px`, weight `500`.110- **Secondary** — rounded shape, bg `#F7F6F3`, text `#2F2F2F`, border `1px solid #E9E5DC`, padding `8px 16px`, weight `500`.111- **Outline** — rounded shape, text `#2F2F2F`, border `1px solid #2F2F2F`, padding `8px 16px`, weight `500`.112- **Ghost** — rounded shape, text `#787673`, padding `8px 12px`, weight `500`.113 114Reach for **primary** as the single dominant CTA per screen.115**Secondary** for the supporting action. **Outline** for tertiary116actions in toolbars. **Ghost** for inline links and table actions.117 118#### Cards119 120- Background: `#ffffff`121- Border: `1px solid rgba(0,0,0,0.1)`122- Shadow: `rgba(0,0,0,0.04) 0 4px 18px, rgba(0,0,0,0.027) 0 2.025px 7.85px, rgba(0,0,0,0.02) 0 0.8px 2.93px, rgba(0,0,0,0.01) 0 0.175px 1.04px`123- Radius: `radius.lg` (`12px`)124- Internal padding: `20px` for compact cards, `24–28px` for content cards.125 126#### Charts127 128- Bar/line variant: `stepped`129- Highlight strategy: `single` — emphasize a single bar/point per chart.130 131#### Typography pairings132 133- **Display (`Inter`)** — h1, h2, hero headlines, brand wordmarks.134- **Body (`Inter`)** — paragraphs, labels, button text, form inputs.135- **Mono (`JetBrains Mono`)** — code, eyebrows, metadata, numerals in tables.136 137### 4 · Hard constraints138 139Never do any of the following without explicit instruction from the user:140 141- Introduce a new color, font, radius, or shadow that isn't declared above.142- Mix this system with another (e.g. don't paste in Material or Bootstrap defaults).143- Use generic gradient defaults (purple→blue, peach→pink) — they break the system's voice.144- Reach for emoji icons. Use a consistent icon library and size icons in line with body type.145- Add motion that exceeds the system's restraint — keep transitions short (≤200ms) and subtle.146 147### 5 · Before you finish — verify148 149Run through this checklist for every screen you produce:150 151- [ ] Every color used appears in the Colors table above.152- [ ] Headlines use the display font; body copy uses the body font.153- [ ] Buttons match one of the declared variants exactly (shape, padding, weight).154- [ ] Border-radius values come from `radius.sm` / `radius.md` / `radius.lg` / `radius.pill`.155- [ ] Cards and dividers use the declared border + shadow tokens.156- [ ] No values were invented; if you needed something missing, you stopped and asked.157 158---159 160## 1. Atmosphere161 162Warm Canvas embodies the philosophy of a great workspace: a blank canvas that gets out of your way. The system is built on warm neutrals rather than cold grays — distinctly approachable minimalism that feels like quality paper rather than sterile glass. The page background is pure white (`#ffffff`) but the text isn't pure black — it sits at `rgba(0,0,0,0.95)`, softening the read imperceptibly. The warm gray scale (`#f6f5f4`, `#31302e`, `#615d59`, `#a39e98`) carries subtle yellow-brown undertones, giving the interface a tactile, almost analog warmth.163 164A modified geometric sans is the backbone of the system. At display sizes (64px) it uses aggressive negative letter-spacing (-2.125px), creating headlines that feel compressed and precise. The weight range is broader than typical: 400 for body, 500 for UI, 600 for semi-bold labels, 700 for display headings. OpenType features `"lnum"` and `"locl"` are enabled on larger text, adding sophistication that rewards close reading.165 166What makes Warm Canvas distinctive is its **border philosophy**. Rather than heavy borders or shadows, it uses ultra-thin `1px solid rgba(0,0,0,0.1)` — borders that exist as whispers, barely perceptible division lines that create structure without weight. The shadow system is equally restrained: multi-layer 4-stack with cumulative opacity never exceeding 0.05, depth that's felt rather than seen.167 168**Signature moves**169- Compressed sans at -2.125px tracking on 64px display170- Warm neutrals: yellow-brown undertones throughout (`#f6f5f4` warm white, `#31302e` warm dark)171- Near-black text via `rgba(0,0,0,0.95)` — micro-warmth172- Whisper borders: `1px solid rgba(0,0,0,0.1)` — barely there173- Multi-layer 4-stack shadows with sub-0.05 opacity174- Single saturated blue accent (`#0075de`) — the only color in core UI chrome175- Pill badges (9999px) with tinted blue background for status176 177## 2. Palette178 179### Primary180- **Near Black** `rgba(0,0,0,0.95)` — text, headings181- **Pure White** `#ffffff` — page, cards182- **Canvas Blue** `#0075de` — CTA, links, single saturated accent183 184### Warm Neutrals185- Warm White `#f6f5f4` — section alternation186- Warm Dark `#31302e` — dark surface187- Warm Gray 500 `#615d59` — secondary text188- Warm Gray 300 `#a39e98` — placeholders, disabled189 190### Semantic191- Teal `#2a9d99` — success192- Green `#1aae39` — completion193- Orange `#dd5b00` — warning194- Pink `#ff64c8` — decorative195 196### Interactive197- Active `#005bab` — pressed198- Focus `#097fe8` — ring199- Badge bg `#f2f9ff`, text `#097fe8`200 201## 3. Typography202 203| Role | Size | Weight | Leading | Tracking |204|------|------|--------|---------|----------|205| Display Hero | 64px | 700 | 1.00 | -2.125px |206| Display 2 | 54px | 700 | 1.04 | -1.875px |207| Section | 48px | 700 | 1.00 | -1.5px |208| Sub-heading L | 40px | 700 | 1.50 | normal |209| Sub-heading | 26px | 700 | 1.23 | -0.625px |210| Card title | 22px | 700 | 1.27 | -0.25px |211| Body L | 20px | 600 | 1.40 | -0.125px |212| Body | 16px | 400 | 1.50 | normal |213| Nav | 15px | 600 | 1.33 | normal |214| Badge | 12px | 600 | 1.33 | +0.125px |215 216**Four-weight system.** 400 (read), 500 (interact), 600 (emphasize), 700 (announce). Tracking compresses with size and relaxes at body. Badges are the only positive-tracking text.217 218## 4. Buttons219 220### Primary Blue221```css222background: #0075de;223color: #ffffff;224padding: 8px 16px;225border-radius: 4px;226```227Hover `#005bab`. Active scale(0.9).228 229### Secondary Translucent230- Background `rgba(0,0,0,0.05)`, text near-black231- 4px radius, scale(1.05) on hover232 233### Pill Badge234- Background `#f2f9ff`, text `#097fe8`235- 9999px radius, 4px 8px padding, 12px weight 600236 237## 5. Cards238 239- Background: `#ffffff`240- Border: `1px solid rgba(0,0,0,0.1)` (whisper)241- Radius: 12px standard, 16px featured242- Shadow: 4-layer stack, max opacity 0.04243 244## 6. Charts245 246**Stepped charts.** Bars are flush (no gap) with a thin top accent line, giving an organic, blocky productivity-tool feel. Gridlines are dashed at 14% opacity. Line charts use a 2px stroke with subtle 12% area fill — no end-dot.247 248## 7. Spacing249 250- Base: 8px251- Scale: `2, 3, 4, 5, 6, 7, 8, 11, 12, 14, 16, 24, 32`252- Section vertical: 64–120px253 254## 8. Depth & elevation255 256| Level | Treatment | Use |257|-------|-----------|-----|258| 0 | None | Page, text |259| 1 | Whisper border `1px solid rgba(0,0,0,0.1)` | Cards, dividers |260| 2 | 4-stack shadow (max 0.04) | Content cards |261| 3 | 5-stack shadow (max 0.05, 52px blur) | Modals, hero |262 263**Layered, ambient, embedded.** Multiple layers with extremely low individual opacity accumulate into soft natural-looking elevation — elements feel embedded in the page, not floating above it.264 265## 9. Do's & don'ts266 267✅ **Do**268- Use warm neutrals exclusively — yellow-brown undertones269- Compress display tracking to -2.125px at 64px270- Use whisper borders at `rgba(0,0,0,0.1)` — never heavier271- Layer 4–5 shadows with sub-0.05 individual opacity272- Reserve canvas blue (`#0075de`) for CTAs and links273 274❌ **Don't**275- Use blue-gray neutrals — kills the warmth276- Apply pill radius to cards — pill is for badges only277- Use heavy single shadows — multi-layer ambient only278- Introduce more saturated colors in core chrome279- Use bold (`#000000`) — `rgba(0,0,0,0.95)` only280 281---282 283## Tokens284 285> Generated from the same source the live preview renders from.286> Treat the values below as the contract — never substitute approximations.287 288### Colors289 290| Role | Value |291|-----------|-------|292| primary | `#000000` |293| secondary | `#615d59` |294| tertiary | `#0075de` |295| neutral | `#ffffff` |296| surface | `#ffffff` |297 298### Typography299 300- **Display:** Inter301- **Body:** Inter302- **Mono:** JetBrains Mono303 304| Role | size / leading / weight / tracking |305|------|------------------------------------|306| Hero | 4rem / 1 / 700 / -2.125px |307| H1 | 3rem / 1 / 700 / -1.5px |308| H2 | 1.625rem / 1.23 / 700 / -0.625px |309| Body | 1rem / 1.5 / 400 / 0 |310 311### Radius312 313- sm: `4px`314- md: `8px`315- lg: `12px`316- pill: `9999px`317 318### Shadows319 320- **card:** `rgba(0,0,0,0.04) 0 4px 18px, rgba(0,0,0,0.027) 0 2.025px 7.85px, rgba(0,0,0,0.02) 0 0.8px 2.93px, rgba(0,0,0,0.01) 0 0.175px 1.04px`321- **button:** `rgba(0,117,222,0.15) 0 4px 12px`322 323### Borders324 325- **card:** `1px solid rgba(0,0,0,0.1)`326- **divider:** `rgba(0,0,0,0.1)`327 328### Buttons329 330Four variants, each fully tokenized. The preview renders from these exact values.331 332#### Primary333 334| Property | Value |335|----------|-------|336| shape | `rounded` |337| background | `#2F2F2F` |338| color | `#FFFFFF` |339| border | `none` |340| padding | `8px 16px` |341| fontWeight | `500` |342| fontSize | `0.875rem` |343 344#### Secondary345 346| Property | Value |347|----------|-------|348| shape | `rounded` |349| background | `#F7F6F3` |350| color | `#2F2F2F` |351| border | `1px solid #E9E5DC` |352| padding | `8px 16px` |353| fontWeight | `500` |354| fontSize | `0.875rem` |355 356#### Outline357 358| Property | Value |359|----------|-------|360| shape | `rounded` |361| background | `transparent` |362| color | `#2F2F2F` |363| border | `1px solid #2F2F2F` |364| padding | `8px 16px` |365| fontWeight | `500` |366| fontSize | `0.875rem` |367 368#### Ghost369 370| Property | Value |371|----------|-------|372| shape | `rounded` |373| background | `transparent` |374| color | `#787673` |375| border | `none` |376| padding | `8px 12px` |377| fontWeight | `500` |378| fontSize | `0.875rem` |379 380### Charts381 382| Property | Value |383|----------|-------|384| variant | `stepped` |385| strokeWidth | `2` |386| fillOpacity | `0.12` |387| gridlines | `true` |388| barGap | `0px` |389| highlight | `single` |390| dotMarker | `false` |391 392---393 394## Pro tokens395 396> Production-fidelity tokens. States, density, motion, elevation,397> content rules and a measured WCAG contract — derived from the398> resting tokens unless explicitly authored.399 400### States401 402#### Button403 404- **hover** — shadow: `0 8px 24px -10px rgba(0, 117, 222, 0.35)`, transform: `translateY(-1px)`, filter: `brightness(1.02)`405- **focus** — outline: `2px solid rgba(0, 117, 222, 0.4)`, outline-offset: `3px`406- **active** — transform: `translateY(0) scale(0.98)`407- **disabled** — opacity: `0.4`, filter: `saturate(0.5)`408- **loading** — opacity: `0.65`409- **selected** — bg: `rgba(0, 117, 222, 0.18)`, color: `#0075de`410 411#### Input412 413- **hover** — bg: `rgba(0, 117, 222, 0.03)`, border: `1px solid rgba(0, 117, 222, 0.4)`414- **focus** — border: `1px solid rgba(0, 117, 222, 0.6)`, shadow: `0 0 0 4px rgba(0, 117, 222, 0.12)`415- **disabled** — opacity: `0.4`416- **error** — border: `1px solid rgba(244,114,182,0.7)`, shadow: `0 0 0 4px rgba(244,114,182,0.15)`417 418#### Card419 420- **hover** — shadow: `0 16px 40px -16px rgba(0, 117, 222, 0.3)`, transform: `translateY(-3px)`421- **selected** — bg: `rgba(0, 117, 222, 0.04)`, border: `1px solid rgba(0, 117, 222, 0.5)`422- **dragging** — transform: `scale(1.03) rotate(-0.8deg)`, opacity: `0.92`423 424#### Tab425 426- **hover** — bg: `rgba(0, 117, 222, 0.08)`, color: `#0075de`427- **focus** — outline: `2px solid rgba(0, 117, 222, 0.4)`, outline-offset: `2px`428- **selected** — bg: `rgba(0, 117, 222, 0.16)`, color: `#0075de`429 430### Density431 432| Mode | padding × | row × | body | radius × | Use for |433|------|-----------|-------|------|----------|---------|434| compact | 0.72 | 0.78 | 0.8125rem | 0.85 | Information-dense — tables, IDEs, dashboards |435| comfortable | 1 | 1 | 0.9375rem | — | Default — most product UI |436| spacious | 1.35 | 1.3 | 1rem | 1.15 | Editorial — marketing, long-form, settings |437 438### Motion439 440**Signature — Soft fade.** Long, gentle transitions with a symmetric easing curve. Motion is calming, never intrusive.441 442```css443transition: all 400ms cubic-bezier(0.45, 0.05, 0.55, 0.95);444```445 446| Token | Value |447|-------|-------|448| duration.instant | `120ms` |449| duration.fast | `240ms` |450| duration.base | `400ms` |451| duration.slow | `600ms` |452| easing.standard | `cubic-bezier(0.45, 0.05, 0.55, 0.95)` |453| easing.decelerate | `cubic-bezier(0.0, 0, 0.2, 1)` |454| easing.accelerate | `cubic-bezier(0.4, 0, 1, 1)` |455| easing.spring | `cubic-bezier(0.45, 1.4, 0.55, 1)` |456 457### Elevation458 459Five-level scale, system-specific recipe.460 461| Level | Shadow | Recipe |462|-------|--------|--------|463| level0 | `none` | Flat — the tone separates, not the shadow. |464| level1 | `0 2px 6px -2px rgba(0, 117, 222, 0.12)` | Soft tinted lift. |465| level2 | `0 8px 24px -10px rgba(0, 117, 222, 0.2)` | Floating card — pastel-tinted shadow. |466| level3 | `0 16px 48px -16px rgba(0, 117, 222, 0.28)` | Sheet — visible tinted glow. |467| level4 | `0 32px 80px -24px rgba(0, 117, 222, 0.4)` | Modal — tinted wash, scrim required. |468 469### Content470 471- **measure:** `64ch` (max line length for body prose)472- **paragraph spacing:** `1.35em`473- **list indent:** `1.5em`474- **list gap:** `0.6em`475- **link:** color `#0075de`, underline `hover`476- **blockquote:** border `2px solid rgba(0, 117, 222, 0.5)`, padding `0.9em 1.2em`477- **code:** background `rgba(0, 117, 222, 0.1)`, color `#000000`478 479### Accessibility (WCAG 2.1)480 481**Overall:** AA482 483| Pair | Ratio | Required | Grade | Suggested fix |484|------|-------|----------|-------|---------------|485| Body text on surface | 21:1 | AA | AAA | — |486| Body text on canvas | 21:1 | AA | AAA | — |487| Muted text on surface | 6.53:1 | AA | AA | — |488| Accent on surface | 4.57:1 | AA-Large | AA | — |489| Accent on canvas | 4.57:1 | AA-Large | AA | — |490 # CLAUDE.md Reference @DESIGN.md for all styling decisions. Apply tokens strictly — do not introduce colors, fonts, or radii outside the system. When in doubt, prefer the values declared in DESIGN.md frontmatter.<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400&display=swap" />npm install lucide-react// tailwind.config.jsexport default { theme: { extend: { fontFamily: { display: ['"Inter"', 'serif'], sans: ['"Inter"', 'sans-serif'], mono: ['"JetBrains Mono"', 'monospace'], }, colors: { primary: '#000000', secondary: '#615d59', accent: '#0075de', neutral: '#ffffff', surface: '#ffffff', }, borderRadius: { sm: '4px', md: '8px', lg: '12px', }, }, },};A design-studio identity built on asymmetric oversized typography. Cream surfaces, Fraunces at extreme display scale paired with Inter Tight for body, an inked black block reserved for the studio mark and the single primary CTA, and an italic serif accent line that breaks every layout. Built for design agencies, art-direction portfolios, and creative studios that lead with type instead of imagery.
Swiss-poster discipline at web scale. Inter Tight 900 headlines that fill the column, ink on bone, a visible 12-column grid as 1px hairlines, and a single vermillion accent that lives only on the underline of the active nav item. Built for design studios, agencies, and brands that earn authority through restraint.