/* 95.0 (задачи 2, 3): блок «инвойс не в вашей работе» в талоне карточки артикула (.lock95), список оставшихся артикулов в карточке инвойса пересчёта (.rest95), плашка обновления платформы в окне синхронизации (.upd95). */
/* 94.0 (задача 2): плашка «Заметка» в талоне «Карточка детали» (.art-card .ac-note*) и строка заметки в шапке досье артикула (.ad94-note). */
/* 90.0 (задача 1): окно «Проверка перед загрузкой» файла заявок (.dup90-*); (задача 4): блок «Ответственный менеджер» и история ответственных в карточке клиента (.cm90-*). */
/* 89.0 (задача 2): плитки состава резервных копий баз знаний экрана «Память → Резервные копии» (.mem89-*). */
/* 86.0 (задачи 4, 5, 6, 9, 10): умная индикация карточек ИИ-советника — фон совета нейтральный,
   цвет уровня только на рейке и ярлыке, тема совета (.adv84-topic), шкала уровней (.adv86-bar),
   свёрнутый хвост уровня (.adv86-tail/.adv86-more); карточки досье клиента (.ad86-*); карточка
   остатков «Без адреса» (.kb86-stock); полигон документов консигнации (.doc86-*). */
/* ============================================================
   85.0 (задачи 1–3): блок в КОНЦЕ файла —
   • «85.0 · Кликабельные реестры»: единый вид строк с карточкой
     (.tbl-click, значок «›» .tbl-chev, раздел «Действия» карточки строки);
   • «85.0 · Умная цветовая индикация»: утилиты уровней .ind-*, точка
     .ind-dot, легенда .ind-legend, теги новых уровней (crit · cat · data),
     полосы прогресса с уровнем; красный — только «критично»;
   • «85.0 · ИИ-советник · AI-Core»: объединённая карточка (.aic85) и
     честная подпись методов (.ai2-methods).
   ============================================================ */
/* 87.0 (задачи 3, 6, 7, 9): контроль собранных заявок (.ac87-*: подсветка строк «требует внимания»,
   плашка причины, карточка проблемной заявки); компактный загрузчик остатков «Справочник деталей»
   (.kb86-stock .btn — xs); текстовые блоки предпросмотра документов (.doc86-preview .pr-block*);
   ИСПРАВЛЕНА обрезанная рейка карточек ИИ-советника (.adv84 — рейка на всю высоту, полоска уровня —
   border-left карточки; корень бага — align-items:flex-start у прежнего .ai2-adv). */
/* 84.0 (задачи 1–10): + единый ИИ-советник (.adv84-* — уровни, разбор
   «Причина · Что делать», кнопки перехода к источнику проблемы), карточка
   записи реестров (.rc84-* — шторка «клик по строке»), фильтр советника над
   таблицей плана (.focus84), история адресов артикула (.mvh84-*), быстрый
   табель рабочего времени (.ts84-*) — блок в КОНЦЕ файла. */
/* 80.0 (задачи 2, 3, 4, 5): + хронология «Досье артикула» 2.0 (.ad80-tl /
   .ad80-ev), исправлен несуществующий токен --font-mono → --f-mono у
   счётчика раздела досье, подписи досье и подвал переведены на читаемый
   размер и тон (--c-text-2) — блок в КОНЦЕ файла; @import tokens.css
   получил кэш-бастер, единый с preload в index.html (был ?v=77.0 против
   ?v=79.0 — tokens.css качался дважды, preload не использовался). */
/* 77.0 (задача 2): + подсветка поля-причины отказа в форме заявки на
   отгрузку (.input.err77) и режим «уточните клиента» советника
   (.cadv71.warn77) — блок в КОНЦЕ файла. */
/* 74.0 (задачи 1 и 4): + заглушка недоступного скриншота инструкции
   (.rg74-missing) и стили «Досье артикула» (.ad74-*) — блок в КОНЦЕ файла. */
/* 72.0 (задачи 5, 6): + скриншоты помощника RPS (.rg72-shots/.rg72-shot,
   лупа .rg72-zoom), карточная сетка сводного дашборда .grid.g-9cards.
 ============================================================
   71.0: стили модернизации по 14 задачам владельца — блок в КОНЦЕ
   файла: советник по клиенту в форме отгрузки (.cadv71-*), помощник
   RPS с пошаговыми инструкциями (.rg71-*), компактная таблица этапов
   поставки (.stages71, .st71-go), адреса и комментарий в талоне
   клиента (.cli71-*), компактная таблица «Вместимость ячеек по
   артикулам» без вылезающих колонок (.cap70-tbl — задача 14).
   ============================================================ */
/* ============================================================
   69.0: + .btn-rps69 — кнопка «Загружено в RPS» в пыльно-винной
   гамме (задача 1: минимализм, заметна, но не рябит в глазах).
   ============================================================ */
/* ============================================================
   66.0: стили модернизации — зона 2 рабочих талонов «Информация об
   артикуле» (крупнее и наряднее, единый корпоративный стиль всех
   талонов — задача 4) и поисковая строка по принятым накладным в
   «Разгрузке груза» (.wbhit66/.wbhint66 — задача 2) — блок в конце.
   ============================================================ */
/* ============================================================
   64.0: стили модернизации — выполненные Delivery Note с зелёной
   окантовкой и галочкой (.dn-done) и счётчиком артикулов (.dn-cnt),
   полоса фокус-режима «очередь скрыта» (.focus64), раздел «Оставшиеся
   артикулы для пересчёта» (.rest64), популярные габариты формы
   отгрузки (.dims-pop/.dim-chip) — блок в конце файла.
   ============================================================ */
/* ============================================================
   57.0: «РАБОЧИЙ ТАЛОН» доведён точь-в-точь до макета «Новый дизайн
   карточек»: степперы (−/+, mono 21px), поля .fld/.act-grid/.mono-in,
   фото-док .photo-req, клавиши .kbd, живая сверка .compare (Δ),
   сегментный прогресс .segbar в подвале .tfoot, маршрут комплектации
   .route (hop doc/stock), вертикальный степпер позиций .poslist,
   шапки талона сборки .suggest-head/.order-line/.focus-zone/.pos-nav,
   кнопки .btn.ghost-ok/.copy-btn/.mini, артикул .art-row/.art 24px.
   Применён в «Приёмке», «Заявках», «Отгрузках», «Инвентаризации»,
   «Сортировке» (кроме подвкладки «Консигнация»).
   ============================================================
   56.0: контурные статусы (.tag) по скринам «Было → Стало»; дизайн-
   система «РАБОЧИЙ ТАЛОН» (.ticket) для операционных карточек; сетки
   эталонного макета .g-5 / .g-31 для «Пульса склада».
   54.0 (модернизация по эталонному макету «ShipFlow 2.0»): в конец
   файла добавлен блок 54.0 — группы модулей рельса (.rail-group),
   расширения KPI-карточек (unit / delta / spark / accent), класс
   .card-hi иконки заголовка карточки, «брови» и инсайты приёмки.
   Прежние правила не переписывались.
   ============================================================ */
/* ============================================================
   49.0 (модернизация, задача 12): шапка подвкладок (.subbar) сделана
   непрозрачной — сплошной фон var(--c-bg-2) вместо градиента в
   transparent: при прокрутке контент больше не просвечивает.
   ============================================================ */
/* ============================================================
   47.0 (модернизация, задача 5): календари приведены к теме сайта —
   значок нативного календаря (::-webkit-calendar-picker-indicator)
   получил фирменный курсор/прозрачность, а сами попапы календарей
   перекрашивает color-scheme в tokens.css 12.0 (тёмная тема — тёмный
   календарь, светлая — светлый); импорт tokens.css поднят до 12.0.
   46.1 (модернизация): низ файла — блок «.mp-*»: фирменный выбор
   месяца (core/ui.js monthInput) вместо нативного календаря браузера,
   который игнорировал классическую палитру (скриншот пользователя):
   поле-кнопка в стиле .input, попап с переключателем года, сеткой
   12 месяцев и действиями «Очистить» / «В этом месяце».
   45.0 (задача 2): теги «адрес по умолчанию» в карточке клиента —
   кнопочные теги .cli-addr-tag.t-def (установлен: клик показывает,
   кто и когда поставил) и .t-defset («☆ по умолчанию» — видна только
   менеджеру по клиентам и администратору). Палитра штатная.
   44.0 (задача 3): блок «.ac-zone*» у карточки детали — компактные
   чипы адресов зон склада: основной адрес с ярлыком «Main», рядом —
   адреса зон (Склад №30, Warranty, MODI) из завершённых
   инвентаризаций; длинная ячейка обрезается многоточием, ничего
   не выпирает из карточки.
   43.0 (задача 4): низ файла — блок «.shp-*»: аккуратная сетка граф
   карточки заявки на отгрузку (единые шрифты, подписи-ярлыки,
   значения без переносов) и строки полной информации (shipDetails).
   37.1 — ХОТФИКС СТИЛЯ: восстановлена целостность этой шапки.
   В 37.0 внутрь шапки попал вложенный комментарий со своим
   закрытием: заголовочный комментарий обрывался преждевременно,
   остаток шапки превращался в некорректное CSS-правило и по
   правилам разбора съедал следующий за ним импорт tokens.css —
   классическая палитра не загружалась и сайт рендерился без
   оформления. Правило впредь: внутри этой шапки не открывать и
   не закрывать комментарии — только простой текст.
   37.0: экран входа (подпись, чипы безопасности, подпись ROCH),
   подвал меню (rail-foot в две строки, без точек и обрезания),
   подписи KPI (первая буква — заглавная), чип «Код полки» в
   «Паспортах полок», панель контроля тестовых данных.
   30.0 — (задача 1) КАЧЕСТВЕННЫЕ НАДПИСИ КАРТОЧЕК МЕТРИК И
   ИИ-СОВЕТНИКОВ: подписи KPI переведены с блёклого text-3 на чёткий
   text-2 с выверенным трекингом, подзаголовок читается (межстрочный
   интервал, табличные цифры, числа подсвечены), значение получило
   УМНУЮ ЦВЕТОВУЮ ИНДИКАЦИЮ — тонируется цветом состояния карточки
   (тревожные warn/danger — заметнее, нейтральные — деликатно);
   советы ИИ-карточек стали структурными плашками .ai-tip с цветовой
   индикацией типа (порядок/внимание/проблема/справка), цветной
   кромкой и подложкой — вместо серых строк без акцентов.
   26.0 — стилевая модернизация (низ файла, блок «26.0»):
   (задача 1) ИСПРАВЛЕН БАГ ОБРЕЗКИ КНОПОК в подвале модальных окон
   (.modal-f: flex-end без переноса обрезал левую кнопку — скриншот
   «…торный пересчёт») + аудит всего сайта: перенос строк добавлен
   всем горизонтальным контейнерам с кнопками (.card-h, .tbl-foot,
   .modal-h), вспышка «Сохранено» ограничена шириной экрана;
   (задача 2) фирменная типографика: Source Code Pro (моно, артикулы/
   числа/журналы) и Poppins (словознак, KPI) в поставке, см. tokens 11.0;
   (задача 3) комфорт чтения: «стеклянные» шапка сайта и заголовки
   таблиц, отключение прокрутки «насквозь» у модалок/шторок/таблиц,
   табличные цифры во всех таблицах, аккуратный перенос заголовков
   (text-wrap: balance), брендовый accent-color у нативных контролов,
   полное уважение prefers-reduced-motion;
   (задача 4) корпоративный логотип: плитка знака с фирменным
   градиентом в шапке и на экране входа, словознак гарнитурой Poppins.
   20.0: + стили кнопки «Голосовая сборка»; классическая палитра без изменений */
@import url("tokens.css?v=84.0");   /* 84.0: кэш-бастер выровнен с preload в index.html; 68.0 (задача 9): фирменная гарнитура «ROCH Grotesk»; 80.0 (задача 5): кэш-бастер выровнен с preload в index.html — раньше ?v=77.0 против ?v=79.0 давало два запроса tokens.css и неиспользуемый preload */

/* ---------- базовое ---------- */
*,*::before,*::after{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0; color:var(--c-text);
  /* классическая палитра: глубокий синий + тонкая сетка эталонного листа */
  background:
    linear-gradient(var(--c-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--c-grid) 1px, transparent 1px),
    var(--c-bg);
  background-size:54px 54px, 54px 54px, auto;
  background-attachment:fixed;
  font-family:var(--f-sans); font-size:var(--fs-md); line-height:1.45;
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
}
a{color:var(--c-brand-2); text-decoration:none}
a:hover{text-decoration:underline}
button,input,select,textarea{font:inherit; color:inherit}
svg{flex:0 0 auto}
::selection{background:var(--c-brand-dim)}
*:focus-visible{outline:none; box-shadow:var(--ring); border-radius:var(--r-sm)}
.mono{font-family:var(--f-mono)}
.nowrap{white-space:nowrap}
.hidden{display:none !important}
.spacer{flex:1 1 auto}

/* скроллбары */
*{scrollbar-width:thin; scrollbar-color:var(--c-surface-3) transparent}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-thumb{background:var(--c-surface-3); border-radius:var(--r-pill); border:2px solid transparent; background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:var(--c-border)}

/* ---------- каркас ---------- */
.app{display:grid; grid-template-columns:var(--w-rail) 1fr; grid-template-rows:var(--h-topbar) 1fr; min-height:100vh}
.app.is-collapsed{grid-template-columns:var(--w-rail-collapsed) 1fr}

.topbar{
  grid-column:1/-1; display:flex; align-items:center; gap:var(--sp-3);
  padding:0 var(--sp-4); background:var(--c-surface);
  border-bottom:1px solid var(--c-border); position:sticky; top:0; z-index:40;
}
.brand{display:flex; align-items:center; gap:10px; font-weight:750; letter-spacing:.2px}
.brand .logo{
  width:40px;height:40px;border-radius:12px; display:grid;place-items:center;
  color:var(--c-brand); background:var(--c-brand-dim); border:1px solid var(--c-border);
}
.brand small{display:block; font-weight:500; font-size:var(--fs-xs); color:var(--c-text-3)}
.topbar .divider{width:1px;height:26px;background:var(--c-border)}

.icon-btn{
  height:38px;min-width:38px;padding:0 10px; display:inline-flex;align-items:center;gap:7px;justify-content:center;
  background:var(--c-surface-2); border:1px solid var(--c-border); border-radius:var(--r-sm);
  color:var(--c-text-2); cursor:pointer; transition:var(--t-fast);
}
.icon-btn:hover{color:var(--c-text); background:var(--c-surface-3); border-color:var(--c-brand)}
.icon-btn.is-on{color:var(--c-brand-2); border-color:var(--c-brand); background:var(--c-brand-dim)}

/* 129.0 (задача 2): значки-действия В ЯЧЕЙКАХ таблиц — тихие, без коробки.
   Карандаш/корзина/шеврон в строках «Обзора склада №30», реестров,
   табелей и карточек прежде рисовались габаритной кнопкой 38×38 с рамкой
   и заливкой (var(--c-surface-2) + border) — на плотных строках читались
   как «ужасная обводка» (скриншот владельца). В таблицах — компактный
   прозрачный значок 26×26 с подсветкой при наведении; тулбары таблиц,
   топбар, диалоги и карточки вне таблиц сохраняют прежний вид */
.tbl td .icon-btn{height:26px;min-width:26px;padding:0;background:transparent;border-color:transparent;color:var(--c-text-3)}
.tbl td .icon-btn:hover{background:var(--c-surface-3);color:var(--c-text);border-color:transparent}

/* 122.0 (задача 3): БАЗОВЫЙ вид значка копирования — раньше стилистовался
   только внутри талона (.ticket .copy-btn ниже), а во вкладке «Сортировка»
   (таблицы «Коды маркировки», «База заявок», «Движение по заявкам», карточки
   ЧЗ) оставался браузерным дефолтом — белая коробка в тёмной теме. Теперь
   везде одинаково: маленькая тихая кнопка 22×22, подсветка при наведении —
   как в остальных вкладках */
.copy-btn{width:22px;height:22px;border-radius:3px;display:grid;place-items:center;
  color:var(--c-text-3); background:transparent; border:1px solid transparent;
  cursor:pointer; padding:0; flex:0 0 auto; transition:var(--t-fast)}
.copy-btn:hover{background:var(--c-surface-3); color:var(--c-text)}
.copy-btn svg{width:12px;height:12px}

/* индикатор синхронизации — кликабельный */
.net-btn{background:none;border:none;padding:2px;cursor:pointer;border-radius:var(--r-pill);transition:var(--t-fast)}
.net-btn:hover{transform:translateY(-1px)}
.net-btn:hover .tag{box-shadow:var(--sh-2)}

/* ---------- левый рельс: МОДУЛИ ---------- */
.rail{
  background:var(--c-bg-2); border-right:1px solid var(--c-border);
  display:flex; flex-direction:column; padding:var(--sp-3) var(--sp-2); gap:2px;
  position:sticky; top:var(--h-topbar); height:calc(100vh - var(--h-topbar)); overflow-y:auto;
}
.rail .rail-title{
  font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.12em; color:var(--c-text-3);
  padding:var(--sp-2) var(--sp-3) var(--sp-1);
}
.mod{
  display:flex; align-items:center; gap:11px; padding:10px 11px; border-radius:var(--r-md);
  color:var(--c-text-2); cursor:pointer; border:1px solid transparent; transition:var(--t-fast);
  position:relative; text-align:left; background:none; width:100%;
}
.mod:hover{background:var(--c-surface); color:var(--c-text)}
.mod .mod-ico{width:36px;height:36px;border-radius:11px;display:grid;place-items:center;background:var(--c-surface-2); border:1px solid var(--c-border-soft); color:var(--mod-color,var(--c-brand)); transition:var(--t-fast)}
.mod .mod-txt{display:flex;flex-direction:column;min-width:0}
.mod .mod-txt b{font-weight:640;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mod .mod-txt span{font-size:var(--fs-xs);color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mod.is-active{background:var(--c-surface); color:var(--c-text); border-color:var(--c-border)}
.mod.is-active::before{content:""; position:absolute; left:-2px; top:12px;bottom:12px; width:3px; border-radius:3px; background:var(--mod-color,var(--c-brand))}
.mod.is-active .mod-ico{background:var(--mod-dim,var(--c-brand-dim)); border-color:transparent; color:var(--mod-color,var(--c-brand))}
.mod .badge-count{margin-left:auto; font-size:var(--fs-xs); font-weight:700; padding:1px 8px; border-radius:var(--r-pill); background:var(--c-brand-dim); color:var(--c-brand-2); border:1px solid color-mix(in srgb,var(--c-brand) 30%,transparent); flex:0 0 auto; font-variant-numeric:tabular-nums}
/* 10.7: уведомления модулей — семантическая окраска счётчика.
   info — брендовый (по умолчанию), warn — янтарный, bad — коралловый
   с мягкой пульсацией: «что-то не так» видно боковым зрением. */
.mod .badge-count.warn{background:var(--c-warn-dim); color:var(--c-warn); border-color:color-mix(in srgb,var(--c-warn) 38%,transparent)}
.mod .badge-count.bad{background:var(--c-danger-dim); color:var(--c-danger); border-color:color-mix(in srgb,var(--c-danger) 42%,transparent); animation:badgePulse 2.4s ease-in-out infinite}
@keyframes badgePulse{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--c-danger) 34%,transparent)}50%{box-shadow:0 0 0 4px transparent}}
@media (prefers-reduced-motion: reduce){ .mod .badge-count.bad{animation:none} }
.app.is-collapsed .mod-txt,.app.is-collapsed .rail-title,.app.is-collapsed .rail-foot span{display:none}
.app.is-collapsed .mod{justify-content:center}
/* 10.7: в свёрнутом рельсе счётчик сжимается в цветную точку на иконке */
.app.is-collapsed .mod .badge-count{position:absolute; top:5px; right:5px; width:10px; height:10px; padding:0; margin:0; border-radius:50%; font-size:0; line-height:0; background:var(--c-brand); border:2px solid var(--c-bg-2)}
.app.is-collapsed .mod .badge-count.warn{background:var(--c-warn)}
.app.is-collapsed .mod .badge-count.bad{background:var(--c-danger)}
.rail-foot{margin-top:auto; padding:var(--sp-2); font-size:var(--fs-xs); color:var(--c-text-3); display:flex; align-items:center; gap:8px}

/* ---------- рабочая область ---------- */
.main{min-width:0; display:flex; flex-direction:column}
/* 49.0 (задача 12): шапка подвкладок стала НЕПРОЗРАЧНОЙ — раньше
   градиент уходил в transparent, и при прокрутке контент просвечивал
   сквозь липкую панель, мешая читать названия подвкладок */
.subbar{
  display:flex; align-items:center; gap:var(--sp-2); padding:var(--sp-3) var(--sp-5) 0;
  background:var(--c-bg-2); position:sticky; top:var(--h-topbar); z-index:30;
  border-bottom:1px solid var(--c-border-soft); overflow-x:auto;
}
.subtab{
  display:inline-flex; align-items:center; gap:8px; padding:9px 14px 11px; border:none; background:none;
  color:var(--c-text-3); cursor:pointer; font-size:13.5px; font-weight:600; white-space:nowrap;
  border-bottom:2px solid transparent; transition:var(--t-fast);
}
.subtab:hover{color:var(--c-text-2)}
.subtab .st-ico{width:31px;height:31px;border-radius:10px;display:grid;place-items:center;background:var(--c-surface-2);border:1px solid var(--c-border-soft);color:var(--c-text-3);transition:var(--t-fast)}
.subtab.is-active{color:var(--c-text); border-bottom-color:var(--st-color,var(--c-brand))}
.subtab.is-active .st-ico{background:var(--st-dim,var(--c-brand-dim)); color:var(--st-color,var(--c-brand)); border-color:transparent}
.subtab .st-badge{font-size:10.5px;padding:0 6px;border-radius:var(--r-pill);background:var(--c-surface-3);color:var(--c-text-2)}

.view{padding:var(--sp-5); display:flex; flex-direction:column; gap:var(--sp-4); animation:fade .18s ease}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* Заголовок экрана (без дублирования названия вкладки: только контекст/подсказка) */
.view-hint{display:flex;align-items:center;gap:10px;color:var(--c-text-3);font-size:var(--fs-sm);flex-wrap:wrap}
.view-hint > span:nth-child(2){min-width:0}
/* 10.7: кнопка «Инструкция» — сдержанная, оживает при наведении */
.help-btn{color:var(--c-text-2);background:var(--c-surface);border-color:var(--c-border-soft);flex:0 0 auto}
.help-btn:hover{color:var(--c-brand-2);border-color:var(--c-brand);background:var(--c-brand-dim)}
.view-hint kbd{font-family:var(--f-mono);font-size:10.5px;background:var(--c-surface-2);border:1px solid var(--c-border);border-bottom-width:2px;border-radius:5px;padding:1px 5px;color:var(--c-text-2)}
/* 14.0: компактный чип «Справка» — полный текст на наведении */
.view-hint.compact{gap:8px;flex-wrap:nowrap;min-height:26px}
.hint-chip{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:var(--r-pill);
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);color:var(--c-text-3);
  font-size:var(--fs-xs);font-weight:600;cursor:help;flex:0 0 auto;transition:var(--t-fast)}
