Coding-vibe on warm paper. Mono everywhere — display, body, captions — with a single muted terracotta accent. Hairlines instead of shadows, strict 4px subgrid. Developer discipline without the dark canvas.
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: "Console Paper"3description: "Coding-vibe on warm paper. Mono everywhere — display, body, captions — with a single muted terracotta accent. Hairlines instead of shadows, strict 4px subgrid. Developer discipline without the dark canvas."4tags: [developer, minimal, light, paper, technical]5colors:6 primary: "#1F1A14"7 secondary: "#7A7468"8 tertiary: "#B8553A"9 neutral: "#F5F1E8"10 surface: "#FAF7F0"11typography:12 display: "IBM Plex Mono"13 body: "IBM Plex Mono"14 mono: "IBM Plex Mono"15 scale:16 hero: "3.5rem / 1.05 / 500 / -0.035em"17 h1: "2.125rem / 1.1 / 500 / -0.025em"18 h2: "1.25rem / 1.35 / 500 / -0.012em"19 body: "0.9375rem / 1.65 / 400 / -0.005em"20radius:21 sm: 0px22 md: 2px23 lg: 4px24shadows:25 card: "0 0 0 1px rgba(31, 26, 20, 0.08)"26 button: none27borders:28 card: "1px solid rgba(31, 26, 20, 0.08)"29 divider: "rgba(31, 26, 20, 0.08)"30buttons:31 primary:32 background: #FAF7F033 color: #B8553A34 border: 1.5px solid #B8553A35 shape: sharp36 padding: 11px 22px37 font: mono / 500 / 0.8125rem / 0.01em38 suffix: arrow39 secondary:40 background: #FAF7F041 color: #1F1A1442 border: 1.5px solid rgba(31, 26, 20, 0.20)43 shape: sharp44 padding: 11px 22px45 font: mono / 500 / 0.8125rem / 0.01em46 outline:47 background: transparent48 color: #7A746849 border: 1px dashed rgba(31, 26, 20, 0.25)50 shape: sharp51 padding: 10px 20px52 font: mono / 500 / 0.8125rem / 0.01em53 ghost:54 background: transparent55 color: #B8553A56 border: none57 shape: sharp58 padding: 10px 4px59 font: mono / 500 / 0.8125rem / 0.01em60 hover: underline61charts:62 variant: stepped63 stroke_width: 1.564 gridlines: true65 highlight: last66 dot_marker: true67 axis_color: "#7A7468"68 palette: ["#B8553A", "#7A7468", "#1F1A14"]69fonts_url: "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500;600&display=swap"70dependencies: ["lucide-react"]71---72 73# Console Paper74 75## AI Build Instructions76 77> **Read this section before writing any code.** The rules below78> are non-negotiable. Every value used in the UI must come from this79> file's frontmatter — never substitute, approximate, or invent new80> colors, fonts, radii, or shadows. If a value is missing, ask the81> user before adding one.82 83### 1 · Your role84 85You are building UI for a project that has adopted **Console Paper** as its86design system. Treat `DESIGN.md` as the single source of truth.87Your job is to translate the user's product requirements into88components and pages that look like they were designed by the same89person who authored this file.90 91### 2 · Token compliance92 93- Pull every color, font family, radius, shadow, and spacing value94 from the frontmatter at the top of this file.95- Use semantic roles (e.g. `primary`, `accent`, `muted`) — never96 hard-code hex values that bypass the system.97- When a token can be expressed as a CSS variable, declare it once98 in your global stylesheet and reference it everywhere downstream.99- The Google Fonts `<link>` is provided in the Typography section.100 Add it to `<head>` before any component renders.101 102### 3 · Component recipes103 104Use these recipes verbatim when building the corresponding component.105 106#### Buttons107 108Four variants are defined. Pick one — never blend variants or invent a fifth.109 110- **Primary** — sharp shape, bg `#FAF7F0`, text `#B8553A`, border `1.5px solid #B8553A`, padding `11px 22px`, weight `500`.111- **Secondary** — sharp shape, bg `#FAF7F0`, text `#1F1A14`, border `1.5px solid rgba(31, 26, 20, 0.20)`, padding `11px 22px`, weight `500`.112- **Outline** — sharp shape, text `#7A7468`, border `1px dashed rgba(31, 26, 20, 0.25)`, padding `10px 20px`, weight `500`.113- **Ghost** — sharp shape, text `#B8553A`, padding `10px 4px`, weight `500`.114 115Reach for **primary** as the single dominant CTA per screen.116**Secondary** for the supporting action. **Outline** for tertiary117actions in toolbars. **Ghost** for inline links and table actions.118 119#### Cards120 121- Background: `#FAF7F0`122- Border: `1px solid rgba(31, 26, 20, 0.08)`123- Shadow: `0 0 0 1px rgba(31, 26, 20, 0.08)`124- Radius: `radius.lg` (`4px`)125- Internal padding: `20px` for compact cards, `24–28px` for content cards.126 127#### Charts128 129- Bar/line variant: `stepped`130- Highlight strategy: `last` — emphasize a single bar/point per chart.131- Use the declared palette in order: `#B8553A`, `#7A7468`, `#1F1A14`.132 133#### Typography pairings134 135- **Display (`IBM Plex Mono`)** — h1, h2, hero headlines, brand wordmarks.136- **Body (`IBM Plex Mono`)** — paragraphs, labels, button text, form inputs.137- **Mono (`IBM Plex 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## Overview163Console Paper is the discipline of a developer console rendered on warm paper. Mono everywhere — display, body, captions — at carefully tuned sizes. A single muted terracotta accent for active states. Hairlines, no shadows. Strict 4px subgrid.164 165For documentation sites, technical blogs, indie dev tools, paper-feel developer products that want warmth without losing precision.166 167## The Conceit168The page reads as printed terminal output. The mono face does the heavy lifting — there is no second typeface anywhere. The terracotta hairline on the primary button is the closest the system gets to "color"; it stands in for the cursor.169 170```171┌─────────────────────────────┐172│ console.paper $ run │173│ │174│ Build precision into the │175│ paper, not the screen. │176└─────────────────────────────┘177```178 179## Color180- **Coffee Ink #1F1A14** — primary text.181- **Graphite #7A7468** — secondary text, captions.182- **Terracotta #B8553A** — the only chromatic accent. Primary CTA hairline, active links, the chart line.183- **Warm Paper #F5F1E8** — page canvas.184- **Cream Card #FAF7F0** — card surface.185 186The terracotta must remain rare — apply it to one element per region.187 188## Typography189- **Display: IBM Plex Mono 500** at 3.5rem with -3.5% tracking.190- **Body: IBM Plex Mono 400** at 0.9375rem with 1.65 leading.191- Mono is the entire system. No sans, no serif anywhere.192 193| Role | Font | Size | Weight | Tracking |194|------|------|------|--------|----------|195| Hero | IBM Plex Mono | 3.5rem | 500 | -0.035em |196| H1 | IBM Plex Mono | 2.125rem | 500 | -0.025em |197| H2 | IBM Plex Mono | 1.25rem | 500 | -0.012em |198| Body | IBM Plex Mono | 0.9375rem | 400 | -0.005em / 1.65 |199 200## Geometry201- **Radii: 0 / 2 / 4.** Almost-sharp. Mono on paper looks crafted at small radii.202- **Borders: 1px hairlines** at 8% coffee-ink. Replace shadows with hairlines.203- **Spacing: strict 4px subgrid.** 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64.204 205## Buttons206- **Primary** — cream paper surface, 1.5px terracotta hairline, terracotta mono label. Reads as a command in a prompt.207- **Secondary** — cream paper, 1.5px coffee-ink hairline (20%).208- **Outline** — bare 1px dashed hairline.209- **Ghost** — bare terracotta label, hover underline.210 211All four use the mono face for labels at 0.8125rem with +1% tracking.212 213## Cards214Cream surface (#FAF7F0) over warm paper canvas, 1px coffee-ink hairline at 8%, no shadow. Radius 4px. Cards never lift; depth is communicated by the hairline alone.215 216## Charts & Data217Stepped terracotta line over the cream card, 1.5px stroke, faint graphite gridlines. End-of-line terracotta dot. The chart should read like ASCII output, not a marketing graphic.218 219## Do's and Don'ts220- ✅ Mono everywhere — display, body, captions, buttons. No exceptions.221- ✅ Terracotta appears once per region — primary CTA, active link, chart line.222- ✅ All structure is hairlines. Replace every shadow you'd reach for with a 1px line.223- ✅ Stick to the 4px subgrid. Off-grid spacing reads as careless.224- ❌ No sans or serif type. The system is mono-only.225- ❌ No drop shadows. No gradients. No glass.226- ❌ No second chromatic accent. Mono + terracotta, period.227- ❌ No radii above 4px. Mono on paper at large radii reads soft and loses the "console" voice.228 229---230 231## Tokens232 233> Generated from the same source the live preview renders from.234> Treat the values below as the contract — never substitute approximations.235 236### Colors237 238| Role | Value |239|-----------|-------|240| primary | `#1F1A14` |241| secondary | `#7A7468` |242| tertiary | `#B8553A` |243| neutral | `#F5F1E8` |244| surface | `#FAF7F0` |245 246### Typography247 248- **Display:** IBM Plex Mono249- **Body:** IBM Plex Mono250- **Mono:** IBM Plex Mono251 252| Role | size / leading / weight / tracking |253|------|------------------------------------|254| Hero | 3.5rem / 1.05 / 500 / -0.035em |255| H1 | 2.125rem / 1.1 / 500 / -0.025em |256| H2 | 1.25rem / 1.35 / 500 / -0.012em |257| Body | 0.9375rem / 1.65 / 400 / -0.005em |258 259### Radius260 261- sm: `0px`262- md: `2px`263- lg: `4px`264 265### Shadows266 267- **card:** `0 0 0 1px rgba(31, 26, 20, 0.08)`268- **button:** `none`269 270### Borders271 272- **card:** `1px solid rgba(31, 26, 20, 0.08)`273- **divider:** `rgba(31, 26, 20, 0.08)`274 275### Buttons276 277Four variants, each fully tokenized. The preview renders from these exact values.278 279#### Primary280 281| Property | Value |282|----------|-------|283| shape | `sharp` |284| background | `#FAF7F0` |285| color | `#B8553A` |286| border | `1.5px solid #B8553A` |287| padding | `11px 22px` |288| fontFamily | `mono` |289| fontWeight | `500` |290| fontSize | `0.8125rem` |291| tracking | `0.01em` |292| suffix | `arrow` |293 294#### Secondary295 296| Property | Value |297|----------|-------|298| shape | `sharp` |299| background | `#FAF7F0` |300| color | `#1F1A14` |301| border | `1.5px solid rgba(31, 26, 20, 0.20)` |302| padding | `11px 22px` |303| fontFamily | `mono` |304| fontWeight | `500` |305| fontSize | `0.8125rem` |306| tracking | `0.01em` |307 308#### Outline309 310| Property | Value |311|----------|-------|312| shape | `sharp` |313| background | `transparent` |314| color | `#7A7468` |315| border | `1px dashed rgba(31, 26, 20, 0.25)` |316| padding | `10px 20px` |317| fontFamily | `mono` |318| fontWeight | `500` |319| fontSize | `0.8125rem` |320| tracking | `0.01em` |321 322#### Ghost323 324| Property | Value |325|----------|-------|326| shape | `sharp` |327| background | `transparent` |328| color | `#B8553A` |329| border | `none` |330| padding | `10px 4px` |331| fontFamily | `mono` |332| fontWeight | `500` |333| fontSize | `0.8125rem` |334| tracking | `0.01em` |335| hoverHint | `underline` |336 337### Charts338 339| Property | Value |340|----------|-------|341| variant | `stepped` |342| strokeWidth | `1.5` |343| gridlines | `true` |344| highlight | `last` |345| dotMarker | `true` |346| axisColor | `#7A7468` |347| palette | `#B8553A`, `#7A7468`, `#1F1A14` |348 349---350 351## Pro tokens352 353> Production-fidelity tokens. States, density, motion, elevation,354> content rules and a measured WCAG contract — derived from the355> resting tokens unless explicitly authored.356 357### States358 359#### Button360 361- **hover** — bg: `rgba(184, 85, 58, 0.15)`, color: `#B8553A`, border: `1px solid #B8553A`362- **focus** — outline: `1px dashed #B8553A`, outline-offset: `2px`363- **active** — bg: `#B8553A`, color: `#FAF7F0`364- **disabled** — opacity: `0.35`365- **loading** — opacity: `0.6`366- **selected** — bg: `#B8553A`, color: `#FAF7F0`367 368#### Input369 370- **hover** — border: `1px solid rgba(184, 85, 58, 0.5)`371- **focus** — bg: `rgba(184, 85, 58, 0.05)`, border: `1px solid #B8553A`372- **disabled** — opacity: `0.35`373- **error** — bg: `rgba(239,68,68,0.05)`, border: `1px solid #EF4444`374 375#### Card376 377- **hover** — border: `1px solid #B8553A`378- **selected** — bg: `rgba(184, 85, 58, 0.05)`, border: `1px solid #B8553A`379- **dragging** — opacity: `0.7`380 381#### Tab382 383- **hover** — color: `#B8553A`384- **focus** — outline: `1px dashed #B8553A`, outline-offset: `1px`385- **selected** — bg: `rgba(184, 85, 58, 0.1)`, color: `#B8553A`386 387### Density388 389| Mode | padding × | row × | body | radius × | Use for |390|------|-----------|-------|------|----------|---------|391| compact | 0.72 | 0.78 | 0.8125rem | 0.85 | Information-dense — tables, IDEs, dashboards |392| comfortable | 1 | 1 | 0.9375rem | — | Default — most product UI |393| spacious | 1.35 | 1.3 | 1rem | 1.15 | Editorial — marketing, long-form, settings |394 395### Motion396 397**Signature — Cursor blink.** Discrete, often stepped transitions. Like a terminal cursor: on or off. Response under 120 ms.398 399```css400transition: all 120ms linear;401```402 403| Token | Value |404|-------|-------|405| duration.instant | `0ms` |406| duration.fast | `60ms` |407| duration.base | `120ms` |408| duration.slow | `200ms` |409| easing.standard | `linear` |410| easing.decelerate | `linear` |411| easing.accelerate | `linear` |412| easing.spring | `steps(2, end)` |413 414### Elevation415 416Five-level scale, system-specific recipe.417 418| Level | Shadow | Recipe |419|-------|--------|--------|420| level0 | `none` | Flat — the stroke carries the hierarchy. |421| level1 | `none` | Border tone lifts the surface. |422| level2 | `0 0 0 1px rgba(184, 85, 58, 0.5)` | Ring outline — popover. |423| level3 | `0 0 0 1px #B8553A, 0 12px 32px -16px rgba(184, 85, 58, 0.4)` | Sheet with accent ring + glow. |424| level4 | `0 0 0 1px #B8553A, 0 24px 64px -20px rgba(184, 85, 58, 0.5)` | Modal with accent ring + glow. |425 426### Content427 428- **measure:** `78ch` (max line length for body prose)429- **paragraph spacing:** `1em`430- **list indent:** `1.25em`431- **list gap:** `0.35em`432- **link:** color `#B8553A`, underline `always`433- **blockquote:** border `1px solid rgba(184, 85, 58, 0.5)`, padding `0.7em 1em`434- **code:** background `rgba(184, 85, 58, 0.12)`, color `#B8553A`435 436### Accessibility (WCAG 2.1)437 438**Overall:** AA-Large439 440| Pair | Ratio | Required | Grade | Suggested fix |441|------|-------|----------|-------|---------------|442| Body text on surface | 16.14:1 | AA | AAA | — |443| Body text on canvas | 15.32:1 | AA | AAA | — |444| Muted text on surface | 4.34:1 | AA | AA-Large | `#746f63` → 4.68:1 (AA) |445| Accent on surface | 4.46:1 | AA-Large | AA-Large | — |446| Accent on canvas | 4.24:1 | AA-Large | AA-Large | — |447 # 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=IBM+Plex+Mono:wght@300;400;500;600&display=swap" />npm install lucide-react// tailwind.config.jsexport default { theme: { extend: { fontFamily: { display: ['"IBM Plex Mono"', 'serif'], sans: ['"IBM Plex Mono"', 'sans-serif'], mono: ['"IBM Plex Mono"', 'monospace'], }, colors: { primary: '#1F1A14', secondary: '#7A7468', accent: '#B8553A', neutral: '#F5F1E8', surface: '#FAF7F0', }, borderRadius: { sm: '0px', md: '2px', lg: '4px', }, }, },};A printed quarterly that happens to live on the web. Soft blush-bone surfaces, Fraunces 600 italic display headlines, Geist Mono for marginalia, a single deep plum accent on drop caps and pull-quote bars. Built for journals, newsletters, and slow-content brands that want warmth without preciousness.
Pressed-herbarium editorial — deep forest ink and oxidized terracotta on bone paper. Italic Cormorant display, generous leading, hairline rules, and a single warm spot color used like a botanist's annotation stamp.