/* ==========================================================================
   „Przystań” — siłownia i zajęcia z zapisami (P004, demo agencji)
   Design tokens — rebuild to the approved concept "Plakat na ścianie"
   (design/art-direction.md, design/concept.html), 2026-09-28.
   Direction: black + paper + one acid colour, huge condensed uppercase type,
   sharp 0 px shapes, diagonal cuts. Semantic token NAMES are unchanged from
   the previous system so theme.css and the plugin's markup keep working;
   only the underlying values change. Contrast checked with WCAG 2.x (script
   run in the project's chat session, see design/art-direction.md §4).
   ========================================================================== */

/* ---------- Fonts: self-hosted, latin + latin-ext (OFL, licences in fonts/licenses/) ---------- */
@font-face { font-family: "Anton"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/anton-400-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Anton"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/anton-400-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }

@font-face { font-family: "Barlow"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/barlow-400-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Barlow"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/barlow-400-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: "Barlow"; font-style: normal; font-weight: 500; font-display: swap;
  src: url("../fonts/barlow-500-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Barlow"; font-style: normal; font-weight: 500; font-display: swap;
  src: url("../fonts/barlow-500-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: "Barlow"; font-style: normal; font-weight: 600; font-display: swap;
  src: url("../fonts/barlow-600-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Barlow"; font-style: normal; font-weight: 600; font-display: swap;
  src: url("../fonts/barlow-600-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }

@font-face { font-family: "Barlow Condensed"; font-style: normal; font-weight: 500; font-display: swap;
  src: url("../fonts/barlow-condensed-500-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Barlow Condensed"; font-style: normal; font-weight: 500; font-display: swap;
  src: url("../fonts/barlow-condensed-500-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: "Barlow Condensed"; font-style: normal; font-weight: 600; font-display: swap;
  src: url("../fonts/barlow-condensed-600-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Barlow Condensed"; font-style: normal; font-weight: 600; font-display: swap;
  src: url("../fonts/barlow-condensed-600-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: "Barlow Condensed"; font-style: normal; font-weight: 700; font-display: swap;
  src: url("../fonts/barlow-condensed-700-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Barlow Condensed"; font-style: normal; font-weight: 700; font-display: swap;
  src: url("../fonts/barlow-condensed-700-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }

@font-face { font-family: "JetBrains Mono"; font-style: normal; font-weight: 500; font-display: swap;
  src: url("../fonts/jetbrains-mono-500-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "JetBrains Mono"; font-style: normal; font-weight: 500; font-display: swap;
  src: url("../fonts/jetbrains-mono-500-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: "JetBrains Mono"; font-style: normal; font-weight: 700; font-display: swap;
  src: url("../fonts/jetbrains-mono-700-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "JetBrains Mono"; font-style: normal; font-weight: 700; font-display: swap;
  src: url("../fonts/jetbrains-mono-700-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }

:root {
  color-scheme: dark;

  /* ---------- Primitive: the three surfaces (art-direction.md §4) ---------- */
  --ink: #0a0a0a;           /* black — the whole site's surface */
  --ink-hover: #1a1a1a;     /* raised black: hover rows, panels */
  --paper: #f2f2f2;         /* neutral off-white — body text on ink, and the one light block (cennik) */
  --acid: #d4ff3a;          /* the one colour: action, free seats, live */
  --acid-deep: #9fbf17;     /* acid on white when text needs more contrast */
  --acid-hover: #c2ee22;
  --acid-active: #a9d91c;
  --line: #2a2a2a;          /* hairline on black */

  /* ---------- Primitive: neutral ramp for a black surface (palette.py neutrals '#0a0a0a') ---------- */
  --neutral-0: var(--ink);
  --neutral-50: #101010;
  --neutral-100: #1c1c1c;
  --neutral-200: #2a2a2a;   /* = --line */
  --neutral-300: #3a3a3a;
  --neutral-400: #6e6e68;   /* = duotone midtone grey */
  --neutral-500: #8c8c86;
  --neutral-600: #a6a6a0;   /* 8.09:1 on ink — control borders */
  --neutral-700: #b8b8b3;   /* 9.94:1 on ink — secondary text ("grey") */
  --neutral-800: #d6d6d2;   /* 13.58:1 on ink — schedule meta emphasis */
  --neutral-900: #e8e8e5;
  --neutral-950: var(--paper);

  /* ---------- Primitive: status tones, deliberately off-acid (art-direction §4) ---------- */
  --green-bg: transparent;   --green-text: var(--acid);   --green-edge: var(--acid);        /* "wolne" reuses acid: free = action */
  --amber-bg: transparent;   --amber-text: #ffc24b;       --amber-edge: #ffc24b;             /* "ostatnie" */
  --red-bg: transparent;     --red-text: #ff6b5d;         --red-edge: #ff6b5d;               /* "odwołane" — 7.08:1 */
  --cyan-bg: transparent;    --cyan-text: #6fd3ff;        --cyan-edge: #6fd3ff;               /* "zastępstwo" — 11.73:1 */
  --violet-bg: transparent;  --violet-text: #c9a6ff;      --violet-edge: #c9a6ff;             /* lista rezerwowa — 9.79:1 */

  /* ---------- Semantic roles (template contract — same names as before the rebuild) ---------- */
  --color-background: var(--ink);
  --color-surface: var(--ink);
  --color-surface-2: var(--neutral-50);      /* highlighted band, finished classes, notice fill */
  --color-surface-3: var(--neutral-100);     /* chips, tags, neutral states */
  --color-surface-inverse: var(--ink);       /* the footer stays black; it is set apart by the acid rule, not by inverting */
  --color-text: var(--paper);                /* 17.68:1 on ink */
  --color-text-muted: var(--neutral-700);    /* 9.94:1 */
  --color-text-strong-muted: var(--neutral-800); /* 13.58:1 — schedule meta lines */
  --color-text-inverse: var(--paper);
  --color-text-inverse-muted: var(--neutral-700);
  --color-border: var(--neutral-200);        /* decorative separators, card outline */
  --color-border-strong: var(--neutral-300);
  --color-control-border: var(--neutral-600); /* inputs, chips: 8.09:1 (≥ 3) */
  --color-primary: var(--acid);              /* ink text 17.12:1 */
  --color-on-primary: var(--ink);
  --color-primary-hover: var(--acid-hover);
  --color-primary-active: var(--acid-active);
  --color-accent: var(--acid);
  --color-on-accent: var(--ink);
  --color-secondary-border: var(--paper);    /* ghost button: paper outline on black */
  --color-selected: var(--acid);             /* chosen filters, selected day: acid fill, ink text */
  --color-on-selected: var(--ink);
  --color-link: var(--acid);                 /* always underlined; 17.12:1 */
  --color-focus-ring: var(--acid);
  --color-focus-ring-inverse: var(--acid);

  --success: var(--acid);        --on-success: var(--ink); --success-text: var(--acid);       --success-bg: var(--color-surface-2);
  --warning: var(--amber-text);  --on-warning: var(--ink); --warning-text: var(--amber-text); --warning-bg: var(--color-surface-2);
  --error: var(--red-text);      --on-error: var(--ink);   --error-text: var(--red-text);     --error-bg: var(--color-surface-2);
  --info: var(--cyan-text);      --on-info: var(--ink);    --info-text: var(--cyan-text);     --info-bg: var(--color-surface-2);
  --reserve: var(--violet-text); --on-reserve: var(--ink); --reserve-text: var(--violet-text); --reserve-bg: var(--color-surface-2);

  /* ---------- Class-card states (ux-spec §6.2) — colour is never the only cue ---------- */
  /* rule unchanged: tonal text = about the class · filled chip = about YOU · dashed = "not yet" · hatch = cancelled */
  --st-open-bg: transparent;            --st-open-fg: var(--acid);               /* ST-2 wolne: acid — free seats are the hero number */
  --st-last-bg: transparent;            --st-last-fg: var(--amber-text);         /* ST-3 ostatnie */
  --st-reserve-bg: transparent;         --st-reserve-fg: var(--violet-text);     /* ST-4 lista rezerwowa */
  --st-full-bg: transparent;            --st-full-fg: var(--neutral-600);        /* ST-5/5a pełne */
  --st-notyet-border: var(--neutral-600); --st-notyet-fg: var(--neutral-700);    /* ST-1 nieotwarte (dashed) */
  --st-closed-bg: transparent;          --st-closed-fg: var(--neutral-700);      /* ST-6 zamknięte */
  --st-cancel-bg: transparent;          --st-cancel-fg: var(--red-text); --st-cancel-hatch: var(--red-text); /* ST-7 */
  --st-sub-fg: var(--cyan-text);                                                 /* ST-8 zastępstwo */
  --st-past-bg: var(--color-surface-2); --st-past-fg: var(--neutral-500);        /* ST-9 zakończone */
  --st-mine-bg: var(--acid);            --st-mine-fg: var(--ink);                /* ST-10 masz miejsce — filled acid, like a stamp */
  --st-mywait-bg: var(--violet-text);   --st-mywait-fg: var(--ink);              /* ST-11 jesteś N. na liście */
  --st-pending-border: var(--paper);    --st-pending-fg: var(--paper);           /* ST-12 potwierdź (dashed 2px) */
  --st-edge-width: 4px;
  --st-hatch: repeating-linear-gradient(135deg, var(--st-cancel-hatch) 0 4px, transparent 4px 8px);

  /* ---------- Schedule grid — the departure board ---------- */
  --sched-col-min: 10rem;
  --sched-col-gap: var(--space-2);
  --sched-col-line: var(--neutral-200);
  --sched-band-line: var(--neutral-300);
  --sched-band-label: var(--neutral-700);
  --sched-head-bg: var(--ink);
  --sched-today-bg: var(--color-surface-2);
  --sched-today-rule: var(--acid);
  --sched-now-line: var(--acid);
  --sched-empty: var(--neutral-500);
  --sched-card-pad: var(--space-3);
  --sched-card-gap: var(--space-2);

  /* ---------- Filter chips ---------- */
  --chip-h: 2.5rem;
  --chip-bg: transparent; --chip-fg: var(--paper); --chip-border: var(--neutral-600);
  --chip-hover-layer: 0.10; --chip-press-layer: 0.16;
  --chip-selected-bg: var(--acid); --chip-selected-fg: var(--ink); --chip-selected-hover: var(--acid-hover);
  --chip-disabled-fg: var(--neutral-500); --chip-disabled-border: var(--neutral-300);
  --tag-bg: var(--neutral-100); --tag-fg: var(--paper);

  /* ---------- Admin calendar — stays the WordPress admin palette (design-system §9.5) ---------- */
  --wp-text: #1d2327; --wp-text-muted: #50575e; --wp-bg: #f0f0f1; --wp-surface: #ffffff;
  --wp-border: #c3c4c7; --wp-control-border: #8c8f94;
  --wp-primary: #2271b1; --wp-primary-hover: #135e96; --wp-focus: #2271b1;
  --wp-error: #d63638; --wp-error-text: #8a2424; --wp-error-bg: #fcf0f1;
  --adm-hour-line: var(--wp-border);
  --adm-quarter-line: var(--wp-bg);
  --adm-cell-hover: #f0f6fc;
  --adm-now-line: var(--wp-error);
  --adm-selected: var(--wp-primary);
  --adm-room1-bg: #ffe6d6; --adm-room1-edge: #b0652a;
  --adm-room2-bg: #d2f3f0; --adm-room2-edge: #00908a;
  --adm-room3-bg: #eee6ff; --adm-room3-edge: #8668b6;
  --adm-room4-bg: #f2ebd1; --adm-room4-edge: #917800;
  --adm-room5-bg: #ffe2ee; --adm-room5-edge: #ae5a84;
  --adm-cancel: repeating-linear-gradient(135deg, var(--wp-error-bg) 0 6px, #ffffff 6px 12px);

  /* ---------- Typography: Anton (display) · Barlow Condensed (subtitles, nav, names) ·
     Barlow (body) · JetBrains Mono (numbers, ticker, live labels) — art-direction §3 ---------- */
  --font-display: "Anton", "Barlow Condensed", Impact, sans-serif;
  --font-condensed: "Barlow Condensed", "Barlow", "Arial Narrow", Roboto, Arial, sans-serif;
  --font-sans: "Barlow", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
  --font-heading: var(--font-condensed);
  --font-body: var(--font-sans);
  --weight-regular: 400;
  --weight-semibold: 600;
  --weight-bold: 700;
  --numeric-schedule: tabular-nums lining-nums;

  /* Small/body scale (Barlow), then a display scale copied from the concept's own clamp()s
     (design/concept.html) for h1/h2/big numbers — not reinterpreted, ported as-is in rem. */
  --step--2: 0.75rem;                                          /* 12 px — mono captions */
  --step--1: clamp(0.8125rem, 0.79rem + 0.1vw, 0.875rem);      /* 13 → 14 px — meta, mono labels */
  --step-0:  clamp(1rem, 0.965rem + 0.15vw, 1.0625rem);        /* 16 → 17 px — body text */
  --step-1:  clamp(1.125rem, 1.03rem + 0.4vw, 1.375rem);       /* 18 → 22 px — leads, small headings */
  --step-2:  clamp(1.5rem, 1.14rem + 1.6vw, 2.75rem);          /* 24 → 44 px — logo, day head, mid headings */
  --step-3:  clamp(2.75rem, 6.4vw, 6.5rem);                    /* 44 → 104 px — h2, literally concept .h2 */
  --step-4:  clamp(3.5rem, 5.8vw, 6rem);                       /* 56 → 96 px — big numbers, literally concept .p .big */
  --step-5:  clamp(4rem, 9.6vw, 8.75rem);                      /* 64 → 140 px — h1, literally concept h1.poster */
  /* 1.0, not the concept's 0.88: at poster size Anton's diacritics (Ń, Ż) need
     the room or they collide with the line above in this environment. */
  --leading-tight: 1; --leading-snug: 1; --leading-normal: 1.3; --leading-relaxed: 1.5;
  --tracking-tight: -0.005em; --tracking-caps: 0.06em;
  --measure-body: 66ch; --measure-heading: 18ch;

  /* ---------- Spacing (4 px grid, unchanged) ---------- */
  --space-0: 0; --space-0-5: 0.125rem; --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem;
  --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem; --space-8: 2rem; --space-10: 2.5rem;
  --space-12: 3rem; --space-16: 4rem; --space-20: 5rem; --space-24: 6rem; --space-32: 8rem; --space-40: 10rem;
  --space-page-x: clamp(1rem, 0.2174rem + 3.4783vw, 4rem);        /* concept --gutter: clamp(16px,4vw,64px) */
  --space-gutter: clamp(1rem, 0.8043rem + 0.8696vw, 1.5rem);
  --space-section-sm: clamp(2rem, 1.6087rem + 1.7391vw, 3rem);
  --space-section-md: clamp(3rem, 1.8261rem + 5.2174vw, 6rem);
  --space-cut: clamp(1.75rem, 1.2rem + 2.5vw, 4.5rem);            /* concept --cut: diagonal cut height */
  --space-inset-card: var(--space-6);
  --space-gap-cards: var(--space-6);
  --container-prose: 66ch; --container-form: 48rem; --container-default: 80rem; --container-wide: 90rem;

  /* ---------- Sizes ---------- */
  --control-sm: 2rem; --control-md: 2.5rem; --control-lg: 3rem; --target-min: 2.75rem;
  --icon-sm: 1rem; --icon-md: 1.25rem; --icon-lg: 1.5rem; --icon-stroke: 1.75;

  /* ---------- Shape: poster — sharp everywhere, thick strokes, no radius ---------- */
  --radius-xs: 0; --radius-sm: 0; --radius-md: 0; --radius-lg: 0; --radius-full: 9999px; /* pill kept only for round controls (switch) */
  --border-hairline: 1px; --border-strong: 2px; --border-accent: 4px;
  --focus-ring-width: 2px; --focus-ring-offset: 2px;

  /* ---------- Depth: hard offset shadow instead of soft blur (concept .btn:hover) ---------- */
  --shadow-color: 0deg 0% 0%;
  --shadow-1: 0 0 0 transparent;
  --shadow-2: 0 0 0 transparent;
  --shadow-3: 0 0 0 transparent;
  --shadow-4: 0 0 0 transparent;
  --shadow-hard: 5px 5px 0 var(--paper);
  --shadow-hard-acid: 5px 5px 0 var(--acid);
  --shadow-hard-ink: 5px 5px 0 var(--ink);
  --z-base: 0; --z-raised: 10; --z-sticky: 1100; --z-overlay: 1200; --z-modal: 1300; --z-toast: 1500;

  /* ---------- Opacity ---------- */
  --state-hover: 0.10; --state-focus: 0.14; --state-pressed: 0.16; --state-dragged: 0.24;
  --disabled-content: 0.38; --disabled-container: 0.12; --scrim: 0.6;

  /* ---------- Motion ---------- */
  --duration-instant: 100ms; --duration-fast: 150ms; --duration-panel: 200ms;
  --duration-ticker: 34s;
  --ease-standard: cubic-bezier(0.2, 0, 0, 1);
  --ease-enter: cubic-bezier(0, 0, 0, 1);
  --ease-exit: cubic-bezier(0.3, 0, 1, 1);

  /* ---------- Media ---------- */
  --ratio-hero: 4 / 3; --ratio-class: 3 / 2; --ratio-portrait: 4 / 5;
  --media-radius: var(--radius-lg);
}

@media (prefers-reduced-motion: reduce) {
  :root { --duration-instant: 0ms; --duration-fast: 0ms; --duration-panel: 0ms; --duration-ticker: 0s; }
  html { scroll-behavior: auto; }
}
@media (prefers-contrast: more) {
  :root { --color-text-muted: var(--neutral-900); --color-border: var(--neutral-500); --color-control-border: var(--neutral-800); }
}
