Wabi-sabi calm. Warm stone and oat tones, asymmetric editorial layout, crimson hairline accent, classical serif lyrics. Slow, considered, quietly luxurious.
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: "Kinfolk Stone"3description: "Wabi-sabi calm. Warm stone and oat tones, asymmetric editorial layout, crimson hairline accent, classical serif lyrics. Slow, considered, quietly luxurious."4tags: [editorial, minimal, light, magazine]5colors:6 primary: "#2A2724"7 secondary: "#8C857B"8 tertiary: "#9B2C2C"9 neutral: "#F1ECE0"10 surface: "#FAF6EC"11typography:12 display: "Cormorant Garamond"13 body: "Source Serif 4"14 mono: "IBM Plex Mono"15 scale:16 hero: "5rem / 1.05 / 300 / -0.02em"17 h1: "3rem / 1.1 / 400 / -0.015em"18 h2: "1.5rem / 1.4 / 400 / 0"19 body: "1.0625rem / 1.7 / 400 / 0.005em"20radius:21 sm: 1px22 md: 2px23 lg: 3px24shadows:25borders:26 card: "1px solid rgba(140, 133, 123, 0.28)"27 divider: "rgba(140, 133, 123, 0.40)"28buttons:29 primary:30 background: #2A272431 color: #FAF6EC32 border: none33 shape: rounded34 padding: 13px 26px35 font: body / 400 / 0.9375rem / 0.04em36 secondary:37 background: #FAF6EC38 color: #9B2C2C39 border: 1px solid #9B2C2C40 shape: rounded41 padding: 13px 26px42 font: body / 400 / 0.9375rem / 0.04em43 outline:44 background: transparent45 color: #2A272446 border: 1px solid rgba(140, 133, 123, 0.45)47 shape: rounded48 padding: 13px 26px49 font: body / 400 / 0.9375rem / 0.04em50 ghost:51 background: transparent52 color: #9B2C2C53 border: none54 shape: rounded55 padding: 10px 4px56 font: display / 400 / 1.0625rem / 057 hover: underline58charts:59 variant: line60 stroke_width: 161 gridlines: false62 highlight: last63 dot_marker: true64 axis_color: "#8C857B"65 palette: ["#2A2724"]66fonts_url: "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,400&family=Source+Serif+4:opsz,wght@8..60,300;8..60,400;8..60,500&family=IBM+Plex+Mono:wght@400;500&display=swap"67dependencies: ["lucide-react"]68---69 70# Kinfolk Stone71 72## AI Build Instructions73 74> **Read this section before writing any code.** The rules below75> are non-negotiable. Every value used in the UI must come from this76> file's frontmatter — never substitute, approximate, or invent new77> colors, fonts, radii, or shadows. If a value is missing, ask the78> user before adding one.79 80### 1 · Your role81 82You are building UI for a project that has adopted **Kinfolk Stone** as its83design system. Treat `DESIGN.md` as the single source of truth.84Your job is to translate the user's product requirements into85components and pages that look like they were designed by the same86person who authored this file.87 88### 2 · Token compliance89 90- Pull every color, font family, radius, shadow, and spacing value91 from the frontmatter at the top of this file.92- Use semantic roles (e.g. `primary`, `accent`, `muted`) — never93 hard-code hex values that bypass the system.94- When a token can be expressed as a CSS variable, declare it once95 in your global stylesheet and reference it everywhere downstream.96- The Google Fonts `<link>` is provided in the Typography section.97 Add it to `<head>` before any component renders.98 99### 3 · Component recipes100 101Use these recipes verbatim when building the corresponding component.102 103#### Buttons104 105Four variants are defined. Pick one — never blend variants or invent a fifth.106 107- **Primary** — rounded shape, bg `#2A2724`, text `#FAF6EC`, padding `13px 26px`, weight `400`.108- **Secondary** — rounded shape, bg `#FAF6EC`, text `#9B2C2C`, border `1px solid #9B2C2C`, padding `13px 26px`, weight `400`.109- **Outline** — rounded shape, text `#2A2724`, border `1px solid rgba(140, 133, 123, 0.45)`, padding `13px 26px`, weight `400`.110- **Ghost** — rounded shape, text `#9B2C2C`, padding `10px 4px`, weight `400`.111 112Reach for **primary** as the single dominant CTA per screen.113**Secondary** for the supporting action. **Outline** for tertiary114actions in toolbars. **Ghost** for inline links and table actions.115 116#### Cards117 118- Background: `#FAF6EC`119- Border: `1px solid rgba(140, 133, 123, 0.28)`120- Radius: `radius.lg` (`3px`)121- Internal padding: `20px` for compact cards, `24–28px` for content cards.122 123#### Charts124 125- Bar/line variant: `line`126- No gridlines — let the bars/lines carry the data.127- Highlight strategy: `last` — emphasize a single bar/point per chart.128- Use the declared palette in order: `#2A2724`.129 130#### Typography pairings131 132- **Display (`Cormorant Garamond`)** — h1, h2, hero headlines, brand wordmarks.133- **Body (`Source Serif 4`)** — paragraphs, labels, button text, form inputs.134- **Mono (`IBM Plex Mono`)** — code, eyebrows, metadata, numerals in tables.135 136### 4 · Hard constraints137 138Never do any of the following without explicit instruction from the user:139 140- Introduce a new color, font, radius, or shadow that isn't declared above.141- Mix this system with another (e.g. don't paste in Material or Bootstrap defaults).142- Use generic gradient defaults (purple→blue, peach→pink) — they break the system's voice.143- Reach for emoji icons. Use a consistent icon library and size icons in line with body type.144- Add motion that exceeds the system's restraint — keep transitions short (≤200ms) and subtle.145 146### 5 · Before you finish — verify147 148Run through this checklist for every screen you produce:149 150- [ ] Every color used appears in the Colors table above.151- [ ] Headlines use the display font; body copy uses the body font.152- [ ] Buttons match one of the declared variants exactly (shape, padding, weight).153- [ ] Border-radius values come from `radius.sm` / `radius.md` / `radius.lg` / `radius.pill`.154- [ ] Cards and dividers use the declared border + shadow tokens.155- [ ] No values were invented; if you needed something missing, you stopped and asked.156 157---158 159## Overview160Kinfolk Stone is a system for slow reading. The page is **warm oat #F1ECE0**, the cards are **cream #FAF6EC**, and the ink is **stone #2A2724** — a deep brown-grey that has never met pure black. The accent is **crimson #9B2C2C**, used as a 1px hairline border or a single dot on a chart. Never as a fill, never as a CTA background.161 162Typography is editorial through and through: Cormorant Garamond for display (classical, light, generous), Source Serif 4 for body (slow, leaded at 1.7), IBM Plex Mono for footnotes. Buttons are nearly-square. Nothing rounds.163 164## Material165- **Page** is warm oat — slightly green-tinted so it reads as natural fibre, not bleached paper.166- **Cards** are a half-shade lighter (#FAF6EC), separated by a **1px sand hairline at 28%** — felt as a margin rule, never as a border.167- **No drop-shadows anywhere.** Depth in this system is achieved by paper colour alone.168 169## Typography170| Role | Font | Size | Weight | Leading | Tracking |171|------|------|------|--------|---------|----------|172| Hero | Cormorant Garamond | 5rem | 300 | 1.05 | -0.02em |173| H1 | Cormorant Garamond | 3rem | 400 | 1.10 | -0.015em |174| H2 | Source Serif 4 | 1.5rem | 400 | 1.40 | 0 |175| Body | Source Serif 4 | 1.0625rem | 400 | **1.70** | +0.005em |176| Caption | IBM Plex Mono | 0.8125rem | 400 | 1.55 | +0.06em |177 178The hero is **weight 300** — light is correct here. Body leading is **1.70**, non-negotiable.179 180## Color181- **Stone #2A2724** — primary ink. Warmer than black; sits gently on oat.182- **Sand #8C857B** — captions, dividers, axis labels. Always low-contrast.183- **Crimson #9B2C2C** — emphasis only. As a border, an underline, a dot. Never a fill larger than 4px².184- **Cream #FAF6EC** — card surface.185- **Oat #F1ECE0** — page.186 187## Buttons188Restraint is the entire idea.189 190- **Primary** — stone fill, cream text, **3px radius**, body serif at +4% tracking. The button is a sentence, not a billboard.191- **Secondary** — cream tile with **1px crimson hairline border**, crimson serif label. The editorial "read more."192- **Outline** — sand hairline at 45%, stone label. For tertiary calls and chrome.193- **Ghost** — display Cormorant *italic* in crimson, hover underline. The system's most expressive button.194 195All buttons sit on **3px radius**. We never round more.196 197## Layout198Asymmetry is encouraged: a 60/40 column split, a single hero pulled hard to the left margin, captions anchored 12% from the gutter. The white space is what the reader pays for.199 200## Charts & Data201A **single 1px stone line** over warm paper. **No gridlines.** A **single crimson dot** on the latest value — that is the only colour on the chart. Axis labels in sand.202 203## Do's and Don'ts204- ✅ Use weight 300 on display sizes. Lightness is part of the calm.205- ✅ Hold body leading at 1.70. Tightening it kills the slowness.206- ✅ Use crimson as ink, never as a fill larger than a dot or a border.207- ✅ Asymmetric columns. Centre everything and you have killed the magazine.208- ❌ No drop-shadows. Ever.209- ❌ No pure black. Ever. The system is warm; pure black is cold.210- ❌ No display serif on body — Cormorant is for hero/H1 only. Body is Source Serif.211- ❌ No pill buttons. 3px max.212 213---214 215## Tokens216 217> Generated from the same source the live preview renders from.218> Treat the values below as the contract — never substitute approximations.219 220### Colors221 222| Role | Value |223|-----------|-------|224| primary | `#2A2724` |225| secondary | `#8C857B` |226| tertiary | `#9B2C2C` |227| neutral | `#F1ECE0` |228| surface | `#FAF6EC` |229 230### Typography231 232- **Display:** Cormorant Garamond233- **Body:** Source Serif 4234- **Mono:** IBM Plex Mono235 236| Role | size / leading / weight / tracking |237|------|------------------------------------|238| Hero | 5rem / 1.05 / 300 / -0.02em |239| H1 | 3rem / 1.1 / 400 / -0.015em |240| H2 | 1.5rem / 1.4 / 400 / 0 |241| Body | 1.0625rem / 1.7 / 400 / 0.005em |242 243### Radius244 245- sm: `1px`246- md: `2px`247- lg: `3px`248 249### Shadows250 251 252### Borders253 254- **card:** `1px solid rgba(140, 133, 123, 0.28)`255- **divider:** `rgba(140, 133, 123, 0.40)`256 257### Buttons258 259Four variants, each fully tokenized. The preview renders from these exact values.260 261#### Primary262 263| Property | Value |264|----------|-------|265| shape | `rounded` |266| background | `#2A2724` |267| color | `#FAF6EC` |268| border | `none` |269| padding | `13px 26px` |270| fontFamily | `body` |271| fontWeight | `400` |272| fontSize | `0.9375rem` |273| tracking | `0.04em` |274 275#### Secondary276 277| Property | Value |278|----------|-------|279| shape | `rounded` |280| background | `#FAF6EC` |281| color | `#9B2C2C` |282| border | `1px solid #9B2C2C` |283| padding | `13px 26px` |284| fontFamily | `body` |285| fontWeight | `400` |286| fontSize | `0.9375rem` |287| tracking | `0.04em` |288 289#### Outline290 291| Property | Value |292|----------|-------|293| shape | `rounded` |294| background | `transparent` |295| color | `#2A2724` |296| border | `1px solid rgba(140, 133, 123, 0.45)` |297| padding | `13px 26px` |298| fontFamily | `body` |299| fontWeight | `400` |300| fontSize | `0.9375rem` |301| tracking | `0.04em` |302 303#### Ghost304 305| Property | Value |306|----------|-------|307| shape | `rounded` |308| background | `transparent` |309| color | `#9B2C2C` |310| border | `none` |311| padding | `10px 4px` |312| fontFamily | `display` |313| fontWeight | `400` |314| fontSize | `1.0625rem` |315| tracking | `0` |316| hoverHint | `underline` |317 318### Charts319 320| Property | Value |321|----------|-------|322| variant | `line` |323| strokeWidth | `1` |324| gridlines | `false` |325| highlight | `last` |326| dotMarker | `true` |327| axisColor | `#8C857B` |328| palette | `#2A2724` |329 330---331 332## Pro tokens333 334> Production-fidelity tokens. States, density, motion, elevation,335> content rules and a measured WCAG contract — derived from the336> resting tokens unless explicitly authored.337 338### States339 340#### Button341 342- **hover** — bg: `rgba(155, 44, 44, 0.92)`, shadow: `0 4px 20px -8px rgba(155, 44, 44, 0.4)`343- **focus** — outline: `1.5px solid #9B2C2C`, outline-offset: `4px`344- **active** — transform: `translateY(1px)`, filter: `brightness(0.95)`345- **disabled** — opacity: `0.45`346- **loading** — opacity: `0.7`347- **selected** — bg: `#2A2724`, color: `#FAF6EC`348 349#### Input350 351- **hover** — border: `1px solid #2A2724`352- **focus** — border: `1px solid #9B2C2C`, shadow: `0 1px 0 0 #9B2C2C`353- **disabled** — opacity: `0.45`354- **error** — border: `1px solid #991B1B`, shadow: `0 1px 0 0 #991B1B`355 356#### Card357 358- **hover** — shadow: `0 8px 24px -12px rgba(15,23,42,0.14)`, transform: `translateY(-1px)`359- **selected** — border: `1px solid #2A2724`360 361#### Tab362 363- **hover** — color: `#2A2724`364- **focus** — outline: `1.5px solid #9B2C2C`, outline-offset: `3px`365- **selected** — color: `#9B2C2C`, border: `0 0 2px 0 solid #9B2C2C`366 367### Density368 369| Mode | padding × | row × | body | radius × | Use for |370|------|-----------|-------|------|----------|---------|371| compact | 0.72 | 0.78 | 0.8125rem | 0.85 | Information-dense — tables, IDEs, dashboards |372| comfortable | 1 | 1 | 0.9375rem | — | Default — most product UI |373| spacious | 1.35 | 1.3 | 1rem | 1.15 | Editorial — marketing, long-form, settings |374 375### Motion376 377**Signature — Page turn.** Deliberate, measured motion — like turning a magazine page. Never jerky, never overdone.378 379```css380transition: all 320ms cubic-bezier(0.25, 0.46, 0.45, 0.94);381```382 383| Token | Value |384|-------|-------|385| duration.instant | `80ms` |386| duration.fast | `180ms` |387| duration.base | `320ms` |388| duration.slow | `500ms` |389| easing.standard | `cubic-bezier(0.25, 0.46, 0.45, 0.94)` |390| easing.decelerate | `cubic-bezier(0.0, 0, 0.2, 1)` |391| easing.accelerate | `cubic-bezier(0.4, 0, 1, 1)` |392| easing.spring | `cubic-bezier(0.5, 1.2, 0.6, 1)` |393 394### Elevation395 396Five-level scale, system-specific recipe.397 398| Level | Shadow | Recipe |399|-------|--------|--------|400| level0 | `none` | Hairline only — typical editorial resting state. |401| level1 | `0 1px 2px rgba(15,23,42,0.04)` | Barely visible — list rows, dividers. |402| level2 | `0 8px 24px -12px rgba(15,23,42,0.12)` | Pull-quote, sidebar — soft lift. |403| level3 | `0 16px 40px -16px rgba(15,23,42,0.18)` | Cover story card — clear lift. |404| level4 | `0 32px 80px -24px rgba(15,23,42,0.28)` | Modal — overlays the layout, with scrim. |405 406### Content407 408- **measure:** `60ch` (max line length for body prose)409- **paragraph spacing:** `1.5em`410- **list indent:** `1.75em`411- **list gap:** `0.55em`412- **link:** color `#9B2C2C`, underline `always`413- **blockquote:** border `4px solid #9B2C2C`, padding `0.4em 0 0.4em 1.5em`414- **code:** background `rgba(42, 39, 36, 0.06)`, color `#2A2724`415 416### Accessibility (WCAG 2.1)417 418**Overall:** AA-Large419 420| Pair | Ratio | Required | Grade | Suggested fix |421|------|-------|----------|-------|---------------|422| Body text on surface | 13.76:1 | AA | AAA | — |423| Body text on canvas | 12.6:1 | AA | AAA | — |424| Muted text on surface | 3.38:1 | AA | AA-Large | `#777067` → 4.53:1 (AA) |425| Accent on surface | 6.97:1 | AA-Large | AA | — |426| Accent on canvas | 6.38:1 | AA-Large | AA | — |427 # 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=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,400&family=Source+Serif+4:opsz,wght@8..60,300;8..60,400;8..60,500&family=IBM+Plex+Mono:wght@400;500&display=swap" />npm install lucide-react// tailwind.config.jsexport default { theme: { extend: { fontFamily: { display: ['"Cormorant Garamond"', 'serif'], sans: ['"Source Serif 4"', 'sans-serif'], mono: ['"IBM Plex Mono"', 'monospace'], }, colors: { primary: '#2A2724', secondary: '#8C857B', accent: '#9B2C2C', neutral: '#F1ECE0', surface: '#FAF6EC', }, borderRadius: { sm: '1px', md: '2px', lg: '3px', }, }, },};Travel magazine that happens to be an app. Single-family typography, coral-pink accent reserved for primary CTAs, generous photography and 14–20px image radius.
A two-color press operation: warm bone and persimmon, nothing else. Bricolage Grotesque for display at oversized scale, Newsreader for body, sharp 0px corners, every accent and every CTA in the same persimmon. Built for editorial sites, indie magazines, and brands that want one disciplined color move and zero decoration.