.hint-chip:hover{color:var(--c-brand-2);border-color:var(--c-brand);background:var(--c-brand-dim)}
.hint-lead{color:var(--c-text-3);font-size:var(--fs-xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}

/* ---------- карточки / панели ---------- */
.card{background:var(--c-surface); border:1px solid var(--c-border-soft); border-radius:var(--r-lg); box-shadow:var(--sh-1); transition:box-shadow var(--t-med), border-color var(--t-med)}
.card:hover{box-shadow:var(--sh-2); border-color:var(--c-border)}
.card-h{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-3);padding:var(--sp-4) var(--sp-4) var(--sp-2)}
.card-h h3{margin:0;font-size:14.5px;font-weight:680;letter-spacing:.1px}
.card-h p{margin:0;font-size:var(--fs-xs);color:var(--c-text-3)}
.card-h + .card-b{padding-top:var(--sp-3)}
.card-b{padding:var(--sp-4)}
.card-b.flush{padding:0}
.grid{display:grid;gap:var(--sp-4)}
.g-2{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.g-3{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
.g-4{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
/* 56.0 (задача 5): сетки эталонного макета «ShipFlow 2.0» — пять KPI в
   ряд и колонка 3:1 (широкая карта + узкая), на планшете складываются */
.g-5{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}
.g-31{grid-template-columns:minmax(0,2.55fr) minmax(280px,1fr)}
@media (max-width:1100px){.g-31{grid-template-columns:1fr}}
/* 10.7: предохранитель от выхода контента за край карточек/сайта —
   потомки грида и карточки не могут распирать дорожку шире контейнера
   (без этого длинные nowrap-строки «выдавливали» таблицы и бары). */
.grid > *{min-width:0}
.card,.card-b,.kpi{min-width:0}
.card-b{overflow-wrap:break-word}
.row{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}

/* KPI — умная цветовая индикация: акцентная кромка и тонированная иконка */
.kpi{position:relative;overflow:hidden;padding:var(--sp-4) var(--sp-4) var(--sp-4) calc(var(--sp-4) + 4px);border-radius:var(--r-lg);background:var(--c-surface);border:1px solid var(--c-border-soft);transition:box-shadow var(--t-med), border-color var(--t-med)}
.kpi:hover{box-shadow:var(--sh-2);border-color:var(--c-border)}
.kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(180deg,var(--kpi-color,var(--c-brand)),color-mix(in srgb,var(--kpi-color,var(--c-brand)) 30%, transparent))}
.kpi .kpi-top{display:flex;align-items:center;gap:9px;position:relative;z-index:1}
.kpi .kpi-ico{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;background:var(--kpi-dim,var(--c-brand-dim));color:var(--kpi-color,var(--c-brand))}
/* 30.0 (задача 1): подписи KPI стали качественнее — label читается
   (text-2, вес 650, выверенный трекинг), подзаголовок с нормальным
   межстрочным интервалом и табличными цифрами, числа в подзаголовке
   подсвечены (.kpi-num). Значение тонируется цветом состояния
   карточки — «умная» индикация: тревожные тона заметнее. */
.kpi .kpi-label{font-size:var(--fs-xs);font-weight:650;color:var(--c-text-2);text-transform:uppercase;letter-spacing:.065em;line-height:1.35;min-width:0}
.kpi .kpi-val{position:relative;z-index:1;font-size:var(--fs-2xl);font-weight:740;letter-spacing:-.6px;margin-top:6px;font-variant-numeric:tabular-nums;color:color-mix(in srgb, var(--kpi-color, var(--c-brand)) 26%, var(--c-text))}
.kpi.tone-warn .kpi-val{color:color-mix(in srgb, var(--c-warn) 58%, var(--c-text))}
.kpi.tone-danger .kpi-val{color:color-mix(in srgb, var(--c-danger) 58%, var(--c-text))}
.kpi.tone-accent .kpi-val{color:color-mix(in srgb, var(--c-accent) 44%, var(--c-text))}
.kpi .kpi-sub{position:relative;z-index:1;font-size:var(--fs-xs);color:color-mix(in srgb, var(--c-text-2) 72%, var(--c-text-3));line-height:1.5;margin-top:2px;font-variant-numeric:tabular-nums}
.kpi .kpi-sub .kpi-num{color:var(--c-text-2);font-weight:640;font-variant-numeric:tabular-nums}
/* 37.0 (задача 2): подписи карточек метрик — единый корпоративный стиль:
   первая буква заглавная, спокойный трекинг */
.kpi .kpi-sub{letter-spacing:.01em}
.kpi .kpi-sub::first-letter{text-transform:uppercase}
/* 30.0 (задача 1): совет ИИ-карточки — структурная плашка с цветовой
   индикацией типа: порядок (зелёный) · внимание (жёлтый) · проблема
   (красный) · справка (синий); цвет задаётся переменной --tip-c */
.ai-tip{display:flex;gap:10px;align-items:flex-start;min-width:0;padding:9px 12px;border-radius:var(--r-md);background:color-mix(in srgb, var(--tip-c, var(--c-brand)) 7%, transparent);border-left:3px solid var(--tip-c, var(--c-brand))}
.ai-tip .tip-ico{color:var(--tip-c, var(--c-brand));flex:0 0 auto;margin-top:2px;display:inline-flex}
.ai-tip .tip-tx{color:var(--c-text-2);line-height:1.6;font-size:var(--fs-sm);min-width:0;overflow-wrap:anywhere}
.ai-tip .tip-tx b{color:var(--c-text);font-weight:660}
.trend{font-size:var(--fs-xs);font-weight:650;padding:1px 6px;border-radius:var(--r-pill)}
.trend.up{color:var(--c-accent);background:var(--c-accent-dim)}
.trend.down{color:var(--c-danger);background:var(--c-danger-dim)}
.trend.flat{color:var(--c-text-3);background:var(--c-surface-3)}

/* ---------- элементы форм ---------- */
.field{display:flex;flex-direction:column;gap:5px;min-width:0}
.field > label{font-size:var(--fs-xs);color:var(--c-text-3);text-transform:uppercase;letter-spacing:.08em}
.input,.select,.textarea{
  width:100%;padding:9px 11px;background:var(--c-surface-2);border:1px solid var(--c-border);
  border-radius:var(--r-sm);transition:var(--t-fast);
}
.input:hover,.select:hover{border-color:var(--c-border)}
.input:focus,.select:focus,.textarea:focus{border-color:var(--c-brand);background:var(--c-surface)}
.textarea{min-height:96px;resize:vertical;font-family:var(--f-mono);font-size:var(--fs-sm)}
.input-search{position:relative;flex:1 1 260px}
/* 14.0, ФИКС: у input[type=search] WebKit рисует СВОЙ крестик очистки
   рядом с нашим — получалось два крестика. Нативный отключаем. */
.input-search input[type="search"]::-webkit-search-cancel-button,
.input-search input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;appearance:none;display:none}
.input-search > svg{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--c-text-3);pointer-events:none}
.input-search .input{padding-left:36px;height:40px}
/* 10.8: «xl»-поиск стал компактным и профессиональным: 46px вместо 56px,
   обычный шрифт вместо огромного моноширинного, адаптивная ширина */
.input-xl .input{height:46px;font-size:var(--fs-md);padding-left:42px}
.input-xl > svg{left:14px}
/* инструменты поиска: очистка, голосовой ввод, сканер */
.input-search.has-tools .input{padding-right:112px}
.search-tools{position:absolute;right:6px;top:50%;transform:translateY(-50%);display:flex;gap:4px;align-items:center}
.st-btn{width:32px;height:32px;display:grid;place-items:center;border:1px solid transparent;border-radius:9px;
  background:transparent;color:var(--c-text-3);cursor:pointer;transition:var(--t-fast);padding:0}
.st-btn:hover{color:var(--c-brand-2);background:var(--c-brand-dim)}
.st-btn.is-rec{color:var(--c-danger);background:var(--c-danger-dim);animation:recPulse 1.2s ease-in-out infinite}
@keyframes recPulse{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--c-danger) 40%,transparent)}50%{box-shadow:0 0 0 5px transparent}}
/* сканер (машинное зрение) */
.scan-box{position:relative;border-radius:var(--r-lg);overflow:hidden;background:#000;min-height:280px;display:grid;place-items:center}
.scan-video{width:100%;max-height:52vh;object-fit:cover;display:block}
.scan-frame{position:absolute;inset:14% 18%;border:2px solid color-mix(in srgb,var(--c-accent) 80%,transparent);border-radius:14px;
  box-shadow:0 0 0 999px rgba(0,0,0,.25);pointer-events:none}
.scan-status{position:absolute;left:0;right:0;bottom:0;padding:10px 14px;background:rgba(6,10,20,.72);color:#e9eefc;
  font-size:var(--fs-sm);text-align:center;backdrop-filter:blur(4px)}

/* 18.0 (п.1): ВСЕ кнопки платформы — точь-в-точь эталонный вариант
   «Записать факт» (образец-скриншот): тёмно-синяя плашка, умеренное
   скругление углов, тонкая светлая рамка, светлый текст и иконка
   одного цвета. Никаких градиентов и «пилюль» — один вид у всех. */
.btn{
  display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border-radius:10px;
  border:1px solid var(--c-border);
  background:var(--c-surface-2);
  color:var(--c-text);
  cursor:pointer;font-weight:600;font-size:13.5px;transition:var(--t-fast);white-space:nowrap;
  box-shadow:var(--sh-1);
}
.btn > svg, .btn .ico{color:var(--c-text)}
.btn:hover{border-color:var(--c-brand);background:var(--c-surface-3);box-shadow:var(--sh-2)}
.btn:active{transform:translateY(1px)}
.btn:disabled{opacity:.45;cursor:not-allowed}
/* 107.0 (задача 2): МЕТОДИКА ЗАЛИВКИ КНОПОК — одна система на весь сайт:
   • .btn-primary — ЗАЛИТАЯ фирменная кнопка главного действия (в тёмной
     теме бренд светлый, поэтому текст тёмный; в светлой — белый);
   • обычная .btn — лёгкая контурная (как раньше);
   • .btn-danger — контурная красная (разрушительное действие);
   • .btn-accent — контурная зелёная (подтверждение);
   • .btn-ghost — прозрачная без рамки (второстепенное рядом с залитой).
   До 107.0 (18.0) все варианты намеренно совпадали видом; теперь главное
   действие отличается заливкой, остальные — цветом контура. */
.btn-primary{
  border-radius:10px;
  background:var(--c-brand);
  border:1px solid var(--c-brand);
  color:#0f1830;font-weight:600;
  box-shadow:var(--sh-1)}
html[data-theme="light"] .btn-primary{color:#fff}
.btn-primary:hover{
  border-color:var(--c-brand-2);
  background:var(--c-brand-2);
  box-shadow:var(--sh-2)}
.btn-primary > svg, .btn-primary .ico{color:inherit}
/* сегментные переключатели остаются компактными прямоугольниками */
.btn-group .btn-primary{border-radius:0;background:transparent;border:none;box-shadow:none;color:var(--c-text)}
/* 69.0 (задача 1): кнопка «Загружено в RPS» — минимализм, приглушённый
   ВИННЫЙ цвет с «пыльностью» (низкая насыщенность, мягкая рамка в тон):
   кнопка заметна среди нейтральных, но не «рябит», как ярко-красная.
   Работает в обоих дизайнах (значения не зависят от палитры темы). */
.btn-rps69{
  border-radius:10px;
  background:#5c3238;                       /* пыльное вино */
  border:1px solid #74454c;
  color:#efe3e4;font-weight:600;
  box-shadow:var(--sh-1)}
.btn-rps69:hover{
  background:#6a3a41;border-color:#8a545c;box-shadow:var(--sh-2)}
.btn-rps69 > svg, .btn-rps69 .ico{color:#e8cfd2}
html[data-theme="light"] .btn-rps69{background:#7a4048;border-color:#8d525a;color:#f7eeef}
html[data-theme="light"] .btn-rps69:hover{background:#864750;border-color:#9c626a}
/* 107.0 (задача 2): акцент/опасность — контурные семантические,
   ghost — прозрачная (рамки нет, фон появляется при наведении) */
.btn-accent{background:var(--c-surface-2);border:1px solid color-mix(in srgb,var(--c-accent) 55%,transparent);color:var(--c-accent)}
.btn-accent:hover{border-color:var(--c-accent);background:var(--c-accent-dim);color:var(--c-accent)}
.btn-accent > svg, .btn-accent .ico{color:var(--c-accent)}
.btn-danger{background:var(--c-surface-2);border:1px solid color-mix(in srgb,var(--c-danger) 55%,transparent);color:var(--c-danger)}
.btn-danger:hover{border-color:var(--c-danger);background:var(--c-danger-dim);color:var(--c-danger)}
.btn-danger > svg, .btn-danger .ico{color:var(--c-danger)}
.btn-ghost{background:transparent;border-color:transparent;box-shadow:none}
.btn-ghost:hover{background:var(--c-surface-2);border-color:var(--c-border)}
.btn-sm{padding:5px 12px;font-size:var(--fs-sm)}
.btn-group{display:inline-flex;border:1px solid var(--c-border);border-radius:var(--r-sm);overflow:hidden}
.btn-group .btn{border:none;border-radius:0;background:transparent}
.btn-group .btn + .btn{border-left:1px solid var(--c-border)}
.btn-group .btn.is-on{background:var(--c-brand-dim);color:var(--c-brand-2)}

.chip{
  display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:var(--r-pill);
  background:var(--c-surface-2);border:1px solid var(--c-border);font-size:var(--fs-sm);color:var(--c-text-2);cursor:pointer;transition:var(--t-fast)
}
.chip:hover{border-color:var(--c-brand);color:var(--c-text)}
.chip.is-on{background:var(--c-brand-dim);border-color:transparent;color:var(--c-brand-2)}
.chip .x{opacity:.6}
.chip.chip-risk-hi{border-color:color-mix(in srgb,var(--c-danger) 55%,transparent);box-shadow:inset 3px 0 0 var(--c-danger)}
.chip.chip-risk-mid{border-color:color-mix(in srgb,var(--c-warn) 50%,transparent);box-shadow:inset 3px 0 0 var(--c-warn)}
/* интерактивная строка дубля по адресам */
.dup-row{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:9px 12px;
  background:var(--c-surface-2);border:1px solid transparent;border-radius:var(--r-md);cursor:pointer;transition:var(--t-fast);color:var(--c-text)}
.dup-row:hover{border-color:var(--c-brand);box-shadow:var(--sh-1);transform:translateY(-1px)}
/* Теги — цветовая индикация состояния: зелёный/янтарный/красный/
   небесный/лиловый, каждый со своей тонированной подложкой и контуром */
/* 10.8: статус-теги не переносятся на две строки («не пересчитано» и
   прочие статусы больше не съезжают в таблицах) */
/* 56.0 (задача 3): новый стиль всех статусов по скринам «Было» → «Стало»:
   вместо плотной залитой пилюли — лёгкий контурный статус (прозрачный фон,
   тонкая цветная обводка, цветные иконка и текст). Статусы перестали
   «кричать» в таблицах и карточках, но считываются мгновенно. */
.tag{display:inline-flex;align-items:center;gap:6px;padding:3px 11px;border-radius:var(--r-pill);font-size:var(--fs-xs);font-weight:650;border:1px solid transparent;background:transparent;white-space:nowrap;line-height:1.35;max-width:100%}
.tag > span{overflow:hidden;text-overflow:ellipsis}
.tag.ok{color:var(--c-accent);border-color:color-mix(in srgb,var(--c-accent) 46%,transparent)}
.tag.warn{color:var(--c-warn);border-color:color-mix(in srgb,var(--c-warn) 46%,transparent)}
.tag.bad{color:var(--c-danger);border-color:color-mix(in srgb,var(--c-danger) 46%,transparent)}
.tag.info{color:var(--c-cyan);border-color:color-mix(in srgb,var(--c-cyan) 46%,transparent)}
.tag.mut{color:var(--c-text-2);border-color:var(--c-border)}
.tag.vio{color:var(--c-violet);border-color:color-mix(in srgb,var(--c-violet) 46%,transparent)}
.dot{width:7px;height:7px;border-radius:50%;background:currentColor}

.switch{position:relative;width:40px;height:22px;border-radius:var(--r-pill);background:var(--c-surface-3);border:1px solid var(--c-border);cursor:pointer;transition:var(--t-fast)}
.switch::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--c-text-3);transition:var(--t-fast)}
.switch.is-on{background:var(--c-brand-dim);border-color:var(--c-brand)}
.switch.is-on::after{left:20px;background:var(--c-brand)}

/* ---------- таблицы ---------- */
.table-wrap{overflow:auto;max-height:var(--tbl-h,64vh);border-radius:var(--r-lg)}
table.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:13.5px}
table.tbl th,table.tbl td{padding:var(--cell-py,8px) 12px;text-align:left;border-bottom:1px solid var(--c-border-soft);vertical-align:middle}
table.tbl thead th{
  position:sticky;top:0;z-index:5;background:var(--c-surface-2);color:var(--c-text-3);
  font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.08em;font-weight:650;white-space:nowrap;cursor:pointer;
  border-bottom:1px solid var(--c-border);
}
table.tbl thead th:hover{color:var(--c-text-2)}
table.tbl thead th .sort{opacity:.35;margin-left:5px}
table.tbl thead th.is-sorted .sort{opacity:1;color:var(--c-brand)}
table.tbl tbody tr{transition:background var(--t-fast)}
table.tbl tbody tr:nth-child(even){background:color-mix(in srgb, var(--c-surface-2) 38%, transparent)}
table.tbl tbody tr:hover{background:var(--c-surface-2);box-shadow:inset 2px 0 0 var(--c-brand)}
table.tbl tbody tr.is-selected{background:var(--c-brand-dim)}
table.tbl tbody tr.is-dirty td:first-child{box-shadow:inset 3px 0 0 var(--c-warn)}
table.tbl td.num{text-align:right;font-variant-numeric:tabular-nums;font-family:var(--f-mono)}
table.tbl td:has(> .tag){white-space:nowrap}
table.tbl td .mono{font-size:12.5px}
table.tbl tbody td{line-height:1.5}
table.tbl td.cell-edit{cursor:text}
table.tbl td.cell-edit:hover{box-shadow:inset 0 0 0 1px var(--c-border)}
table.tbl td input.cell-input{width:100%;background:var(--c-surface);border:1px solid var(--c-brand);border-radius:5px;padding:3px 6px;font-size:13px}
table.tbl tfoot td{padding:10px 12px;background:var(--c-surface-2);font-weight:650;font-size:var(--fs-sm)}
.tbl-toolbar{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--c-border-soft)}
.tbl-foot{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--c-border-soft);font-size:var(--fs-sm);color:var(--c-text-3)}

/* прогресс */
.bar{height:8px;border-radius:var(--r-pill);background:var(--c-surface-3);overflow:hidden}
.bar > i{display:block;height:100%;border-radius:var(--r-pill);background:var(--c-brand);transition:width .4s ease}
.bar.sm{height:5px}

/* пусто / загрузка */
.empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:var(--sp-10) var(--sp-4);color:var(--c-text-3);text-align:center}
.empty .e-ico{width:68px;height:68px;color:var(--c-brand);border-radius:var(--r-lg);display:grid;place-items:center;background:var(--c-surface-2);border:1px solid var(--c-border)}
.empty b{color:var(--c-text-2);font-size:var(--fs-lg)}
.skel{background:linear-gradient(90deg,var(--c-surface-2),var(--c-surface-3),var(--c-surface-2));background-size:200% 100%;animation:sk 1.1s infinite;border-radius:var(--r-sm);height:14px}
@keyframes sk{0%{background-position:200% 0}100%{background-position:-200% 0}}

/* тосты */
.toasts{position:fixed;right:18px;bottom:18px;z-index:100;display:flex;flex-direction:column;gap:9px;max-width:380px}
/* Уведомления — каждому типу свой цвет: пиктограмма в тонированном
   кружке, цветная кромка и лёгкий тонированный фон */
.toast{display:flex;gap:11px;align-items:flex-start;padding:12px 14px;border-radius:var(--r-md);background:var(--c-surface-2);border:1px solid var(--c-border);box-shadow:var(--sh-3);animation:slide .2s ease;cursor:pointer}
.toast .toast-ico{width:36px;height:36px;border-radius:11px;display:grid;place-items:center;flex:0 0 auto}
.toast.ok{border-left:3px solid var(--c-accent);background:color-mix(in srgb,var(--c-accent) 7%,var(--c-surface-2))}
.toast.ok .toast-ico{background:var(--c-accent-dim);color:var(--c-accent)}
.toast.err{border-left:3px solid var(--c-danger);background:color-mix(in srgb,var(--c-danger) 7%,var(--c-surface-2))}
.toast.err .toast-ico{background:var(--c-danger-dim);color:var(--c-danger)}
.toast.warn{border-left:3px solid var(--c-warn);background:color-mix(in srgb,var(--c-warn) 7%,var(--c-surface-2))}
.toast.warn .toast-ico{background:var(--c-warn-dim);color:var(--c-warn)}
.toast.info{border-left:3px solid var(--c-cyan);background:color-mix(in srgb,var(--c-cyan) 7%,var(--c-surface-2))}
.toast.info .toast-ico{background:var(--c-cyan-dim);color:var(--c-cyan)}
.toast b{display:block;font-size:13px}
.toast span{font-size:var(--fs-sm);color:var(--c-text-2)}
@keyframes slide{from{opacity:0;transform:translateX(24px)}to{opacity:1;transform:none}}

/* модалка / шторка */
/* 104.0 (тормоза окон): с .overlay снят backdrop-filter:blur — размытие всего
   экрана ПОД окном оплачивалось на каждом открытии (досье, карточки строк,
   подтверждения), сильнее всего поверх больших таблиц и по RDP; затемнение
   фона сохранено, вид практически не изменился */
.overlay{position:fixed;inset:0;background:rgba(6,10,20,.62);z-index:90;display:grid;place-items:center;padding:var(--sp-4);animation:fade .15s ease}
.modal{width:min(720px,100%);max-height:86vh;overflow:auto;background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--r-xl);box-shadow:var(--sh-3)}
/* 10.7: содержимое всплывающих инструкций — нумерованные тезисы + плашка «важно» */
.help-doc{display:flex;flex-direction:column;gap:var(--sp-3)}
.help-intro{margin:0;color:var(--c-text-2);font-size:var(--fs-sm);line-height:1.6}
.help-steps{display:flex;flex-direction:column;gap:6px}
.help-step{display:flex;gap:12px;align-items:flex-start;padding:10px 12px;background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-radius:var(--r-md)}
.help-step .help-n{flex:0 0 auto;width:24px;height:24px;border-radius:8px;display:grid;place-items:center;background:var(--c-brand-dim);color:var(--c-brand-2);font-size:var(--fs-xs);font-weight:750;margin-top:1px}
.help-step .help-t{display:flex;flex-direction:column;gap:2px;min-width:0}
.help-step .help-t b{font-size:13.5px;font-weight:680}
.help-step .help-t span{font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.55}
.help-note{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:var(--r-md);background:var(--c-warn-dim);border:1px solid color-mix(in srgb,var(--c-warn) 35%,transparent);color:var(--c-warn);font-size:var(--fs-sm);line-height:1.55}
.help-note svg{margin-top:2px}
.modal-h{display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:var(--sp-4) var(--sp-5);border-bottom:1px solid var(--c-border-soft)}
.modal-h h3{min-width:0}
.modal-h h3{margin:0;font-size:var(--fs-lg)}
.modal-b{padding:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-4)}
/* 26.0 (задача 1), ФИКС БАГА ОБРЕЗКИ: у подвала модалки был flex-end БЕЗ
   переноса — когда кнопки («Повторный пересчёт», «Назначить сотрудника…»,
   «Отмена», «Принять факт») не влезали в ширину окна, ряд выезжал за левый
   край и первая кнопка обрезалась. Теперь кнопки переносятся на новую строку. */
