﻿@charset "utf-8";
/* ═══════════════════════════════════════════════════════════════════════════════
   СИСТЕМА ОФОРМЛЕНИЯ ПРОДУКТА — ЕДИНСТВЕННЫЙ ЭКЗЕМПЛЯР. ВОЛНА 0.
   ═══════════════════════════════════════════════════════════════════════════════

   ⛔ ИСТОЧНИК ОДИН: src/Shared.Ui/ui-tokens.css.
   Файлы `ui-tokens.css` в четырёх `wwwroot` — РАЗЛОЖЕННЫЕ КОПИИ (звёздочка с косой
   чертой в этом описании не пишется: она закрывает комментарий CSS, и первая
   редакция файла именно так молча потеряла ВЕСЬ блок светлой темы — поймано
   браузером, а не чтением). Их правка теряется при
   первой же сборке: цель `UiTokensToWwwroot` (src/Shared.Ui/Оформление.props)
   перезаписывает их из этого файла. Паритет держится ПОСТРОЕНИЕМ, а не
   договорённостью и не сторожем, который можно закомментировать.

   ЗАЧЕМ ФАЙЛ СУЩЕСТВУЕТ (замер 21.08.2026, четыре веб-контура):
     планировщик 91 цвет · институт 41 · письма 32 · финконтур 25;
     10 ступеней кегля вместо 6, 14 значений скругления вместо 2,
     200 инлайновых `style=` в одном только планировщике.
   Ни один из этих дефектов не лечится вкусом: их порождает МЕСТО ХРАНЕНИЯ.
   Поэтому и лечение — про место хранения, а не про «сделать красиво».

   ЧТО ЭТОТ ФАЙЛ ДЕЛАЕТ И ЧЕГО НЕ ДЕЛАЕТ.
     ДЕЛАЕТ: объявляет роли (переменные), три ступени плотности одной ручкой,
             вторую тему клиента Pilot, восемь состояний органа управления
             и режим печати — всё как ЗАЯВКУ, доступную по имени.
     НЕ ДЕЛАЕТ: не переопределяет НИ ОДНОГО элемента (`body`, `table`, `th`,
             `button` здесь не встречаются) и не трогает существующие классы
             (`.num`, `.rep`, `.tsheet`, `.tile`). Подключение файла к экрану
             не меняет ни одного пикселя — это волна 0, объявление, а не редизайн.
             Всё прикладное лежит в классах `.сис-*` и включается поимённо.

   ⛔ ИМЕНА — ПО РОЛИ, А НЕ ПО ВНЕШНОСТИ. `--цвет-тревога`, а не `--красный`:
   в тёмной теме «тревога» становится светлее фона, и имя `--красный` пришлось бы
   либо врать, либо заводить второе. Роль переживает смену темы, оттенок — нет.

   ОТКУДА ЧИСЛА. Цвета не подобраны, а ПОСЧИТАНЫ и проверены по критериям,
   заданным до подбора:
     светлая тема (Jedi) — docs/Замер-палитры-2-21.08.2026.py, 12 проверок из 12;
     тёмная тема (Sith) и добавки (границы, подсветка, цвет-текст срочности) —
     docs/Замер-тёмной-темы-21.08.2026.py, 0 провалов; замер умеет краснеть
     (контрольная мутация одного цвета даёт 3 провала и код возврата 1).
   Критерии: К1 текст ≥ 4,5:1 · К2 текст на заливке ≥ 4,5:1 · К3 дихромазия
   ΔE ≥ 20 · К4 ч/б печать Δсерого ≥ 40 · К5 граница органа ≥ 3:1.

   ⛔ ДВА ЗАКОНА ЦВЕТА, ДОКАЗАННЫЕ ЗАМЕРОМ (находки, а не мнение):
     1. Пастельный фон НЕ МОЖЕТ нести значение. Любой тинт лежит в сером 230–240,
        диапазона на 40 градаций там физически нет; на бумаге он вовсе исчезает.
        Тинт — подсветка строки. Значение несут знак и текст.
     2. В плотной таблице остаётся ОДИН цвет. Пара «янтарный/красный» проваливает
        дихромазию при любых разумных оттенках (дейт ΔE 15,9). Цветом помечается
        только «горит», остальное — нейтральный текст и знак.

   Дальше по файлу: 1) светлая тема · 2) тёмная тема · 3) плотность ·
   4) прикладной слой `.сис-*` · 5) печать.
   Как подключить в новом экране и чего делать нельзя — docs/Система-оформления.md.
   ═══════════════════════════════════════════════════════════════════════════════ */

