/* ═══════════════════════════════════════════════════════════════════════
   CRA UI v3 — слой ТОКЕНОВ. Паспорт CRA_theme-passport_v1.4.
   Полный текст стандарта: docs/ak-air-design-v3_0.md (П5).

   THEME: mode=both (тёмная по умолчанию); accent=#34A61F / #1E8C0E;
          radius=0px (токена радиуса нет — решение паспорта Ф3-а);
          font-display=Inter / font-body=Inter / font-mono=JetBrains Mono
          (локальные копии объявлены как «CRA Inter» и «CRA JetBrains
          Mono» — почему, сказано в блоке ШРИФТЫ ниже);
          density-default=норма 34px; level=base;
          voice=спокойный, без восклицаний.

   ── Почему слой скоуплен атрибутом, а не живёт в :root ──
   Имена --bg, --surface, --surface-2, --text, --muted, --accent, --warn,
   --row-h, --pad-page уже объявлены в app.css:5-66 и держат ВСЕ 24 старых
   экрана. Повторное объявление в голом :root перекрасило бы их разом.
   Поэтому весь слой живёт под html[data-ui="v3"]: где атрибута нет —
   ни одно правило отсюда не применяется, старый интерфейс не меняется
   ни на пиксель. Атрибут выставлен РОВНО В ОДНОМ месте — в новой оболочке
   app/ui/templates/cra_shell.html; ни base.html, ни JS его не ставят,
   поэтому слой включён только на экранах, которые эту оболочку наследуют.
   Экран переводится на слой целиком, не наполовину (ст. 9.5).

   ── Имена токенов ──
   Из закрытого списка ст. 9.2 — своим именем: --bg, --surface,
   --surface-2, --line, --text, --muted, --accent, --info, --warn, --err,
   --on-color, --row-h, --pad-page, --font-display/body/mono.
   Расхождения с паспортом здесь больше нет: владелец 30.08.2026 решил
   привести паспорт к закрытому списку, и CRA_theme-passport_v1.4 сам
   называет границы --line, а ошибку --err. Значения не менялись ни в
   паспорте, ни здесь — поменялись только два имени.
   Всё, чего в закрытом списке нет, — свои токены и несут --vc-.
   Второй сегмент -v3- обязателен: имена --vc-accent-dim и --vc-ctrl-h
   уже заняты в app.css другими значениями (#2E4E6B и 32px), и на
   странице, где новый слой включён, старые правила молча взяли бы
   чужие числа. Токен нового слоя — всегда --vc-v3-*.

   Правила слоя (гл. 9): ни одного цветового литерала мимо var() вне
   этого файла; без !important, без стилей по id, без инлайна;
   логические свойства вместо left/right. Объявленный токен обязан быть
   применён (ст. 9.7) — в cra-kit.css или в шаблоне слоя; три токена,
   которые пока не применены, названы поимённо в docs/deviations.md.
   ═══════════════════════════════════════════════════════════════════════ */

