/* ============================================================================
   LUMIS · Daylight Grid · tokens.css
   Генерируется решателем, руками НЕ правится. Источник истины — OKLCH.
   hex в комментариях — только фолбэк (01 §2).

   Вход механизма «переодевания» (01 §0):
     preset              = P2 Grid «Сетка»            (05 §4)
     brand               = oklch(0.55 0.16 62)
     accent              = null (= brand)
     neutralHue          = 62
     neutralChromaScale  = 1.0

   Нормализация 01 §1.2:
     L9 = clamp(0.55, 0.44, 0.66) = 0.5500
     Cmax(0.55, 62) = 0.1266 → C9 = min(0.16, 0.95·0.1266, 0.16) = 0.1202
     accent-9 = oklch(0.5500 0.1202 62) = #A25F12
   Статусные шкалы: hue фиксированы 150/85/27/235 (01 §1.5),
     C = min(C9 + 0.02, 0.16) = 0.1402, далее clampToGamut на каждом шаге.

   ── ЧЕТЫРЕ ВАЙВЕРА К БУКВЕ СТАНДАРТА (каждый — исправление дефекта) ───────────
   W-1 (к 01 §1.4 и §1.2 шаг 2). Правило primary-fg меряет контраст к #fff,
       а подставляет neutral-1. Разница 0.10–0.15 съедает весь запас: при
       L9 = 0.62 получалось 4.53 к #fff и 4.43 к фактическому neutral-1 —
       провал AA по построению. Решатель прогнан против ФАКТИЧЕСКИ
       отрисовываемого фона --color-static-fg. Следствия: L9 = 0.5500,
       success L9 = 0.5450 (иначе 4.46) — далее пересмотрено вайвером W-4.
   W-2 (к 01 §1.6 п.3). Производное dark accent-10 = L9 + 0.045 = 0.5950 даёт
       4.07 — провал AA на hover главной кнопки. L10 в тёмной теме РЕШАЕТСЯ,
       а не выводится: 0.5650 → 4.62. Направление (hover светлее) сохранено.
   W-3 (к 01 §3.2). Таблица 01 §3.2 требует leading 1.60 для base…md; поле
       rhythm.leadingText пресета P2 = 1.50. По M-1/M-5 значения формы
       приходят из пресета — берём 1.50.
   W-4 (к W-1 и 01 §1.5). success L9 = 0.5450 давал 4.85 по OKLCH, но 4.53 по
       hex-фолбэку при пороге 4.5 — запас 0.7 %. badge.svg рендерится
       растеризатором ПО HEX, а не по OKLCH, то есть запас съедался ровно там,
       где его нечем компенсировать. L9 РЕШАЕТСЯ: 0.5300 → 4.85 в обоих
       представлениях, hue и хрома не меняются.
   W-5 (к 01 §2, правило записи фолбэка; заведён 2026-09-16). Композитные
       значения --color-overlay и --shadow-color в ОБЕИХ тёмных ветках
       hex-фолбэка СЧИТАЮТСЯ из своего OKLCH-оригинала, а не переносятся его
       числами: oklch(0.12 0.006 62) = #070504 и oklch(0.10 0.006 62) = #040302.
       Прежний перенос числами давал rgba(19,17,15,.60), совпадающее с
       --color-bg: подложка модала не затемняла ничего, и пара «граница
       диалога / затемнённая подложка» падала с 5.43 до 5.18 (§8, порог 3.0).
       Тем же пунктом: четыре статусные ЗАЛИВКИ и их -subtle/-text ДУБЛИРУЮТСЯ
       в обеих тёмных ветках фолбэка, хотя заливки — инвариант тем. Причина
       механическая: :root[data-theme="dark"] основной палитры специфичнее, чем
       :root фолбэка, поэтому без дубля браузер без OKLCH получает в тёмной
       теме нераспарсиваемое значение. ОБА пункта — ручная коррекция выхода
       решателя: перегенерация токенов обязана воспроизвести их, иначе
       contrast_audit.py снова начнёт печатать 5.18 вместо 5.43, не зная, что
       это откат. Записано также в TASKS.md (решения, 2026-09-16).

   ── ДЕФЕКТ, КОТОРЫЙ НЕЛЬЗЯ ЗАКРЫТЬ ЦВЕТОМ ─────────────────────────────────
   warning-9 = oklch(0.8000 0.1402 85) #E7B642 даёт 1.84:1 к светлому фону —
   ниже 3:1 (WCAG 1.4.11). Это предписано 01 §1.5 (warning строится при
   L9 = 0.80) и одинаково у любой палитры. Поэтому введён
   --color-warning-border: он очерчивает САМУ ЗАЛИВКУ и даёт 4.15:1 К НЕЙ
   в обеих темах. Жёлтая заливка НИКОГДА не является единственной границей
   значимого графического объекта.
   ВАЖНО: --color-warning-border — литерал-инвариант (как --color-static-fg и
   --color-warning-fg) и в тёмных блоках НЕ переопределяется. Прежняя привязка
   к var(--color-warning-text) давала в тёмной теме 1.21:1 к жёлтому, то есть
   механизм не работал ровно там, где вводился.

   ── ПОВЕРХНОСТИ И ГРАНИЦЫ (01 §1.5, WCAG 1.4.11) ──────────────────────────
   Ни один шаг нейтральной шкалы 1–8 не даёт 3:1 к --color-bg (замер против
   neutral-1: n2 1.04, n3 1.10, n4 1.17, n5 1.25, n6 1.36, n7 1.54, n8 1.90;
   3:1 берётся только с neutral-9 = 3.57:1). Поэтому смена ступени заливки —
   декорация, а носителем ЛЮБОЙ границы интерактивного контрола и любого
   разделения поверхностей MUST быть --color-border-strong.
   ========================================================================== */

