Dark glass. Deep midnight canvas with a faint indigo-violet aurora behind; cards float as smoked glass panes with 32px backdrop-blur and a faint inset top highlight. Depth and theater without going gaudy.
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.
1---2name: "Obsidian Glass"3description: "Dark glass. Deep midnight canvas with a faint indigo-violet aurora behind; cards float as smoked glass panes with 32px backdrop-blur and a faint inset top highlight. Depth and theater without going gaudy."4tags: [glass, dark, premium, minimal, modern]5colors:6 primary: "#ECEDF2"7 secondary: "#9298B0"8 tertiary: "#8B95FF"9 neutral: "#0B0C14"10 surface: "#13141E"11typography:12 display: "Inter Tight"13 body: Inter14 mono: "JetBrains Mono"15 scale:16 hero: "4.5rem / 1.05 / 600 / -0.035em"17 h1: "2.625rem / 1.1 / 600 / -0.03em"18 h2: "1.5rem / 1.3 / 600 / -0.015em"19 body: "1rem / 1.65 / 400 / -0.005em"20radius:21 sm: 12px22 md: 18px23 lg: 24px24 pill: 9999px25shadows:26 card: "0 32px 80px -32px rgba(0, 0, 0, 0.55), 0 2px 8px -4px rgba(0, 0, 0, 0.30)"27 button: "0 12px 32px -16px rgba(139, 149, 255, 0.55), inset 0 1px 0 rgba(255, 255, 255, 0.18)"28borders:29 card: "1px solid rgba(255, 255, 255, 0.10)"30 divider: "rgba(255, 255, 255, 0.08)"31glass:32 surface: "rgba(255, 255, 255, 0.06)"33 blur: 32px34 saturate: 180%35 border: "1px solid rgba(255, 255, 255, 0.10)"36 shadow: "0 32px 80px -32px rgba(0, 0, 0, 0.55), 0 2px 8px -4px rgba(0, 0, 0, 0.30)"37 inner_highlight: "inset 0 1px 0 rgba(255, 255, 255, 0.12)"38 backdrop: "radial-gradient(at 14% 18%, rgba(99, 102, 241, 0.32) 0px, transparent 45%), radial-gradient(at 86% 14%, rgba(139, 92, 246, 0.26) 0px, transparent 50%), radial-gradient(at 78% 88%, rgba(59, 130, 246, 0.22) 0px, transparent 55%)"39buttons:40 primary:41 background: linear-gradient(180deg, #9DA6FF 0%, #6E7BFF 100%)42 color: #0B0C1443 border: 1px solid rgba(255, 255, 255, 0.20)44 shape: pill45 padding: 12px 24px46 font: 600 / 0.9375rem / -0.005em47 shadow: 0 12px 32px -16px rgba(139, 149, 255, 0.55), inset 0 1px 0 rgba(255, 255, 255, 0.35)48 secondary:49 background: rgba(255, 255, 255, 0.06)50 color: #ECEDF251 border: 1px solid rgba(255, 255, 255, 0.12)52 shape: pill53 padding: 12px 24px54 font: 500 / 0.9375rem / -0.005em55 backdrop_blur: 20px56 backdrop_saturate: 180%57 outline:58 background: transparent59 color: #ECEDF260 border: 1px solid rgba(255, 255, 255, 0.18)61 shape: pill62 padding: 11px 22px63 font: 500 / 0.9375rem / -0.005em64 ghost:65 background: transparent66 color: #9298B067 border: none68 shape: pill69 padding: 11px 6px70 font: 500 / 0.9375rem / -0.005em71 hover: underline72charts:73 variant: area74 stroke_width: 275 fill_opacity: 0.2276 gridlines: false77 highlight: last78 dot_marker: true79 axis_color: "#9298B0"80 palette: ["#8B95FF", "#A5ADFF", "#C9CEFF"]81fonts_url: "https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;600;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400&display=swap"82dependencies: ["lucide-react"]83---84 85# Obsidian Glass86 87## AI Build Instructions88 89> **Read this section before writing any code.** The rules below90> are non-negotiable. Every value used in the UI must come from this91> file's frontmatter — never substitute, approximate, or invent new92> colors, fonts, radii, or shadows. If a value is missing, ask the93> user before adding one.94 95### 1 · Your role96 97You are building UI for a project that has adopted **Obsidian Glass** as its98design system. Treat `DESIGN.md` as the single source of truth.99Your job is to translate the user's product requirements into100components and pages that look like they were designed by the same101person who authored this file.102 103### 2 · Token compliance104 105- Pull every color, font family, radius, shadow, and spacing value106 from the frontmatter at the top of this file.107- Use semantic roles (e.g. `primary`, `accent`, `muted`) — never108 hard-code hex values that bypass the system.109- When a token can be expressed as a CSS variable, declare it once110 in your global stylesheet and reference it everywhere downstream.111- The Google Fonts `<link>` is provided in the Typography section.112 Add it to `<head>` before any component renders.113 114### 3 · Component recipes115 116Use these recipes verbatim when building the corresponding component.117 118#### Buttons119 120Four variants are defined. Pick one — never blend variants or invent a fifth.121 122- **Primary** — pill shape, bg `linear-gradient(180deg, #9DA6FF 0%, #6E7BFF 100%)`, text `#0B0C14`, border `1px solid rgba(255, 255, 255, 0.20)`, padding `12px 24px`, weight `600`, shadow `0 12px 32px -16px rgba(139, 149, 255, 0.55), inset 0 1px 0 rgba(255, 255, 255, 0.35)`.123- **Secondary** — pill shape, bg `rgba(255, 255, 255, 0.06)`, text `#ECEDF2`, border `1px solid rgba(255, 255, 255, 0.12)`, padding `12px 24px`, weight `500`.124- **Outline** — pill shape, text `#ECEDF2`, border `1px solid rgba(255, 255, 255, 0.18)`, padding `11px 22px`, weight `500`.125- **Ghost** — pill shape, text `#9298B0`, padding `11px 6px`, weight `500`.126 127Reach for **primary** as the single dominant CTA per screen.128**Secondary** for the supporting action. **Outline** for tertiary129actions in toolbars. **Ghost** for inline links and table actions.130 131#### Cards132 133- Background: `#13141E`134- Border: `1px solid rgba(255, 255, 255, 0.10)`135- Shadow: `0 32px 80px -32px rgba(0, 0, 0, 0.55), 0 2px 8px -4px rgba(0, 0, 0, 0.30)`136- Radius: `radius.lg` (`24px`)137- Internal padding: `20px` for compact cards, `24–28px` for content cards.138 139> This system ships a **glass treatment** — see the Glass token table.140> Apply `backdrop-filter: blur(32px)` to translucent panes.141> The page must have a backdrop (gradient mesh / blurred orbs) for glass to refract.142 143#### Charts144 145- Bar/line variant: `area`146- No gridlines — let the bars/lines carry the data.147- Highlight strategy: `last` — emphasize a single bar/point per chart.148- Use the declared palette in order: `#8B95FF`, `#A5ADFF`, `#C9CEFF`.149 150#### Typography pairings151 152- **Display (`Inter Tight`)** — h1, h2, hero headlines, brand wordmarks.153- **Body (`Inter`)** — paragraphs, labels, button text, form inputs.154- **Mono (`JetBrains Mono`)** — code, eyebrows, metadata, numerals in tables.155 156### 4 · Hard constraints157 158Never do any of the following without explicit instruction from the user:159 160- Introduce a new color, font, radius, or shadow that isn't declared above.161- Mix this system with another (e.g. don't paste in Material or Bootstrap defaults).162- Use generic gradient defaults (purple→blue, peach→pink) — they break the system's voice.163- Reach for emoji icons. Use a consistent icon library and size icons in line with body type.164- Add motion that exceeds the system's restraint — keep transitions short (≤200ms) and subtle.165 166### 5 · Before you finish — verify167 168Run through this checklist for every screen you produce:169 170- [ ] Every color used appears in the Colors table above.171- [ ] Headlines use the display font; body copy uses the body font.172- [ ] Buttons match one of the declared variants exactly (shape, padding, weight).173- [ ] Border-radius values come from `radius.sm` / `radius.md` / `radius.lg` / `radius.pill`.174- [ ] Cards and dividers use the declared border + shadow tokens.175- [ ] No values were invented; if you needed something missing, you stopped and asked.176 177---178 179## Overview180Obsidian Glass is dark glass. The page sits on a deep midnight canvas with a faint indigo-violet aurora — three soft radial blobs in indigo, violet, and blue — painted into the background. Cards float above the aurora as smoked glass panes: 32px backdrop-blur, 6% white surface, 1px white-alpha hairline, and a faint inset top highlight that reads as a top-edge gloss in the dark.181 182The glass is the entire system. Type, color, buttons — all calibrated to let the smoked panes do the work. Built for night-mode AI tools, premium dashboards, music and media platforms, anything that wants depth and theater without going gaudy.183 184## The Smoked Glass Recipe185Cards are not "dark with a shadow." They are smoked glass over a chromatic backdrop:186 187```css188.obsidian-pane {189 background: rgba(255, 255, 255, 0.06);190 backdrop-filter: blur(32px) saturate(180%);191 -webkit-backdrop-filter: blur(32px) saturate(180%);192 border: 1px solid rgba(255, 255, 255, 0.10);193 box-shadow:194 inset 0 1px 0 rgba(255, 255, 255, 0.12),195 0 32px 80px -32px rgba(0, 0, 0, 0.55),196 0 2px 8px -4px rgba(0, 0, 0, 0.30);197 border-radius: 24px;198}199```200 201The page MUST have the indigo-violet aurora behind it for the glass to mean anything:202 203```css204body {205 background:206 radial-gradient(at 14% 18%, rgba(99,102,241,0.32) 0, transparent 45%),207 radial-gradient(at 86% 14%, rgba(139,92,246,0.26) 0, transparent 50%),208 radial-gradient(at 78% 88%, rgba(59,130,246,0.22) 0, transparent 55%),209 #0B0C14;210}211```212 213Without the aurora, the glass collapses to "dark grey with a border." The two are inseparable.214 215## Color216- **Moonlight #ECEDF2** — primary text.217- **Lavender-grey #9298B0** — secondary text, axis labels.218- **Periwinkle #8B95FF** — the only chromatic accent. Primary CTA, link hover, chart line.219- **Midnight #0B0C14** — page canvas.220- **Smoked glass #FFFFFF @ 6%** — card surface (translucent over the aurora).221 222The aurora uses three soft tints of indigo / violet / blue — never anything warm.223 224## Typography225- **Display: Inter Tight 600** at 4.5rem with -3.5% tracking.226- **Body: Inter 400** at 1rem with 1.65 leading.227 228| Role | Font | Size | Weight | Tracking |229|------|------|------|--------|----------|230| Hero | Inter Tight | 4.5rem | 600 | -0.035em |231| H1 | Inter Tight | 2.625rem | 600 | -0.03em |232| H2 | Inter Tight | 1.5rem | 600 | -0.015em |233| Body | Inter | 1rem | 400 | -0.005em / 1.65 |234 235## Geometry236- **Radii: 12 / 18 / 24.** Glass needs generous corners to read as a pane.237- **Pill buttons** for primary + secondary.238- **Section gap: 120px** desktop, 72px mobile. The aurora needs room to breathe.239 240## Buttons241- **Primary** — vertical periwinkle gradient with an inner top-edge gloss. Pill, midnight label at 600.242- **Secondary** — smoked glass pill (the same recipe as cards, scaled down). Backdrop-blur 20px.243- **Outline** — bare hairline pill at 18% white.244- **Ghost** — bare lavender-grey label, hover underline.245 246## Cards247Smoked glass panes — see the recipe above. Radius 24px. Padding 32px minimum. Cards never sit flush; always 24-32px gap so the aurora reads between them.248 249## Charts & Data250Periwinkle area chart, 2px stroke, 22% fill opacity, no gridlines. End-of-line dot. The chart sits inside a glass card, never on the bare midnight.251 252## Do's and Don'ts253- ✅ The indigo-violet aurora is mandatory. Without it the glass dies.254- ✅ Cards always include the inner top-edge highlight at 12% — that's what reads as polished pane in the dark.255- ✅ One chromatic accent only — periwinkle. Everything else is moonlight/lavender-grey.256- ✅ Generous radii (18-24px). Glass at sharp corners reads as plastic.257- ❌ No warm tints in the aurora. The system is strictly cool.258- ❌ No solid dark cards. If a card isn't smoked glass, it's not in the system.259- ❌ No hard drop shadows beyond the soft black ambient.260- ❌ No second chromatic accent. Periwinkle is the only chroma allowed.261 262---263 264## Tokens265 266> Generated from the same source the live preview renders from.267> Treat the values below as the contract — never substitute approximations.268 269### Colors270 271| Role | Value |272|-----------|-------|273| primary | `#ECEDF2` |274| secondary | `#9298B0` |275| tertiary | `#8B95FF` |276| neutral | `#0B0C14` |277| surface | `#13141E` |278 279### Typography280 281- **Display:** Inter Tight282- **Body:** Inter283- **Mono:** JetBrains Mono284 285| Role | size / leading / weight / tracking |286|------|------------------------------------|287| Hero | 4.5rem / 1.05 / 600 / -0.035em |288| H1 | 2.625rem / 1.1 / 600 / -0.03em |289| H2 | 1.5rem / 1.3 / 600 / -0.015em |290| Body | 1rem / 1.65 / 400 / -0.005em |291 292### Radius293 294- sm: `12px`295- md: `18px`296- lg: `24px`297- pill: `9999px`298 299### Shadows300 301- **card:** `0 32px 80px -32px rgba(0, 0, 0, 0.55), 0 2px 8px -4px rgba(0, 0, 0, 0.30)`302- **button:** `0 12px 32px -16px rgba(139, 149, 255, 0.55), inset 0 1px 0 rgba(255, 255, 255, 0.18)`303 304### Borders305 306- **card:** `1px solid rgba(255, 255, 255, 0.10)`307- **divider:** `rgba(255, 255, 255, 0.08)`308 309### Glass310 311Translucent panes with backdrop-filter — the preview renders cards from these exact values.312 313| Property | Value |314|----------|-------|315| surface | `rgba(255, 255, 255, 0.06)` |316| blur | `32px` |317| saturate | `180%` |318| border | `1px solid rgba(255, 255, 255, 0.10)` |319| shadow | `0 32px 80px -32px rgba(0, 0, 0, 0.55), 0 2px 8px -4px rgba(0, 0, 0, 0.30)` |320| innerHighlight | `inset 0 1px 0 rgba(255, 255, 255, 0.12)` |321| backdrop | `radial-gradient(at 14% 18%, rgba(99, 102, 241, 0.32) 0px, transparent 45%), radial-gradient(at 86% 14%, rgba(139, 92, 246, 0.26) 0px, transparent 50%), radial-gradient(at 78% 88%, rgba(59, 130, 246, 0.22) 0px, transparent 55%)` |322 323### Buttons324 325Four variants, each fully tokenized. The preview renders from these exact values.326 327#### Primary328 329| Property | Value |330|----------|-------|331| shape | `pill` |332| background | `linear-gradient(180deg, #9DA6FF 0%, #6E7BFF 100%)` |333| color | `#0B0C14` |334| border | `1px solid rgba(255, 255, 255, 0.20)` |335| padding | `12px 24px` |336| fontWeight | `600` |337| fontSize | `0.9375rem` |338| tracking | `-0.005em` |339| shadow | `0 12px 32px -16px rgba(139, 149, 255, 0.55), inset 0 1px 0 rgba(255, 255, 255, 0.35)` |340 341#### Secondary342 343| Property | Value |344|----------|-------|345| shape | `pill` |346| background | `rgba(255, 255, 255, 0.06)` |347| color | `#ECEDF2` |348| border | `1px solid rgba(255, 255, 255, 0.12)` |349| padding | `12px 24px` |350| fontWeight | `500` |351| fontSize | `0.9375rem` |352| tracking | `-0.005em` |353| backdropBlur | `20px` |354| backdropSaturate | `180%` |355 356#### Outline357 358| Property | Value |359|----------|-------|360| shape | `pill` |361| background | `transparent` |362| color | `#ECEDF2` |363| border | `1px solid rgba(255, 255, 255, 0.18)` |364| padding | `11px 22px` |365| fontWeight | `500` |366| fontSize | `0.9375rem` |367| tracking | `-0.005em` |368 369#### Ghost370 371| Property | Value |372|----------|-------|373| shape | `pill` |374| background | `transparent` |375| color | `#9298B0` |376| border | `none` |377| padding | `11px 6px` |378| fontWeight | `500` |379| fontSize | `0.9375rem` |380| tracking | `-0.005em` |381| hoverHint | `underline` |382 383### Charts384 385| Property | Value |386|----------|-------|387| variant | `area` |388| strokeWidth | `2` |389| fillOpacity | `0.22` |390| gridlines | `false` |391| highlight | `last` |392| dotMarker | `true` |393| axisColor | `#9298B0` |394| palette | `#8B95FF`, `#A5ADFF`, `#C9CEFF` |395 # 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=Inter:wght@400;500;600&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: '#ECEDF2', secondary: '#9298B0', accent: '#8B95FF', neutral: '#0B0C14', surface: '#13141E', }, borderRadius: { sm: '12px', md: '18px', lg: '24px', }, }, },};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.
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.