/* ─── 1. СВЕТЛАЯ ТЕМА (Pilot Jedi) — значения по умолчанию ─────────────────── */
:root {
  /* Какая тема сейчас. Читается извне: getComputedStyle(document.documentElement)
     .getPropertyValue('--тема') — чтобы вкладка и снимки могли ЗАМЕРИТЬ тему,
     а не предполагать её. */
  --тема: "jedi";

  /* ── ТИПОГРАФИКА. Шесть ступеней, и больше ни одной. Имя ступени — её роль,
     потому что «13px» ничего не говорит о том, где её ставить. Начертаний два;
     700 разрешено ровно одному месту — счётчику «горит».
     ⛔ ПОД ФЛАГОМ ОБОЛОЧКИ СТУПЕНЕЙ ПЯТЬ (веб-пакет «один продукт», волна 2; блок
     :root[data-оболочка="2"] ниже): подпись 11 → 12, служебный 12 → 13 — служебный
     совпадает с таблицей. Мельче 12 px в продукте под флагом нет ни одной ступени; без флага
     (откат настройкой WebShell) шкала прежняя — шесть ступеней. */
  --шрифт: "Segoe UI", system-ui, -apple-system, sans-serif;
  --шрифт-моно: Consolas, "Cascadia Mono", ui-monospace, monospace;

  --кегль-подпись: 11px;         /* сноска, единица измерения, отметка времени */
  --кегль-служебный: 12px;       /* подпись поля, пояснение под органом       */
  --кегль-таблица: 13px;         /* клетка таблицы и шапка — основная масса   */
  --кегль-основной: 15px;        /* текст экрана вне таблиц                   */
  --кегль-заголовок: 19px;       /* заголовок экрана                          */
  --кегль-крупное-число: 24px;   /* единственное число сводки на плитке       */

  --начертание-обычное: 400;
  --начертание-выделенное: 600;
  --начертание-горит: 700;       /* ⛔ только счётчик «горит», больше нигде */

  --интерлиньяж-плотный: 1.25;   /* таблицы */
  --интерлиньяж-обычный: 1.45;   /* текст   */

  /* ── ПЛОТНОСТЬ — ОДНА РУЧКА. Ступени задаются атрибутом `data-плотность`
     на <html> (см. раздел 3). Ручка меняет ГЕОМЕТРИЮ, а не кегль: лестница
     из шести ступеней не масштабируется, иначе ступеней снова станет
     восемнадцать. Второй ручки не заводим. */
  --плотность: 1;
  --шаг: 4px;
  --ритм: calc(var(--шаг) * var(--плотность));

  --отступ-микро: calc(var(--ритм) * 1);     /* 4px  при обычной плотности */
  --отступ-малый: calc(var(--ритм) * 2);     /* 8px  */
  --отступ-средний: calc(var(--ритм) * 3);   /* 12px */
  --отступ-крупный: calc(var(--ритм) * 4);   /* 16px */
  --отступ-раздел: calc(var(--ритм) * 6);    /* 24px */
  --отступ-экран: calc(var(--ритм) * 8);     /* 32px */

  /* ⛔ ПОЛ ЦЕЛИ НАЖАТИЯ — НЕ ВКУС, А WCAG 2.2 SC 2.5.8. Он записан через max(),
     поэтому ручка плотности НЕ МОЖЕТ его пробить: при «тесно» орган остаётся
     ≥ 24px. Сегодня замер даёт 46×19 у клетки факта и 16px у ссылок-кнопок
     института — то есть ниже пола. */
  --цель-нажатия: 24px;
  /* Пол цели нажатия ПАЛЬЦЕМ (pointer: coarse — планшет, телефон; оболочка.css поднимает до него
     --цель-нажатия под флагом). 40 px — между SC 2.5.8 (24) и 44 px Apple HIG: строки таблиц
     не раздуваются до 44, палец попадает. */
  --цель-нажатия-пальцем: 40px;
  --высота-органа: max(var(--цель-нажатия), calc(32px * var(--плотность)));
  --высота-строки: max(var(--цель-нажатия), calc(28px * var(--плотность)));
  /* Высота ОБЫЧНОЙ кнопки (компоненты.css, волна 2): пол 44 px (WCAG 2.2 SC 2.5.5) держат все
     четыре контура, и ручка плотности его не роняет. 24 px — только кнопке в клетке таблицы
     и модификатору .сис-в-строке. Без флага оболочки эту роль не читает никто. */
  --высота-кнопки: max(var(--высота-органа), 44px);
  /* Высота обычной (не главной) кнопки по дизайн-направлению 05.10.2026 §2.5 и §2.7 — 32 px; 44 px
     остаются главной кнопке и пальцу. ⛔ ОБЪЯВЛЕНИЕ, А НЕ ПРИМЕНЕНИЕ: снятие пола 44 px для мыши меняет
     ворота волны 2 и ждёт решения владельца — до него эту роль не читает ни одно правило. */
  --высота-кнопки-обычной: var(--высота-органа);
  --поле-клетки-по-вертикали: calc(var(--ритм) * 1.5);
  --поле-клетки-по-горизонтали: calc(var(--ритм) * 2);

  /* ── ЦВЕТ · ПОВЕРХНОСТИ */
  --цвет-фон-страницы: #F4F6F8;
  --цвет-поверхность: #FFFFFF;            /* карточка, таблица              */
  --цвет-поверхность-утопленная: #E6EEF6; /* шапка таблицы, панель, полоса  */

  /* ── ЦВЕТ · ТЕКСТ (К1 пройден на белом и на фоне страницы) */
  --цвет-текст: #111827;            /* 17,74:1 на белом */
  --цвет-текст-2: #3F4A5A;          /*  8,98:1 */
  --цвет-текст-3: #5C6979;          /*  5,60:1 — приглушённое, но всё ещё текст */
  --цвет-текст-на-заливке: #FFFFFF;
  --цвет-текст-отключено: #5C6979;
  /* Подпись на ЗАЛИВКЕ ДАННЫХ (полосы Ганта, Ф-7). От темы НЕ зависит и в тёмной теме НЕ
     переопределяется: заливка — цвет палитры статусов, одной на обе темы, и подпись
     выбирается по её яркости (планировщик, app.js `классПодписиПолосы`). */
  --цвет-подпись-на-тёмной-заливке: #FFFFFF;
  --цвет-подпись-на-светлой-заливке: #16191D;

  /* ── ЦВЕТ · ГРАНИЦЫ. Их две, и они не взаимозаменяемы:
     «граница» — разделитель (линия таблицы, край карточки), 1,44:1 — этого
     достаточно глазу и НЕ достаточно органу управления;
     «граница-сильная» — контур ОРГАНА (поле, кнопка) и линия на бумаге, 5,60:1. */
  --цвет-граница: #CCD9E4;
  --цвет-граница-сильная: #5C6979;

  /* ── ЦВЕТ · АКЦЕНТ (орган управления, ссылка, выбранная строка) */
  --цвет-акцент: #0F4C81;           /* 8,86:1 на белом */
  --цвет-акцент-2: #1761A1;         /* 6,44:1 — наведение, вторая ступень */
  --цвет-текст-на-акценте: #FFFFFF;

  /* ── ЦВЕТ · ЛЕСТНИЦА СРОЧНОСТИ — ЕДИНСТВЕННАЯ ЦВЕТОВАЯ ШКАЛА ПРОДУКТА.
     Строится ПО ЯРКОСТИ (серый 154 → 100 → 50), оттенок вторичен — поэтому
     переживает ч/б печать и все три дихромазии. Чинит главный дефект:
     «в норме»/«горит» при дейтеранопии ΔE 2,8 → 41,8, на бумаге Δсерого 12 → 104. */
  --цвет-успех: #46AC79;            /* «в норме» */
  --цвет-текст-на-успехе: #111827;
  --цвет-внимание: #94540C;         /* «риск»    */
  --цвет-текст-на-внимании: #FFFFFF;
  --цвет-тревога: #64120C;          /* «горит»   */
  --цвет-текст-на-тревоге: #FFFFFF;

  /* Те же роли КАК ЦВЕТ ТЕКСТА (заливки нет). ⛔ В плотную таблицу идёт только
     «тревога-текст» — закон 2. «успех-текст» — для плашек и подписей. */
  --цвет-тревога-текст: #8A1F16;    /* 9,18:1 на белом */
  --цвет-успех-текст: #2F7548;      /* 5,59:1 */

  /* ── ЦВЕТ · ПОДСВЕТКА СТРОКИ. ⛔ ЗНАЧЕНИЯ НЕ НЕСЁТ (закон 1) — это только
     «глаз, найди эту строку». Всё, что подсветка «сообщает», обязано быть
     продублировано знаком и текстом в самой строке. */
  --подсветка-успех: #E6F3EC;
  --подсветка-внимание: #F5EAD6;
  --подсветка-тревога: #F6E2DF;
  --подсветка-акцент: #E6EEF6;

  /* ── ЦВЕТ · ВИД ЗАПИСИ НА ДИАГРАММЕ. Кодируется ФОРМОЙ, цвет вспомогательный:
     план — контур и светлая заливка, факт — сплошная, «нет данных» — та же
     светлая заливка со штриховкой 135°. Различие держит форма, а не оттенок,
     поэтому оно живо и в ч/б, и при дихромазии. */
  --цвет-запись-план: #CCD9E4;
  --цвет-запись-факт: #1761A1;
  --цвет-текст-на-записи-факт: #FFFFFF;
  --штриховка-нет-данных: repeating-linear-gradient(135deg,
      transparent 0 3px, var(--цвет-граница-сильная) 3px 4px);

  /* ── ВОСЕМЬ СОСТОЯНИЙ ОРГАНА УПРАВЛЕНИЯ (сегодня живут три с половиной:
     :focus-visible не встречается в четырёх контурах НИ РАЗУ).
     1 обычное — базовые роли выше.  */
  --цвет-фон-наведение: #E6EEF6;              /* 2 наведение */
  --цвет-фон-нажатие: #CCD9E4;                /* 3 нажатие   */
  --цвет-фокус: #1761A1;                      /* 4 фокус     */
  --обводка-фокуса: 2px;                      /* под флагом оболочки — 3 px (блок ниже) */
  --отступ-обводки-фокуса: 2px;
  /* Отметка СОСТОЯНИЯ (полоса Ганта: найдена поиском, предупреждение) — не фокус. Своя роль,
     чтобы под флагом отметка не превратилась в кольцо фокуса 3 px; без флага 2 = 2. */
  --обводка-состояния: 2px;
  --цвет-фон-выбрано: #0F4C81;                /* 5 выбрано   */
  --цвет-текст-выбрано: #FFFFFF;
  --непрозрачность-отключено: 0.55;           /* 6 отключено */
  --курсор-отключено: not-allowed;
  --непрозрачность-загрузки: 0.6;             /* 7 загрузка  */
  --курсор-загрузки: progress;
  --цвет-отказ: #8A1F16;                      /* 8 отказ     */
  --цвет-граница-отказа: #8A1F16;

  /* ── СКРУГЛЕНИЯ. Их ДВА. Было четырнадцать. */
  --скругление: 6px;                /* орган, клетка, плашка */
  --скругление-крупное: 10px;       /* карточка, модальное окно */

  /* ── ТЕНИ. Их две, и обе снимаются в печати. Тень — не украшение, а признак
     «этот слой лежит ВЫШЕ»: карточка над страницей, окно над карточкой. */
  --тень-карточки: 0 1px 2px rgba(17, 24, 39, 0.08);
  --тень-парения: 0 8px 24px rgba(17, 24, 39, 0.18);

  /* ── ОБОЛОЧКА: ОДНА ШАПКА НА ЧЕТЫРЕ КОНТУРА (веб-пакет «один продукт», волна 1;
     правила — src/Shared.Ui/оболочка.css, все под флагом `data-оболочка="2"` на <html>).
     ⛔ ВЫСОТЫ ЗАДАНЫ В ПИКСЕЛЯХ И РУЧКОЙ ПЛОТНОСТИ НЕ МАСШТАБИРУЮТСЯ: это БЮДЖЕТ высоты
     до первой строки экрана, а не ритм содержимого. Ворота волны 1 — шапка до main не выше
     160 px: строка 48 + ряд вкладок 44 + черта шапки 1 + две однострочные полосы по
     --высота-полосы (30) = 153 px. Полоса, чей текст переносится, и подпись роли идут в бюджет
     фактической высотой (оболочка.css, обязательства части 2). */
  --высота-шапки: 48px;            /* строка: название · контуры · поиск · кто я · сборка · Выйти */
  --высота-вкладок: 44px;          /* высота РЯДА вкладок; кнопка — ряд минус полоса прокрутки */
  --высота-полосы: 30px;           /* полоса «знак + слово» вместо плиты предупреждения */
  --толщина-подчёркивания: 2px;    /* отметка выбранной вкладки; фокус — обводкой, не ею */
  --ширина-поиска: 480px;          /* поле поиска в строке шапки — не шире */
  --ширина-тени-края: 12px;        /* тень у края прокручиваемого ряда вкладок */
  /* Тень края ряда НЕ несёт значения: она говорит «ряд продолжается», и только. Поэтому
     она не в перечне пар контраста — это не текст и не граница органа. */
  --цвет-тень-края: rgba(17, 24, 39, 0.22);

  /* ══ ВИЗУАЛЬНЫЙ СЛОЙ, ВОЛНА Р0 (дизайн-направление 05.10.2026, §2.3 и §2.7) ══════════════════
     ⛔ ОБЪЯВЛЕНИЕ, А НЕ ПРИМЕНЕНИЕ. Роли ниже никто не читает без флага вида «графики»
     (data-вкл на <html>, ставит СЛУЖБА настройкой WebUi:Views — Shared.WebAuth/ВключённыеВиды.cs):
     их правила живут в src/Shared.Ui/графики.css целиком под `:root[data-вкл~="графики"]`.
     Подключение файла не меняет ни одного пикселя — как и весь этот файл (раздел «что делает»).
     Числа посчитаны, а не подобраны: валидатор навыка dataviz и замер пар дизайнера
     (build-logs/web-redesign/дизайн/проверка-палитры); пары держит tools/contrast/check.py. */

  /* ── ШАПКА — тёмно-синяя строка, как у сборщика табеля Заказчика (`header #22364d`). */
  --цвет-шапка-фон: #22364D;
  --цвет-шапка-текст: #FFFFFF;      /* 12,33:1 */
  --цвет-шапка-текст-2: #C0C9D4;    /*  7,37:1 — сборка, роль */
  --цвет-шапка-акцент: #7FB2E3;     /*  5,51:1 — выбранный контур, фокус */

  /* ── ШКАЛА ЗАГРУЗКИ — последовательная, ОДИН оттенок, «светлее — меньше». Пороги 0–24, 25–49,
     50–74, 75–100 %; больше 100 % — «тревога» и ▲ (форма, а не только цвет).
     ⛔ Ступень 0 к карточке 1,22:1 — допустима ТОЛЬКО с числом в клетке (оно 14,5:1): четыре
     ступени вместе валидатор не проходит, ступени 1–3 — проходят (≥ 2:1, check.py). */
  --шкала-0: #DCEAF8;
  --шкала-1: #88B6E6;
  --шкала-2: #4F8AC6;
  --шкала-3: #185A95;
  --текст-на-шкале-0: #111827;      /* 14,50:1 */
  --текст-на-шкале-1: #111827;      /*  8,35:1 */
  --текст-на-шкале-2: #111827;      /*  4,89:1 */
  --текст-на-шкале-3: #FFFFFF;      /*  7,15:1 */

  /* ── ШКАЛА СТАДИЙ — порядковая, ВТОРОЙ оттенок (предпроект → ПД → РД → АН): на одном экране
     с картой загрузки стадии не синие (правило dataviz: второй последовательный контекст — следующий оттенок). */
  --стадия-1: #A796E2;
  --стадия-2: #7B63CC;
  --стадия-3: #55409F;
  --стадия-4: #382A72;
  --текст-на-стадии-1: #111827;     /*  6,85:1 */
  --текст-на-стадии-2: #FFFFFF;     /*  4,67:1 */
  --текст-на-стадии-3: #FFFFFF;     /*  8,01:1 */
  --текст-на-стадии-4: #FFFFFF;     /* 12,05:1 */

  /* ── ТОНА ДНЯ (сборщик Заказчика: --we, --short, --fm, --over; Excel — сиреневый и жёлтый).
     ⛔ ЗАКОН 1: тон НЕ несёт значения (худшая пара по ΔE — 5,4, в тёмной теме 2,3) — смысл дня
     несёт слово («вых», «7 ч», «фм», «+1,5», «не внесено») и знак. Текст на тоне — основной. */
  --день-выходной: #E9ECF1;
  --день-сокращённый: #FFF6C9;
  --день-фм: #FFD9A8;
  --день-сверх: #F9D0D0;
  --день-работа-в-выходной: #DCC9F0;
  --день-пусто: #FFE58A;

  /* ── КОНТЕКСТ — серое «чужое / прошлое / прочее»: искра прошлых периодов, остальные ряды линии. */
  --цвет-контекст: #848F9C;         /* 3,29:1 к карточке, 3,03:1 к фону */

  /* ── ШАПКА: поле поиска и разделитель на тёмной строке (полупрозрачные — берут тон шапки под собой). */
  --цвет-шапка-поле: rgba(255, 255, 255, 0.10);
  --цвет-шапка-линия: rgba(255, 255, 255, 0.24);

  /* ── СЕТКА ТАБЕЛЯ И КАРТ (эскизы экранов 05.10.2026, итог п. 8): шапка выходного столбца — на ступень
     темнее его тела; «сегодня» — фон шапки столбца (сам столбец — обводка акцентом); активная клетка
     ввода; волосяная линия сетки на ступень от карточки (без пунктира — пунктир значит «вычислено»);
     вторая поверхность — ряд итогов шапки. Текст на каждой — пары check.py. */
  --день-выходной-шапка: #DDE2E9;
  --подсветка-сегодня: #D3E2F2;
  --подсветка-клетки: #F2F7FC;
  --цвет-линия-сетки: #E3E9EF;
  --цвет-поверхность-2: #F7F9FB;

  /* ── ТОСТ «Сохранено · Отменить» и затемнение под ящиком/диалогом. */
  --тост-фон: #1E2B3A;
  --тост-текст: #FFFFFF;            /* 14,37:1 */
  --тост-ссылка: #7FB2E3;           /*  6,42:1 */
  --цвет-затемнение: rgba(17, 24, 39, 0.28);

  /* ── РЕЗЕРВ СЕРИЙ (§2.3 е) — только там, где серии сами предмет (три контура на одном тренде).
     ⛔ Никогда рядом со статусными цветами; четвёртой серии нет; подписи у серий обязательны (бирюзовый
     на белом 2,82:1). Различимость при протанопии и дейтеранопии держит check.py (ΔE OKLab, все пары). */
  --ряд-1: #2A78D6;
  --ряд-2: #EB6834;
  --ряд-3: #1BAF7A;
}