.modal-f{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:var(--sp-2);padding:var(--sp-4) var(--sp-5);border-top:1px solid var(--c-border-soft)}
.modal-f > .btn{max-width:100%}
.drawer{position:fixed;top:0;right:0;height:100vh;width:min(520px,94vw);background:var(--c-surface);border-left:1px solid var(--c-border);box-shadow:var(--sh-3);z-index:95;display:flex;flex-direction:column;animation:dr .22s ease}
@keyframes dr{from{transform:translateX(30px);opacity:.4}to{transform:none;opacity:1}}

/* двухпанельный layout (разделы / база знаний / архив) */
.split{display:grid;grid-template-columns:270px 1fr;gap:var(--sp-4);align-items:start}
.split.narrow{grid-template-columns:230px 1fr}
@media (max-width:1080px){.split,.split.narrow{grid-template-columns:1fr}}
.list-nav{display:flex;flex-direction:column;gap:2px;padding:var(--sp-2);max-height:72vh;overflow:auto}
.list-nav .ln{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:var(--r-sm);cursor:pointer;color:var(--c-text-2);border:1px solid transparent;transition:var(--t-fast);text-align:left;background:none;width:100%}
.list-nav .ln:hover{background:var(--c-surface-2);color:var(--c-text)}
.list-nav .ln.is-active{background:var(--c-brand-dim);color:var(--c-brand-2);border-color:transparent;font-weight:640}
.list-nav .ln .ln-c{margin-left:auto;font-size:var(--fs-xs);color:var(--c-text-3)}
.list-nav .ln-group{font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--c-text-3);padding:var(--sp-3) 10px var(--sp-1)}

/* таймлайн (журнал/архив) */
.timeline{position:relative;padding-left:26px}
.timeline::before{content:"";position:absolute;left:9px;top:6px;bottom:6px;width:2px;background:var(--c-border)}
.tl-item{position:relative;padding:10px 0}
.tl-item::before{content:"";position:absolute;left:-21px;top:16px;width:10px;height:10px;border-radius:50%;background:var(--c-surface);border:2px solid var(--tl-color,var(--c-brand))}
.tl-time{font-family:var(--f-mono);font-size:var(--fs-xs);color:var(--c-text-3)}
.tl-body{background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-radius:var(--r-md);padding:10px 12px;margin-top:4px}

/* графики */
.chart{width:100%;height:var(--ch-h,240px);display:block;overflow:visible}
.legend{display:flex;gap:var(--sp-4);flex-wrap:wrap;font-size:var(--fs-sm);color:var(--c-text-2)}
.legend i{width:10px;height:10px;border-radius:3px;display:inline-block;margin-right:6px}
.heat{display:grid;grid-template-columns:repeat(auto-fill,minmax(13px,1fr));gap:3px}
.heat i{aspect-ratio:1;border-radius:3px;background:var(--c-surface-3)}
/* 14.0: календарь активности (тепловая карта в стиле контрибуций) */
.heat2{display:flex;flex-direction:column;gap:7px}
.heat2 .hm-months{display:grid;gap:3px;padding-left:26px;font-size:10px;color:var(--c-text-3);line-height:1}
.heat2 .hm-months span{overflow:visible;white-space:nowrap}
.heat2 .hm-body{display:flex;gap:6px;align-items:stretch}
.heat2 .hm-dows{display:grid;grid-template-rows:repeat(7,1fr);gap:3px;width:20px;font-size:9.5px;color:var(--c-text-3);text-align:right}
.heat2 .hm-dows span{display:flex;align-items:center;justify-content:flex-end}
.heat2 .hm-grid{display:grid;grid-auto-flow:column;grid-template-rows:repeat(7,1fr);gap:3px;flex:1;min-width:0}
.heat2 .hm-grid i,.heat2 .hm-legend i{border-radius:3px;aspect-ratio:1;min-width:7px;transition:transform var(--t-fast)}
.heat2 .hm-grid i:hover{transform:scale(1.35);outline:1px solid var(--c-brand)}
.heat2 i.lvx{background:transparent}
.heat2 i.lv0{background:var(--c-surface-3)}
.heat2 i.lv1{background:color-mix(in srgb, var(--c-brand) 28%, transparent)}
.heat2 i.lv2{background:color-mix(in srgb, var(--c-brand) 52%, transparent)}
.heat2 i.lv3{background:color-mix(in srgb, var(--c-brand) 76%, transparent)}
.heat2 i.lv4{background:var(--c-brand)}
.heat2 .hm-foot{display:flex;align-items:center;gap:10px;font-size:var(--fs-xs);color:var(--c-text-3);flex-wrap:wrap}
.heat2 .hm-legend{display:inline-flex;align-items:center;gap:3px}
.heat2 .hm-legend i{width:11px;height:11px}
.heat2 .hm-legend em{font-style:normal;margin:0 4px}
.heat2 .hm-stats b{color:var(--c-text-2)}

/* 14.0: фототека артикулов */
.photo-thumb{display:grid;place-items:center;border-radius:var(--r-sm);border:1px solid var(--c-border-soft);
  background:var(--c-surface-2);color:var(--c-text-3);cursor:pointer;overflow:hidden;padding:0;flex:0 0 auto;transition:var(--t-fast)}
.photo-thumb img{width:100%;height:100%;object-fit:cover}
.photo-thumb:hover{border-color:var(--c-brand);color:var(--c-brand)}
.photo-thumb.is-empty{border-style:dashed}

/* 14.0: карточка артикула в «Пересчёте груза» */
.art-card{border:1px solid var(--c-border-soft);border-radius:var(--r-lg);background:var(--c-surface);
  padding:var(--sp-4);display:flex;gap:var(--sp-4);align-items:flex-start;flex-wrap:wrap;box-shadow:var(--sh-1)}
.art-card .ac-art{font-family:var(--f-mono);font-size:24px;font-weight:800;letter-spacing:.5px;color:var(--c-text);line-height:1.1}
.art-card .ac-art mark{background:var(--c-warn-dim);color:var(--c-warn);border-radius:3px;padding:0 2px}
.art-card .ac-name{color:var(--c-text);font-size:var(--fs-md);font-weight:650;margin-top:4px;line-height:1.35;letter-spacing:-.1px}
.art-card .ac-name:first-letter{text-transform:uppercase}
.art-card .ac-desc{color:var(--c-text-2);font-size:var(--fs-sm);margin-top:6px;line-height:1.55;max-width:72ch}
.art-card .ac-desc:first-letter{text-transform:uppercase}
.art-card .ac-comp{display:inline-flex;align-items:center;gap:6px;margin-top:8px;padding:3px 11px;border-radius:var(--r-pill);
  background:var(--c-violet-dim);color:var(--c-violet);font-size:var(--fs-xs);font-weight:650;letter-spacing:.2px}
.art-card .ac-comp b{font-weight:750;text-transform:uppercase;letter-spacing:.4px}
/* 94.0 (задача 2): плашка «Заметка» в талоне детали — как комментарий клиента (.cli71-note): янтарная рейка,
   полный текст, перенос слов, подсветка совпадения поиска */
.art-card .ac-note{display:flex;gap:7px;align-items:flex-start;margin-top:8px;padding:8px 10px;max-width:72ch;
  border-radius:var(--r-sm);background:var(--c-surface-2);border-left:3px solid var(--c-warn);
  font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.45;overflow-wrap:anywhere}
.art-card .ac-note-ic{flex:0 0 auto;color:var(--c-warn);display:inline-flex;margin-top:2px}
.art-card .ac-note-txt{min-width:0}
.art-card .ac-note-txt b{color:var(--c-text);font-weight:650}
.art-card .ac-note mark{background:var(--c-warn-dim);color:var(--c-warn);border-radius:3px;padding:0 2px}
.ad94-note{border-left:3px solid var(--c-warn);padding-left:8px;overflow-wrap:anywhere}
.art-card .ac-dn{display:inline-flex;align-items:center;gap:6px;margin-top:8px;padding:5px 12px;border-radius:var(--r-pill);
  background:var(--c-cyan-dim);color:var(--c-cyan);font-family:var(--f-mono);font-weight:700;font-size:var(--fs-sm)}
.art-card .ac-zones{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px;min-width:0}
.art-card .ac-zone{display:inline-flex;align-items:center;gap:7px;padding:3px 10px;border-radius:var(--r-pill);
  border:1px solid var(--c-border-soft);background:var(--c-surface-2);max-width:100%;min-width:0}
.art-card .ac-zone .z{font-size:9.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--c-text-3);white-space:nowrap}
.art-card .ac-zone b{font-family:var(--f-mono);font-size:var(--fs-xs);font-weight:700;color:var(--c-text);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.art-card .ac-zone.is-main{border-color:color-mix(in srgb, var(--c-brand) 45%, var(--c-border-soft));background:var(--c-brand-dim)}
.art-card .ac-zone.is-main .z{color:var(--c-brand-2)}
.art-card .ac-meta{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.art-card .ac-qty{font-size:var(--fs-xl);font-weight:800;font-family:var(--f-mono)}

/* база знаний */
.article{max-width:840px;font-size:14.5px;line-height:1.65}
.article h2{font-size:var(--fs-xl);margin:var(--sp-6) 0 var(--sp-2)}
.article h3{font-size:var(--fs-lg);margin:var(--sp-5) 0 var(--sp-2);color:var(--c-text)}
.article p{margin:0 0 var(--sp-3);color:var(--c-text-2)}
.article ul,.article ol{margin:0 0 var(--sp-3) 20px;color:var(--c-text-2)}
.article li{margin-bottom:5px}
.article code{font-family:var(--f-mono);font-size:12.5px;background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-radius:5px;padding:1px 5px;color:var(--c-brand-2)}
.article blockquote{margin:0 0 var(--sp-3);padding:10px 14px;border-left:3px solid var(--c-brand);background:var(--c-brand-dim);border-radius:0 var(--r-sm) var(--r-sm) 0;color:var(--c-text-2)}
.toc{position:sticky;top:calc(var(--h-topbar) + 60px);font-size:var(--fs-sm)}
.toc a{display:block;padding:4px 10px;border-left:2px solid var(--c-border);color:var(--c-text-3)}
.toc a:hover,.toc a.is-on{color:var(--c-brand-2);border-left-color:var(--c-brand);text-decoration:none}

/* карта адресов пересчёта */
.addr-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(112px,1fr));gap:8px}
.addr-cell{padding:9px;border-radius:var(--r-sm);border:1px solid var(--c-border);background:var(--c-surface-2);cursor:pointer;transition:var(--t-fast)}
.addr-cell:hover{transform:translateY(-1px);box-shadow:var(--sh-2);border-color:var(--c-brand)}
.addr-cell b{display:block;font-family:var(--f-mono);font-size:12.5px}
.addr-cell small{color:var(--c-text-3);font-size:10.5px}
.addr-cell[data-pri="high"]{border-left:3px solid var(--c-danger)}
.addr-cell[data-pri="mid"]{border-left:3px solid var(--c-warn)}
.addr-cell[data-pri="low"]{border-left:3px solid var(--c-accent)}
.addr-cell.is-done{opacity:.5}

/* ============================================================
   19.1: + фокус-карточка позиции сборки (.pick-hero / .pick-row),
   кнопки под защитой взятия в работу (.is-guarded), версия в плашке
   ROCH ECOSYSTEM (.eco-ver). Остальное — без изменений.
   ============================================================ */
/* ============================================================
   10.8 · ПОЛНАЯ АДАПТИВНОСТЬ ПОД РАЗНЫЕ ЭКРАНЫ
   ≥1100px — полный интерфейс; 720–1100px — свёрнутый рельс;
   ≤720px — мобильный режим: нижняя навигация модулей, компактный
   топбар, полноширинные модалки, таблицы со скроллом.
   ============================================================ */
@media (max-width:1100px){
  .app{grid-template-columns:var(--w-rail-collapsed) 1fr}
  .app .mod-txt,.app .rail-title,.app .rail-foot span{display:none}
  .app .mod{justify-content:center}
  .app .mod .badge-count{position:absolute;top:5px;right:5px;width:10px;height:10px;padding:0;margin:0;border-radius:50%;font-size:0;line-height:0;background:var(--c-brand);border:2px solid var(--c-bg-2)}
  .app .mod .badge-count.warn{background:var(--c-warn)}
  .app .mod .badge-count.bad{background:var(--c-danger)}
  .view{padding:var(--sp-4) var(--sp-3)}
}
@media (max-width:720px){
  :root{--h-topbar:54px}
  .app{grid-template-columns:1fr}
  /* модули — нижняя панель навигации (как в мобильных приложениях) */
  .rail{position:fixed;left:0;right:0;bottom:0;top:auto;height:auto;z-index:70;
    flex-direction:row;align-items:center;justify-content:space-around;gap:0;
    padding:6px 6px calc(6px + env(safe-area-inset-bottom));
    border-top:1px solid var(--c-border);border-right:none;overflow-x:auto;overflow-y:hidden;
    background:color-mix(in srgb,var(--c-bg-2) 92%, transparent);backdrop-filter:blur(10px)}
  .rail .mod{flex:0 0 auto;width:auto;padding:6px 8px}
  .rail .mod.is-active::before{left:10px;right:10px;top:auto;bottom:-6px;width:auto;height:3px}
  .view{padding:var(--sp-3);padding-bottom:calc(86px + env(safe-area-inset-bottom))}
  /* компактный топбар: без быстрого перехода и разделителя */
  .topbar{gap:6px;padding:0 8px}
  .topbar .divider,.topbar .input-search,.brand small{display:none}
  .brand .logo{width:34px;height:34px}
  .icon-btn{height:36px;min-width:36px;padding:0 8px}
  .icon-btn span{display:none}
  .subbar{padding:var(--sp-2) var(--sp-3) 0;top:var(--h-topbar)}
  .subtab{padding:7px 9px 9px;font-size:12.5px}
  .subtab .st-ico{width:27px;height:27px}
  /* сетки и KPI сжимаются, но не ломаются */
  .g-2,.g-3{grid-template-columns:1fr}
  .g-4{grid-template-columns:repeat(auto-fit,minmax(148px,1fr))}
  .kpi .kpi-val{font-size:22px}
  .card-h,.card-b{padding-left:var(--sp-3);padding-right:var(--sp-3)}
  /* модалки и шторки — во весь экран */
  .overlay{padding:8px}
  .modal{max-height:96vh;border-radius:var(--r-lg)}
  .modal-b,.modal-h,.modal-f{padding-left:var(--sp-4);padding-right:var(--sp-4)}
  .modal-f{flex-wrap:wrap}
  .drawer{width:100vw}
  .toasts{left:12px;right:12px;bottom:calc(76px + env(safe-area-inset-bottom));max-width:none}
  /* таблицы: горизонтальный скролл вместо давки */
  .table-wrap{max-height:70vh;-webkit-overflow-scrolling:touch}
  table.tbl{font-size:12.5px;min-width:560px}
  .tbl-toolbar{padding:var(--sp-2) var(--sp-3)}
  .tbl-toolbar .btn span{display:none}
  .tbl-foot{padding:var(--sp-2) var(--sp-3)}
  /* поиск и инструменты — крупные зоны касания */
  .input-xl .input{height:48px}
  .st-btn{width:36px;height:36px}
  .login-card{padding:var(--sp-6) var(--sp-4) var(--sp-4)}
}
@media (max-width:400px){
  .g-4{grid-template-columns:1fr 1fr}
  .subtab span:last-child{max-width:96px;overflow:hidden;text-overflow:ellipsis}
}
/* крупные экраны: контент не растягивается бесконечно */
@media (min-width:1900px){
  .view{max-width:1720px;margin:0 auto;width:100%}
}
@media print{.rail,.topbar,.subbar,.toasts{display:none}.app{display:block}}

/* ---------- 14.1: карточка рекомендации в «Окне заказа» ---------- */
.rec-card{display:flex;align-items:center;gap:12px;padding:11px 13px;background:var(--c-surface-2);
  border:1px solid var(--c-border-soft);border-radius:var(--r-md);min-width:0;transition:border-color var(--t-fast)}
.rec-card:hover{border-color:var(--c-brand)}
.rec-ico{flex:0 0 auto;width:36px;height:36px;border-radius:10px;display:grid;place-items:center;
  color:var(--c-brand);background:var(--c-brand-dim)}
.rec-body{flex:1 1 auto;min-width:0}
.rec-name{font-weight:650;line-height:1.35;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.rec-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:4px;font-size:var(--fs-xs);color:var(--c-text-3)}
.rec-meta .mono{color:var(--c-text-2)}
.rec-add{flex:0 0 auto;display:flex;flex-direction:column;align-items:flex-end;gap:2px}
.rec-add .rec-price{font-size:var(--fs-xs);color:var(--c-text-3);font-family:var(--f-mono)}

/* ---------- 14.1: пересчёт груза — размещение и статусы в карточке ---------- */
.ac-place{display:flex;align-items:center;gap:8px;margin-top:10px;padding:8px 12px;border-radius:var(--r-sm);
  font-size:var(--fs-sm);border:1px solid var(--c-border-soft);background:var(--c-surface-2)}
.ac-place b{font-family:var(--f-mono);letter-spacing:.3px}
.ac-place.client{color:var(--c-violet);border-color:color-mix(in srgb, var(--c-violet) 35%, transparent);background:var(--c-violet-dim)}
.ac-place.addr{color:var(--c-brand-2);border-color:color-mix(in srgb, var(--c-brand) 35%, transparent);background:var(--c-brand-dim)}
.ac-place.none{color:var(--c-warn);border-color:color-mix(in srgb, var(--c-warn) 35%, transparent);background:var(--c-warn-dim)}
.ac-done{display:flex;align-items:center;gap:8px;margin:-2px 0 8px;padding:7px 12px;border-radius:var(--r-sm);
  font-size:var(--fs-sm);font-weight:650;color:var(--c-accent);background:var(--c-accent-dim);
  border:1px solid color-mix(in srgb, var(--c-accent) 40%, transparent)}
.dn-pick{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:10px 12px;border-radius:var(--r-md);
  background:var(--c-surface-2);border:1px dashed var(--c-border)}
.dn-pick .dn-btn{font-family:var(--f-mono)}

/* ---------- 14.1: баннер «собрано под ЧЗ» ---------- */
.chz-banner{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:14px 16px;border-radius:var(--r-lg);
  background:var(--c-warn-dim);border:1px solid color-mix(in srgb, var(--c-warn) 45%, transparent)}
.chz-banner .cb-ico{flex:0 0 auto;width:40px;height:40px;border-radius:12px;display:grid;place-items:center;
  color:var(--c-warn);background:color-mix(in srgb, var(--c-warn) 18%, transparent)}
.chz-banner .cb-txt{flex:1 1 280px;min-width:0;color:var(--c-text-2);font-size:var(--fs-sm);line-height:1.55}
.chz-banner .cb-txt b{color:var(--c-text)}

/* ---------- экран входа (эталонный макет ROCH) ---------- */
.login-wrap{min-height:100vh; display:grid; place-items:center; padding:var(--sp-6);
  background:radial-gradient(900px 500px at 20% -10%, var(--c-cyan-dim), transparent),
             radial-gradient(900px 600px at 110% 110%, var(--c-brand-dim), transparent), var(--c-bg)}
.login-card{width:min(400px,100%); background:var(--c-surface); border:1px solid var(--c-border);
  border-radius:var(--r-xl); padding:var(--sp-8) var(--sp-6) var(--sp-5); box-shadow:var(--sh-3);
  display:flex; flex-direction:column; gap:var(--sp-3); text-align:center}
.login-logo{width:64px;height:64px;border-radius:16px;margin:0 auto;display:grid;place-items:center;
  color:var(--c-brand); background:var(--c-brand-dim); border:1px solid var(--c-border)}
.login-card h1{margin:2px 0 0; font-size:var(--fs-2xl); letter-spacing:.3px}
.login-sub{margin:2px auto var(--sp-2); color:var(--c-text-3); font-size:var(--fs-sm);
  max-width:320px; line-height:1.6; letter-spacing:.01em; text-wrap:balance}
.login-field{text-align:left; display:flex; flex-direction:column; gap:6px}
.login-field label{font-size:var(--fs-xs); letter-spacing:.14em; color:var(--c-text-3); font-weight:600}
.login-input{height:44px}
.login-btn{height:46px; justify-content:center; margin-top:var(--sp-2); font-weight:700}
.login-err{background:var(--c-danger-dim); color:var(--c-danger); border:1px solid var(--c-danger);
  border-radius:var(--r-sm); padding:8px 10px; font-size:var(--fs-sm); text-align:left}
/* 37.0 (задача 1): контур безопасности — лаконичные корпоративные чипы */
.login-sec{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin-top:var(--sp-2)}
.login-sec .sec-item{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);color:var(--c-text-3);
  font-size:var(--fs-xs);line-height:1.5;white-space:nowrap}
.login-sec .sec-item svg{color:var(--c-brand);flex:0 0 auto;opacity:.85}
/* 37.0 (задача 1): подпись ROCH ECOSYSTEM — тонкие линейки по сторонам */
.login-eco{color:var(--c-text-3); font-size:10px; margin-top:var(--sp-3);
  display:flex; align-items:center; justify-content:center; gap:10px; text-transform:uppercase}
.login-eco .eco-line{flex:0 0 30px;height:1px;
  background:linear-gradient(90deg, transparent, var(--c-border));} 
.login-eco .eco-line:last-child{background:linear-gradient(90deg, var(--c-border), transparent)}
.eco-brand{font-weight:800; letter-spacing:.34em; color:var(--c-brand)}
.eco-word{letter-spacing:.3em;color:var(--c-text-3)}
.eco-dot{width:3px;height:3px;border-radius:50%;background:var(--c-brand);display:inline-block;flex:0 0 auto}
.eco-year{font-family:var(--f-mono);font-weight:700;color:var(--c-text-2);letter-spacing:.18em}
/* 37.0 (задача 12): подвал меню — две строки, без точек и обрезания */
.rail-foot{align-items:center}
.rail-foot .rf-logo{flex:0 0 auto;display:grid;place-items:center}
.rail-foot .eco-foot{display:flex;flex-direction:column;gap:1px;min-width:0}
.rail-foot .ef-top{display:flex;align-items:center;gap:6px;white-space:nowrap}
.rail-foot .ef-top .eco-brand{letter-spacing:.22em;font-size:10.5px}
.rail-foot .eco-word{letter-spacing:.2em;font-size:9px}
.rail-foot .ef-sub{font-family:var(--f-mono);font-size:9.5px;color:var(--c-text-3);letter-spacing:.05em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}
.app.is-collapsed .rail-foot .eco-foot{display:none}

