/* === Neon shell (ТЗ 1711, 01 §4–6) ================================================= */
body[data-design="command-core"]{
  font-family:var(--ds-font);font-size:14px;line-height:20px;color:var(--ds-text);
  background:var(--ds-canvas);
}
/* два статичных луча в правой верхней зоне (01 §4.3): не под таблицами, клики не ловят.
   z-index:-1 (а не --ds-z-base=0 + `body > *{position:relative;z-index:0}`) — тот приём
   поднимал КАЖДОГО прямого ребёнка body в свой стек с (0,1,1), что перебивало position:fixed
   модалок/ассистента (.modal-bg/.ai-panel из panel.css, специфичность (0,1,0)) и рвало
   фиксированное позиционирование (#ygModal/#metricModal/#priceCalcModal/#priceHistModal,
   #aiPanel). Отрицательный z-index на fixed-псевдоэлементах красит их НИЖЕ всего обычного
   контента страницы (body своего стека не создаёт), но ВЫШЕ фона html/body — без правила
   на `> *` вовсе. */
body[data-design="command-core"]::before,
body[data-design="command-core"]::after{
  content:"";position:fixed;top:-120px;pointer-events:none;z-index:-1;
  opacity:var(--ds-ray-opacity);
  background:linear-gradient(180deg,transparent,var(--ds-edge-violet) 45%,var(--ds-edge-cyan) 70%,transparent);
}
body[data-design="command-core"]::before{right:180px;width:100px;height:520px;transform:rotate(35deg);transform-origin:top}
body[data-design="command-core"]::after{right:40px;width:160px;height:560px;transform:rotate(50deg);transform-origin:top}
body[data-design="command-core"] :where(.kbig,.tnum,td,.ksub b,.prow b){font-variant-numeric:tabular-nums lining-nums}
:where(body[data-design="command-core"] :is(button,a,input,select,textarea,[tabindex]):focus-visible){
  outline:2px solid var(--ds-focus);outline-offset:2px;
}
/* шапка страницы ≥64px, прозрачная, слой header. Высота — ТОЛЬКО шапке оболочки (body > header):
   раньше min-height 64 получал любой <header> экрана, и над заголовками панелей стояли пустые
   полосы (РНП, W5). Прозрачность — как раньше всем, кроме шапки окна C08 (.ds-drawer-head —
   своя геометрия в ds-primitives.css); :where — специфичность прежняя. */
body[data-design="command-core"] header:where(:not(.ds-drawer-head)){
  border-bottom:0;background:transparent;box-shadow:none;
}
body[data-design="command-core"] > header{min-height:var(--ds-header-h)}
body[data-design="command-core"] header.tc-bell-open{position:relative;z-index:var(--ds-z-drawer);}
body[data-design="command-core"] .brand-orbit{display:block;border-radius:0}
body[data-design="command-core"] .brand-orbit-dot{transform-origin:16px 16px}
body[data-design="command-core"] h1.brand-name{font-size:23px;line-height:28px;font-weight:750;letter-spacing:-.3px;color:var(--ds-text)}
body[data-design="command-core"] header .refresh,
body[data-design="command-core"] header .month-chip{
  height:var(--ds-control-h);padding:0 14px;border-radius:var(--ds-radius-sm);
  color:var(--ds-text);background:var(--ds-surface);border:1px solid var(--ds-line-strong);
}
body[data-design="command-core"] .motion-wrap{position:relative;display:inline-block}
body[data-design="command-core"] .motion-menu{
  position:absolute;right:0;top:calc(100% + 6px);min-width:240px;padding:8px;z-index:var(--ds-z-drawer);
  color:var(--ds-text);background:var(--ds-surface-raised);border:1px solid var(--ds-line-strong);
  border-radius:var(--ds-radius);box-shadow:0 12px 30px var(--ds-shadow);
}
body[data-design="command-core"] .motion-menu label{display:flex;gap:8px;align-items:flex-start;padding:8px 10px;border-radius:var(--ds-radius-sm);cursor:pointer}
body[data-design="command-core"] .motion-menu label:hover{background:var(--ds-hover)}
body[data-design="command-core"] .motion-menu .mp{display:block;font-size:12px;line-height:18px;color:var(--ds-muted)}
/* Подпись #motionSysNote стоит в разметке с `hidden` и показывается ui.js только при reduce ОС.
   Пара ниже обязательна: правило с `display` выше перебивает браузерный `[hidden]{display:none}`
   независимо от специфичности, и без неё подпись видна на каждом устройстве (задача 1736,
   сторож tests/_core/test_design_motion_note_hidden_browser.py). */
body[data-design="command-core"] .motion-menu .mp[hidden]{display:none}
body[data-design="command-core"] .nav-topbar{
  /* доменная полоса ≥48px, скроллится, активный домен — selected */
  min-height:var(--ds-domainbar-h);border:1px solid var(--ds-line);background:var(--ds-surface);
  box-shadow:0 8px 24px var(--ds-shadow);padding:var(--ds-shell-topbar-block-inset) var(--ds-shell-topbar-inline-inset);
}
body[data-design="command-core"] .nav-domains{margin-bottom:0;overflow-x:auto;scrollbar-width:thin;overscroll-behavior-inline:contain}
body[data-design="command-core"] .nav-dom,
body[data-design="command-core"] .nav-collapse-btn,
body[data-design="command-core"] .nav-editbtn,
body[data-design="command-core"] .nav-cmdk{color:var(--ds-muted);border:1px solid transparent;background:transparent;border-radius:var(--ds-radius-sm)}
body[data-design="command-core"] .nav-dom.active{
  color:var(--ds-text);background:var(--ds-selected);border-color:var(--ds-indigo);
  box-shadow:0 0 12px var(--ds-glow);
}
body[data-design="command-core"] .nav-side{
  /* sidebar 224 / 64, пункты — кнопки */
  width:var(--ds-sidebar-w);color:var(--ds-text);background:var(--ds-sidebar);
  border:1px solid var(--ds-line);box-shadow:0 8px 24px var(--ds-shadow);padding:var(--ds-shell-side-inset);
}
body[data-design="command-core"] .nav-shell{gap:var(--ds-content-gap)}
body[data-design="command-core"] .nav-content{padding:var(--ds-shell-content-inset);}
body[data-design="command-core"] .nav-item,
body[data-design="command-core"] button.nav-sec-h{
  display:flex;width:100%;align-items:center;gap:10px;text-align:left;font:inherit;font-size:13px;line-height:18px;font-weight:500;
  color:var(--ds-muted);background:transparent;border:1px solid transparent;border-radius:var(--ds-radius-sm);cursor:pointer;
}
body[data-design="command-core"] .nav-item:hover{background:var(--ds-hover);color:var(--ds-text)}
body[data-design="command-core"] .nav-item.active{
  color:var(--ds-text);background:var(--ds-selected);border-color:var(--ds-indigo);box-shadow:0 0 12px var(--ds-glow);
}
body[data-design="command-core"] .nav-badge{
  color:var(--ds-semantic-red-text);background:var(--ds-semantic-red-bg);border:1px solid var(--ds-semantic-red-line);box-shadow:none;
}
/* мобильная шторка: слои 200/210. Скрим — с квалификатором .mob-nav-open в ТОМ ЖЕ компаунде,
   что и у .nav-side ниже (не голый body[data-design=…] .mob-nav-scrim): та форма даёт
   специфичность (0,2,1), ровно как у mobile.css `body.mob-nav-open .mob-nav-scrim`
   (загружается ПОСЛЕДНИМ в index.html) — при равной специфичности порядок в документе решает
   исход, и литеральный z-index:55/background:var(--overlay) из mobile.css побеждал токен
   здесь безусловно. Найдено 20.09.2026 (задача 1711, Task 13): шапка получила
   z-index:var(--ds-z-header)=100 (Task 5) — ВЫШЕ старого скрима 55, и на мобильной шторке
   колокольчик/меню профиля торчали сквозь затемнение неприкрытыми. На origin/master шапка
   без z-index (position не задан) — скрим 55/60 её перекрывал всегда; регрессия ветки, не
   pre-existing. */
