Warm vellum paper canvas, humanist sans at quiet sizes, refined 6px corners, no shadows — only a faint warm hairline. One deep moss accent. Calibrated to feel like a well-set page in a notebook.
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: "Vellum Quiet"3description: "Warm vellum paper canvas, humanist sans at quiet sizes, refined 6px corners, no shadows — only a faint warm hairline. One deep moss accent. Calibrated to feel like a well-set page in a notebook."4tags: [minimal, paper, warm, premium, writing]5colors:6 primary: "#1F1B14"7 secondary: "#7A7264"8 tertiary: "#A89F90"9 neutral: "#F4EEDF"10 surface: "#FBF7EB"11typography:12 display: "Inter Tight"13 body: Inter14 mono: "JetBrains Mono"15 scale:16 hero: "4rem / 1.08 / 500 / -0.03em"17 h1: "2.375rem / 1.12 / 500 / -0.025em"18 h2: "1.375rem / 1.35 / 500 / -0.012em"19 body: "1.0625rem / 1.7 / 400 / -0.003em"20radius:21 sm: 4px22 md: 6px23 lg: 8px24shadows:25 card: "0 0 0 1px rgba(31, 27, 20, 0.08)"26 button: none27borders:28 card: "1px solid rgba(31, 27, 20, 0.08)"29 divider: "rgba(31, 27, 20, 0.12)"30buttons:31 primary:32 background: #3E5A3A33 color: #FBF7EB34 border: 1px solid #3E5A3A35 shape: rounded36 padding: 12px 22px37 font: 500 / 0.9375rem / -0.005em38 secondary:39 background: #FBF7EB40 color: #1F1B1441 border: 1px solid rgba(31, 27, 20, 0.16)42 shape: rounded43 padding: 12px 22px44 font: 500 / 0.9375rem / -0.005em45 outline:46 background: transparent47 color: #1F1B1448 border: 1px solid rgba(31, 27, 20, 0.20)49 shape: rounded50 padding: 11px 21px51 font: 500 / 0.9375rem / -0.005em52 ghost:53 background: transparent54 color: #7A726455 border: none56 shape: rounded57 padding: 11px 4px58 font: 500 / 0.9375rem / -0.005em59 hover: underline60charts:61 variant: line62 stroke_width: 1.563 gridlines: false64 highlight: last65 dot_marker: true66 axis_color: "#7A7264"67 palette: ["#3E5A3A"]68fonts_url: "https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;600&family=Inter:wght@400;500&family=JetBrains+Mono:wght@400&display=swap"69dependencies: ["lucide-react"]70---71 72# Vellum Quiet73 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 **Vellum Quiet** 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 `#3E5A3A`, text `#FBF7EB`, border `1px solid #3E5A3A`, padding `12px 22px`, weight `500`.110- **Secondary** — rounded shape, bg `#FBF7EB`, text `#1F1B14`, border `1px solid rgba(31, 27, 20, 0.16)`, padding `12px 22px`, weight `500`.111- **Outline** — rounded shape, text `#1F1B14`, border `1px solid rgba(31, 27, 20, 0.20)`, padding `11px 21px`, weight `500`.112- **Ghost** — rounded shape, text `#7A7264`, padding `11px 4px`, 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: `#FBF7EB`121- Border: `1px solid rgba(31, 27, 20, 0.08)`122- Shadow: `0 0 0 1px rgba(31, 27, 20, 0.08)`123- Radius: `radius.lg` (`8px`)124- Internal padding: `20px` for compact cards, `24–28px` for content cards.125 126#### Charts127 128- Bar/line variant: `line`129- No gridlines — let the bars/lines carry the data.130- Highlight strategy: `last` — emphasize a single bar/point per chart.131- Use the declared palette in order: `#3E5A3A`.132 133#### Typography pairings134 135- **Display (`Inter Tight`)** — h1, h2, hero headlines, brand wordmarks.136- **Body (`Inter`)** — paragraphs, labels, button text, form inputs.137- **Mono (`JetBrains Mono`)** — code, eyebrows, metadata, numerals in tables.138 139### 4 · Hard constraints140 141Never do any of the following without explicit instruction from the user:142 143- Introduce a new color, font, radius, or shadow that isn't declared above.144- Mix this system with another (e.g. don't paste in Material or Bootstrap defaults).145- Use generic gradient defaults (purple→blue, peach→pink) — they break the system's voice.146- Reach for emoji icons. Use a consistent icon library and size icons in line with body type.147- Add motion that exceeds the system's restraint — keep transitions short (≤200ms) and subtle.148 149### 5 · Before you finish — verify150 151Run through this checklist for every screen you produce:152 153- [ ] Every color used appears in the Colors table above.154- [ ] Headlines use the display font; body copy uses the body font.155- [ ] Buttons match one of the declared variants exactly (shape, padding, weight).156- [ ] Border-radius values come from `radius.sm` / `radius.md` / `radius.lg` / `radius.pill`.157- [ ] Cards and dividers use the declared border + shadow tokens.158- [ ] No values were invented; if you needed something missing, you stopped and asked.159 160---161 162## Overview163Vellum Quiet is calibrated to feel like a well-set page in a notebook. The canvas is warm vellum (distinctly not-white). Type is one humanist sans (Inter Tight) used at refined, restrained sizes — the hero stops at 4rem rather than pushing to 7-8rem. There are no shadows; depth comes from a single warm hairline. One deep moss-green accent does the entire chromatic work.164 165For writing apps, indie publishers, slow-content platforms, knowledge tools, anything that should feel considered and quiet rather than clamoring for attention.166 167## Color168- **Ink #1F1B14** — primary text. Deep ink with a warm bias so it sits on vellum naturally.169- **Warm graphite #7A7264** — secondary text.170- **Soft graphite #A89F90** — captions, axis labels.171- **Vellum #F4EEDF** — page canvas. Warm paper, distinctly not-white.172- **Surface #FBF7EB** — card surface, a notch lighter and warmer than canvas.173- **Moss #3E5A3A** — the only chromatic accent. Primary CTA, links, chart line.174 175The accent is a deep, slightly desaturated moss — not bright, not olive. It sits in the warm-paper world without breaking it.176 177## Typography178**Inter Tight for display, Inter for body.** Same family lineage, different optical sizes.179 180| Role | Font | Size | Weight | Tracking |181|------|------|------|--------|----------|182| Hero | Inter Tight | 4rem | 500 | -0.03em |183| H1 | Inter Tight | 2.375rem | 500 | -0.025em |184| H2 | Inter Tight | 1.375rem | 500 | -0.012em |185| Body | Inter | 1.0625rem | 400 | -0.003em / 1.7 |186 187The whole system runs at weight 500 for display — never 600 or 700. The restraint is the brand.188 189## Geometry190- **Radii: 4 / 6 / 8.** Refined, neither sharp nor soft.191- **No shadows.** A 1px ink hairline at 8% opacity is the only depth signal.192- **Section gap: 112px** desktop, 72px mobile.193- **12-column grid** with 24px gutters.194 195## Buttons196- **Primary** — solid moss green, vellum label.197- **Secondary** — surface vellum, ink label, warm hairline at 16% opacity.198- **Outline** — bare hairline at 20% opacity.199- **Ghost** — bare warm-graphite label, hover underline.200 201All buttons sit at 12px / 22px padding with 6px corners. The button is small and considered — never a CTA shouting for clicks.202 203## Cards204Surface vellum on canvas, 1px ink hairline at 8% opacity, 6px corners, **no shadow**. Padding 28-32px. The card depth comes from the hairline alone.205 206## Charts & Data207Single moss-green line at 1.5px stroke, no gridlines, end-of-line dot marker. Axis labels in soft graphite at 11px Inter. The chart reads as a notation, not a marketing graphic.208 209## Do's and Don'ts210- ✅ Vellum canvas, never pure white. The warmth is the system.211- ✅ Hero stops at 4rem. The system never shouts.212- ✅ Display weight 500, never higher.213- ✅ One chromatic accent — moss. Used sparingly.214- ❌ No drop shadows. Hairline is the only depth.215- ❌ No second chromatic accent. Moss stands alone.216- ❌ No oversized type. The whole identity rests on restraint.217- ❌ No pill buttons. Refined 6px corners only.218 219---220 221## Tokens222 223> Generated from the same source the live preview renders from.224> Treat the values below as the contract — never substitute approximations.225 226### Colors227 228| Role | Value |229|-----------|-------|230| primary | `#1F1B14` |231| secondary | `#7A7264` |232| tertiary | `#A89F90` |233| neutral | `#F4EEDF` |234| surface | `#FBF7EB` |235 236### Typography237 238- **Display:** Inter Tight239- **Body:** Inter240- **Mono:** JetBrains Mono241 242| Role | size / leading / weight / tracking |243|------|------------------------------------|244| Hero | 4rem / 1.08 / 500 / -0.03em |245| H1 | 2.375rem / 1.12 / 500 / -0.025em |246| H2 | 1.375rem / 1.35 / 500 / -0.012em |247| Body | 1.0625rem / 1.7 / 400 / -0.003em |248 249### Radius250 251- sm: `4px`252- md: `6px`253- lg: `8px`254 255### Shadows256 257- **card:** `0 0 0 1px rgba(31, 27, 20, 0.08)`258- **button:** `none`259 260### Borders261 262- **card:** `1px solid rgba(31, 27, 20, 0.08)`263- **divider:** `rgba(31, 27, 20, 0.12)`264 265### Buttons266 267Four variants, each fully tokenized. The preview renders from these exact values.268 269#### Primary270 271| Property | Value |272|----------|-------|273| shape | `rounded` |274| background | `#3E5A3A` |275| color | `#FBF7EB` |276| border | `1px solid #3E5A3A` |277| padding | `12px 22px` |278| fontWeight | `500` |279| fontSize | `0.9375rem` |280| tracking | `-0.005em` |281 282#### Secondary283 284| Property | Value |285|----------|-------|286| shape | `rounded` |287| background | `#FBF7EB` |288| color | `#1F1B14` |289| border | `1px solid rgba(31, 27, 20, 0.16)` |290| padding | `12px 22px` |291| fontWeight | `500` |292| fontSize | `0.9375rem` |293| tracking | `-0.005em` |294 295#### Outline296 297| Property | Value |298|----------|-------|299| shape | `rounded` |300| background | `transparent` |301| color | `#1F1B14` |302| border | `1px solid rgba(31, 27, 20, 0.20)` |303| padding | `11px 21px` |304| fontWeight | `500` |305| fontSize | `0.9375rem` |306| tracking | `-0.005em` |307 308#### Ghost309 310| Property | Value |311|----------|-------|312| shape | `rounded` |313| background | `transparent` |314| color | `#7A7264` |315| border | `none` |316| padding | `11px 4px` |317| fontWeight | `500` |318| fontSize | `0.9375rem` |319| tracking | `-0.005em` |320| hoverHint | `underline` |321 322### Charts323 324| Property | Value |325|----------|-------|326| variant | `line` |327| strokeWidth | `1.5` |328| gridlines | `false` |329| highlight | `last` |330| dotMarker | `true` |331| axisColor | `#7A7264` |332| palette | `#3E5A3A` |333 334---335 336## Pro tokens337 338> Production-fidelity tokens. States, density, motion, elevation,339> content rules and a measured WCAG contract — derived from the340> resting tokens unless explicitly authored.341 342### States343 344#### Button345 346- **hover** — shadow: `0 4px 12px -2px rgba(15,23,42,0.18)`, filter: `brightness(0.97)`347- **focus** — outline: `2px solid rgba(168, 159, 144, 0.5)`, outline-offset: `2px`348- **active** — shadow: `0 1px 2px rgba(15,23,42,0.1)`, transform: `scale(0.98)`349- **disabled** — opacity: `0.4`, filter: `saturate(0.5)`350- **loading** — opacity: `0.7`351- **selected** — bg: `#A89F90`, color: `#FBF7EB`352 353#### Input354 355- **hover** — border: `1px solid rgba(168, 159, 144, 0.5)`356- **focus** — border: `1.5px solid #A89F90`, shadow: `0 0 0 4px rgba(168, 159, 144, 0.15)`357- **disabled** — bg: `rgba(31, 27, 20, 0.04)`, opacity: `0.4`358- **error** — border: `1.5px solid #DC2626`, shadow: `0 0 0 4px rgba(220,38,38,0.15)`359 360#### Card361 362- **hover** — shadow: `0 12px 28px -12px rgba(15,23,42,0.18)`, transform: `translateY(-2px)`363- **selected** — bg: `rgba(168, 159, 144, 0.04)`, border: `1.5px solid #A89F90`364- **dragging** — shadow: `0 20px 48px -16px rgba(15,23,42,0.3)`, transform: `scale(1.02) rotate(-0.5deg)`, opacity: `0.9`365 366#### Tab367 368- **hover** — bg: `rgba(168, 159, 144, 0.06)`, color: `#A89F90`369- **focus** — outline: `2px solid rgba(168, 159, 144, 0.5)`, outline-offset: `2px`370- **selected** — color: `#A89F90`, border: `0 0 2px 0 solid #A89F90`371 372### Density373 374| Mode | padding × | row × | body | radius × | Use for |375|------|-----------|-------|------|----------|---------|376| compact | 0.72 | 0.78 | 0.8125rem | 0.85 | Information-dense — tables, IDEs, dashboards |377| comfortable | 1 | 1 | 0.9375rem | — | Default — most product UI |378| spacious | 1.35 | 1.3 | 1rem | 1.15 | Editorial — marketing, long-form, settings |379 380### Motion381 382**Signature — Quiet ease.** 240 ms ease-out for all standard transitions. Reliable, invisible — motion stays out of the way.383 384```css385transition: all 240ms cubic-bezier(0.4, 0, 0.2, 1);386```387 388| Token | Value |389|-------|-------|390| duration.instant | `80ms` |391| duration.fast | `160ms` |392| duration.base | `240ms` |393| duration.slow | `380ms` |394| easing.standard | `cubic-bezier(0.4, 0, 0.2, 1)` |395| easing.decelerate | `cubic-bezier(0.0, 0, 0.2, 1)` |396| easing.accelerate | `cubic-bezier(0.4, 0, 1, 1)` |397| easing.spring | `cubic-bezier(0.34, 1.4, 0.64, 1)` |398 399### Elevation400 401Five-level scale, system-specific recipe.402 403| Level | Shadow | Recipe |404|-------|--------|--------|405| level0 | `none` | Flat — hairline border separates. |406| level1 | `0 1px 2px rgba(15,23,42,0.06), 0 1px 3px rgba(15,23,42,0.04)` | List rows, resting cards. |407| level2 | `0 4px 12px -2px rgba(15,23,42,0.1), 0 2px 6px rgba(15,23,42,0.06)` | Hover cards, popover. |408| level3 | `0 12px 32px -8px rgba(15,23,42,0.16), 0 4px 12px rgba(15,23,42,0.08)` | Sheets, side panels. |409| level4 | `0 28px 64px -16px rgba(15,23,42,0.28), 0 8px 24px rgba(15,23,42,0.12)` | Modals — scrim required. |410 411### Content412 413- **measure:** `68ch` (max line length for body prose)414- **paragraph spacing:** `1.2em`415- **list indent:** `1.5em`416- **list gap:** `0.5em`417- **link:** color `#A89F90`, underline `hover`418- **blockquote:** border `3px solid rgba(168, 159, 144, 0.6)`, padding `0.5em 0 0.5em 1.25em`419- **code:** background `rgba(31, 27, 20, 0.06)`, color `#1F1B14`420 421### Accessibility (WCAG 2.1)422 423**Overall:** FAIL424 425| Pair | Ratio | Required | Grade | Suggested fix |426|------|-------|----------|-------|---------------|427| Body text on surface | 16:1 | AA | AAA | — |428| Body text on canvas | 14.81:1 | AA | AAA | — |429| Muted text on surface | 4.44:1 | AA | AA-Large | `#746d5f` → 4.79:1 (AA) |430| Accent on surface | 2.44:1 | AA-Large | FAIL | `#766c5c` → 4.82:1 (AA) |431| Accent on canvas | 2.26:1 | AA-Large | FAIL | `#706758` → 4.81:1 (AA) |432 # 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+Tight:wght@400;500;600&family=Inter:wght@400;500&family=JetBrains+Mono:wght@400&display=swap" />npm install lucide-react// tailwind.config.jsexport default { theme: { extend: { fontFamily: { display: ['"Inter Tight"', 'serif'], sans: ['"Inter"', 'sans-serif'], mono: ['"JetBrains Mono"', 'monospace'], }, colors: { primary: '#1F1B14', secondary: '#7A7264', accent: '#A89F90', neutral: '#F4EEDF', surface: '#FBF7EB', }, borderRadius: { sm: '4px', md: '6px', lg: '8px', }, }, },};Developer infrastructure made invisible. Geist with -2.4px tracking, shadow-as-border philosophy, multi-layer shadow stacks, ligatures everywhere.
Radical 2-color duotone. Deep ink-blue and acid citron, with no third hue. Every surface is one of the two colors or a tint thereof — the constraint is the personality.