/* ============================================================
   15.0 · новые компоненты
   ============================================================ */
/* --- хронология действий (Память → Журнал): лента по дням --- */
.tl{display:grid;gap:2px;position:relative}
.tl-day{display:flex;align-items:baseline;gap:10px;margin:14px 0 6px;padding-bottom:6px;border-bottom:1px solid var(--c-border-soft)}
.tl-day:first-child{margin-top:0}
.tl-day b{font-size:var(--fs-md)}
.tl-day span{font-size:var(--fs-xs);color:var(--c-text-3)}
.tl-item{display:flex;gap:12px;align-items:flex-start;padding:7px 8px;border-radius:var(--r-md);position:relative}
.tl-item:hover{background:var(--c-surface-2)}
.tl-item + .tl-item::before{content:'';position:absolute;left:23px;top:-9px;height:9px;width:1px;background:var(--c-border-soft)}
.tl-ico{flex:0 0 auto;width:30px;height:30px;display:grid;place-items:center;border-radius:50%;
  border:1px solid var(--c-border);background:var(--c-surface)}
.tl-body{min-width:0;flex:1 1 auto}
.tl-mod{font-size:var(--fs-xs);font-weight:600;letter-spacing:.2px}
.tl-act{font-size:var(--fs-xs);color:var(--c-text-3);background:var(--c-surface-3);border-radius:5px;padding:1px 6px}
.tl-time{font-size:var(--fs-xs);color:var(--c-text-3);margin-left:auto}
.tl-text{color:var(--c-text-2);font-size:var(--fs-sm);margin-top:2px;line-height:1.5}

/* --- фотофиксация повреждений --- */
.dmg-badge{border-color:color-mix(in srgb,var(--c-warn) 45%,transparent)}
.dmg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.dmg-cell{border:1px solid var(--c-border-soft);border-radius:var(--r-md);overflow:hidden;background:var(--c-surface-2)}
.dmg-cell img{width:100%;height:110px;object-fit:cover;display:block;cursor:zoom-in}
.dmg-cell .dmg-off{height:110px;display:grid;place-items:center;color:var(--c-text-3)}
.dmg-meta{padding:7px 9px;display:grid;gap:2px}
.dmg-meta b{font-size:var(--fs-xs);font-family:var(--f-mono);word-break:break-all;line-height:1.35}
.dmg-meta span{font-size:10.5px;color:var(--c-text-3)}

/* --- бригада пересчёта: карточки инвойсов --- */
.inv-chip{border:1px solid var(--c-border-soft);border-radius:var(--r-md);background:var(--c-surface-2);
  padding:10px 12px;min-width:210px;flex:0 1 auto}
.inv-chip.is-mine{border-color:color-mix(in srgb,var(--c-accent) 55%,transparent);
  box-shadow:inset 3px 0 0 var(--c-accent)}

/* ==== 15.01 (п.2): метаданные файлов — смысловые чипы ==== */
.file-meta{display:inline-flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:2px}
.fm-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);color:var(--c-text-3);
  font-size:var(--fs-xs);line-height:1.5;white-space:nowrap;max-width:100%}
.fm-chip b{color:var(--c-text-2);font-weight:600;overflow:hidden;text-overflow:ellipsis}
.fm-chip svg{flex:0 0 auto;opacity:.75}
/* ==== 15.01 (п.6): предпросмотр фото в форме неизвестного артикула ==== */
.unk-photos{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.unk-photos img{width:56px;height:56px;object-fit:cover;border-radius:10px;border:1px solid var(--c-border)}
/* ==== 15.01 (п.7): бригада сборки (карточки-чипы, как в пересчёте) ==== */
.asm-chip{background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-radius:12px;padding:8px 12px;min-width:190px}
.asm-chip.is-mine{border-color:var(--c-accent);box-shadow:0 0 0 1px var(--c-accent-dim, rgba(74,222,128,.2)) inset}
.asm-chip.is-busy{opacity:.85}


/* ---------- 16.1 (п.5): позиции заявки и чипы-сводки ---------- */
.pos-name{font-size:var(--fs-md);font-weight:650;line-height:1.3;letter-spacing:-.1px}
.pos-name:first-letter{text-transform:uppercase}
.pos-art{font-family:var(--f-mono);font-size:var(--fs-xs);color:var(--c-text-2);
  background:var(--c-surface-3);border:1px solid var(--c-border-soft);padding:1px 8px;border-radius:6px}
.qty-badge{display:inline-flex;align-items:center;gap:4px;font-family:var(--f-mono);font-weight:750;
  font-size:var(--fs-xs);color:var(--c-brand-2);background:var(--c-brand-dim);
  padding:2px 10px;border-radius:var(--r-pill);white-space:nowrap}
.sub-chips{display:inline-flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:2px}
.sub-chips .tag{font-size:10.5px}


/* ============================================================
   19.0 (п.1) — карточки адресов клиента («Знания → Карточка клиентов»)
   ============================================================ */
.cli-addr-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(272px,1fr));gap:10px}
.cli-addr{background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-left:2px solid var(--c-brand);
  border-radius:var(--r-md);padding:11px 14px;display:grid;gap:6px;min-width:0}
.cli-addr.legal{border-left-color:var(--c-warn)}
.cli-addr-top{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.cli-addr-no{color:var(--c-text-3);font-size:10px;font-weight:800;letter-spacing:1px}
.cli-addr-tag{font-size:9.5px;font-weight:800;letter-spacing:.6px;padding:2px 9px;border-radius:var(--r-pill);
  white-space:nowrap;border:1px solid var(--c-border-soft);color:var(--c-text-2);background:var(--c-surface)}
.cli-addr-tag.t-dl{color:var(--c-brand-2);background:var(--c-brand-dim);border-color:transparent}
.cli-addr-tag.t-addr{color:var(--c-cyan);background:color-mix(in srgb,var(--c-cyan) 12%,transparent);border-color:transparent}
.cli-addr-tag.t-site{color:var(--c-accent);background:color-mix(in srgb,var(--c-accent) 12%,transparent);border-color:transparent}
.cli-addr-tag.t-legal{color:var(--c-warn);background:color-mix(in srgb,var(--c-warn) 12%,transparent);border-color:transparent}
.cli-addr-tag.t-dup{color:var(--c-text-3)}
.cli-addr-text{color:var(--c-text);font-size:var(--fs-sm);line-height:1.45;font-weight:600;overflow-wrap:anywhere}
.cli-addr-contact{display:flex;gap:10px;flex-wrap:wrap;color:var(--c-text-2);font-size:var(--fs-xs)}
.cli-addr-contact .mono{color:var(--c-brand-2)}
.cli-addr-meta{color:var(--c-text-3);font-size:var(--fs-xs);border-top:1px dashed var(--c-border-soft);padding-top:5px}
.cli-addr-empty{color:var(--c-text-3);font-size:var(--fs-sm);padding:6px 2px}
/* 45.0 (задача 2): тег «адрес по умолчанию» (кнопки в шапке карточки адреса) */
button.cli-addr-tag{cursor:pointer;font-family:inherit;line-height:inherit}
.cli-addr-tag.t-def{color:var(--c-accent);background:color-mix(in srgb,var(--c-accent) 14%,transparent);
  border-color:color-mix(in srgb,var(--c-accent) 40%,transparent)}
.cli-addr-tag.t-defset{color:var(--c-text-3);background:transparent;border:1px dashed var(--c-border)}
.cli-addr-tag.t-defset:hover{color:var(--c-accent);border-color:var(--c-accent)}

/* ============================================================
   19.0 (п.3) — AI-Core: карточка ИИ-инсайтов
   ============================================================ */
.ai2-chips{display:flex;gap:8px;flex-wrap:wrap}
.ai2-chip{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:var(--r-md);
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);min-width:0}
.ai2-chip-l{color:var(--c-text-3);font-size:var(--fs-xs)}
.ai2-chip-v{color:var(--c-text);font-weight:750;font-family:var(--f-mono);font-size:var(--fs-sm)}
.ai2-chip-f{display:inline-flex;align-items:center;gap:4px;color:var(--c-violet);font-size:var(--fs-xs);
  font-family:var(--f-mono);cursor:help}
.ai2-chip-a{font-size:9.5px;font-weight:800;letter-spacing:.6px;padding:2px 8px;border-radius:var(--r-pill);cursor:help}
.ai2-chip-a.up{color:var(--c-warn);background:color-mix(in srgb,var(--c-warn) 14%,transparent)}
.ai2-chip-a.down{color:var(--c-cyan);background:color-mix(in srgb,var(--c-cyan) 14%,transparent)}
.ai2-adv{display:flex;gap:10px;align-items:flex-start;padding:9px 11px;border-radius:var(--r-md);
  background:var(--c-surface-2);border:1px solid var(--c-border-soft)}
.ai2-adv.demoted{opacity:.6}
.ai2-adv.voted .ai2-fb{pointer-events:none;opacity:.35}
.ai2-adv-ic{flex:0 0 auto;width:30px;height:30px;border-radius:8px;display:grid;place-items:center;
  border:1px solid var(--c-border-soft);color:var(--c-brand);background:var(--c-brand-dim)}
.ai2-adv-ic.sev3{color:var(--c-danger);background:color-mix(in srgb,var(--c-danger) 12%,transparent)}
.ai2-adv-ic.sev2{color:var(--c-warn);background:color-mix(in srgb,var(--c-warn) 12%,transparent)}
.ai2-adv-note{margin-top:3px;color:var(--c-text-3);font-size:var(--fs-xs);font-style:italic}
.ai2-adv-fb{display:flex;gap:4px;flex:0 0 auto}
.ai2-fb{padding:4px 8px;min-height:0}
.ai2-foot{display:flex;gap:6px;align-items:center;color:var(--c-text-3);font-size:var(--fs-xs);
  border-top:1px dashed var(--c-border-soft);padding-top:8px}
.ai2-foot b{color:var(--c-text-2)}


/* ==================== 19.1 (п.3): фокус-карточка позиции сборки ==================== */
.pick-hero{background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-left:3px solid var(--c-brand);
  border-radius:var(--r-lg);padding:14px 16px}
.pick-hero.is-done{border-left-color:var(--c-accent);opacity:.92}
.ph-top{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.ph-sor{font-weight:800;font-size:14px;letter-spacing:.5px;color:var(--c-brand-2)}
.ph-badge{font-size:9.5px;font-weight:800;letter-spacing:.9px;padding:3px 10px;border-radius:var(--r-pill);text-transform:uppercase}
.ph-badge.on{color:var(--c-accent);background:color-mix(in srgb,var(--c-accent) 14%,transparent)}
.ph-badge.off{color:var(--c-warn);background:var(--c-warn-dim)}
.ph-pos{font-size:9.5px;font-weight:800;letter-spacing:.9px;color:var(--c-text-3);text-transform:uppercase}
.ph-main{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:12px}
.ph-art{font-family:var(--f-mono);font-size:26px;font-weight:800;letter-spacing:.5px;line-height:1.1;color:var(--c-text)}
.ph-art mark{background:var(--c-warn-dim);color:var(--c-warn);border-radius:3px;padding:0 2px}
.ph-name{font-size:var(--fs-md);font-weight:650;color:var(--c-text);letter-spacing:-.1px;min-width:0}
.ph-name:first-letter{text-transform:uppercase}
.ph-client{font-size:var(--fs-xs);font-weight:700;color:var(--c-text-2);padding:3px 10px;border-radius:var(--r-pill);
  background:var(--c-surface);border:1px solid var(--c-border-soft)}
/* 35.0 (задача 3): кнопки фокус-карточки — единый аккуратный ряд:
   [Собрано] [карандаш] [микрофон] одного роста, микрофон рядом с
   карандашом (раньше стоял отдельно и «криво») */
.ph-actions{margin-left:auto;flex:0 0 auto;display:flex;align-items:center;gap:6px;flex-wrap:nowrap}
.ph-actions .btn{height:38px}
.ph-actions .icon-btn{height:38px;min-width:38px}
.ph-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:10px;margin-top:14px}
.ph-f{background:var(--c-surface);border:1px solid var(--c-border-soft);border-radius:var(--r-md);padding:9px 12px;min-width:0}
.ph-f label{display:block;font-size:9px;font-weight:800;letter-spacing:.8px;text-transform:uppercase;color:var(--c-text-3);margin-bottom:4px}
.ph-f b{font-size:17px;font-weight:750;line-height:1.25;overflow-wrap:anywhere;display:block}
.ph-prog{margin-top:14px}
.ph-prog-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:5px}
.ph-prog-top label{font-size:9.5px;font-weight:800;letter-spacing:.9px;text-transform:uppercase;color:var(--c-text-3)}
/* список позиций под фокус-карточкой */
.pick-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:space-between;
  padding:8px 11px;background:var(--c-surface-2);border:1px solid transparent;border-radius:var(--r-sm);cursor:pointer}
.pick-row:hover{border-color:var(--c-border)}
.pick-row.is-current{border-color:color-mix(in srgb,var(--c-brand) 55%,transparent);background:color-mix(in srgb,var(--c-brand) 7%,var(--c-surface-2))}
.pick-row.is-done{opacity:.8}
.pick-row .pr-no{flex:0 0 auto;min-width:22px;text-align:center;font-size:10px;font-weight:800;color:var(--c-text-3)}
/* 19.1 (п.3): кнопка под защитой — заявка не взята в работу */
.btn.is-guarded,.icon-btn.is-guarded{opacity:.45;filter:saturate(.4)}
.btn.is-guarded:hover,.icon-btn.is-guarded:hover{opacity:.6}

/* ==================== 19.1 (п.8): плашка ROCH ECOSYSTEM ==================== */
.eco-ver{font-family:var(--f-mono);font-weight:800;color:var(--c-brand-2);letter-spacing:.06em}
.rail-foot .eco-foot{overflow:hidden} /* 37.0: обрезание перенесено на .ef-sub */

/* ==================== 20.0 (задача 4): голосовая сборка ==================== */
/* кнопка микрофона в фокус-карточке позиции; активный режим пульсирует
   тем же ритмом, что и голосовой ввод поиска (.st-btn.is-rec) */
.icon-btn.ph-voice.is-rec{color:var(--c-danger);background:var(--c-danger-dim);
  border-color:color-mix(in srgb,var(--c-danger) 45%,transparent);animation:recPulse 1.2s ease-in-out infinite}

/* ==================== 21.0 (задача 2): вспышка «Сохранено» ==================== */
/* крупное подтверждение записи факта: большая зелёная галочка по центру
   экрана — заметно кладовщику с телефона в отличие от мелкого тоста */
.saved-splash{position:fixed;inset:0;z-index:1200;display:flex;align-items:center;justify-content:center;
  background:color-mix(in srgb,var(--c-bg) 42%,transparent);pointer-events:auto;
  animation:ssIn .16s ease-out}
.saved-splash.is-out{opacity:0;transition:opacity .24s ease}
.saved-splash .ss-box{display:flex;flex-direction:column;align-items:center;gap:10px;
  background:var(--c-surface);border:1px solid color-mix(in srgb,var(--c-accent) 45%,var(--c-border));
  border-radius:var(--r-lg);padding:28px 44px;box-shadow:0 18px 60px rgba(0,0,0,.45);
  max-width:min(92vw,540px)/* 26.0 (задача 1): не шире экрана телефона */}
.saved-splash .ss-ico{display:flex;align-items:center;justify-content:center;width:76px;height:76px;
  border-radius:50%;color:#fff;background:var(--c-accent);
  box-shadow:0 0 0 10px var(--c-accent-dim);animation:ssPop .28s cubic-bezier(.2,1.4,.4,1)}
.saved-splash .ss-txt{font-size:24px;font-weight:800;letter-spacing:.02em}
.saved-splash .ss-sub{font-size:var(--fs-sm);color:var(--c-text-2);text-align:center;max-width:340px}
@keyframes ssIn{from{opacity:0}to{opacity:1}}
@keyframes ssPop{from{transform:scale(.55)}to{transform:scale(1)}}


/* ============================================================
   26.0 · Профессиональный стиль, комфорт чтения, корпоративный бренд
   (блок собран в конце файла — каскад намеренно уточняет базовые
   правила выше, ни одно из них не переписано «по-живому»)
   ============================================================ */

/* ---------- (задача 2) фирменная типографика ---------- */
/* словознак ShipFlow в шапке — гарнитура бренда Poppins */
.brand > div:last-child > span{
  font-family:var(--f-display);font-weight:700;font-size:16.5px;
  letter-spacing:.012em;line-height:1.15}
/* экран входа: заголовок ShipFlow — той же гарнитурой */
.login-card h1{font-family:var(--f-display);font-weight:700;letter-spacing:.02em}
/* крупные значения KPI — фирменные цифры Poppins */
.kpi .kpi-val{font-family:var(--f-display);font-weight:700;letter-spacing:-.02em}
/* плашка ROCH ECOSYSTEM — брендовая гарнитура */
.eco-brand{font-family:var(--f-display)}
/* моноширинный контур (Source Code Pro) слегка компактнее по межбуквию */
.mono,table.tbl td.num{letter-spacing:-.01em}

/* ---------- (задача 3) комфортное и оперативное чтение ---------- */
/* нативные контролы (чекбоксы, радио, прогрессы) — фирменного цвета */
:root{accent-color:var(--c-brand)}
/* «стеклянная» шапка сайта: контент мягко уходит под неё при прокрутке,
   контекст (модуль, поиск, синхронизация) всегда читается */
.topbar{
  background:color-mix(in srgb,var(--c-surface) 86%,transparent);
  -webkit-backdrop-filter:blur(14px) saturate(1.15);
  backdrop-filter:blur(14px) saturate(1.15)}
/* «стеклянные» прилипающие заголовки таблиц + тень-отрыв: при прокрутке
   длинных реестров видно и колонки, и строки под ними */
table.tbl thead th{
  background:color-mix(in srgb,var(--c-surface-2) 90%,transparent);
  -webkit-backdrop-filter:blur(8px);
  backdrop-filter:blur(8px);
  box-shadow:0 8px 14px -12px rgba(5,9,22,.6)}
/* все таблицы — табличные цифры: колонки чисел выравниваются в столбик */
table.tbl{font-variant-numeric:tabular-nums}
/* прокрутка не «проваливается насквозь»: докрутив таблицу/модалку/шторку
   до конца, страница под ними не уезжает */
.modal,.drawer,.table-wrap,.rail,.list-nav{overscroll-behavior:contain}
/* заголовки не рвутся на строку из одного слова, абзацы без «висяков» */
.card-h h3,.modal-h h3,.empty b,.login-card h1{text-wrap:balance}
.article p,.help-intro,.help-step .help-t span,.toast span{text-wrap:pretty}
/* картинки и медиа никогда не распирают карточки */
img,video,canvas{max-width:100%}
/* плавная прокрутка к якорям и позициям */
html{scroll-behavior:smooth}
/* полное уважение к «уменьшить движение»: анимации и переходы гаснут */
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
}

/* ---------- (задача 4) корпоративный логотип и бренд ---------- */
/* плитка знака в шапке: фирменный градиент «глубокий космос», внутренняя
   световая кромка — монументальная эмблема вместо плоской подложки */
.brand .logo{
  width:42px;height:42px;border-radius:12px;color:var(--c-brand-2);
  background:linear-gradient(165deg,var(--c-surface-3),var(--c-bg-2) 78%);
  border:1px solid var(--c-border);
  box-shadow:inset 0 1px 0 rgba(233,238,252,.09),var(--sh-1)}
.brand small{letter-spacing:.02em}
/* эмблема на экране входа — крупнее и в том же корпоративном исполнении */
.login-logo{
  width:72px;height:72px;border-radius:19px;color:var(--c-brand-2);
  background:linear-gradient(165deg,var(--c-surface-3),var(--c-bg-2) 78%);
  border:1px solid var(--c-border);
  box-shadow:inset 0 1px 0 rgba(233,238,252,.09),var(--sh-2)}

/* мобильный топбар (≤720px): компактная плитка знака — правило ниже по
   каскаду, иначе новая 42px-плитка перекрыла бы мобильные 34px выше */
@media (max-width:720px){
  .brand .logo{width:36px;height:36px;border-radius:10px}
}

/* ---------- (задача 1) добивка аудита обрезки на мобильных ---------- */
/* в узких окнах кнопки подвала модалки растягиваются на всю строку —
   крупные зоны касания, ни одна кнопка не может быть срезана краем */
@media (max-width:520px){
  .modal-f .btn{flex:1 1 auto;justify-content:center}
}


/* ==================== 35.0 (задача 3): альтернативный клиент в сборке ==================== */
/* панель-предложение в фокус-карточке позиции: деталь есть в инвойсе,
   но пришла под ДРУГОГО клиента — показываем инвойс, DN, владельца и
   кнопку подтверждения; после подтверждения панель зеленеет (is-on) */
.ph-alt{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:9px;padding:9px 12px;
  background:var(--c-warn-dim);border:1px solid color-mix(in srgb,var(--c-warn) 35%,transparent);
  border-radius:var(--r-md)}
.ph-alt.is-on{background:color-mix(in srgb,var(--c-accent) 10%,transparent);
  border-color:color-mix(in srgb,var(--c-accent) 35%,transparent)}
.ph-alt-t{display:flex;gap:6px;align-items:center;flex:1 1 100%;
  font-size:10px;font-weight:800;letter-spacing:.7px;text-transform:uppercase;color:var(--c-warn)}
.ph-alt-b{flex:1 1 260px;min-width:0;font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.45}
.ph-alt-b b{color:var(--c-text)}
.ph-alt .btn{flex:0 0 auto}


/* ---------- 37.0 (задача 5): чип «Код полки» в «Паспортах полок» ----------
   значение выровнено по высоте с полями формы и оформлено как код */
.shelf-code-chip{display:inline-flex;align-items:center;justify-content:center;min-width:76px;height:40px;
  padding:0 14px;border-radius:var(--r-sm);font-family:var(--f-mono);font-weight:800;font-size:var(--fs-lg);
  letter-spacing:.06em;color:var(--c-accent);background:color-mix(in srgb, var(--c-accent) 10%, transparent);
  border:1px solid color-mix(in srgb, var(--c-accent) 38%, transparent)}

/* ---------- 37.0 (задача 8): панель контроля тестовых данных ---------- */
.testdata-row{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
  padding:9px 12px;background:var(--c-surface-2);border-radius:var(--r-sm);border:1px solid var(--c-border-soft)}
.testdata-row b{font-size:var(--fs-sm)}
.testdata-row .td-sub{font-size:var(--fs-xs);color:var(--c-text-3)}


