/* Legacy token sheet · structural scale + orphan colours · 2026-09-25 * * The active colour palette lives in src/app/refactor.css (:root and .dark, * "morning light" warm skin); this file keeps the structural scale (type, * space, radius, motion) and now only owns the colour tokens refactor.css * does not redefine: sky, blue-wash, overlay-ink, and the print family, plus * a warm legacy fallback for everything else. Token names are contract — the * MUI bridge (scripts/gen-mui-tokens.mjs -> src/theme/site-tokens.json) * reads blue-wash and sky by name, so names may never be removed here. * Values follow the morning-light warm axis: 85-92 paper family, 48-55 ink * and clay, 78 honey, 150 sage, 25 danger. */ :root { --color-paper: oklch(97% 0.007 250); --color-paper-strong: oklch(99.4% 0.003 250); --color-ink: oklch(24% 0.042 252); --color-night: oklch(18% 0.034 252); --color-night-ink: oklch(93.5% 0.012 245); --color-accent: oklch(44% 0.132 255); --color-accent-ink: oklch(98.6% 0.005 250); --color-accent-soft: oklch(90.5% 0.048 255); --color-teal: oklch(52% 0.088 205); --color-teal-soft: oklch(90% 0.034 205); --color-signal: oklch(74% 0.115 78); --color-signal-ink: oklch(26% 0.045 75); --color-sky: oklch(85% 0.05 80); --color-muted: oklch(91.5% 0.013 250); --color-muted-text: oklch(46% 0.024 252); /* The sheet: one step off the page, for a card that holds a reading and for the * bands that separate one reading from the next. It was a warm parchment tint * until this palette, which is the one thing it cannot be here -- brass has to * mean a measured value and nothing else, and a page of warm cards would spend * that meaning before the reader reaches a single number. */ --color-sheet-wash: oklch(91.5% 0.03 245); --color-sheet-surface: oklch(98.2% 0.011 245); --color-sheet-ink: oklch(45% 0.06 250); --color-blue-wash: oklch(92.5% 0.03 75); --color-danger: oklch(52% 0.16 22); --color-overlay-ink: oklch(100% 0 0); --color-print-paper: oklch(100% 0 0); --color-print-ink: oklch(25% 0.03 48); --color-print-muted: oklch(44% 0.02 50); /* The four public topics need to be told apart, and the obvious way -- one hue * per topic, red for feelings, green for life -- would spend the whole palette * on a taxonomy and leave brass no longer meaning "this is the reading". So the * topics vary inside the blueprint family instead: 258, 232, 205, 188, a walk * from prussian to cyan to a cyan-green, with chroma falling as hue turns so * none of the four shouts louder than another. A cyanotype print is a * monochrome object; these are four exposures of it. */ --color-topic-self: oklch(46% 0.105 45); --color-topic-emotion: oklch(50% 0.09 25); --color-topic-relationship: oklch(51% 0.07 70); --color-topic-life: oklch(47% 0.06 140); --background: var(--color-paper); --foreground: var(--color-ink); --paper: var(--color-paper); --paper-strong: var(--color-paper-strong); --ink: var(--color-ink); --night: var(--color-night); --accent: var(--color-accent); --muted: var(--color-muted); --muted-foreground: var(--color-muted-text); --muted-text: var(--color-muted-text); --sheet-wash: var(--color-sheet-wash); --sheet-surface: var(--color-sheet-surface); --sheet-ink: var(--color-sheet-ink); --blue-wash: var(--color-blue-wash); --danger: var(--color-danger); --accent-wash: color-mix(in oklab, var(--accent) 11%, var(--paper)); --surface-contrast: var(--color-ink); --surface-contrast-ink: var(--color-paper); --teal: var(--color-teal); --teal-soft: var(--color-teal-soft); --signal: var(--color-signal); --signal-ink: var(--color-signal-ink); --sky: var(--color-sky); --topic-self: var(--color-topic-self); --topic-emotion: var(--color-topic-emotion); --topic-relationship: var(--color-topic-relationship); --topic-life: var(--color-topic-life); --line: color-mix(in oklab, var(--ink) 18%, transparent); --soft-line: color-mix(in oklab, var(--ink) 11%, transparent); --sheet-line: color-mix(in oklab, var(--sheet-ink) 22%, transparent); --border: var(--soft-line); --ring: var(--accent); /* The measuring instrument. Its parts are tokens because a quiz's progress and * a result's dimension have to read as the same object across two pages. */ --meter-track: color-mix(in oklab, var(--ink) 7%, transparent); --meter-rule: color-mix(in oklab, var(--ink) 20%, transparent); --meter-fill: var(--accent); --meter-needle: var(--signal); /* Archivo carries the display tier; it has no han glyphs, so CJK falls through * to the system faces behind it and keeps its own metrics. Body text stays on * the system stack in both scripts -- a downloaded body face would buy nothing * for the half of this product that is Chinese. */ --font-display: var(--font-archivo), "Segoe UI", "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif; --font-body: "Segoe UI", "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif; --font-code: var(--font-plex-mono), "Cascadia Code", "SFMono-Regular", Consolas, monospace; --space-3xs: 0.25rem; --space-2xs: 0.5rem; --space-xs: 0.75rem; --space-sm: 1rem; --space-md: 1.5rem; --space-lg: 2rem; --space-xl: 3rem; --space-2xl: 4.5rem; --space-3xl: 7rem; --text-2xs: 0.6875rem; --text-xs: 0.75rem; --text-sm: 0.875rem; --text-md: 1rem; --text-lg: 1.25rem; --text-xl: 1.75rem; --text-2xl: 2.5rem; --text-3xl: 3.25rem; --text-display: 4rem; /* Tracking is part of the hierarchy, not decoration: the display tier is set * tight because Archivo's Latin is wide at heavy weights, and the small * all-caps labels are opened up because 11px letters need the air. */ --tracking-display: -0.022em; --tracking-title: -0.012em; --tracking-body: 0em; --tracking-label: 0.08em; --radius-control: 0.3rem; --radius-panel: 0.5rem; --radius-media: 0.25rem; --radius-pill: 999px; --shadow-card-hover: 0 1.25rem 2.5rem color-mix(in oklab, var(--color-ink) 14%, transparent); --shadow-feedback: 0 0.875rem 2rem color-mix(in oklab, var(--color-ink) 17%, transparent); --shadow-dialog: 0 1.5rem 4rem color-mix(in oklab, var(--color-night) 26%, transparent); --ease-out: cubic-bezier(0.16, 1, 0.3, 1); --duration-short: 180ms; --duration-medium: 280ms; --layout-max: 80rem; --header-height: 4.5rem; --banner-height: 4.5rem; --shadow-soft: 0 1.25rem 2.75rem color-mix(in oklab, var(--color-ink) 11%, transparent); --shadow-lift: 0 1.75rem 3.5rem color-mix(in oklab, var(--color-ink) 16%, transparent); } .dark { --color-paper: var(--color-night); --color-paper-strong: oklch(24% 0.036 252); --color-ink: var(--color-night-ink); --color-accent: oklch(72% 0.118 250); --color-accent-ink: oklch(17% 0.038 252); --color-accent-soft: oklch(30% 0.062 252); --color-teal: oklch(75% 0.075 205); --color-teal-soft: oklch(28% 0.045 205); --color-signal: oklch(81% 0.11 80); --color-signal-ink: oklch(22% 0.035 78); --color-sky: oklch(76% 0.045 78); --color-muted: oklch(28% 0.016 55); --color-muted-text: oklch(75.5% 0.016 245); --color-sheet-wash: oklch(29% 0.038 248); --color-sheet-surface: oklch(23.5% 0.03 250); --color-sheet-ink: oklch(78% 0.055 245); --color-blue-wash: oklch(28% 0.03 60); --color-topic-self: oklch(74.5% 0.1 45); --color-topic-emotion: oklch(77% 0.09 25); --color-topic-relationship: oklch(79% 0.07 70); --color-topic-life: oklch(77.5% 0.055 140); --color-danger: oklch(74% 0.12 22); /* Light mode inverts to ink for its loudest surface. Dark mode has nothing * darker than the page to invert to, so the contrast surface becomes the * lightest layer instead and the elevation ladder stays readable: * page 18% -> cards 24% -> header, footer, panels 28%. */ --surface-contrast: oklch(28% 0.038 252); --surface-contrast-ink: var(--color-night-ink); }