body[data-design="command-core"].mob-nav-open .mob-nav-scrim{z-index:var(--ds-z-mobile-scrim);background:var(--ds-overlay)}
body[data-design="command-core"].mob-nav-open .nav-side{z-index:var(--ds-z-mobile-menu);width:min(320px,calc(100vw - 48px))}
/* кнопки (01 §6.2): primary — градиент 110°, secondary — поверхность, ghost, destructive */
:root{--ds-btn-radius:var(--ds-radius-sm,10px);--ds-btn-pad:0 16px;--ds-btn-size:13px}
body[data-design="command-core"] :where(.btn,.rv-regen,.rv-mini,.care-btn,.rpx-btn,.ig-btn,.dbx-btn,.tst-btn,.mtg-btn,.bdr-btn,.tct-btn,.opop-btn,.ib-btn,.ns-btn,.sv-pill,button.refresh){
  height:var(--ds-control-h);padding:var(--ds-btn-pad);border-radius:var(--ds-btn-radius);font-weight:500;font-size:var(--ds-btn-size);line-height:18px;
  color:var(--ds-text);background:var(--ds-surface);border:1px solid var(--ds-line-strong);
}
body[data-design="command-core"] :where(.btn-primary,.rv-send,.proc-create-btn,.ib-btn.ib-ok,.sv-pill.accent,.nav-editbar .save){
  color:var(--ds-on-accent);background:linear-gradient(110deg,var(--ds-action-start),var(--ds-action-end));border:1px solid var(--ds-edge-violet);
}
/* panel.css:1378 красит .rv-send жёстким #0f7a37 ТОЛЬКО в html[data-theme="light"]
   ((0,2,1) — сильнее :where() выше) — «Применить выбранным» («Цены») оставался зелёным
   в светлой теме, хотя в тёмной уже фиолетовый градиент primary (задача 1711, Task 10
   Step 2). Явные (не :where) правила той же специфичности бьют panel.css порядком
   подключения (design-system.css идёт последним в index.html). */
body[data-design="command-core"] .rv-send,
body[data-design="command-core"] .rv-send:hover{
  color:var(--ds-on-accent);background:linear-gradient(110deg,var(--ds-action-start),var(--ds-action-end));border:1px solid var(--ds-edge-violet);
}
body[data-design="command-core"] :where(.btn-ghost){background:transparent;border-color:transparent}
body[data-design="command-core"] :where(.btn-ghost):hover{background:var(--ds-hover)}
body[data-design="command-core"] :where(.btn-danger,.ib-btn.ib-no){color:var(--ds-semantic-red-text);background:var(--ds-semantic-red-bg);border-color:var(--ds-semantic-red-line)}
body[data-design="command-core"] :where(button,[role="button"]):disabled{opacity:.52;cursor:not-allowed}
/* поля (01 §6.4) */
body[data-design="command-core"] input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
body[data-design="command-core"] select,
body[data-design="command-core"] textarea{
  color:var(--ds-text);background:var(--ds-surface-soft);border:1px solid var(--ds-line-strong);border-radius:var(--ds-radius-sm);
  font:inherit;min-height:var(--ds-field-h);padding:0 12px;
}
body[data-design="command-core"] textarea{padding:8px 12px;min-height:80px}
body[data-design="command-core"] :where(td,th) :where(input,select){min-height:var(--ds-field-h-dense)}
/* таблицы (01 §6.5) */
body[data-design="command-core"] table{color:var(--ds-text);background:var(--ds-surface)}
body[data-design="command-core"] th{height:var(--ds-table-head-h);padding:8px 12px;color:var(--ds-muted);font-size:12px;font-weight:500;background:var(--ds-surface);border-bottom:1px solid var(--ds-line)}
body[data-design="command-core"] td{min-height:var(--ds-row-h);padding:8px 12px;border-bottom:1px solid var(--ds-line)}
body[data-design="command-core"] tbody tr:hover>td{background:var(--ds-hover)}
body[data-design="command-core"] tbody tr.sel>td,
body[data-design="command-core"] tbody tr.selected>td{background:var(--ds-selected)}
/* Выбранная строка ПОВЕРХ зебры (аудит 1722 A18, задача 1727): зебра panel.css
   `.dlang table:not(.tx-table) tbody tr:nth-child(even) > *` и её вариант
   `.dlang table.proc-table-lined …` — обе (0,3,3) — били правило выше (0,2,4), и токен
   --ds-selected был виден только на нечётных строках. Как у hover (panel.css даёт ему
   свою .dlang-версию): своя .dlang-версия сильнее обеих зебр — (0,3,5). */
body[data-design="command-core"] .dlang table tbody tr:is(.sel,.selected)>td{background:var(--ds-selected)}
/* панели/карточки/KPI (01 §6.1): непрозрачные, тонкая грань, тень 0 8 24 */
body[data-design="command-core"] :where(.panel,.card,.kcard,.pcard){
  color:var(--ds-text);background:var(--ds-surface);border:1px solid var(--ds-line);border-radius:var(--ds-radius);box-shadow:0 8px 24px var(--ds-shadow);
}
body[data-design="command-core"] :where(.kcard,.card){padding:16px;min-height:116px}
body[data-design="command-core"] .klabel{font-size:12px;line-height:18px;font-weight:500;color:var(--ds-muted)}
body[data-design="command-core"] .kbig{font-size:28px;line-height:34px;font-weight:700}
body[data-design="command-core"] .kpis--r1 .kbig{font-size:24px;line-height:30px}
body[data-design="command-core"] .ksub{font-size:12px;line-height:18px;color:var(--ds-muted)}
/* Значение KPI на «Основной» (01 §4.1, аудит 1716 F02): panel.css `.dash .kpis--r1 .card .big`
   (0,4,0) ставил clamp(19px,1.55vw,30px) → 22.32 px на 1440 и nowrap, а overflow:hidden карточки
   резал хвост суммы. Владелец типографики теперь здесь (0,4,1): 28/34 у обычной карточки,
   24/30 в ряду шести; шрифт не ужимается (аудит 1722 R01). Перенос — только по пробелу:
   dsFitKpiValues (dashboard-ui.js) заменяет NBSP Intl(ru-RU) между разрядными группами обычным
   пробелом, поэтому длинная сумма ложится строками «123 456 / 789 ₽» — группа и знак целы,
   overflow-wrap:normal запрещает рвать группу изнутри (04 §5.1: переносы при fallback-шрифте
   допустимы, перекрытия/обрезка — нет). Padding ряда шести — 12 px (01 §6.1: 12–16 по ширине). */
body[data-design="command-core"] .dash .card{padding:16px}
body[data-design="command-core"] .dash .kpis--r1 .card{padding:12px}
body[data-design="command-core"] .dash .card .big{font-size:28px;line-height:34px;font-weight:700;letter-spacing:-.3px;white-space:normal;overflow-wrap:normal;word-break:normal;min-width:0}
body[data-design="command-core"] .dash .kpis--r1 .card .big{font-size:24px;line-height:30px}
/* «Основная» (01 §7): hero, фильтры, 6+4 KPI по брейкпоинтам, график:пульс = 2:1 */
body[data-design="command-core"] .sv-hero{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:20px 24px;margin-bottom:16px;
  background:var(--ds-surface);border:1px solid var(--ds-line);border-radius:var(--ds-radius);box-shadow:0 8px 24px var(--ds-shadow)}
body[data-design="command-core"] .sv-hero h1{margin:0;font-size:30px;line-height:38px;font-weight:700}
body[data-design="command-core"] .sv-hero-sub{font-size:14px;line-height:20px;color:var(--ds-muted);margin-top:4px}
body[data-design="command-core"] .sv-actions{display:flex;gap:8px;flex-wrap:wrap}
body[data-design="command-core"] .sv-pill.sv-ai{border-color:var(--ds-violet);color:var(--ds-violet)}
body[data-design="command-core"] .kpis{display:grid;gap:12px;margin-bottom:16px}
body[data-design="command-core"] .kpis--r1{grid-template-columns:repeat(6,minmax(0,1fr))}
body[data-design="command-core"] .kpis--r2{grid-template-columns:repeat(4,minmax(0,1fr))}
/* модификатор без права на строки ниже валовой прибыли (panel.css:98) — 4 плашки вместо 6,
   иначе .kpis--r1{repeat(6)} той же специфичности побеждает по порядку правил (C2, ревью) */
body[data-design="command-core"] .kpis--r1.kpis--r1-4{grid-template-columns:repeat(4,minmax(0,1fr))}
@media(max-width:1439px){
  body[data-design="command-core"] .kpis--r1{grid-template-columns:repeat(3,minmax(0,1fr))}
  body[data-design="command-core"] .kpis--r1.kpis--r1-4{grid-template-columns:repeat(2,minmax(0,1fr))}
}
/* Мобильные ряды (01 §7, аудит 1716 F01): раньше стояли через :where() с нулевым вкладом
   селектора — (0,1,1) проигрывало и базовому .kpis--r1 выше (0,2,1), и panel.css
   `.dash .kpis--r1` (0,2,0), поэтому на 390 px оставалось 3/4 колонки с обрезанными суммами.
   Та же специфичность (0,2,1)/(0,3,1), что у базовых правил, и позже по файлу — побеждают. */