:root {
  /* Трёхсостояночная привязка к data-theme — ниже. Здесь ТОЛЬКО светлая:
     `light dark` заставлял UA рисовать тёмные скроллбары, попап <select>,
     date-picker и подсветку автозаполнения поверх светлой страницы, когда
     пользователь явно выбрал data-theme="light" при тёмной ОС. */
  color-scheme: only light;  /* «only»: Chrome/Samsung auto-dark leaves the page alone */

  /* ── ACCENT 1…12, светлая тема (h = 62) ─────────────────────────── 01 §1.3 */
  --color-accent-1:  oklch(0.9925 0.0047 62);  /* #FFFCF9 */
  --color-accent-2:  oklch(0.9800 0.0126 62);  /* #FFF7F0 */
  --color-accent-3:  oklch(0.9600 0.0255 62);  /* #FFEEE1 */
  --color-accent-4:  oklch(0.9400 0.0388 62);  /* #FFE6D1 */
  --color-accent-5:  oklch(0.9180 0.0538 62);  /* #FFDDC0 */
  --color-accent-6:  oklch(0.8900 0.0737 62);  /* #FFD1A9 */
  --color-accent-7:  oklch(0.8520 0.0914 62);  /* #FAC190 */
  --color-accent-8:  oklch(0.7900 0.1058 62);  /* #ECAB72 — 1.93:1 к фону: НЕ граница */
  --color-accent-9:  oklch(0.5500 0.1202 62);  /* #A25F12 — инвариант тем (01 §1.6 п.2) */
  --color-accent-10: oklch(0.5050 0.1162 62);  /* #935300 — hover, light: L9 − 0.045 */
  --color-accent-11: oklch(0.5000 0.1106 62);  /* #8F520B — решатель §1.3 */
  --color-accent-12: oklch(0.3000 0.0541 62);  /* #41270E — решатель §1.3 */

  /* ── NEUTRAL 1…12, светлая тема (h = 62, chromaScale 1.0) ───────── 01 §1.3 */
  --color-neutral-1:  oklch(0.9925 0.0030 62); /* #FEFCFB */
  --color-neutral-2:  oklch(0.9800 0.0040 62); /* #FAF8F6 */
  --color-neutral-3:  oklch(0.9600 0.0055 62); /* #F5F1EE */
  --color-neutral-4:  oklch(0.9400 0.0065 62); /* #EEEAE7 */
  --color-neutral-5:  oklch(0.9180 0.0075 62); /* #E8E3DF */
  --color-neutral-6:  oklch(0.8900 0.0085 62); /* #DFDAD5 — 1.36:1: только декоративный разделитель */
  --color-neutral-7:  oklch(0.8520 0.0095 62); /* #D3CDC8 */
  --color-neutral-8:  oklch(0.7900 0.0110 62); /* #C0B9B4 */
  --color-neutral-9:  oklch(0.6200 0.0120 62); /* #8C857F — 3.55:1: минимальная граница контрола */
  --color-neutral-10: oklch(0.5750 0.0120 62); /* #7E7772 — 4.31:1: только disabled-текст */
  --color-neutral-11: oklch(0.5000 0.0110 62); /* #68625D — 5.88:1 */
  --color-neutral-12: oklch(0.3000 0.0080 62); /* #312D2A — 13.34:1 */

  /* ── СТАТУСНЫЕ ШКАЛЫ, светлая тема ─────────────────────────────── 01 §1.5 */
  --color-success:         oklch(0.5300 0.1402 150); /* #11813C — 4.85:1 под static-fg (W-4: 0.5450 давал 4.53, запас 0.7 %) */
  --color-success-subtle:  oklch(0.9600 0.0533 150); /* #D9FDDF */
  --color-success-text:    oklch(0.5000 0.1290 150); /* #157738 */
  --color-warning:         oklch(0.8000 0.1402 85);  /* #E7B642 — заливка, 1.84:1 к фону */
  --color-warning-subtle:  oklch(0.9600 0.0423 85);  /* #FFF0D2 */
  --color-warning-text:    oklch(0.5000 0.1025 85);  /* #7E5E00 */
  --color-danger:          oklch(0.5500 0.1402 27);  /* #B54B42 */
  --color-danger-subtle:   oklch(0.9600 0.0198 27);  /* #FFEDEB */
  --color-danger-text:     oklch(0.5000 0.1290 27);  /* #A04039 */
  --color-info:            oklch(0.5500 0.1167 235); /* #007BAB */
  --color-info-subtle:     oklch(0.9600 0.0223 235); /* #E4F5FF */
  --color-info-text:       oklch(0.5000 0.1061 235); /* #006C97 */

  /* ── ТЕКСТ НА ЗАЛИВКЕ: инвариант обеих тем ─────────────────── 01 §1.4 + W-1
     Шаг 9 не меняется между темами (01 §1.6 п.2) → и текст на нём не меняется.
     Имя --color-static-fg взято, чтобы var(--color-neutral-1) не «потемнел»
     вместе с тёмной темой (реальная ошибка, найденная судьями). */
  --color-static-fg:       oklch(0.9925 0.0030 62); /* #FEFCFB — литерал, в dark НЕ переопределяется */

  /* ── СЕМАНТИЧЕСКИЕ РОЛИ (имена — инвариант) ────────────────────── 01 §1.5 */
  /* Роли поверхностей разведены по ступеням так же, как в тёмном блоке.
     До правки bg = surface = surface-raised = neutral-1 (контраст ровно 1.000):
     «приподнятая» поверхность была неотличима от фона ничем, а активный пункт
     (bg-subtle) внутри surface-2 давал 1.000. Шаг — декорация; носитель
     границы — --color-border-strong (см. шапку файла). */
  --color-bg:              var(--color-neutral-1);
  --color-bg-subtle:       var(--color-neutral-4);  /* полоса страницы; ≠ surface, ≠ surface-2 */
  --color-surface:         var(--color-neutral-2);
  --color-surface-2:       var(--color-neutral-3);
  --color-surface-raised:  var(--color-neutral-1);  /* в светлой теме возвышение идёт К БЕЛОМУ */
  --color-surface-sunken:  var(--color-neutral-4);
  --color-border:          var(--color-neutral-6);  /* ТОЛЬКО декоративный разделитель */
  --color-border-strong:   var(--color-neutral-9);  /* ЛЮБАЯ граница интерактивного контрола, ≥3:1 */
  --color-text:            var(--color-neutral-12);
  --color-text-muted:      var(--color-neutral-11);
  --color-text-disabled:   var(--color-neutral-10); /* 4.31:1 — только disabled, не контент */
  --color-primary:         var(--color-accent-9);
  --color-primary-hover:   var(--color-accent-10);
  --color-primary-subtle:  var(--color-accent-3);
  --color-primary-text:    var(--color-accent-11);
  --color-primary-fg:      var(--color-static-fg);
  --color-text-onbrand:    var(--color-primary-fg);
  --color-accent:          var(--color-accent-9);   /* второго бренд-цвета нет: изумруд манифеста = success */
  --color-success-fg:      var(--color-static-fg);
  --color-danger-fg:       var(--color-static-fg);
  --color-info-fg:         var(--color-static-fg);
  --color-warning-fg:      oklch(0.3000 0.0615 85); /* #3C2B00 — 7.26:1 на жёлтой заливке (01 §1.5, исключение) */
  --color-warning-border:  oklch(0.4400 0.1025 85); /* #6C4D00 — ЛИТЕРАЛ-ИНВАРИАНТ, в dark НЕ переопределяется.
                                                       4.15:1 к самой заливке #E7B642 в обеих темах. */
  --color-focus:           var(--color-accent-9);
  /* Маркер активного состояния (travelling-column-marker, §5 №5 и №9).
     Отдельная роль, а не --color-primary: соседняя поверхность маркера —
     заливка --color-bg-subtle, и в ТЁМНОЙ теме primary даёт к ней 2.81:1.
     accent-11 даёт 6.13:1. Восьмая роль с собственным тёмным маппингом. */
  --color-marker:          var(--color-accent-9);
  /* alpha 0.40 давала подложку #ACA9A7, на которой светлая плита модала читалась
     2.21:1 — ниже 3:1. При 0.55 плита берёт 3.24:1 и сама несёт границу диалога.
     В тёмной теме плита даёт 1.12:1, поэтому там границу несёт border-strong
     (5.43:1 к затемнённой подложке) — см. §5 №6 конституции. */
  --color-overlay:         oklch(0.30 0.008 62 / 0.55);
  --shadow-color:          oklch(0.30 0.008 62 / 0.16);

  /* ── ГАРНИТУРЫ ─────────────────── 05 §2.2 (кириллица проверена по METADATA.pb)
     display: Wix Madefor Display  (cyrillic, cyrillic-ext; wght 400–800)
     text:    Onest                (cyrillic, cyrillic-ext; wght 100–900)
     mono:    JetBrains Mono — объявлен ВНЕ пресета по 05 §2.1 п.2: на экранах
              LUMIS есть настоящий код и машинные идентификаторы (.cursorrules,
              guard.log, SHA-256, master prompt). Числа и метрики — Onest +
              tabular-nums (маркер слопа №5).
     Резерв display: Rubik (тогда copy.h1Max.en 60→56); Noto Sans Display —
              резерв с реальной осью wdth. */
  /* Имена семейств — дословно из каталога 05 §2.2 (их же положительно сверяет
     gate.font-catalog.json по M-16). Суффиксы Variable/Fallback — конвенция
     Fontsource, а не имя семейства: «Wix Madefor Display Variable» каталогу
     неизвестен и разрешался бы в system-ui. Метрический фолбэк — отдельный
     @font-face с size-adjust, объявляется в static/css/fonts.css (шаг 0.3). */
  --font-fallback-display: "Wix Madefor Display Fallback", system-ui, sans-serif;
  --font-fallback-text:    "Onest Fallback", system-ui, sans-serif;
  --font-display: "Wix Madefor Display", var(--font-fallback-display);
  --font-text:    "Onest", var(--font-fallback-text);
  --font-mono:    "JetBrains Mono", ui-monospace, "Cascadia Mono", Consolas, monospace;
  --font-sans:    var(--font-text);              /* алиас для Tailwind-утилиты font-sans */

  --wght-display-1: 700;  /* 05 §5.2 P2 */
  --wght-display-2: 600;
  --wght-text:      400;
  --wght-strong:    600;
  --wght-ui:        500;
  --fvar-text-wdth: 100;  /* Onest оси wdth не имеет: сужение MUST приходить из реальной оси
                             (резерв Noto Sans Display, wdth 62.5–100) либо не применяться вовсе.
                             Синтетическое сжатие запрещено — 05 §2.1 п.6, маркер №7. */

  /* ── ТИПОГРАФИЧЕСКАЯ ШКАЛА ── формула 05 §1.1, base 16→18, ratio 1.200→1.250,
     vp 360→1440, пол 11 px на двух нижних ступенях (M-12). 11 ступеней, n ∈ [−3;+7].
     Парная форма --text-*--line-height — контракт Tailwind v4: интерлиньяж
     путешествует вместе со ступенью. Алиасы --leading-* оставлены для app.css
     (play-CDN v3 парную форму не читает) и удаляются на шаге билда v4. */
  --text-2xs: max(11px, 0.6875rem);  /* пол 11 px по M-12 сохранён буквально, но ступень
                                        масштабируется вместе с базовым кеглем браузера:
                                        голый px отзывался только на page zoom. */
  --text-xs:   clamp(0.6944rem, 0.6655rem + 0.1286vw, 0.7813rem);
  --text-sm:   clamp(0.8333rem, 0.7986rem + 0.1543vw, 0.9375rem);
  --text-base: clamp(1rem,      0.9583rem + 0.1852vw, 1.125rem);
  --text-md:   clamp(1.2rem,    1.1312rem + 0.3056vw, 1.4062rem);
  --text-lg:   clamp(1.44rem,   1.3341rem + 0.4708vw, 1.7578rem);
  --text-xl:   clamp(1.728rem,  1.5716rem + 0.6952vw, 2.1973rem);
  --text-2xl:  clamp(2.0736rem, 1.8493rem + 0.997vw,  2.7466rem);
  --text-3xl:  clamp(2.4883rem, 2.1734rem + 1.3999vw, 3.4332rem);
  --text-4xl:  clamp(2.986rem,  2.5508rem + 1.9341vw, 4.2915rem);
  --text-5xl:  clamp(3.5832rem, 2.9894rem + 2.6389vw, 5.3644rem);

  --text-2xs--line-height:  1.45;
  --text-xs--line-height:   1.45;
  --text-sm--line-height:   1.45;
  --text-base--line-height: 1.50;  /* rhythm.leadingText P2 — вайвер W-3 */
  --text-md--line-height:   1.50;
  --text-lg--line-height:   1.35;
  --text-xl--line-height:   1.35;
  --text-2xl--line-height:  1.20;
  --text-3xl--line-height:  1.20;
  --text-4xl--line-height:  1.05;  /* rhythm.leadingDisplay P2 */
  --text-5xl--line-height:  1.05;

  --leading-micro:   1.45;
  --leading-text:    1.50;
  --leading-lg:      1.35;
  --leading-2xl:     1.20;
  --leading-display: 1.05;

  --tracking-display: -0.020em;  /* только 3xl…5xl (01 §3.2) */
  --tracking-kicker:  0em;       /* положительный трекинг запрещён */
  --tracking-text:    0em;
  --measure: 66ch;               /* rhythm.measure P2 (05 §5.1) */

  /* ── ПРОСТРАНСТВО И РИТМ ── 01 §4 + 05 §5.1, density 1.0 (категория D3) ─── */
  --density: 1;
  --spacing: 4px;
  --space-1: 4px;   --space-2: 8px;   --space-3: 12px;  --space-4: 16px;
  --space-5: 20px;  --space-6: 24px;  --space-8: 32px;  --space-10: 40px;
  --space-12: 48px; --space-16: 64px; --space-20: 80px; --space-24: 96px;
  --space-32: 128px;
  --gutter: 24px;                             /* единственный источник боковых полей */
  --section-y:      clamp(48px, 7vw, 112px);  /* 05 §5.1, строка P2 */
  --section-y-deep: clamp(55px, 8.05vw, 128px); /* ×1.15, всё ниже 2160 px от верха */
  --pad-control: 12px;                        /* space-3 × density */
  --pad-card:    24px;                        /* space-6 × density */

  /* ── ФОРМА КОНТРОЛОВ ── radius.base = 4 (05 §4 P2), производные 01 §5 ───── */
  --radius:      4px;
  --radius-xs:   max(0px, calc(var(--radius) - 6px));  /* 0 */
  --radius-sm:   max(0px, calc(var(--radius) - 4px));  /* 0 */
  --radius-md:   var(--radius);                        /* 4 */
  --radius-lg:   calc(var(--radius) * 2);              /* 8 */
  --radius-xl:   calc(var(--radius) * 2.5);            /* 10 */
  --radius-full: 9999px;                               /* только аватар, статус-чип, скроллбар */
  --border-w:        1px;
  --border-w-strong: 2px;
  --control-h-sm: 32px;  --control-h-md: 40px;  --control-h-lg: 48px;
  --row-h: 44px;
  --hit-min: 24px;  /* pointer: fine — SC 2.5.8 минимум; на coarse поднимается до 44px.
                       Добор делает .u-hit (::after с отрицательным inset), а НЕ высота
                       контрола: визуальная коробка и раскладка не меняются между
                       типами указателя. */
  --sidebar-w: 240px;  --sidebar-w-collapsed: 56px;
  --accent-area-max: 0.04;   /* амбер занимает ≤4 % площади экрана */
  --notch: 16px;             /* cut-corner-lock: срез 45° у правого верхнего угла
                                контейнера с зафиксированной границей.
                                Подпись проекта по 05 §6.3 п.6 (MAY), ≤3 раза на экран. */

  /* ── ТЕНИ ── 01 §6; у P2 s1 = s2 = null, поэтому на статике теней нет ───── */
  --shadow-0: none;
  --shadow-1: none;
  --shadow-2: none;
  --shadow-3: 0 6px 20px -6px var(--shadow-color);   /* поповер, дропдаун, липкая шапка */
  --shadow-4: 0 9px 30px -9px var(--shadow-color);   /* модал, drawer (overlay × 1.5) */

  /* ── ДВИЖЕНИЕ ── 01 §7, motion.tier = subtle (множитель 1), потолок 400 мс ─ */
  --motion-scale: 1;
  --motion-duration-instant: calc(100ms * var(--motion-scale));
  --motion-duration-fast:    calc(160ms * var(--motion-scale));  /* preset dur1 */
  --motion-duration-base:    calc(200ms * var(--motion-scale));  /* preset dur2 */
  --motion-duration-slow:    min(calc(300ms * var(--motion-scale)), 400ms);
  --motion-stagger: 40ms;
  --motion-travel:  8px;
  --motion-ease-standard: cubic-bezier(0.2, 0, 0, 1);
  --motion-ease-enter:    cubic-bezier(0, 0, 0, 1);
  --motion-ease-exit:     cubic-bezier(0.3, 0, 1, 1);
  --ease-standard: var(--motion-ease-standard);   /* алиас для Tailwind namespace --ease-* */

  /* ── БРЕЙКПОИНТЫ И КОНТЕЙНЕРЫ ── 01 §8 ──────────────────────────────────── */
  --breakpoint-sm:  30rem;   --breakpoint-md:  40rem;   --breakpoint-lg:  48rem;
  --breakpoint-xl:  64rem;   --breakpoint-2xl: 80rem;   --breakpoint-3xl: 96rem;
  --container-prose:   var(--measure);
  --container-form:    480px;  /* РЕШЕНО: 05 §5.1, строка P2. 416 px — значение P6 Ledger,
                                  к этому проекту не относится. Конфликт из REVIEW закрыт. */
  --container-dialog:  480px;
  --container-detail:  64rem;
  --container-content: 70rem;
  --container-wide:    85rem;
  --container-full:    100%;

  /* ── ИКОНКИ И СЛОИ ── 01 §9, 01 §2 ──────────────────────────────────────── */
  --icon-sm: 16px;  --icon-md: 20px;  --icon-lg: 24px;  --icon-stroke: 1.75;
  --z-sticky: 100;  --z-dropdown: 200;  --z-overlay: 300;  --z-toast: 400;
}