/* ─── 1а. ПОД ФЛАГОМ ОБОЛОЧКИ (веб-пакет «один продукт», волна 2) ─────────────────
   Флаг data-оболочка="2" на <html> ставит разметка контура, снимает СЛУЖБА настройкой WebShell
   (Shared.WebAuth/ОткатОболочки.cs). Под флагом:
     · кегли: подпись 11 → 12, служебный 12 → 13 (спека веб-пакета §3.1: знаков мельче 12 px — 0);
     · кольцо фокуса 3 px против подчёркивания выбранной вкладки 2 px (--толщина-подчёркивания):
       отличие формой и толщиной, цветом нельзя — фокус к акценту 1,38:1.
   ⛔ МЕСТО — ТОЛЬКО ЭТОТ ФАЙЛ: сторож О-1 (ЦветИКегльВнеТокеновTests) исключает из обхода
   один ui-tokens.css по имени. Блок объявляет ТОЛЬКО эти три роли — держит
   КомпонентыТолькоПодФлагомTests; кегль под флагом не мельче 12 — КегльНеМельче12ПодФлагомTests.
   Цветов здесь нет, и tools/contrast/check.py блок без цветов темой не считает. */
:root[data-оболочка="2"] {
  --кегль-подпись: 12px;
  --кегль-служебный: 13px;
  --обводка-фокуса: 3px;
}