/* ══ ШРИФТЫ — ЛОКАЛЬНО (паспорт ст. 4, открытый пункт 8.2 закрыт) ══════
   Боевой сервер в Google Fonts не ходит, поэтому woff2 лежат в репозитории:
   app/ui/static/fonts/. Внешней загрузки шрифтов в новой оболочке нет.

   Файлов восемь, а не двадцать восемь: и Inter, и JetBrains Mono отдаются
   ПЕРЕМЕННЫМИ (variable) — один файл на субсет несёт всю ось насыщенности,
   и запрошенные паспортом начертания (Inter 400/500/600/700, моно
   400/500/700) берутся из него же. Проверено по содержимому: у скачанных
   файлов есть таблицы STAT/HVAR/MVAR, а на все запрошенные веса Google
   отдавал один и тот же адрес. Отсюда `font-weight: 400 700` — это
   ДИАПАЗОН оси, а не одно значение: браузер синтезировать жир не будет.

   Субсеты взяты четыре — cyrillic, cyrillic-ext, latin, latin-ext:
   интерфейс русский с латинскими именами вендоров, греческий и вьетнамский
   в него не приходят, а лишние 300 КБ приходят. unicode-range перенесены
   из ответа Google без правок: браузер грузит только тот файл, символы
   которого встретились на странице.

   Что НЕ покрыто ни одним субсетом и рисуется системным шрифтом: значки
   ▾ ▸ ◂ ■ ✕ ↗ (U+2190…U+27BF). Так было и на CDN — те же субсеты; отличий
   от согласованных макетов это не вносит.

   font-display: swap — текст читается сразу системным и переключается на
   Inter по готовности. Пустой экран на время загрузки шрифта (block) на
   рабочем инструменте недопустим.

   ── Почему семейство названо «CRA Inter», а не «Inter» ──
   @font-face областью действия не ограничивается: правило глобально на
   документ, атрибутом data-ui его не скоупить. Пока файлы назывались
   «Inter», они подхватывались И СТАРОЙ оболочкой — base.html тоже просит
   Inter, — и на 24 старых экранах менялись метрики текста. Поймано
   скриншот-дифом А2: расхождение с эталонами 2.7–4.3% пикселей на всех
   четырёх отслеживаемых страницах в обеих темах. Ровно то, чего волна
   обязана не делать.
   Своё имя семейства делает объявление безвредным: правило по-прежнему
   глобально, но зовёт его только --font-body/--font-display/--font-mono
   нового слоя. Настоящий «Inter» остался в стеке вторым — если он есть в
   системе или приедет с CDN старой оболочки, им и воспользуются. */
