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.
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: "Ink & Citron"3description: "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."4tags: [bold, duotone, agency, modern, editorial]5colors:6 primary: "#0E1B3D"7 secondary: "#3A4566"8 tertiary: "#E6FF55"9 neutral: "#F2F3F8"10 surface: "#FFFFFF"11typography:12 display: "Space Grotesk"13 body: Inter14 mono: "Space Mono"15 scale:16 hero: "6rem / 0.95 / 700 / -0.045em"17 h1: "3.5rem / 1 / 700 / -0.04em"18 h2: "1.75rem / 1.2 / 600 / -0.02em"19 body: "1rem / 1.55 / 400 / -0.005em"20radius:21 sm: 0px22 md: 2px23 lg: 4px24shadows:25 card: "4px 4px 0 0 #0E1B3D"26 button: "3px 3px 0 0 #0E1B3D"27borders:28 card: "1.5px solid #0E1B3D"29 divider: "#0E1B3D"30buttons:31 primary:32 background: #E6FF5533 color: #0E1B3D34 border: 1.5px solid #0E1B3D35 shape: sharp36 padding: 13px 26px37 font: display / 700 / 0.9375rem / -0.01em38 shadow: 3px 3px 0 0 #0E1B3D39 suffix: arrow40 secondary:41 background: #0E1B3D42 color: #FFFFFF43 border: 1.5px solid #0E1B3D44 shape: sharp45 padding: 13px 26px46 font: display / 600 / 0.9375rem / -0.01em47 outline:48 background: #FFFFFF49 color: #0E1B3D50 border: 1.5px solid #0E1B3D51 shape: sharp52 padding: 12px 24px53 font: display / 600 / 0.9375rem / -0.01em54 ghost:55 background: transparent56 color: #0E1B3D57 border: none58 shape: sharp59 padding: 12px 4px60 font: display / 600 / 0.9375rem / -0.01em61 hover: underline62charts:63 variant: bars64 stroke_width: 065 gridlines: false66 bar_radius: 0px67 bar_gap: 8px68 highlight: last69 axis_color: "#3A4566"70 palette: ["#E6FF55", "#0E1B3D"]71fonts_url: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&family=Space+Mono:wght@400;700&display=swap"72dependencies: ["lucide-react"]73---74 75# Ink & Citron76 77## AI Build Instructions78 79> **Read this section before writing any code.** The rules below80> are non-negotiable. Every value used in the UI must come from this81> file's frontmatter — never substitute, approximate, or invent new82> colors, fonts, radii, or shadows. If a value is missing, ask the83> user before adding one.84 85### 1 · Your role86 87You are building UI for a project that has adopted **Ink & Citron** as its88design system. Treat `DESIGN.md` as the single source of truth.89Your job is to translate the user's product requirements into90components and pages that look like they were designed by the same91person who authored this file.92 93### 2 · Token compliance94 95- Pull every color, font family, radius, shadow, and spacing value96 from the frontmatter at the top of this file.97- Use semantic roles (e.g. `primary`, `accent`, `muted`) — never98 hard-code hex values that bypass the system.99- When a token can be expressed as a CSS variable, declare it once100 in your global stylesheet and reference it everywhere downstream.101- The Google Fonts `<link>` is provided in the Typography section.102 Add it to `<head>` before any component renders.103 104### 3 · Component recipes105 106Use these recipes verbatim when building the corresponding component.107 108#### Buttons109 110Four variants are defined. Pick one — never blend variants or invent a fifth.111 112- **Primary** — sharp shape, bg `#E6FF55`, text `#0E1B3D`, border `1.5px solid #0E1B3D`, padding `13px 26px`, weight `700`, shadow `3px 3px 0 0 #0E1B3D`.113- **Secondary** — sharp shape, bg `#0E1B3D`, text `#FFFFFF`, border `1.5px solid #0E1B3D`, padding `13px 26px`, weight `600`.114- **Outline** — sharp shape, bg `#FFFFFF`, text `#0E1B3D`, border `1.5px solid #0E1B3D`, padding `12px 24px`, weight `600`.115- **Ghost** — sharp shape, text `#0E1B3D`, padding `12px 4px`, weight `600`.116 117Reach for **primary** as the single dominant CTA per screen.118**Secondary** for the supporting action. **Outline** for tertiary119actions in toolbars. **Ghost** for inline links and table actions.120 121#### Cards122 123- Background: `#FFFFFF`124- Border: `1.5px solid #0E1B3D`125- Shadow: `4px 4px 0 0 #0E1B3D`126- Radius: `radius.lg` (`4px`)127- Internal padding: `20px` for compact cards, `24–28px` for content cards.128 129#### Charts130 131- Bar/line variant: `bars`132- Bar radius: `0px`133- No gridlines — let the bars/lines carry the data.134- Highlight strategy: `last` — emphasize a single bar/point per chart.135- Use the declared palette in order: `#E6FF55`, `#0E1B3D`.136 137#### Typography pairings138 139- **Display (`Space Grotesk`)** — h1, h2, hero headlines, brand wordmarks.140- **Body (`Inter`)** — paragraphs, labels, button text, form inputs.141- **Mono (`Space Mono`)** — code, eyebrows, metadata, numerals in tables.142 143### 4 · Hard constraints144 145Never do any of the following without explicit instruction from the user:146 147- Introduce a new color, font, radius, or shadow that isn't declared above.148- Mix this system with another (e.g. don't paste in Material or Bootstrap defaults).149- Use generic gradient defaults (purple→blue, peach→pink) — they break the system's voice.150- Reach for emoji icons. Use a consistent icon library and size icons in line with body type.151- Add motion that exceeds the system's restraint — keep transitions short (≤200ms) and subtle.152 153### 5 · Before you finish — verify154 155Run through this checklist for every screen you produce:156 157- [ ] Every color used appears in the Colors table above.158- [ ] Headlines use the display font; body copy uses the body font.159- [ ] Buttons match one of the declared variants exactly (shape, padding, weight).160- [ ] Border-radius values come from `radius.sm` / `radius.md` / `radius.lg` / `radius.pill`.161- [ ] Cards and dividers use the declared border + shadow tokens.162- [ ] No values were invented; if you needed something missing, you stopped and asked.163 164---165 166## Overview167Ink & Citron is a radical 2-color duotone. Two colors do all the work:168 169- **Deep Ink #0E1B3D** — text, borders, secondary surfaces, hard shadows.170- **Acid Citron #E6FF55** — the primary CTA, accent words, chart bars, the one thing that should grab the eye.171 172There is no third chromatic hue. The "neutral" off-white is tinted toward ink so the page never breaks the duotone. The constraint is the personality — when the system is followed strictly it reads as confident and modern; when a third color is introduced it falls apart.173 174For design-forward agencies, fashion-tech, music platforms, awards sites — anywhere the brief is "make it loud but smart."175 176## The Two Colors177```css178--ink: #0E1B3D;179--citron: #E6FF55;180--paper: #FFFFFF; /* allowed neutral */181--paper-tinted: #F2F3F8; /* page background, ink-tinted */182```183 184Allowed combinations:185- Citron block + ink label + hard ink shadow → primary CTA.186- Ink block + paper label → secondary CTA, footer, dark sections.187- Paper surface + ink hairline + ink type → cards, articles, body content.188- Citron text on ink background → hero accent word only.189 190Forbidden combinations:191- Any third hue.192- Citron on paper as a fill (it's too aggressive at scale — citron is for actions and accents only).193- Soft shadows. The shadow is always 3-4px hard-offset ink, never blurred.194 195## Typography196- **Display: Space Grotesk 700** at 6rem with -4.5% tracking. Tight, geometric, confident.197- **Body: Inter 400** at 1rem with 1.55 leading.198- **Mono: Space Mono** for captions and code.199 200| Role | Font | Size | Weight | Tracking |201|------|------|------|--------|----------|202| Hero | Space Grotesk | 6rem | 700 | -0.045em |203| H1 | Space Grotesk | 3.5rem | 700 | -0.04em |204| H2 | Space Grotesk | 1.75rem | 600 | -0.02em |205| Body | Inter | 1rem | 400 | -0.005em / 1.55 |206 207## Geometry208- **Radii: 0 / 2 / 4.** The system reads as hard-edged. Pills and 12px+ radii break the personality.209- **Borders: 1.5px solid ink.** Heavier than a hairline — the line is part of the composition.210- **Hard shadows: 3-4px offset solid ink.** Never blurred. Reads as poster-print, not depth.211 212## Buttons213- **Primary** — citron block, ink label, 1.5px ink border, 3px hard ink shadow. Mono-display label at 700.214- **Secondary** — ink block, paper label, 1.5px ink border.215- **Outline** — paper block, ink label, 1.5px ink border.216- **Ghost** — bare ink label, hover underline.217 218All four are sharp (0-2px). All four use the display face for labels — the typography is part of the system's voice.219 220## Cards221Paper surface, 1.5px solid ink border, 4px hard ink shadow. Radius 4px. Cards have weight — they sit on the page like printed cards on a table.222 223## Charts & Data224Citron bars on a paper background, ink axis labels and baseline. No gridlines, no rounded corners, 8px gap. The chart is a graphic, not a subtle data viz.225 226## Do's and Don'ts227- ✅ Two colors only — ink and citron. Every paint decision goes through this filter.228- ✅ Hard offset shadows — 3-4px, solid ink, no blur. Ever.229- ✅ Display face for buttons. The type is part of the brand.230- ✅ Citron is for the primary CTA, one hero accent word, and chart bars. Three appearances per page max.231- ❌ No third hue. No grey midtones beyond the ink-tinted paper.232- ❌ No soft / blurred shadows. No glassmorphism. No gradients of any kind.233- ❌ No pills. No radii above 4px.234- ❌ No citron at large fill scale (full sections, full cards). It will fight the type.235 236---237 238## Tokens239 240> Generated from the same source the live preview renders from.241> Treat the values below as the contract — never substitute approximations.242 243### Colors244 245| Role | Value |246|-----------|-------|247| primary | `#0E1B3D` |248| secondary | `#3A4566` |249| tertiary | `#E6FF55` |250| neutral | `#F2F3F8` |251| surface | `#FFFFFF` |252 253### Typography254 255- **Display:** Space Grotesk256- **Body:** Inter257- **Mono:** Space Mono258 259| Role | size / leading / weight / tracking |260|------|------------------------------------|261| Hero | 6rem / 0.95 / 700 / -0.045em |262| H1 | 3.5rem / 1 / 700 / -0.04em |263| H2 | 1.75rem / 1.2 / 600 / -0.02em |264| Body | 1rem / 1.55 / 400 / -0.005em |265 266### Radius267 268- sm: `0px`269- md: `2px`270- lg: `4px`271 272### Shadows273 274- **card:** `4px 4px 0 0 #0E1B3D`275- **button:** `3px 3px 0 0 #0E1B3D`276 277### Borders278 279- **card:** `1.5px solid #0E1B3D`280- **divider:** `#0E1B3D`281 282### Buttons283 284Four variants, each fully tokenized. The preview renders from these exact values.285 286#### Primary287 288| Property | Value |289|----------|-------|290| shape | `sharp` |291| background | `#E6FF55` |292| color | `#0E1B3D` |293| border | `1.5px solid #0E1B3D` |294| padding | `13px 26px` |295| fontFamily | `display` |296| fontWeight | `700` |297| fontSize | `0.9375rem` |298| tracking | `-0.01em` |299| shadow | `3px 3px 0 0 #0E1B3D` |300| suffix | `arrow` |301 302#### Secondary303 304| Property | Value |305|----------|-------|306| shape | `sharp` |307| background | `#0E1B3D` |308| color | `#FFFFFF` |309| border | `1.5px solid #0E1B3D` |310| padding | `13px 26px` |311| fontFamily | `display` |312| fontWeight | `600` |313| fontSize | `0.9375rem` |314| tracking | `-0.01em` |315 316#### Outline317 318| Property | Value |319|----------|-------|320| shape | `sharp` |321| background | `#FFFFFF` |322| color | `#0E1B3D` |323| border | `1.5px solid #0E1B3D` |324| padding | `12px 24px` |325| fontFamily | `display` |326| fontWeight | `600` |327| fontSize | `0.9375rem` |328| tracking | `-0.01em` |329 330#### Ghost331 332| Property | Value |333|----------|-------|334| shape | `sharp` |335| background | `transparent` |336| color | `#0E1B3D` |337| border | `none` |338| padding | `12px 4px` |339| fontFamily | `display` |340| fontWeight | `600` |341| fontSize | `0.9375rem` |342| tracking | `-0.01em` |343| hoverHint | `underline` |344 345### Charts346 347| Property | Value |348|----------|-------|349| variant | `bars` |350| strokeWidth | `0` |351| gridlines | `false` |352| barRadius | `0px` |353| barGap | `8px` |354| highlight | `last` |355| axisColor | `#3A4566` |356| palette | `#E6FF55`, `#0E1B3D` |357 358---359 360## Pro tokens361 362> Production-fidelity tokens. States, density, motion, elevation,363> content rules and a measured WCAG contract — derived from the364> resting tokens unless explicitly authored.365 366### States367 368#### Button369 370- **hover** — bg: `rgba(230, 255, 85, 0.92)`, shadow: `0 4px 20px -8px rgba(230, 255, 85, 0.4)`371- **focus** — outline: `1.5px solid #E6FF55`, outline-offset: `4px`372- **active** — transform: `translateY(1px)`, filter: `brightness(0.95)`373- **disabled** — opacity: `0.45`374- **loading** — opacity: `0.7`375- **selected** — bg: `#0E1B3D`, color: `#FFFFFF`376 377#### Input378 379- **hover** — border: `1px solid #0E1B3D`380- **focus** — border: `1px solid #E6FF55`, shadow: `0 1px 0 0 #E6FF55`381- **disabled** — opacity: `0.45`382- **error** — border: `1px solid #991B1B`, shadow: `0 1px 0 0 #991B1B`383 384#### Card385 386- **hover** — shadow: `0 8px 24px -12px rgba(15,23,42,0.14)`, transform: `translateY(-1px)`387- **selected** — border: `1px solid #0E1B3D`388 389#### Tab390 391- **hover** — color: `#0E1B3D`392- **focus** — outline: `1.5px solid #E6FF55`, outline-offset: `3px`393- **selected** — color: `#E6FF55`, border: `0 0 2px 0 solid #E6FF55`394 395### Density396 397| Mode | padding × | row × | body | radius × | Use for |398|------|-----------|-------|------|----------|---------|399| compact | 0.72 | 0.78 | 0.8125rem | 0.85 | Information-dense — tables, IDEs, dashboards |400| comfortable | 1 | 1 | 0.9375rem | — | Default — most product UI |401| spacious | 1.35 | 1.3 | 1rem | 1.15 | Editorial — marketing, long-form, settings |402 403### Motion404 405**Signature — Page turn.** Deliberate, measured motion — like turning a magazine page. Never jerky, never overdone.406 407```css408transition: all 320ms cubic-bezier(0.25, 0.46, 0.45, 0.94);409```410 411| Token | Value |412|-------|-------|413| duration.instant | `80ms` |414| duration.fast | `180ms` |415| duration.base | `320ms` |416| duration.slow | `500ms` |417| easing.standard | `cubic-bezier(0.25, 0.46, 0.45, 0.94)` |418| easing.decelerate | `cubic-bezier(0.0, 0, 0.2, 1)` |419| easing.accelerate | `cubic-bezier(0.4, 0, 1, 1)` |420| easing.spring | `cubic-bezier(0.5, 1.2, 0.6, 1)` |421 422### Elevation423 424Five-level scale, system-specific recipe.425 426| Level | Shadow | Recipe |427|-------|--------|--------|428| level0 | `none` | Hairline only — typical editorial resting state. |429| level1 | `0 1px 2px rgba(15,23,42,0.04)` | Barely visible — list rows, dividers. |430| level2 | `0 8px 24px -12px rgba(15,23,42,0.12)` | Pull-quote, sidebar — soft lift. |431| level3 | `0 16px 40px -16px rgba(15,23,42,0.18)` | Cover story card — clear lift. |432| level4 | `0 32px 80px -24px rgba(15,23,42,0.28)` | Modal — overlays the layout, with scrim. |433 434### Content435 436- **measure:** `60ch` (max line length for body prose)437- **paragraph spacing:** `1.5em`438- **list indent:** `1.75em`439- **list gap:** `0.55em`440- **link:** color `#E6FF55`, underline `always`441- **blockquote:** border `4px solid #E6FF55`, padding `0.4em 0 0.4em 1.5em`442- **code:** background `rgba(14, 27, 61, 0.06)`, color `#0E1B3D`443 444### Accessibility (WCAG 2.1)445 446**Overall:** FAIL447 448| Pair | Ratio | Required | Grade | Suggested fix |449|------|-------|----------|-------|---------------|450| Body text on surface | 16.9:1 | AA | AAA | — |451| Body text on canvas | 15.25:1 | AA | AAA | — |452| Muted text on surface | 9.45:1 | AA | AAA | — |453| Accent on surface | 1.12:1 | AA-Large | FAIL | `#6b7e00` → 4.56:1 (AA) |454| Accent on canvas | 1.01:1 | AA-Large | FAIL | `#637400` → 4.7:1 (AA) |455 # 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=Space+Grotesk:wght@500;600;700&family=Space+Mono:wght@400;700&display=swap" />npm install lucide-react// tailwind.config.jsexport default { theme: { extend: { fontFamily: { display: ['"Space Grotesk"', 'serif'], sans: ['"Inter"', 'sans-serif'], mono: ['"Space Mono"', 'monospace'], }, colors: { primary: '#0E1B3D', secondary: '#3A4566', accent: '#E6FF55', neutral: '#F2F3F8', surface: '#FFFFFF', }, borderRadius: { sm: '0px', md: '2px', lg: '4px', }, }, },};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.
Real glassmorphism without the cliché. A soft tonal backdrop in cool lavender, surfaces that actually blur the layers behind them, hairline edges in 8% ink, and a single periwinkle accent. The depth is restraint, not decoration.