/* Every value in the design system. Nothing outside this file invents one. * * Theme is an attribute on , stamped by shell/theme.js before first paint: * data-theme = "dark" | "light" (what this file reads) * data-theme-pref = "dark" | "light" | "auto" * "auto" is resolved in JS on purpose — a @media block cannot be shared across * both selectors, so the palette would be written twice and drift. */ :root { /* ── type ───────────────────────────────────────────────────────────── */ /* Bundled in app/assets/fonts. The fallbacks matter: they are what shows * while the woff2 loads, and what shows if a file ever goes missing. */ --font-ui: "Inter", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif; --font-display: "Inter Tight", "Inter", system-ui, -apple-system, sans-serif; --font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; /* display steps */ --fs-d1: 56px; --lh-d1: 1; --fs-d2: 40px; --lh-d2: 1; --fs-d3: 28px; --lh-d3: 1.15; /* text steps (Apple HIG macOS scale — 76% of v4's sizes already sat here) */ --fs-1: 22px; --lh-1: 26px; --fs-2: 17px; --lh-2: 22px; --fs-3: 15px; --lh-3: 20px; --fs-4: 13px; --lh-4: 16px; --fs-5: 12px; --lh-5: 15px; --fs-6: 11px; --lh-6: 14px; --fs-7: 10px; --lh-7: 13px; --fs-8: 9px; --lh-8: 12px; /* v4 used 9px 26 times without naming it */ --lh-tight: 1; --lh-snug: 1.35; --lh-loose: 1.5; --fw-regular: 400; --fw-medium: 500; --fw-semibold: 600; --fw-bold: 700; /* ── spacing (2px base; covers 82% of v4's real values) ─────────────── */ --sp-0: 0; --sp-1: 2px; --sp-2: 4px; --sp-3: 6px; --sp-4: 8px; --sp-5: 10px; --sp-6: 12px; --sp-7: 16px; --sp-8: 20px; --sp-9: 24px; --sp-10: 32px; --sp-11: 40px; /* ── radius (v4 shipped 19 distinct values) ─────────────────────────── */ --r-1: 2px; --r-2: 4px; --r-3: 6px; --r-4: 8px; --r-5: 12px; --r-pill: 9999px; /* ── controls (v4 shipped 11 distinct heights) ──────────────────────── */ --ctl-h-sm: 22px; --ctl-h-md: 24px; --ctl-h-lg: 28px; --ctl-h-xl: 32px; --ctl-h-icon: 18px; --ctl-h-icon-sm: 16px; --ctl-pad-x-sm: 8px; --ctl-pad-x-md: 8px; --ctl-pad-x-lg: 10px; --ctl-pad-x-xl: 12px; --ctl-r: var(--r-3); --ctl-gap: var(--sp-3); /* ── borders & states ───────────────────────────────────────────────── */ --bw: 1px; --disabled-opacity: 0.45; /* ── motion ─────────────────────────────────────────────────────────── */ --dur-1: 120ms; --dur-2: 180ms; --dur-3: 260ms; --ease-standard: cubic-bezier(.22, .61, .36, 1); /* ── adaptive density (v4 had 8 different minmax floors) ────────────── */ --cell-thumb: 72px; --cell-card: 144px; --cell-panel: 240px; --cell-icon: 48px; /* captionless tiles: the picture is the whole cell */ /* ── layout ─────────────────────────────────────────────────────────── */ --menubar-h: 34px; /* One gutter. Every edge in the app lands on it: the space between the three regions, between two panels stacked in a column, and between a band's content and the window. Three different numbers for those three things is what makes a layout read as accidental. */ --gutter: var(--sp-5); /* Settings rows put their control in a column of this width, so every control in a list of them has the same two edges. A