@media(max-width:1023px){
  body[data-design="command-core"] .kpis--r1,
  body[data-design="command-core"] .kpis--r2,
  body[data-design="command-core"] .kpis--r1.kpis--r1-4{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:359px){
  body[data-design="command-core"] .kpis--r1,
  body[data-design="command-core"] .kpis--r2,
  body[data-design="command-core"] .kpis--r1.kpis--r1-4{grid-template-columns:minmax(0,1fr)}
}
body[data-design="command-core"] .dash .sv-row{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);gap:16px;margin-bottom:16px}
@media(max-width:1279px){body[data-design="command-core"] .dash .sv-row{grid-template-columns:minmax(0,1fr)}}
@media(max-width:768px){body[data-design="command-core"] .sv-hero h1{font-size:24px;line-height:32px}}
/* hero-KPI: без сплошного градиента под белыми цифрами (01 §6.1) */
body[data-design="command-core"] .dash .card--hero{
  background:var(--ds-surface);border:1px solid var(--ds-line);color:var(--ds-text);
  border-top:2px solid var(--ds-indigo);
}
body[data-design="command-core"] .dash .card--hero :where(.label,.sub,.sub b){color:var(--ds-muted)}
body[data-design="command-core"] .dash .card--hero .pos{color:var(--ds-green)}
body[data-design="command-core"] .dash .card--hero .neg{color:var(--ds-coral)}
body[data-design="command-core"] .dash .card--hero .warn{color:var(--ds-amber)}
/* диалоги/слои (01 §6.7–6.8) */
body[data-design="command-core"] :where(.modal-bg,#uiConfirm){z-index:var(--ds-z-modal-scrim);background:var(--ds-overlay)}
/* Закупки (01 §6.8, аудит 1722 A12, задача 1727): #procModal (procOpenModal) — скрим и окно
   одним узлом, слой модалки; список комбобокса товара .art-combo-list (procArtcOpen) —
   popover ВНУТРИ модалки: position:fixed, но дочерний узел #procModal, поэтому его z-index
   считается в stacking context модалки и должен быть выше её содержимого (elementFromPoint
   по строке списка — строка списка, а не форма). Раньше оба стояли inline 10000/9999 из
   procurement.js. Запасное значение — та же ступень шкалы для легаси-темы (?design=legacy,
   A46), где токенов --ds-z-* на body нет и модалка ушла бы под sticky-шапки таблиц. */
#procModal{z-index:var(--ds-z-modal,410)}
.art-combo-list{z-index:var(--ds-z-modal-popover,420)}
body[data-design="command-core"] :where(.modal,.drawer,.popover,.dropdown){
  color:var(--ds-text);background:var(--ds-surface-raised);border:1px solid var(--ds-line-strong);border-radius:var(--ds-radius-lg);
}
/* .modal геометрия по 01 §6.7 (задача 1711, Task 13 — отложено Task 5, держал старый
   контракт test_design_workflows_static::WORKFLOW_SURFACES max-width:94vw/max-height:90vh):
   обычная модалка ≤560, отступ от viewport 16px на сторону (calc(100vw - 32px)), высота —
   calc(100dvh - 32px) с собственной прокруткой. Карточка документа шире (.modal.wide,
   ygModal/metricModal/priceCalcModal/priceHistModal в index.html) — до 960 той же формулой. */
body[data-design="command-core"] :where(.modal,.drawer,.popover,.dropdown){
  max-width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 32px);overflow:auto;
}
body[data-design="command-core"] .modal.wide{max-width:min(960px,calc(100vw - 32px))}
/* I4 (ревью 20.09): rnp-giveaways.css:41 `.modal.gw-form{width:min(720px,95vw)}` — width, а
   генерик max-width выше той же специфичности (0,2,0) идёт ПОЗЖЕ по каскаду и режет форму
   раздач до 560. Свой max-width для варианта, аналогично .modal.wide. */
body[data-design="command-core"] .modal.gw-form{max-width:min(720px,calc(100vw - 32px))}
/* Ассистент (02 §6.3): системная плашка гарда и ошибка сети — семантические токены темы,
   не литеральный светлый hex из panel.css (#fef2f2/#fffbeb — правило легаси-темы, не трогаем).
   Без этого dark-тема получала яркие бледные плашки поверх тёмной панели (найдено кадром
   20.09.2026, Task 13, стаб /api/assistant/history тремя ролями) — фон уже был ≠ фону
   пользователя классом, но не следовал теме. */
body[data-design="command-core"] .ai-msg-err{background:var(--ds-semantic-red-bg);color:var(--ds-semantic-red-text)}
body[data-design="command-core"] .ai-msg-warn{
  background:var(--ds-semantic-amber-bg);color:var(--ds-semantic-amber-text);border-color:var(--ds-semantic-amber-line);
}
body[data-design="command-core"] #uiToasts{z-index:var(--ds-z-toast)}
body[data-design="command-core"] .acct-drop{z-index:var(--ds-z-drawer)}
/* .ai-panel (01 §6.7, 01 §6.8): базовая ширина 440, немодальный слой drawer (300) вместо
   старого 901 (Task 13, задача 1711 — отложено Task 5). right/bottom оставлены panel.css
   (20px/20px) — контракт геометрии test_design_workflows_static.py::WORKFLOW_SURFACES не
   различает медиа-условия, любое переопределение right/z-index здесь ловится как
   безусловное для ВСЕХ ширин; полноэкранный вариант ≤768 — в mobile.css (файл не входит в
   STATIC_CSS того теста, поэтому медиа-override там не путается с этим безусловным). */
body[data-design="command-core"] .ai-panel{width:440px;max-width:calc(100vw - 24px);z-index:var(--ds-z-drawer)}
/* Отступ контента от края окна (01 §4.2, аудит 1716 F14): 24/20/16/12 по диапазонам. Раньше
   body держал panel.css `clamp(12px,3vw,36px)` — 36 px на 1440, 30.72 на 1024. Токен
   --ds-content-inset переопределяется по media прямо на body, чтобы владелец был один. */
body[data-design="command-core"]{padding:20px var(--ds-content-inset)}
/* значения, а не переопределение токена: html[data-theme="light"] body[...] в design-tokens.css
   объявляет --ds-content-inset:24px с большей специфичностью и перебил бы media-токен на body */
@media(max-width:1279px){body[data-design="command-core"]{padding-inline:20px}}
@media(max-width:1023px){body[data-design="command-core"]{padding-inline:16px}}
@media(max-width:768px){
  body[data-design="command-core"]{padding:10px 12px 24px}
  /* Кнопки шапки на тач-экране ≥44×44 (01 §4.2, аудит 1716 F13): бургер, тема, движение,
     обновление, колокольчик, аккаунт сидели на десктопных 36 px. */
  body[data-design="command-core"] header .refresh,
  body[data-design="command-core"] header button,
  body[data-design="command-core"] #mobNavBtn{min-width:var(--ds-control-h-touch);min-height:var(--ds-control-h-touch);height:auto;display:inline-flex;align-items:center;justify-content:center}
}
/* Свёрнутый sidebar — компактная полоса 64 px с иконками (01 §5.2, аудит 1716 F14), а не
   display:none. Только desktop: на ≤768 sidebar — мобильная шторка (mobile.css), а nav-autohide
   (домен с одной вкладкой) по-прежнему прячет его целиком. Подписи пунктов остаются в
   доступном дереве (клавиатура, скринридер), визуально скрыты; секции — разделителем. */
@media(min-width:769px){
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-side{display:block;width:var(--ds-sidebar-w-collapsed);overflow-x:hidden}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-sec{margin-bottom:6px;padding-top:6px;border-top:1px solid var(--ds-line)}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-sec:first-child{border-top:0;padding-top:0}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-sec-h,
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-grip,
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) #navSideExtension,
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-editbar,
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-item.active::after{display:none}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-sec.collapsed .nav-item{display:flex}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-item{position:relative;justify-content:center;gap:0;padding:10px 0}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-item .tab-ico{width:20px;height:20px;flex:0 0 20px}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-item > span:not(.nav-badge){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  body[data-design="command-core"] .nav-shell.nav-collapsed:not(.nav-autohide) .nav-item .nav-badge{position:absolute;top:2px;right:3px;margin:0;font-size:10px;line-height:14px;padding:0 4px}
}
/* === /Neon shell ==================================================================== */

