Files
hallmark/site/css/tokens.css
T
Youssef 78167667a2 v0.9.0 polish — drop image gen + sprinkle, normalize section spacing across themes
REMOVED (per user direction — imagery is on hold for now):
- site/img/generated/ (18 watercolor PNGs + contact sheet + URL cache)
- scripts/generate-marketing.mjs
- skill/_assets/scripts/generate.mjs (user-recipe drop-in)
- skill/references/generated-imagery.md
- All imagery markup in site/index.html (transitions, foundation panel plates, harness plates, footer mark)
- The .wc / .transition / .slot--hero::before / #study::before / .found-panel__plate / .harness__plate / .foot-mark CSS block from sections.css
- Tier C "peer of Tier B" rewrite reverted — back to "last resort, only when characters demand it"
- Anti-pattern "Raw generated stills" entry reverted
- assets.md Tier C catalog reverted to Nanobanana 2 / Gemini 2.5 Flash baseline
- README v0.9.0 release note rewritten without imagery mentions

KEPT:
- Editorial theme (#23) — open-design-inspired premium · warm cream + coral + Inter Tight × Playfair italic
- Open-design steal utilities — Roman-numeral section heads (.num--roman), corner-bracket image annotation (.fig-corners), dark-slab section reversal (.section--invert), pulse animation (.pulse), .tnum tabular-numerals utility, smart-hide banner stub (.banner--smart)
- 22 → 23 theme catalog refresh across SKILL.md, custom-theme.md, structure.md, README, site
- Version 0.8.0 → 0.9.0

NEW: Spacing pass — normalized internal rhythm across all 23 themes
- --section-gap normalized: was 4.5–12rem (huge variance), now 5.5–6.5rem (uniform feel)
  · Atelier 12 → 6.5 (biggest cut)
  · Quiet 10 → 6.5 · Linen 10 → 6.5 · Aurora 10 → 6.5
  · Garden 9 → 6.5 · Salon 9 → 6.5 · Bloom 9 → 6.5
  · Specimen 8 → 6.5 · Almanac 4.5 → 5.5 (slight bump)
- --section-head-gap normalized: was 1–3.5rem, now 1.25–1.75rem (smaller spread)
- .section { gap: var(--space-2xl) } → var(--space-xl) — content sits closer to its head; less air inside each section
- Editorial theme block gains explicit --section-gap + --section-head-gap (was inheriting from :root)

Visual: every theme now has the same vertical rhythm (~6rem between sections, ~1.5rem under heads). The page reads as one document instead of 23 different ones.
2026-05-05 11:59:22 +01:00

1167 lines
49 KiB
CSS

/*
Hallmark — tokens
Twelve themes. Each occupies a distinct point in OKLCH space.
Paper colours span dark / cream / saturated / cool / warm; never adjacent.
Display fonts span category-level differences (serif / mono / condensed sans / italic);
no theme is a minor variation of another.
Switched via [data-theme="..."] on <html>.
*/
/* ──────────────────────────────────────────────────────────────
SPECIMEN — warm oat editorial workshop · serif default
────────────────────────────────────────────────────────────── */
:root,
[data-theme="specimen"] {
--color-paper: oklch(96% 0.018 80);
--color-paper-2: oklch(93% 0.020 80);
--color-paper-3: oklch(89% 0.022 75);
--color-rule: oklch(82% 0.014 75);
--color-rule-2: oklch(70% 0.012 70);
--color-muted: oklch(52% 0.012 65);
--color-neutral: oklch(38% 0.014 60);
--color-ink-2: oklch(26% 0.014 60);
--color-ink: oklch(18% 0.014 60);
--color-accent: #FC4C02;
--color-accent-ink: oklch(55% 0.21 32);
--color-focus: #FC4C02;
--font-display: "Fraunces", "Tiempos", ui-serif, Georgia, serif;
--font-body: "The Future", "Söhne", ui-sans-serif, sans-serif;
--font-serif: "Fraunces", ui-serif, Georgia, serif;
--font-label: "The Future Mono", "JetBrains Mono", ui-monospace, monospace;
--font-mono: "The Future Mono", "JetBrains Mono", ui-monospace, monospace;
--display-weight: 340;
--display-optical: 144;
--display-style: normal;
--display-soft: 20;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-md: 1.125rem;
--text-lg: 1.375rem;
--text-xl: 1.75rem;
--text-2xl: 2.25rem;
--text-3xl: 2.75rem;
--text-display: clamp(3rem, 5.5vw + 1rem, 5.75rem);
--text-display-s: clamp(2rem, 3vw + 1rem, 3rem);
--lh-tight: 1.02;
--lh-snug: 1.18;
--lh-normal: 1.45;
--lh-relaxed: 1.6;
--tracking-display: -0.025em;
--tracking-tight: -0.01em;
--tracking-normal: 0;
--tracking-label: 0.12em;
--space-3xs: 0.125rem;
--space-2xs: 0.25rem;
--space-xs: 0.5rem;
--space-sm: 0.75rem;
--space-md: 1rem;
--space-lg: 1.5rem;
--space-xl: 2.5rem;
--space-2xl: 4rem;
--space-3xl: 6.5rem;
--space-4xl: 10rem;
--space-5xl: 13rem;
--section-gap: 6.5rem;
--section-head-gap: 1.5rem;
--page-max: 76rem;
--page-gutter: clamp(1.25rem, 4vw, 3rem);
--measure: 62ch;
--rule-hair: 0.5px;
--rule-fine: 1px;
/* Component shape — square by default; per-theme overrides below.
The radius / border-weight choice is part of each theme's voice:
editorial themes stay square (Specimen, Newsprint, Salon, Linen),
technical themes stay square (Almanac, Midnight, Terminal),
brutalist themes get heavier borders (Brutal, Manifesto),
soft themes get rounded corners (Pastel, Garden, Studio, Quiet). */
--radius-card: 0; /* .code, .tell cards, .install__body */
--radius-pill: 0; /* CTAs, dot indicators, badges */
--radius-input: 0; /* form fields, single-line code blocks */
--rule-card: 1px; /* card border thickness */
--shadow-card: none; /* card depth — most themes have no shadow */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--ease-in: cubic-bezier(0.7, 0, 0.84, 0);
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
--dur-micro: 120ms;
--dur-short: 220ms;
--dur-long: 420ms;
--z-base: 1;
--z-raised: 10;
--z-dropdown: 100;
--z-sticky: 200;
--z-modal: 400;
--z-toast: 500;
--z-tooltip: 600;
}
/* ──────────────────────────────────────────────────────────────
MIDNIGHT — deep cool charcoal · technical
Paper: cool dark blue-tinted (was warm; now cool for stronger
differentiation from the warm-paper themes)
────────────────────────────────────────────────────────────── */
[data-theme="midnight"] {
--color-paper: oklch(15% 0.022 250);
--color-paper-2: oklch(20% 0.024 250);
--color-paper-3: oklch(25% 0.026 250);
--color-rule: oklch(33% 0.024 245);
--color-rule-2: oklch(48% 0.020 240);
--color-muted: oklch(60% 0.018 240);
--color-neutral: oklch(72% 0.014 235);
--color-ink-2: oklch(86% 0.010 230);
--color-ink: oklch(95% 0.008 230);
--color-accent: oklch(72% 0.16 220);
--color-accent-ink: oklch(72% 0.16 220);
--color-focus: oklch(72% 0.16 220);
--font-display: "The Future", "Futura", "Avenir Next", ui-sans-serif, sans-serif;
--font-body: "The Future", "Söhne", ui-sans-serif, sans-serif;
--font-serif: "Instrument Serif", ui-serif, Georgia, serif;
--font-label: "The Future Mono", "JetBrains Mono", ui-monospace, monospace;
--font-mono: "The Future Mono", "JetBrains Mono", ui-monospace, monospace;
--display-weight: 300;
--display-optical: 144;
--display-soft: 0;
--text-display: clamp(2.75rem, 5vw + 1rem, 5.25rem);
--text-display-s: clamp(1.75rem, 2.5vw + 1rem, 2.75rem);
--tracking-display: -0.03em;
--tracking-label: 0.16em;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
--measure: 60ch;
}
/* ──────────────────────────────────────────────────────────────
BRUTAL — stark white · heavy condensed · bright red
────────────────────────────────────────────────────────────── */
[data-theme="brutal"] {
--color-paper: oklch(98% 0.001 0);
--color-paper-2: oklch(95% 0.002 0);
--color-paper-3: oklch(91% 0.003 0);
--color-rule: oklch(12% 0.005 0);
--color-rule-2: oklch(8% 0.005 0);
--color-muted: oklch(38% 0.005 0);
--color-neutral: oklch(22% 0.005 0);
--color-ink-2: oklch(12% 0.005 0);
--color-ink: oklch(8% 0.005 0);
--color-accent: #E63946;
--color-accent-ink: oklch(58% 0.24 25);
--color-focus: #E63946;
--font-display: "Space Grotesk", "GT America", ui-sans-serif, sans-serif;
--font-body: "Space Grotesk", "The Future", ui-sans-serif, sans-serif;
--font-serif: "Space Grotesk", ui-sans-serif, sans-serif;
--font-label: "JetBrains Mono", ui-monospace, monospace;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
--display-weight: 700;
--display-soft: 0;
--text-display: clamp(3.5rem, 8vw + 1rem, 8rem);
--text-display-s: clamp(2.25rem, 4vw + 1rem, 3.75rem);
--text-2xl: 2.75rem;
--text-xl: 2rem;
--text-lg: 1.5rem;
--tracking-display: -0.045em;
--tracking-tight: -0.02em;
--tracking-label: 0.04em;
--lh-tight: 0.94;
--lh-snug: 1.08;
--section-gap: 5.5rem;
--section-head-gap: 1.25rem;
--rule-hair: 1px;
--rule-fine: 3px;
--measure: 58ch;
}
/* ──────────────────────────────────────────────────────────────
GARDEN — pale sage · italic serif · rose accent
Pushed greener and slightly cooler from previous version
────────────────────────────────────────────────────────────── */
[data-theme="garden"] {
--color-paper: oklch(95% 0.030 130);
--color-paper-2: oklch(92% 0.034 130);
--color-paper-3: oklch(87% 0.038 130);
--color-rule: oklch(78% 0.030 130);
--color-rule-2: oklch(64% 0.034 135);
--color-muted: oklch(50% 0.045 150);
--color-neutral: oklch(36% 0.055 155);
--color-ink-2: oklch(28% 0.055 158);
--color-ink: oklch(22% 0.060 160);
--color-accent: #B6485E;
--color-accent-ink: oklch(55% 0.14 18);
--color-focus: #B6485E;
--font-display: "Cormorant Garamond", "Instrument Serif", "Fraunces", ui-serif, Georgia, serif;
--font-body: "The Future", "Söhne", ui-sans-serif, sans-serif;
--font-serif: "Cormorant Garamond", "Instrument Serif", ui-serif, Georgia, serif;
--font-label: "The Future Mono", ui-monospace, monospace;
--font-mono: "The Future Mono", ui-monospace, monospace;
--display-weight: 400;
--display-style: italic;
--display-optical: 96;
--display-soft: 0;
--text-display: clamp(3.25rem, 6vw + 1rem, 6.5rem);
--text-display-s: clamp(2.25rem, 3.5vw + 1rem, 3.5rem);
--tracking-display: -0.012em;
--tracking-tight: -0.005em;
--tracking-label: 0.10em;
--lh-tight: 1.05;
--lh-snug: 1.22;
--section-gap: 6.5rem;
--section-head-gap: 1.5rem;
--measure: 58ch;
}
/* ──────────────────────────────────────────────────────────────
ATELIER — luxury fashion-house
Cool cream paper (low chroma so it reads "considered" not "warm")
+ dark warm-brown ink + Playfair Display 900 (Didone-feel)
────────────────────────────────────────────────────────────── */
[data-theme="atelier"] {
--color-paper: oklch(94% 0.005 60);
--color-paper-2: oklch(91% 0.006 60);
--color-paper-3: oklch(87% 0.008 55);
--color-rule: oklch(78% 0.006 55);
--color-rule-2: oklch(56% 0.008 50);
--color-muted: oklch(46% 0.010 50);
--color-neutral: oklch(28% 0.014 45);
--color-ink-2: oklch(18% 0.020 40);
--color-ink: oklch(12% 0.024 40);
--color-accent: oklch(22% 0.060 40);
--color-accent-ink: oklch(45% 0.13 60);
--color-focus: oklch(45% 0.13 60);
--font-display: "Playfair Display", "Cormorant Garamond", "Tiempos Headline", ui-serif, Georgia, serif;
--font-body: "Hanken Grotesk", "The Future", ui-sans-serif, sans-serif;
--font-serif: "Playfair Display", "Cormorant Garamond", ui-serif, Georgia, serif;
--font-label: "IBM Plex Mono", ui-monospace, monospace;
--font-mono: "IBM Plex Mono", ui-monospace, monospace;
--display-weight: 900;
--display-optical: 144;
--display-style: normal;
--display-soft: 0;
--text-display: clamp(3.75rem, 7vw + 1rem, 7.5rem);
--text-display-s: clamp(2.5rem, 4vw + 1rem, 4rem);
--tracking-display: -0.018em;
--tracking-tight: -0.008em;
--tracking-label: 0.24em;
--lh-tight: 1.0;
--lh-snug: 1.16;
--lh-normal: 1.55;
--lh-relaxed: 1.7;
--section-gap: 6.5rem;
--section-head-gap: 1.75rem;
--measure: 56ch;
--page-max: 64rem;
}
/* ──────────────────────────────────────────────────────────────
NEWSPRINT — broadsheet · salmon-pink paper · burgundy accent
FT-inspired pink (real)
────────────────────────────────────────────────────────────── */
[data-theme="newsprint"] {
--color-paper: oklch(92% 0.045 50);
--color-paper-2: oklch(89% 0.050 50);
--color-paper-3: oklch(84% 0.054 45);
--color-rule: oklch(68% 0.030 40);
--color-rule-2: oklch(35% 0.020 35);
--color-muted: oklch(46% 0.022 35);
--color-neutral: oklch(30% 0.025 30);
--color-ink-2: oklch(20% 0.030 28);
--color-ink: oklch(15% 0.030 25);
--color-accent: oklch(32% 0.10 28);
--color-accent-ink: oklch(45% 0.13 30);
--color-focus: oklch(48% 0.18 30);
--font-display: "Playfair Display", "Crimson Pro", "Newsreader", ui-serif, Georgia, serif;
--font-body: "Crimson Pro", "Newsreader", ui-serif, Georgia, serif;
--font-serif: "Playfair Display", "Crimson Pro", ui-serif, Georgia, serif;
--font-label: "IBM Plex Sans", "The Future", ui-sans-serif, sans-serif;
--font-mono: "IBM Plex Mono", ui-monospace, monospace;
--display-weight: 700;
--display-optical: 48;
--display-style: normal;
--display-soft: 0;
--text-base: 1.0625rem;
--text-md: 1.1875rem;
--text-lg: 1.375rem;
--text-xl: 1.625rem;
--text-2xl: 2rem;
--text-display: clamp(2.75rem, 5vw + 1rem, 5rem);
--text-display-s: clamp(2rem, 3vw + 1rem, 2.875rem);
--tracking-display: -0.022em;
--tracking-tight: -0.008em;
--tracking-label: 0.06em;
--lh-normal: 1.55;
--lh-relaxed: 1.65;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
--measure: 58ch;
}
/* ──────────────────────────────────────────────────────────────
TERMINAL — phosphor CRT · monospace everywhere
────────────────────────────────────────────────────────────── */
[data-theme="terminal"] {
--color-paper: oklch(11% 0.018 145);
--color-paper-2: oklch(15% 0.022 145);
--color-paper-3: oklch(19% 0.024 145);
--color-rule: oklch(28% 0.030 140);
--color-rule-2: oklch(40% 0.050 140);
--color-muted: oklch(58% 0.090 140);
--color-neutral: oklch(68% 0.120 140);
--color-ink-2: oklch(78% 0.140 138);
--color-ink: oklch(86% 0.160 138);
--color-accent: oklch(78% 0.190 138);
--color-accent-ink: oklch(78% 0.190 138);
--color-focus: oklch(86% 0.190 138);
--font-display: "JetBrains Mono", "IBM Plex Mono", "The Future Mono", ui-monospace, monospace;
--font-body: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
--font-serif: "JetBrains Mono", ui-monospace, monospace;
--font-label: "JetBrains Mono", ui-monospace, monospace;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
--display-weight: 500;
--display-style: normal;
--text-display: clamp(2.25rem, 4vw + 1rem, 4rem);
--text-display-s: clamp(1.625rem, 2.25vw + 1rem, 2.5rem);
--text-xl: 1.5rem;
--text-2xl: 1.875rem;
--tracking-display: 0.01em;
--tracking-tight: 0;
--tracking-label: 0.18em;
--lh-tight: 1.2;
--lh-snug: 1.35;
--lh-normal: 1.55;
--section-gap: 5.5rem;
--section-head-gap: 1.25rem;
--measure: 70ch;
}
/* ──────────────────────────────────────────────────────────────
MANIFESTO — BLACK paper · ALL CAPS condensed · red colour-blocks
The opposite pole from Brutal: same red accent, inverted background.
────────────────────────────────────────────────────────────── */
[data-theme="manifesto"] {
--color-paper: oklch(10% 0.005 60);
--color-paper-2: oklch(15% 0.006 60);
--color-paper-3: oklch(20% 0.008 60);
--color-rule: oklch(28% 0.010 60);
--color-rule-2: oklch(40% 0.012 60);
--color-muted: oklch(60% 0.012 65);
--color-neutral: oklch(72% 0.010 70);
--color-ink-2: oklch(88% 0.006 80);
--color-ink: oklch(98% 0.003 90);
--color-accent: #E51A1A;
--color-accent-ink: oklch(58% 0.24 28);
--color-focus: #E51A1A;
--font-display: "Anton", "Bebas Neue", "Bricolage Grotesque", "Space Grotesk", sans-serif;
--font-body: "IBM Plex Sans", "Public Sans", "The Future", ui-sans-serif, sans-serif;
--font-serif: "Anton", "Bricolage Grotesque", sans-serif;
--font-label: "JetBrains Mono", ui-monospace, monospace;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
--display-weight: 400;
--display-optical: 96;
--display-style: normal;
--text-display: clamp(4rem, 12vw + 1rem, 13rem);
--text-display-s: clamp(2.75rem, 6vw + 1rem, 5.5rem);
--text-2xl: 3rem;
--text-xl: 2rem;
--tracking-display: 0.005em;
--tracking-tight: 0;
--tracking-label: 0.10em;
--lh-tight: 0.86;
--lh-snug: 1.0;
--section-gap: 5.5rem;
--section-head-gap: 1.25rem;
--rule-hair: 1px;
--rule-fine: 3px;
--measure: 56ch;
}
/* ──────────────────────────────────────────────────────────────
SALON — boutique apothecary · warm ivory · TYPEWRITER display
Display in mono is the key differentiator from the cream-serif themes
────────────────────────────────────────────────────────────── */
[data-theme="salon"] {
--color-paper: oklch(94% 0.030 65);
--color-paper-2: oklch(91% 0.034 65);
--color-paper-3: oklch(87% 0.038 60);
--color-rule: oklch(76% 0.028 60);
--color-rule-2: oklch(56% 0.030 55);
--color-muted: oklch(48% 0.030 50);
--color-neutral: oklch(34% 0.030 45);
--color-ink-2: oklch(28% 0.030 40);
--color-ink: oklch(22% 0.030 38);
--color-accent: oklch(40% 0.085 50);
--color-accent-ink: oklch(45% 0.10 50);
--color-focus: oklch(50% 0.12 50);
--font-display: "IBM Plex Mono", "JetBrains Mono", ui-monospace, monospace;
--font-body: "Plus Jakarta Sans", "Hanken Grotesk", "The Future", ui-sans-serif, sans-serif;
--font-serif: "Cormorant Garamond", ui-serif, Georgia, serif;
--font-label: "IBM Plex Mono", ui-monospace, monospace;
--font-mono: "IBM Plex Mono", ui-monospace, monospace;
--display-weight: 500;
--display-style: normal;
--text-display: clamp(2.25rem, 4vw + 1rem, 4rem);
--text-display-s: clamp(1.625rem, 2.5vw + 1rem, 2.5rem);
--text-xl: 1.5rem;
--text-2xl: 1.875rem;
--tracking-display: 0.005em;
--tracking-tight: 0;
--tracking-label: 0.18em;
--lh-tight: 1.18;
--lh-snug: 1.32;
--lh-normal: 1.55;
--section-gap: 6.5rem;
--section-head-gap: 1.75rem;
--measure: 52ch;
--page-max: 60rem;
}
/* ──────────────────────────────────────────────────────────────
LINEN — cool slate-grey paper · LIGHT GEOMETRIC SANS display
Repalleted from warm linen-yellow to cool slate-grey for theme variety —
the gallery had too many cream-paper themes (Specimen, Atelier, Newsprint,
Salon, Studio, Riso). Linen now sits on the cool side: low-chroma paper
at hue 220, steel-blue accent. Same fabric voice, different dye.
Sans-serif display is the key differentiator from Specimen / Atelier / Salon.
────────────────────────────────────────────────────────────── */
[data-theme="linen"] {
--color-paper: oklch(91% 0.012 220);
--color-paper-2: oklch(88% 0.014 220);
--color-paper-3: oklch(83% 0.016 215);
--color-rule: oklch(74% 0.014 215);
--color-rule-2: oklch(56% 0.020 215);
--color-muted: oklch(46% 0.020 215);
--color-neutral: oklch(34% 0.024 215);
--color-ink-2: oklch(26% 0.026 215);
--color-ink: oklch(18% 0.028 220);
--color-accent: oklch(40% 0.12 232);
--color-accent-ink: oklch(46% 0.14 232);
--color-focus: oklch(50% 0.16 232);
--font-display: "IBM Plex Sans", "Hanken Grotesk", ui-sans-serif, sans-serif;
--font-body: "IBM Plex Sans", "Hanken Grotesk", ui-sans-serif, sans-serif;
--font-serif: "Cormorant Garamond", ui-serif, Georgia, serif;
--font-label: "IBM Plex Mono", ui-monospace, monospace;
--font-mono: "IBM Plex Mono", ui-monospace, monospace;
--display-weight: 300;
--display-style: normal;
--text-display: clamp(3rem, 5.5vw + 1rem, 5.75rem);
--text-display-s: clamp(2rem, 3vw + 1rem, 3rem);
--tracking-display: -0.018em;
--tracking-tight: -0.008em;
--tracking-label: 0.16em;
--lh-tight: 1.06;
--lh-snug: 1.20;
--lh-normal: 1.55;
--lh-relaxed: 1.7;
--section-gap: 6.5rem;
--section-head-gap: 1.5rem;
--measure: 56ch;
}
/* ──────────────────────────────────────────────────────────────
ALMANAC — encyclopaedic · COOL pale paper (not warm) · slate accent
Cool hue 245 is the key differentiator from the warm-cream cluster
+ dense type · sticky labels · grid lines
────────────────────────────────────────────────────────────── */
[data-theme="almanac"] {
--color-paper: oklch(94% 0.008 245);
--color-paper-2: oklch(91% 0.010 245);
--color-paper-3: oklch(86% 0.012 240);
--color-rule: oklch(74% 0.012 240);
--color-rule-2: oklch(38% 0.018 240);
--color-muted: oklch(46% 0.014 245);
--color-neutral: oklch(28% 0.016 245);
--color-ink-2: oklch(20% 0.018 245);
--color-ink: oklch(16% 0.020 245);
--color-accent: oklch(38% 0.135 250);
--color-accent-ink: oklch(40% 0.13 250);
--color-focus: oklch(38% 0.135 250);
--font-display: "Bricolage Grotesque", "IBM Plex Sans", ui-sans-serif, sans-serif;
--font-body: "IBM Plex Sans", "The Future", ui-sans-serif, sans-serif;
--font-serif: "Newsreader", ui-serif, Georgia, serif;
--font-label: "IBM Plex Mono", ui-monospace, monospace;
--font-mono: "IBM Plex Mono", "JetBrains Mono", ui-monospace, monospace;
--display-weight: 600;
--display-optical: 48;
--display-style: normal;
--text-xs: 0.6875rem;
--text-sm: 0.8125rem;
--text-base: 0.9375rem;
--text-md: 1.0625rem;
--text-lg: 1.25rem;
--text-xl: 1.5rem;
--text-2xl: 1.875rem;
--text-display: clamp(2.25rem, 3.5vw + 1rem, 3.75rem);
--text-display-s: clamp(1.5rem, 2vw + 1rem, 2.25rem);
--tracking-display: -0.014em;
--tracking-tight: -0.005em;
--tracking-label: 0.06em;
--lh-tight: 1.1;
--lh-snug: 1.22;
--lh-normal: 1.5;
--space-xl: 2rem;
--space-2xl: 3rem;
--space-3xl: 4.5rem;
--section-gap: 5.5rem;
--section-head-gap: 1.25rem;
--measure: 64ch;
--page-max: 84rem;
}
/* ──────────────────────────────────────────────────────────────
SPORT — crisp white · italic display · burnt orange accent
────────────────────────────────────────────────────────────── */
[data-theme="sport"] {
--color-paper: oklch(98% 0.003 250);
--color-paper-2: oklch(95% 0.005 250);
--color-paper-3: oklch(91% 0.007 250);
--color-rule: oklch(78% 0.008 250);
--color-rule-2: oklch(36% 0.060 255);
--color-muted: oklch(50% 0.020 250);
--color-neutral: oklch(30% 0.040 255);
--color-ink-2: oklch(22% 0.060 258);
--color-ink: oklch(16% 0.080 260);
--color-accent: oklch(58% 0.190 35);
--color-accent-ink: oklch(54% 0.20 35);
--color-focus: oklch(58% 0.190 35);
--font-display: "Bricolage Grotesque", "Space Grotesk", ui-sans-serif, sans-serif;
--font-body: "Plus Jakarta Sans", "Hanken Grotesk", "The Future", ui-sans-serif, sans-serif;
--font-serif: "Bricolage Grotesque", ui-sans-serif, sans-serif;
--font-label: "JetBrains Mono", ui-monospace, monospace;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
--display-weight: 700;
--display-style: italic;
--display-optical: 96;
--text-display: clamp(3.5rem, 8vw + 1rem, 8.5rem);
--text-display-s: clamp(2.25rem, 4vw + 1rem, 4rem);
--text-2xl: 2.5rem;
--text-xl: 1.875rem;
--tracking-display: -0.04em;
--tracking-tight: -0.018em;
--tracking-label: 0.10em;
--lh-tight: 0.94;
--lh-snug: 1.06;
--section-gap: 5.5rem;
--section-head-gap: 1.25rem;
--rule-hair: 1px;
--rule-fine: 2px;
--measure: 58ch;
}
/* ──────────────────────────────────────────────────────────────
STUDIO — modern editorial agency · Fraunces italic display
Inspiration: 14islands, Mathieu Triay, Frame, Gretel, contemporary
studio portfolios in 2026. Forest-green accent — uncommon, distinctive.
Fraunces is a variable serif with conventional italic letterforms;
used here at high optical size + soft axis for the editorial agency feel.
Repalleted: paper shifts from warm-cream to cool-grey (hue 200, very low
chroma) so Studio's italic-Fraunces + forest-green accent reads against
a calm, scientific surface — like a research-studio rather than a
warm-bohemian-studio. The green accent is the identity, not the paper.
────────────────────────────────────────────────────────────── */
[data-theme="studio"] {
--color-paper: oklch(96.5% 0.005 200);
--color-paper-2: oklch(93.5% 0.007 200);
--color-paper-3: oklch(89% 0.010 200);
--color-rule: oklch(82% 0.008 200);
--color-rule-2: oklch(68% 0.010 200);
--color-muted: oklch(48% 0.012 205);
--color-neutral: oklch(34% 0.016 205);
--color-ink-2: oklch(22% 0.020 205);
--color-ink: oklch(13% 0.024 205);
--color-accent: oklch(46% 0.140 145);
--color-accent-ink: oklch(46% 0.140 145);
--color-focus: oklch(46% 0.140 145);
--font-display: "Fraunces", "Tiempos", ui-serif, Georgia, serif;
--font-body: "Geist", "Söhne", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Fraunces", ui-serif, Georgia, serif;
--font-label: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
--display-weight: 400;
--display-optical: 144;
--display-style: italic;
--display-soft: 30;
--text-display: clamp(3.5rem, 7vw + 1rem, 7.5rem);
--text-display-s: clamp(2.25rem, 4vw + 1rem, 4.25rem);
--tracking-display: -0.022em;
--tracking-label: 0.08em;
--section-gap: 6.5rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
PASTEL — post-Linear soft tech · Geist sans, lavender paper
Inspiration: Linear (2025-26), Resend, Cron, Raycast, Vercel light.
The dev-tool aesthetic, but soft instead of stark.
────────────────────────────────────────────────────────────── */
[data-theme="pastel"] {
/* Cool near-white paper — distinguishes from Plume's warm cream.
The "design-tool" register: cool ground, low-chroma indigo, soft
surfaces. No more overlap with the warm-soft register. */
--color-paper: oklch(98% 0.008 240);
--color-paper-2: oklch(96% 0.010 240);
--color-paper-3: oklch(93% 0.012 240);
--color-rule: oklch(88% 0.012 240);
--color-rule-2: oklch(76% 0.014 240);
--color-muted: oklch(52% 0.018 250);
--color-neutral: oklch(40% 0.022 255);
--color-ink-2: oklch(28% 0.025 260);
--color-ink: oklch(20% 0.028 265);
--color-accent: oklch(54% 0.110 282); /* slightly lower chroma indigo */
--color-accent-ink: oklch(98% 0.008 240);
--color-focus: oklch(54% 0.110 282);
--font-display: "Geist", "Söhne", ui-sans-serif, system-ui, sans-serif;
--font-body: "Geist", "Söhne", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Newsreader", ui-serif, Georgia, serif;
--font-label: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
--display-weight: 600;
--display-style: normal;
--text-display: clamp(3rem, 5.5vw + 1rem, 6rem);
--text-display-s: clamp(2rem, 3vw + 1rem, 3.25rem);
--tracking-display: -0.035em;
--tracking-tight: -0.012em;
--tracking-label: 0.04em;
--lh-tight: 0.96;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
RISO — risograph print · Bricolage display, off-register
Inspiration: Are.na, e-flux, Frieze, indie magazine sites.
Warm peach paper, riso cyan + yellow as accents, slight CMYK
misregistration on display via text-shadow.
────────────────────────────────────────────────────────────── */
[data-theme="riso"] {
--color-paper: oklch(91% 0.034 30);
--color-paper-2: oklch(87% 0.040 30);
--color-paper-3: oklch(82% 0.046 30);
--color-rule: oklch(70% 0.040 30);
--color-rule-2: oklch(56% 0.060 30);
--color-muted: oklch(46% 0.060 30);
--color-neutral: oklch(34% 0.060 30);
--color-ink-2: oklch(22% 0.060 30);
--color-ink: oklch(18% 0.060 30);
--color-accent: oklch(58% 0.170 220); /* riso cyan/teal */
--color-accent-2: oklch(78% 0.180 95); /* riso yellow */
--color-accent-ink: oklch(58% 0.170 220);
--color-focus: oklch(58% 0.170 220);
--font-display: "Bricolage Grotesque", "Inter Tight", system-ui, sans-serif;
--font-body: "Newsreader", "Tiempos", ui-serif, Georgia, serif;
--font-serif: "Newsreader", ui-serif, Georgia, serif;
--font-label: "Bricolage Grotesque", ui-monospace, monospace;
--font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
--display-weight: 800;
--display-style: normal;
--text-display: clamp(3.25rem, 7vw + 1rem, 7.25rem);
--text-display-s: clamp(2.25rem, 3.5vw + 1rem, 3.75rem);
--tracking-display: -0.04em;
--tracking-tight: -0.014em;
--tracking-label: 0.06em;
--lh-tight: 0.92;
--lh-snug: 1.10;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
QUIET — restraint as the design · system fonts, near-white paper
The opposite of every other theme. Average-sized headers (smaller
than the others), generous whitespace, no chromatic accent, no
ornament, no reveal. System-native typography is the design — a
deliberate exception to Hallmark's "pair distinctive display + body"
rule. The brief is restraint; the design honours it.
────────────────────────────────────────────────────────────── */
[data-theme="quiet"] {
--color-paper: oklch(100% 0 0); /* pure white */
--color-paper-2: oklch(98.5% 0 0); /* card surface */
--color-paper-3: oklch(96% 0 0); /* hover surface */
--color-rule: oklch(91% 0 0); /* hairline */
--color-rule-2: oklch(82% 0 0); /* prominent border */
--color-muted: oklch(55% 0 0);
--color-neutral: oklch(40% 0 0);
--color-ink-2: oklch(28% 0 0);
--color-ink: oklch(15% 0 0); /* near-black */
--color-accent: oklch(15% 0 0); /* mono — accent IS ink */
--color-accent-ink: oklch(15% 0 0);
--color-focus: oklch(60% 0.10 240); /* a single tiny blue for keyboard focus only */
--font-display: "Geist", "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
--font-body: "Geist", "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
--font-serif: ui-serif, Georgia, "Times New Roman", serif;
--font-label: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
--font-mono: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
--display-weight: 500;
--display-style: normal;
/* A confident, large display — minimalism with conviction, not timidity. */
--text-display: clamp(2.5rem, 5vw + 0.5rem, 4.75rem);
--text-display-s: clamp(2rem, 3vw + 0.5rem, 3rem);
--text-2xl: clamp(1.75rem, 2vw + 0.5rem, 2.5rem);
--text-xl: 1.5rem;
--text-lg: 1.25rem;
--tracking-display: -0.025em;
--tracking-tight: -0.015em;
--tracking-label: 0.04em;
--lh-tight: 1.08;
--lh-snug: 1.25;
--lh-normal: 1.55;
--lh-relaxed: 1.7;
/* Generous whitespace — the page breathes */
--section-gap: 6.5rem;
--section-head-gap: 1.5rem;
--space-2xl: 4.5rem;
--space-3xl: 7rem;
--space-4xl: 11rem;
--measure: 64ch;
}
/* ──────────────────────────────────────────────────────────────
BLOOM — atmospheric dark · warm radial bloom · expressive
For the "AI-creative product" page (think Suno, Runway, music
tools). Dark canvas, two soft colour blooms behind the content,
confident sans display, single warm accent. The first non-print
theme in the catalog.
────────────────────────────────────────────────────────────── */
[data-theme="bloom"] {
--color-paper: oklch(8% 0.012 35); /* near-black, hint warm */
--color-paper-2: oklch(11% 0.014 35); /* elevated surface */
--color-paper-3: oklch(14% 0.018 38); /* hover / inset */
--color-rule: oklch(22% 0.018 38);
--color-rule-2: oklch(34% 0.022 40);
--color-muted: oklch(58% 0.018 40);
--color-neutral: oklch(74% 0.012 40);
--color-ink-2: oklch(86% 0.008 40);
--color-ink: oklch(98% 0.005 40);
--color-accent: oklch(72% 0.190 45); /* warm orange/amber */
--color-accent-ink: oklch(72% 0.190 45);
--color-accent-2: oklch(64% 0.220 18); /* secondary pink/red bloom */
--color-focus: oklch(72% 0.190 45);
--font-display: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-body: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Instrument Serif", ui-serif, Georgia, serif;
--font-label: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
--font-mono: "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
--display-weight: 600;
--display-style: normal;
--text-display: clamp(3rem, 6vw + 1rem, 6rem);
--text-display-s: clamp(2rem, 3vw + 1rem, 3.5rem);
--tracking-display: -0.035em;
--tracking-tight: -0.02em;
--tracking-label: 0.10em;
--lh-tight: 1.04;
--lh-snug: 1.18;
--section-gap: 6.5rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
CORAL — modern-minimal · warm-grey paper · single coral accent
The "Stripe-not-Linear" register. Geist + General Sans. Pill CTAs,
warm greys instead of pure neutral. The accent is restrained — a
coral mark, not a flood.
────────────────────────────────────────────────────────────── */
[data-theme="coral"] {
--color-paper: oklch(96.5% 0.005 50);
--color-paper-2: oklch(94% 0.006 50);
--color-paper-3: oklch(91% 0.008 50);
--color-rule: oklch(86% 0.008 50);
--color-rule-2: oklch(72% 0.010 50);
--color-muted: oklch(52% 0.012 50);
--color-neutral: oklch(38% 0.012 45);
--color-ink-2: oklch(28% 0.012 40);
--color-ink: oklch(20% 0.010 35);
--color-accent: oklch(64% 0.165 28); /* warm coral */
--color-accent-ink: oklch(98% 0.005 50);
--color-focus: oklch(64% 0.165 28);
--font-display: "Geist", "General Sans", ui-sans-serif, system-ui, sans-serif;
--font-body: "Geist", "General Sans", ui-sans-serif, system-ui, sans-serif;
--font-serif: ui-serif, Georgia, serif;
--font-label: "Geist Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", ui-monospace, monospace;
--display-weight: 600;
--display-style: normal;
--text-display: clamp(2.5rem, 5vw + 0.5rem, 4.5rem);
--text-display-s: clamp(2rem, 3vw + 0.5rem, 3rem);
--tracking-display: -0.025em;
--tracking-tight: -0.015em;
--tracking-label: 0.05em;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
VIOLET — modern-minimal · near-white + near-black · quiet violet
The Linear voice without copying it. Tight Geist, restrained ink,
one quiet violet accent on focus + small marks.
────────────────────────────────────────────────────────────── */
[data-theme="violet"] {
--color-paper: oklch(99% 0.003 280);
--color-paper-2: oklch(97% 0.004 280);
--color-paper-3: oklch(94% 0.005 280);
--color-rule: oklch(90% 0.006 280);
--color-rule-2: oklch(78% 0.008 280);
--color-muted: oklch(50% 0.012 280);
--color-neutral: oklch(36% 0.014 280);
--color-ink-2: oklch(28% 0.018 280);
--color-ink: oklch(14% 0.015 280);
--color-accent: oklch(58% 0.16 285); /* quiet violet */
--color-accent-ink: oklch(99% 0.003 280);
--color-focus: oklch(58% 0.16 285);
--font-display: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-body: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-serif: ui-serif, Georgia, serif;
--font-label: "Geist Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", ui-monospace, monospace;
--display-weight: 600;
--display-style: normal;
--text-display: clamp(2.5rem, 5.5vw + 0.5rem, 5rem);
--text-display-s: clamp(2rem, 3vw + 0.5rem, 3rem);
--tracking-display: -0.035em;
--tracking-tight: -0.02em;
--tracking-label: 0.04em;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
AURORA — atmospheric · cool blue-green gradient on near-black
The Linear/Vercel-after-dark register. Sentient body, single cyan
accent, two cool blooms behind the content (cyan + teal-green).
────────────────────────────────────────────────────────────── */
[data-theme="aurora"] {
--color-paper: oklch(11% 0.025 200); /* dark cool, cyan tilt */
--color-paper-2: oklch(15% 0.028 200);
--color-paper-3: oklch(18% 0.030 200);
--color-rule: oklch(28% 0.022 200);
--color-rule-2: oklch(38% 0.024 200);
--color-muted: oklch(60% 0.018 200);
--color-neutral: oklch(74% 0.014 200);
--color-ink-2: oklch(82% 0.012 200);
--color-ink: oklch(96% 0.010 200);
--color-accent: oklch(72% 0.170 200); /* cyan */
--color-accent-ink: oklch(11% 0.025 200);
--color-accent-2: oklch(64% 0.150 175); /* secondary teal-green */
--color-focus: oklch(72% 0.170 200);
--font-display: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-body: "Sentient", "Geist", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Sentient", ui-serif, Georgia, serif;
--font-label: "Geist Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", ui-monospace, monospace;
--display-weight: 600;
--display-style: normal;
--text-display: clamp(3rem, 6vw + 1rem, 5.75rem);
--text-display-s: clamp(2rem, 3vw + 1rem, 3.5rem);
--tracking-display: -0.035em;
--tracking-tight: -0.02em;
--tracking-label: 0.10em;
--lh-tight: 1.05;
--lh-snug: 1.18;
--section-gap: 6.5rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
HALO — atmospheric · neutral charcoal canvas · warm-amber bloom
only around the hero. Less Suno, more "tool you actually work in."
The bloom is a single moment near the top; the rest of the page
is content-led on charcoal.
────────────────────────────────────────────────────────────── */
[data-theme="halo"] {
--color-paper: oklch(13% 0.005 60); /* neutral charcoal, hint warm */
--color-paper-2: oklch(17% 0.006 60);
--color-paper-3: oklch(22% 0.008 60);
--color-rule: oklch(28% 0.008 60);
--color-rule-2: oklch(38% 0.010 60);
--color-muted: oklch(58% 0.010 60);
--color-neutral: oklch(72% 0.010 60);
--color-ink-2: oklch(80% 0.008 60);
--color-ink: oklch(94% 0.005 60);
--color-accent: oklch(74% 0.16 70); /* warm amber */
--color-accent-ink: oklch(13% 0.005 60);
--color-focus: oklch(74% 0.16 70);
--font-display: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-body: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Instrument Serif", ui-serif, Georgia, serif;
--font-label: "Geist Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", ui-monospace, monospace;
--display-weight: 600;
--display-style: normal;
--text-display: clamp(2.75rem, 5vw + 1rem, 5rem);
--text-display-s: clamp(2rem, 3vw + 0.5rem, 3rem);
--tracking-display: -0.03em;
--tracking-tight: -0.018em;
--tracking-label: 0.08em;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
PLUME — playful · warm cream paper · tinted bands
Closer to actual playful than Pastel. Warm cream throughout,
alternating paper-2 bands on sections, hover-lift on cards, soft
rose accent. The page wants to feel friendly without being twee.
────────────────────────────────────────────────────────────── */
[data-theme="plume"] {
--color-paper: oklch(96% 0.020 70); /* warm cream */
--color-paper-2: oklch(94% 0.026 70); /* tinted band */
--color-paper-3: oklch(91% 0.030 70);
--color-rule: oklch(82% 0.022 70);
--color-rule-2: oklch(70% 0.024 70);
--color-muted: oklch(50% 0.022 60);
--color-neutral: oklch(36% 0.020 55);
--color-ink-2: oklch(30% 0.018 55);
--color-ink: oklch(22% 0.015 50);
--color-accent: oklch(68% 0.130 18); /* soft rose-pink */
--color-accent-ink: oklch(96% 0.020 70);
--color-focus: oklch(68% 0.130 18);
--font-display: "Bricolage Grotesque", "Geist", ui-sans-serif, system-ui, sans-serif;
--font-body: "Geist", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Newsreader", ui-serif, Georgia, serif;
--font-label: "Geist Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", ui-monospace, monospace;
--display-weight: 700;
--display-style: normal;
--text-display: clamp(2.75rem, 5vw + 0.75rem, 5rem);
--text-display-s: clamp(2rem, 3vw + 0.5rem, 3rem);
--tracking-display: -0.025em;
--tracking-tight: -0.012em;
--tracking-label: 0.06em;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
}
/* ──────────────────────────────────────────────────────────────
PER-THEME COMPONENT SHAPE — radius, border weight, shadow.
Defaults (in :root above): square edges, 1 px border, no shadow.
These overrides give each theme its own component voice without
touching colour or typography.
The discipline: editorial / brutalist / technical themes stay
square (the rule is the design); soft / modern themes get
measured radius (Pastel 12 px is the most rounded — it's the
post-Linear theme); brutalist / declarative themes get heavier
borders. Nothing is rounded "for fun".
────────────────────────────────────────────────────────────── */
[data-theme="brutal"] { --rule-card: 2px; }
[data-theme="manifesto"] { --rule-card: 2px; }
[data-theme="sport"] { --rule-card: 1.5px; }
[data-theme="garden"] { --radius-card: 6px; --radius-pill: 4px; }
[data-theme="studio"] { --radius-card: 6px; --radius-pill: 4px; --shadow-card: 0 1px 2px oklch(20% 0.014 205 / 0.05); }
[data-theme="pastel"] { --radius-card: 12px; --radius-pill: 999px; --radius-input: 8px;
--shadow-card: 0 8px 24px -10px oklch(50% 0.13 282 / 0.14); }
[data-theme="riso"] { --radius-card: 2px; --radius-pill: 2px; }
[data-theme="quiet"] { --radius-card: 8px; --radius-pill: 999px; --radius-input: 8px; }
[data-theme="bloom"] { --radius-card: 16px; --radius-pill: 999px; --radius-input: 12px;
--shadow-card: 0 24px 48px -16px oklch(8% 0.04 35 / 0.6),
0 1px 2px oklch(8% 0.04 35 / 0.4); }
[data-theme="coral"] { --radius-card: 8px; --radius-pill: 999px; --radius-input: 6px;
--shadow-card: 0 1px 2px oklch(20% 0.01 50 / 0.06); }
[data-theme="violet"] { --radius-card: 6px; --radius-pill: 999px; --radius-input: 6px; }
[data-theme="aurora"] { --radius-card: 12px; --radius-pill: 999px; --radius-input: 10px;
--shadow-card: 0 16px 40px -16px oklch(11% 0.04 200 / 0.65),
0 1px 2px oklch(11% 0.04 200 / 0.4); }
[data-theme="halo"] { --radius-card: 8px; --radius-pill: 6px; --radius-input: 6px;
--shadow-card: 0 8px 22px -12px oklch(13% 0.02 60 / 0.5); }
[data-theme="plume"] { --radius-card: 14px; --radius-pill: 999px; --radius-input: 10px;
--shadow-card: 0 10px 28px -12px oklch(45% 0.10 18 / 0.16); }
[data-theme="editorial"] { --radius-card: 0; --radius-pill: 0; --radius-input: 0; --rule-card: 0.5px; }
/* ──────────────────────────────────────────────────────────────
EDITORIAL — open-design-inspired editorial premium · the 23rd theme
Warm cream paper + coral accent + Inter Tight display with
Playfair Display italic emphasis inside. Magazine-shaped: hairline
rules, asymmetric grids, Roman-numeral marginalia, 2-axis serif/sans
pairing. Inspired by github.com/nexu-io/open-design.
────────────────────────────────────────────────────────────── */
[data-theme="editorial"] {
--color-paper: oklch(94% 0.020 75); /* warm cream, slightly cooler than Specimen */
--color-paper-2: oklch(91% 0.022 72); /* card backs */
--color-paper-3: oklch(87% 0.024 70); /* dark-slab fallback */
--color-rule: oklch(80% 0.018 70); /* hairlines */
--color-rule-2: oklch(64% 0.014 68);
--color-muted: oklch(48% 0.014 60);
--color-neutral: oklch(34% 0.012 55);
--color-ink-2: oklch(28% 0.014 55);
--color-ink: oklch(15% 0.014 280); /* near-black with cool tilt */
--color-accent: oklch(60% 0.160 35); /* coral */
--color-accent-ink: oklch(98% 0.005 70);
--color-focus: oklch(62% 0.160 35);
--font-display: "Inter Tight", "Inter", ui-sans-serif, system-ui, sans-serif;
--font-body: "Inter", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Playfair Display", "Fraunces", ui-serif, Georgia, serif;
--font-label: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
--font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
--display-weight: 800;
--display-style: normal;
--text-display: clamp(2.5rem, 5vw + 0.75rem, 4.75rem);
--text-display-s: clamp(1.875rem, 3vw + 0.5rem, 2.875rem);
--tracking-display: -0.04em; /* tight, magazine-shaped */
--tracking-tight: -0.018em;
--tracking-label: 0.10em;
--section-gap: 6rem;
--section-head-gap: 1.5rem;
}