@font-face {
  font-family: "CRA Inter";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/inter-cyrillic-ext.woff2") format("woff2");
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: "CRA Inter";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/inter-cyrillic.woff2") format("woff2");
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: "CRA Inter";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/inter-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: "CRA Inter";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/inter-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: "CRA JetBrains Mono";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/jetbrains-mono-cyrillic-ext.woff2") format("woff2");
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: "CRA JetBrains Mono";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/jetbrains-mono-cyrillic.woff2") format("woff2");
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: "CRA JetBrains Mono";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/jetbrains-mono-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: "CRA JetBrains Mono";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("/static/fonts/jetbrains-mono-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;
}

/* ── Тёмная тема — база (паспорт, ст. 2) ── */
html[data-ui="v3"] {
  --bg: #0C1117;
  --surface: #141B27;
  --surface-2: #1A2332;
  --line: #243247;
  --text: #E8EEF4;
  --muted: #93A3B8;
  --accent: #34A61F;
  --info: #5FA8E0;
  --warn: #E1C22B;
  --err: #E15A2B;
  --on-color: #F0FBEB;

  /* Свои токены палитры: в закрытом списке ст. 9.2 их нет. */
  --vc-v3-accent-brand: #48E12B;   /* ТОЛЬКО логотип и паук, в контролах запрещён */
  --vc-v3-accent-ink: #8FE070;     /* зелёный текст на тёмном */
  --vc-v3-accent-dim: #2C7F19;     /* границы выделения, рамка фокуса */
  --vc-v3-warn-ink: #E4CC66;
  --vc-v3-err-ink: #EE9678;
  --vc-v3-info-ink: #8FC4EE;       /* «новое» текстом */
  /* Полоса хода ЗАВЕРШЁННОГО прогона (экран 5.2). Паспорт ст. 3 оговаривает
     этот синий отдельно и прямо: к --info он НЕ сводится — там синий значит
     «появилось впервые», здесь «прогон закончился», и совпадение оттенков
     было бы ложной связью. В макете цвет жил литералом; в код он переносится
     ТОЛЬКО токеном, что здесь и сделано. Тёмное значение — из макета
     (Crawler_run-card_v5.7). */
  --vc-v3-run-done: #5B8DEF;
  /* Градиент включённой лампочки «Режим обучения» (CRA_header-proto_v1.1,
     Л1). В светлой теме НЕ переопределяется намеренно: в согласованном
     прототипе лампочка одна на обе темы. Заведены токенами, а не литералами
     в разметке SVG, — иначе цвет уехал бы из-под контроля гл. 9. */
  --vc-v3-lamp-top: #8FE070;
  --vc-v3-lamp-bottom: #2FA51D;
  /* Затемнение фона: у панели и у модалки оно разное — паспорт ст. 7
     задаёт панели ~55%, модалка макета v1.1 идёт на 60%. */
  --vc-v3-scrim-drawer: rgba(6, 10, 15, .55);
  --vc-v3-scrim-modal: rgba(6, 10, 15, .6);
  --vc-v3-menu-shadow: 0 10px 30px rgba(0, 0, 0, .35);

  /* Геометрия (паспорт, ст. 5). Скруглений нет нигде: 0px — решение Ф3-а,
     поэтому токена радиуса в слое намеренно не существует. */
  --vc-v3-ctrl-h: 36px;
  --row-h: 34px;                   /* высота строки одна: переключатель плотности
                                      снят из стандарта решением владельца
                                      02.09.2026 (РД-29, паспорт v1.8, таблица
                                      v1.6). Токен остаётся — убран выбор
                                      значения с экрана, а не высота токеном. */
  --pad-page: 28px;
  --vc-v3-gap-inner: 8px;
  --vc-v3-gap-item: 14px;
  --vc-v3-gap-group: 26px;
  --vc-v3-gap-block: 44px;
  --vc-v3-px-atom: 9px;            /* пиксельный атом 9×9 (паспорт, ст. 6) */
  /* Две ФИКСИРОВАННЫЕ ширины колонок (паспорт ст. 5, заведены v1.6).
     Только для колонок с конечным набором плашек: в --col-172 влезает
     самая длинная плашка набора вместе с отступами, --col-150 — для
     короткого набора. Пропорциональные ширины таблицы (narrow · mid ·
     wide · grow) ими не заменяются и остаются закрытым набором. */
  --col-172: 172px;
  --col-150: 150px;

  /* Типографика (паспорт, ст. 4): шкала Inter и шкала моно. */
  --font-display: "CRA Inter", Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-body: "CRA Inter", Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-mono: "CRA JetBrains Mono", "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
  --vc-v3-fs-page: 20px;
  --vc-v3-fs-block: 17px;
  --vc-v3-fs-lead: 15px;
  --vc-v3-fs-data: 13.5px;
  --vc-v3-fs-meta: 12px;
  --vc-v3-fs-label: 11px;
  --vc-v3-fs-mono: 12.5px;
}

/* ── Светлая тема — «инженерная бумага» (паспорт, ст. 3).
   Переопределяются только значения; ни одного нового имени. ── */
html[data-ui="v3"][data-theme="light"] {
  --bg: #F7F9F5;
  --surface: #FFFFFF;
  --surface-2: #EDF3EA;
  --line: #D4DECF;
  --text: #131C12;
  --muted: #5D6E5A;
  --accent: #1E8C0E;
  --info: #2E7BC4;
  --warn: #B08A08;
  --err: #C24518;
  --on-color: #FFFFFF;

  --vc-v3-accent-brand: #48E12B;
  --vc-v3-accent-ink: #1E8C0E;
  --vc-v3-accent-dim: #1E8C0E;
  --vc-v3-warn-ink: #8A6D06;
  --vc-v3-err-ink: #C24518;
  --vc-v3-info-ink: #1C5C99;
  /* Светлое значение подобрано способом паспорта («по правилу контраста»,
     как --info и --warn-ink), а не на глаз: тот же тон и та же
     насыщенность, что у тёмного #5B8DEF, светлота — под контраст к
     --surface, равный контрасту светлого --info (4.42:1). Полоса — заливка,
     а не текст, поэтому мерой взят именно --info, а не --info-ink. */
  --vc-v3-run-done: #3372EB;
  --vc-v3-scrim-drawer: rgba(28, 38, 26, .35);
  --vc-v3-scrim-modal: rgba(28, 38, 26, .4);
  /* Тень выпадающего меню в светлой теме НЕ переопределяется: в согласованном
     CRA_header-proto_v1.1 она одна на обе темы, и подбирать вторую самому
     значит менять вид принятого экрана. Вопрос владельцу — в отчёте волны. */
}