body[data-design="command-core"] #tcBellBtn{position:relative}
/* Колокольчик поднимается над содержимым ТОЛЬКО пока раскрыт его список. Безусловный
   z-index:1400 держал кнопку выше любой модалки и дровера (1100–1250): открытая задача,
   подтверждение, ввод — сквозь них торчал 🔔 (разбор вкладки CRM 14.08.2026). Класс
   tc-bell-open вешает teamchat-widget на <header> ровно на время раскрытого списка. */
body[data-design="command-core"] #tcBellWrap{position:relative}
body[data-design="command-core"] header.tc-bell-open #tcBellWrap{z-index:1400}
body[data-design="command-core"] #tcBellDrop{
  color:var(--ds-text);background:var(--ds-surface-raised);border-color:var(--ds-line-strong);
  box-shadow:0 18px 52px var(--ds-shadow);
}
body[data-design="command-core"] .user-menu{color:var(--ds-muted)}
body[data-design="command-core"] .acct-drop{
  border-color:var(--ds-line-strong);box-shadow:0 18px 52px var(--ds-shadow);
}
body[data-design="command-core"] .acct-drop a,body[data-design="command-core"] .acct-drop .acct-logout button{color:var(--ds-text)}
body[data-design="command-core"] .acct-ava{background:var(--ds-indigo);color:var(--ds-on-accent)}
body[data-design="command-core"] .proj-stripe{
  height:3px;border-radius:2px;margin:0 var(--ds-shell-topbar-inline-inset) 6px;
  background:var(--proj-stripe, var(--proj-tint));
}
/* Режим одного кабинета: тон разливается по рамке — кромка и подложка, без заливок.
   При нескольких выбранных проектах правила не применяются вовсе (data-proj-mode="multi"). */
body[data-design="command-core"][data-proj-mode="single"] .nav-topbar{
  border-color:var(--proj-tint-line);
  background:color-mix(in srgb, var(--proj-tint-soft) 60%, transparent);
}
body[data-design="command-core"][data-proj-mode="single"] .nav-side{
  border-color:var(--proj-tint-line);
}
/* Общего класса .kicker в разметке нет: у каждого модуля свой префиксованный класс
   (supd-/wbc-/ozc-/adv-command-/rpb-kicker) — поэтому список селекторов, а не .kicker.
   Гард tests/_misc/test_project_tint_shell.py::test_every_kicker_class_is_covered_by_the_single_mode_tint
   сканирует app/static/js, app/static/css и app/templates на новые *-kicker и валит
   сьют, если появившийся класс забыли добавить сюда либо перебить по специфичности
   каждое конкурирующее правило, задающее ему color. Специфичность двух атрибутов на
   body перебивает .adv-command-kicker{color:var(--ds-cyan)} ниже по каскаду — только
   в режиме single; в multi правило не применяется, и прежний цвет возвращается сам.*/
body[data-design="command-core"][data-proj-mode="single"] .supd-kicker,
body[data-design="command-core"][data-proj-mode="single"] .wbc-kicker,
body[data-design="command-core"][data-proj-mode="single"] .ozc-kicker,
body[data-design="command-core"][data-proj-mode="single"] .adv-command-kicker,
body[data-design="command-core"][data-proj-mode="single"] .rpb-kicker,
body[data-design="command-core"][data-proj-mode="single"] .vpn-kicker,
body[data-design="command-core"][data-proj-mode="single"] .ff-kicker,
body[data-design="command-core"][data-proj-mode="single"] .ffi-kicker,
body[data-design="command-core"][data-proj-mode="single"] .ffo-kicker,
body[data-design="command-core"][data-proj-mode="single"] .mpa-kicker,
body[data-design="command-core"][data-proj-mode="single"] .trainmod-kicker,
body[data-design="command-core"][data-proj-mode="single"] .ds-kicker,
body[data-design="command-core"][data-proj-mode="single"] .agb-kicker,
body[data-design="command-core"][data-proj-mode="single"] .agb-brain-kicker{
  color:var(--proj-tint-ink);
}
/* Светлая тема имеет свой конкурирующий цвет для этого kicker'а
   (html[data-theme="light"] body… .adv-command-kicker{color:var(--ds-blue)} ниже по
   файлу): у него специфичность (0,3,2) — 2 типа селектора (html,body) против 1 у общего
   правила выше (0,3,1), поэтому в светлой теме он победил бы каскад без этой строки.
   Правило по той же идиоме, которой уже пользуется конкурент, а не !important. */
html[data-theme="light"] body[data-design="command-core"][data-proj-mode="single"] .adv-command-kicker{
  color:var(--proj-tint-ink);
}
body[data-design="command-core"] .nav-editbtn.on{
  color:#fff;border-color:var(--ds-cyan);
  background:linear-gradient(110deg,var(--ds-indigo),var(--ds-blue));
  box-shadow:0 0 18px color-mix(in srgb,var(--ds-indigo) 32%,transparent);
}
body[data-design="command-core"] .nav-item.edit{
  cursor:grab;border-style:dashed;border-color:var(--ds-line-strong);
  background:color-mix(in srgb,var(--ds-surface-soft) 72%,transparent);
}
body[data-design="command-core"] .nav-item.edit:hover{
  color:var(--ds-text);border-color:var(--ds-cyan);
  background:color-mix(in srgb,var(--ds-cyan) 10%,var(--ds-surface-raised));
}
body[data-design="command-core"] .nav-item.dragging{
  opacity:.45;border-color:var(--ds-amber);background:var(--ds-surface-soft);
}
body[data-design="command-core"] .nav-sec.edit{
  border-style:dashed;border-color:var(--ds-line-strong);
  background:color-mix(in srgb,var(--ds-surface-soft) 60%,transparent);
}
body[data-design="command-core"] .nav-sec.drop{
  border-color:var(--ds-cyan);
  background:color-mix(in srgb,var(--ds-cyan) 12%,var(--ds-surface-raised));
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ds-cyan) 28%,transparent);
}
body[data-design="command-core"] .nav-dom.drop{
  outline:2px dashed var(--ds-cyan);outline-offset:2px;
  color:var(--ds-text);background:color-mix(in srgb,var(--ds-cyan) 14%,var(--ds-surface));
}

/* Dynamic notifications, chats, tasks, and assistant surfaces. */
body[data-design="command-core"] #tcBellDrop,
body[data-design="command-core"] .tc-drawer,
body[data-design="command-core"] .tct-modal,
body[data-design="command-core"] .tct-card,
body[data-design="command-core"] .ai-panel{
  color:var(--ds-text);background:var(--ds-surface-raised);
  border-color:var(--ds-line-strong);box-shadow:0 22px 65px var(--ds-shadow);
}
body[data-design="command-core"] .tc-msg,
body[data-design="command-core"] .chat-msg,
body[data-design="command-core"] .ai-msg-bot{
  color:var(--ds-text);background:var(--ds-surface-soft);border-color:var(--ds-line);
}
body[data-design="command-core"] .tc-msg.mine,
body[data-design="command-core"] .ai-msg-user{
  color:var(--ds-text);
  background:linear-gradient(135deg,color-mix(in srgb,var(--ds-cyan) 16%,var(--ds-surface)),color-mix(in srgb,var(--ds-indigo) 15%,var(--ds-surface)));
  border-color:color-mix(in srgb,var(--ds-cyan) 32%,var(--ds-line));
}
body[data-design="command-core"] .tc-comp,
body[data-design="command-core"] .chat-confirm{border-color:var(--ds-line);background:var(--ds-surface)}
body[data-design="command-core"] .tc-inp,
body[data-design="command-core"] .tct-inp,
body[data-design="command-core"] .tct-sel{
  color:var(--ds-text);background:var(--ds-surface-soft);border-color:var(--ds-line);
}
body[data-design="command-core"] .tct-pill{box-shadow:inset 0 0 0 1px color-mix(in srgb,currentColor 22%,transparent)}
body[data-design="command-core"] .chat-card,
body[data-design="command-core"] .chat-thread{
  color:var(--ds-text);background:var(--ds-surface);border-color:var(--ds-line);
}
body[data-design="command-core"] .ai-fab{
  color:var(--ds-canvas);background:linear-gradient(135deg,var(--ds-cyan),var(--ds-indigo));
  box-shadow:0 10px 32px color-mix(in srgb,var(--ds-cyan) 24%,transparent);
}
/* Ореол дыхания в палитре Neon (задача 1724). До 22.09 кейфреймы `ai-fab-breathe` анимировали
   box-shadow, а анимация сильнее обычного объявления — циановое свечение строкой выше на
   экране не появлялось вовсе. Теперь дышит opacity ореола, а цвет берётся из токена. */