/* ─── 2. ТЁМНАЯ ТЕМА (Pilot Sith) ──────────────────────────────────────────────
   ⛔ ПОЧЕМУ ВООБЩЕ. У клиента Pilot ДВЕ темы (`Ascon.Pilot.Themes.ThemeNames`:
   Jedi и Sith), переключает их ПОЛЬЗОВАТЕЛЬ — в русском сателлите клиента есть
   строка «Тема». Наши цвета были литералами светлой: в Sith вкладка остаётся
   светлым островом рядом с тёмным клиентом.

   ⛔ ПОЧЕМУ НЕ `prefers-color-scheme`. Источник истины — ТЕМА PILOT, а не тема
   операционной системы: человек с тёмной Windows и светлым Pilot должен видеть
   светлый экран, иначе мы разойдёмся с соседней вкладкой того же окна.
   Поэтому переключение только явное:
       document.documentElement.setAttribute('data-тема', 'sith');
   Во вкладке источник — `IPilotDialogService.Theme` (уже инжектится
   в PlannerTabExtension.cs:133 и не читается ни разу).

   ⛔ СВОЕЙ ТРЕТЬЕЙ ТЕМЫ НЕ ЗАВОДИМ. У Pilot их две, и он ими управляет.
   Здесь переопределяются ТОЛЬКО роли цвета: ни одна ступень кегля, ни один
   отступ, ни одно скругление в тёмной теме не меняются. */
