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 soft tonal gradient that stays in one hue. Quartz-pink shading down to bone-white across the page, Manrope for UI, Fraunces for display, graphite ink, a single muted plum accent reserved for the primary CTA and the active step indicator. Built for early-stage product pages, wellness brands, and onboarding flows that need warmth without sweetness.
Design-agency oversized grotesque. 8rem condensed display sans with -5% tracking — the type itself is the layout. Off-white canvas, one molten-orange accent, hairline grid, asymmetric columns. Hits hard the moment it loads.