/* ════════════════════════════════════════════════════════════════════════════
   ТЁМНАЯ ТЕМА — явный маппинг ролей, не инверсия (01 §1.6).
   Переопределяются ТОЛЬКО 24 шага двух шкал, 12 статусных значений и семь
   ролей, у которых маппинг в темноте другой. --color-static-fg НЕ трогаем.

   ТРИ СОСТОЯНИЯ data-theme и почему дефолт светлый (решение основателя 16.09:
   «светлая по умолчанию, тёмная только через будущий переключатель»).
     нет атрибута      → СВЕТЛАЯ. Daylight — материал продукта, а не предпочтение
                         ОС; посетитель с тёмной системой открывал сайт тёмным и
                         не имел в интерфейсе ничего, чем это отменить, потому что
                         переключателя ещё нет (QA 16.09, находка 14).
     data-theme="dark" → тёмная, явный выбор.
     data-theme="light"→ светлая, явный выбор.
     data-theme="auto" → и ТОЛЬКО он следует prefers-color-scheme. Это третье
                         положение будущего переключателя: он ставит на <html>
                         один из трёх литералов и больше ничего не делает.
   Поэтому ветка @media ниже привязана к [data-theme="auto"], а не к
   :not([data-theme="light"]): отсутствие атрибута перестало означать «как в ОС».
   Ровно это ждёт scripts/contrast_audit.py (свойство 4) — правило проверяется
   гейтом, а не держится на договорённости.
   ══════════════════════════════════════════════════════════════════════════ */
