Luxury productivity. Deep purple hero against pristine white, non-standard variable weight 460/540, ultra-tight 0.96 leading, warm cream CTAs, lavender as the only 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: "Twilight Mail"3description: "Luxury productivity. Deep purple hero against pristine white, non-standard variable weight 460/540, ultra-tight 0.96 leading, warm cream CTAs, lavender as the only accent."4tags: [consumer, premium, minimal, editorial]5colors:6 primary: "#292827"7 secondary: "#55534e"8 tertiary: "#cbb7fb"9 neutral: "#1b1938"10 surface: "#ffffff"11typography:12 display: "Inter Tight"13 body: "Inter Tight"14 mono: "JetBrains Mono"15 scale:16 hero: "4rem / 0.96 / 500 / 0"17 h1: "3rem / 0.96 / 500 / -1.32px"18 h2: "1.75rem / 1.14 / 500 / -0.63px"19 body: "1rem / 1.5 / 500 / 0"20radius:21 sm: 8px22 md: 8px23 lg: 16px24shadows:25 card: "rgba(41,40,39,0.06) 0 1px 2px"26borders:27 card: "1px solid #dcd7d3"28 divider: "#dcd7d3"29buttons:30 primary:31 background: #e9e5dd32 color: #29282733 border: none34 shape: rounded35 padding: 12px 22px36 font: 70037 secondary:38 background: #29282739 color: #ffffff40 border: none41 shape: rounded42 padding: 12px 22px43 font: 60044 outline:45 background: #ffffff46 color: #29282747 border: 1px solid #dcd7d348 shape: rounded49 padding: 12px 22px50 font: 60051 ghost:52 background: transparent53 color: #714cb654 border: none55 shape: rounded56 padding: 12px 8px57 font: 54058 hover: underline59charts:60 variant: stepped61 stroke_width: 262 fill_opacity: 0.463 gridlines: false64 bar_gap: 0px65 highlight: all66 dot_marker: false67 palette: ["#cbb7fb", "#b59cf5", "#9d80ee", "#8364e0", "#714cb6", "#52378a", "#1b1938"]68fonts_url: "https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;600;700&family=JetBrains+Mono:wght@400&display=swap"69dependencies: ["lucide-react"]70---71 72# Twilight Mail73 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 **Twilight Mail** 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 `#e9e5dd`, text `#292827`, padding `12px 22px`, weight `700`.110- **Secondary** — rounded shape, bg `#292827`, text `#ffffff`, padding `12px 22px`, weight `600`.111- **Outline** — rounded shape, bg `#ffffff`, text `#292827`, border `1px solid #dcd7d3`, padding `12px 22px`, weight `600`.112- **Ghost** — rounded shape, text `#714cb6`, padding `12px 8px`, weight `540`.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 #dcd7d3`122- Shadow: `rgba(41,40,39,0.06) 0 1px 2px`123- Radius: `radius.lg` (`16px`)124- Internal padding: `20px` for compact cards, `24–28px` for content cards.125 126#### Charts127 128- Bar/line variant: `stepped`129- No gridlines — let the bars/lines carry the data.130- Highlight strategy: `all` — emphasize a single bar/point per chart.131- Use the declared palette in order: `#cbb7fb`, `#b59cf5`, `#9d80ee`, `#8364e0`, `#714cb6`, `#52378a`, `#1b1938`.132 133#### Typography pairings134 135- **Display (`Inter Tight`)** — h1, h2, hero headlines, brand wordmarks.136- **Body (`Inter Tight`)** — 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## 1. Atmosphere163 164Twilight Mail feels like opening a luxury envelope — predominantly white, immaculately clean, with a single dramatic gesture of color that commands attention. The hero is a **cinematic deep-purple gradient** (`#1b1938`) — twilight just before dawn — overlaid with confident white typography. Below that entrance, the page returns to white canvas with **charcoal ink** (`#292827`) text: warm near-black, never pure.165 166The typography is the true signature. The variable display family runs at non-standard weights — **460** and **540** — that sit deliberately between the conventional Regular (400) and Medium (500) stops. Weight 460 is the workhorse: heavier than expected, never aggressive. Display compresses to **0.96 line-height** for dense architectural blocks, while body relaxes to a generous 1.50 — tension between compressed power and breathing room defines the voice.167 168The design philosophy is maximum confidence through minimum decoration. **Warm cream** (`#e9e5dd`) buttons instead of bright CTAs, near-absence of borders and shadows, and **lavender purple** (`#cbb7fb`) as the sole accent. It's a productivity tool that markets itself like a luxury brand.169 170**Signature moves**171- Deep purple hero gradient (`#1b1938`) against pristine white content172- Variable font weights **460 / 540** — between conventional stops173- Display leading **0.96** — compressed power174- Warm Cream (`#e9e5dd`) buttons — never bright175- Lavender (`#cbb7fb`) as the *only* accent176- **Binary radius system** — 8px and 16px, nothing else177- No pill shapes, no micro-rounding178- Charcoal Ink (`#292827`) text — warmer than pure black179 180## 2. Palette181 182### Primary183- **Mysteria Purple** `#1b1938` — hero gradient, darkest brand expression184- **Lavender Glow** `#cbb7fb` — single accent185- **Charcoal Ink** `#292827` — primary text on light186 187### Surface188- Pure White `#ffffff` · Warm Cream `#e9e5dd` (button) · Parchment Border `#dcd7d3`189 190### Secondary191- Amethyst Link `#714cb6` — underlined links192- Translucent White `rgba(255,255,255,0.95)` / `rgba(255,255,255,0.8)` — text on dark193 194## 3. Typography195 196Single variable family. Weight stops: **460, 540, 600, 700**.197 198| Role | Size | Weight | Leading | Tracking |199|------|------|--------|---------|----------|200| Display Hero | 64px | 540 | 0.96 | 0 |201| Section Display | 48px | 460 | 0.96 | -1.32px |202| Feature Title | 28px | 540 | 1.14 | -0.63px |203| Sub-heading L | 26px | 460 | 1.30 | 0 |204| Card Heading | 22px | 460 | 0.76 | -0.315px |205| Body Heading | 20px | 460 | 1.20 | 0 |206| Emphasis Body | 18px | 540 | 1.50 | -0.135px |207| Body | 16px | 460 | 1.50 | 0 |208| Button | 16px | 600–700 | 1.00 | 0 |209| Nav | 16px | 460 | 1.20 | 0 |210| Caption | 14px | 500–600 | 1.20–1.29 | -0.315px / 0 |211| Micro | 12px | 700 | 1.50 | 0 |212 213**460 is the new 400.** Display compresses (0.96), body breathes (1.50). Negative tracking surgical: large only.214 215## 4. Buttons216 217### Warm Cream Primary218```css219background: #e9e5dd;220color: #292827;221padding: 12px 22px;222border-radius: 8px;223```224 225### Dark Inverse226- Background `#292827`, text white, 8px radius227 228### Ghost / Text Link229- Underline decoration, Amethyst Link (`#714cb6`)230 231## 5. Cards232- Background white233- Border `1px solid #dcd7d3`234- Radius **16px** (cards) or **8px** (small) — no other values235- Hero containment: `rgba(255,255,255,0.2)` border on the purple gradient236 237## 6. Charts238**Stepped lavender gradient bars, no gaps** — calm productivity, not financial hype. The bars step from soft Lavender Glow (`#cbb7fb`) into Mysteria Purple (`#1b1938`), creating a gradient narrative across the chart. No gridlines.239 240## 7. Spacing241- Base 8px242- Scale: `2, 4, 6, 8, 12, 16, 18, 20, 24, 28, 32, 36, 40, 48, 56`243- Section padding 48–80px244 245## 8. Depth & elevation246 247| Level | Treatment | Use |248|-------|-----------|-----|249| 0 | Flat | Page canvas |250| 1 | `1px solid #dcd7d3` | Card |251| 2 | `1px solid #292827` | Header / dark separator |252| 3 | Subtle blur | Product screenshot frames |253| 4 | `rgba(255,255,255,0.2)` border | Hero gradient overlay |254 255**Hero gradient creates depth**, not shadows. Lavender accents float over the purple field — a stellar/atmospheric effect.256 257## 9. Do's & don'ts258 259✅ **Do**260- Use weight 460 as default — slightly heavier than regular, the brand signature261- Hold display leading at 0.96 — compression is intentional262- Use Warm Cream (`#e9e5dd`) buttons — never white, never gray263- Limit radius to **8px and 16px** only264- Apply negative tracking on display, never body265- Use Lavender (`#cbb7fb`) as the *only* accent266 267❌ **Don't**268- Use conventional weights 400/500/600 for display — 460/540 is the signature269- Add bright/saturated CTAs (blue, green, red) — buttons are intentionally muted270- Introduce additional accents — palette is single-accent by design271- Use pill shapes — not in this system272- Use pure black text — Charcoal Ink (`#292827`) is warmer273- Add micro-rounding (2–4px) — radius is binary274 275---276 277## Tokens278 279> Generated from the same source the live preview renders from.280> Treat the values below as the contract — never substitute approximations.281 282### Colors283 284| Role | Value |285|-----------|-------|286| primary | `#292827` |287| secondary | `#55534e` |288| tertiary | `#cbb7fb` |289| neutral | `#1b1938` |290| surface | `#ffffff` |291 292### Typography293 294- **Display:** Inter Tight295- **Body:** Inter Tight296- **Mono:** JetBrains Mono297 298| Role | size / leading / weight / tracking |299|------|------------------------------------|300| Hero | 4rem / 0.96 / 500 / 0 |301| H1 | 3rem / 0.96 / 500 / -1.32px |302| H2 | 1.75rem / 1.14 / 500 / -0.63px |303| Body | 1rem / 1.5 / 500 / 0 |304 305### Radius306 307- sm: `8px`308- md: `8px`309- lg: `16px`310 311### Shadows312 313- **card:** `rgba(41,40,39,0.06) 0 1px 2px`314 315### Borders316 317- **card:** `1px solid #dcd7d3`318- **divider:** `#dcd7d3`319 320### Buttons321 322Four variants, each fully tokenized. The preview renders from these exact values.323 324#### Primary325 326| Property | Value |327|----------|-------|328| shape | `rounded` |329| background | `#e9e5dd` |330| color | `#292827` |331| border | `none` |332| padding | `12px 22px` |333| fontWeight | `700` |334 335#### Secondary336 337| Property | Value |338|----------|-------|339| shape | `rounded` |340| background | `#292827` |341| color | `#ffffff` |342| border | `none` |343| padding | `12px 22px` |344| fontWeight | `600` |345 346#### Outline347 348| Property | Value |349|----------|-------|350| shape | `rounded` |351| background | `#ffffff` |352| color | `#292827` |353| border | `1px solid #dcd7d3` |354| padding | `12px 22px` |355| fontWeight | `600` |356 357#### Ghost358 359| Property | Value |360|----------|-------|361| shape | `rounded` |362| background | `transparent` |363| color | `#714cb6` |364| border | `none` |365| padding | `12px 8px` |366| fontWeight | `540` |367| hoverHint | `underline` |368 369### Charts370 371| Property | Value |372|----------|-------|373| variant | `stepped` |374| strokeWidth | `2` |375| fillOpacity | `0.4` |376| gridlines | `false` |377| barGap | `0px` |378| highlight | `all` |379| dotMarker | `false` |380| palette | `#cbb7fb`, `#b59cf5`, `#9d80ee`, `#8364e0`, `#714cb6`, `#52378a`, `#1b1938` |381 382---383 384## Pro tokens385 386> Production-fidelity tokens. States, density, motion, elevation,387> content rules and a measured WCAG contract — derived from the388> resting tokens unless explicitly authored.389 390### States391 392#### Button393 394- **hover** — bg: `rgba(203, 183, 251, 0.92)`, shadow: `0 4px 20px -8px rgba(203, 183, 251, 0.4)`395- **focus** — outline: `1.5px solid #cbb7fb`, outline-offset: `4px`396- **active** — transform: `translateY(1px)`, filter: `brightness(0.95)`397- **disabled** — opacity: `0.45`398- **loading** — opacity: `0.7`399- **selected** — bg: `#292827`, color: `#ffffff`400 401#### Input402 403- **hover** — border: `1px solid #292827`404- **focus** — border: `1px solid #cbb7fb`, shadow: `0 1px 0 0 #cbb7fb`405- **disabled** — opacity: `0.45`406- **error** — border: `1px solid #991B1B`, shadow: `0 1px 0 0 #991B1B`407 408#### Card409 410- **hover** — shadow: `0 8px 24px -12px rgba(15,23,42,0.14)`, transform: `translateY(-1px)`411- **selected** — border: `1px solid #292827`412 413#### Tab414 415- **hover** — color: `#292827`416- **focus** — outline: `1.5px solid #cbb7fb`, outline-offset: `3px`417- **selected** — color: `#cbb7fb`, border: `0 0 2px 0 solid #cbb7fb`418 419### Density420 421| Mode | padding × | row × | body | radius × | Use for |422|------|-----------|-------|------|----------|---------|423| compact | 0.72 | 0.78 | 0.8125rem | 0.85 | Information-dense — tables, IDEs, dashboards |424| comfortable | 1 | 1 | 0.9375rem | — | Default — most product UI |425| spacious | 1.35 | 1.3 | 1rem | 1.15 | Editorial — marketing, long-form, settings |426 427### Motion428 429**Signature — Page turn.** Deliberate, measured motion — like turning a magazine page. Never jerky, never overdone.430 431```css432transition: all 320ms cubic-bezier(0.25, 0.46, 0.45, 0.94);433```434 435| Token | Value |436|-------|-------|437| duration.instant | `80ms` |438| duration.fast | `180ms` |439| duration.base | `320ms` |440| duration.slow | `500ms` |441| easing.standard | `cubic-bezier(0.25, 0.46, 0.45, 0.94)` |442| easing.decelerate | `cubic-bezier(0.0, 0, 0.2, 1)` |443| easing.accelerate | `cubic-bezier(0.4, 0, 1, 1)` |444| easing.spring | `cubic-bezier(0.5, 1.2, 0.6, 1)` |445 446### Elevation447 448Five-level scale, system-specific recipe.449 450| Level | Shadow | Recipe |451|-------|--------|--------|452| level0 | `none` | Hairline only — typical editorial resting state. |453| level1 | `0 1px 2px rgba(15,23,42,0.04)` | Barely visible — list rows, dividers. |454| level2 | `0 8px 24px -12px rgba(15,23,42,0.12)` | Pull-quote, sidebar — soft lift. |455| level3 | `0 16px 40px -16px rgba(15,23,42,0.18)` | Cover story card — clear lift. |456| level4 | `0 32px 80px -24px rgba(15,23,42,0.28)` | Modal — overlays the layout, with scrim. |457 458### Content459 460- **measure:** `60ch` (max line length for body prose)461- **paragraph spacing:** `1.5em`462- **list indent:** `1.75em`463- **list gap:** `0.55em`464- **link:** color `#cbb7fb`, underline `always`465- **blockquote:** border `4px solid #cbb7fb`, padding `0.4em 0 0.4em 1.5em`466- **code:** background `rgba(41, 40, 39, 0.06)`, color `#292827`467 468### Accessibility (WCAG 2.1)469 470**Overall:** FAIL471 472| Pair | Ratio | Required | Grade | Suggested fix |473|------|-------|----------|-------|---------------|474| Body text on surface | 14.72:1 | AA | AAA | — |475| Body text on canvas | 1.15:1 | AA | FAIL | `#878481` → 4.54:1 (AA) |476| Muted text on surface | 7.68:1 | AA | AAA | — |477| Accent on surface | 1.79:1 | AA-Large | FAIL | `#8556f6` → 4.51:1 (AA) |478| Accent on canvas | 9.42:1 | AA-Large | AAA | — |479 # 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;700&family=JetBrains+Mono:wght@400&display=swap" />npm install lucide-react// tailwind.config.jsexport default { theme: { extend: { fontFamily: { display: ['"Inter Tight"', 'serif'], sans: ['"Inter Tight"', 'sans-serif'], mono: ['"JetBrains Mono"', 'monospace'], }, colors: { primary: '#292827', secondary: '#55534e', accent: '#cbb7fb', neutral: '#1b1938', surface: '#ffffff', }, borderRadius: { sm: '8px', md: '8px', lg: '16px', }, }, },};Mid-tone soft glass. Warm dusty-sand canvas with a peach-and-rose aurora behind; cards float as cream-tinted frosted panes with 26px backdrop-blur and a faint inset top highlight. The mid-tone is the system.
Warm bone minimalism with a serif voice. Fraunces display headlines paired with Inter body, a single cognac accent reserved for active states, and generous hairline-only chrome. The quiet end of editorial — built for studios, journals, and brands that whisper.