:root[data-тема="sith"] {
  --тема: "sith";

  --цвет-фон-страницы: #16191D;
  --цвет-поверхность: #1E232A;
  --цвет-поверхность-утопленная: #262C34;

  --цвет-текст: #E9EDF2;            /* 13,44:1 на поверхности */
  --цвет-текст-2: #C0C9D4;          /*  9,44:1 */
  --цвет-текст-3: #96A1AE;          /*  6,02:1 */
  --цвет-текст-на-заливке: #16191D; /* заливки в тёмной теме СВЕТЛЕЕ фона */
  --цвет-текст-отключено: #96A1AE;

  --цвет-граница: #39424D;
  --цвет-граница-сильная: #6D7885;  /* 3,52:1 — К5 для органа пройден */

  --цвет-акцент: #7FB2E3;           /* 7,06:1 */
  --цвет-акцент-2: #A8CCF0;         /* 9,45:1 */
  --цвет-текст-на-акценте: #16191D;

  /* Лестница инвертирована ПО ЯРКОСТИ: на тёмном внимание притягивает светлое.
     Порядок ролей сохранён, пары проверены — К3 и К4 пройдены полностью
     (серый 224 / 178 / 114; дейт ΔE 52,1 · 47,1 · 30,9; трит ≥ 24,3). */
  --цвет-успех: #BCEBD1;
  --цвет-текст-на-успехе: #16191D;
  --цвет-внимание: #DFA84F;
  --цвет-текст-на-внимании: #16191D;
  --цвет-тревога: #BE4E44;
  --цвет-текст-на-тревоге: #FFFFFF;

  --цвет-тревога-текст: #F08A7E;    /* 6,50:1 на поверхности */
  --цвет-успех-текст: #8FD6AE;      /* 9,33:1 */

  --подсветка-успех: #1E2E27;
  --подсветка-внимание: #302A1E;
  --подсветка-тревога: #2E2222;
  --подсветка-акцент: #1E2733;

  --цвет-запись-план: #2E3742;
  --цвет-запись-факт: #7FB2E3;
  --цвет-текст-на-записи-факт: #16191D;

  --цвет-фон-наведение: #262C34;
  --цвет-фон-нажатие: #313944;
  --цвет-фокус: #A8CCF0;
  --цвет-фон-выбрано: #7FB2E3;
  --цвет-текст-выбрано: #16191D;
  --цвет-отказ: #F08A7E;
  --цвет-граница-отказа: #F08A7E;

  /* На тёмном подъём слоя читается тенью только если тень чернее фона. */
  --тень-карточки: 0 1px 2px rgba(0, 0, 0, 0.55);
  --тень-парения: 0 8px 24px rgba(0, 0, 0, 0.65);
  --цвет-тень-края: rgba(0, 0, 0, 0.6);

  /* ── ВИЗУАЛЬНЫЙ СЛОЙ, ВОЛНА Р0 — свои ступени тёмной темы (не автоматический переворот). */
  --цвет-шапка-фон: #10161D;
  --цвет-шапка-текст: #E9EDF2;      /* 15,47:1 */
  --цвет-шапка-текст-2: #96A1AE;    /*  6,93:1 */
  --цвет-шапка-акцент: #7FB2E3;     /*  8,12:1 */

  /* Шкала загрузки на тёмном: «больше» — СВЕТЛЕЕ (к карточке: 1,21 · 2,13 · 4,71 · 8,48). */
  --шкала-0: #25323F;
  --шкала-1: #33587D;
  --шкала-2: #5E90C4;
  --шкала-3: #94C2F3;
  --текст-на-шкале-0: #E9EDF2;      /* 11,12:1 */
  --текст-на-шкале-1: #E9EDF2;      /*  6,30:1 */
  --текст-на-шкале-2: #16191D;      /*  5,26:1 */
  --текст-на-шкале-3: #16191D;      /*  9,46:1 */

  /* Стадии на тёмном (светлый край 2,19:1; первый вариант #4B3E80 — 1,73:1 — поправлен дизайнером).
     ⛔ На #7C6BC6 ни светлый (3,74), ни тёмный текст темы (4,01) порога 4,5 не дают — чёрный 4,78:1. */
  --стадия-1: #5A4C96;
  --стадия-2: #7C6BC6;
  --стадия-3: #A596E6;
  --стадия-4: #CEC4F7;
  --текст-на-стадии-1: #E9EDF2;     /*  6,14:1 */
  --текст-на-стадии-2: #000000;     /*  4,78:1 */
  --текст-на-стадии-3: #16191D;     /*  6,81:1 */
  --текст-на-стадии-4: #16191D;     /* 10,80:1 */

  --день-выходной: #262C34;
  --день-сокращённый: #34301A;
  --день-фм: #3F2C16;
  --день-сверх: #432526;
  --день-работа-в-выходной: #30284A;
  --день-пусто: #3E3612;

  --цвет-контекст: #6B7684;         /* 3,42:1 к карточке */

  --цвет-шапка-поле: rgba(255, 255, 255, 0.07);
  --цвет-шапка-линия: rgba(255, 255, 255, 0.18);
  --день-выходной-шапка: #20252C;
  --подсветка-сегодня: #22344A;
  --подсветка-клетки: #1B2633;
  --цвет-линия-сетки: #2C333C;
  --цвет-поверхность-2: #222830;
  --тост-фон: #2B3A4C;
  --тост-текст: #E9EDF2;
  --тост-ссылка: #A8CCF0;
  --цвет-затемнение: rgba(0, 0, 0, 0.5);
  --ряд-1: #3987E5;
  --ряд-2: #D95926;
  --ряд-3: #199E70;
}