@media (prefers-color-scheme: dark) {
  :root[data-theme="auto"] {
    color-scheme: dark;

    --color-accent-1:  oklch(0.1780 0.0216 62); /* #180F07 */
    --color-accent-2:  oklch(0.2130 0.0337 62); /* #241508 */
    --color-accent-3:  oklch(0.2560 0.0541 62); /* #351C03 */
    --color-accent-4:  oklch(0.2900 0.0667 62); /* #422200 */
    --color-accent-5:  oklch(0.3230 0.0743 62); /* #4E2900 */
    --color-accent-6:  oklch(0.3630 0.0835 62); /* #5C3200 */
    --color-accent-7:  oklch(0.4200 0.0962 62); /* #713F01 */
    --color-accent-8:  oklch(0.5050 0.1106 62); /* #91540E */
    --color-accent-9:  oklch(0.5500 0.1202 62); /* #A25F12 — инвариант */
    --color-accent-10: oklch(0.5650 0.1202 62); /* #A76319 — W-2: 0.5950 давало 4.07 */
    --color-accent-11: oklch(0.7450 0.0866 62); /* #D4A073 */
    --color-accent-12: oklch(0.9300 0.0361 62); /* #FAE3D0 */

    --color-neutral-1:  oklch(0.1780 0.0055 62); /* #13110F */
    --color-neutral-2:  oklch(0.2130 0.0065 62); /* #1B1816 */
    --color-neutral-3:  oklch(0.2560 0.0080 62); /* #26221F */
    --color-neutral-4:  oklch(0.2900 0.0090 62); /* #2F2A27 */
    --color-neutral-5:  oklch(0.3230 0.0100 62); /* #37332E */
    --color-neutral-6:  oklch(0.3630 0.0110 62); /* #423D38 */
    --color-neutral-7:  oklch(0.4200 0.0120 62); /* #524C47 */
    --color-neutral-8:  oklch(0.5050 0.0130 62); /* #6A635D */
    --color-neutral-9:  oklch(0.6200 0.0130 62); /* #8C857E */
    --color-neutral-10: oklch(0.6650 0.0130 62); /* #9A928C */
    --color-neutral-11: oklch(0.7450 0.0100 62); /* #B1ABA6 */
    --color-neutral-12: oklch(0.9300 0.0060 62); /* #EBE7E4 */

    --color-success:         oklch(0.5300 0.1402 150); /* #11813C — инвариант */
    --color-success-subtle:  oklch(0.2560 0.0631 150); /* #052B12 */
    --color-success-text:    oklch(0.7450 0.1010 150); /* #7DBF8A */
    --color-warning:         oklch(0.8000 0.1402 85);  /* #E7B642 */
    --color-warning-subtle:  oklch(0.2560 0.0525 85);  /* #2F2100 */
    --color-warning-text:    oklch(0.7450 0.1010 85);  /* #CAA75E */
    --color-danger:          oklch(0.5500 0.1402 27);  /* #B54B42 */
    --color-danger-subtle:   oklch(0.2560 0.0631 27);  /* #3C1512 */
    --color-danger-text:     oklch(0.7450 0.1010 27);  /* #E5938A */
    --color-info:            oklch(0.5500 0.1167 235); /* #007BAB */
    --color-info-subtle:     oklch(0.2560 0.0543 235); /* #002739 */
    --color-info-text:       oklch(0.7450 0.1010 235); /* #68B7E3 */

    --color-bg-subtle:      var(--color-neutral-4);  /* до правки оставался neutral-2 = surface:
                                                        активный пункт был невидим (1.000) */
    --color-surface:        var(--color-neutral-2);
    --color-surface-2:      var(--color-neutral-3);
    --color-surface-raised: var(--color-neutral-3);
    --color-surface-sunken: var(--color-neutral-1);
    --color-focus:          var(--color-accent-10);
    --color-marker:         var(--color-accent-11);  /* primary дал бы 2.81:1 к bg-subtle */
    --color-overlay:        oklch(0.12 0.006 62 / 0.60);
    --shadow-color:         oklch(0.10 0.006 62 / 0.55);
    /* Иерархия поверхностей в темноте — шагом, не тенью (01 §6):
       к приподнятой поверхности добавляется inset 0 1px 0 var(--color-neutral-5). */
  }
}

