/* Токены админки fbswb.
 *
 * БЫЛО: копия /claude/project/fbs/app/ui/src/lib/theme.css (палитра One
 * Dark, снятая с ozon.uni-renter.ru). Копию отвязали 25.08.26 решением
 * владельца — и вот почему, чтобы следующий не «починил» это обратно.
 *
 * Копия не проходила по контрасту, и не в мелочах, а ровно там, где у
 * нас вся работа. Замеры старых токенов (WCAG 2.1, sRGB после
 * гамма-кодирования):
 *
 *     --border vs --bg           1.43   при норме 3.0 для нетекстового
 *     --err на любом фоне   3.69-4.38   при норме 4.5 для текста
 *     --text-muted на шапке      4.19   при норме 4.5
 *
 * Слабая граница — это не косметика: таблица на десять колонок читается
 * ровно настолько, насколько видно разделители строк. При 1.43 их нет.
 * Красный --err подписывал ошибку входа и боевой контур — два места, где
 * «не разглядел» стоит дороже всего.
 *
 * Экран сборки в /claude/project/fbs оставлен как есть: править чужой
 * складской экран заодно — отдельный риск и отдельная проверка. Родство
 * сохранено оттенком: тот же сине-серый тон 264, только перестроенный по
 * светлоте, поэтому рядом экраны читаются как одна система.
 *
 * Тема одна, тёмная. Светлой нет сознательно (решение владельца
 * 25.08.26): два режима — это вдвое больше пар, которые надо мерить, а
 * выигрыш для кабинета, где сидят за одним и тем же монитором, невелик.
 * Появится нужда — заводить парный набор ЦЕЛИКОМ и мерить отдельно, а не
 * инвертировать эти значения.
 *
 * Каждая пара ниже посчитана, а не подобрана на глаз. Меняешь число —
 * пересчитай: /claude/project/fbswb/docs/2026-08-25-ui-refactor.md несёт
 * скрипт замера и таблицу результатов.
 */
:root {
  color-scheme: dark;

  /* Поверхности: четыре ступени, каждая следующая светлее предыдущей.
     Ступень = уровень над холстом, а не «ещё один серый»: bg — холст,
     surface — панель и таблица, elevated — шапка и залипшая строка
     заголовков, hover — строка под курсором. */
  --bg: oklch(19% 0.015 264);
  --bg-surface: oklch(23% 0.016 264);
  --bg-elevated: oklch(27% 0.018 264);
  --bg-hover: oklch(33% 0.02 264);

  /* Две границы, а не одна, и это principled: правило WCAG 1.4.11 (3:1)
     распространяется на ГРАНИЦЫ УПРАВЛЯЮЩИХ ЭЛЕМЕНТОВ — поле, селект,
     кнопка. Линейка между строками таблицы — структурная графика, ей
     3:1 не требуется, а если выдать — плотная таблица превращается в
     решётку и данные тонут. Отсюда --border (1.7 к холсту, видно, но не
     кричит) для разлиновки и --border-strong (3.4 к холсту, 3.0+ к любой
     нашей поверхности) для всего, что человек нажимает. */
  --border: oklch(36% 0.02 264);
  --border-strong: oklch(57% 0.024 264);

  /* Текст. Приглушённый — именно приглушённый, а не блёклый: 7.0 даже на
     самой светлой поверхности. Старый --text-muted проваливался на шапке
     до 4.19, и имя сотрудника читалось хуже, чем должно. */
  --text: oklch(95% 0.004 264);
  --text-muted: oklch(76% 0.014 264);

  /* Акцент — пурпур Wildberries. Не украшение: он отличает этот кабинет
     от соседней озоновской админки с первого взгляда. Тон 330 выбран ещё
     и потому, что не сталкивается ни с одним статусным цветом — оранжевый
     акцент старой темы спорил с янтарным «в работе». */
  --accent: oklch(74% 0.15 330);

  /* Статусы. Цвет НИКОГДА не единственный носитель смысла (WCAG 1.4.1):
     рядом всегда текст статуса, цвет лишь ускоряет поиск глазами. */
  --ok: oklch(78% 0.15 148);
  --warn: oklch(82% 0.14 82);
  --err: oklch(72% 0.17 22);
  --info: oklch(78% 0.11 235);

  /* Шрифты системные, без Google Fonts. Внешний CSS с чужого хоста — это
     блокирующий рендер запрос наружу из браузера сотрудника и лишняя
     зависимость там, где сеть склада может быть закрыта. Плотной таблице
     системный гротеск ничем не хуже. */
  --font-sans:
    system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial,
    sans-serif;
  --font-mono:
    ui-monospace, "SF Mono", "JetBrains Mono", "Cascadia Mono", Consolas,
    monospace;

  /* Шаг 4px. Плотность высокая осознанно: это рабочий стол оператора,
     где ценность экрана — сколько заданий видно без прокрутки. */
  --sp-1: 4px;
  --sp-2: 8px;
  --sp-3: 12px;
  --sp-4: 16px;
  --sp-6: 24px;
  --sp-8: 32px;

  --radius: 4px;
  --radius-sm: 3px;

  /* Высота шапки — токен, а не число в двух местах: заголовок таблицы
     липнет ровно под ней (top: var(--top-h)), и разъехавшись на пиксель
     эти двое дают щель, сквозь которую видно уезжающие строки. */
  --top-h: 48px;

  /* Один токен длительности на весь интерфейс: разнобой таймингов
     читается как несобранность. 120ms — порог, за которым отклик
     перестаёт ощущаться мгновенным. */
  --transition: 120ms ease;

  --z-sticky: 10;
  --z-header: 20;
}

/* Движение здесь только служебное (подсветка строки, спиннер загрузки),
   поэтому при запросе «меньше анимации» его можно снимать целиком, не
   теряя смысла. */
@media (prefers-reduced-motion: reduce) {
  :root {
    --transition: 0ms;
  }
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 14px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}