/* Явно объявленная светлая тема. Нужна не для красоты: она даёт способ
   ЗАФИКСИРОВАТЬ Jedi (снимки, печатные стенды) независимо от чего бы то ни было. */
:root[data-тема="jedi"] { --тема: "jedi"; }

/* ─── 3. ПЛОТНОСТЬ — ТРИ СТУПЕНИ ОДНОЙ РУЧКОЙ ─────────────────────────────────
   Ставится на <html>:  document.documentElement.setAttribute('data-плотность','тесно')
   ⚠ ЦЕНА КОМПАКТА НАЗВАНА ЗАРАНЕЕ, а не обнаружится на приёмке: при «тесно»
   строка садится с 28 до 24 px, и подпись второй строкой (должность рядом с ФИО)
   из строки уезжает. Это проектное решение, а не бесплатная экономия. */
:root[data-плотность="тесно"]    { --плотность: 0.85; }
:root[data-плотность="обычно"]   { --плотность: 1; }
:root[data-плотность="свободно"] { --плотность: 1.15; }

/* ─── 4. ПРИКЛАДНОЙ СЛОЙ. Включается ПОИМЁННО, ни на что не действует сам ──────
   ⛔ Ни одного селектора по элементу и ни одного чужого класса: подключение
   файла к существующему экрану не меняет ни одного пикселя. */