:root[data-theme="dark"] {
  color-scheme: dark;

  --color-accent-1:  oklch(0.1780 0.0216 62); /* #180F07 */
  --color-accent-2:  oklch(0.2130 0.0337 62); /* #241508 */
  --color-accent-3:  oklch(0.2560 0.0541 62); /* #351C03 */
  --color-accent-4:  oklch(0.2900 0.0667 62); /* #422200 */
  --color-accent-5:  oklch(0.3230 0.0743 62); /* #4E2900 */
  --color-accent-6:  oklch(0.3630 0.0835 62); /* #5C3200 */
  --color-accent-7:  oklch(0.4200 0.0962 62); /* #713F01 */
  --color-accent-8:  oklch(0.5050 0.1106 62); /* #91540E */
  --color-accent-9:  oklch(0.5500 0.1202 62); /* #A25F12 */
  --color-accent-10: oklch(0.5650 0.1202 62); /* #A76319 */
  --color-accent-11: oklch(0.7450 0.0866 62); /* #D4A073 */
  --color-accent-12: oklch(0.9300 0.0361 62); /* #FAE3D0 */

  --color-neutral-1:  oklch(0.1780 0.0055 62); /* #13110F */
  --color-neutral-2:  oklch(0.2130 0.0065 62); /* #1B1816 */
  --color-neutral-3:  oklch(0.2560 0.0080 62); /* #26221F */
  --color-neutral-4:  oklch(0.2900 0.0090 62); /* #2F2A27 */
  --color-neutral-5:  oklch(0.3230 0.0100 62); /* #37332E */
  --color-neutral-6:  oklch(0.3630 0.0110 62); /* #423D38 */
  --color-neutral-7:  oklch(0.4200 0.0120 62); /* #524C47 */
  --color-neutral-8:  oklch(0.5050 0.0130 62); /* #6A635D */
  --color-neutral-9:  oklch(0.6200 0.0130 62); /* #8C857E */
  --color-neutral-10: oklch(0.6650 0.0130 62); /* #9A928C */
  --color-neutral-11: oklch(0.7450 0.0100 62); /* #B1ABA6 */
  --color-neutral-12: oklch(0.9300 0.0060 62); /* #EBE7E4 */

  --color-success:         oklch(0.5300 0.1402 150); /* #11813C */
  --color-success-subtle:  oklch(0.2560 0.0631 150); /* #052B12 */
  --color-success-text:    oklch(0.7450 0.1010 150); /* #7DBF8A */
  --color-warning:         oklch(0.8000 0.1402 85);  /* #E7B642 */
  --color-warning-subtle:  oklch(0.2560 0.0525 85);  /* #2F2100 */
  --color-warning-text:    oklch(0.7450 0.1010 85);  /* #CAA75E */
  --color-danger:          oklch(0.5500 0.1402 27);  /* #B54B42 */
  --color-danger-subtle:   oklch(0.2560 0.0631 27);  /* #3C1512 */
  --color-danger-text:     oklch(0.7450 0.1010 27);  /* #E5938A */
  --color-info:            oklch(0.5500 0.1167 235); /* #007BAB */
  --color-info-subtle:     oklch(0.2560 0.0543 235); /* #002739 */
  --color-info-text:       oklch(0.7450 0.1010 235); /* #68B7E3 */

  --color-bg-subtle:      var(--color-neutral-4);
  --color-surface:        var(--color-neutral-2);
  --color-surface-2:      var(--color-neutral-3);
  --color-surface-raised: var(--color-neutral-3);
  --color-surface-sunken: var(--color-neutral-1);
  --color-focus:          var(--color-accent-10);
  --color-marker:         var(--color-accent-11);  /* primary дал бы 2.81:1 к bg-subtle */
  --color-overlay:        oklch(0.12 0.006 62 / 0.60);
  --shadow-color:         oklch(0.10 0.006 62 / 0.55);
}