/* ---------- 43.0 (задача 4): карточка заявки на отгрузку ---------- */
.shp-card{cursor:pointer}
.shp-card:hover{border-color:color-mix(in srgb, var(--c-brand) 40%, var(--c-border))}
.shp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:10px 16px}
.shp-f{min-width:0}
.shp-f .l{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--c-text-3);margin-bottom:2px}
.shp-f .v{font-size:var(--fs-sm);color:var(--c-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.shp-f .v.mono{font-family:var(--f-mono)}
.shp-wide{grid-column:1 / -1}
.shp-wide .v{white-space:normal;overflow:visible;text-overflow:clip;color:var(--c-text-2);line-height:1.45}
/* полная информация (модальное окно): секции и строки «ярлык — значение» */
.shp-sec{font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--c-text-3);
  margin:10px 0 2px;padding-bottom:4px;border-bottom:1px solid var(--c-border-soft)}
.shp-drow{display:flex;gap:14px;align-items:baseline;padding:3px 0}
.shp-drow .l{flex:0 0 200px;font-size:var(--fs-sm);color:var(--c-text-3)}
.shp-drow b{font-size:var(--fs-sm);color:var(--c-text);min-width:0;overflow-wrap:anywhere}

/* ============================================================
   46.1: фирменный выбор месяца (.mp-*) — замена нативного календаря
   input[type=month], который открывал системный попап вне
   классической палитры. Используется в «Отгрузки → Поиск заявок» («За месяц»).
   ============================================================ */
.mp-field{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;text-align:left;font-size:var(--fs-sm);color:var(--c-text)}
.mp-field .mp-ico,.mp-field .mp-car{display:inline-flex;flex:0 0 auto;color:var(--c-text-3);transition:var(--t-fast)}
.mp-field .mp-val{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mp-field .mp-val.is-empty{color:var(--c-text-3)}
.mp-field:hover .mp-ico,.mp-field:hover .mp-car{color:var(--c-brand-2)}
.mp-field.open{border-color:var(--c-brand);background:var(--c-surface)}
.mp-field.open .mp-car{transform:rotate(180deg)}
.mp-pop{position:fixed;z-index:110;width:238px;background:var(--c-surface);border:1px solid var(--c-border);
  border-radius:var(--r-md);box-shadow:var(--sh-3);padding:10px;animation:fade .12s ease}
.mp-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.mp-year{font-family:var(--f-mono);font-weight:700;font-size:var(--fs-md);color:var(--c-text);letter-spacing:.02em}
.mp-nav{width:28px;height:28px;display:grid;place-items:center;border:1px solid transparent;border-radius:var(--r-xs);
  background:transparent;color:var(--c-text-3);cursor:pointer;transition:var(--t-fast);padding:0}
.mp-nav:hover{color:var(--c-brand-2);background:var(--c-brand-dim)}
.mp-nav.prev svg{transform:rotate(180deg)}
.mp-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:4px}
.mp-cell{height:32px;border:1px solid transparent;border-radius:var(--r-xs);background:transparent;color:var(--c-text-2);
  font-size:var(--fs-sm);font-family:var(--f-sans);cursor:pointer;transition:var(--t-fast);padding:0}
.mp-cell:hover{background:var(--c-surface-3);color:var(--c-text)}
.mp-cell.is-now{border-color:var(--c-border);color:var(--c-brand-2)}
.mp-cell.is-sel{background:var(--c-brand);color:var(--c-on-brand);font-weight:660}
.mp-cell.is-sel:hover{background:var(--c-brand-2);color:var(--c-on-brand)}
.mp-foot{display:flex;justify-content:space-between;gap:8px;margin-top:9px;padding-top:8px;border-top:1px solid var(--c-border-soft)}
.mp-link{border:0;background:transparent;color:var(--c-brand);font-size:var(--fs-sm);cursor:pointer;
  padding:3px 6px;border-radius:var(--r-xs);transition:var(--t-fast)}
.mp-link:hover{color:var(--c-brand-2);background:var(--c-brand-dim)}

/* ============================================================
   47.0 (задача 5): нативные календари — в стиле платформы.
   Сам попап красит color-scheme (tokens.css 12.0): тёмная тема —
   тёмный календарь, светлая — светлый. Здесь — значок раскрытия:
   единая прозрачность и курсор, подсветка при наведении. */
input[type="date"]::-webkit-calendar-picker-indicator,
input[type="datetime-local"]::-webkit-calendar-picker-indicator,
input[type="month"]::-webkit-calendar-picker-indicator,
input[type="time"]::-webkit-calendar-picker-indicator{
  cursor:pointer;opacity:.55;transition:var(--t-fast);
}
input[type="date"]:hover::-webkit-calendar-picker-indicator,
input[type="datetime-local"]:hover::-webkit-calendar-picker-indicator,
input[type="month"]:hover::-webkit-calendar-picker-indicator,
input[type="time"]:hover::-webkit-calendar-picker-indicator{
  opacity:.95;
}


/* ============================================================
   54.0 (модернизация по эталонному макету «ShipFlow 2.0»)
   • задача 1: группы модулей левого рельса (.rail-group);
   • задачи 2–4: расширения KPI-карточек (unit / delta / spark /
     accent), нейтральная иконка заголовка карточки (.card-hi),
     «брови» и списки-инсайты приёмки. Базовые стили — для
     классической палитры; корпоративный скин уточняет их в corporate.css.
   ============================================================ */
/* --- группы модулей рельса --- */
.rail-group{font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--c-text-3);padding:14px var(--sp-3) 5px}
.rail .rail-group:first-of-type{padding-top:var(--sp-2)}
.app.is-collapsed .rail-group{margin:6px 12px 2px;padding:0;height:0;font-size:0;border-top:1px solid var(--c-border-soft)}
.app.is-collapsed .rail-group:first-of-type{border-top:0;margin-top:0}
@media (max-width:720px){ .rail .rail-group{display:none} }

/* --- KPI: единица измерения, дельта-пилюля, спарклайн, accent --- */
.kpi .kpi-val{display:flex;align-items:baseline;gap:7px;flex-wrap:wrap}
.kpi .kpi-val .kpi-unit{font-size:13px;font-weight:600;color:var(--c-text-3);letter-spacing:0}
.kpi .kpi-foot{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:4px;position:relative;z-index:1}
.kpi .kpi-foot .kpi-sub{margin-top:0}
.kpi-delta{display:inline-flex;align-items:center;gap:3px;font-size:11px;font-weight:700;padding:1px 7px;border-radius:9px;font-variant-numeric:tabular-nums;flex:0 0 auto;white-space:nowrap}
.kpi-delta.up{color:var(--c-accent);background:var(--c-accent-dim)}
.kpi-delta.dn{color:var(--c-danger);background:var(--c-danger-dim)}
.kpi-delta.eq{color:var(--c-text-2);background:var(--c-surface-3)}
.kpi .kpi-spark{margin-top:10px;position:relative;z-index:1;line-height:0}
.kpi.kpi-accent{border-color:color-mix(in srgb,var(--kpi-color,var(--c-brand)) 45%,var(--c-border-soft))}

/* --- иконка заголовка карточки: в классике остаётся брендовой --- */
.card-h .card-hi{color:var(--c-brand);display:inline-flex}

/* --- «бровь» и список-инсайт приёмки (эталонный макет) --- */
.eyebrow54{font-size:10.5px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--c-text-3);margin-bottom:8px}
.insight54{display:flex;gap:11px;padding:9px 0;border-bottom:1px solid var(--c-border-soft);align-items:flex-start;min-width:0}
.insight54:last-child{border-bottom:0}
.insight54 .ins-ic{width:28px;height:28px;border-radius:var(--r-sm);display:grid;place-items:center;flex:0 0 auto;background:var(--ins-dim,var(--c-brand-dim));color:var(--ins-color,var(--c-brand))}
.insight54 .ins-t{font-size:var(--fs-sm);font-weight:600;min-width:0;overflow-wrap:anywhere}
.insight54 .ins-d{font-size:var(--fs-xs);color:var(--c-text-3);margin-top:2px;overflow-wrap:anywhere}
.tbl-wrap54{overflow:auto}
.tbl-wrap54 table{width:100%}


/* ============================================================
   55.0 — модернизация: однобуквенные корпоративные теги типа груза,
   компактная карточка артикула пересчёта, подписи метрик эталона
   ============================================================ */
/* (задача 5) однобуквенный тег типа груза: строгая моноширинная
   плитка в тоне смысла; расшифровка — в подсказке (title) */
.ltag{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:22px;padding:0 7px;
  border-radius:var(--r-xs);font-family:var(--f-mono);font-size:12px;font-weight:700;letter-spacing:.02em;
  line-height:1;border:1px solid transparent;cursor:default;user-select:none}
.ltag.ok{background:var(--c-accent-dim);color:var(--c-accent);border-color:color-mix(in srgb,var(--c-accent) 32%,transparent)}
.ltag.warn{background:var(--c-warn-dim);color:var(--c-warn);border-color:color-mix(in srgb,var(--c-warn) 32%,transparent)}
.ltag.bad{background:var(--c-danger-dim);color:var(--c-danger);border-color:color-mix(in srgb,var(--c-danger) 32%,transparent)}
.ltag.info{background:var(--c-cyan-dim);color:var(--c-cyan);border-color:color-mix(in srgb,var(--c-cyan) 32%,transparent)}
.ltag.vio{background:var(--c-violet-dim);color:var(--c-violet);border-color:color-mix(in srgb,var(--c-violet) 32%,transparent)}
.ltag.mut{background:var(--c-surface-3);color:var(--c-text-2);border-color:var(--c-border-soft)}

/* (задача 5.2.4) компактная карточка артикула пересчёта: сдержанная
   палитра — цвет несут только статус и предупреждения, справочные
   сведения (DN, инвойс, ожидается, размещение) — нейтральная строка */
.art-card.ac2{gap:var(--sp-3);padding:var(--sp-3) var(--sp-4)}
.art-card.ac2 .ac-art{font-size:19px}
.art-card.ac2 .ac-name{font-size:var(--fs-sm);font-weight:600;color:var(--c-text-2);margin-top:2px}
.ac2 .ac-facts{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:7px;font-size:var(--fs-xs);color:var(--c-text-3);font-variant-numeric:tabular-nums}
.ac2 .ac-facts .f b{color:var(--c-text-2);font-weight:640}
.ac2 .ac-facts .f.mono b{font-family:var(--f-mono)}
.ac2 .ac-state{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;align-items:center}
.ac2 .ac-invfoot{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:var(--sp-3);
  padding-top:var(--sp-3);border-top:1px dashed var(--c-border-soft);width:100%;
  font-size:var(--fs-xs);color:var(--c-text-3)}
.ac2 .ac-invfoot .bar{flex:0 0 120px}
.ac2 .ac-done{margin-bottom:6px}

/* (задача 3) подписи карточек метрик — стиль эталона: числа заметные,
   слова приглушены (уточнение поверх 30.0/54.0) */
.kpi .kpi-sub .kpi-num{color:var(--c-text);font-weight:680}


/* ============================================================
   56.0 (задача 2) — «РАБОЧИЙ ТАЛОН»: новый дизайн операционных
   карточек по макету «Новый дизайн карточек.html». Каждая карточка =
   талон с жёстким зонированием: [корешок статуса] → [идентификация] →
   [контекст] → [действие]; взгляд движется слева направо и
   заканчивается на главной кнопке. Применён к карточке клиента и
   карточке заявки на отгрузку; компонент ticket() в core/ui.js.
   ============================================================ */
.ticket{display:grid;grid-template-columns:34px 1fr;background:var(--c-surface);
  border:1px solid var(--c-border);border-radius:var(--r-lg);box-shadow:var(--sh-1);overflow:hidden}
.ticket + .ticket{margin-top:14px}
.ticket .spine{background:var(--c-surface-2);border-right:1px solid var(--c-border-soft);
  display:flex;flex-direction:column;align-items:center;gap:10px;padding:12px 0;position:relative}
.ticket .spine::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--spine,var(--c-text-3))}
.ticket .spine .s-ic{width:16px;height:16px;color:var(--spine,var(--c-text-3));display:grid;place-items:center}
.ticket .spine .s-lb{writing-mode:vertical-rl;transform:rotate(180deg);font-size:9.5px;font-weight:800;
  letter-spacing:.22em;text-transform:uppercase;color:var(--c-text-3);user-select:none;white-space:nowrap}
.ticket .spine .s-n{margin-top:auto;font-family:var(--f-mono,monospace);font-size:9.5px;color:var(--c-text-3);
  writing-mode:vertical-rl;transform:rotate(180deg);letter-spacing:.08em;white-space:nowrap}
.ticket.st-warn{--spine:var(--c-warn)} .ticket.st-ok{--spine:var(--c-accent)}
.ticket.st-red{--spine:var(--c-danger)} .ticket.st-info{--spine:var(--c-cyan)}
.ticket.st-brand{--spine:var(--c-brand)} .ticket.st-vio{--spine:var(--c-violet)}
.ticket-body{min-width:0;display:flex;flex-direction:column}
.ticket .tzones{display:grid;grid-template-columns:minmax(260px,1.1fr) minmax(280px,1.3fr) minmax(250px,1fr)}
.ticket .tz{padding:15px 17px;min-width:0}
.ticket .tz + .tz{border-left:1px solid var(--c-border-soft)}
.ticket .tz-cap{display:flex;align-items:center;gap:8px;margin-bottom:11px;font-size:9.5px;font-weight:800;
  letter-spacing:.16em;text-transform:uppercase;color:var(--c-text-3)}
.ticket .tz-cap::after{content:"";flex:1;height:1px;background:var(--c-border-soft)}
.ticket .tz-cap .step-n{width:15px;height:15px;border-radius:50%;border:1px solid var(--c-border);flex:none;
  display:grid;place-items:center;font-family:var(--f-mono,monospace);font-size:8.5px;color:var(--c-text-3)}
.ticket .tz.action{background:var(--c-surface-2)}
.ticket .t-art{font-family:var(--f-mono,monospace);font-size:21px;font-weight:800;letter-spacing:.01em;
  font-variant-numeric:tabular-nums;line-height:1.2;overflow-wrap:anywhere}
.ticket .t-name{font-size:14px;font-weight:650;color:var(--c-text);margin-top:2px}
.ticket .t-sub{font-size:11.5px;color:var(--c-text-3);margin-top:2px}
.ticket .ident-tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}
.ticket .kv-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px 16px}
.ticket .kv .k{font-size:9.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--c-text-3)}
.ticket .kv .v{font-size:12.5px;font-weight:600;margin-top:3px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  color:var(--c-text);overflow-wrap:anywhere}
.ticket .kv.kv-wide{grid-column:1/-1}
.ticket .alerts{margin-top:11px;display:flex;flex-direction:column;gap:6px}
.ticket .alert{display:flex;align-items:flex-start;gap:8px;font-size:11.5px;font-weight:600;
  border-radius:var(--r-md);padding:7px 10px;line-height:1.4}
.ticket .alert svg{width:13px;height:13px;flex:none;margin-top:1px}
.ticket .alert.warn{color:var(--c-warn);background:var(--c-warn-dim)}
.ticket .alert.bad{color:var(--c-danger);background:var(--c-danger-dim)}
.ticket .act-main{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ticket .act-main .btn-primary{flex:1 1 auto;justify-content:center;min-height:38px;letter-spacing:.03em}
.ticket .act-hint{display:flex;align-items:center;gap:8px;margin-top:9px;font-size:10.5px;color:var(--c-text-3)}
.ticket .tfoot{border-top:1px solid var(--c-border-soft);background:var(--c-surface-2);
  display:flex;align-items:center;gap:14px;padding:9px 17px;font-size:11px;color:var(--c-text-3);flex-wrap:wrap}
@media (max-width:1180px){
  .ticket .tzones{grid-template-columns:1fr 1fr}
  .ticket .tz.action{grid-column:1/-1;border-left:0;border-top:1px solid var(--c-border-soft)}
}
@media (max-width:800px){
  .ticket .tzones{grid-template-columns:1fr}
  .ticket .tz + .tz{border-left:0;border-top:1px solid var(--c-border-soft)}
}


/* ============================================================
   57.0 — «РАБОЧИЙ ТАЛОН»: полный набор атомов макета «Новый дизайн
   карточек» (точь-в-точь). Дополняет раму .ticket из 56.0.
   ============================================================ */
/* --- артикул и идентификация --- */
.ticket .art-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ticket .art{font-family:var(--f-mono,monospace);font-size:24px;font-weight:800;letter-spacing:.01em;
  font-variant-numeric:tabular-nums;line-height:1.15;overflow-wrap:anywhere}
.ticket .copy-btn{width:22px;height:22px;border-radius:3px;display:grid;place-items:center;color:var(--c-text-3);
  border:0;background:none;cursor:pointer;flex:none}
.ticket .copy-btn:hover{background:var(--c-surface-3);color:var(--c-text)}
.ticket .copy-btn svg{width:12px;height:12px}
.ticket .item-name{font-size:14px;font-weight:600;color:var(--c-text);margin-top:2px}
.ticket .item-sub{font-size:11.5px;color:var(--c-text-3);margin-top:2px}
.ticket .ident{display:flex;gap:14px;min-width:0}
.ticket .ident > div:last-child{min-width:0}
.ticket .kv .v a{color:var(--c-cyan);text-decoration:none;border-bottom:1px dotted var(--c-cyan)}
.ticket .alert a{color:inherit;font-weight:700}

/* --- поля ввода зоны действия --- */
.ticket .act-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.ticket .act-grid .full{grid-column:1/-1}
.ticket .fld label{display:flex;align-items:center;gap:6px;font-size:10px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--c-text-3);margin-bottom:6px}
.ticket .fld label .opt{font-weight:600;letter-spacing:.04em;text-transform:none;color:var(--c-text-3);opacity:.8}
.ticket .fld input,.ticket .fld textarea{width:100%;height:38px;border:1px solid var(--c-border);
  border-radius:var(--r-md);background:var(--c-surface-2);color:var(--c-text);padding:0 12px;font-size:13.5px}
.ticket .fld textarea{height:auto;padding:9px 12px;resize:vertical;min-height:38px;line-height:1.45}
.ticket .fld input::placeholder,.ticket .fld textarea::placeholder{color:var(--c-text-3)}
.ticket .fld input:focus,.ticket .fld textarea:focus{outline:none;border-color:var(--c-brand)}
.ticket .fld .mono-in{font-family:var(--f-mono,monospace)}
.ticket .tz.action .act-main{margin-top:12px}
.ticket .act-main .btn-primary{height:42px;font-size:13px;letter-spacing:.04em;text-transform:uppercase}

/* --- числовой степпер --- */
.ticket .stepper{display:flex;align-items:stretch;border:1px solid var(--c-border);border-radius:var(--r-md);
  background:var(--c-surface-2);overflow:hidden;height:46px}
.ticket .stepper button{width:42px;display:grid;place-items:center;color:var(--c-text-3);font-size:18px;
  font-weight:600;background:var(--c-surface-3);border:0;cursor:pointer}
.ticket .stepper button:hover{color:var(--c-text)}
.ticket .stepper input{flex:1;min-width:0;width:100%;text-align:center;border:0;background:transparent;color:var(--c-text);
  font-family:var(--f-mono,monospace);font-size:21px;font-weight:700;font-variant-numeric:tabular-nums}
.ticket .stepper input:focus{outline:none}
.ticket .stepper.hot{border-color:var(--c-brand)}

/* --- фото-док кнопка (фото брака) --- */
.ticket .photo-req{display:flex;align-items:center;gap:9px;border:1.5px dashed var(--c-border);
  border-radius:var(--r-md);padding:8px 11px;color:var(--c-text-3);font-size:11.5px;font-weight:600;cursor:pointer;
  background:none;text-align:left;width:100%}
.ticket .photo-req:hover{border-color:var(--c-brand);color:var(--c-text-2)}
.ticket .photo-req svg{width:15px;height:15px;flex:none}
.ticket .photo-req.need{border-color:var(--c-warn);color:var(--c-warn)}
.ticket .photo-req.have{border-color:var(--c-accent);color:var(--c-accent);border-style:solid}

/* --- клавиши-подсказки --- */
.ticket .kbd{font-family:var(--f-mono,monospace);font-size:9.5px;color:var(--c-text-3);border:1px solid var(--c-border);
  border-radius:3px;padding:1px 5px;background:var(--c-surface-2)}

/* --- сравнение «система ↔ факт» (инвентаризация) --- */
.ticket .compare{display:grid;grid-template-columns:1fr auto 1fr auto 1fr;gap:8px;align-items:stretch;margin-bottom:12px}
.ticket .cmp-cell{border:1px solid var(--c-border);border-radius:var(--r-md);background:var(--c-surface);
  padding:8px 12px;text-align:center;min-width:0}
.ticket .cmp-cell .l{font-size:9px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--c-text-3)}
.ticket .cmp-cell .n{font-family:var(--f-mono,monospace);font-size:22px;font-weight:800;margin-top:2px;
  font-variant-numeric:tabular-nums}
.ticket .cmp-op{align-self:center;color:var(--c-text-3);font-size:14px}
.ticket .cmp-cell.cmp-in{padding:0;border:0;background:none;text-align:left}
.ticket .cmp-cell.cmp-in .l{padding-top:8px}
.ticket .cmp-cell.cmp-in .stepper{height:40px;margin-top:2px}
.ticket .cmp-cell.delta-ok{border-color:var(--c-accent)} .ticket .cmp-cell.delta-ok .n{color:var(--c-accent)}
.ticket .cmp-cell.delta-bad{border-color:var(--c-danger)} .ticket .cmp-cell.delta-bad .n{color:var(--c-danger)}

/* --- подвал талона: сегментный прогресс --- */
.ticket .tfoot .cap{font-size:11px;color:var(--c-text-3);white-space:nowrap}
.ticket .tfoot .cap b{color:var(--c-text-2);font-family:var(--f-mono,monospace)}
.ticket .segbar{flex:1;display:flex;gap:4px;min-width:120px}
.ticket .segbar i{flex:1;height:6px;border-radius:2px;background:var(--c-surface-3)}
.ticket .segbar i.done{background:var(--c-accent)}
.ticket .segbar i.cur{background:var(--c-brand);animation:tk-pulse 1.6s ease-in-out infinite}
@keyframes tk-pulse{50%{opacity:.45}}
.ticket .tfoot .pct{font-family:var(--f-mono,monospace);font-size:11.5px;font-weight:700;color:var(--c-text-2)}

/* --- кнопки талона --- */
.ticket .btn.ghost-ok,.btn.ghost-ok{border-color:var(--c-accent);color:var(--c-accent)}
.ticket .btn.ghost-ok:hover,.btn.ghost-ok:hover{background:var(--c-accent-dim);color:var(--c-accent)}
.ticket .mini{width:30px;height:30px;border:1px solid var(--c-border);border-radius:var(--r-md);
  display:grid;place-items:center;color:var(--c-text-3);background:none;cursor:pointer;flex:none}
.ticket .mini:hover{color:var(--c-text);border-color:var(--c-text-3)}
.ticket .mini svg{width:14px;height:14px}
.ticket .mini.is-rec{border-color:var(--c-danger);color:var(--c-danger);animation:tk-pulse 1.2s ease-in-out infinite}