/* ── ЧИСЛА. Правило одно и оно короткое: ВПРАВО И ТАБЛИЧНЫМИ ЦИФРАМИ.
   ⛔ НИКОГДА НЕ ЦЕНТРИРОВАТЬ: у планировщика сегодня 65 числовых столбцов по
   центру против 23 вправо, и табличные цифры на центрированной клетке
   бесполезны — разряды всё равно не выстраиваются.
   Класс ставится И на `th`, И на `td`: шапка выравнивается вместе с числом.
   ⛔ ПРАВИЛО ЖИВЁТ В таблица.css: `td.num, th.num` — вправо и табличными цифрами в любом контуре и
   режиме, `td.num` — неразрывно. Прежний класс `.сис-число` отсюда снят: его не носил ни один орган
   (гейт ревью волны 2), а второе имя одного правила — второй дом.
   Остальное — не про CSS, но про то же правило, поэтому записано здесь:
     · разрядность единая: часы — 1 знак, проценты — 0;
     · ru-RU: запятая как разделитель дробной части;
     · тысячи — тонкий пробел U+2009 (не U+00A0: неразрывный превращает сумму
       в Excel в текст, проект этим уже платил — см. Finance.Core/Сумма.cs);
     · минус — настоящий U+2212, а не дефис U+002D;
     · единица измерения — в шапке столбца, а не в каждой клетке;
     · «—» (U+2014) ≠ «0,0»: прочерк означает «нет отметки», ноль означает ноль.
       Прочерк ОДИН на весь продукт — U+2014. */
.сис-нет-данных {           /* тот самый прочерк: не ноль и не пустая клетка */
  color: var(--цвет-текст-3);
  font-variant-numeric: tabular-nums;
}

/* ── ВОСЕМЬ СОСТОЯНИЙ ОРГАНА. Кнопка и поле (`.сис-кнопка`, `.сис-поле`, база `button`
   и полей, уровни «главная / тихая / опасная», фокус) переехали в src/Shared.Ui/компоненты.css
   (волна 2 веб-пакета) и действуют ТОЛЬКО под флагом оболочки: этот файл по-прежнему не
   оформляет ни одного элемента. Здесь остались состояния, которые ставятся классом поимённо. */

/* 7 состояние — ЗАГРУЗКА. Отдельным классом, потому что «занято» это не
   «отключено»: орган вернётся, и человеку об этом надо сказать курсором. */
.сис-занято {
  opacity: var(--непрозрачность-загрузки);
  cursor: var(--курсор-загрузки);
  pointer-events: none;
}
/* 8 состояние — ОТКАЗ. Цвет ОДИН из двух признаков; второй — текст рядом.
   Поле с aria-invalid получает его в компоненты.css. */
.сис-отказ {
  border-color: var(--цвет-граница-отказа);
  color: var(--цвет-отказ);
}

/* ── ПОДСВЕТКА СТРОКИ. ⛔ Значения не несёт (закон 1) — только «найди глазом». */
.сис-подсветка-успех    { background: var(--подсветка-успех); }
.сис-подсветка-внимание { background: var(--подсветка-внимание); }
.сис-подсветка-тревога  { background: var(--подсветка-тревога); }
.сис-подсветка-акцент   { background: var(--подсветка-акцент); }

/* ─── 5. ПЕЧАТЬ — ПОЛНОПРАВНЫЙ РЕЖИМ, А НЕ ПОБОЧНЫЙ ЭФФЕКТ ЭКРАНА ──────────────
   Здесь перекладываются РОЛИ, а не правила экрана: ни один элемент отсюда
   не прячется и не переставляется. Поэтому блок безопасен для экранов,
   которые ещё не перешли на токены, — им он не адресован вовсе.

   ⛔ ТЁМНАЯ ТЕМА НА БУМАГУ НЕ ПОПАДАЕТ. Селектор перечисляет и `[data-тема="sith"]`,
   иначе человек, печатающий из тёмной темы, получит белый текст на белом листе:
   специфичность `:root[data-тема="sith"]` выше, чем у голого `:root`.

   ⛔ ЧЕГО ЗДЕСЬ НАМЕРЕННО НЕТ — `@page`. У «Писем» уже объявлен свой
   (`A4 landscape, margin 10mm`), а смена полей у трёх остальных контуров —
   это изменение печатного поля, то есть редизайн (П-5), а не объявление системы.
   Волна 0 объявляет; поля листа меняет тот, кто будет чинить печать. */