/* ── Фолбэк для браузеров без OKLCH (01 §2, MUST) ─────────────────────────── */
@supports not (color: oklch(0 0 0)) {
  :root {
    --color-accent-1:#FFFCF9;  --color-accent-2:#FFF7F0;  --color-accent-3:#FFEEE1;
    --color-accent-4:#FFE6D1;  --color-accent-5:#FFDDC0;  --color-accent-6:#FFD1A9;
    --color-accent-7:#FAC190;  --color-accent-8:#ECAB72;  --color-accent-9:#A25F12;
    --color-accent-10:#935300; --color-accent-11:#8F520B; --color-accent-12:#41270E;
    --color-neutral-1:#FEFCFB; --color-neutral-2:#FAF8F6; --color-neutral-3:#F5F1EE;
    --color-neutral-4:#EEEAE7; --color-neutral-5:#E8E3DF; --color-neutral-6:#DFDAD5;
    --color-neutral-7:#D3CDC8; --color-neutral-8:#C0B9B4; --color-neutral-9:#8C857F;
    --color-neutral-10:#7E7772;--color-neutral-11:#68625D;--color-neutral-12:#312D2A;
    --color-static-fg:#FEFCFB;
    --color-success:#11813C;   --color-success-subtle:#D9FDDF; --color-success-text:#157738;
    --color-warning:#E7B642;   --color-warning-subtle:#FFF0D2; --color-warning-text:#7E5E00;
    --color-danger:#B54B42;    --color-danger-subtle:#FFEDEB;  --color-danger-text:#A04039;
    --color-info:#007BAB;      --color-info-subtle:#E4F5FF;    --color-info-text:#006C97;
    --color-warning-fg:#3C2B00;
    --color-warning-border:#6C4D00;   /* инвариант обеих тем, как и -fg */
    --color-overlay: rgba(49,45,42,.55);
    --shadow-color:  rgba(49,45,42,.16);
  }
  /* Тёмная ветка фолбэка объявлена ДВУМЯ селекторами — ровно тем же набором
     имён, что и основная палитра. Раньше здесь была только [data-theme="dark"],
     поэтому браузер без OKLCH (Safari <15.4, Firefox <113, старые WebView,
     растеризаторы скриншотов и PDF — а PDF и письма входят в область §0
     конституции) при системной тёмной теме получал СВЕТЛУЮ палитру.
     Привязка — [data-theme="auto"], зеркально основной палитре: без атрибута
     тема светлая в обоих представлениях, иначе браузер без OKLCH темнел бы там,
     где браузер с OKLCH уже нет. */
  @media (prefers-color-scheme: dark) {
    :root[data-theme="auto"] {
      --color-accent-1:#180F07;  --color-accent-2:#241508;  --color-accent-3:#351C03;
      --color-accent-4:#422200;  --color-accent-5:#4E2900;  --color-accent-6:#5C3200;
      --color-accent-7:#713F01;  --color-accent-8:#91540E;  --color-accent-9:#A25F12;
      --color-accent-10:#A76319; --color-accent-11:#D4A073; --color-accent-12:#FAE3D0;
      --color-neutral-1:#13110F; --color-neutral-2:#1B1816; --color-neutral-3:#26221F;
      --color-neutral-4:#2F2A27; --color-neutral-5:#37332E; --color-neutral-6:#423D38;
      --color-neutral-7:#524C47; --color-neutral-8:#6A635D; --color-neutral-9:#8C857E;
      --color-neutral-10:#9A928C;--color-neutral-11:#B1ABA6;--color-neutral-12:#EBE7E4;
      /* Заливки статусов — инвариант тем, но переобъявить их здесь ОБЯЗАТЕЛЬНО:
         :root[data-theme="dark"] основной палитры специфичнее, чем :root
         фолбэка, поэтому без этих четырёх строк браузер без OKLCH получает в
         тёмной теме нераспарсиваемое значение, а не светлый hex. */
      --color-success:#11813C;        --color-warning:#E7B642;
      --color-danger:#B54B42;         --color-info:#007BAB;
      --color-success-subtle:#052B12; --color-success-text:#7DBF8A;
      --color-warning-subtle:#2F2100; --color-warning-text:#CAA75E;
      --color-danger-subtle:#3C1512;  --color-danger-text:#E5938A;
      --color-info-subtle:#002739;    --color-info-text:#68B7E3;
      /* Фолбэк обязан повторять ЦВЕТ своего OKLCH-оригинала, а не его числа:
         oklch(0.12 0.006 62) = #070504, а не rgb(19,17,15) — прежнее значение
         совпадало с --color-bg, то есть подложка модала не затемняла ничего и
         граница диалога в тёмной теме падала с 5.43 до 5.18 (§8, порог 3.0).
         То же с тенью: oklch(0.10 0.006 62) = #040302. */
      --color-overlay: rgba(7,5,4,.60);
      --shadow-color:  rgba(4,3,2,.55);
    }
  }
  :root[data-theme="dark"] {
    --color-accent-1:#180F07;  --color-accent-2:#241508;  --color-accent-3:#351C03;
    --color-accent-4:#422200;  --color-accent-5:#4E2900;  --color-accent-6:#5C3200;
    --color-accent-7:#713F01;  --color-accent-8:#91540E;  --color-accent-9:#A25F12;
    --color-accent-10:#A76319; --color-accent-11:#D4A073; --color-accent-12:#FAE3D0;
    --color-neutral-1:#13110F; --color-neutral-2:#1B1816; --color-neutral-3:#26221F;
    --color-neutral-4:#2F2A27; --color-neutral-5:#37332E; --color-neutral-6:#423D38;
    --color-neutral-7:#524C47; --color-neutral-8:#6A635D; --color-neutral-9:#8C857E;
    --color-neutral-10:#9A928C;--color-neutral-11:#B1ABA6;--color-neutral-12:#EBE7E4;
    /* Те же четыре заливки и те же два композитных значения, что и в ветке
       @media выше — наборы имён обеих тёмных веток фолбэка обязаны совпадать
       (свойство 4 в scripts/contrast_audit.py). */
    --color-success:#11813C;        --color-warning:#E7B642;
    --color-danger:#B54B42;         --color-info:#007BAB;
    --color-success-subtle:#052B12; --color-success-text:#7DBF8A;
    --color-warning-subtle:#2F2100; --color-warning-text:#CAA75E;
    --color-danger-subtle:#3C1512;  --color-danger-text:#E5938A;
    --color-info-subtle:#002739;    --color-info-text:#68B7E3;
    --color-overlay: rgba(7,5,4,.60);
    --shadow-color:  rgba(4,3,2,.55);
  }
}