/* --- талон сборки: подсказка системы --- */
.ticket .suggest-head{display:flex;align-items:center;gap:10px;padding:12px 18px;border-bottom:1px solid var(--c-border-soft)}
.ticket .suggest-head .ai{width:26px;height:26px;border-radius:var(--r-md);background:var(--c-brand-dim);
  color:var(--c-brand);display:grid;place-items:center;flex:none}
.ticket .suggest-head .ai svg{width:14px;height:14px}
.ticket .suggest-head .t{font-size:13px;font-weight:800}
.ticket .suggest-head .s{font-size:11px;color:var(--c-text-3);margin-top:1px}
.ticket .suggest-head .right{margin-left:auto;display:flex;align-items:center;gap:8px}

/* --- талон сборки: сводка заказа --- */
.ticket .order-line{display:flex;align-items:center;gap:12px;padding:13px 18px;flex-wrap:wrap;
  border-bottom:1px solid var(--c-border-soft)}
.ticket .order-id{font-family:var(--f-mono,monospace);font-size:15px;font-weight:800;color:var(--c-brand)}
.ticket .order-cli{font-size:13.5px;font-weight:700}
.ticket .order-line .meta{display:flex;gap:6px;flex-wrap:wrap}
.ticket .order-line .right{margin-left:auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/* --- талон сборки: фокус-позиция --- */
.ticket .focus-zone{border-bottom:1px solid var(--c-border-soft)}
.ticket .pos-nav{display:flex;align-items:center;gap:10px;padding:10px 18px 0}
.ticket .pos-nav .lb{font-size:9.5px;font-weight:800;letter-spacing:.16em;text-transform:uppercase;color:var(--c-text-3)}
.ticket .pos-nav .cnt{font-family:var(--f-mono,monospace);font-size:12px;font-weight:700;color:var(--c-text-2)}
.ticket .pos-nav .right{margin-left:auto;display:flex;gap:4px}
.ticket .pos-nav .nv{width:26px;height:26px;border:1px solid var(--c-border);border-radius:var(--r-md);
  display:grid;place-items:center;color:var(--c-text-3);background:none;cursor:pointer}
.ticket .pos-nav .nv:hover{color:var(--c-text);border-color:var(--c-text-3)}
.ticket .pos-nav .nv svg{width:12px;height:12px}
.ticket .focus-big{font-family:var(--f-mono,monospace);font-size:30px;font-weight:800;line-height:1;
  font-variant-numeric:tabular-nums}
.ticket .focus-big small{font-size:13px;color:var(--c-text-3);font-weight:600;font-family:inherit}

/* --- маршрут комплектации «где взять» --- */
.ticket .route{display:flex;align-items:center;gap:0;flex-wrap:wrap;row-gap:6px}
.ticket .route .hop{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--c-border);
  border-radius:var(--r-md);background:var(--c-surface);padding:6px 11px;font-size:12px;font-weight:700;color:var(--c-text)}
.ticket .route .hop .q{font-family:var(--f-mono,monospace);color:var(--c-text-2);font-weight:700}
.ticket .route .hop svg{width:13px;height:13px;color:var(--c-text-3)}
.ticket .route .hop.doc{border-color:var(--c-accent)}
.ticket .route .hop.doc svg{color:var(--c-accent)}
.ticket .route .hop.stock{border-color:var(--c-warn)}
.ticket .route .hop.stock svg{color:var(--c-warn)}
.ticket .route .hop.none{border-color:var(--c-danger)}
.ticket .route .hop.none svg{color:var(--c-danger)}
.ticket .route .arr{color:var(--c-text-3);margin:0 7px;display:inline-flex}
.ticket .route .arr svg{width:14px;height:14px}

/* --- список позиций: вертикальный степпер --- */
.ticket .poslist{display:flex;flex-direction:column}
.ticket .pos{display:grid;grid-template-columns:44px minmax(180px,1.2fr) minmax(220px,1.6fr) auto;
  gap:0 14px;align-items:center;padding:11px 18px 11px 0;position:relative;min-width:0}
.ticket .pos + .pos{border-top:1px solid var(--c-border-soft)}
.ticket .pos .node{justify-self:center;width:24px;height:24px;border-radius:50%;display:grid;place-items:center;
  font-family:var(--f-mono,monospace);font-size:11px;font-weight:800;border:1.5px solid var(--c-border);
  color:var(--c-text-3);background:var(--c-surface);z-index:1}