body[data-design="command-core"] .ai-fab::after{
  box-shadow:0 10px 32px 8px color-mix(in srgb,var(--ds-cyan) 30%,transparent);
}

body[data-design="command-core"] .adv-command{display:grid;gap:14px}
body[data-design="command-core"] .adv-command-hero{
  min-height:240px;display:grid;grid-template-columns:minmax(190px,.55fr) minmax(0,1.45fr);
  align-items:center;overflow:hidden;background:
  radial-gradient(circle at 20% 50%,color-mix(in srgb,var(--ds-cyan) 20%,transparent),transparent 31%),
  radial-gradient(circle at 72% 20%,color-mix(in srgb,var(--ds-indigo) 17%,transparent),transparent 38%),
  var(--ds-surface);
}
body[data-design="command-core"] .adv-core{
  width:170px;height:170px;margin:auto;position:relative;display:grid;place-items:center;
  border-radius:50%;color:var(--ds-text);
}
body[data-design="command-core"] .adv-core::before{
  content:"";position:absolute;inset:48px;border-radius:50%;
  background:radial-gradient(circle,var(--ds-text) 0 8%,var(--ds-cyan) 26%,var(--ds-blue) 54%,transparent 70%);
  box-shadow:0 0 28px var(--ds-cyan),0 0 70px color-mix(in srgb,var(--ds-indigo) 46%,transparent);
}
body[data-design="command-core"] .adv-core b{position:relative;color:var(--ds-canvas);font:800 17px ui-monospace,SFMono-Regular,Menlo,monospace}
body[data-design="command-core"] .adv-core-ring{position:absolute;border:1px solid color-mix(in srgb,var(--ds-cyan) 46%,transparent);border-radius:50%}
body[data-design="command-core"] .adv-core-ring--one{inset:20px;border-style:dashed}
body[data-design="command-core"] .adv-core-ring--two{inset:36px;border-color:color-mix(in srgb,var(--ds-indigo) 54%,transparent)}
body[data-design="command-core"] .adv-command-copy h2{margin:5px 0;font-size:clamp(24px,3vw,42px)}
body[data-design="command-core"] .adv-command-kicker{color:var(--ds-cyan);font-size:10px;letter-spacing:.16em;text-transform:uppercase}
html[data-theme="light"] body[data-design="command-core"] .adv-command-kicker{color:var(--ds-blue)}
body[data-design="command-core"] .adv-kpi-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px}
body[data-design="command-core"] .adv-kpi,
body[data-design="command-core"] .adv-rec{background:var(--ds-surface);border:1px solid var(--ds-line);border-radius:var(--ds-radius)}
@media(max-width:960px){
  body[data-design="command-core"] .adv-command-hero{grid-template-columns:1fr}
  body[data-design="command-core"] .adv-kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}


/* Marketplace, finance, procurement, promotion, knowledge, HR, care, and robots. */
body[data-design="command-core"] :where(.rv-card,.pcard,.price-subtab,
.fd-w,.fin-piv,.payment-calendar,.proc-card-table-wrap,.proc-orders-tech,
.bdr,.rpx > .panel,.pos-card,.kb-card,.ig-card,.hr-stat,.hr-org-card,
.care-card,.kcard,.opop-card,.crm-card,.sal-card){
  color:var(--ds-text);border-color:var(--ds-line);
}
body[data-design="command-core"] :where(.rv-card,.pcard,.fd-w,.payment-calendar,
.proc-card-table-wrap,.bdr,.rpx > .panel,.pos-card,.kb-card,.ig-card,.hr-stat,
.hr-org-card,.care-card:not(.care-card--hero),.kcard,.opop-card,.crm-card,.sal-card){
  background:var(--ds-surface);
  box-shadow:0 10px 30px color-mix(in srgb,var(--ds-shadow) 42%,transparent);
}
body[data-design="command-core"] :where(.fin-piv,.proc-orders-tech,.hr-tab){
  background:var(--ds-surface);border:1px solid var(--ds-line);
  border-radius:var(--ds-radius);
}
body[data-design="command-core"] :where(.badge,.chip,.mini-chip,.eng-badge){
  color:var(--ds-text);background:var(--ds-surface-soft);border-color:var(--ds-line);
}

/* Module-aware rules outrank styles appended by Finance, Bider, and Positions. */
body[data-design="command-core"] .fd-w table{color:var(--ds-text)}
body[data-design="command-core"] .fd-w table th{
  color:var(--ds-muted);background:var(--ds-surface-raised);border-color:var(--ds-line);
}
body[data-design="command-core"] .fd-w table td{border-color:var(--ds-line)}

body[data-design="command-core"] .bdr input,
body[data-design="command-core"] .bdr select,
body[data-design="command-core"] .bdr textarea{
  color:var(--ds-text);background:var(--ds-surface-soft);border-color:var(--ds-line);
}
body[data-design="command-core"] .bdr,
body[data-design="command-core"] .bdr .bdr-body{
  color:var(--ds-text);background:var(--ds-surface);
}
body[data-design="command-core"] .bdr .bdr-top,
body[data-design="command-core"] .bdr .bdr-tabs,
body[data-design="command-core"] .bdr .bdr-logbar{
  background:var(--ds-surface-raised);border-color:var(--ds-line);
}
body[data-design="command-core"] .bdr .bdr-tab,
body[data-design="command-core"] .bdr .bdr-fbtn,
body[data-design="command-core"] .bdr .bdr-suggest,
body[data-design="command-core"] .bdr .bdr-card-desc,
body[data-design="command-core"] .bdr .bdr-newcamp{
  color:var(--ds-muted);background:var(--ds-surface-soft);border-color:var(--ds-line);
}
body[data-design="command-core"] .bdr .bdr-detail,
body[data-design="command-core"] .bdr .bdr-log,
body[data-design="command-core"] .bdr .bdr-chars td{
  border-color:var(--ds-line);
}
body[data-design="command-core"] .bdr .bdr-balance,
body[data-design="command-core"] .bdr h3{
  color:var(--ds-text);
}
body[data-design="command-core"] .bdr .bdr-log{
  color:var(--ds-semantic-green-text);background:var(--ds-semantic-green-bg);
  border-color:var(--ds-semantic-green-line);
}
body[data-design="command-core"] .bdr .mut,
body[data-design="command-core"] .bdr .bdr-stub,
body[data-design="command-core"] .bdr .bdr-card-desc,
body[data-design="command-core"] .bdr .price-old,
body[data-design="command-core"] .bdr .bdr-serp-rating,
body[data-design="command-core"] .bdr .bdr-serp-nm,
body[data-design="command-core"] .bdr .bdr-sugg .f{
  color:var(--ds-semantic-muted-text);
}
body[data-design="command-core"] .bdr .bdr-tab.on,
body[data-design="command-core"] .bdr .bdr-fbtn.on{
  color:var(--ds-semantic-active-text);background:var(--ds-semantic-active-bg);
  border-color:var(--ds-semantic-active-line);
}
body[data-design="command-core"] .bdr .bdr-sugg:hover,
body[data-design="command-core"] .bdr .bdr-sugg.on{
  color:var(--ds-semantic-active-text);background:var(--ds-semantic-active-bg);
}
body[data-design="command-core"] .bdr .bdr-sugg:hover .f,
body[data-design="command-core"] .bdr .bdr-sugg.on .f{
  color:var(--ds-semantic-active-text);
}
body[data-design="command-core"] .bdr .grn,
body[data-design="command-core"] .bdr .bdr-status-on{
  color:var(--ds-semantic-green-text);
}
body[data-design="command-core"] .bdr .org,
body[data-design="command-core"] .bdr .bdr-status-off,
body[data-design="command-core"] .bdr .spp-chip,
body[data-design="command-core"] .bdr .bdr-log .err{
  color:var(--ds-semantic-amber-text);
}
body[data-design="command-core"] .bdr .bdr-adchip{
  color:var(--ds-semantic-green-text);background:var(--ds-semantic-green-bg);
  border-color:var(--ds-semantic-green-line);
}
body[data-design="command-core"] .bdr .mag,
body[data-design="command-core"] .bdr th[data-sort]:hover,
body[data-design="command-core"] .bdr th.sort-on{
  color:var(--ds-semantic-active-text);
}
body[data-design="command-core"] .bdr .bdr-phrases{background:var(--ds-surface-soft)}
body[data-design="command-core"] .bdr th{
  color:var(--ds-muted);background:var(--ds-surface-raised);border-color:var(--ds-line);
}
body[data-design="command-core"] .bdr td{border-color:var(--ds-line)}
body[data-design="command-core"] .bdr tr.bdr-row:hover td{
  background:color-mix(in srgb,var(--ds-cyan) 8%,var(--ds-surface));
}
body[data-design="command-core"] .bdr tr.bdr-row.sel td{
  background:color-mix(in srgb,var(--ds-indigo) 30%,var(--ds-surface));
}
body[data-design="command-core"] .bdr-ctx{
  color:var(--ds-text);background:var(--ds-surface-raised);border-color:var(--ds-line-strong);
  box-shadow:0 16px 38px var(--ds-shadow);
}
body[data-design="command-core"] .bdr-ctx .mi:hover{
  color:var(--ds-on-accent);background:var(--ds-indigo);
}
body[data-design="command-core"] .bdr-ctx .sep{background:var(--ds-line)}