/* ── Тач-таргет и reduced motion ── 01 §4, 01 §7 ──────────────────────────── */
@media (pointer: coarse) {
  /* Поднимается ТОЛЬКО зона попадания. Высоты контролов не трогаются: подъём
     --control-h-sm 32→44 и --control-h-md 40→44 менял визуальную коробку на
     12 px и перевёрстывал каждый плотный тулбар — то есть делал ровно то, что
     запрещает конституция §4.5 и комментарий, стоявший в этом же блоке. */
  :root { --hit-min: 44px; }
}
@media (prefers-reduced-motion: reduce) {
  :root { --motion-scale: 0.01; }
  *, *::before, *::after {
    animation-duration: 1ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 1ms !important;
    scroll-behavior: auto !important;
  }
  /* Подписное движение travelling-column-marker отключается целиком,
     а не ускоряется (05 §2.5). */
}

/* ── Базовые применения токенов (минимальный слой, не компонентная библиотека) */
/* color-scheme объявляется только на :root и строго по data-theme (см. выше).
   Безусловное `light dark` на html здесь и было причиной тёмных нативных
   контролов поверх светлой страницы. */
body {
  background: var(--color-bg);
  color: var(--color-text);
  font-family: var(--font-text);
  font-weight: var(--wght-text);
  font-size: var(--text-base);
  line-height: var(--leading-text);
  text-rendering: optimizeLegibility;
}
::selection { background: var(--color-accent-3); color: var(--color-text); }
:focus-visible {
  outline: var(--border-w-strong) solid var(--color-focus);
  outline-offset: 2px;
}
.u-tabular { font-variant-numeric: tabular-nums; }
.u-measure { max-width: var(--container-prose); }

/* Добор зоны попадания до --hit-min без изменения визуальной коробки (§4.5).
   Родитель обязан иметь position: relative (или сам .u-hit — relative). */
.u-hit { position: relative; }
.u-hit::after {
  content: '';
  position: absolute;
  inset: calc((var(--hit-min) - 100%) / -2);
}

/* cut-corner-lock. clip-path режет border-box целиком, поэтому у контейнера с
   зафиксированной границей срез остаётся БЕЗ обводки: четыре стороны с линией,
   пятая — голый обрыв. Линию по срезу несёт .u-notch__edge (см. §1.5
   конституции): inline-SVG в currentColor поверх безрамочной заливки. */
.u-notch   { clip-path: polygon(0 0, calc(100% - var(--notch)) 0, 100% var(--notch), 100% 100%, 0 100%); }