@media print {
  :root,
  :root[data-тема="sith"] {
    --цвет-фон-страницы: #FFFFFF;
    --цвет-поверхность: #FFFFFF;
    --цвет-поверхность-утопленная: #FFFFFF;

    --цвет-текст: #111827;
    --цвет-текст-2: #3F4A5A;
    --цвет-текст-3: #5C6979;
    --цвет-текст-на-заливке: #FFFFFF;
    --цвет-текст-отключено: #5C6979;

    /* Тонкая светлая линия на бумаге исчезает — печать берёт сильную границу. */
    --цвет-граница: #5C6979;
    --цвет-граница-сильная: #5C6979;

    /* ⛔ ПЕЧАТНЫЙ КЕГЛЬ ЗАДАЁТСЯ В ПУНКТАХ, А НЕ В ПИКСЕЛЯХ, и это не прихоть:
       пиксель на бумаге не определён — его размер зависит от разрешения принтера,
       а пункт равен 1/72 дюйма всегда. Экранная шкала кеглей здесь не годится
       по единице измерения, поэтому у печати свой токен, а не «тот же, но меньше».
       8 pt — плотная печать делового письма: на A4 в альбомной ориентации помещается
       таблица, ради которой лист и печатают. */
    --кегль-печати: 8pt;

    --цвет-акцент: #0F4C81;
    --цвет-акцент-2: #1761A1;
    --цвет-текст-на-акценте: #FFFFFF;

    /* Лестница остаётся: она различима в сером (Δсерого 54 и 50 между ступенями). */
    --цвет-успех: #46AC79;
    --цвет-текст-на-успехе: #111827;
    --цвет-внимание: #94540C;
    --цвет-текст-на-внимании: #FFFFFF;
    --цвет-тревога: #64120C;
    --цвет-текст-на-тревоге: #FFFFFF;
    --цвет-тревога-текст: #8A1F16;
    --цвет-успех-текст: #2F7548;

    /* ⛔ Подсветка на бумаге НЕ СУЩЕСТВУЕТ и по закону 1 ничего не значила.
       Если строка что-то сообщала подсветкой — на листе это обязано быть словом. */
    --подсветка-успех: #FFFFFF;
    --подсветка-внимание: #FFFFFF;
    --подсветка-тревога: #FFFFFF;
    --подсветка-акцент: #FFFFFF;

    --цвет-запись-план: #FFFFFF;
    --цвет-запись-факт: #5C6979;
    --цвет-текст-на-записи-факт: #FFFFFF;

    --тень-карточки: none;
    --тень-парения: none;
    --цвет-тень-края: transparent;

    /* ── ВИЗУАЛЬНЫЙ СЛОЙ, ВОЛНА Р0 (дизайн-направление §2.3 и): шапка на листе — полоса контура
       словом; шкалы загрузки и стадий — светлой палитрой (из тёмной темы тоже: селектор выше
       перечисляет sith); тона дня на бумаге БЕЛЫЕ — смысл остаётся словом (закон 1). */
    --цвет-шапка-фон: #FFFFFF;
    --цвет-шапка-текст: #111827;
    --цвет-шапка-текст-2: #3F4A5A;
    --цвет-шапка-акцент: #0F4C81;

    --шкала-0: #DCEAF8;
    --шкала-1: #88B6E6;
    --шкала-2: #4F8AC6;
    --шкала-3: #185A95;
    --текст-на-шкале-0: #111827;
    --текст-на-шкале-1: #111827;
    --текст-на-шкале-2: #111827;
    --текст-на-шкале-3: #FFFFFF;

    --стадия-1: #A796E2;
    --стадия-2: #7B63CC;
    --стадия-3: #55409F;
    --стадия-4: #382A72;
    --текст-на-стадии-1: #111827;
    --текст-на-стадии-2: #FFFFFF;
    --текст-на-стадии-3: #FFFFFF;
    --текст-на-стадии-4: #FFFFFF;

    --день-выходной: #FFFFFF;
    --день-сокращённый: #FFFFFF;
    --день-фм: #FFFFFF;
    --день-сверх: #FFFFFF;
    --день-работа-в-выходной: #FFFFFF;
    --день-пусто: #FFFFFF;

    --цвет-контекст: #848F9C;

    /* Сетка на бумаге: тона белые, линия — сильная граница (тонкая светлая на листе пропадает);
       тоста и затемнения на листе нет — роли нейтральны; серии — светлой палитрой. */
    --цвет-шапка-поле: #FFFFFF;
    --цвет-шапка-линия: #5C6979;
    --день-выходной-шапка: #FFFFFF;
    --подсветка-сегодня: #FFFFFF;
    --подсветка-клетки: #FFFFFF;
    --цвет-линия-сетки: #5C6979;
    --цвет-поверхность-2: #FFFFFF;
    --тост-фон: #FFFFFF;
    --тост-текст: #111827;
    --тост-ссылка: #0F4C81;
    --цвет-затемнение: transparent;
    --ряд-1: #2A78D6;
    --ряд-2: #EB6834;
    --ряд-3: #1BAF7A;
  }

  /* Прикладные помощники печати — тоже поимённо, ничего не трогают сами. */
  .сис-не-печатать { display: none !important; }
  .сис-не-рвать { break-inside: avoid; }
  .сис-повтор-шапки { display: table-header-group; }  /* ставится на <thead> */
}