body[data-design="command-core"] .pos-mod .pos-card{
  color:var(--ds-text);background:var(--ds-surface);border-color:var(--ds-line);
  box-shadow:0 10px 30px color-mix(in srgb,var(--ds-shadow) 42%,transparent);
}
body[data-design="command-core"] .pos-mod :where(input,select){
  color:var(--ds-text);background:var(--ds-surface-soft);border-color:var(--ds-line);
}
body[data-design="command-core"] .pos-mod :where(.pos-seg,.pos-help,.pos-chip,.pos-stock){
  background:var(--ds-surface-soft);border-color:var(--ds-line);
}
body[data-design="command-core"] .pos-mod :where(.pos-pick-dd,.pos-seg button.on){
  color:var(--ds-text);background:var(--ds-surface-raised);border-color:var(--ds-line);
}
body[data-design="command-core"] .pos-mod thead th{
  color:var(--ds-muted);background:var(--ds-surface-raised);border-color:var(--ds-line);
}
body[data-design="command-core"] .pos-mod :where(th.pos-qh,td.pos-q){
  background:var(--ds-surface);
}
body[data-design="command-core"] .pos-mod tr.pos-qrow>td{
  background:var(--ds-surface-soft);
}
body[data-design="command-core"] .pos-mod .pos-top{
  color:var(--ds-semantic-green-text);background:var(--ds-semantic-green-bg);
  box-shadow:inset 0 0 0 1px var(--ds-semantic-green-line);
}
body[data-design="command-core"] .pos-mod .pos-good{
  color:var(--ds-semantic-cyan-text);background:var(--ds-semantic-cyan-bg);
  box-shadow:inset 0 0 0 1px var(--ds-semantic-cyan-line);
}
body[data-design="command-core"] .pos-mod .pos-mid{
  color:var(--ds-semantic-amber-text);background:var(--ds-semantic-amber-bg);
  box-shadow:inset 0 0 0 1px var(--ds-semantic-amber-line);
}
body[data-design="command-core"] .pos-mod .pos-ok{
  color:var(--ds-semantic-orange-text);background:var(--ds-semantic-orange-bg);
  box-shadow:inset 0 0 0 1px var(--ds-semantic-orange-line);
}
body[data-design="command-core"] .pos-mod .pos-bad{
  color:var(--ds-semantic-red-text);background:var(--ds-semantic-red-bg);
  box-shadow:inset 0 0 0 1px var(--ds-semantic-red-line);
}
body[data-design="command-core"] .pos-mod .pos-none{
  color:var(--ds-semantic-muted-text);background:var(--ds-semantic-muted-bg);
  box-shadow:inset 0 0 0 1px var(--ds-semantic-muted-line);
}
body[data-design="command-core"] .pos-mod .pos-stock.ok,
body[data-design="command-core"] .pos-mod .pos-badge-ok{
  color:var(--ds-semantic-green-text);background:var(--ds-semantic-green-bg);
  border:1px solid var(--ds-semantic-green-line);
}
body[data-design="command-core"] .pos-mod .pos-stock.zero,
body[data-design="command-core"] .pos-mod .pos-badge-bad{
  color:var(--ds-semantic-red-text);background:var(--ds-semantic-red-bg);
  border:1px solid var(--ds-semantic-red-line);
}
body[data-design="command-core"] .pos-mod .pos-badge-none,
body[data-design="command-core"] .pos-mod .pos-stock:not(.ok):not(.zero){
  color:var(--ds-semantic-muted-text);background:var(--ds-semantic-muted-bg);
  border:1px solid var(--ds-semantic-muted-line);
}
html[data-theme="light"] body[data-design="command-core"] .pos-mod .pos-stock.ok,
html[data-theme="light"] body[data-design="command-core"] .pos-mod .pos-badge-ok{
  color:var(--ds-semantic-green-text);background:var(--ds-semantic-green-bg);
  border-color:var(--ds-semantic-green-line);
}
html[data-theme="light"] body[data-design="command-core"] .pos-mod .pos-stock.zero,
html[data-theme="light"] body[data-design="command-core"] .pos-mod .pos-badge-bad{
  color:var(--ds-semantic-red-text);background:var(--ds-semantic-red-bg);
  border-color:var(--ds-semantic-red-line);
}

/* Payment Calendar carries an ID scope; match it without changing sticky layout. */
body[data-design="command-core"] #finCalendar .payment-calendar{
  color:var(--ds-text);border-color:var(--ds-line);
}
body[data-design="command-core"] #finCalendar .pc-shell{
  background:var(--ds-surface);
  box-shadow:0 10px 30px color-mix(in srgb,var(--ds-shadow) 42%,transparent);
}

@media(max-width:759px){
  body[data-design="command-core"] :where(.nav-shell,.nav-content,.dash){
    width:100%;min-width:0;max-width:100%;
  }
  body[data-design="command-core"] .dash .sv-row{
    grid-template-columns:minmax(0,1fr);width:100%;min-width:0;max-width:100%;
  }
  body[data-design="command-core"] .dash .sv-row > .panel{
    width:100%;min-width:0;max-width:100%;
  }
  body[data-design="command-core"] .nav-topbar{
    width:100%;max-width:100%;min-width:0;flex-wrap:wrap;
  }
  body[data-design="command-core"] .nav-domains{
    min-width:0;max-width:100%;flex:1 1 100%;overflow-x:auto;flex-wrap:nowrap;
    overscroll-behavior-inline:contain;scrollbar-width:thin;
  }
  body[data-design="command-core"] .nav-dom{
    flex:0 0 auto;
  }
  body[data-design="command-core"] :where(.dash .sv-pill,.nav-dom,.nav-collapse-btn,.nav-editbtn,.nav-cmdk){
    min-width:44px;min-height:44px;
  }
  body[data-design="command-core"] .mtg-cal{
    width:100%;min-width:0;max-width:100%;
    overflow-x:auto;overscroll-behavior-inline:contain;scrollbar-width:thin;
  }
  /* сетка календаря на узком экране не сжимается в кашу — колонки дней держат ширину,
     а горизонтально скроллится сам .mtg-cal */
  body[data-design="command-core"] :where(.mtg-head,.mtg-body){
    grid-template-columns:56px repeat(7,minmax(120px,1fr));
  }
  body[data-design="command-core"] :where(.care-shell,.care-head,.care-grid,.care-panel){
    width:100%;min-width:0;max-width:100%;
  }
  body[data-design="command-core"] .care-grid{
    grid-template-columns:minmax(0,1fr);
  }
  body[data-design="command-core"] .care-nav{
    width:100%;min-width:0;max-width:100%;overflow-x:auto;flex-wrap:nowrap;
    overscroll-behavior-inline:contain;scrollbar-width:thin;
  }
  body[data-design="command-core"] :where(.adv-command,.adv-command-hero,.adv-kpi-row,.adv-command > .panel){
    width:100%;min-width:0;max-width:100%;
  }
  body[data-design="command-core"] .adv-command-hero,
  body[data-design="command-core"] .adv-kpi-grid{
    grid-template-columns:minmax(0,1fr);
  }
  body[data-design="command-core"] :where(.adv-command-copy,.adv-head,.adv-toolbar,.adv-settings-grid){
    min-width:0;max-width:100%;
  }
  body[data-design="command-core"] .adv-table-wrap{
    max-width:100%;overflow-x:auto;
  }
  body[data-design="command-core"] :where(#advRunBtn,.adv-command .rv-send,.adv-command .rv-regen){
    min-width:44px;min-height:44px;
  }
  body[data-design="command-core"] .tcm-wrap{
    display:grid;grid-template-columns:minmax(0,1fr);
    width:100%;min-width:0;max-width:100%;
  }
  body[data-design="command-core"] :where(.tcm-left,.tcm-right){
    width:100%;min-width:0;max-width:100%;
  }
  body[data-design="command-core"] .tcm-empty{
    min-width:0;max-width:100%;padding-inline:12px;overflow-wrap:anywhere;text-align:center;
  }
}