.ticket .pos::before{content:"";position:absolute;left:21.5px;top:0;bottom:0;width:1.5px;background:var(--c-border-soft)}
.ticket .pos:first-child::before{top:50%}
.ticket .pos:last-child::before{bottom:50%}
.ticket .pos.done .node{border-color:var(--c-accent);color:var(--c-accent);background:var(--c-accent-dim)}
.ticket .pos.cur{background:var(--c-brand-dim)}
.ticket .pos.cur .node{border-color:var(--c-brand);color:var(--c-on-brand,#fff);background:var(--c-brand)}
.ticket .pos .pn{font-size:13px;font-weight:700;overflow-wrap:anywhere}
.ticket .pos.done .pn{text-decoration:line-through;opacity:.55}
.ticket .pos .pm{display:flex;align-items:center;gap:8px;margin-top:3px;flex-wrap:wrap}
.ticket .pos .pm .a{font-family:var(--f-mono,monospace);font-size:11px;color:var(--c-text-3)}
.ticket .pos .qty{font-family:var(--f-mono,monospace);font-size:10.5px;font-weight:800;padding:1px 7px;
  border-radius:8px;background:var(--c-surface-3);color:var(--c-text-2)}
.ticket .pos.cur .qty{background:var(--c-brand);color:var(--c-on-brand,#fff)}
.ticket .pos .src{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:11px;color:var(--c-text-3)}
.ticket .pos .src .schip{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--c-border);
  border-radius:20px;padding:2px 9px;font-size:10.5px;font-weight:700;color:var(--c-text-2);white-space:nowrap}
.ticket .pos .src .schip svg{width:11px;height:11px}
.ticket .pos .src .schip.doc{border-color:var(--c-accent);color:var(--c-accent)}
.ticket .pos .src .schip.stock{border-color:var(--c-warn);color:var(--c-warn)}
.ticket .pos .src .schip.none{border-color:var(--c-danger);color:var(--c-danger)}
.ticket .pos .act{display:flex;gap:6px;align-items:center;padding-right:0}
.ticket .pos .act .btn{height:30px;font-size:11.5px}
@media (max-width:900px){
  .ticket .pos{grid-template-columns:44px 1fr;row-gap:6px}
  .ticket .pos .src,.ticket .pos .act{grid-column:2}
}


/* ============================================================
   62.0 (задачи 14 и 16)
   • (задача 16) быстродействие: рабочие талоны рендерятся лениво —
     content-visibility выключает раскладку и отрисовку талонов за
     пределами экрана (заметно на 15+ инвойсах и длинных реестрах);
   • (задача 14) диалог «Вопросы к данным» по эталонному макету:
     пузыри «вопрос → ответ» и строка источников.
   ============================================================ */
.ticket{content-visibility:auto;contain-intrinsic-size:auto 340px}

.nlqchat{display:flex;flex-direction:column;gap:10px;max-height:56vh;overflow:auto;padding:4px 2px;min-height:120px}
.nlq-q{align-self:flex-end;max-width:78%;background:var(--c-brand-dim);border:1px solid var(--c-border);
  color:var(--c-text);padding:8px 12px;border-radius:12px 12px 3px 12px;font-size:var(--fs-sm);font-weight:600}
.nlq-a{align-self:flex-start;max-width:94%;background:var(--c-surface-2);border:1px solid var(--c-border);
  padding:10px 12px;border-radius:12px 12px 12px 3px;font-size:var(--fs-sm);min-width:0}
.nlq-a .tbl-wrap54{max-height:220px;overflow:auto}
.nlq-src{margin-top:6px;font-size:var(--fs-xs);color:var(--c-text-3)}


/* ============================================================
   64.0 — стили модернизации:
   • .dn-done / .dn-cnt / .dn-ok — выполненный Delivery Note в выборе DN:
     зелёная окантовка и зелёная галочка в стиле сайта + компактный
     счётчик уникальных артикулов (приёмка, задача 11);
   • .focus64 — полоса фокус-режима «очередь скрыта» (задача 3);
   • .rest64 — раздел «Оставшиеся артикулы для пересчёта» (задача 5);
   • .dims-pop / .dim-chip — популярные габариты в форме заявки на
     отгрузку (задача 13).
   ============================================================ */
.dn-btn .dn-cnt{font-size:10px;line-height:1;color:var(--c-text-3);background:var(--c-surface-2);
  border:1px solid var(--c-border-soft);border-radius:999px;padding:3px 7px;margin-left:7px;white-space:nowrap}
.dn-btn.dn-done{border-color:var(--c-accent);color:var(--c-accent);background:var(--c-accent-dim)}
.dn-btn.dn-done .dn-cnt{color:var(--c-accent);border-color:var(--c-accent);background:transparent}
.dn-btn.dn-done .dn-ok{display:inline-flex;align-items:center;color:var(--c-accent);margin-left:5px}
.dn-btn.dn-done.btn-primary{color:#fff;border-color:var(--c-accent)}
.dn-btn.dn-done.btn-primary .dn-cnt,.dn-btn.dn-done.btn-primary .dn-ok{color:#fff;border-color:rgba(255,255,255,.55)}

.focus64{gap:10px;align-items:center;flex-wrap:wrap;padding:9px 12px;border-radius:var(--r-md);
  background:var(--c-surface-2);border:1px dashed var(--c-border)}
.focus64 .focus64-t{font-size:var(--fs-xs);color:var(--c-text-3);min-width:0}

.rest64{display:grid;gap:6px;max-height:340px;overflow:auto;padding-right:4px;margin-top:var(--sp-3)}
.rest64-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;text-align:left;cursor:pointer;
  padding:8px 12px;border-radius:var(--r-sm);border:1px solid var(--c-border-soft);
  background:var(--c-surface-2);color:var(--c-text);font:inherit;transition:border-color .12s ease,background .12s ease}
.rest64-row:hover{border-color:var(--c-brand);background:var(--c-surface)}
.rest64-row>b{font-size:var(--fs-sm)}
.rest64-row .rest64-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:var(--c-text-2);font-size:var(--fs-xs)}
.rest64-row .rest64-dn{font-size:10px;color:var(--c-text-3);border:1px solid var(--c-border-soft);
  border-radius:999px;padding:2px 7px;white-space:nowrap}
.rest64-row .rest64-meta{font-size:10px;color:var(--c-warn);white-space:nowrap}
.rest64-row .rest64-qty{font-size:var(--fs-xs);font-weight:800;color:var(--c-text);white-space:nowrap}

.dims-pop{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.dim-chip{font-family:var(--f-mono);font-size:11px;line-height:1;color:var(--c-text-2);cursor:pointer;
  padding:5px 9px;border-radius:999px;border:1px solid var(--c-border);background:var(--c-surface-2);
  transition:border-color .12s ease,color .12s ease}
.dim-chip:hover{border-color:var(--c-brand);color:var(--c-text)}
.dim-chip.on{border-color:var(--c-brand);color:var(--c-brand);font-weight:700}


/* ============================================================
   65.0 — стили модернизации
   ============================================================ */
/* (задача 5) «Исправить факт»: тёмная сердцевина, оранжевая окантовка —
   различима с красной «Зафиксировать факт», без эффекта гирлянды */
.btn.btn-fix65{
  background:var(--c-surface-2);
  border:1px solid color-mix(in srgb, var(--c-warn) 72%, transparent);
  color:var(--c-warn);
  font-weight:750;
}
.btn.btn-fix65:hover{
  background:color-mix(in srgb, var(--c-warn) 14%, var(--c-surface-2));
  border-color:var(--c-warn);
  color:var(--c-warn);
}

/* (задача 17) перемещения на подтверждении — компактные строки */
.mv65-list{display:flex;flex-direction:column}
.mv65{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:7px 12px;border-top:1px solid var(--c-border-soft);
  content-visibility:auto;contain-intrinsic-size:1px 40px;
}
.mv65:first-child{border-top:0}
.mv65:hover{background:var(--c-surface-2)}
.mv65-art{flex:0 0 108px;font-size:var(--fs-sm)}
.mv65-name{
  flex:1 1 180px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:var(--c-text-2);font-size:var(--fs-xs);
}
.mv65-route{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto;font-size:var(--fs-sm)}
.mv65-from{color:var(--c-text-3)}
.mv65-arr{color:var(--c-text-3);display:inline-flex}
.mv65-to{color:var(--c-cyan)}
.mv65-by{flex:0 0 auto;color:var(--c-text-3);font-size:var(--fs-xs)}
.mv65-act{display:inline-flex;gap:6px;margin-left:auto;flex:0 0 auto}

/* (задача 19) карточка-талон справочников: блок «Данные модулей» */
.ref65-body{border:0;box-shadow:none;padding:0;background:transparent}
.ref65-intel{
  margin-top:10px;padding-top:10px;
  border-top:1px dashed var(--c-border-soft);
}
.ref65-cap{
  font-size:10px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--c-text-3);font-weight:750;margin-bottom:7px;
}
.ref65-chips{display:flex;gap:6px;flex-wrap:wrap}

/* (задача 22) длинные списки талонов справочника — ленивая отрисовка */
.ref65-body, .rest64-row{content-visibility:auto}


/* ============================================================
   66.0 (задача 4) · РАБОЧИЕ ТАЛОНЫ: зона 2 «Информация об артикуле»
   крупнее и наряднее — единый корпоративный стиль ВСЕХ талонов сайта
   (приёмка, разгрузка, отгрузка, ЧЗ, инвентаризация, консигнация,
   справочники): средняя колонка шире, лёгкая тонированная подложка,
   значения kv-сетки крупнее и читаются с расстояния.
   ============================================================ */
.ticket .tzones{grid-template-columns:minmax(250px,1fr) minmax(320px,1.45fr) minmax(250px,1fr)}
.ticket .tzones .tz:nth-child(2){background:color-mix(in srgb, var(--c-surface-2) 42%, var(--c-surface))}
.ticket .tzones .tz:nth-child(2) .kv-grid{gap:12px 20px}
.ticket .tzones .tz:nth-child(2) .kv .k{font-size:10px;letter-spacing:.12em}
.ticket .tzones .tz:nth-child(2) .kv .v{font-size:14px;margin-top:4px}
@media (max-width:760px){
  .ticket .tzones .tz:nth-child(2){background:transparent}
}

/* 66.0 (задача 2): поисковая строка по принятым накладным («Разгрузка груза») */
.wbhit66{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px;
  border:1px solid var(--c-border-soft);border-radius:var(--r-md);background:var(--c-surface-2)}
.wbhit66-no{font-weight:800;font-size:14px}
.wbhit66-file{color:var(--c-text-2);font-size:var(--fs-sm);min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;max-width:340px}
.wbhit66-who{color:var(--c-text-3);font-size:var(--fs-xs);margin-left:auto}
.wbhint66{color:var(--c-text-3);font-size:var(--fs-xs)}


/* ==================== 71.0 · модернизация ==================== */
/* --- (задача 11) советник по клиенту в форме заявки на отгрузку --- */
.cadv71{border:1px solid var(--c-border);border-left:3px solid var(--c-brand);
  background:var(--c-surface-2);border-radius:var(--r-sm);padding:10px 12px;
  display:grid;gap:6px}
.cadv71-h{display:flex;align-items:center;gap:7px;font-weight:750;font-size:var(--fs-sm);
  color:var(--c-brand-2, var(--c-brand))}
.cadv71-line{font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.45}
.cadv71-line.strict{color:var(--c-text);font-weight:650}
.cadv71-src{font-size:var(--fs-xs);color:var(--c-text-3)}

/* --- (задача 12) умный помощник RPS: карточки инструкций и мастер --- */
.rg71-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:10px}
.rg71-card{display:flex;align-items:center;gap:12px;text-align:left;cursor:pointer;
  border:1px solid var(--c-border);border-radius:var(--r-md);background:var(--c-surface-2);
  padding:12px 14px;transition:border-color .15s,transform .15s;color:inherit;font:inherit}
.rg71-card:hover{border-color:var(--c-brand);transform:translateY(-1px)}
.rg71-ic{color:var(--c-brand);flex:0 0 auto;display:inline-flex}
.rg71-body{display:grid;gap:3px;min-width:0;flex:1 1 auto}
.rg71-body>b{font-size:var(--fs-md,14.5px)}
.rg71-sub{color:var(--c-text-3);font-size:var(--fs-xs)}
.rg71-mini{display:flex;align-items:center;gap:8px;font-size:var(--fs-xs);color:var(--c-text-3)}
.rg71-go{margin-left:auto;color:var(--c-text-3);flex:0 0 auto;display:inline-flex}
.rg71-top{display:flex;align-items:center;gap:10px}
.rg71-bar{flex:1 1 auto;height:7px;border-radius:99px;background:var(--c-surface-3, var(--c-border));overflow:hidden}
.rg71-bar.sm{width:88px;flex:0 0 auto;height:5px}
.rg71-fill{display:block;height:100%;border-radius:99px;background:var(--c-brand);transition:width .25s}
.rg71-pct{font-size:var(--fs-xs);color:var(--c-text-3);flex:0 0 auto}
.rg71-track{display:flex;gap:6px;flex-wrap:wrap}
.rg71-dot{width:30px;height:30px;border-radius:50%;border:1px solid var(--c-border);cursor:pointer;
  background:var(--c-surface-2);color:var(--c-text-2);font-weight:750;font-size:12.5px;
  display:inline-flex;align-items:center;justify-content:center;transition:border-color .15s}
.rg71-dot:hover{border-color:var(--c-brand)}
.rg71-dot.cur{border-color:var(--c-brand);color:var(--c-brand);box-shadow:0 0 0 2px color-mix(in srgb, var(--c-brand) 25%, transparent)}
.rg71-dot.ok{background:color-mix(in srgb, var(--c-accent) 16%, var(--c-surface-2));color:var(--c-accent);border-color:var(--c-accent)}
.rg71-step{border:1px solid var(--c-border);border-radius:var(--r-md);padding:12px 14px;
  background:var(--c-surface-2);display:grid;gap:8px}
.rg71-h{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.rg71-n{width:26px;height:26px;border-radius:50%;background:var(--c-brand);color:#fff;
  display:inline-flex;align-items:center;justify-content:center;font-weight:800;font-size:13px;flex:0 0 auto}
.rg71-d{margin:0;color:var(--c-text-2);font-size:var(--fs-sm);line-height:1.55}
.rg71-check{display:flex;gap:7px;align-items:flex-start;font-size:var(--fs-xs);color:var(--c-text-2);
  border-top:1px dashed var(--c-border);padding-top:8px}
.rg71-check svg{flex:0 0 auto;margin-top:1px;color:var(--c-accent)}

/* --- (задача 7) компактная таблица «Готовность поставки по этапам» --- */
.stages71 td{vertical-align:middle;padding-top:7px;padding-bottom:7px}
.stages71 tbody b{font-size:var(--fs-sm)}
.st71-go{width:22px;height:22px;color:var(--c-text-3)}
.st71-go:hover{color:var(--c-brand)}

/* --- (задача 11) талон клиента: адреса, контакты и комментарий --- */
.cli71-addrs{display:grid;gap:4px;margin-top:8px}
.cli71-cap{font-size:var(--fs-xs);font-weight:750;letter-spacing:.4px;text-transform:uppercase;
  color:var(--c-text-3)}
.cli71-a{display:flex;gap:7px;align-items:flex-start;font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.4}
.cli71-ic{flex:0 0 auto;color:var(--c-text-3);display:inline-flex;margin-top:2px}
.cli71-atxt{min-width:0}
.cli71-more{font-size:var(--fs-xs);color:var(--c-text-3)}
.cli71-note{display:flex;gap:7px;align-items:flex-start;margin-top:8px;padding:8px 10px;
  border-radius:var(--r-sm);background:var(--c-surface-2);border-left:3px solid var(--c-warn);
  font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.45}

/* --- (задача 14) «Вместимость ячеек по артикулам»: компактно, без вылезаний --- */
.cap70-tbl{width:100%;min-width:520px}
.cap70-tbl th{white-space:nowrap;font-size:var(--fs-xs)}
.cap70-tbl td{padding-top:6px;padding-bottom:6px;font-size:var(--fs-sm)}
.cap70-tbl .tag, .cap70-tbl .status-tag{white-space:nowrap}


/* ============ 72.0 (задача 5): скриншоты помощника RPS ============ */
.rg72-shots{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;margin:10px 0 4px}
.rg72-shot{margin:0;cursor:zoom-in;background:var(--c-surface-2);border:1px solid var(--c-border-soft);
  border-radius:var(--r-md);padding:6px;transition:border-color .15s ease, transform .15s ease}
.rg72-shot:hover{border-color:var(--c-brand);transform:translateY(-1px)}
.rg72-shot img{display:block;width:100%;height:110px;object-fit:contain;border-radius:6px;background:#fff}
.rg72-shot figcaption{margin-top:6px;font-size:var(--fs-xs);color:var(--c-text-3);line-height:1.35}
.rg72-zoom{display:grid;place-items:center}
.rg72-zoom img{max-width:100%;max-height:74vh;border-radius:var(--r-md);background:#fff;
  border:1px solid var(--c-border-soft)}


/* ==================== 74.0 (задача 1): скриншот не загрузился ====================
   Вместо «сломанной» иконки браузера — честная диагностика: что
   случилось, точный путь файла и кнопка «Попробовать ещё раз». */
.rg74-missing{display:grid;justify-items:center;gap:8px;padding:18px 14px;text-align:center;
  background:var(--c-surface-2);border:1px dashed var(--c-border);border-radius:var(--r-md);
  color:var(--c-text-2);font-size:var(--fs-sm);min-height:110px;align-content:center}
.rg74-missing .rg74-mi{color:var(--c-text-3)}
.rg74-missing b{color:var(--c-text)}
.rg74-missing .rg74-mt{color:var(--c-text-3);font-size:var(--fs-xs);line-height:1.45;max-width:520px;word-break:break-word}

/* ==================== 74.0 (задача 4): «Досье артикула» ==================== */
.ad74{display:grid;gap:var(--sp-4)}
.ad74-head{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap;
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-radius:var(--r-md);padding:12px}
.ad74-hb{flex:1 1 300px;min-width:0;display:grid;gap:6px}
.ad74-art{font-size:var(--fs-xl);font-weight:800;color:var(--c-brand-2);letter-spacing:.4px}
.ad74-name{font-weight:700;color:var(--c-text);line-height:1.35}
.ad74-desc{color:var(--c-text-2);font-size:var(--fs-sm);line-height:1.45}
.ad74-chips{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.ad74-sec{border:1px solid var(--c-border-soft);border-radius:var(--r-md);padding:11px 12px;display:grid;gap:9px}
.ad74-cap{display:flex;align-items:center;gap:8px}
.ad74-cap b{color:var(--c-text);font-size:var(--fs-md)}
.ad74-ci{color:var(--c-brand);display:inline-flex}
.ad74-cn{color:var(--c-text-2);font-size:var(--fs-sm);font-family:var(--f-mono,monospace)}
.ad74-tbl{display:grid;gap:4px 10px;align-items:baseline;font-size:var(--fs-sm)}
.ad74-th{color:var(--c-text-2);font-size:var(--fs-xs);font-weight:700;text-transform:uppercase;letter-spacing:.5px;
  border-bottom:1px solid var(--c-border-soft);padding-bottom:4px}
.ad74-td{color:var(--c-text-2);min-width:0;overflow-wrap:anywhere}
.ad74-more{color:var(--c-text-2);font-size:var(--fs-sm);margin-top:2px}
.ad74-empty{display:flex;gap:10px;align-items:center;color:var(--c-text-3);font-size:var(--fs-sm);
  border:1px dashed var(--c-border);border-radius:var(--r-md);padding:14px;line-height:1.5}
.ad74-foot{color:var(--c-text-2);font-size:var(--fs-sm);text-align:center}

/* ==================== 77.0 · модернизация ==================== */
/* --- (задача 2) форма заявки на отгрузку: поле-причина отказа и
   советник в режиме «уточните клиента» --- */
.input.err77{border-color:var(--c-danger)!important;box-shadow:0 0 0 3px var(--c-danger-dim, rgba(226,75,74,.18))}
.cadv71.warn77{border-left-color:var(--c-warn)}
.cadv71.warn77 .cadv71-h{color:var(--c-warn)}

/* ==================== 80.0 (задача 2): «Досье артикула» 2.0 — хронология ==================== */
.ad80-tl{display:grid;gap:0;border:1px solid var(--c-border-soft);border-radius:var(--r-md);overflow:hidden}
.ad80-ev{display:grid;grid-template-columns:20px minmax(118px,auto) 1fr;gap:10px;align-items:baseline;
  padding:7px 10px;font-size:var(--fs-sm);line-height:1.45;background:var(--c-surface)}
.ad80-ev + .ad80-ev{border-top:1px solid var(--c-border-soft)}
.ad80-ev:nth-child(even){background:var(--c-surface-2)}
.ad80-ev-ic{color:var(--c-brand);display:inline-flex;align-self:center}
.ad80-ev-at{color:var(--c-text-2);white-space:nowrap;font-variant-numeric:tabular-nums}
.ad80-ev-tx{color:var(--c-text);min-width:0;overflow-wrap:anywhere}


/* ==================== 84.0 (задача 1): ЕДИНЫЙ ИИ-СОВЕТНИК (core/advisor.js) ====================
   Совет — структурная карточка: цветная рейка уровня, значок, заголовок
   нормальным кеглем, текст, разбор «Причина · Что делать», кнопки
   перехода к источнику проблемы. Ничего не сливается и при 12 советах. */
.adv84-card .card-h p{margin:0}
.adv84-sum{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.adv84-list{display:grid;gap:10px}
/* 86.0 (задача 4): ДОЗИРОВАННЫЙ ЦВЕТ. Фон совета — нейтральная поверхность, цвет уровня несут
   только рейка (3px) и ярлык уровня; значок в рейке — ТЕМА совета в тоне категории/данных.
   Красный больше не заливает карточку целиком: пять критичных советов читаются как пять
   разных тем с одной красной рейкой, а не как «красное месиво». */
/* 87.0 (задача 9, БАГ «рейка и значок обрезаны в левом верхнем углу»): в объединённой карточке
   «ИИ-советник · AI-Core» совет получает класс .ai2-adv, а старое правило .ai2-adv задаёт
   align-items:flex-start — рейка переставала растягиваться на высоту совета и цветная полоска со
   значком сжимались до 38px в углу. Теперь: рейка ВСЕГДА на всю высоту (align-items:stretch и
   align-self:stretch с приоритетом), полоска уровня — рамка самой карточки (border-left), а не
   абсолютный псевдоэлемент рейки, значок центрирован в рейке и не зависит от внешних правил. */
.adv84{display:grid;grid-template-columns:44px 1fr;align-items:stretch;min-width:0;border:1px solid var(--c-border-soft);border-radius:var(--r-md);
  border-left:3px solid var(--adv-c, var(--c-data));
  background:var(--c-surface);overflow:hidden;
  transition:border-color var(--t-fast), box-shadow var(--t-fast)}
.adv84:hover{border-color:color-mix(in srgb, var(--adv-c, var(--c-data)) 40%, var(--c-border));border-left-color:var(--adv-c, var(--c-data));box-shadow:var(--sh-1)}
.adv84-rail{position:relative;align-self:stretch;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;
  padding:11px 0 10px;min-height:100%;box-sizing:border-box;background:var(--c-surface-2)}
.adv84.lvl-bad .adv84-rail{background:color-mix(in srgb, var(--adv-c) 7%, var(--c-surface-2))}
.adv84.ai2-adv{align-items:stretch}
.adv84.ai2-adv .adv84-rail{align-self:stretch}
.adv84-ico{width:26px;height:26px;flex:0 0 auto;border-radius:8px;display:grid;place-items:center;color:var(--c-ind-cat);
  background:var(--c-ind-cat-dim)}
.adv84-ico svg{width:16px;height:16px}
.adv84.tp-buy .adv84-ico,.adv84.tp-money .adv84-ico{color:var(--c-ind-ok);background:var(--c-ind-ok-dim)}
.adv84.tp-data .adv84-ico,.adv84.tp-model .adv84-ico{color:var(--c-data);background:var(--c-data-dim)}
.adv84.tp-clients .adv84-ico,.adv84.tp-process .adv84-ico{color:var(--c-ind-info);background:var(--c-ind-info-dim)}
.adv84.tp-stock .adv84-ico{color:var(--c-ind-cat);background:var(--c-ind-cat-dim)}
.adv84.tp-time .adv84-ico{color:var(--c-ind-warn);background:var(--c-ind-warn-dim)}
.adv84.tp-security .adv84-ico{color:var(--c-ind-neut);background:var(--c-ind-neut-dim)}
.adv84-topic{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--c-text-3);
  padding:2px 7px;border-radius:var(--r-pill);border:1px solid var(--c-border-soft);flex:0 0 auto}
.adv86-bar{display:inline-flex;height:6px;width:96px;border-radius:3px;overflow:hidden;background:var(--c-surface-2);vertical-align:middle;margin-right:4px}
.adv86-bar i{display:block;height:100%}
.adv86-bar .lv-bad{background:var(--c-ind-crit)} .adv86-bar .lv-warn{background:var(--c-ind-warn)}
.adv86-bar .lv-info{background:var(--c-ind-info)} .adv86-bar .lv-ok{background:var(--c-ind-ok)}
.adv86-tail{border:1px dashed var(--c-border-soft);border-left:3px solid var(--adv-c, var(--c-data));border-radius:var(--r-md);background:var(--c-surface)}
.adv86-more{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:transparent;border:0;cursor:pointer;
  padding:9px 12px;color:var(--c-text-2);font-size:var(--fs-sm);font-weight:650;border-radius:var(--r-md)}
.adv86-more:hover{background:var(--c-surface-2);color:var(--c-text)}
.adv86-more em{font-style:normal;font-weight:400;color:var(--c-text-3);font-size:var(--fs-xs);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:auto;max-width:55%}
.adv86-more svg{flex:0 0 auto}
.adv84-body{min-width:0;padding:10px 14px 10px 12px;display:grid;gap:6px}
.adv84-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.adv84-lvl{font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--adv-c, var(--c-brand));
  padding:2px 8px;border-radius:var(--r-pill);background:var(--adv-dim, var(--c-brand-dim));flex:0 0 auto}
.adv84-title{font-size:var(--fs-md);font-weight:700;color:var(--c-text);line-height:1.35;min-width:0;overflow-wrap:anywhere}
.adv84-title b{font-weight:800}
.adv84-n{margin-left:auto;font-size:var(--fs-lg);font-weight:800;color:var(--c-data-2);letter-spacing:-.3px;
  font-variant-numeric:tabular-nums;flex:0 0 auto}
.adv84.lvl-bad .adv84-n{color:var(--c-ind-crit)}
.adv84.lvl-warn .adv84-n{color:var(--c-ind-warn)}
.adv84-text{font-size:13.5px;line-height:1.6;color:var(--c-text-2);min-width:0;overflow-wrap:anywhere}
.adv84-text b{color:var(--c-text);font-weight:680}
.adv84-text .mono{color:var(--c-data-2)}   /* 86.0: идентификаторы в тексте — цвет данных, не фирменный красный */
.adv84-more{display:none;gap:6px;padding:8px 10px;border-radius:var(--r-sm);background:color-mix(in srgb, var(--c-surface-2) 80%, transparent);
  border:1px dashed var(--c-border-soft)}
.adv84-more.is-open{display:grid}
.adv84-kv{display:grid;grid-template-columns:minmax(96px,auto) 1fr;gap:4px 12px;align-items:start;font-size:var(--fs-sm);line-height:1.55}
.adv84-k{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;
  color:var(--c-text-3);padding-top:2px;white-space:nowrap}
.adv84-v{color:var(--c-text-2);min-width:0;overflow-wrap:anywhere}
.adv84-v b{color:var(--c-text)}
.adv84-acts{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:2px}
.adv84-btn{font-size:var(--fs-xs);padding:4px 10px;gap:5px}
.adv84-btn:hover{border-color:var(--c-data)}
.adv84-toggle{display:inline-flex;align-items:center;gap:4px;background:transparent;border:0;color:var(--c-text-3);font-size:var(--fs-xs);
  font-weight:650;cursor:pointer;padding:4px 6px;border-radius:var(--r-xs)}
.adv84-toggle:hover{color:var(--c-text);background:var(--c-surface-2)}
.adv84-toggle svg{transition:transform var(--t-fast)}
.adv84-toggle.is-open svg{transform:rotate(180deg)}
.adv84-none{padding:14px;text-align:center;color:var(--c-text-3);font-size:var(--fs-sm)}
/* карточки AI-Core (core/ai2.js): совет в едином виде + оценки «полезно / неполезно» в строке действий */
.adv84.ai2-adv{display:grid;padding:0;gap:0;background:var(--c-surface);border-radius:var(--r-md)}   /* 87.0 (задача 9): align-items — см. блок .adv84 выше */
.adv84 .ai2-adv-fb{display:inline-flex;gap:4px;margin-left:auto}
.adv84 .ai2-adv-note{font-size:var(--fs-xs);color:var(--c-text-3)}
@media (max-width:640px){
  .adv84{grid-template-columns:36px 1fr}
  .adv84-kv{grid-template-columns:1fr}
}

/* --- 84.0 (задача 1): фильтр советника над таблицей плана закупки --- */
.focus84{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 12px;margin-bottom:10px;border-radius:var(--r-md);
  border:1px solid color-mix(in srgb, var(--c-brand) 40%, var(--c-border));background:var(--c-brand-dim)}
.focus84 .f-ic{color:var(--c-brand);display:inline-flex}
.focus84 .f-tx{font-size:var(--fs-sm);color:var(--c-text);min-width:0;flex:1 1 200px}
.focus84 .f-tx b{color:var(--c-brand-2)}

/* --- 84.0 (задача 1): окно «список строк» советника (зависшие открытые заказы и т.п.) --- */
.advl84-sum{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}

/* ==================== 84.0 (задачи 4–9): КАРТОЧКА ЗАПИСИ (core/reccard.js) ==================== */
.rc84{display:grid;gap:var(--sp-3)}
.rc84-head{display:flex;gap:14px;align-items:flex-start;padding:12px 14px;border-radius:var(--r-md);
  background:linear-gradient(135deg, var(--rc-dim, var(--c-brand-dim)), transparent 70%), var(--c-surface-2);
  border:1px solid var(--c-border-soft);border-left:3px solid var(--rc-c, var(--c-brand))}
.rc84-tile{flex:0 0 auto;width:46px;height:46px;border-radius:12px;display:grid;place-items:center;color:var(--rc-c, var(--c-brand));
  background:var(--rc-dim, var(--c-brand-dim));border:1px solid color-mix(in srgb, var(--rc-c, var(--c-brand)) 35%, transparent)}
.rc84-hb{min-width:0;flex:1 1 auto;display:grid;gap:4px}
.rc84-kicker{font-size:10px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--c-text-3)}
.rc84-code{font-size:var(--fs-xl);font-weight:800;letter-spacing:.3px;color:var(--c-text);line-height:1.15;overflow-wrap:anywhere}
.rc84-title{font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.4;overflow-wrap:anywhere}
.rc84-tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:2px}
.rc84-metrics{display:grid;grid-template-columns:repeat(var(--rc-cols,3),minmax(0,1fr));gap:8px}
.rc84-met{position:relative;padding:9px 10px 9px 12px;border-radius:var(--r-md);background:var(--c-surface-2);border:1px solid var(--c-border-soft);min-width:0;overflow:hidden}
.rc84-met::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--rc-c, var(--c-brand))}
.rc84-met-l{display:flex;align-items:center;gap:5px;font-size:10px;font-weight:750;letter-spacing:.08em;text-transform:uppercase;color:var(--c-text-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rc84-met-l svg{color:var(--rc-c, var(--c-brand));flex:0 0 auto}
.rc84-met-v{font-size:var(--fs-lg);font-weight:800;margin-top:3px;font-variant-numeric:tabular-nums;color:color-mix(in srgb, var(--rc-c, var(--c-brand)) 35%, var(--c-text));
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rc84-met-s{font-size:var(--fs-xs);color:var(--c-text-3);margin-top:2px;line-height:1.35;overflow-wrap:anywhere}
.rc84-sec{border:1px solid var(--c-border-soft);border-radius:var(--r-md);padding:10px 12px;display:grid;gap:9px;min-width:0}
.rc84-cap{display:flex;align-items:center;gap:8px}
.rc84-cap b{color:var(--c-text);font-size:var(--fs-md)}
.rc84-ci{color:var(--c-brand);display:inline-flex}
.rc84-cn{color:var(--c-text-3);font-size:var(--fs-sm)}
.rc84-kvgrid{display:grid;grid-template-columns:1fr 1fr;gap:8px 16px}
.rc84-kv{min-width:0}
.rc84-kv.wide{grid-column:1/-1}
.rc84-k{font-size:9.5px;font-weight:750;letter-spacing:.1em;text-transform:uppercase;color:var(--c-text-3)}
.rc84-v{font-size:12.5px;font-weight:600;margin-top:3px;color:var(--c-text);display:flex;align-items:center;gap:6px;flex-wrap:wrap;overflow-wrap:anywhere;line-height:1.4}
.rc84-v.mono{font-family:var(--f-mono)}
.rc84-note{display:flex;gap:8px;align-items:flex-start;padding:8px 10px;border-radius:var(--r-sm);font-size:var(--fs-sm);line-height:1.5;
  color:var(--c-text-2);background:var(--c-surface-2);border-left:3px solid var(--c-cyan)}
.rc84-note svg{flex:0 0 auto;margin-top:3px;color:var(--c-cyan)}
.rc84-note.warn{border-left-color:var(--c-warn)} .rc84-note.warn svg{color:var(--c-warn)}
.rc84-note.bad{border-left-color:var(--c-danger)} .rc84-note.bad svg{color:var(--c-danger)}
.rc84-note.ok{border-left-color:var(--c-accent)} .rc84-note.ok svg{color:var(--c-accent)}
.rc84-empty{padding:10px;text-align:center;color:var(--c-text-3);font-size:var(--fs-sm);border:1px dashed var(--c-border);border-radius:var(--r-sm)}
.rc84-tl{display:grid;border:1px solid var(--c-border-soft);border-radius:var(--r-sm);overflow:hidden}
.rc84-ev{display:grid;grid-template-columns:18px minmax(110px,auto) 1fr;gap:8px;align-items:baseline;padding:6px 9px;font-size:var(--fs-sm);line-height:1.45}
.rc84-ev + .rc84-ev{border-top:1px solid var(--c-border-soft)}
.rc84-ev:nth-child(even){background:var(--c-surface-2)}
.rc84-ev-ic{color:var(--c-brand);display:inline-flex;align-self:center}
.rc84-ev-at{color:var(--c-text-2);white-space:nowrap;font-size:var(--fs-xs)}
.rc84-ev-tx{color:var(--c-text);min-width:0;overflow-wrap:anywhere}
.rc84-ev-by{color:var(--c-text-3)}
.rc84-tblwrap{overflow-x:auto;border:1px solid var(--c-border-soft);border-radius:var(--r-sm)}
.rc84-tbl th,.rc84-tbl td{padding:6px 9px;font-size:var(--fs-sm)}
.rc84-acts{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;width:100%}
.rc84-acts .btn-danger{color:var(--c-danger);border-color:color-mix(in srgb, var(--c-danger) 45%, transparent)}
.rc84-acts .btn-danger:hover{background:var(--c-danger-dim)}
.rc84-acts .btn-accent{color:var(--c-accent);border-color:color-mix(in srgb, var(--c-accent) 45%, transparent)}
.rc84-acts .btn-accent:hover{background:var(--c-accent-dim)}
.rc84-drawer .card-b{padding:var(--sp-4)}
.rc84-drawer .modal-f{justify-content:flex-start}
/* строка таблицы, открывающая карточку — подсказка курсором и подсветкой */
.rc84-rows .tbl tbody tr{cursor:pointer}
.rc84-rows .tbl tbody tr:hover td{background:var(--c-surface-2)}
.rc84-hintrow{display:flex;align-items:center;gap:6px;font-size:var(--fs-xs);color:var(--c-text-3);padding:6px 12px}
.rc84-hintrow svg{color:var(--c-brand)}
@media (max-width:640px){
  .rc84-kvgrid{grid-template-columns:1fr}
  .rc84-metrics{grid-template-columns:1fr 1fr}
}

/* --- 84.0 (задача 8): история адресов артикула (инвентаризация) --- */
.mvh84{display:grid;gap:6px}
.mvh84-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:7px 10px;border-radius:var(--r-sm);
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);font-size:var(--fs-sm)}
.mvh84-row .mono{font-weight:700}
.mvh84-arr{color:var(--c-text-3);display:inline-flex}
.mvh84-at{color:var(--c-text-3);font-size:var(--fs-xs);margin-left:auto;white-space:nowrap}
.mvh84-hint{display:flex;gap:8px;align-items:flex-start;padding:9px 11px;border-radius:var(--r-md);font-size:var(--fs-sm);line-height:1.5;
  background:var(--c-violet-dim);border:1px solid color-mix(in srgb, var(--c-violet) 40%, transparent);color:var(--c-text)}
.mvh84-hint svg{color:var(--c-violet);flex:0 0 auto;margin-top:2px}
.mvh84-hint b.mono{color:var(--c-violet)}

/* ==================== 84.0 (задача 10): БЫСТРЫЙ ТАБЕЛЬ РАБОЧЕГО ВРЕМЕНИ ==================== */
.ts84-day{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ts84-day .ts84-date{font-size:var(--fs-lg);font-weight:800;letter-spacing:-.2px}
.ts84-day .ts84-wd{font-size:var(--fs-sm);color:var(--c-text-3)}
.ts84-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px}
.ts84-emp{position:relative;display:grid;gap:8px;padding:11px 12px;border-radius:var(--r-md);background:var(--c-surface-2);
  border:1px solid var(--c-border-soft);min-width:0;transition:border-color var(--t-fast), box-shadow var(--t-fast)}
.ts84-emp:hover{border-color:var(--c-border);box-shadow:var(--sh-1)}
.ts84-emp.is-done{border-color:color-mix(in srgb, var(--c-accent) 45%, var(--c-border-soft));background:color-mix(in srgb, var(--c-accent) 5%, var(--c-surface-2))}
.ts84-emp.is-open{border-color:color-mix(in srgb, var(--c-warn) 45%, var(--c-border-soft))}
.ts84-emp-h{display:flex;align-items:center;gap:9px;min-width:0}
.ts84-ava{flex:0 0 auto;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:var(--fs-sm);
  color:var(--c-on-brand);background:var(--ts-c, var(--c-brand))}
.ts84-emp-n{min-width:0;flex:1 1 auto}
.ts84-emp-n b{display:block;font-size:var(--fs-md);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ts84-emp-n span{display:block;font-size:var(--fs-xs);color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ts84-sched{display:inline-flex;align-items:center;gap:6px;font-family:var(--f-mono);font-size:var(--fs-sm);font-weight:700;color:var(--c-text-2)}
.ts84-sched .arr{color:var(--c-text-3)}
.ts84-emp-a{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.ts84-emp-a .btn{flex:1 1 auto;justify-content:center}
.ts84-emp-a .icon-btn{flex:0 0 auto}
.ts84-tasks{width:100%}
.ts84-tasks input{width:100%}
.ts84-done{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:var(--fs-sm);color:var(--c-text-2)}
.ts84-done b.mono{color:var(--c-accent)}
.ts84-presets{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.ts84-preset{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:var(--r-pill);border:1px solid var(--c-border);
  background:var(--c-surface);font-family:var(--f-mono);font-size:var(--fs-xs);font-weight:700;color:var(--c-text-2);cursor:pointer}
.ts84-preset:hover{border-color:var(--c-brand);color:var(--c-brand-2)}
.ts84-preset.is-on{background:var(--c-brand-dim);border-color:var(--c-brand);color:var(--c-brand-2)}
.ts84-form{display:grid;grid-template-columns:minmax(180px,1.3fr) 150px 96px 96px minmax(180px,2fr) auto;gap:8px;align-items:end}
.ts84-form .field label{font-size:var(--fs-xs);color:var(--c-text-3);margin-bottom:4px;display:block}
.ts84-form .field .input{width:100%}
@media (max-width:900px){ .ts84-form{grid-template-columns:1fr 1fr} .ts84-form .field.wide{grid-column:1/-1} }
.ts84-sug{position:relative}
.ts84-sug-list{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;background:var(--c-surface);border:1px solid var(--c-border);
  border-radius:var(--r-md);box-shadow:var(--sh-3);max-height:240px;overflow:auto;display:none}
.ts84-sug-list.is-open{display:block}
.ts84-sug-item{display:flex;align-items:center;gap:8px;padding:7px 10px;cursor:pointer;font-size:var(--fs-sm)}
.ts84-sug-item:hover,.ts84-sug-item.is-active{background:var(--c-surface-2)}
.ts84-sug-item .ts84-ava{width:24px;height:24px;font-size:10px}
.ts84-sug-item small{color:var(--c-text-3);margin-left:auto;font-family:var(--f-mono)}
.ts84-week-wrap{overflow-x:auto;padding-bottom:2px}
.ts84-week{display:grid;grid-template-columns:minmax(140px,auto) repeat(7,minmax(54px,1fr));gap:4px;align-items:center;font-size:var(--fs-xs);min-width:560px}
.ts84-week .wk-h{color:var(--c-text-3);text-align:center;font-weight:700;text-transform:uppercase;letter-spacing:.06em}
.ts84-week .wk-h.today{color:var(--c-brand-2)}
.ts84-week .wk-n{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ts84-week .wk-c{height:28px;border-radius:6px;display:grid;place-items:center;font-family:var(--f-mono);font-weight:700;
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);color:var(--c-text-3)}
.ts84-week .wk-c.has{background:var(--c-accent-dim);border-color:color-mix(in srgb, var(--c-accent) 40%, transparent);color:var(--c-accent)}
.ts84-week .wk-c.open{background:var(--c-warn-dim);border-color:color-mix(in srgb, var(--c-warn) 40%, transparent);color:var(--c-warn)}
.ts84-week .wk-c.wend{opacity:.55}


/* ==================== 85.0 · КЛИКАБЕЛЬНЫЕ РЕЕСТРЫ (задача 1) ==================== */
.tbl-click .tbl tbody tr{cursor:pointer}
.tbl-click .tbl tbody tr:hover td{background:var(--c-surface-2)}
.tbl-click .tbl tbody tr:hover .tbl-chev .icon-btn{color:var(--c-data-2);border-color:var(--c-data)}
.tbl-click .tbl th.tbl-chev,.tbl-click .tbl td.tbl-chev{width:40px;text-align:right;padding-right:10px}
.tbl-click .tbl td.tbl-chev .icon-btn{width:26px;height:26px;pointer-events:none}
.rc84-rowacts{padding:4px 0}
.rc84-rowacts .icon-btn{width:34px;height:34px}
.rc84-rowacts .icon-btn svg{width:18px;height:18px}

/* ==================== 85.0 · УМНАЯ ЦВЕТОВАЯ ИНДИКАЦИЯ (задача 2) ==================== */
/* уровни как утилиты: цвет текста и подложка — из токенов слоя индикации */
.ind{--ind-c:var(--c-data);--ind-dim:var(--c-data-dim)}
.ind-crit{--ind-c:var(--c-ind-crit);--ind-dim:var(--c-ind-crit-dim)}
.ind-warn{--ind-c:var(--c-ind-warn);--ind-dim:var(--c-ind-warn-dim)}
.ind-ok{--ind-c:var(--c-ind-ok);--ind-dim:var(--c-ind-ok-dim)}
.ind-info{--ind-c:var(--c-ind-info);--ind-dim:var(--c-ind-info-dim)}
.ind-cat{--ind-c:var(--c-ind-cat);--ind-dim:var(--c-ind-cat-dim)}
.ind-neut{--ind-c:var(--c-ind-neut);--ind-dim:var(--c-ind-neut-dim)}
.ind-data{--ind-c:var(--c-data);--ind-dim:var(--c-data-dim)}
.ind-text{color:var(--ind-c)}
.ind-fill{background:var(--ind-dim);color:var(--ind-c);border:1px solid color-mix(in srgb,var(--ind-c) 35%,transparent);border-radius:var(--r-sm);padding:2px 8px}
.ind-rail{box-shadow:inset 3px 0 0 var(--ind-c)}
table.tbl tbody tr.ind{box-shadow:inset 3px 0 0 var(--ind-c)}
table.tbl tbody tr.ind:hover{box-shadow:inset 3px 0 0 var(--ind-c)}
.ind-dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--ind-c,var(--c-data));flex:0 0 auto;
  box-shadow:0 0 0 2px color-mix(in srgb,var(--ind-c,var(--c-data)) 22%,transparent)}
.ind-dot.ind-crit{--ind-c:var(--c-ind-crit)} .ind-dot.ind-warn{--ind-c:var(--c-ind-warn)} .ind-dot.ind-ok{--ind-c:var(--c-ind-ok)}
.ind-dot.ind-info{--ind-c:var(--c-ind-info)} .ind-dot.ind-cat{--ind-c:var(--c-ind-cat)} .ind-dot.ind-neut{--ind-c:var(--c-ind-neut)} .ind-dot.ind-data{--ind-c:var(--c-data)}
.ind-legend{display:grid;gap:6px;font-size:var(--fs-sm)}
.ind-legend.compact{display:flex;flex-wrap:wrap;gap:6px 14px}
.ind-lg-row{display:flex;align-items:center;gap:9px;min-width:0}
.ind-lg-row b{flex:0 0 96px}
.ind-legend.compact .ind-lg-row b{flex:0 0 auto}
.ind-lg-row span{color:var(--c-text-2)}
/* теги новых уровней (совместимо с прежними ok · warn · bad · info · vio · mut) */
.tag.crit{color:var(--c-ind-crit);border-color:color-mix(in srgb,var(--c-ind-crit) 46%,transparent)}
.tag.cat{color:var(--c-ind-cat);border-color:color-mix(in srgb,var(--c-ind-cat) 46%,transparent)}
.tag.neut{color:var(--c-text-2);border-color:var(--c-border)}
.tag.data,.tag.brand{color:var(--c-data-2);border-color:color-mix(in srgb,var(--c-data) 50%,transparent)}
.ltag.crit{background:var(--c-ind-crit-dim);color:var(--c-ind-crit);border-color:color-mix(in srgb,var(--c-ind-crit) 32%,transparent)}
.ltag.cat{background:var(--c-ind-cat-dim);color:var(--c-ind-cat);border-color:color-mix(in srgb,var(--c-ind-cat) 32%,transparent)}
.ltag.data,.ltag.brand{background:var(--c-data-dim);color:var(--c-data-2);border-color:color-mix(in srgb,var(--c-data) 32%,transparent)}
/* полосы прогресса: без уровня — данные; с уровнем — смысл */
.bar > i{background:var(--c-data)}
.bar.ind-ok > i{background:var(--c-ind-ok)} .bar.ind-warn > i{background:var(--c-ind-warn)} .bar.ind-crit > i{background:var(--c-ind-crit)}
/* тепловая карта и подсветка строк — тон данных (классическая палитра) */
.heat2 i.lv1{background:var(--c-heat-1)} .heat2 i.lv2{background:var(--c-heat-2)} .heat2 i.lv3{background:var(--c-heat-3)} .heat2 i.lv4{background:var(--c-heat-4)}
table.tbl tbody tr:hover{box-shadow:inset 2px 0 0 var(--c-data)}
table.tbl thead th.is-sorted .sort{color:var(--c-text)}
.kpi.kpi-accent{border-color:color-mix(in srgb,var(--c-ind-crit) 45%,var(--c-border-soft))}
.ticket.st-brand{--spine:var(--c-data)}
.mod .badge-count.is-crit{background:var(--c-ind-crit-dim);color:var(--c-ind-crit);border-color:color-mix(in srgb,var(--c-ind-crit) 40%,transparent)}

/* ==================== 85.0 · ИИ-СОВЕТНИК · AI-CORE (задачи 3, 4) ==================== */
.aic85 .card-h{align-items:flex-start;flex-wrap:wrap;gap:8px}
.aic85 .card-h .adv84-sum{margin-top:6px}
.aic85 .adv84-list{gap:8px}
.ai2-methods{display:flex;gap:7px;align-items:flex-start;color:var(--c-text-3);font-size:var(--fs-xs);line-height:1.45;
  padding-top:8px;border-top:1px dashed var(--c-border-soft)}
.ai2-methods svg{flex:0 0 auto;margin-top:2px;color:var(--c-ind-info)}
html[data-design="corporate"] .ai2-methods{color:var(--c-text-2)}


/* ==================== 86.0 (задача 6): карточка остатков «Без адреса · на складе» ==================== */
.kb86-stock{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:6px}
/* 87.0 (задача 6): компактный загрузчик остатков — короткая подпись, тонкие поля, без переноса строк */
.kb86-stock .btn{font-size:var(--fs-xs);padding:3px 9px;gap:5px;line-height:1.2;white-space:nowrap;margin-top:0!important}
.kb86-stock .btn svg{width:12px;height:12px}
/* 87.0 (задача 3): контроль собранных заявок — строка «требует внимания» и «проблема» */
.ac87-rows tbody tr.ac87-stale td:first-child{box-shadow:inset 3px 0 0 var(--c-ind-warn)}
.ac87-rows tbody tr.ac87-issue td:first-child{box-shadow:inset 3px 0 0 var(--c-ind-crit)}
.ac87-rows tbody tr.ac87-stale{background:color-mix(in srgb,var(--c-ind-warn) 5%,transparent)}
.ac87-rows tbody tr.ac87-issue{background:color-mix(in srgb,var(--c-ind-crit) 5%,transparent)}
.ac87-age{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-xs);font-weight:700;padding:1px 7px;border-radius:999px;border:1px solid var(--c-border-soft);color:var(--c-text-2);background:var(--c-surface-2)}
.ac87-age.warn{color:var(--c-ind-warn);border-color:color-mix(in srgb,var(--c-ind-warn) 45%,transparent);background:var(--c-ind-warn-dim)}
.ac87-age.crit{color:var(--c-ind-crit);border-color:color-mix(in srgb,var(--c-ind-crit) 45%,transparent);background:var(--c-ind-crit-dim)}
.ac87-issue-box{display:grid;gap:6px;padding:10px 12px;border-radius:var(--r-md);border:1px solid color-mix(in srgb,var(--c-ind-crit) 35%,var(--c-border-soft));background:color-mix(in srgb,var(--c-ind-crit) 6%,var(--c-surface))}
.ac87-issue-box.resolved{border-color:color-mix(in srgb,var(--c-ind-ok) 35%,var(--c-border-soft));background:color-mix(in srgb,var(--c-ind-ok) 6%,var(--c-surface))}
.ac87-issue-box .ib-h{display:flex;gap:8px;align-items:center;flex-wrap:wrap;font-size:var(--fs-xs);font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--c-text-3)}
.ac87-issue-box .ib-t{font-size:var(--fs-sm);color:var(--c-text);line-height:1.5;overflow-wrap:anywhere}
.ac87-issue-box .ib-m{font-size:var(--fs-xs);color:var(--c-text-3)}
.ac87-cats{display:flex;gap:6px;flex-wrap:wrap}
.ac87-cat{border:1px solid var(--c-border);background:var(--c-surface-2);border-radius:999px;padding:4px 11px;font-size:var(--fs-xs);cursor:pointer;color:var(--c-text-2);transition:border-color var(--t-fast),background var(--t-fast)}
.ac87-cat:hover{border-color:var(--c-data)}
.ac87-cat.on{border-color:var(--c-ind-crit);color:var(--c-ind-crit);background:var(--c-ind-crit-dim);font-weight:700}
.ac87-legend{display:flex;gap:10px;flex-wrap:wrap;font-size:var(--fs-xs);color:var(--c-text-3);align-items:center}
.ac87-legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:4px;vertical-align:-1px}
/* 87.0 (задача 1): кликабельные этапы поставки */
.stages71 tbody tr.st87-row{cursor:pointer;transition:background var(--t-fast)}
.stages71 tbody tr.st87-row:hover{background:color-mix(in srgb,var(--c-data) 7%,transparent)}
.stages71 tbody tr.st87-row:hover td:first-child b{color:var(--c-data-2)}
.st87-go{opacity:.55} .stages71 tbody tr:hover .st87-go{opacity:1}
.st87-list{display:grid;gap:4px}
.st87-item{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:10px;align-items:center;padding:6px 10px;border-radius:var(--r-sm);background:var(--c-surface-2);font-size:var(--fs-sm)}
.st87-item .a{font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st87-item .q{font-size:var(--fs-xs);color:var(--c-text-3);white-space:nowrap}
.st87-who{display:grid;gap:6px}
.st87-who-row{display:grid;grid-template-columns:minmax(0,1fr) 120px 44px;gap:10px;align-items:center;font-size:var(--fs-sm)}
.st87-who-row .n{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st87-who-row .v{font-size:var(--fs-xs);text-align:right;color:var(--c-text-2);font-variant-numeric:tabular-nums}
.kb86-at{font-size:var(--fs-xs);color:var(--c-text-3)}

/* ==================== 86.0 (задача 5): досье клиента (на атомах .ad74-*) ==================== */
.ad86-years{display:flex;gap:6px;flex-wrap:wrap}
.ad86-year{display:grid;gap:2px;min-width:78px;padding:6px 10px;border:1px solid var(--c-border-soft);border-radius:var(--r-sm);background:var(--c-surface-2)}
.ad86-year b{font-family:var(--f-mono);font-size:var(--fs-sm);color:var(--c-text)}
.ad86-year em{font-style:normal;font-size:10px;color:var(--c-text-3);letter-spacing:.06em;text-transform:uppercase}
.ad86-year i{display:block;height:4px;border-radius:2px;background:var(--c-data)}
.ad74-td .btn-link86{background:transparent;border:0;padding:0;color:var(--c-data-2);cursor:pointer;font:inherit;text-decoration:underline dotted}
.ad74-td .btn-link86:hover{color:var(--c-text)}

/* ==================== 86.0 (задача 10): полигон документов консигнации ==================== */
.doc86-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:var(--sp-3)}
.doc86-card{display:grid;gap:8px;padding:12px 14px;border:1px solid var(--c-border-soft);border-radius:var(--r-md);background:var(--c-surface-2)}
.doc86-card h4{margin:0;font-size:var(--fs-md);display:flex;gap:8px;align-items:center}
.doc86-card p{margin:0;font-size:var(--fs-sm);color:var(--c-text-2);line-height:1.5}
.doc86-acts{display:flex;gap:6px;flex-wrap:wrap}
.doc86-preview{border:1px solid var(--c-border);border-radius:var(--r-md);background:#fff;color:#101014;padding:14px 16px;max-height:70vh;overflow:auto;
  font-family:"ROCH Grotesk","Segoe UI",Roboto,Arial,sans-serif;font-size:12px;line-height:1.45}
.doc86-preview .pr-head{display:flex;justify-content:space-between;gap:16px;border-bottom:2.5px solid #e2001a;padding-bottom:8px;margin-bottom:8px}
.doc86-preview .pr-brand{font-size:11px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:#55555e}
.doc86-preview .pr-sor{font-size:22px;font-weight:800}
.doc86-preview .pr-cli{font-size:14px;font-weight:700;margin-top:2px}
.doc86-preview .pr-meta{text-align:right;font-size:11.5px}
.doc86-preview .pr-meta .mk{color:#55555e;font-weight:700;letter-spacing:.05em;text-transform:uppercase;font-size:9.5px;margin-right:5px}
.doc86-preview .pr-meta .mv{font-weight:750}
.doc86-preview table.pr-tbl{width:100%;border-collapse:collapse;table-layout:fixed}
.doc86-preview th{text-align:left;font-size:9.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:#55555e;border-bottom:1.5px solid #101014;padding:5px 5px 4px}
.doc86-preview td{border-bottom:.6px solid #b9b9c1;padding:6px 5px;vertical-align:top;word-wrap:break-word}
.doc86-preview td.c{text-align:center} .doc86-preview td.r{text-align:right} .doc86-preview td.m{font-weight:750}
.doc86-preview .pr-kv{display:grid;grid-template-columns:max-content 1fr;gap:3px 12px;margin:6px 0 8px;font-size:11.5px}
.doc86-preview .pr-kv .k{color:#55555e;font-weight:700;letter-spacing:.04em;text-transform:uppercase;font-size:9.5px;padding-top:2px}
.doc86-preview .pr-fline{display:inline-block;min-width:34mm;border-bottom:1.2px solid #101014;padding:0 6px 1px;font-weight:750;text-align:center}
.doc86-preview .pr-fcap{font-size:9.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:#55555e;white-space:nowrap}
.doc86-preview .pr-sign{display:flex;gap:24px;margin-top:22px}
.doc86-preview .pr-sign > div{flex:1 1 0}
.doc86-preview .pr-line{border-bottom:1px solid #101014;height:26px}
.doc86-preview .pr-cap{font-size:9.5px;color:#55555e;margin-top:4px;letter-spacing:.04em}
.doc86-preview .pr-total td{border-bottom:0;border-top:1.5px solid #101014;font-weight:800}
.doc86-preview .pr-note{margin-top:8px;font-size:11px;color:#333}
.doc86-preview .pr-title{font-size:15px;font-weight:800;text-align:center;margin:6px 0 10px;letter-spacing:.02em}
.doc86-preview .pr-sub{font-size:11px;text-align:center;color:#55555e;margin:-6px 0 10px}
/* 87.0 (задача 7): текстовые блоки и значение на линии подписи — предпросмотр как на печати */
.doc86-preview .pr-blocks{display:grid;gap:12px;margin-top:12px}
.doc86-preview .pr-block-cap{font-size:9.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:#55555e;border-bottom:1.5px solid #101014;padding-bottom:4px;margin-bottom:6px}
.doc86-preview .pr-block-txt{font-size:11.5px;line-height:1.5;white-space:pre-wrap;padding:0 4px}
.doc86-preview .pr-rule{border-bottom:.6px solid #b9b9c1;height:24px}
.doc86-preview .pr-line.has-val{display:flex;align-items:flex-end;justify-content:center}
.doc86-preview .pr-line-val{font-size:11px;font-weight:700;padding-bottom:3px}
.doc86-preview .pr-types{display:flex;gap:14px;align-items:center;margin:6px 0 10px;font-size:11.5px}
.doc86-preview .pr-type{display:inline-flex;align-items:center;gap:5px}
.doc86-preview .pr-box{display:inline-block;width:11px;height:11px;border:1.2px solid #101014;border-radius:2px}
.doc86-preview .pr-box.on{background:#101014}

/* ============================================================
   89.0 (задача 2) · «ПАМЯТЬ → РЕЗЕРВНЫЕ КОПИИ»: плитки справочников
   ============================================================ */
.mem89-sets{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}
.mem89-set{display:grid;gap:10px;padding:13px 14px;border-radius:var(--r-md);background:var(--c-surface-2);
  border:1px solid var(--c-border-soft);min-width:0;transition:border-color var(--t-fast), box-shadow var(--t-fast)}
.mem89-set:hover{border-color:var(--c-border);box-shadow:var(--sh-1)}
.mem89-set-h{display:flex;align-items:center;gap:10px;min-width:0}
.mem89-set-ic{flex:0 0 auto;width:36px;height:36px;border-radius:var(--r-sm);display:grid;place-items:center;
  color:var(--set-c, var(--c-brand));background:color-mix(in srgb, var(--set-c, var(--c-brand)) 14%, transparent)}
.mem89-set-t{min-width:0;flex:1 1 auto}
.mem89-set-t b{display:block;font-size:var(--fs-md);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mem89-set-t span{display:block;font-size:var(--fs-xs);color:var(--c-text-3);line-height:1.35}
.mem89-set-n{font-size:22px;font-weight:800;letter-spacing:-.01em;color:var(--c-data)}

/* ============================================================
   90.0 (задача 1) · ЗАГРУЗКА ЗАЯВОК: окно «Проверка перед загрузкой» — похожие на уже собранные
   ============================================================ */
.dup90-row{display:flex;gap:12px;align-items:flex-start;padding:10px 12px;border-radius:var(--r-md);cursor:pointer;
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-left:3px solid var(--c-warn);transition:border-color var(--t-fast)}
.dup90-row:hover{border-color:var(--c-border);border-left-color:var(--c-warn)}
.dup90-row.is-reupload{border-left-color:var(--c-danger)}
.dup90-row.is-reupload:hover{border-left-color:var(--c-danger)}
.dup90-row input[type=checkbox]{flex:0 0 auto;width:18px;height:18px;margin-top:2px;accent-color:var(--c-brand)}
.dup90-body{min-width:0;flex:1 1 auto}

/* ============================================================
   90.0 (задача 4) · СПРАВОЧНИК КЛИЕНТОВ: ответственный менеджер и история ответственных
   ============================================================ */
.cm90{display:grid;gap:10px}
.cm90-cur{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:12px 14px;border-radius:var(--r-md);
  background:var(--c-surface-2);border:1px solid var(--c-border-soft);border-left:3px solid var(--c-violet, var(--c-brand))}
.cm90-cur.is-none{border-left-color:var(--c-warn)}
.cm90-av{flex:0 0 auto;width:38px;height:38px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;letter-spacing:.02em;
  color:var(--c-violet, var(--c-brand));background:color-mix(in srgb, var(--c-violet, var(--c-brand)) 14%, transparent)}
.cm90-cur.is-none .cm90-av{color:var(--c-warn);background:color-mix(in srgb, var(--c-warn) 14%, transparent)}
.cm90-who{min-width:0;flex:1 1 200px}
.cm90-cap{font-size:10px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:var(--c-text-3)}
.cm90-name{font-size:var(--fs-md);font-weight:750;color:var(--c-text);line-height:1.3}
.cm90-name .mono{color:var(--c-brand-2);font-weight:600;font-size:var(--fs-sm)}
.cm90-period{font-size:var(--fs-xs);color:var(--c-text-2);margin-top:2px}
.cm90-period b{color:var(--c-text);font-weight:700}
.cm90-acts{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.cm90-hist{display:grid;gap:0;border:1px solid var(--c-border-soft);border-radius:var(--r-md);overflow:hidden}
.cm90-h{display:grid;grid-template-columns:22px minmax(140px,1.2fr) minmax(170px,1.4fr) minmax(120px,1fr);gap:10px;align-items:center;
  padding:8px 12px;font-size:var(--fs-xs);border-top:1px solid var(--c-border-soft);background:var(--c-surface)}
.cm90-h:first-child{border-top:0}
.cm90-h.is-cur{background:color-mix(in srgb, var(--c-violet, var(--c-brand)) 7%, transparent)}
.cm90-dot{width:10px;height:10px;border-radius:50%;background:var(--c-text-3);justify-self:center}
.cm90-h.is-cur .cm90-dot{background:var(--c-violet, var(--c-brand));box-shadow:0 0 0 3px color-mix(in srgb, var(--c-violet, var(--c-brand)) 22%, transparent)}
.cm90-h .n{font-weight:700;color:var(--c-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cm90-h .n .mono{color:var(--c-brand-2);font-weight:600}
.cm90-h .p{color:var(--c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cm90-h .m{color:var(--c-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cm90-empty{color:var(--c-text-3);font-size:var(--fs-sm);padding:4px 2px}
@media (max-width:640px){.cm90-h{grid-template-columns:22px 1fr;grid-auto-rows:auto}.cm90-h .p,.cm90-h .m{grid-column:2}}

/* ==================== 95.0 · Пересчёт груза: защита факта и карточка инвойса ====================
   • .lock95 — зона «Фиксация факта» талона, когда инвойс не взят в работу этим сотрудником
     (плашка с причиной + кнопка «Взять в работу»), задача 3;
   • .rest95 — перечень оставшихся артикулов внутри карточки инвойса (шторка core/reccard.js):
     выше, чем панель на экране, без верхнего отступа, задача 2;
   • .upd95 — блок «Обновление платформы» окна «Синхронизация с сервером», задача 1. */
.ticket .lock95{display:grid;gap:10px}
.ticket .lock95 .alert{font-size:12px;line-height:1.45}
.ticket .lock95 .alert b{font-weight:800}
.ticket .lock95 .act-main .btn-primary{flex:1 1 auto;justify-content:center;min-height:38px}
.rc84-drawer .rest95{max-height:52vh;margin-top:0}
.rc84-drawer .rest95 .rest64-row{background:var(--c-surface-2)}
.upd95{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;
  padding:8px 10px;background:var(--c-surface-2);border-radius:var(--r-sm)}
.upd95 .upd95-t{min-width:0;flex:1 1 220px}
.upd95 .upd95-t b{font-weight:750}
.upd95 .upd95-s{font-size:var(--fs-xs);color:var(--c-text-3);margin-top:2px}