/* Вход / смена пароля / приглашение партнёра (ТЗ 1711, 03 §3.2): форма ≤400px, обе темы */
body[data-design="command-core"].login-page{
  margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:16px;
  font:14px/20px var(--ds-font);
}
body[data-design="command-core"].login-page .box{
  width:100%;max-width:400px;padding:32px;border:1px solid var(--ds-line-strong);border-radius:var(--ds-radius-lg);
  color:var(--ds-text);background:var(--ds-surface);box-shadow:0 8px 24px var(--ds-shadow);
}
body[data-design="command-core"].login-page .brand{display:flex;align-items:center;gap:10px;margin-bottom:6px;text-decoration:none}
body[data-design="command-core"].login-page .brand-orbit{width:40px;height:40px}
body[data-design="command-core"].login-page h1.brand-name{font-size:23px;line-height:28px;font-weight:750;color:var(--ds-text);letter-spacing:-.3px;margin:0}
body[data-design="command-core"].login-page .sub{color:var(--ds-muted);font-size:13px;margin-bottom:22px}
body[data-design="command-core"].login-page label{display:block;color:var(--ds-muted);font-size:12px;line-height:18px;margin:14px 0 6px}
body[data-design="command-core"].login-page input{
  width:100%;height:var(--ds-field-h);padding:0 13px;font:inherit;font-size:16px;
  color:var(--ds-text);background:var(--ds-surface-soft);border:1px solid var(--ds-line-strong);border-radius:var(--ds-radius-sm);
}
body[data-design="command-core"].login-page input:focus-visible{outline:2px solid var(--ds-focus);outline-offset:2px;border-color:var(--ds-indigo)}
body[data-design="command-core"].login-page button[type="submit"]{
  width:100%;margin-top:22px;height:var(--ds-control-h-touch);border:1px solid var(--ds-edge-violet);border-radius:var(--ds-radius-sm);
  color:var(--ds-on-accent);background:linear-gradient(110deg,var(--ds-action-start),var(--ds-action-end));font:inherit;font-weight:600;cursor:pointer;
}
body[data-design="command-core"].login-page .err{
  color:var(--ds-semantic-red-text);background:var(--ds-semantic-red-bg);border:1px solid var(--ds-semantic-red-line);
  border-radius:var(--ds-radius-sm);padding:9px 12px;font-size:13px;margin-bottom:16px;
}
body[data-design="command-core"].login-page .pwd-wrap{position:relative}
body[data-design="command-core"].login-page .pwd-wrap input{padding-right:42px}
body[data-design="command-core"].login-page button.pwd-eye{
  position:absolute;right:5px;top:50%;width:32px;height:32px;margin:0;padding:0;transform:translateY(-50%);
  background:none;border:0;color:var(--ds-muted);font-size:15px;line-height:1;cursor:pointer;
}
body[data-design="command-core"].login-page button.pwd-eye:hover{color:var(--ds-text);transform:translateY(-50%)}

/* coverage:shell */
body[data-design="command-core"] :where(.nav-topbar,.nav-side,#tcBellDrop,.acct-drop){
  color:var(--ds-text);background:var(--ds-surface-raised);border-color:var(--ds-line);
}
/* header и .user-menu заливки не имеют — шапка прозрачная, цвет текста наследуется от body */
/* coverage:marketplace */
body[data-design="command-core"] :where(
  #paneMain,.rnp-grid,#paneRop,#paneTovary,#panePrices,#paneBundles,
  .rmn-cats,.cost-mod,.ozr-mod,#paneReviews,#paneSupplies,#paneAbtest,.ctr-form,
  #paneExcluded,#whBody,.anp-mod,.mpa-mod,.r2
){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:finance */
body[data-design="command-core"] :where(#paneFinance,.fbp-mod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:procurement */
body[data-design="command-core"] :where(#paneProcurement){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* panel.css:11-15/29-33 задаёт --proc-input-* своим хардкодом (hex/тени) в :root и
   html[data-theme="light"] — свой мини-контракт полей закупок в обход общих --ds-* токенов
   (ТЗ 1711, задача 1711, 01 §8). Переопределяем под Neon, чтобы .proc-card-project-select,
   .proc-order-toolbar и т.п. (div/label, не <input> — общее правило body[data-design=…]
   input,select,textarea их не ловит) сравнялись с остальными полями панели. */
body[data-design="command-core"]{
  --proc-input-bg:var(--ds-surface-soft);--proc-input-border:var(--ds-line-strong);
  --proc-input-placeholder:var(--ds-faint);--proc-input-shadow:none;--proc-control-height:var(--ds-field-h);
}
/* coverage:fulfillment — поверхность вкладки «Распределение грузов» (.ff-mod). Токены --ds-* сами
   меняются по теме, поэтому одного правила хватает и в тёмной, и в светлой. */
body[data-design="command-core"] :where(.ff-mod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:fulfillment — поверхность вкладки «Проверка счетов от ФФ» (.ffi-mod) */
body[data-design="command-core"] :where(.ffi-mod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:fulfillment — поверхность вкладки «ФБС → Заказы» (.ffo-mod, задача 2035); свои
   акценты экрана — токены --ffo-* в ff-orders.css */
body[data-design="command-core"] :where(.ffo-mod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:promotion */
body[data-design="command-core"] :where(.dbx,.rpx > .panel,.bdr,.pos-mod,.tst-mod){
  color:var(--ds-text);background:var(--ds-surface);border-color:var(--ds-line);
}
body[data-design="command-core"] .tst-mod{
  color:var(--ds-text);background:var(--ds-canvas);
}
body[data-design="command-core"] .tst-mod .tst-card{
  background:var(--ds-surface);border-color:var(--ds-line);
  box-shadow:0 10px 28px color-mix(in srgb,var(--ds-shadow) 58%,transparent);
}
body[data-design="command-core"] .tst-mod .tst-brow{
  background:var(--ds-surface-raised);border-color:var(--ds-line);
}
body[data-design="command-core"] .tst-mod :where(.tst-tabs,.tst-cap,.tst-grp,.rc-cell,.tst-bar2){
  background:var(--ds-surface-soft);border-color:var(--ds-line);
}
/* coverage:team */
body[data-design="command-core"] :where(#paneMyTasks,.ib-mod,.ns-mod,.tkm-top,.mtg-cal,.acad-wrap,.tcm-wrap){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:knowledge */
body[data-design="command-core"] :where(.kb-wrap){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:hr */
body[data-design="command-core"] :where(
  .hr-tab,.hr-vacrow,.hr-split,.hr-org-card,.dlang .proc-subtabs
){
  color:var(--ds-text);background:var(--ds-surface);border-color:var(--ds-line);
}
/* coverage:robots */
body[data-design="command-core"] :where(.dlang .kpi-row,.srvmon,.tga,.tgs,.cfx,.care-shell,.adv-command,.ag-mod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:assistant */
body[data-design="command-core"] :where(.pa-page,.pa-admin-page){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
body[data-design="command-core"] :where(.ai-panel){
  color:var(--ds-text);background:var(--ds-surface-raised);border-color:var(--ds-line-strong);
}
/* coverage:saas */
body[data-design="command-core"] :where(.sugg,.sclients,.vpnmod,.cabmod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:crm */
body[data-design="command-core"] :where(.crmmod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:train — «Роботы → Поезд интеграции»: поверхность вкладки. Одно правило на
   токенах покрывает обе темы (--ds-* сами меняются по теме) — отдельный блок под
   data-theme="light" не нужен и заводить его нельзя. */
body[data-design="command-core"] :where(.trainmod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:settings — домен «Настройки» (бывшая админка): поверхность вкладки-раздела и
   «Обзора». Одно правило на токенах покрывает обе темы. */
body[data-design="command-core"] :where(.settings-pane,.settings-overview){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:ozon-cabinet — поверхность вкладки «Аналитика Ozon» (.ozc-mod). Токены --ds-*
   сами меняются по теме, поэтому одного правила хватает и в тёмной, и в светлой. */
body[data-design="command-core"] :where(.ozc-mod){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:auth */
body[data-design="command-core"]:where(.login-page){
  color:var(--ds-text);background:var(--ds-canvas);border-color:var(--ds-line);
}
/* coverage:overlays */
body[data-design="command-core"] :where(.modal,.drawer,.popover,.dropdown,.toast){
  color:var(--ds-text);background:var(--ds-surface-raised);border-color:var(--ds-line-strong);
}
/* coverage:btn-utility — .btn-accent/.btn-danger/.btn-ok — общие утилитарные классы кнопок,
   стиль которых исторически инжектился ТОЛЬКО модулем rnp.js (#rnpCss) в первый его рендер.
   Другие модули (tg-announce.js и т.п.) заимствуют те же классы, и без RNP в сессии кнопка
   падала на UA-стиль (ButtonFace) — в тёмной теме светлый текст сливался с ним (задача 1711,
   Task 12). Копия ЗДЕСЬ побеждает копию rnp.js в теме Neon безусловно, по специфичности
   (0,2,1) у `body[data-design="command-core"] .btn-accent` против (0,1,0) у голого
   `.btn-accent` из #rnpCss — порядок вставки в DOM тут не участвует. Копия rnp.js не мертва:
   она обслуживает легаси-тему (`?design=legacy`), где `body[data-design="command-core"]`
   не совпадает и это правило не применяется вовсе. Значения намеренно идентичны rnp.js —
   тот же токен, тот же результат, чтобы обе темы не разъезжались визуально. */
body[data-design="command-core"] :where(.btn-accent,.btn-danger,.btn-ok){
  border:0;border-radius:9px;padding:7px 15px;cursor:pointer;font-size:12.5px;font-weight:600;
  color:var(--ds-on-accent);
}
body[data-design="command-core"] .btn-accent{background:var(--ds-indigo)}
body[data-design="command-core"] .btn-danger{background:var(--ds-coral)}
body[data-design="command-core"] .btn-ok{background:var(--ds-green)}
/* coverage:robots-status — «Требуют действий» (.rsb-go): голая кнопка/ссылка без своего CSS-файла
   красилась UA-стилем (ButtonFace, не меняется по теме) — в тёмной теме текст сливался с фоном
   (задача 1711, Task 12). */
body[data-design="command-core"] .rsb-go{
  display:inline-block;color:var(--ds-indigo);background:color-mix(in srgb,var(--ds-indigo) 10%,var(--ds-surface));
  border:1px solid color-mix(in srgb,var(--ds-indigo) 40%,var(--ds-line));border-radius:var(--ds-radius-pill);
  padding:4px 12px;font:inherit;font-size:12px;font-weight:600;text-decoration:none;cursor:pointer;
}

:where(body[data-design="command-core"] :is(button,[role="button"],a):not(:disabled):not([aria-disabled="true"]):hover){
  border-color:var(--ds-cyan);transform:translateY(-1px);
}
:where(body[data-design="command-core"] :is(button,[role="button"],a):not(:disabled):not([aria-disabled="true"]):active){
  filter:brightness(.96);transform:translateY(1px);
}
:where(body[data-design="command-core"] :is(button,input,select,textarea):disabled){
  cursor:not-allowed;opacity:.52;
}
:where(body[data-design="command-core"] .ui-toast-success),
:where(body[data-design="command-core"] .ui-toast-error){
  border-left-style:solid;border-left-width:4px;
}
:where(body[data-design="command-core"] .care-loading){
  cursor:progress;font-style:italic;
}
:where(body[data-design="command-core"] .care-empty){
  font-style:italic;
}

/* Уточнение в скобках при имени KPI-плашки («Выручка (продажи - возвраты)»):
   строчными и тише основного имени, чтобы подпись влезала в одну строку.
   Живёт здесь, а не в panel.css: тот упёрся в потолок test_file_size_ratchet. */
.card .label .label-note{ text-transform:none;font-weight:400;font-size:11px;letter-spacing:0;opacity:.75; }

/* Блок «Подписки» вкладки «Агенты» (задача 1448). Живёт здесь, а не в panel.css:
   тот упёрся в потолок test_file_size_ratchet. Цвета — только токены (трещотка
   test_inline_hex_ratchet_static), состояния берут общие пилюли .st.ok/.warn/.crit. */
.ag-acc .ag-acc-h{ margin:0 0 8px; }
.ag-acc .ag-acc-tbl{ width:100%;border-collapse:collapse;margin-top:10px; }
.ag-acc .ag-acc-tbl th{ text-align:center;font-size:12px;font-weight:600;opacity:.7;
  padding:4px 8px;border-bottom:1px solid var(--border); }
.ag-acc .ag-acc-tbl td{ padding:6px 8px;border-bottom:1px solid var(--border);
  text-align:center;vertical-align:middle; }
.ag-acc .ag-acc-lanes{ display:flex;flex-wrap:wrap;gap:12px;margin-top:12px; }
.ag-acc .ag-acc-lane{ display:flex;flex-direction:column;gap:4px;font-size:12.5px;
  color:var(--muted); }
.ag-acc .ag-acc-help{ margin-top:12px; }
.ag-acc .ag-acc-help summary{ cursor:pointer;font-weight:600;font-size:13px; }
.ag-acc .ag-acc-cmd{ margin:8px 0;padding:10px;border:1px solid var(--border);
  border-radius:8px;background:var(--card);color:var(--text);font-size:12px;
  white-space:pre-wrap;overflow-x:auto; }

/* Лимиты и мастер входа (задача 5 спеки 2026-09-23-agent-subs-ui) — тот же принцип: цвета
   только токенами, состояние ячейки лимита несут общие пилюли .st.ok/.warn/.crit. */
.ag-acc .ag-acc-refresh{ display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px; }
.ag-acc-wiz-box:empty{ display:none; }
.ag-acc-wiz{ margin-top:12px;padding:12px;border:1px solid var(--border);border-radius:8px;
  background:var(--card);max-width:420px; }
.ag-acc-wiz-devcode{ font-family:monospace;font-size:26px;font-weight:700;letter-spacing:2px;
  text-align:center;margin:10px 0; }

/* Живая ссылка в пользовательском тексте (uiRichText, ui.js; задача 1856): описание задачи,
   сообщения чата задачи. Длинный адрес без пробелов переносится, а не растягивает карточку.
   Дом — здесь, а не в panel.css: тот заморожен трещоткой размера файла. */
.ui-link { color:var(--accent); text-decoration:underline; overflow-wrap:anywhere; }
.ui-link:hover { text-decoration:none; }

/* ── Оболочка W5 (профиль 09): диалоги uiConfirm/uiPrompt, тост-ошибка, «Нет доступа» ──
   Разметка — ui.js::buildDialog и nav-shell.js::_showDenied. Только токены; запасное значение
   после запятой — легаси-переменная той же роли для ?design=legacy (там --ds-* нет). */
.ui-dialog-scrim{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:16px;
  background:var(--ds-overlay,var(--overlay))}
.ui-dialog{width:min(440px,100%);max-height:calc(100dvh - 32px);overflow:auto;overscroll-behavior:contain;
  background:var(--ds-surface-raised,var(--card));color:var(--ds-text,var(--text));
  border:1px solid var(--ds-line-strong,var(--border));border-radius:var(--ds-radius,12px);padding:20px 22px;
  box-shadow:0 18px 48px var(--ds-shadow,var(--shadow))}
.ui-dialog:focus{outline:none}
.ui-dialog-text{margin:0 0 16px;font-size:14.5px;line-height:1.45;overflow-wrap:anywhere}
.ui-dialog-input{display:block;width:100%;margin:0 0 16px}
.ui-dialog-acts{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-end}
@media (pointer:coarse){.ui-dialog .btn{min-height:var(--ds-control-h-touch,44px)}}
body[data-design="command-core"] .ui-dialog{animation:dsPanelIn var(--ds-motion-panel) var(--ds-ease-enter) 1}
/* тост-ошибка не уходит сам — закрывается кликом или «×» (ui.js::uiToast) */
.ui-toast-x{flex:none;margin-left:4px;width:28px;height:28px;border-radius:8px;border:1px solid var(--ds-line,var(--border));
  background:transparent;color:inherit;font-size:17px;line-height:1;cursor:pointer}
.ui-toast .ui-toast-t{overflow-wrap:anywhere}
@media (pointer:coarse){.ui-toast-x{width:40px;height:40px}}
/* прямая ссылка на недоступный экран: панели прячутся, адрес остаётся тем, по которому пришли */
.nav-content.is-denied > :not(#navDenied){display:none!important}
#navDenied{max-width:760px;padding:4px 0 28px}
#navDenied[hidden]{display:none}
#navDenied:focus{outline:none}
#navDenied .nav-denied-acts{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}
@media (pointer:coarse){#navDenied .nav-denied-acts .btn{min-height:var(--ds-control-h-touch,44px)}}
/* стек тостов: ширина по содержимому, а не половина окна (left:50% ужимал плашку до ~160 px на телефоне) */
#uiToasts{width:max-content;max-width:min(520px,calc(100vw - 24px))}
.ui-toast{max-width:100%}
