/* ============================================================
   МДКФ 2026 — дизайн-система (референс СИБУР: teal + Golos Text),
   минималистичная: тонкие линии, спокойные тени, чистая типографика.
   Масштаб компактный (плотнее, мельче — по всей системе).
   ============================================================ */
:root{
  /* нейтрали с лёгким тёплым-зелёным подтоном */
  --bg:#f5f7f7; --surface:#ffffff; --surface-2:#eef2f2; --surface-3:#e5eaea;
  --th-bg:#d6ebe8; --th-active:#bfe1db;   /* фон шапок таблиц и активного (сортируемого) столбца */
  --ink:#18201f; --ink-2:#5a6663; --ink-3:#8b9693;
  --line:#e6ebea; --line-2:#d6dddb;
  /* акцент — teal */
  --accent:#0f8b83; --accent-2:#0c6f68; --accent-soft:#e2f1ef; --on-accent:#ffffff;
  /* семантика */
  --good:#1f9d57; --good-soft:#e5f4ea; --warn:#b07514; --warn-soft:#f6ecd6;
  --crit:#cc463a; --crit-soft:#f8e4e1;
  /* Чернила семантики: сами --crit/--warn/--good на белом дают 3.5–4.3:1 и не
     дотягивают до AA для мелкого текста. Для КНОПОК берём затемнённые. */
  --crit-ink:#b23a2f; --warn-ink:#8f5d0f; --good-ink:#157a41;
  --radius:10px; --radius-sm:8px;
  --shadow:0 1px 2px rgba(20,40,38,.04), 0 4px 16px rgba(20,40,38,.05);
  --shadow-lg:0 12px 40px rgba(16,32,30,.16);
  --sans:'Golos Text',system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
  --mono:ui-monospace,"Cascadia Code",Consolas,monospace;
  /* motion: единые длительности (120–320мс) и easing */
  --dur-press:80ms;      /* тактильный отклик нажатия */
  --dur-1:120ms;         /* дом-база: hover / focus / цвет */
  --dur-2:200ms;         /* панели, поповеры, тосты, контейнеры */
  --dur-3:280ms;         /* входы модалок / крупных карточек */
  --ease:cubic-bezier(.2,.6,.2,1);            /* общий, чуть ускоренный */
  --ease-out:cubic-bezier(.16,1,.3,1);        /* мягкое торможение на входах */
  --ease-spring:cubic-bezier(.34,1.56,.64,1); /* лёгкий overshoot для «прилипаний»/pop */
}
*{box-sizing:border-box}
/* [hidden] в браузере задан без !important, поэтому любой наш display его перебивает:
   у .btn это display:inline-flex — и кнопка «✏ Редактировать» в Списках висела всегда */
[hidden]{display:none!important}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:12.5px;line-height:1.5;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;letter-spacing:-.005em}
a{color:var(--accent);text-decoration:none}
a:hover{color:var(--accent-2)}
::selection{background:var(--accent-soft)}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
h1,h2,h3,h4{letter-spacing:-.02em;font-weight:600}

/* аккуратные чекбоксы (единый вид везде) — SVG-галка, всегда ровно по центру */
input[type="checkbox"]{appearance:none;-webkit-appearance:none;box-sizing:border-box;margin:0;
  width:16px;height:16px;flex:0 0 auto;border:1.5px solid var(--line-2);border-radius:5px;
  background:var(--surface) center/100% no-repeat;cursor:pointer;vertical-align:-3px;
  transition:background-color .12s,border-color .12s}
input[type="checkbox"]:hover{border-color:var(--accent)}
input[type="checkbox"]:checked{background-color:var(--accent);border-color:var(--accent);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 8.6l2.7 2.7L12 5'/%3E%3C/svg%3E")}
input[type="checkbox"]:indeterminate{background-color:var(--accent);border-color:var(--accent);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M4 8h8'/%3E%3C/svg%3E")}
input[type="checkbox"]:focus-visible{outline:none;box-shadow:0 0 0 3px var(--accent-soft)}
input[type="checkbox"]:disabled{opacity:.5;cursor:default}
/* строка «чекбокс + подпись» */
label.check{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:12px;color:var(--ink);margin:0}

/* ---------- топбар ---------- */
.topbar{display:flex;align-items:center;gap:7px;background:var(--surface);border-bottom:1px solid var(--line);
  padding:0 16px;height:48px;position:sticky;top:0;z-index:20}
/* бренд: логотип форума + год. Логотип цветной и сам себе знак, поэтому
   квадратной плашки рядом с ним нет; на узком экране логотип уступает место
   меню и подменяется коротким текстовым брендом */
.topbar .brand{display:flex;align-items:center;gap:9px;font-weight:600;font-size:13px;
  letter-spacing:-.02em;padding-right:10px;margin-right:2px;color:var(--ink);
  border-right:1px solid var(--line);flex:0 0 auto}
.topbar .brand:hover{color:var(--ink)}
.topbar .brand img{height:24px;width:auto;display:block}
.topbar .brand .brand-txt{display:none;align-items:center;gap:8px}
.topbar .brand .mark{width:22px;height:22px;border-radius:7px;background:linear-gradient(135deg,var(--accent),var(--accent-2));
  display:flex;align-items:center;justify-content:center;color:#fff;font-size:10px;font-weight:700;flex:0 0 auto}
.topbar .brand .yr{font:600 11px/1 var(--mono);letter-spacing:.02em;color:var(--accent-2);
  background:var(--accent-soft);border-radius:20px;padding:4px 8px;flex:0 0 auto}
@media (max-width:1180px){.topbar .brand img{height:21px}}
@media (max-width:860px){
  .topbar .brand img{display:none}
  .topbar .brand .brand-txt{display:flex;color:var(--ink)}
}
.topbar nav{display:flex;gap:2px;flex:1;margin-left:5px;overflow-x:auto;scrollbar-width:none}
.topbar nav::-webkit-scrollbar{display:none}
.topbar nav a{display:inline-flex;align-items:center;gap:6px;padding:7px 10px;border-radius:8px;color:var(--ink-2);
  font-weight:500;font-size:12px;white-space:nowrap;transition:background .12s,color .12s}
.topbar nav a svg{width:15px;height:15px;opacity:.85}
.topbar nav a:hover{background:var(--surface-2);color:var(--ink)}
.topbar nav a.active{background:var(--accent-soft);color:var(--accent-2)}
.topbar nav a.active svg{opacity:1}
.topbar .right{display:flex;align-items:center;gap:12px;font-size:11.5px;color:var(--ink-3);white-space:nowrap}
.topbar .right .who{color:var(--ink-2);font-weight:500}
.topbar .right a{color:var(--ink-3)}
.topbar .right a:hover{color:var(--crit)}
.tg-warn{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;
  background:var(--warn);color:#fff;font-size:10px;font-weight:700;vertical-align:1px}

main{max-width:none;margin:0;padding:18px 22px}
main>h2{font-size:17px;margin:0 0 13px}
.muted{color:var(--ink-3)}
.loading{color:var(--ink-3);padding:26px 4px;font-size:12px}

/* ---------- кнопки ---------- */
/* высота кнопки = 11px * 1.5 + 4px*2 + 2px рамки = 26.5px. Всё, что стоит с кнопкой
   в одной строке (поиск, селекты, кнопки таблицы), подогнано под эту же высоту —
   иначе панели разъезжаются по вертикали. min-width держит иконочные кнопки нажимаемыми. */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:4px 6px;
  border:1px solid var(--line-2);border-radius:8px;min-width:26px;
  background:var(--surface);cursor:pointer;font:inherit;font-size:11px;font-weight:500;color:var(--ink);
  transition:background .12s,border-color .12s,box-shadow .12s}
.btn:hover{background:var(--surface-2);border-color:var(--line-2)}
.btn:active{transform:translateY(.5px)}
.btn.primary{background:var(--accent);color:var(--on-accent);border-color:transparent;box-shadow:0 1px 2px rgba(15,139,131,.25)}
.btn.primary:hover{background:var(--accent-2)}
.btn:disabled{opacity:.5;cursor:default;transform:none}
/* Кнопка обязана говорить цветом, что она делает. Заливка — только у главного
   действия экрана: если залить и «Удалить», и «Скачать», получится светофор, и
   опасное перестанет читаться как опасное. Поэтому опасное, подтверждающее и
   предупреждающее — контуром, а заливаются они при наведении, когда выбор уже
   сделан. Выгрузка — тихий акцент: её жмут часто, но она ничего не меняет. */
.btn.danger{color:var(--crit-ink);border-color:#e9bdb7;background:var(--surface)}
.btn.danger:hover{background:var(--crit-ink);border-color:var(--crit-ink);color:#fff}
.btn.ok{color:var(--good-ink);border-color:#a9d9bd;background:var(--surface)}
.btn.ok:hover{background:var(--good-ink);border-color:var(--good-ink);color:#fff}
.btn.warn{color:var(--warn-ink);border-color:#e5cd9c;background:var(--surface)}
.btn.warn:hover{background:var(--warn-ink);border-color:var(--warn-ink);color:#fff}
/* Выгрузка — самая тихая из цветных: её жмут часто и она ничего не меняет,
   поэтому в покое без заливки, иначе тулбар с двумя выгрузками читается как
   два главных действия. */
.btn.export{color:var(--accent-2);border-color:#cbe4e1;background:var(--surface)}
.btn.export:hover{background:var(--accent-soft);border-color:#b6d8d4}
/* Состояние (вкл/выкл, режим, активный фильтр) — не действие: заливку primary
   ему отдавать нельзя, иначе экран остаётся без единственного акцента. */
.btn.on{background:var(--accent-soft);color:var(--accent-2);border-color:transparent}
.btn.on:hover{background:#d5eae7;border-color:transparent}
/* Тихая роль: иконочная кнопка без рамки — крестики на доске рейса */
.btn.quiet{border-color:transparent;background:transparent}
/* Опасное действие внутри строки таблицы — только цветом текста: рамка на
   каждой строке превратила бы таблицу в решётку. */
.dt-action.danger{border-color:transparent;background:transparent}
.dt-action.danger:hover{background:var(--crit);border-color:var(--crit)}

/* ---------- карточки-сводка ---------- */
.cards{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:16px}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:12px 15px;min-width:100px;
  box-shadow:var(--shadow)}
.card .n{font-size:22px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.03em;line-height:1.1}
.card .l{font-size:10.5px;color:var(--ink-3);margin-top:3px;letter-spacing:0}

/* ---------- пилюли/бейджи ---------- */
.pill{display:inline-block;font-size:9.5px;font-weight:600;padding:0 7px;border-radius:20px;border:1px solid transparent;
  letter-spacing:-.01em;line-height:1.3}
.k-novorossia,.k-prigranichye{background:var(--crit-soft);color:var(--crit)}
.k-foreign{background:var(--accent-soft);color:var(--accent-2)}
.k-satellite{background:var(--warn-soft);color:var(--warn)}
.k-moscow_dept{background:var(--surface-3);color:var(--ink-2)}
.k-regions_rf{background:var(--good-soft);color:var(--good)}

/* ============ Табличный движок ============ */
.dt-toolbar{display:flex;align-items:center;gap:8px;margin-bottom:9px;flex-wrap:wrap}
.dt-q{padding:4px 10px 4px 11px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);font:inherit;
  font-size:11.5px;min-width:200px;transition:border-color .12s,box-shadow .12s}
.dt-q:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.dt-groupbar{display:flex;align-items:center;gap:6px;flex:1;flex-wrap:wrap;min-height:26px}
.dt-hint{font-size:11px;color:var(--ink-3)}
.dt-chip{display:inline-flex;align-items:center;gap:5px;background:var(--accent-soft);color:var(--accent-2);
  border-radius:16px;padding:2px 5px 2px 9px;font-size:11px;font-weight:600;cursor:pointer}
.dt-chip b{cursor:pointer;opacity:.6;font-size:11px;padding:0 3px}.dt-chip:hover b{opacity:1}
.dt-info{display:flex;align-items:center;gap:10px;margin-left:auto}
.dt-count{font-size:11.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.dt-reset{padding:4px 8px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);cursor:pointer;
  font:inherit;font-size:11px;color:var(--ink-2)}
.dt-reset:hover{background:var(--surface-2);color:var(--ink)}

.dt-wrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);overflow:auto;
  max-height:calc(100vh - 190px);box-shadow:var(--shadow)}
table.dt{border-collapse:separate;border-spacing:0;width:100%;font-size:10.5px}
table.dt th,table.dt td{padding:1px 6px;line-height:1.2;border-bottom:1px solid var(--line);border-right:1px solid var(--line);
  white-space:nowrap;text-align:left}
table.dt th:last-child,table.dt td:last-child{border-right:none}
table.dt thead th{position:sticky;top:0;z-index:2;background:var(--th-bg);font-size:9px;color:var(--ink-2);
  font-weight:600;text-transform:uppercase;letter-spacing:.02em;border-bottom:1px solid var(--line-2);
  white-space:normal;vertical-align:middle;padding-top:3px;padding-bottom:3px;line-height:1.2}
table.dt th.dt-active{background:var(--th-active);box-shadow:inset 2px 0 0 var(--accent)}
/* шапка в два яруса: сверху — кнопки управления (группировка/фильтр), под ними —
   название столбца. Так имя не соседствует с кнопками и не обрезается «БИЛ…»/«ХАК…» */
.dt-th{display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-width:0;overflow:hidden}
table.dt th.ta-center .dt-th{align-items:center}
table.dt th.ta-right .dt-th{align-items:flex-end}
.dt-lbl{cursor:pointer;user-select:none;display:flex;align-items:center;gap:3px;min-width:0;max-width:100%;flex:0 1 auto}
.dt-lbl-t{min-width:0;white-space:normal;overflow-wrap:break-word;hyphens:auto;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.dt-lbl:hover{color:var(--ink)}
.dt-sort{color:var(--accent);font-size:10px;flex:0 0 auto}.dt-sort sup{font-size:8px}
/* Кнопки группировки/фильтра над столбцами: видимы всегда (не только на ховере),
   крупнее и как отдельные «чипы»; активный фильтр — сплошным акцентом, чтобы менеджер
   сразу видел, что срез отфильтрован. Раньше opacity:.32 делала их почти невидимыми. */
.dt-acts{display:flex;gap:2px;flex:0 0 auto;opacity:.6;transition:opacity .12s}
table.dt th:hover .dt-acts,table.dt th.dt-active .dt-acts{opacity:1}
.dt-btn{border:none;background:var(--surface-2);cursor:pointer;color:var(--ink-2);font-size:12.5px;padding:3px 7px;border-radius:6px;line-height:1}
.dt-btn:hover{background:var(--surface-3);color:var(--ink)}
.dt-btn.on{color:#fff;background:var(--accent);opacity:1}
.dt-fil.on,.dt-grp.on{box-shadow:0 0 0 2px var(--accent-soft)}
table.dt tbody tr:hover{background:var(--surface-2)}
/* выбывшие — красная строка (видны только при включённом тоггле «показать выбывших») */
/* Заменённый: остаётся в списке, но зачёркнут и в подсчёты не идёт.
   Отличается от выбывшего — того сняли, а этого кто-то заменил. */
table.dt tbody tr.dt-replaced>td{background:#f4f1fb;color:#5b4a86;text-decoration:line-through;
  text-decoration-color:rgba(91,74,134,.55)}
table.dt tbody tr.dt-replaced:hover>td{background:#ece7f7}
table.dt tbody tr.dt-replaced .pill{text-decoration:none}
table.dt tbody tr.dt-withdrawn>td{background:#fdeaea;color:#9a1414}
table.dt tbody tr.dt-withdrawn:hover>td{background:#fbdcdc}
table.dt tbody tr.dt-withdrawn .nm-ru,table.dt tbody tr.dt-withdrawn .muted{color:#b46a6a}
table.dt td.ta-right,table.dt th.ta-right{text-align:right;font-variant-numeric:tabular-nums}
table.dt td.ta-center,table.dt th.ta-center{text-align:center}
.dt-empty{color:var(--ink-3);padding:22px;text-align:center;font-size:12px}
/* распорки виртуализации (пустые строки, держат высоту скролла) */
tr.dt-spacer td{padding:0;border:none;background:transparent}
tr.dt-spacer:hover>td{background:transparent}

/* Строка группы выше строк данных намеренно: она делит таблицу на части, и при
   одинаковой с ними высоте (padding 1px) глазом не находится. Высоту даёт только
   padding — line-height тут бесполезен, высоту держит плашка со счётчиком.
   Высота обязана быть ОДИНАКОВОЙ у всех уровней: виртуализация меряет её один
   раз по первой строке группы (table.js), и разные уровни разъехались бы. */
tr.dt-group>td{background:var(--surface-2);font-weight:600;cursor:pointer;border-bottom:1px solid var(--line-2);
  padding-top:6px;padding-bottom:6px;font-size:11.5px;box-shadow:inset 3px 0 0 var(--accent)}
tr.dt-group:hover>td{background:var(--surface-3)}
/* Название группировки липнет к левому краю: при прокрутке таблицы вправо
   группа остаётся видна. Фон наследуется от строки (совпадает и при :hover). */
.dt-ginner{position:sticky;left:0;z-index:1;display:inline-block;background-color:inherit;padding-right:8px}
.dt-caret{display:inline-block;width:13px;color:var(--ink-3)}
.dt-gcol{color:var(--ink-3);font-weight:500;font-size:11px}
.dt-gval{color:var(--ink)}
.dt-gcount{display:inline-block;margin-left:8px;background:var(--surface);border:1px solid var(--line);border-radius:12px;
  padding:1px 8px;font-size:10.5px;color:var(--ink-2);font-variant-numeric:tabular-nums}
tr.dt-lvl0>td{padding-left:10px} tr.dt-lvl1>td{padding-left:26px}
tr.dt-lvl2>td{padding-left:42px} tr.dt-lvl3>td{padding-left:58px}

.dt-panel{position:absolute;z-index:50;width:248px;background:var(--surface);border:1px solid var(--line-2);
  border-radius:12px;box-shadow:var(--shadow-lg);overflow:hidden}
.dt-panel-h{display:flex;align-items:center;gap:6px;padding:8px;border-bottom:1px solid var(--line)}
.dt-search{flex:1;min-width:0;padding:4px 9px;border:1px solid var(--line-2);border-radius:8px;font:inherit;font-size:11.5px}
.dt-search:focus{outline:none;border-color:var(--accent)}
.dt-panel-clear{flex:0 0 auto;border:1px solid var(--line-2);background:var(--surface-2);border-radius:8px;cursor:pointer;font-size:11px;padding:4px 10px;color:var(--ink-2);white-space:nowrap}
.dt-panel-clear:hover{background:var(--surface-3);color:var(--ink)}
.dt-panel-all{flex:0 0 auto;border:1px solid var(--line-2);background:var(--surface-2);
  border-radius:8px;cursor:pointer;font-size:11px;padding:4px 10px;color:var(--ink-2);
  white-space:nowrap}
.dt-panel-all:hover{background:var(--surface-3);color:var(--ink)}
/* Черта между отмеченными наверху и остальным списком. */
.dt-opts label.dt-osep{border-top:1px solid var(--line);margin-top:4px;padding-top:8px;
  border-radius:0 0 7px 7px}
.dt-opts{max-height:245px;overflow:auto;padding:5px}
.dt-opts label{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;cursor:pointer;font-size:11.5px}
.dt-opts label:hover{background:var(--surface-2)}
.dt-opts input[type=checkbox]{accent-color:var(--accent)}
.dt-oname{flex:1;overflow:hidden;text-overflow:ellipsis}
.dt-opts .dt-c{color:var(--ink-3);font-size:10px;font-variant-numeric:tabular-nums}

.dt-edit{width:100%;min-width:80px;border:1px solid transparent;background:transparent;font:inherit;
  padding:2px 6px;border-radius:7px;color:inherit}
.dt-edit:hover{border-color:var(--line-2);background:var(--bg)}
.dt-edit:focus{border-color:var(--accent);background:var(--surface);outline:none;box-shadow:0 0 0 3px var(--accent-soft)}
select.dt-edit{cursor:pointer}
.dt-action{padding:3px 9px;font-size:11px;border-radius:8px}

/* ресайз столбцов мышью (как в Google Sheets) — только для таблиц с tableId */
table.dt.dt-fixed{table-layout:fixed}
table.dt.dt-fixed th,table.dt.dt-fixed td{overflow:hidden}
table.dt.dt-fixed td{text-overflow:ellipsis}
.dt-resizer{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize;z-index:4;user-select:none}
.dt-resizer:hover{background:var(--accent);opacity:.5}
body.dt-resizing,body.dt-resizing *{cursor:col-resize!important;user-select:none!important}
/* кнопка и панель многоуровневой сортировки */
.dt-sortbtn{padding:4px 8px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);cursor:pointer;
  font-size:11px;color:var(--ink-2);white-space:nowrap}
.dt-sortbtn:hover{background:var(--surface-2);color:var(--ink)}
.dt-sortbtn.on{background:var(--accent-soft);color:var(--accent-2);border-color:transparent}
.dt-colsbtn{padding:4px 8px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);cursor:pointer;
  font-size:11px;color:var(--ink-2);white-space:nowrap}
.dt-colsbtn:hover{background:var(--surface-2);color:var(--ink)}
.dt-colsbtn.on{background:var(--accent-soft);color:var(--accent-2);border-color:transparent}
.dt-exportbtn{padding:4px 8px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);cursor:pointer;
  font-size:11px;color:var(--ink-2);white-space:nowrap}
.dt-exportbtn:hover{background:var(--surface-2);color:var(--ink)}
.dt-exportbtn:disabled{opacity:.5;cursor:default}
.dt-colspanel{min-width:220px;max-width:280px}
.dt-colspanel .dt-opts{max-height:min(50vh,360px)}
.dt-colopt{display:flex;align-items:center;gap:7px;padding:4px 8px;font-size:12px;cursor:pointer}
.dt-colopt:hover{background:var(--surface-2)}
.dt-colopt.muted{opacity:.55;cursor:default}
.dt-colopt .dt-oname{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dt-panel.dt-sortpanel{width:334px}
.dt-sortlist{padding:6px 6px 2px}
.dt-sortrow{display:flex;align-items:center;gap:5px;padding:3px 2px}
.dt-sortnum{width:15px;flex:0 0 auto;text-align:center;color:var(--ink-3);font-size:11px;font-variant-numeric:tabular-nums}
.dt-sortcol{flex:1;min-width:0;padding:4px 7px;border:1px solid var(--line-2);border-radius:7px;font:inherit;font-size:11.5px;background:var(--surface);color:var(--ink)}
.dt-sortdir{flex:0 0 auto;border:1px solid var(--line-2);background:var(--surface);border-radius:7px;cursor:pointer;font-size:11px;padding:4px 6px;white-space:nowrap;color:var(--ink-2)}
.dt-sortdir:hover{background:var(--surface-2);color:var(--ink)}
.dt-sortup,.dt-sortdel{flex:0 0 auto;border:none;background:transparent;cursor:pointer;color:var(--ink-3);font-size:14px;line-height:1;padding:3px 5px;border-radius:6px}
.dt-sortup:hover,.dt-sortdel:hover{background:var(--surface-2);color:var(--ink)}
.dt-sortup:disabled{opacity:.3;cursor:default}
.dt-sortadd{padding:2px 6px 8px}
/* матрица услуг в списке */
.svc-yes{color:var(--accent);font-weight:700}

/* ---------- кастомный select (единый с полями) ---------- */
.cs{position:relative;display:inline-block;width:100%}
.cs-native{position:absolute!important;width:1px;height:1px;opacity:0;pointer-events:none;margin:0;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0)}
.cs-trigger{display:flex;align-items:center;gap:8px;width:100%;text-align:left;cursor:pointer;
  padding:5px 9px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);
  font:inherit;font-size:11.5px;color:var(--ink);line-height:1.3;transition:border-color .12s,box-shadow .12s}
.cs-trigger:hover{border-color:var(--accent)}
.cs-open .cs-trigger,.cs-trigger:focus-visible{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.cs-trigger:disabled{opacity:.55;cursor:default}
.cs-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cs-chev{flex:0 0 auto;color:var(--ink-3);transition:transform .12s}
.cs-open .cs-chev{transform:rotate(180deg)}
.cs-menu{position:fixed;z-index:400;background:var(--surface);border:1px solid var(--line-2);border-radius:9px;
  box-shadow:var(--shadow-lg);max-height:260px;overflow:auto;padding:4px}
.cs-option{padding:5px 9px;border-radius:7px;cursor:pointer;font-size:11.5px;white-space:nowrap;color:var(--ink)}
.cs-option.on{background:var(--surface-2)}
.cs-option.sel{color:var(--accent-2);font-weight:600}
.cs-option.on.sel,.cs-option:hover{background:var(--accent-soft);color:var(--accent-2)}
.cs-option.dis{opacity:.4;cursor:default}
.cs-option[hidden]{display:none}
/* Группа = категория делегаций. Заголовок липкий: при прокрутке 126 строк
   всегда видно, в какой категории ты сейчас находишься. */
.cs-group{position:sticky;top:0;z-index:1;background:var(--surface);padding:7px 9px 4px;
  font:600 10.5px/1 var(--disp);letter-spacing:.07em;text-transform:uppercase;
  color:var(--ink-3);border-bottom:1px solid var(--line)}
.cs-group[hidden]{display:none}
.cs-group + .cs-option{margin-top:2px}
/* подсказка справа в строке: к какой категории относится делегация */
.cs-option{display:flex;align-items:baseline;gap:10px}
.cs-otext{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
.cs-ohint{flex:0 0 auto;font-size:10.5px;color:var(--ink-3)}
.cs-option.on .cs-ohint,.cs-option:hover .cs-ohint{color:var(--accent-2);opacity:.8}
.cs-search{position:sticky;top:0;z-index:2;background:var(--surface);padding:4px 4px 6px;
  border-bottom:1px solid var(--line);margin-bottom:4px}
.cs-search input{width:100%;box-sizing:border-box;padding:7px 9px;border:1px solid var(--line-2);
  border-radius:8px;font:inherit;font-size:12px;background:var(--surface-2)}
.cs-search + .cs-group{top:38px}
.cs-inline{min-width:80px}
.cs-inline .cs-trigger{padding:3px 6px;border-color:transparent;background:transparent;border-radius:7px;font-size:11.5px}
.cs-inline .cs-trigger:hover{border-color:var(--line-2);background:var(--bg)}
.cs-inline.cs-open .cs-trigger{background:var(--surface);border-color:var(--accent)}

/* ---------- формы / вкладки ---------- */
.userform{display:flex;gap:7px;flex-wrap:wrap;align-items:center;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius);padding:12px;box-shadow:var(--shadow)}
.userform input:not([type=checkbox]):not([type=radio]),.userform select{padding:4px 9px;border:1px solid var(--line-2);border-radius:8px;font:inherit;font-size:11.5px;background:var(--surface)}
.userform input:not([type=checkbox]):not([type=radio]){min-width:170px}
.userform input:not([type=checkbox]):not([type=radio]):focus,.userform select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}

.tabs{display:flex;gap:2px;margin-bottom:13px;border-bottom:1px solid var(--line)}
.tabs button{border:none;background:transparent;padding:8px 13px;font:inherit;font-size:12px;font-weight:500;cursor:pointer;
  color:var(--ink-2);border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .12s}
.tabs button:hover{color:var(--ink)}
.tabs button.active{color:var(--accent-2);border-bottom-color:var(--accent);font-weight:600}

.upload{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px;max-width:560px;box-shadow:var(--shadow)}
.upload .row{display:flex;gap:10px;align-items:center;margin:10px 0}
.upload input:not([type=checkbox]):not([type=radio]),.upload select{padding:4px 9px;border:1px solid var(--line-2);border-radius:8px;font:inherit;font-size:11.5px;background:var(--surface)}
#importResult{margin-top:13px;font-size:12px}

/* ---------- логин / профиль ---------- */
.login{max-width:320px;margin:14vh auto;background:var(--surface);border:1px solid var(--line);border-radius:13px;
  padding:26px;box-shadow:var(--shadow)}
.login .brand-mark{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,var(--accent),var(--accent-2));
  display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;margin-bottom:13px}
.login h1{margin:0 0 4px;font-size:18px}
.login p{margin:0 0 16px;color:var(--ink-3);font-size:12px}
.login label{display:block;font-size:11.5px;color:var(--ink-2);margin:10px 0 4px;font-weight:500}
.login input:not([type=checkbox]):not([type=radio]){width:100%;padding:8px 11px;border:1px solid var(--line-2);border-radius:9px;font:inherit;background:var(--surface)}
.login input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.login .btn{width:100%;margin-top:16px;justify-content:center;padding:8px;font-size:12.5px}
.flash{background:var(--crit-soft);color:var(--crit);padding:8px 11px;border-radius:9px;font-size:11.5px;margin-bottom:10px}

/* ============ Задачи (канбан) ============ */
.tasks-head{display:flex;align-items:center;gap:8px;margin-bottom:13px}
.tasks-head .spacer{flex:1}
.board{display:flex;gap:11px;align-items:flex-start;overflow-x:auto;padding-bottom:10px;min-height:185px}
.tcol{background:var(--surface-2);border:1px solid var(--line);border-radius:12px;min-width:245px;max-width:262px;
  display:flex;flex-direction:column;max-height:calc(100vh - 175px)}
.tcol-head{display:flex;align-items:center;gap:8px;padding:10px 12px;font-weight:600;font-size:12px}
.tcol-dot{width:8px;height:8px;border-radius:3px;flex:0 0 auto}
.tcol-count{margin-left:auto;color:var(--ink-3);font-size:10.5px;background:var(--surface);border:1px solid var(--line);
  border-radius:10px;padding:1px 7px;font-variant-numeric:tabular-nums}
.tcol-body{padding:0 8px 8px;overflow-y:auto;flex:1;display:flex;flex-direction:column;gap:8px;min-height:40px}
.tcol-body.drop{outline:2px dashed var(--accent);outline-offset:-4px;border-radius:10px}
.tcard{background:var(--surface);border:1px solid var(--line);border-radius:9px;padding:9px 11px;cursor:pointer;
  box-shadow:var(--shadow);transition:border-color .12s,transform .06s}
.tcard:hover{border-color:var(--line-2)}
.tcard:active{transform:scale(.99)}
.tcard.dragging{opacity:.4}
.tcard .t-title{font-size:12px;font-weight:500;margin-bottom:6px;white-space:normal;line-height:1.4}
.tcard .t-meta{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--ink-3);flex-wrap:wrap}
.t-prio{font-size:10px;font-weight:600;padding:1px 7px;border-radius:20px}
.p-low{background:var(--surface-3);color:var(--ink-2)}
.p-normal{background:var(--accent-soft);color:var(--accent-2)}
.p-high{background:var(--warn-soft);color:var(--warn)}
.p-urgent{background:var(--crit-soft);color:var(--crit)}
.tcol-add{margin:0 8px 8px;padding:8px;text-align:center;color:var(--ink-3);cursor:pointer;font-size:11.5px;
  border:1px dashed var(--line-2);border-radius:9px;background:transparent}
.tcol-add:hover{color:var(--accent-2);border-color:var(--accent);background:var(--surface)}

/* гейт «нет Telegram» */
.tg-gate{max-width:440px;margin:6vh auto;text-align:center;background:var(--surface);border:1px solid var(--line);
  border-radius:13px;padding:28px 26px;box-shadow:var(--shadow)}
.tg-gate-i{font-size:34px;line-height:1}
.tg-gate h3{margin:12px 0 6px;font-size:16px}
.tg-gate p{margin:0 0 16px;color:var(--ink-3);font-size:12.5px}

/* ---------- модалки ---------- */
.modal{position:fixed;inset:0;background:rgba(16,32,30,.42);backdrop-filter:blur(2px);display:flex;align-items:flex-start;
  justify-content:center;z-index:200;padding:6vh 14px;animation:fade .12s ease}
@keyframes fade{from{opacity:0}to{opacity:1}}
.modal-box{background:var(--surface);border-radius:13px;box-shadow:var(--shadow-lg);width:100%;max-width:440px;
  max-height:86vh;overflow:auto}
.modal-box h3{margin:0;padding:15px 18px;border-bottom:1px solid var(--line);font-size:15px}
.modal-body{padding:15px 18px;display:flex;flex-direction:column;gap:11px}
.modal-body label{font-size:11.5px;color:var(--ink-2);display:block;margin-bottom:4px;font-weight:500}
.modal-body input:not([type=checkbox]):not([type=radio]),.modal-body select,.modal-body textarea{width:100%;padding:5px 9px;border:1px solid var(--line-2);
  border-radius:8px;font:inherit;font-size:11.5px;background:var(--surface)}
.modal-body input:not([type=checkbox]):not([type=radio]):focus,.modal-body select:focus,.modal-body textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.modal-body textarea{min-height:80px;resize:vertical}
/* по горизонтали 18px — вровень с h3 и .modal-body, иначе кнопка не совпадает
   по кромке с полем прямо над ней; ужимаем только вертикаль под новые кнопки */
.modal-foot{display:flex;gap:7px;align-items:center;padding:10px 18px;border-top:1px solid var(--line)}
.modal-foot .spacer{flex:1}
.colrow{display:flex;align-items:center;gap:7px;padding:7px 0;border-bottom:1px solid var(--line)}
.colrow input[type=text]{flex:1;padding:4px 8px;border:1px solid var(--line-2);border-radius:8px;font:inherit;font-size:11.5px;background:var(--surface)}
.colrow input[type=color]{width:26px;height:26px;padding:0;border:1px solid var(--line-2);border-radius:8px;background:none;cursor:pointer}
.colrow .btn{padding:4px 8px}

/* фильтры задач */
.tasks-filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:11px}
.tasks-filters input[type=search]{padding:7px 11px;border:1px solid var(--line-2);border-radius:10px;background:var(--surface);font:inherit;min-width:200px}
.tasks-filters select{padding:7px 10px;border:1px solid var(--line-2);border-radius:10px;background:var(--surface);font:inherit}
.tasks-filters .cs{width:auto}
.tasks-filters .dt-count{margin-left:auto}
/* карточка: категория и счётчик комментариев */
.tcard .t-title{display:flex;align-items:flex-start}
.t-catdot{width:7px;height:7px;border-radius:50%;display:inline-block;margin-right:6px;margin-top:4px;flex:0 0 auto}
.t-cc{display:inline-flex;align-items:center;gap:3px;color:var(--ink-3)}
/* детализация задачи */
.modal-box.wide{max-width:540px}
.stbtns{display:flex;gap:6px;flex-wrap:wrap;margin:2px 0}
.stbtn{padding:5px 10px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);cursor:pointer;font:inherit;font-size:11.5px;color:var(--ink-2)}
.stbtn:hover{background:var(--surface-2)}
.stbtn.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.d-desc{white-space:pre-wrap;background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:9px 11px;font-size:12px}
/* тред комментариев */
.chat-h{font-size:11.5px;font-weight:600;color:var(--ink-2);margin-top:4px}
.chat{display:flex;flex-direction:column;gap:7px;max-height:38vh;overflow-y:auto;padding:6px 2px;
  background:var(--surface-2);border:1px solid var(--line);border-radius:12px}
.cmsg{display:flex;gap:7px;max-width:86%;padding:0 6px}
.cmsg.own{align-self:flex-end;flex-direction:row-reverse}
.cavatar{width:26px;height:26px;border-radius:50%;color:#fff;font-size:10px;font-weight:600;display:flex;
  align-items:center;justify-content:center;flex:0 0 auto}
.cbubble{background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:7px 9px}
.cmsg.own .cbubble{background:var(--accent-soft);border-color:transparent}
.cauthor{font-size:10px;font-weight:600;color:var(--ink-2);margin-bottom:2px}
.cbody{font-size:12px;white-space:pre-wrap;word-break:break-word}
.ctime{font-size:10px;color:var(--ink-3);margin-top:3px}
.cdel{cursor:pointer}.cdel:hover{color:var(--crit)}
.cmsg-sys{align-self:center;background:var(--warn-soft);color:var(--warn);font-size:10.5px;padding:3px 10px;border-radius:20px}
.cform{display:flex;gap:7px;align-items:flex-end;margin-top:6px;position:relative}
.cform textarea{flex:1;padding:7px 10px;border:1px solid var(--line-2);border-radius:10px;font:inherit;resize:none;max-height:120px;background:var(--surface)}
.cform textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.cform .btn{border-radius:10px;padding:8px 13px;font-size:14px;line-height:1}
.cform .cclip{padding:8px 9px;color:var(--ink-3)}
.cform .cclip:hover{color:var(--accent-2)}

/* исполнители на карточке */
.t-asg{display:inline-flex;align-items:center;gap:3px;background:var(--surface-3);color:var(--ink-2);
  border-radius:20px;padding:1px 7px 1px 5px;font-size:10px;max-width:128px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* мультиселект исполнителей */
.picker{position:relative}
.picker-chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding:5px 7px;border:1px solid var(--line-2);
  border-radius:8px;background:var(--surface);min-height:27px}
.pchip{display:inline-flex;align-items:center;gap:5px;background:var(--accent-soft);color:var(--accent-2);
  border-radius:16px;padding:2px 5px 2px 8px;font-size:11px;font-weight:500}
.pchip .px{cursor:pointer;font-size:12px;line-height:1;opacity:.7}
.pchip .px:hover{opacity:1;color:var(--crit)}
.picker-input{flex:1;min-width:100px;border:none!important;padding:4px 2px!important;background:transparent!important;box-shadow:none!important}
.picker-input:focus{outline:none;box-shadow:none!important}
.picker-drop{position:absolute;z-index:60;left:0;right:0;top:calc(100% + 3px);background:var(--surface);
  border:1px solid var(--line-2);border-radius:9px;box-shadow:var(--shadow-lg);max-height:195px;overflow:auto;padding:4px}
.pitem{padding:7px 9px;border-radius:7px;cursor:pointer;font-size:12px}
.pitem:hover{background:var(--accent-soft);color:var(--accent-2)}
.rbadge{font-size:10px;background:var(--surface-3);color:var(--ink-2);border-radius:4px;padding:0 5px;vertical-align:1px}

/* dropzone и сетка вложений */
.linklike{background:none;border:none;color:var(--accent);cursor:pointer;font:inherit;padding:0;text-decoration:underline}
.dropzone{border:1.5px dashed var(--line-2);border-radius:9px;padding:12px;text-align:center;background:var(--surface-2);
  color:var(--ink-3);font-size:11px}
.dropzone.slim{padding:8px}
.dropzone.dz-over{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-2)}
.attach-head{font-size:11.5px;font-weight:600;color:var(--ink-2);margin-top:4px}
.attach-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(94px,1fr));gap:7px}
.attach-grid:empty{display:none}
.acell{position:relative;border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden;padding:5px}
.acell img{width:100%;height:62px;object-fit:cover;border-radius:6px;display:block}
.acell .aicon{display:flex;align-items:center;justify-content:center;height:62px;font-size:26px;text-decoration:none}
.acell .aname{font-size:10px;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink-2)}
.acell .aname a{color:var(--ink-2)}
.acell .adel{position:absolute;top:4px;right:4px;width:18px;height:18px;border-radius:50%;background:rgba(0,0,0,.55);
  color:#fff;font-size:12px;line-height:18px;text-align:center;cursor:pointer}
.acell .adel:hover{background:var(--crit)}
.acell.sm img{height:44px}.acell.sm{padding:4px}
.cprev{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.cprev:empty{display:none}
.cprev .acell{width:52px}
.cimgs{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px}
.cimgs img{width:100px;max-width:46vw;height:auto;border-radius:8px;display:block}

/* @-упоминания */
.mention-drop{position:absolute;z-index:70;left:38px;bottom:calc(100% + 4px);min-width:190px;background:var(--surface);
  border:1px solid var(--line-2);border-radius:10px;box-shadow:var(--shadow-lg);max-height:190px;overflow:auto;padding:4px}
.mitem{padding:6px 9px;border-radius:7px;cursor:pointer;font-size:12px}
.mitem.on,.mitem:hover{background:var(--accent-soft);color:var(--accent-2)}

/* чипы значений в списках (уникальный цвет по значению) */
.chip{display:inline-block;font-size:10px;font-weight:600;padding:0 8px;border-radius:20px;border:1px solid transparent;line-height:1.4;white-space:nowrap;letter-spacing:-.01em}
/* чип пола — единый по системе: М синий, Ж розовый, «—» нейтральный.
   Раньше цвет брался из хеша текста, а hueOf(«М»)≈hueOf(«Ж») — оба розовели. */
.chip.sx-m{background:hsl(215,72%,93%);color:hsl(215,58%,38%);border-color:hsl(215,62%,82%)}
.chip.sx-f{background:hsl(335,80%,95%);color:hsl(335,58%,44%);border-color:hsl(335,68%,85%)}
.chip.sx-u{background:var(--surface-2);color:var(--ink-3);border-color:var(--line)}

/* кликабельные строки реестра → карточка пассажира */
tr.dt-row{cursor:pointer}

/* карточка пассажира (модалка) */
.person-card{display:flex;gap:16px;align-items:flex-start}
.person-photo{position:relative;width:118px;height:150px;border-radius:11px;overflow:hidden;flex:0 0 auto;background:var(--surface-3)}
.person-photo img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.person-photo .ph-ini{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff;font-size:34px;font-weight:600}
.person-photo.clickable{cursor:zoom-in}
/* фото в списке (столбец) */
.dt-photo{display:inline-block;width:22px;height:22px;border-radius:5px;object-fit:cover;vertical-align:middle;background:var(--surface-3)}
.dt-photo.ph-mini{display:inline-flex;align-items:center;justify-content:center;color:#fff;font-size:9px;font-weight:600}
td.dt-cclick:hover .dt-photo{outline:2px solid var(--accent);outline-offset:1px}
/* лайтбокс (увеличение фото по клику) */
.lightbox{position:fixed;inset:0;z-index:400;background:rgba(10,15,14,.82);display:flex;align-items:center;justify-content:center;cursor:zoom-out;padding:24px;animation:lbfade .12s ease}
.lightbox img{max-width:92vw;max-height:92vh;border-radius:10px;box-shadow:0 12px 50px rgba(0,0,0,.5);background:var(--surface)}
/* пока грузится крупная версия, показываем растянутую миниатюру: реакция мгновенная */
.lightbox img.prev{width:min(52vw,560px);height:auto;filter:blur(1.5px);image-rendering:auto}
.lb-close{position:fixed;top:12px;right:20px;color:#fff;font-size:34px;line-height:1;cursor:pointer;opacity:.85}
@keyframes lbfade{from{opacity:0}to{opacity:1}}

/* вход через Битрикс24 */
.login-or{display:flex;align-items:center;text-align:center;color:var(--ink-3);font-size:12px;margin:12px 0 8px}
.login-or::before,.login-or::after{content:"";flex:1;height:1px;background:var(--line-2)}
.login-or span{padding:0 10px}
.bx-btn{display:block;text-align:center;text-decoration:none;background:#2fc6f6;color:#fff;border:none}
.bx-btn:hover{background:#1fb0e0;color:#fff}
/* экран ожидания подтверждения */
.pending-wrap{display:flex;justify-content:center;padding:40px 16px}
.pending-card{max-width:460px;width:100%;background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:28px 26px;text-align:center;box-shadow:var(--shadow)}
.pending-ic{color:var(--accent);margin-bottom:4px}
.pending-card h1{margin:4px 0 2px;font-size:20px}
.pending-name{color:var(--ink-2);font-size:13px;margin:0 0 12px}
.pending-msg{font-size:14px;line-height:1.5;margin:0 0 8px}
.pending-sub{color:var(--ink-3);font-size:12.5px;margin:0 0 16px}
.pending-actions{display:flex;gap:8px;justify-content:center}
/* отдельный экран без окружения — кнопки в масштабе логина, а не панельные */
.pending-actions .btn{padding:8px 16px;font-size:12.5px}
/* очередь подтверждения в админке */
.pending-admin{border:1px solid #ffd9a8;background:#fff8ef;border-radius:12px;padding:12px 14px;margin:0 0 14px}
.pa-head{font-weight:600;font-size:13.5px;color:#a15c00;margin-bottom:6px}
.pa-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:7px 0;border-top:1px solid #ffe6c7}
.pa-row:first-of-type{border-top:none}
.pa-who{flex:1;min-width:180px;font-size:13px}
.pa-role{min-width:150px}
/* нашёлся ли заявитель в составе организаторов/волонтёров */
.pa-staff{font-size:11.5px;margin-top:3px}
.pa-staff.ok{color:#0c7a3e}
.pa-staff.warn{color:#a15c00}
/* Откуда пришла заявка. Цветом различаем площадку: у диспетчерской и у
   сопровождающего свои роли, и путать их при выдаче доступа нельзя. */
/* Обращения «проблемы с доступом»: неразобранные — с жёлтой полосой слева,
   разобранные бледнеют и уходят вниз списка (сортировка на сервере). */
.pending-admin.support .pa-head{color:var(--warn-ink)}
.sup-row{border-left:3px solid var(--warn);align-items:flex-start}
.sup-row.done{border-left-color:var(--line-2);opacity:.6}
.sup-msg{margin-top:5px;font-size:12px;color:var(--ink);white-space:pre-wrap;
  word-break:break-word;max-width:70ch}
.pa-host{display:inline-block;font-size:10.5px;font-weight:600;padding:1px 8px;
  border-radius:20px;background:var(--surface-3);color:var(--ink-2);white-space:nowrap}
.pa-host.h-dispatch{background:var(--accent-soft);color:var(--accent-2)}
.pa-host.h-counselor{background:var(--good-soft);color:var(--good-ink)}
/* учётки без карточки в составе — отдельным блоком, не «ошибка», а недоделка */
.pending-admin.unlinked{border-color:#cfe0f5;background:#f4f8fe}
.pending-admin.unlinked .pa-head{color:#1a4f8a}
.pending-admin.unlinked .pa-row{border-top-color:#dbe8f7}
.pa-note{font-size:11.5px;color:var(--ink-2);margin:0 0 8px;max-width:70ch}
/* поиск по составу при ручной привязке */
.lk-res{max-height:320px;overflow:auto;display:flex;flex-direction:column;gap:4px}
.lk-i{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;
  text-align:left;border:1px solid var(--line);background:var(--surface);cursor:pointer;
  border-radius:9px;padding:8px 10px;font:inherit;font-size:12.5px}
.lk-i:hover:not([disabled]){border-color:var(--accent);background:var(--accent-soft,#f2fbfa)}
.lk-i[disabled]{opacity:.55;cursor:not-allowed}
.lk-i span{font-size:11.5px}
.person-fields{flex:1;min-width:0;display:flex;flex-direction:column}
.pf-row{display:flex;gap:10px;font-size:12.5px;padding:5px 0;border-bottom:1px solid var(--line)}
.pf-row:last-child{border-bottom:none}
.pf-l{color:var(--ink-3);width:132px;flex:0 0 auto}
.pf-v{color:var(--ink);word-break:break-word}
@media (max-width:560px){.person-card{flex-direction:column;align-items:center}}

/* связь сопровождающий ↔ дети в карточке */
.links-sec{margin-top:14px;border-top:1px solid var(--line);padding-top:11px}
.links-h{font-size:12.5px;font-weight:600;color:var(--ink-2);margin-bottom:8px}
.links-chips{display:flex;flex-wrap:wrap;gap:6px}
.chip.lk{cursor:pointer;display:inline-flex;align-items:center;gap:5px;background:var(--surface-3);color:var(--ink-2);border-color:var(--line-2)}
.chip.lk:hover{background:var(--accent-soft);color:var(--accent-2)}
.chip.lk.manual{background:var(--accent-soft);color:var(--accent-2);border-color:var(--accent)}
.chip.lk .lk-x{cursor:pointer;opacity:.6;font-size:14px;line-height:1}
.chip.lk .lk-x:hover{opacity:1;color:var(--crit)}
.lk-picker{margin-top:8px;border:1px solid var(--line-2);border-radius:9px;background:var(--surface);padding:7px}
.lk-picker .lk-q{width:100%;padding:7px 10px;border:1px solid var(--line-2);border-radius:8px;font:inherit;background:var(--surface)}
.lk-list{max-height:190px;overflow:auto;margin-top:6px}
.lk-item{padding:6px 9px;border-radius:7px;cursor:pointer;font-size:12.5px}
.lk-item:hover{background:var(--accent-soft);color:var(--accent-2)}

/* умный импорт: история + журнал изменений + настройка полей */
tr.imp-row{cursor:pointer}
tr.imp-row:hover>td{background:var(--surface-2)}
.upd-row{border:1px solid var(--line);border-radius:9px;padding:8px 11px;background:var(--surface)}
.diff-old{color:var(--crit);text-decoration:line-through;opacity:.85}
.diff-new{color:var(--good);font-weight:600}
.wf-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:1px 12px;max-height:210px;overflow:auto;border:1px solid var(--line-2);border-radius:9px;padding:8px}
.wf-grid .check{font-size:11.5px}
/* Мастер загрузки: сводка + секции решений */
.wz-sum{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px}
.wz-sec{margin:0 0 16px}
.wz-h{font-size:13px;font-weight:700;color:var(--ink);margin:0 0 4px}
.wz-note{font-size:11.5px;color:var(--ink-2);margin:0 0 8px}
.wz-person{border:1px solid var(--line);border-radius:9px;padding:8px 11px;margin:0 0 8px;background:var(--surface)}
.wz-pn{font-weight:600;font-size:12.5px;margin:0 0 5px}
.wz-conf{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 14px;padding:4px 0;border-top:1px solid var(--line)}
.wz-conf:first-of-type{border-top:0}
.wz-cl{flex:0 0 100%;font-size:11.5px;color:var(--ink-2)}
.wz-opt{font-size:12px;display:inline-flex;align-items:baseline;gap:5px;cursor:pointer}
.wz-opt b{font-weight:600;color:var(--ink)}
.wz-trow{display:flex;align-items:baseline;gap:7px;font-size:12.5px;padding:3px 4px;cursor:pointer;border-radius:6px}
.wz-trow:hover{background:var(--surface-2)}
.modal-body.wz{max-height:64vh;overflow:auto}

/* услуги ребёнка (карточка) */
.svc-list{display:flex;flex-direction:column;gap:1px}
.svc-item{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:8px;cursor:pointer;font-size:12.5px}
.svc-item:hover{background:var(--surface-2)}
.svc-item.on .svc-name{font-weight:600}
.svc-name{flex:0 1 auto}
.svc-badge{font-size:10.5px;padding:1px 8px;border-radius:20px;background:var(--surface-2);color:var(--ink-3);border:1px solid var(--line-2)}
.svc-badge.paid{background:#fff4e5;color:#a15c00;border-color:#ffd9a8}
/* платные услуги — единый оранжевый акцент по всему сайту */
.svc-item.paid .svc-name{color:#c77400}
.paid-svc{color:#c77400;font-weight:600}
/* панель услуг в справочнике */
.svc-bar{display:flex;flex-direction:column;gap:8px}
.svc-add{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.svc-add b{font-size:12.5px;color:var(--ink-3)}
/* панель над списком (переключатель услуг) */
.list-tools{display:flex;align-items:center;gap:8px;margin:0 0 9px;flex-wrap:wrap}
.list-tools .muted{font-size:11.5px}
table.dt td .dt-check{display:inline-block;vertical-align:middle;margin:0;width:16px;height:16px;min-width:0;padding:0}
/* метка услуги в списке: ✓ (просмотр) или кликабельная клетка (правка); платная — оранжевая */
.svc-mark{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;font-size:12px;line-height:1;color:var(--accent);font-weight:800}
.svc-mark.paid{color:#c77400}
.svc-mark.ed{width:20px;height:18px;border:1.5px solid var(--line-2);border-radius:5px;cursor:pointer;color:transparent;transition:background .1s,border-color .1s}
.svc-mark.ed:hover{border-color:var(--accent)}
.svc-mark.ed.on{background:var(--accent);border-color:var(--accent);color:#fff}
.svc-mark.ed.on.paid{background:#e0891c;border-color:#e0891c}
table.dt td.dt-cclick{cursor:pointer}
table.dt td.dt-cclick:hover{background:var(--accent-soft)}
/* карточка участника: данные слева, услуги справа */
/* ── Карточка человека ───────────────────────────────────────────────────────
   Геометрия одна на всю карточку: --lab задаёт колонку метки, поэтому значения
   во всех секциях начинаются на одном пикселе по X (в прежней вёрстке у каждой
   плитки была своя вертикаль — отсюда «криво»). Всё под .pcard-modal, чтобы
   остальные модалки приложения не затронуть. */
.pcard-modal{--lab:104px;max-width:min(1560px,97vw);
  display:flex;flex-direction:column;overflow:hidden}
.pcard-modal>h3.dos-head{flex:0 0 auto;display:flex;align-items:center;gap:7px;flex-wrap:wrap;
  padding:10px 15px;font-size:14.5px;font-weight:600;letter-spacing:-.02em}
.dos-nm{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dos-type{background:var(--surface-3);color:var(--ink-2)}
.dos-sp{flex:1 1 auto}
.dos-pid{font:500 11px/1.6 var(--mono);letter-spacing:0;background:var(--accent-soft);
  color:var(--accent-2);border-radius:20px;padding:1px 9px;cursor:copy;white-space:nowrap}
.dos-pid:hover{background:var(--accent);color:var(--on-accent)}
.pcard-modal .modal-body{flex:1 1 auto;min-height:0;overflow:auto;padding:0;gap:0;
  display:grid;grid-template-columns:266px minmax(0,1fr);align-items:start}

/* рельса личности: кто это, всё ли в порядке, куда селить — не уезжает при прокрутке */
.dos-rail{position:sticky;top:0;align-self:start;padding:10px;
  background:var(--bg);border-right:1px solid var(--line)}
.dos-rail>.person-photo,.dos-rail .dos-who,.dos-rail .dos-sub{background:none}
.dos-rail .dos-idbox{margin-top:8px;padding:8px 10px;border:1px solid var(--line);
  border-radius:10px;background:var(--surface)}
.dos-rail .person-photo{width:132px;height:176px;border-radius:10px;margin:0 auto 9px}
.dos-rail .person-photo .ph-ini{font-size:38px}
.dos-who{font-size:13px;font-weight:600;line-height:1.3;letter-spacing:-.01em}
.dos-sub{margin-top:2px;font-size:11.5px;line-height:1.35;color:var(--ink-2)}
.dos-glance{display:grid;grid-template-columns:repeat(auto-fit,minmax(58px,1fr));gap:5px;margin-top:10px}
.dos-g{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:4px 3px;text-align:center}
.dos-g b{display:block;font-size:13px;font-weight:700;line-height:1.2;color:var(--ink-3)}
.dos-g span{display:block;font-size:9.5px;font-weight:500;line-height:1.3;color:var(--ink-3);letter-spacing:.01em}
.dos-g.ok b{color:var(--good)}
.dos-g.warn b{color:var(--warn)}
.dos-g.crit b{color:var(--crit)}
.dos-g.g-svc{grid-column:1/-1;display:flex;align-items:baseline;gap:8px;text-align:left;padding:3px 9px}
.dos-g.g-svc b{margin-left:auto;font-size:12.5px;color:var(--ink);font-variant-numeric:tabular-nums}
.dos-g.g-svc span{text-transform:uppercase;letter-spacing:.06em;font-weight:600}
.dos-room{display:flex;align-items:baseline;gap:8px;margin-top:6px;padding:5px 9px;
  background:var(--surface);border:1px solid var(--line);border-radius:8px}
.dos-room i{font-style:normal;font-size:9.5px;font-weight:600;text-transform:uppercase;
  letter-spacing:.06em;color:var(--ink-3)}
.dos-room b{margin-left:auto;font-size:14px;font-weight:600;font-variant-numeric:tabular-nums}
.dos-room.empty b{font-size:12.5px;font-weight:500;color:var(--ink-3)}
.dos-ids{margin-top:8px;padding:7px 10px;border:1px solid var(--line);border-radius:10px;
  background:var(--surface)}
.dos-id{font:500 10.5px/1.35 var(--mono);color:var(--ink-2);overflow-wrap:anywhere;cursor:copy}
.dos-id:hover{color:var(--accent-2)}
.dos-id>span{display:block;font:600 9.5px/1.4 var(--sans);text-transform:uppercase;
  letter-spacing:.06em;color:var(--ink-3);cursor:default}
/* участие: пометка ставится только руками, поэтому кнопка неброская — пока человек
   едет. Помеченный выбывшим блок краснеет: это состояние надо видеть сразу */
/* Окно замены: слева поля нового человека, справа — что ему достанется */
.rp-modal{max-width:720px}
.rp-body{display:block}
.rp-who{font:400 14px/1.4 var(--sans);margin:0 0 12px}
.rp-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 12px}
.rp-f{display:flex;flex-direction:column;gap:4px}
.rp-f.rp-wide{grid-column:1 / -1}
.rp-f i{font-style:normal;font:500 11.5px/1 var(--sans);color:var(--ink-2);
  letter-spacing:.03em;text-transform:uppercase}
.rp-f input{padding:9px 10px;border:1px solid var(--line-2);border-radius:8px;
  font:inherit;font-size:13.5px;background:var(--surface)}
.rp-move{margin-top:14px;padding:11px 13px;border-radius:10px;background:var(--surface-2);
  border:1px solid var(--line)}
.rp-move b{font:600 13px/1.3 var(--sans)}
.rp-move ul{margin:7px 0 0;padding-left:18px;font-size:13px;line-height:1.5}
.rp-move p{margin:8px 0 0;font-size:12px}
/* «Заменить фото» — тихая кнопка под снимком: действие редкое, но нужное
   (у замены и части регионов фото из Б24 нет вовсе) */
.ph-set{display:block;width:100%;margin-top:8px;font-size:11.5px;padding:7px 8px}
.dos-repl{display:block;font:400 12.5px/1.4 var(--sans);color:var(--ink-2);margin-bottom:6px}
.dos-repl .lnk{border:0;background:transparent;color:var(--accent);font:inherit;
  cursor:pointer;padding:0;text-decoration:underline}
.dos-att{margin-top:8px}
.dos-att .btn{width:100%}
.dos-att.off{padding:7px 10px;border:1px solid var(--crit);border-radius:10px;
  background:var(--crit-soft);display:flex;flex-direction:column;gap:5px;align-items:stretch}
.dos-att.off b{font-size:11.5px;font-weight:700;color:var(--crit)}
.dos-att.off span{font-size:10.5px;line-height:1.3;color:var(--ink-2)}

/* полотно: карточки укладываются потоком — на широком экране 4 колонки, на
   ноутбуке 3, на планшете 1-2. align-items:stretch выравнивает карточки ряда по
   самой высокой: иначе низ ряда рваный (короткая «Принадлежность» у «Логистики») */
.dos-main{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));
  gap:10px;align-items:stretch;align-content:start;padding:10px 12px 12px;background:var(--bg)}
.dos-full{min-width:0}
.dos-full{grid-column:1/-1}
.dos-main .links-sec{margin:0;padding:9px 11px 8px;border:1px solid var(--line);
  border-radius:10px;background:var(--surface)}
.dos-main .links-h{display:flex;align-items:center;gap:7px;margin:0 0 5px;padding-bottom:5px;
  border-bottom:1px solid var(--line);white-space:nowrap;overflow:hidden;
  font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3)}
.dos-main .links-h .dos-n{font:600 11px/1 var(--sans);letter-spacing:0;text-transform:none;
  color:var(--ink-3);font-variant-numeric:tabular-nums}
.dos-main .links-h .linklike{order:3;flex:0 0 auto;font-size:11px;font-weight:500;
  text-transform:none;letter-spacing:0}

/* поле: метка → значение, ритм строки 26px, одна вертикаль во всей карточке */
.dos-main .pf-row{display:grid;grid-template-columns:var(--lab) minmax(0,1fr);gap:0 9px;
  align-items:baseline;padding:2px 0;border:0;font-size:11.5px;line-height:16px}
.dos-main .pf-l{width:auto;flex:none;font-size:11px;line-height:17px;font-weight:400;
  color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dos-main .pf-v{min-width:0;font-size:11.5px;line-height:17px;font-weight:500;color:var(--ink);
  overflow-wrap:break-word;font-variant-numeric:tabular-nums}
.dos-main .pf-v.hi{font-weight:600}
.dos-main .pf-v.em{color:var(--ink-3);font-weight:400}
.dos-main .pf-v.bad{color:var(--crit)}
.dos-main .pf-v.warn{color:var(--warn)}
.dos-main .pf-v.mono{font-family:var(--mono);font-size:11px;letter-spacing:.02em}
/* строка одна на всю карточку: метка слева, значение справа. Прежний режим «метка
   над значением» для длинных полей ломал общую вертикаль — метки укоротили вместо него */
.dos-main .pf-v .nm-ru{font-size:10.5px}

/* рейс — две строки по жёсткой схеме: «аэропорт … [номер рейса]» / «дата · время».
   Раньше части переносились как придётся, и обе ноги выглядели по-разному */
.dos-main .trip{padding:2px 0}
.dos-main .trip .pf-v{display:flex;align-items:baseline;gap:0 7px;flex-wrap:wrap}
.dos-main .trip .t-ico{margin-right:5px;opacity:.75;display:inline-block}
.dos-main .trip .t-place{order:1;min-width:0;font-weight:600;color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dos-main .trip .t-when{order:3;flex:1 0 100%;font-weight:500;color:var(--ink-2);
  white-space:nowrap;font-variant-numeric:tabular-nums}
.dos-main .trip .t-fl{order:2;flex:0 0 auto;margin-left:auto;font:500 10.5px/15px var(--mono);
  color:var(--ink-2);border:1px solid var(--line-2);border-radius:5px;padding:0 5px;white-space:nowrap}
.dos-main .trip.out .t-ico{transform:scaleX(-1)}

/* правка ФИО: значение, а не форма (4 класса — чтобы перебить .modal-body input) */
.pcard-modal .dos-main .pf-v input.dos-ed{display:block;width:100%;height:20px;margin:-1px -7px;
  padding:0 6px;border:1px solid transparent;border-radius:6px;background:none;
  font:500 12px/18px var(--sans);color:var(--ink);text-overflow:ellipsis}
.pcard-modal .dos-main .pf-v input.dos-ed:hover{border-color:var(--line-2);background:var(--surface)}
.pcard-modal .dos-main .pf-v input.dos-ed:focus{outline:none;border-color:var(--accent);
  background:var(--surface);box-shadow:0 0 0 3px var(--accent-soft);text-overflow:clip}
.pcard-modal .dos-main .pf-v input.dos-ed.lat-name{font-family:var(--mono);font-size:11.5px;
  text-transform:uppercase;letter-spacing:.04em}
/* редактор-селект и кнопка выбора делегации в карточке — как inline-инпут */
.pcard-modal .dos-main .pf-v select.dos-ed{display:block;width:calc(100% + 14px);height:20px;margin:-1px -7px;
  padding:0 4px;border:1px solid transparent;border-radius:6px;background:none;
  font:500 12px/18px var(--sans);color:var(--ink);cursor:pointer}
.pcard-modal .dos-main .pf-v select.dos-ed:hover{border-color:var(--line-2);background:var(--surface)}
.pcard-modal .dos-main .pf-v select.dos-ed:focus{outline:none;border-color:var(--accent);
  background:var(--surface);box-shadow:0 0 0 3px var(--accent-soft)}
.pcard-modal .dos-main .pf-v .dos-pick{display:block;width:calc(100% + 14px);height:20px;margin:-1px -7px;
  padding:0 6px;text-align:left;border:1px solid transparent;border-radius:6px;background:none;
  color:var(--ink);font:500 12px/18px var(--sans);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pcard-modal .dos-main .pf-v .dos-pick:hover{border-color:var(--line-2);background:var(--surface)}
.pcard-modal .dos-main .pf-v .dos-pick .ca{color:var(--ink-3);font-size:9px}
.dp-list{border:1px solid var(--line);border-radius:8px}
.dp-row{padding:6px 10px;cursor:pointer;border-bottom:1px solid var(--line);font-size:12.5px}
.dp-row:last-child{border-bottom:none}
.dp-row:hover{background:var(--surface-2)}
.dp-row.cur{background:var(--accent-soft);font-weight:600}
.dos-main .pf-row.ed .pf-v{position:relative}
.dos-hint{display:none;position:absolute;left:-7px;top:calc(100% + 3px);z-index:2;white-space:nowrap;
  background:var(--surface);border:1px solid var(--line-2);border-radius:6px;padding:2px 8px;
  box-shadow:var(--shadow);font-size:10.5px;line-height:1.4;color:var(--ink-3)}
.dos-main .pf-row.ed:focus-within .dos-hint{display:block}
.dos-ok{font-style:normal;margin-left:5px;color:var(--good);opacity:0;transition:opacity .15s}
.dos-ok.on{opacity:1}

/* услуги: 9–10 пунктов в две подколонки — иначе блок вдвое выше остальных */
.dos-main .svc-list{display:grid;grid-template-columns:minmax(0,1fr);
  grid-auto-rows:minmax(24px,auto);column-gap:18px;row-gap:0;padding:1px 0 0}
.dos-main .svc-item{align-items:center;gap:7px;padding:2px 0;border-radius:6px;
  font-size:11.5px;line-height:16px;min-width:0}
.dos-main .svc-item:hover{background:none;color:var(--accent-2)}
.dos-main .svc-name{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dos-main .svc-badge{flex:0 0 auto;max-width:96px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;font-size:9px;padding:0 5px;line-height:14px}
.dos-main .svc-item input[type=checkbox]{width:14px;height:14px;border-radius:4px}

/* связи, сканы, история */
.dos-main .links-chips{gap:5px;padding:5px 0 0}
.dos-main .chip.lk{font-size:11.5px;line-height:20px}
.dos-main .lk-picker{margin-top:7px}
.dos-main .doc-links{gap:6px;margin-top:8px}
.dos-main .doc-l{font-size:11px;padding:4px 9px;border-radius:8px;color:var(--ink-2)}
.dos-main .doc-l:hover{color:var(--accent-2)}
.dos-main .hist-box{max-height:280px;overflow:auto;margin-top:7px}
.dos-main .hist-item .pf-row{border-bottom:0;padding:2px 0}
.pcard-modal .modal-foot{flex:0 0 auto;padding:10px 15px}


@media (max-width:700px){
  .pcard-modal{--lab:112px}
  .pcard-modal .modal-body{grid-template-columns:minmax(0,1fr)}
  .dos-rail{position:static;border-right:0;border-bottom:1px solid var(--line);
    display:grid;grid-template-columns:88px minmax(0,1fr);gap:0 12px;align-items:start}
  .dos-rail .person-photo{width:88px;height:118px;margin:0}
  .dos-glance,.dos-room,.dos-ids{grid-column:1/-1}
  .dos-main{padding:11px 13px 14px}
  .dos-main .pf-row{padding:6px 0}
  .dos-main .svc-list{grid-auto-flow:row;grid-template-rows:none}
}

/* ---------- тост ---------- */
.toast{position:fixed;bottom:18px;right:18px;background:var(--ink);color:#fff;padding:10px 15px;border-radius:9px;
  font-size:12px;opacity:0;transform:translateY(10px);transition:.2s;z-index:300;box-shadow:var(--shadow-lg)}
.toast.show{opacity:1;transform:none}
.toast.err{background:var(--crit)}

/* ---------- баннер «доступна новая версия» ---------- */
/* мягкий нудж внизу слева (тосты — справа, не пересекаются); не прерывает работу */
.upd-banner{position:fixed;left:18px;bottom:18px;z-index:290;display:none;align-items:center;gap:11px;
  max-width:370px;background:var(--surface);border:1px solid var(--line-2);border-left:3px solid var(--accent);
  border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:11px 13px;animation:upd-in .24s ease}
.upd-banner.show{display:flex}
.upd-banner .upd-ico{width:28px;height:28px;flex:0 0 auto;border-radius:8px;background:var(--accent-soft);
  color:var(--accent-2);display:flex;align-items:center;justify-content:center}
.upd-banner .upd-ico svg{width:16px;height:16px}
.upd-banner .upd-txt{display:flex;flex-direction:column;line-height:1.35}
.upd-banner .upd-txt b{font-weight:600;font-size:12.5px;color:var(--ink)}
.upd-banner .upd-txt span{color:var(--ink-2);font-size:11px}
.upd-banner .upd-act{margin-left:auto;display:flex;align-items:center;gap:4px}
.upd-banner .upd-act .btn{padding:4px 10px}
.upd-banner .upd-x{background:none;border:none;color:var(--ink-3);font-size:17px;line-height:1;cursor:pointer;
  padding:2px 5px;border-radius:6px}
.upd-banner .upd-x:hover{color:var(--ink);background:var(--surface-2)}
@keyframes upd-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@media (max-width:520px){.upd-banner{left:12px;right:12px;bottom:12px;max-width:none}}

@media (max-width:720px){
  main{padding:14px 12px}
  .topbar{padding:0 10px}
  .topbar nav a span{display:none}
  .topbar nav a{padding:7px 8px}
}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* ---------- Встречи / Проводы (планировщик ТС) ---------- */
/* группировка по датам — как контейнер-карточка с шапкой-плашкой */
.tr-date{margin-bottom:16px;border:1px solid var(--line-2);border-radius:12px;background:var(--surface);
  overflow:hidden;box-shadow:0 1px 2px rgba(16,24,40,.05)}
.tr-date-h{display:flex;align-items:baseline;gap:10px;margin:0;padding:9px 14px;
  border-bottom:1px solid var(--line-2);background:var(--surface-2)}
.tr-date-h .dd{font-size:15px;font-weight:700;letter-spacing:-.01em;color:var(--accent-2)}
.tr-date>.tr-ven{padding:2px 12px;margin-bottom:8px}
.tr-date>.tr-ven:first-of-type{padding-top:8px}
.tr-date>.tr-ven:last-child{margin-bottom:0;padding-bottom:10px}
.tr-ven{margin-bottom:8px}
.tr-ven-h{display:flex;align-items:center;gap:9px;padding:6px 2px}
.tr-ico{width:26px;height:26px;border-radius:8px;background:var(--accent-soft);color:var(--accent-2);
  display:flex;align-items:center;justify-content:center;font-size:14px;flex:0 0 auto}
table.dt.tr-tbl td,table.dt.tr-tbl th{white-space:nowrap}
/* время подачи не режем: это то, ради чего в колонку и смотрят */
table.dt.tr-tbl td .tr-pod{overflow:visible;text-overflow:clip}
table.dt.tr-tbl td{padding:2px 8px;font-size:10.5px}     /* компактные строки: уже и мельче */
table.dt.tr-tbl th{padding:3px 8px}
table.dt.tr-tbl tr.tr-drow>td{padding-top:3px;padding-bottom:3px}
.tr-fixed{color:var(--ink-2)}                              /* место подачи на заезде — только чтение */
/* группы-делегации — отчётливый teal-фон; шапка ниже — нейтрально-серая, не сливаются */
tr.tr-drow{cursor:pointer;background:var(--surface-3)}
tr.tr-drow:hover{background:var(--line-2)}
tr.tr-drow>td{font-weight:600;border-bottom:1px solid var(--line-2);background:inherit}
tr.tr-drow>td:first-child{box-shadow:inset 3px 0 0 var(--accent)}
/* Коллективы-спутники — подсветка в гамме k-satellite (amber) */
/* Кому трансфер НЕ положен — жёлтым, в обоих видах (доска и таблица).
   Оттенок отдельный от --warn-soft: тем уже помечены коллективы-спутники, и
   два разных смысла одним цветом читались бы как одно и то же. */
tr.tr-mem.tr-nodue>td,tr.tr-drow.tr-nodue>td,
table.dt tbody tr.tr-nodue>td{background:#fdf6cf}
tr.tr-mem.tr-nodue:hover>td,tr.tr-drow.tr-nodue:hover>td,
table.dt tbody tr.tr-nodue:hover>td{background:#faeeb0}
tr.tr-nodue>td:first-child{box-shadow:inset 3px 0 0 #d9b800}
/* спутник важнее: у него свой смысл и своя полоса слева */
tr.tr-mem.tr-sat.tr-nodue>td:first-child,
tr.tr-drow.tr-sat.tr-nodue>td:first-child{box-shadow:inset 3px 0 0 var(--warn)}

tr.tr-drow.tr-sat{background:var(--warn-soft)}
tr.tr-drow.tr-sat:hover{background:color-mix(in srgb,var(--warn) 20%,#fff)}
tr.tr-drow.tr-sat>td:first-child{box-shadow:inset 3px 0 0 var(--warn)}
tr.tr-mem.tr-sat>td:first-child{box-shadow:inset 3px 0 0 var(--warn)}
.tr-sat-badge{display:inline-block;font-size:9.5px;font-weight:700;color:#fff;
  background:var(--warn);border-radius:999px;padding:0 7px;margin-left:6px;
  vertical-align:middle;white-space:nowrap;letter-spacing:.02em}
table.dt.tr-tbl thead th{background:#d6ebe8;color:var(--ink-2);border-bottom:1px solid var(--line-2)}
.tr-tel{color:var(--ink);white-space:nowrap}
.tr-tel:hover{color:var(--accent-2)}
tr.tr-mem>td.tr-nm{padding-left:22px;font-weight:400}
tr.tr-mem.sel{background:var(--accent-soft)}
.tr-caret{display:inline-block;color:var(--ink-3);font-size:10px;transition:transform .15s}
.tr-caret.open{transform:rotate(90deg)}
.tr-asg{display:inline-block;font-size:9.5px;font-weight:700;padding:0 6px;border-radius:20px;margin-left:6px;
  background:var(--good-soft);color:var(--good)}
.tr-asg.part{background:var(--warn-soft);color:var(--warn)}
.tr-vchip{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;font-weight:600;padding:1px 8px;
  border-radius:20px;background:var(--accent-soft);color:var(--accent-2);cursor:pointer}
.tr-pcell{display:inline-flex;align-items:center;gap:4px;cursor:pointer;border:1px dashed transparent;
  border-radius:6px;padding:0 5px;font-weight:500}
.tr-pcell:hover{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-2)}
.tr-pcell .ca{font-size:8px;color:var(--ink-3)}
/* панель выбора */
.tr-selbar{position:fixed;left:50%;bottom:18px;transform:translateX(-50%) translateY(30px);background:var(--ink);
  color:var(--bg);border-radius:14px;box-shadow:var(--shadow-lg);padding:7px 11px 7px 14px;display:flex;
  align-items:center;gap:12px;opacity:0;pointer-events:none;transition:.2s;z-index:200;font-size:12.5px}
.tr-selbar.show{opacity:1;pointer-events:auto;transform:translateX(-50%)}
.tr-selbar .btn{border-color:transparent}
/* выпадающие меню (ТС / площадки / фильтры / сортировка) */
.tr-menu{position:absolute;z-index:210;background:var(--surface);border:1px solid var(--line-2);border-radius:11px;
  box-shadow:var(--shadow-lg);padding:6px;min-width:216px;max-height:320px;overflow:auto}
.tr-menu .it{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;cursor:pointer;font-size:12.5px}
.tr-menu .it:hover{background:var(--surface-2)}
.tr-menu .it.new{color:var(--accent-2);font-weight:600}
.tr-menu .it.rm{color:var(--crit)}
.tr-menu .it .oc{margin-left:auto;color:var(--ink-3);font-size:11px}
.tr-menu .gh{font-size:9.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-3);font-weight:700;padding:6px 8px 2px}
.tr-menu label.ck{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;cursor:pointer;font-size:12.5px}
.tr-menu label.ck:hover{background:var(--surface-2)}
.tr-menu .srow{display:flex;align-items:center;gap:5px;padding:3px 2px}
.tr-menu .srow select{flex:1;min-width:0;padding:5px 7px;border:1px solid var(--line-2);border-radius:7px;
  background:var(--surface);color:var(--ink);font:inherit;font-size:12px}
.tr-menu .srow .btn{padding:4px 8px}
/* панель ТС */
.tr-panel{position:fixed;top:0;right:0;height:100%;width:370px;max-width:94vw;background:var(--surface);
  border-left:1px solid var(--line-2);box-shadow:var(--shadow-lg);z-index:220;display:flex;flex-direction:column}
.tr-panel .tp-h{display:flex;align-items:center;gap:8px;padding:13px 15px;border-bottom:1px solid var(--line)}
.tr-panel .tp-h h3{margin:0;font-size:15px;flex:1}
.tr-panel .tp-list{flex:1;overflow:auto;padding:11px}
/* Панель ТС: поиск и счётчик над списком */
.tp-tools{display:flex;align-items:center;gap:8px;padding:10px 11px 0}
.tp-q{flex:1;min-width:0;padding:8px 10px;border:1px solid var(--line-2);border-radius:9px;
  background:var(--surface);color:var(--ink);font:inherit;font-size:12.5px}
.tp-q:focus{outline:none;border-color:var(--accent)}
.tp-q::-webkit-search-cancel-button{display:none}
.tp-n{font-size:11.5px;color:var(--ink-2);white-space:nowrap}

.tp-card{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:9px}
/* развёрнутая карточка выделяется — видно, что именно правишь */
.tp-card.open{border-color:var(--accent);box-shadow:0 1px 10px rgba(15,139,131,.1)}
/* шапка-спойлер: вся строка кликабельна */
.tp-head{display:flex;align-items:center;gap:8px;width:100%;padding:0;border:0;
  background:transparent;cursor:pointer;text-align:left;color:var(--ink);font:inherit}
.tp-cv{flex:0 0 auto;width:12px;color:var(--ink-3);font-size:11px}
.tp-num{flex:0 0 auto;font-size:12px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.tp-card .tp-t{display:flex;align-items:center;gap:8px;font-size:13px;flex:1;min-width:0}
/* сводка под шапкой: водитель, номера, подача и делегации — по ним и ищут */
.tp-sum{font-size:11.5px;line-height:1.45;color:var(--ink-2)}
.tp-dl{display:block;color:var(--ink-3);font-size:11px;margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tp-occ{height:6px;border-radius:4px;background:var(--surface-3);overflow:hidden;margin:7px 0 5px}
.tp-occ i{display:block;height:100%;background:var(--accent)}
.tp-occ.over i{background:var(--crit)}
.tp-rdy{margin:6px 0}
.tp-form{display:flex;flex-direction:column;gap:7px;margin-top:8px}
.tp-form .r2{display:flex;gap:6px}.tp-form .r2>*{flex:1;min-width:0}
.tp-form label{font-size:10px;color:var(--ink-3);font-weight:600;display:block;margin-bottom:3px}
.tp-form input,.tp-form select{width:100%;padding:4px 8px;border:1px solid var(--line-2);border-radius:7px;
  background:var(--surface);color:var(--ink);font:inherit;font-size:11.5px}
.tp-act{display:flex;gap:6px;flex-wrap:wrap;margin-top:2px}
.pill.k-ok{background:var(--good-soft);color:var(--good)}
.pill.k-warn{background:var(--warn-soft);color:var(--warn)}
.pill.k-crit{background:var(--crit-soft);color:var(--crit)}
.pill.k-escort{background:var(--surface-3);color:var(--ink-2)}

/* ---------- компактный блок рейсов в карточке (туда / обратно) ---------- */
.trips{display:flex;flex-direction:column;gap:3px;margin-top:10px;border:1px solid var(--line);
  border-radius:var(--radius-sm);padding:7px 9px;background:var(--surface-2)}
.trip{display:flex;align-items:center;gap:7px;font-size:11.5px;line-height:1.5;min-width:0}
.trip .t-ico{width:16px;text-align:center;flex:0 0 auto;opacity:.8}
.trip .t-lbl{flex:0 0 52px;color:var(--ink-3);font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.02em}
.trip .t-place{font-weight:600;color:var(--ink);white-space:nowrap}
.trip .t-when{color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap}
.trip .t-fl{margin-left:auto;color:var(--ink-3);font-size:10.5px;max-width:46%;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;text-align:right}
.trip.out .t-ico{transform:scaleX(-1)}

/* ---------- столбец «Рейсы» в реестре (две микро-строки: туда/обратно) ---------- */
.tcell{display:flex;flex-direction:column;gap:1px;line-height:1.25;min-width:0}
.tline{display:flex;align-items:center;gap:4px;font-size:9.5px;white-space:nowrap;overflow:hidden;min-width:0}
.tline .ti{flex:0 0 auto;opacity:.75;font-size:9px}
.tline b{font-weight:600;font-variant-numeric:tabular-nums;color:var(--ink)}
.tline .tp{color:var(--ink-2);overflow:hidden;text-overflow:ellipsis}
.tline .tf{color:var(--ink-3);margin-left:auto;max-width:38%;overflow:hidden;text-overflow:ellipsis}
.tline.out b,.tline.out .tp{color:var(--ink-2)}

/* маркеры «положен трансфер» и блок «место рейса не указано» */
.due-dot{color:var(--accent);font-size:8px;vertical-align:2px}
.tr-due{display:inline-block;font-size:9.5px;font-weight:700;padding:0 6px;border-radius:20px;
  background:var(--accent-soft);color:var(--accent-2);margin-left:6px}
.due-n{color:var(--accent-2)}
.tr-ven.noplace .tr-ico{background:var(--warn-soft);color:var(--warn)}
.tr-ven.noplace .tr-ven-h b{color:var(--warn)}
.card.warn .n{color:var(--warn)}
.dt-gsel{margin:0 7px 0 2px;vertical-align:middle}
/* ФИО на русском: рядом с оригиналом */
.nm-ru{font-size:10px;color:var(--ink-3);line-height:1.15}
.nameru-in{width:100%;padding:4px 8px;border:1px solid var(--line-2);border-radius:7px;
  background:var(--surface);color:var(--ink);font:inherit;font-size:12px}
.nameru-in:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
/* блок MRZ в карточке */
.mrz-sec .mrz-in{width:100%;font-family:var(--mono);font-size:11px;letter-spacing:.02em;
  padding:7px 9px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);
  color:var(--ink);resize:vertical;white-space:pre;overflow-x:auto}
.mrz-sec .mrz-in:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.mrz-act{display:flex;gap:6px;margin:7px 0}
.mrz-card{border:1px solid var(--line);border-radius:8px;padding:9px 11px;background:var(--surface-2)}
.mrz-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:3px 12px;margin-top:7px}
.mrz-f{display:flex;justify-content:space-between;gap:8px;font-size:11.5px;border-bottom:1px dashed var(--line);padding:2px 0}
.mrz-f span{color:var(--ink-3)}
.mrz-diff{margin-top:8px;font-size:11.5px;color:var(--warn);background:var(--warn-soft);
  border-radius:8px;padding:7px 10px;line-height:1.6}
.lat-name{font-family:var(--mono);font-size:11px;letter-spacing:.01em}
.lat-icao{font-family:var(--mono);font-size:10px;color:var(--muted);margin-top:1px;letter-spacing:.01em}

/* сигнал «менялось импортом» и история изменений в карточке */
.chg-b{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:20px;
  background:var(--surface-3);color:var(--ink-2);font-variant-numeric:tabular-nums}
.chg-b.fresh{background:var(--warn-soft);color:var(--warn)}
.hist-box{max-height:280px;overflow:auto;margin-top:6px}
.hist-item{border:1px solid var(--line);border-radius:8px;padding:8px 10px;margin-bottom:6px;background:var(--surface)}
.hist-item.fresh{border-color:var(--warn)}
.hist-h{font-size:11.5px;margin-bottom:4px}

/* сосед по комнате: в выгрузке 1С приходит ID Б24, показываем ФИО */
.mate-m{color:var(--good);font-weight:700}
.mate-o{color:var(--ink-3)}
.mate-miss{color:var(--warn);font-size:11px}

/* режим расселения: пара по пожеланию, ввод номера прямо в таблице */
/* номер пары: одинаковый у обоих — видно «кто с кем» при любой сортировке */
.lg-pair{display:inline-block;padding:1px 8px;border-radius:20px;font-size:11px;font-weight:700;
  font-variant-numeric:tabular-nums;background:var(--good-soft);color:var(--good);
  border:1px solid transparent}
.lg-pair.one{background:var(--warn-soft);color:var(--warn);border-style:dashed;border-color:currentColor}
.lg-pair.split{background:var(--crit-soft);color:var(--crit)}
.lg-split{color:var(--crit);font-weight:700;margin-left:2px}
.lg-solo{color:var(--warn);font-size:10.5px}
.lg-room{font-variant-numeric:tabular-nums}
.lg-room.bad{color:var(--crit);border-bottom:2px solid var(--crit)}
.lg-room-empty{color:var(--ink-3);font-size:11px;border-bottom:1px dashed var(--line-2);cursor:pointer}
td.dt-cclick:hover .lg-room-empty{color:var(--accent);border-color:var(--accent)}
.lg-redit{position:fixed;z-index:60;width:290px;background:var(--surface);border:1px solid var(--line-2);
  border-radius:10px;box-shadow:0 12px 32px rgba(16,24,40,.18);padding:8px}
.lg-rin{width:100%;padding:7px 9px;border:1px solid var(--accent);border-radius:8px;
  background:var(--surface);color:var(--ink);font:inherit;font-size:14px;font-weight:600}
.lg-rin:focus{outline:none;box-shadow:0 0 0 3px var(--accent-soft)}
.lg-rsize{display:flex;align-items:center;gap:4px;margin:6px 2px 2px;font-size:11px;flex-wrap:wrap}
.lg-sz{padding:2px 8px;border:1px solid var(--line-2);border-radius:7px;background:var(--surface);
  color:var(--ink-2);cursor:pointer;font:inherit;font-size:11px}
.lg-sz:hover{background:var(--surface-2)}
.lg-sz.on{background:var(--accent-soft);color:var(--accent-2);border-color:transparent;font-weight:600}
.lg-rhint{font-size:11px;color:var(--ink-3);margin:5px 2px 4px}
.lg-rlist{max-height:230px;overflow:auto;border-top:1px solid var(--line)}
.lg-ri{padding:5px 7px;border-radius:7px;cursor:pointer;font-size:12px}
.lg-ri:hover{background:var(--surface-2)}
.lg-ri.bad{color:var(--crit)}
.lg-ri .oc{font-size:11px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.lg-ri .rbad{font-size:10.5px;color:var(--crit)}
.lg-rwho{font-size:10.5px;line-height:1.25}

.lg-rdel{float:right;color:var(--ink-3);font-size:11px;padding:0 3px;border-radius:5px}
.lg-rdel:hover{background:var(--crit-soft);color:var(--crit)}

.lg-pair.man{background:var(--accent-soft);color:var(--accent-2)}

/* тип номера: авто-значение бледнее заданного вручную */
.lg-rt{font-size:11px;font-weight:700;letter-spacing:.02em}
.lg-rt.auto{color:var(--ink-3);font-weight:600}
td.dt-cclick:hover .lg-rt{color:var(--accent)}
.lg-ri.on{background:var(--accent-soft)}

/* ответы из анкеты: да / нет / не отвечали — три разных состояния */
.yn{font-weight:700;font-size:12px}
.yn.ok{color:var(--good)}
.yn.bad{color:var(--crit)}
.yn.no{color:var(--ink-3)}
.yn.none{color:var(--line-2)}
.doc-links{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.doc-l{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;padding:3px 8px;
  border:1px solid var(--line-2);border-radius:7px;background:var(--surface)}
.doc-l:hover{border-color:var(--accent);background:var(--accent-soft)}

/* скелет таблицы: появляется на первом кадре, до загрузки данных — вместо серой
   надписи «Загрузка…», которую пользователи читали как «зависло» и жали F5 */
.dt-skel{position:relative;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius);padding:10px 12px 14px;box-shadow:var(--shadow);overflow:hidden}
.dt-skel .sk-bar,.dt-skel .sk-head,.dt-skel .sk-row{border-radius:6px;
  background:linear-gradient(90deg,var(--surface-2) 25%,var(--surface-3) 37%,var(--surface-2) 63%);
  background-size:400% 100%;animation:skwave 1.4s ease-in-out infinite}
.dt-skel .sk-bar{height:27px;width:min(420px,60%);margin-bottom:11px}
.dt-skel .sk-head{height:22px;margin-bottom:6px;opacity:.85}
.dt-skel .sk-row{height:22px;margin-bottom:4px;opacity:.55}
.dt-skel .sk-row:nth-child(2n){opacity:.42}
.dt-skel .sk-note{display:block;margin-top:10px;font-size:11.5px;color:var(--ink-3)}
@keyframes skwave{0%{background-position:100% 0}100%{background-position:0 0}}
@media (prefers-reduced-motion:reduce){.dt-skel .sk-bar,.dt-skel .sk-head,.dt-skel .sk-row{animation:none}}

/* ручная категория: точка рядом с чипом */
.cat-man{margin-left:4px;color:var(--accent);font-size:10px;vertical-align:1px}
.cat-menu{width:236px;padding:5px}
.cat-menu .it{padding:5px 7px;border-radius:7px;cursor:pointer}
.cat-menu .it:hover{background:var(--surface-2)}
.cat-menu .it.on{background:var(--accent-soft)}
.cat-menu .it.rm{margin-top:4px;border-top:1px solid var(--line);padding-top:7px;
  font-size:11.5px;color:var(--ink-2)}
/* ── Меню выбора коллектива (из справочника, значения — чипы) ─────────────── */
.coll-menu{width:272px;padding:6px}
.coll-menu .srow{padding:0 2px 6px}
.coll-menu .coll-q{width:100%;padding:6px 9px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface);font:inherit;font-size:12.5px}
.coll-menu .coll-list{max-height:300px;overflow:auto}
.coll-menu .coll-list .it{padding:4px 6px;border-radius:7px;cursor:pointer}
.coll-menu .coll-list .it:hover{background:var(--surface-2)}
.coll-menu .coll-list .it.on{background:var(--accent-soft)}
.coll-menu .it.new{color:var(--accent-2);font-weight:600;font-size:12px}
.coll-menu .coll-empty{padding:6px 8px;font-size:11.5px}
.coll-chip{max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}
.coll-menu .coll-chip{max-width:236px}
.coll-chip.is-imp{opacity:.85}
.coll-pick:hover{color:var(--accent-2)}
/* доступ сопровождающих: логин/пароль с кнопкой «Копировать» */
.cn-cred{display:flex;gap:6px;align-items:center;margin-top:4px}
.cn-cred input{flex:1;min-width:0;padding:7px 10px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface-2);font:inherit;font-size:13px;font-variant-numeric:tabular-nums}
.cn-cred .btn{flex:0 0 auto}
.cn-actbtn{padding:3px 10px;font-size:11.5px}
/* доказательство отправки письма — видно раньше логина с паролем */
.cn-proof{margin:0 0 12px;padding:9px 11px;border-radius:9px;font-size:13px;line-height:1.35}
.cn-proof.ok{background:var(--good-soft);color:var(--good)}
.cn-proof.bad{background:var(--crit-soft);color:var(--crit)}
.cn-proof .muted{color:inherit;opacity:.72}
/* ── Тройки делегаций (вкладка расписания) ─────────────────────────────── */
.tr3-wrap{display:flex;gap:14px;align-items:flex-start}
.tr3-left{flex:0 0 260px;position:sticky;top:8px;border:1px solid var(--line);border-radius:11px;
  background:var(--surface);overflow:hidden;max-height:calc(100vh - 120px);display:flex;flex-direction:column}
.tr3-lh{display:flex;align-items:center;gap:6px;padding:8px;border-bottom:1px solid var(--line)}
.tr3-lh input{flex:1;min-width:0;padding:6px 9px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface-2);font:inherit;font-size:12.5px}
.tr3-llist{overflow:auto;padding:4px}
.tr3-ghead{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:7px 7px 3px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;
  color:var(--ink-3);position:sticky;top:0;background:var(--surface);z-index:1}
.tr3-ghead:first-child{padding-top:2px}
.tr3-ghead span{font-variant-numeric:tabular-nums}
.tr3-di{display:flex;align-items:center;gap:7px;padding:5px 7px;border-radius:8px;cursor:pointer;font-size:12px}
.tr3-di:hover{background:var(--surface-2)}
.tr3-di i{width:9px;height:9px;border-radius:3px;flex:0 0 auto}
.tr3-di b{font-weight:500;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tr3-di.sat{box-shadow:inset 3px 0 0 var(--warn)}
.tr3-sat{font-size:8px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--warn);
  border:1px solid var(--warn);border-radius:20px;padding:0 5px;line-height:1.6;flex:0 0 auto}
.tr3-cards{flex:1 1 auto;min-width:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;align-content:start}
.tr3-card{border:1px solid var(--line-2);border-radius:12px;background:var(--surface);padding:10px 12px;
  display:flex;flex-direction:column;gap:8px;cursor:pointer;transition:box-shadow .12s,border-color .12s}
.tr3-card:hover{box-shadow:0 2px 8px rgba(0,0,0,.07)}
.tr3-card.on{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.tr3-ch{display:flex;align-items:center;gap:8px}
.tr3-nm{font-size:13px;font-weight:600;cursor:text}
.tr3-nm:hover{text-decoration:underline dotted}
.tr3-cnt{font-size:10px;font-weight:700;color:var(--ink-3);background:var(--surface-2);border:1px solid var(--line-2);border-radius:20px;padding:0 7px;line-height:1.7}
.tr3-cnt.ok{color:#2f9e6b;border-color:#7fc3a5;background:var(--good-soft)}
/* состав больше нормы — не запрет, но видно (норма зависит от категории) */
.tr3-cnt.over{color:var(--warn);border-color:#eddcbc;background:var(--warn-soft)}
.tr3-x{border:none;background:transparent;cursor:pointer;color:var(--ink-3);font-size:13px;line-height:1;padding:2px 4px;border-radius:6px}
.tr3-x:hover{background:var(--crit-soft);color:var(--crit)}
.tr3-x:hover{color:var(--crit);background:var(--crit-soft)}
.tr3-orgsel{width:100%;padding:5px 8px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface-2);font:inherit;font-size:12px}
.tr3-mem{display:flex;flex-wrap:wrap;gap:5px;min-height:24px}
.tr3-mc{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;padding:1px 4px 1px 8px;border:1px solid var(--line-2);border-radius:20px;background:var(--surface-2)}
.tr3-mc.sat{background:var(--warn-soft)}
.tr3-rm{cursor:pointer;font-style:normal;color:var(--ink-3);font-size:14px;line-height:1;padding:0 2px}
.tr3-rm:hover{color:var(--crit)}
.tr3-cf{font-size:11px}
@media (max-width:720px){.tr3-wrap{flex-direction:column}.tr3-left{flex-basis:auto;width:100%;position:static;max-height:300px}}
/* поиск по тройкам: подсветка карточки с найденной делегацией */
.tr3-card.has-hit{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.tr3-mc.hit{background:var(--accent);color:#fff;border-color:var(--accent)}
.tr3-mc.hit .muted{color:#fff;opacity:.85}
/* спутник в модалке «Кто в зале» */
.dg-drow.sat{box-shadow:inset 3px 0 0 var(--warn)}
.dg-sat{font-size:8px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--warn);
  border:1px solid var(--warn);border-radius:20px;padding:0 5px;line-height:1.6}
/* конфликт в сетке форума: те же люди в другом зале в это же время */
.pg-ev.pg-conflict{outline:1px dashed var(--crit);outline-offset:-2px}
.pg-ev.pg-conflict:hover{box-shadow:0 2px 8px rgba(0,0,0,.14)}
.pg-ev-cf{position:absolute;right:4px;bottom:3px;font:700 9px/13px var(--sans);
  padding:0 5px;border-radius:20px;background:var(--crit);color:#fff;letter-spacing:.01em}
/* вид «делегация × время»: строка-делегация, события в подполосах */
.pg-dhall{flex-direction:row;align-items:center;gap:6px;flex-wrap:wrap}
.pg-dhall b{font-size:11px;font-weight:600;color:var(--ink);text-transform:none;letter-spacing:0}
.pg-dhall.has-cf{background:var(--crit-soft)}
.pg-dsat{font-size:8px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--warn);
  border:1px solid var(--warn);border-radius:20px;padding:0 5px;line-height:1.6}
.pg-dcf{font-size:9px;font-weight:700;color:#fff;background:var(--crit);border-radius:20px;padding:0 6px;line-height:1.5}
.pg-dev{position:absolute;height:19px;overflow:hidden;cursor:pointer;display:flex;align-items:center;gap:5px;
  border:1px solid hsl(var(--evh),45%,72%);border-radius:6px;background:hsl(var(--evh),65%,94%);
  padding:1px 7px;font-size:10px;line-height:17px;white-space:nowrap;transition:box-shadow .12s}
.pg-dev:hover{box-shadow:0 2px 8px rgba(0,0,0,.14);z-index:3}
.pg-dev b{font-weight:700;color:hsl(var(--evh),45%,32%)}
.pg-dev-t{color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;min-width:0}
.pg-dev-n{flex:0 0 auto;margin-left:auto;font-size:9px;font-weight:600;color:var(--ink-3);font-variant-numeric:tabular-nums}
/* часть делегации (не все её люди в этом событии) — жёлтым */
.pg-dev.part{background:var(--warn-soft);border-color:var(--warn)}
.pg-dev.part b{color:var(--warn)}
/* конфликт (те же люди в другом зале в это же время) — тонкий пунктир */
.pg-dev.conflict{border:1px dashed var(--crit)}
.pg-dev.conflict b{color:var(--crit)}

/* ── Организаторы ─────────────────────────────────────────────────────────
   Карточка проще, чем у участника: фото и десяток полей, без секций —
   логистики и услуг у организатора нет. */
.org-lat{font-family:var(--mono);font-size:10.5px;letter-spacing:.02em;color:var(--ink-2)}
.org-modal{--lab:118px;max-width:min(720px,95vw)}
.org-modal .modal-body.org-body{display:grid;grid-template-columns:132px minmax(0,1fr);
  gap:14px;align-items:start;padding:14px 16px}
.org-photo{display:block;width:132px;height:176px;border-radius:10px;object-fit:cover;
  background:var(--surface-3);cursor:zoom-in}
.org-photo.ph-ini{display:flex;align-items:center;justify-content:center;cursor:default;
  font-size:38px;font-weight:600;color:#fff;letter-spacing:.02em}
.org-fields{min-width:0;display:flex;flex-direction:column;gap:1px}
.org-fields .pf-row{display:grid;grid-template-columns:var(--lab) minmax(0,1fr);gap:0 9px;
  align-items:baseline;padding:2px 0;font-size:11.5px;line-height:16px}
.org-fields .pf-l{font-size:11px;font-weight:400;color:var(--ink-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.org-fields .pf-v{min-width:0;font-size:11.5px;font-weight:500;color:var(--ink);
  overflow-wrap:break-word}
.org-fields .pf-v.em{color:var(--ink-3);font-weight:400}
/* редактируемое поле в карточке/форме организатора */
.org-fields .pf-in{min-width:0;width:100%;font-size:11.5px;line-height:16px;padding:3px 7px;
  border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--ink)}
.org-fields .pf-in:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
/* бейдж источника записи */
.pill.src-manual{background:var(--accent-soft);color:var(--accent)}
.pill.src-b24{background:var(--surface-3);color:var(--ink-3)}
@media (max-width:640px){
  .org-modal .modal-body.org-body{grid-template-columns:minmax(0,1fr)}
  .org-photo{margin:0 auto}
}
/* назначения сопровождающего в карточке организатора */
.cn-box{margin:0 16px 12px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;
  background:var(--surface-2)}
.cn-title{font-size:12px;font-weight:600;margin:0 0 8px;color:var(--ink)}
.cn-list{display:grid;grid-template-columns:1fr 1fr;gap:4px 10px;max-height:180px;overflow:auto;
  margin:0 0 10px;padding:2px}
.cn-opt{display:flex;align-items:flex-start;gap:7px;font-size:11.5px;line-height:1.35;cursor:pointer;
  margin:0;padding:3px 0}
.cn-opt-t{min-width:0}
.cn-access{font-size:11.5px;color:var(--ink-2);margin:0 0 8px}
.cn-actions{display:flex;flex-wrap:wrap;gap:8px}
.cn-cell-btn{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px;max-width:100%;
  margin:0;padding:2px 0;border:0;background:transparent;font:inherit;cursor:pointer;
  text-align:left;color:inherit}
.cn-cell-btn:hover{color:var(--accent)}
.cn-gchip{display:inline-block;padding:1px 6px;border-radius:5px;background:var(--accent-soft);
  color:var(--accent-2);font-size:10.5px;font-weight:600;line-height:16px}
.cn-login{font-family:var(--mono);font-size:10.5px;color:var(--ink-2)}
.pill.k-good{background:var(--good-soft);color:var(--good);border-color:transparent}
.cn-manage .cn-box{margin:12px 16px}
@media (max-width:640px){.cn-list{grid-template-columns:1fr}}
/* организация без регистраций — приглушённая плитка: она есть в справочнике,
   но людей пока нет; это не ошибка, а состояние «ждём анкеты» */
.cards .card.empty b,.cards .card.empty .n{color:var(--ink-3)}
.cards .card.empty{opacity:.72}

/* ── Встречающие организаторы ─────────────────────────────────────────────
   Свойство делегации, а не человека: чипы стоят в агрегатной строке.
   Автобусный чип выделен — по нему видно, кто попадёт в лист посадки. */
/* двое встречающих в узкой колонке помещаются только столбиком */
.meet-chip{display:block;margin:0 0 1px;padding:0 5px;border:1px solid var(--line-2);
  border-radius:20px;background:var(--surface);font-size:9.5px;line-height:14px;color:var(--ink-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.meet-chip.bus{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-2);font-weight:600}
.tr-meet{display:block;width:100%;text-align:left;white-space:normal}
.meet-modal{max-width:min(470px,94vw)}
.meet-modal .modal-body{padding:11px 13px}
.meet-q{width:100%;margin-bottom:7px;padding:5px 9px;border:1px solid var(--line-2);
  border-radius:8px;background:var(--surface);font:inherit;font-size:11.5px}
.meet-q:focus{outline:none;border-color:var(--accent)}
.meet-list{max-height:min(46vh,320px);overflow:auto;margin:0 -3px;padding:0 3px}
.meet-row{display:flex;align-items:center;gap:9px;padding:4px 7px;border:1px solid transparent;
  border-radius:8px}
.meet-row.on{border-color:var(--line);background:var(--surface-2)}
.meet-row:hover{background:var(--surface-2)}
.meet-pick{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:7px;font-size:11.5px;cursor:pointer}
.meet-bus{flex:0 0 auto;display:flex;align-items:center;gap:5px;font-size:11px;color:var(--ink-2);cursor:pointer}
.meet-bus.off{opacity:.4;cursor:default}

/* ТС в таблице проживания: код автобуса и время подачи под ним */
.veh-chip{display:inline-block;padding:0 7px;border:1px solid var(--accent);border-radius:20px;
  background:var(--accent-soft);color:var(--accent-2);font:600 10.5px/17px var(--sans);
  font-variant-numeric:tabular-nums}

/* ── Диалог выгрузки среза графика ────────────────────────────────────────
   Пустой блок = «берём всё»: так менеджеру не приходится отмечать все даты,
   когда нужен весь трек. Колонки — единственный блок с умолчанием. */
.ex-modal{max-width:min(880px,96vw)}
.ex-body{display:flex;flex-direction:column;gap:10px;padding:12px 14px}
.ex-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px}
.ex-sec{border:1px solid var(--line);border-radius:10px;padding:8px 10px;background:var(--surface)}
.ex-h{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;
  color:var(--ink-3);margin-bottom:5px}
.ex-h .linklike{font-size:10px;text-transform:none;letter-spacing:0}
.ex-list{max-height:196px;overflow-y:auto;overflow-x:hidden;display:block}
.ex-colgrid{max-height:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:2px 10px}
/* flex-shrink по умолчанию сжимал строки в колоночном флексе: сотня делегаций
   ужималась в 170px и блок выглядел пустым. Держим строки нерезиновыми. */
.ex-it{display:flex;align-items:center;gap:6px;min-height:21px;flex:0 0 auto;
  font-size:11.5px;line-height:1.35;cursor:pointer}
.ex-it>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ex-it input{flex:0 0 auto;margin:0}
.ex-sec-h{display:flex;align-items:center;gap:6px;margin-bottom:5px}
.ex-q{width:100%;margin-bottom:5px;padding:4px 8px;border:1px solid var(--line-2);
  border-radius:7px;background:var(--surface);font:inherit;font-size:11px}
.ex-q:focus{outline:none;border-color:var(--accent)}
.ex-cnt{margin-left:auto;font:500 9.5px/1 var(--sans);color:var(--ink-3);letter-spacing:0;
  text-transform:none}
.ex-it:hover{color:var(--accent-2)}
.ex-flags{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.ex-flags .ex-h{margin:0}

/* ── Рейсы: сигналы логистики ─────────────────────────────────────────────
   «нет рейса» — красный, потому что это дырка в плане; бледный вариант —
   пометка на всю делегацию, унаследованная человеком.
   «✎» — рейс уже меняли: по нему могли быть спланированы автобус и заезд. */
/* неполный рейс: нет даты, времени или места — планировать нечего */
.miss-b{display:inline-block;margin-left:5px;padding:0 6px;border:1px solid var(--crit);
  border-radius:20px;background:var(--crit-soft);color:var(--crit);
  font:600 9.5px/16px var(--sans);white-space:nowrap;vertical-align:1px}
tr.miss-row td{background:var(--crit-soft)}
tr.miss-row:hover td{background:var(--crit-soft)}
.fchg-b{display:inline-block;margin-left:5px;color:var(--warn);font-size:11px;cursor:help}
.fchg-b.man{color:var(--accent-2);font-weight:700}
.fl-main{font-variant-numeric:tabular-nums}
.fl-date{color:var(--ink-3);font-weight:600;font-variant-numeric:tabular-nums}
.fl-leg{display:flex;align-items:center;gap:4px;line-height:15px;font-size:11px;white-space:nowrap}
.fl-leg.out{color:var(--ink-2)}
/* зеркалим ТОЛЬКО иконку: раньше правило ловило первый span, а им был сам текст
   рейса — время и номер показывались задом наперёд */
.fl-ico{flex:0 0 auto;font-style:normal;opacity:.7;display:inline-block}
.fl-ico.out{transform:scaleX(-1)}
.fl-modal{max-width:min(460px,94vw)}
.fl-body{display:flex;flex-direction:column;gap:9px;padding:12px 14px}
.fl-track{display:flex;gap:14px;font-size:12px}
.fl-track label{display:flex;align-items:center;gap:6px;cursor:pointer}
.fl-all{display:flex;align-items:center;gap:7px;font-size:11.5px;padding:6px 8px;
  border:1px solid var(--line);border-radius:8px;background:var(--surface-2);cursor:pointer}
.fl-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
/* способ проезда — на всю ширину: он один на обе ноги рейса */
.fl-grid label.fl-wide{grid-column:1/-1}
.fl-grid label{display:flex;flex-direction:column;gap:3px;font-size:10.5px;color:var(--ink-3)}
.fl-grid input,.fl-grid select{padding:5px 9px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface);font:inherit;font-size:12px;color:var(--ink)}
.fl-grid input:focus,.fl-grid select:focus{outline:none;border-color:var(--accent)}

/* График встреч: у каждой площадки своя таблица, поэтому ширины задаются
   colgroup, а раскладка фиксируется — иначе колонки разъезжаются между блоками.
   Вертикальные линии: глазом ведёшь по строке через полтора десятка колонок. */
.tr-tbl{table-layout:fixed;width:100%;min-width:1784px;font-size:11px}
/* На узком экране колонки НЕ сжимаются: min-width включает горизонтальную
   прокрутку (см. .tr-ven .dt-wrap). Раньше таблица ужималась до ширины окна, и
   «Микроавтобус» превращался в «Микроавтоб…», а фамилия водителя — в «Ушаков
   Борис Викторов…». Читаемость важнее того, чтобы всё влезло без прокрутки. */
.tr-ven .dt-wrap{overflow-x:auto}
.tr-tbl th,.tr-tbl td{border-right:1px solid var(--line);overflow:hidden;text-overflow:ellipsis;
  padding:2px 5px;line-height:1.25}
/* Первые три колонки закреплены: при прокрутке вправо видно, ЧЬЯ это строка —
   без них через полтора десятка колонок теряешь и делегацию, и фамилию. */
.tr-tbl th:nth-child(1),.tr-tbl td:nth-child(1){position:sticky;left:0;z-index:2}
.tr-tbl th:nth-child(2),.tr-tbl td:nth-child(2){position:sticky;left:44px;z-index:2}
.tr-tbl th:nth-child(3),.tr-tbl td:nth-child(3){position:sticky;left:156px;z-index:2;
  box-shadow:1px 0 0 var(--line-2)}
.tr-tbl thead th:nth-child(-n+3){z-index:3;background:#d6ebe8}
/* Закреплённой ячейке нужен НЕПРОЗРАЧНЫЙ фон, иначе под ней просвечивают
   уезжающие колонки. Цвета повторяют состояния строки — иначе при прокрутке
   вправо жёлтая «без трансфера» или выделение обрывались бы на третьей колонке.
   Порядок как в правилах строк выше: «без трансфера» перекрывает и спутника,
   и выделение. */
.tr-tbl tbody tr.tr-mem>td:nth-child(-n+3){background:var(--surface)}
.tr-tbl tbody tr.tr-drow>td:nth-child(-n+3){background:var(--surface-3)}
.tr-tbl tbody tr.tr-drow:hover>td:nth-child(-n+3){background:var(--line-2)}
.tr-tbl tbody tr.tr-drow.tr-sat>td:nth-child(-n+3){background:var(--warn-soft)}
.tr-tbl tbody tr.tr-mem.sel>td:nth-child(-n+3){background:var(--accent-soft)}
.tr-tbl tbody tr.tr-mem.tr-nodue>td:nth-child(-n+3),
.tr-tbl tbody tr.tr-drow.tr-nodue>td:nth-child(-n+3){background:#fdf6cf}
.tr-tbl tbody tr.tr-mem.tr-nodue:hover>td:nth-child(-n+3),
.tr-tbl tbody tr.tr-drow.tr-nodue:hover>td:nth-child(-n+3){background:#faeeb0}
/* Текстовые колонки переносим по словам, а не режем многоточием: название
   делегации, латиница, площадки, чипы встречающих и «фамилия · госномер»
   бывают длиннее любой разумной ширины, а строка вырасти может. */
table.dt.tr-tbl td:nth-child(2),table.dt.tr-tbl td:nth-child(3),
table.dt.tr-tbl td:nth-child(4),table.dt.tr-tbl td:nth-child(7),
table.dt.tr-tbl td:nth-child(8),table.dt.tr-tbl td:nth-child(9),
table.dt.tr-tbl td:nth-child(10),table.dt.tr-tbl td:nth-child(11),
table.dt.tr-tbl td:nth-child(12),table.dt.tr-tbl td:nth-child(16){white-space:normal}
/* чип категории — единственное, что не переносится само: «Лига Юных
   Журналистов» и «Москва (департаменты)» шире колонки в любом раскладе */
.tr-tbl td:nth-child(2) .pill{white-space:normal;line-height:14px}
.tr-tbl th{font-size:9px;letter-spacing:.02em;padding:3px 5px}
.tr-tbl .nm-ru,.tr-tbl .lat-name{font-size:9.5px}
.tr-tbl .pill,.tr-tbl .chip{font-size:9.5px;padding:0 5px;line-height:15px}
.tr-tbl .tr-asg,.tr-tbl .tr-due,.tr-tbl .meet-chip,.tr-tbl .miss-b{font-size:9px;line-height:14px}
.tr-tbl input[type=checkbox]{width:13px;height:13px}
.tr-tbl th:last-child,.tr-tbl td:last-child{border-right:0}
.tr-tbl td.tr-nm{white-space:normal}

/* Сегментированный переключатель: две ноги рейса — это режим окна, а не выбор
   из списка; радиокнопки читались как «отметьте нужное». */
.seg{display:inline-flex;padding:2px;border:1px solid var(--line-2);border-radius:9px;
  background:var(--surface-2);gap:2px}
.seg-b{padding:4px 13px;border:0;border-radius:7px;background:none;cursor:pointer;
  font:inherit;font-size:11.5px;font-weight:500;color:var(--ink-2);transition:background .12s,color .12s}
.seg-b:hover{color:var(--ink)}
.seg-b.on{background:var(--surface);color:var(--accent-2);font-weight:600;
  box-shadow:0 1px 2px rgba(0,0,0,.06)}
.fl-track{margin-bottom:2px}

/* ── Расписание программы ────────────────────────────────────────────────
   Полоса «не пристроены» — главный сигнал модуля. Мест во всех залах 1565
   при 1723 детях, поэтому «свободные места» мало о чём говорят, а «в 14:30
   никуда не записаны 545 человек» говорит обо всём. */
.pg-seats{width:70px;padding:3px 7px;border:1px solid var(--line-2);border-radius:7px;
  background:var(--surface);font:inherit;font-size:11.5px;text-align:right}
.pg-seats:focus{outline:none;border-color:var(--accent)}

/* ── Расписание: сетка «зал × время» ─────────────────────────────────────
   Полосы позиционируются абсолютно от левого края дорожки: время лежит в
   минутах, поэтому left и width считаются арифметикой без работы с датами.
   Колонка залов липкая — при прокрутке вправо видно, чья это строка. */
.pg-gantt-wrap{overflow-x:auto;overflow-y:visible;border:1px solid var(--line);
  border-radius:10px;background:var(--surface)}
.pg-gantt{min-width:max-content;font-size:12px}
.pg-row{display:flex;align-items:stretch;border-bottom:1px solid #b6c0bd}
.pg-row:last-child{border-bottom:0}
/* Колонка залов отделена жирнее остальных линий: это граница «кто» и «когда» */
.pg-hall{position:sticky;left:0;z-index:2;flex:0 0 168px;padding:5px 10px;
  background:var(--surface-2);border-right:2px solid var(--line-2);
  font-size:11.5px;font-weight:600;line-height:1.22;display:flex;
  flex-direction:column;justify-content:center}
.pg-seats-n{font-weight:400;font-size:10px;color:var(--ink-3)}
/* Часовая сетка — фоном полосы: шаг приходит из JS (--pghour), поэтому линии
   совпадают с линейкой и автоматически появляются у каждого нового зала.
   Тонкая линия внутри часа помогает попасть глазом в получас. */
.pg-lane{position:relative;min-height:58px;flex:0 0 auto;
  background-image:
    repeating-linear-gradient(to right,#b6c0bd 0 2px,transparent 2px var(--pghour,120px)),
    repeating-linear-gradient(to right,var(--line) 0 1px,transparent 1px calc(var(--pghour,120px) / 2))}
.pg-ruler .pg-lane{min-height:24px}
.pg-ruler .pg-hall{background:var(--surface);min-height:24px}
/* линейка — шапка, а не ещё один зал: отделяем её заметнее */
.pg-ruler{border-bottom-width:2px}
.pg-h{position:absolute;top:6px;font:600 11px/1 var(--sans);color:var(--ink-2);
  letter-spacing:.02em;padding-left:5px}
.pg-all .pg-hall,.pg-day .pg-hall,.pg-nohall .pg-hall,.pg-shuttles .pg-hall{font-size:10.5px;
  letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3)}
.pg-all .pg-lane,.pg-day .pg-lane,.pg-shuttles .pg-lane{min-height:40px}
/* адаптив: на узких экранах колонка залов уже, шрифты компактнее — таймлайн
   остаётся со своим горизонтальным скроллом, но «шапка кто» не съедает экран */
@media (max-width:640px){
  .pg-hall{flex-basis:120px;padding:4px 7px;font-size:10.5px}
  .pg-all .pg-hall,.pg-day .pg-hall,.pg-nohall .pg-hall,.pg-shuttles .pg-hall{font-size:9.5px}
}

.pg-ev{position:absolute;top:3px;bottom:3px;overflow:hidden;cursor:pointer;
  border:1px solid hsl(var(--evh),45%,72%);border-radius:7px;
  background:hsl(var(--evh),65%,95%);padding:3px 7px 3px 10px;
  display:flex;flex-direction:column;gap:1px;justify-content:flex-start;
  transition:box-shadow .12s,transform .06s}
.pg-ev:hover{box-shadow:0 2px 8px rgba(0,0,0,.14);z-index:3}
.pg-ev:active{transform:translateY(.5px)}
.pg-ev-bar{position:absolute;left:0;top:0;bottom:0;width:3px;
  background:hsl(var(--evh),50%,45%)}
/* Название переносим на две строки, а не режем многоточием с первого слова:
   в узкой плитке «Театр vs кино: секреты …» не читается вовсе.
   max-height по числу строк обязателен: без него обрезанная строка показывается
   наполовину и текст выглядит «съеденным». */
.pg-ev b{font-size:11px;font-weight:600;line-height:1.2;color:var(--ink);
  overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;
  -webkit-line-clamp:2;line-clamp:2;max-height:2.4em;word-break:break-word}
.pg-ev.has-cap b{padding-right:38px}
.pg-ev-t{font-style:normal;font-weight:700;color:hsl(var(--evh),45%,34%);
  font-variant-numeric:tabular-nums;margin-right:2px}
.pg-ev-s{font-size:10px;line-height:1.2;max-height:1.2em;color:var(--ink-2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 0 auto}
.pg-ev-c{position:absolute;right:4px;top:3px;font:600 10px/14px var(--sans);
  padding:0 6px;border-radius:20px;background:var(--surface);color:var(--ink-2);
  border:1px solid var(--line-2);font-variant-numeric:tabular-nums}
.pg-ev-c.over{background:var(--crit-soft);color:var(--crit);border-color:var(--crit)}
.pg-ev-fill{position:absolute;left:0;bottom:0;height:2px;background:hsl(var(--evh),50%,45%);
  opacity:.55}
.pg-ev.prelim{border-style:dashed;background:repeating-linear-gradient(45deg,
  hsl(var(--evh),65%,96%) 0 6px,hsl(var(--evh),55%,92%) 6px 12px)}
.pg-ev.off{opacity:.45;text-decoration:line-through}
/* Статус события: эмодзи в названии и цвет полосы слева. Фон плитки остаётся
   по направлению — иначе сетка перекрасилась бы в один цвет и перестала читаться
   по треку. Полоса шире обычного (4px), чтобы цвет был виден на узкой плитке. */
.pg-ev-st{font-style:normal;font-size:9.5px;margin-right:3px;vertical-align:1px;
  line-height:1;letter-spacing:0}
.pg-ev .pg-ev-bar{width:4px}
.pg-ev.pg-s-confirmed .pg-ev-bar{background:#2f9e6b}
.pg-ev.pg-s-preliminary .pg-ev-bar{background:var(--warn)}
.pg-ev.pg-s-draft .pg-ev-bar{background:var(--ink-3)}
.pg-ev.pg-s-cancelled .pg-ev-bar{background:var(--crit)}
/* Черновик приглушён: подтверждённое должно выделяться на его фоне, а не наоборот. */
.pg-ev.pg-s-draft{border-style:dotted;border-color:var(--line-2)}
.pg-ev.pg-s-draft b{color:var(--ink-2)}
.pg-ev.pg-s-confirmed{border-color:#7fc3a5}
/* легенда статусов в панели */
.pg-leg{display:inline-flex;gap:9px;flex-wrap:wrap;vertical-align:middle}
.pg-l{font-style:normal;font-size:10px;color:var(--ink-3);display:inline-flex;
  align-items:center;gap:3px;white-space:nowrap}
.pg-l::before{content:"";width:3px;height:10px;border-radius:2px;background:var(--ink-3)}
.pg-l.pg-s-confirmed::before{background:#2f9e6b}
.pg-l.pg-s-preliminary::before{background:var(--warn)}
.pg-l.pg-s-cancelled::before{background:var(--crit)}
.pg-ev.over{border-color:var(--crit)}
.pg-all .pg-ev{background:var(--accent-soft);border-color:var(--accent)}
.pg-day .pg-ev{background:var(--surface-2)}
/* Городские трансферы: сетка их только показывает, поэтому полоса синяя, как
   логистика в ленте расписания, и визуально не смешивается с программой. */
.pg-shuttle{background:#eaf1fb;border:1px solid #6f9fd6;padding:4px 8px 4px 11px}
.pg-shuttle .pg-ev-bar{background:#3f7fd0;width:4px}
.pg-shuttle b{color:#153f74;font-size:12px}
.pg-shuttle .pg-ev-t{color:#153f74;font-size:12.5px}   /* время выезда — крупнее, синим */
.pg-shuttle .pg-ev-st{margin-right:3px}
/* маршрут на тайле — читаемый: крупнее и контрастнее, чем у залов */
.pg-shuttle .pg-ev-s{font-size:11px;color:#3a5273;font-weight:500}
.pg-ev-col{font-size:9.5px;font-weight:700;background:#fff;color:#22589c;
  border:1px solid #6f9fd6;border-radius:5px;padding:0 5px;margin-left:2px;vertical-align:middle}
.pg-shuttle .pg-ev-c{background:#fff;color:#22589c;border-color:#9fbfe4;font-weight:700}
/* Полосы дорожки трансферов — комфортная высота, чтобы две строки не сминались */
.pg-shuttles .pg-lane,.pg-shuttles-sub .pg-lane{min-height:46px}
/* Под-полосы — одна визуальная дорожка: убираем разделитель между полосами */
.pg-row.pg-shuttles:has(+ .pg-row.pg-shuttles-sub){border-bottom:0}
/* Спойлер дорожки трансферов */
.pg-shuttles-h{cursor:pointer;display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  align-content:center;user-select:none}
.pg-shuttles-h:hover{background:var(--line-2)}
.pg-caret{display:inline-block;color:var(--ink-3);font-size:10px;transition:transform .15s;flex:0 0 auto}
.pg-caret.open{transform:rotate(90deg)}
.pg-shuttles-collapsed .pg-lane{min-height:0}
.pg-shuttles-collapsed{opacity:.9}

/* Кто в зале: дерево делегация → направление → человек */
.dg-modal{max-width:min(1080px,97vw);width:1080px}
.dg-hsub{font-weight:400;color:var(--ink-3);font-size:13px}
.dg-head{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 15px 0;
  font-size:11.5px}
.dg-tools{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:9px 15px}
.dg-q{flex:1 1 220px;padding:5px 9px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface);font:inherit;font-size:12px;color:var(--ink)}
.dg-q:focus{outline:none;border-color:var(--accent)}
.dg-f{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--ink-2);
  white-space:nowrap}
.dg-list{max-height:min(72vh,760px);overflow:auto;padding:0 15px 12px}
.dg-list.busy{opacity:.6;pointer-events:none}

/* Строки трёх уровней. Отступ слева задаёт вложенность, галочка на каждом. */
.dg-drow,.dg-grow{display:flex;align-items:center;gap:8px;padding:5px 8px;
  border-radius:7px;cursor:pointer;border:1px solid transparent;font-size:11.5px}
.dg-drow{font-weight:600;background:var(--surface-2);margin-top:4px}
.dg-drow:hover,.dg-grow:hover{background:var(--accent-soft)}
.dg-drow.on,.dg-grow.on{background:var(--accent-soft);border-color:var(--accent)}
.dg-drow.part,.dg-grow.part{border-color:var(--warn)}
.dg-gl{padding-left:18px}
.dg-pl{padding-left:36px}
.dg-caret{display:inline-block;width:10px;font-size:9px;color:var(--ink-3);
  transition:transform .12s}
.dg-caret.open{transform:rotate(90deg)}
.dg-code{font-size:10px;font-weight:400;color:var(--ink-3);letter-spacing:.03em}
.dg-n{margin-left:auto;font-variant-numeric:tabular-nums;font-weight:400;
  color:var(--ink-3);font-size:10.5px}

/* Человек: ФИО, отметка конкурса и выпадашка типа — всё в одну строку */
.dg-p{display:flex;align-items:center;gap:8px;padding:2px 8px;font-size:11px;
  border-radius:6px}
.dg-p:hover{background:var(--surface-2)}
.dg-p.on{background:var(--accent-soft)}
/* занят в это же время в другом зале — красная пометка (кого не сажать) */
.dg-p.busy{background:var(--crit-soft)}
.dg-p.busy .dg-fio{color:var(--crit)}
.dg-busy{flex:0 0 auto;font-size:9.5px;color:var(--crit);background:var(--surface);
  border:1px solid var(--crit);border-radius:20px;padding:0 6px;line-height:1.5;
  max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dg-busy-n{flex:0 0 auto;font-size:9.5px;font-weight:700;color:#fff;background:var(--crit);
  border-radius:20px;padding:0 6px;line-height:1.5;margin-left:6px}
.dg-fio{flex:1 1 auto;min-width:120px;color:var(--ink)}
.dg-c{flex:0 0 auto;font-size:9.5px}
.dg-tag{flex:0 0 auto;font-size:9.5px;color:var(--ink-3)}
.dg-kind{flex:0 0 auto;width:168px;padding:2px 6px;border:1px solid var(--line-2);
  border-radius:6px;background:var(--surface);font:inherit;font-size:10.5px;
  color:var(--ink)}
.dg-kind:focus{outline:none;border-color:var(--accent)}
.dg-kind-ro{flex:0 0 auto;width:168px;font-size:10.5px;color:var(--ink-3)}

.pg-modal{max-width:min(720px,95vw)}
.pg-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:9px;
  padding:13px 15px}
.pg-form label{display:flex;flex-direction:column;gap:3px;font-size:11px;color:var(--ink-3)}
.pg-form label.wide{grid-column:1/-1}
.pg-form input,.pg-form select{padding:5px 9px;border:1px solid var(--line-2);
  border-radius:8px;background:var(--surface);font:inherit;font-size:12px;color:var(--ink)}
.pg-form input:focus,.pg-form select:focus{outline:none;border-color:var(--accent)}

/* ── Тэги расписания: карточка тэга со своими типами ── */
.st-wrap{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:11px}
.st-card{border:1px solid var(--line);border-radius:10px;padding:10px 12px;
  background:var(--surface)}
.st-card.off{opacity:.55}
.st-h{display:flex;align-items:center;gap:8px;font-size:12.5px}
.st-h b{font-weight:600;color:var(--ink)}
.st-dot{width:10px;height:10px;border-radius:50%;flex:0 0 auto}
.st-code{font-size:10px;color:var(--ink-3);letter-spacing:.04em}
.st-on{display:flex;align-items:center;gap:4px;font-size:10.5px;color:var(--ink-3);
  white-space:nowrap}
.st-note{margin:5px 0 0;font-size:10.5px;color:var(--ink-3);line-height:1.4}
.st-types{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}
.st-t{display:inline-flex;align-items:center;gap:5px;padding:2px 6px 2px 9px;
  border:1px solid var(--line-2);border-radius:20px;background:var(--surface-2);
  font-size:11px;color:var(--ink)}
.st-t.off{opacity:.45;text-decoration:line-through}
.st-t i{font-style:normal;font-size:9px;color:var(--ink-3);cursor:help}
.st-x{cursor:pointer;font-size:10px;color:var(--ink-3);font-weight:400}
.st-x:hover{color:var(--crit)}
.st-x:hover{color:var(--crit)}
.st-add{display:flex;gap:6px;margin-top:9px}
.st-add input{flex:1 1 auto;min-width:0;padding:4px 8px;border:1px solid var(--line-2);
  border-radius:8px;background:var(--surface);font:inherit;font-size:11px;color:var(--ink)}
.st-add input:focus{outline:none;border-color:var(--accent)}
/* Типы, собранные из расписания: не редактируются, но видно частоту */
.st-t.der{background:var(--surface);border-style:dashed;padding-right:4px}
.st-t.der.unk{border-color:var(--warn)}
.st-c{font-weight:600;font-size:9.5px;color:var(--ink-3);background:var(--surface-2);
  border-radius:20px;padding:0 5px}
.st-warn{color:var(--crit);font-weight:600}

/* ── Расписание делегаций: лента строк маршрута ── */
.ds-sel{padding:4px 9px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface);font:inherit;font-size:11.5px;color:var(--ink);max-width:280px}
.ds-sel:focus{outline:none;border-color:var(--accent)}
/* Тумблеры тэгов: цвет берётся из справочника, выключенный — бледный */
.ds-tags{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
.ds-tg{padding:3px 9px;border:1px solid var(--line-2);border-radius:20px;
  background:var(--surface);font:inherit;font-size:10.5px;color:var(--ink-3);
  cursor:pointer;transition:background .12s,border-color .12s,color .12s}
.ds-tg:hover{border-color:var(--tc)}
.ds-tg.on{background:color-mix(in srgb,var(--tc) 12%,transparent);
  border-color:var(--tc);color:var(--ink)}
.ds-tag{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--ink)}
.ds-tag::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--tc);
  flex:0 0 auto}
/* «Кто идёт»: имена читаются как текст, «+N» — приглушённо, чтобы не спорить */
.ds-who-n{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-more{font-style:normal;color:var(--ink-3)}
.ds-who-c{color:var(--ink-2)}
.ds-kids{font-style:normal;font-size:10.5px;color:var(--ink-3);margin-left:3px}
.ds-who{font-style:normal;font-size:11px;margin-left:4px;cursor:pointer;opacity:.7}
td.dt-cclick:hover .ds-who{opacity:1}
/* Модалка «Состав форума»: все события делегации с поимённым составом */
.rs-modal{width:min(720px,94vw)}
.rs-ev{border:1px solid var(--line);border-radius:10px;margin:0 0 8px;overflow:hidden}
.rs-ev.dim{opacity:.4}
.rs-ev-h{display:flex;align-items:baseline;gap:8px;padding:7px 10px;background:var(--surface-2);
  border-bottom:1px solid var(--line);flex-wrap:wrap}
.rs-ev-t{font-variant-numeric:tabular-nums;font-weight:700;font-size:13px;color:var(--ink);flex:0 0 auto}
.rs-ev-title{font-size:13px;font-weight:600;color:var(--ink);overflow-wrap:anywhere}
.rs-ev-hall{font-size:11.5px}
.rs-ev-n{margin-left:auto;font-size:11px;font-weight:600;color:var(--ink-2);
  white-space:nowrap;flex:0 0 auto}
.rs-ev-b{padding:8px 10px;display:flex;flex-direction:column;gap:7px}
.rs-ev-b.rs-empty{color:var(--ink-3);font-size:12px;padding:8px 10px}
.rs-dir{display:flex;gap:8px;align-items:baseline}
.rs-dir-l{flex:0 0 128px;font-size:11px;font-weight:600;color:var(--ink-2);text-align:right;
  padding-top:2px}
.rs-dir.esc .rs-dir-l{color:var(--accent-2)}
.rs-dir-p{display:flex;flex-wrap:wrap;gap:4px;flex:1;min-width:0}
.rs-p{font-size:11.5px;padding:1px 8px;border-radius:999px;background:var(--surface-2);
  border:1px solid var(--line);color:var(--ink);white-space:nowrap}
.rs-p.cx{background:var(--accent-soft);border-color:transparent;color:var(--accent-2)}
.rs-p.dim{opacity:.25}
.rs-p i{font-style:normal}
@media (max-width:560px){.rs-dir{flex-direction:column;gap:2px}
  .rs-dir-l{flex:none;text-align:left}}
.ds-gap{display:block;font-style:normal;font-size:9.5px;color:var(--crit);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Редактор ячейки: оверлей в body, чтобы не обрезался прокруткой таблицы */
.ds-pop{position:fixed;z-index:60;background:var(--surface);border:1px solid var(--line-2);
  border-radius:10px;box-shadow:0 8px 28px rgba(0,0,0,.16);padding:8px;
  display:flex;flex-direction:column;gap:6px}
.ds-in{padding:5px 9px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface);font:inherit;font-size:12px;color:var(--ink);width:100%}
.ds-in:focus{outline:none;border-color:var(--accent)}
.ds-list{max-height:230px;overflow:auto;border:1px solid var(--line);border-radius:8px}
.ds-li{padding:4px 8px;font-size:11.5px;cursor:pointer;color:var(--ink)}
.ds-li:hover{background:var(--surface-2)}
.ds-li.on{background:var(--accent-soft);font-weight:600}
.ds-reset{font-size:10.5px}
.ds-edited{font-style:normal;color:var(--accent);margin-left:4px;font-weight:700}
.ds-man{font-style:normal;color:var(--ink-3);margin-left:5px;font-size:10px}
/* Откуда строка. Своё (заведённое в ленте) выделяем — только его и удаляют. */
.ds-src{font-size:10.5px;color:var(--ink-2);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;display:inline-block;max-width:100%}
.ds-src.own{color:var(--accent-2);font-weight:600}
/* Ссылка на строку в её модуле: рейс среди сорока руками не ищут. */
a.ds-go{color:var(--accent-2);text-decoration:none;cursor:pointer}
a.ds-go:hover{text-decoration:underline}
.ds-by{font-style:normal;display:block;font-size:9.5px;color:var(--ink-3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-del{font-size:10.5px;font-weight:600;color:var(--crit);cursor:pointer;
  white-space:nowrap}
.ds-del:hover{text-decoration:underline}
.ds-lock{font-style:normal;color:var(--ink-3);opacity:.55;cursor:help}

/* Диалог новой строки: форма слева, выбор делегаций справа */
.ds-modal{max-width:min(900px,96vw)}
.ds-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:9px;
  margin-bottom:12px}
.ds-form label{display:flex;flex-direction:column;gap:3px;font-size:11px;color:var(--ink-3)}
.ds-form label.wide{grid-column:1/-1}
.ds-form input,.ds-form select{padding:5px 9px;border:1px solid var(--line-2);
  border-radius:8px;background:var(--surface);font:inherit;font-size:12px;color:var(--ink)}
.ds-form input:focus,.ds-form select:focus{outline:none;border-color:var(--accent)}
.ds-pick{border-top:1px solid var(--line);padding-top:10px}
.ds-pick>b{font-size:11.5px}
.ds-pick-note{font-size:11.5px;margin:6px 0 0;padding:5px 9px;border-radius:8px;
  background:var(--accent-soft);color:var(--accent-2)}
/* Что получится из выбранного тэга: рейс в другом модуле или строка ленты */
.ds-tag-note{font-size:11.5px;line-height:1.4;padding:6px 9px;border-radius:8px;
  background:var(--warn-soft);color:#8a5f12}
.ds-pick-tools{display:flex;gap:6px;align-items:center;margin:7px 0}
.ds-pick-tools .ds-in{flex:1 1 auto}
.ds-pick-list{max-height:230px;overflow:auto;display:grid;
  grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:2px}
.ds-pk{display:flex;align-items:center;gap:6px;padding:3px 6px;border-radius:6px;
  font-size:11.5px;cursor:pointer}
.ds-pk:hover{background:var(--surface-2)}
.ds-pk.sat{box-shadow:inset 3px 0 0 var(--warn)}
/* Питание: планы, сгруппированные по корпусам */
.ml-modal{max-width:min(900px,96vw)}
.ml-modal2{max-width:min(880px,96vw)}
.ml-list{margin-top:12px;max-height:min(58vh,520px);overflow:auto}
.ml-grp{border:1px solid var(--line);border-radius:10px;margin-bottom:10px;overflow:hidden}
.ml-grp-h{display:flex;align-items:center;gap:9px;padding:7px 11px;
  background:var(--surface-2);border-bottom:1px solid var(--line);font-size:12px}
.ml-grp-h .muted{margin-left:auto;font-size:10.5px}
.ml-plan{display:flex;align-items:center;gap:9px;padding:5px 11px;font-size:11.5px;
  border-bottom:1px solid var(--line);cursor:pointer}
.ml-plan:last-child{border-bottom:0}
.ml-plan:hover{background:var(--accent-soft)}
.ml-plan.off{opacity:.6}
.ml-day{font-weight:600;min-width:62px;color:var(--ink)}
.ml-meal{min-width:70px;color:var(--ink-2)}
.ml-time{min-width:96px;font-variant-numeric:tabular-nums;font-weight:600}
.ml-plan.off .ml-time{font-weight:400;color:var(--crit)}
.ml-dl{flex:1 1 auto;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.ml-x{border:0;background:none;cursor:pointer;color:var(--ink-3);font-size:11px;
  padding:2px 5px;border-radius:5px}
.ml-x:hover{background:var(--crit-soft);color:var(--crit)}
.ml-x:hover{background:var(--crit-soft);color:var(--crit)}
/* Предупреждение о переносе дня: жёлтой плашкой над списком делегаций, а не
   тостом после сохранения — прочитать его нужно ДО кнопки «Сохранить». */
.ml-warn{background:var(--warn-soft);color:var(--warn-ink);border-radius:8px;
  padding:8px 10px;margin-bottom:10px;font-size:11.5px;line-height:1.35}
.ml-warn b{color:inherit}
.ml-days{margin-bottom:10px}
.ml-days>b,.ml-pick-wrap>b{font-size:11.5px}
.ml-pick-wrap{border-top:1px solid var(--line);padding-top:10px}
.ml-pick-tools{display:flex;gap:6px;align-items:center;margin:7px 0;flex-wrap:wrap}
.ml-pick-tools .ds-in{flex:1 1 180px}
.ml-pick-tools select{padding:5px 9px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface);font:inherit;font-size:11.5px;color:var(--ink)}
.ml-pick{max-height:230px;overflow:auto;display:grid;
  grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:2px;margin-top:5px}
/* пикер делегаций, сгруппированный по тройкам */
.ml-pick.by-triple{display:block}
.mlg{margin-bottom:5px}
.mlg-h{display:flex;align-items:center;gap:7px;padding:5px 7px;border-radius:6px;font-size:11.5px;
  background:var(--surface-2);position:sticky;top:0;z-index:1;cursor:pointer}
.mlg-h.nogrp{cursor:default;color:var(--ink-3)}
.mlg-h .muted{margin-left:auto;font-size:10.5px}
.mlg-body{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:2px;padding:3px 0 4px 10px}

/* ---------- шапка карточки делегации ---------- */
.ds-head{border:1px solid var(--line);border-radius:10px;background:#fff;padding:12px 14px;margin:0 0 12px}
.ds-h-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ds-h-name{font-size:17px;font-weight:600;color:var(--ink)}
.ds-h-code{font-size:12px;font-weight:600;color:var(--muted);border:1px solid var(--line);border-radius:5px;padding:1px 6px;vertical-align:middle}
.ds-h-facts{display:flex;flex-wrap:wrap;gap:6px 18px;margin:10px 0 0}
.ds-f{display:flex;flex-direction:column;line-height:1.25}
.ds-f span{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.03em}
.ds-f b{font-size:14px;color:var(--ink);font-weight:600}
.ds-f.muted-f b{color:var(--muted);font-weight:500}
.ds-h-legs{display:flex;flex-wrap:wrap;gap:10px 24px;margin:12px 0 0;padding:10px 0 0;border-top:1px dashed var(--line)}
.ds-h-leg{min-width:280px;flex:1}
.ds-h-leg h4{margin:0 0 5px;font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
.ds-leg{font-size:13px;color:var(--ink);padding:2px 0}
.ds-leg b{font-weight:600}
.ds-leg span{color:var(--ink-2)}
.ds-leg em{font-style:normal;color:var(--muted);font-size:12px}
.ds-leg-f{font-style:normal;font-weight:600;color:var(--accent)}
.ds-leg.gap{color:var(--warn-ink,#92400e)}
.ds-leg-gap{font-size:11px;color:#92400e;background:#fef3c7;border-radius:4px;padding:0 5px}
.ds-leg-org{font-size:12px;color:var(--muted);margin-top:3px}

/* ---------- расписание: шапка с переключателем видов ---------- */
/* Скрытый вид обязан быть именно скрыт: таблица внутри него меряет ширину и
   высоту строки при сборке, и «почти скрытый» контейнер дал бы ей мусор. */
#scGridView[hidden],#scDelegView[hidden]{display:none}
.sc-head{display:flex;align-items:center;gap:14px;margin:0 0 12px;flex-wrap:wrap}
/* h2 больше не прямой потомок main, а размер задан правилом main>h2 — повторяем,
   иначе заголовок этой страницы крупнее, чем на всех остальных. */
.sc-head h2{margin:0;font-size:17px}

/* ---------- рассадка по местам ---------- */
/* Окно во весь экран: схема на 130 клеток в ширину, и каждый отданный ей пиксель
   это читаемость номера места. */
/* Общая .modal даёт padding 6vh и .modal-box max-height 86vh — для схемы на
   119 клеток в высоту это 15% экрана впустую, и «вместить» упиралось бы в пол. */
.sm-modal{padding:2vh 10px}
.sm-box{max-width:98vw;width:98vw;height:96vh;max-height:96vh;overflow:hidden;
  display:flex;flex-direction:column}
.sm-top{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.sm-top h3{margin:0;flex:0 1 auto}
.sm-zoom{display:flex;align-items:center;gap:6px;font-size:11px}
.sm-zoom input[type=range]{width:150px;accent-color:var(--accent)}
.sm-zb{min-width:26px;padding:2px 7px;font-size:13px;line-height:1}
.sm-wrap{display:flex;gap:12px;align-items:stretch;flex:1 1 auto;min-height:0;margin-top:8px}
.sm-side{flex:0 0 232px;display:flex;flex-direction:column;gap:7px;min-height:0}
.sm-list{flex:1 1 auto;overflow:auto;border:1px solid var(--line);border-radius:8px;
  background:var(--surface)}
.sm-d{display:flex;align-items:center;gap:7px;padding:4px 8px;font-size:11.5px;
  cursor:grab;border-bottom:1px solid var(--line);user-select:none}
.sm-d:active{cursor:grabbing}
.sm-d:hover{background:var(--surface-2)}
.sm-d.on{background:var(--surface-3);box-shadow:inset 3px 0 0 var(--accent)}
.sm-d i{width:10px;height:10px;border-radius:3px;flex:0 0 auto}
.sm-d b{font-weight:500;color:var(--ink);flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.sm-d span{font-size:10.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.sm-d span.part{color:var(--warn);font-weight:600}
.sm-d span.ok{color:#2f9e6b;font-weight:600}
.sm-d.done b{color:var(--ink-3)}
/* коллектив-спутник: янтарная левая полоса + бейдж (та же семантика --warn, что в списках) */
.sm-d.sat{box-shadow:inset 3px 0 0 var(--warn)}
.sm-d.sat.on{box-shadow:inset 3px 0 0 var(--accent)}
.sm-d .sm-sat{flex:0 0 auto;font-size:8px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  color:var(--warn);border:1px solid var(--warn);border-radius:20px;padding:0 5px;line-height:1.6;background:transparent}
.sm-mapwrap{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:6px}
/* Высота фиксирована и перенос запрещён: подсказка меняется на каждое движение
   мыши, и её перенос на вторую строку дёргал бы карту под ней. */
.sm-hint{font-size:11.5px;color:var(--ink-2);height:17px;line-height:17px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:0 0 auto}
.sm-hint b{color:var(--ink)}
.sm-at{color:var(--accent);font-weight:600}
.sm-warn{color:#92400e;background:#fef3c7;border-radius:4px;padding:0 6px}
.sm-leg{font-size:10.5px}
/* Карта — сетка исходной схемы: место стоит в своей клетке (grid-row/column),
   пустые клетки остаются проходами. Размер клетки задаёт масштаб. */
.sm-map{--smc:9px;flex:1 1 auto;display:grid;gap:1px;overflow:auto;padding:8px;
  border:1px solid var(--line);border-radius:8px;background:var(--surface-2);
  align-content:start;justify-content:start;user-select:none;touch-action:none}
.sm-s{border:1px solid var(--line-2);border-radius:2px;background:var(--surface);
  cursor:pointer;width:var(--smc);height:var(--smc);font-size:0;font-style:normal;
  display:flex;align-items:center;justify-content:center;color:var(--ink-3);
  overflow:hidden;line-height:1}
.sm-map.big .sm-s{font-size:calc(var(--smc) * .5);color:var(--ink-2)}
.sm-map.big .sm-s.has{color:#fff}
.sm-s:hover{outline:2px solid var(--accent);outline-offset:-1px;z-index:2}
.sm-s.sel{background:var(--accent)!important;border-color:var(--accent)!important;color:#fff}
/* Предпросмотр посадки: пунктир, чтобы отличать «ляжет сюда» от «уже занято». */
.sm-s.pre{background:var(--accent)!important;border:1px dashed #fff!important;color:#fff;
  box-shadow:0 0 0 1px var(--accent)}
.sm-rn{grid-column:span 1;font-size:max(7px,calc(var(--smc) * .55));font-weight:600;color:#0070c0;
  display:flex;align-items:center;justify-content:flex-end;padding-right:1px;
  line-height:1;overflow:visible;white-space:nowrap}
.sm-lab{font-style:normal;text-decoration:none;font-weight:700;color:var(--crit);
  font-size:max(8px,calc(var(--smc) * .8));letter-spacing:.03em;white-space:nowrap;
  align-self:end;line-height:1}
.sm-ghost{position:fixed;z-index:400;pointer-events:none;padding:3px 9px;border-radius:7px;
  border:1px solid;font-size:11.5px;font-weight:600;color:var(--ink);
  box-shadow:var(--shadow-lg)}
.sm-attach{padding:30px;text-align:center;color:var(--ink-2);font-size:12.5px}

/* ---------- доска «делегации → ресурс» ----------
   Городские трансферы: слева список делегаций, справа карточки автобусов, на
   которые их перетаскивают. Питание такой доски больше не занимает — потоки
   приёма пищи правятся в карточке события сетки (см. .ml-* ниже). */
.sh-wrap{display:flex;gap:12px;align-items:flex-start}
.sh-side{flex:0 0 236px;display:flex;flex-direction:column;gap:7px;position:sticky;top:8px}
.sh-list{overflow:auto;max-height:calc(100vh - 210px);border:1px solid var(--line);
  border-radius:8px;background:var(--surface)}
.sh-d{display:flex;align-items:center;gap:7px;padding:4px 8px;font-size:11.5px;
  cursor:grab;border-bottom:1px solid var(--line);user-select:none}
.sh-d:active{cursor:grabbing}
.sh-d:hover{background:var(--surface-2)}
.sh-d i{width:10px;height:10px;border-radius:3px;flex:0 0 auto}
.sh-d b{font-weight:500;color:var(--ink);flex:1 1 auto;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.sh-d span{font-size:10.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.sh-ghead{display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:8px 8px 3px;font-size:10.5px;font-weight:600;color:var(--ink-2);
  letter-spacing:.02em;position:sticky;top:0;background:var(--surface);z-index:1}
.sh-ghead span{font-weight:500;color:var(--ink-3);font-variant-numeric:tabular-nums}
.sh-ghead.none{color:var(--ink-3);font-weight:500}
.sh-ghead.plan{color:var(--accent)}
.sh-ghead.sat{color:var(--warn)}
.sh-ghead.corp{color:var(--ink-2);background:var(--surface-2)}
/* состав рейса «к распределению» — делегации, заведённые на рейс из ленты */
.sh-rd{box-shadow:inset 3px 0 0 var(--accent);background:var(--accent-soft, var(--surface-2))}
.sh-rd .sh-u-h b{color:var(--ink)}
.sh-rdx{margin-left:4px;flex:0 0 auto;border:none;background:none;cursor:pointer;
  color:var(--ink-3);font-size:12px;line-height:1;padding:2px 4px;border-radius:4px}
.sh-rdx:hover{color:var(--crit);background:var(--surface-3)}
/* 🚌 на карточке — посадить, выбрав ТС списком: пальцем тянуть нечего, да и при
   полутора десятках автобусов выбрать быстрее, чем целиться. */
.sh-seatb{margin-left:4px;flex:0 0 auto;border:none;background:none;cursor:pointer;
  font-size:12px;line-height:1;padding:2px 4px;border-radius:5px;opacity:.55}
.sh-seatb:hover{opacity:1;background:var(--accent-soft)}
.sh-seatpop{padding:6px;min-width:212px;max-height:52vh;overflow:auto}
.sh-seat-h{font-size:11px;color:var(--ink-3);padding:2px 6px 6px;border-bottom:1px solid var(--line);
  margin-bottom:5px}
.sh-seat-b{display:flex;align-items:center;gap:8px;width:100%;padding:7px 8px;border:none;
  background:none;cursor:pointer;border-radius:7px;font:inherit;font-size:12px;text-align:left}
.sh-seat-b:hover{background:var(--surface-2)}
.sh-seat-b b{flex:0 0 auto}
.sh-seat-b span{flex:1 1 auto;color:var(--ink-3);font-size:11px}
.sh-seat-b i{font-style:normal;font-variant-numeric:tabular-nums;color:var(--ink-2)}
.sh-seat-b.over i{color:var(--crit);font-weight:600}
/* строка выбора делегации в состав рейса */
.sh-rdrow{display:flex;align-items:center;gap:8px;padding:7px 6px;border-bottom:1px solid var(--line);
  cursor:pointer;font-size:12px}
.sh-rdrow:hover{background:var(--surface-2)}
.sh-rdrow .n{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sh-rdrow .c{color:var(--ink-3);font-size:11px;white-space:nowrap}
.sh-rdrow .p{color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap}
.sh-rdrow .in{color:var(--accent-2);font-size:10.5px;white-space:nowrap}
.sh-rdrow.is-in{opacity:.6}
.sh-plan{color:var(--accent);font-weight:600}
/* Замок рейса: закрытый маршрут не принимает правок. Видно всем, снимает админ. */
.sh-lock-badge{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;
  border-radius:999px;font-size:11px;font-weight:600;color:var(--warn);
  background:var(--warn-soft);border:1px solid var(--warn-line)}
/* единица посадки — тройка (или одиночная делегация) в левом списке */
/* переключатель способа посадки: тройки / делегации / по одному */
.sh-modes{display:flex;margin:0 0 8px;width:100%}
.sh-modes .seg-b{flex:1;font-size:11px;padding:6px 4px}
/* поимённый состав делегации в режиме «по одному» */
.sh-uexp{font:500 11px/1 var(--sans);color:var(--accent-2);cursor:pointer;padding:5px 2px 2px}
.sh-uexp:hover{text-decoration:underline}
.sh-upl{display:flex;flex-direction:column;gap:2px;margin:3px 0 2px}
.sh-p{display:flex;align-items:center;gap:6px;padding:4px 6px;border-radius:7px;cursor:grab;
  background:var(--surface-2);font:400 11.5px/1.2 var(--sans)}
.sh-p:hover{background:var(--accent-soft)}
.sh-p .n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sh-p .t{color:var(--ink-3);font-size:10px;flex:0 0 auto}
.sh-p .b{color:var(--accent-2);font-size:10px;flex:0 0 auto}
/* человек уже посажен — приглушаем, но тянуть можно (перенос в другой автобус) */
.sh-p.seated{opacity:.62}
/* подсаженные по одному в карточке автобуса */
.sh-bus-d i.p{background:var(--accent-soft);border-color:rgba(15,139,131,.35)}
.sh-bus-d i.p b.d{font-weight:500;color:var(--ink-3)}

/* touch-action:none — иначе на телефоне палец скроллит страницу вместо
   переноса: жест собран на pointer-событиях, а браузеру нужно сказать, что
   прокрутка здесь не его дело. */
.sh-u,.sh-rd,.sh-p{touch-action:none}
.sh-u{padding:5px 8px;cursor:grab;border-bottom:1px solid var(--line);user-select:none}
.sh-u:active{cursor:grabbing}
.sh-u:hover{background:var(--surface-2)}
.sh-u.triple{box-shadow:inset 3px 0 0 var(--accent)}
.sh-u.part{box-shadow:inset 3px 0 0 var(--warn)}
.sh-u.sat{box-shadow:inset 3px 0 0 var(--warn)}
.sh-u.sat .sh-u-h b{color:var(--warn)}
.sh-usat{flex:0 0 auto;font-size:11px;line-height:1}
.sh-u.done{opacity:.5}
.sh-u-h{display:flex;align-items:center;gap:7px;font-size:12px}
.sh-u-h i{width:9px;height:9px;border-radius:3px;flex:0 0 auto}
.sh-u-h b{font-weight:600;color:var(--ink);flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sh-uorg{font-size:10px;color:var(--ink-3);flex:0 0 auto;white-space:nowrap}
.sh-up{font-size:10.5px;color:var(--ink-3);font-variant-numeric:tabular-nums;flex:0 0 auto}
.sh-umem{display:flex;flex-wrap:wrap;gap:3px;margin:3px 0 0 16px}
.sh-umem span{font-size:9.5px;color:var(--ink-2);background:var(--surface-3);border-radius:10px;padding:0 6px}
.sh-umem span.sat{color:var(--warn);background:var(--warn-soft)}
/* спутник в пуле: делегация и коллектив отдельными подписями */
.sh-usub{display:flex;flex-direction:column;gap:2px;margin:4px 0 0 16px}
.sh-usub span{font-size:11px;color:var(--ink-2);display:flex;gap:6px;min-width:0}
.sh-usub span i{flex:0 0 66px;font-style:normal;font-size:8.5px;font-weight:700;
  text-transform:uppercase;letter-spacing:.04em;color:var(--ink-3);padding-top:1px}
.sh-usub span.c{color:var(--warn);font-weight:500}
/* время окончания завтрака (из расписания) — рейсы от Измайлово */
.sh-ubf{font-size:10px;color:var(--accent-2);margin:3px 0 0 16px}
.sh-ubf b{font-weight:600;font-variant-numeric:tabular-nums}
.sh-ubf.miss{color:var(--warn)}
.sh-ubf span{color:var(--ink-3)}
.sh-u.home{opacity:.65}
.sh-u.home .sh-u-h b{font-style:italic;color:var(--ink-2)}
.sh-bus-d i.u b{font-weight:700;margin-left:2px}
.sh-bus-d i.u[data-sat]{box-shadow:inset 0 -2px 0 var(--warn)}
.sh-d.home{opacity:.7}
.sh-d.home b{font-style:italic;color:var(--ink-2)}
/* Уже посаженная делегация не исчезает из списка, а гаснет: иначе не видно,
   кого вообще возят, и «где Коми» приходится искать по автобусам. */
.sh-d.done{opacity:.42}
.sh-d.done b{text-decoration:line-through}
.sh-board{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:10px}
.sh-col{border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.sh-col>header{display:flex;align-items:center;gap:8px;padding:7px 10px;
  border-bottom:1px solid var(--line);background:var(--surface-2);
  border-radius:10px 10px 0 0;font-size:12px;flex-wrap:wrap}
.sh-t{width:64px;padding:2px 6px;font-size:11px;border:1px solid var(--line-2);
  border-radius:6px;background:var(--surface);font-variant-numeric:tabular-nums}
.sh-t:focus{outline:none;border-color:var(--accent)}
/* Подпись над полем: три времени в строку без названий читались как одно
   и то же, а заполненное поле placeholder уже не показывает. */
.sh-tw{display:inline-flex;flex-direction:column;gap:2px}
.sh-tw>span{font-size:9.5px;color:var(--ink-3);line-height:1.1;white-space:nowrap}
/* Свёрнутая колонна: в рейсе их до пяти, и работают обычно с одной. */
.sh-fold{border:0;background:transparent;cursor:pointer;color:var(--ink-3);
  font-size:11px;line-height:1;padding:3px 4px;border-radius:5px}
.sh-fold:hover{background:var(--line);color:var(--ink)}
.sh-col.is-closed>header{border-bottom:0;border-radius:10px}
.sh-col.is-closed .sh-buses{display:none}
.sh-mini{padding:1px 7px;font-size:10.5px}
.sh-buses{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));
  gap:8px;padding:9px}
.sh-bus{border:1px solid var(--line-2);border-radius:8px;padding:6px 8px;
  background:var(--surface);display:flex;flex-direction:column;gap:5px}
.sh-bus.over{border-color:var(--crit);background:var(--crit-soft)}
.sh-bus.tgt{outline:2px solid var(--accent);outline-offset:1px}
.sh-bus-h{display:flex;align-items:center;justify-content:space-between;font-size:12px}
.sh-bus-h span{font-size:10.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.sh-bus-h span.crit{color:var(--crit);font-weight:700}
.sh-bus-h .sh-plate{margin-left:6px;margin-right:auto;font-size:9px;font-weight:600;color:#1f4e8c;
  background:#e8f0fb;border:1px solid #cfe0f5;border-radius:20px;padding:0 6px}
/* автопарк дня — грид ТС */
.pk-in{width:100%;padding:3px 6px;border:1px solid var(--line-2);border-radius:6px;
  background:var(--surface);font:inherit;font-size:11.5px}
.pk-grid td{padding:3px 5px;vertical-align:middle}
/* трансферы: ряд дней (день — верхний уровень) + пикер ТС в колонну */
.sh-daybar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 9px}
.sh-daybar .seg{margin:0}
.sh-dn{font-size:9px;font-weight:700;background:var(--surface-3);color:var(--ink-2);
  border-radius:20px;padding:0 5px;margin-left:4px}
.seg-b.on .sh-dn{background:rgba(255,255,255,.28);color:#fff}
.pk-pick{max-height:52vh;overflow:auto;display:flex;flex-direction:column;gap:2px}
.pk-pk{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;cursor:pointer;font-size:12.5px}
.pk-pk:hover{background:var(--surface-2)}
.pk-pk.used{opacity:.6}
.pk-top{display:flex;align-items:center;gap:10px;margin:0 0 8px}
/* карточка маршрута: тип + точки с подсвеченными адресами и ссылкой на карты */
.rc-card{border:1px solid var(--line-2);border-radius:11px;background:var(--surface);
  padding:9px 12px;margin:0 0 10px;display:flex;flex-direction:column;gap:6px}
.rc-h{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.rc-kind{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  padding:1px 8px;border-radius:20px}
.rc-transfer{background:#e8f0fb;color:#1f4e8c;border:1px solid #cfe0f5}
.rc-excursion{background:var(--good-soft);color:var(--good);border:1px solid #9fd3b8}
.rc-title{font-size:14px;font-weight:600;color:var(--ink)}
.rc-day{font-size:11.5px;color:var(--ink-3);font-weight:600}
/* Выбор маршрута: вкладок за день десяток, и рукописные названия не отвечали
   на «откуда куда». Выпадашка показывает дату, маршрут и что внутри. */
/* Строка выбора маршрута. Раньше контейнер был «.seg» — остаток от ленты
   вкладок: inline-flex ужимался по тексту, и «Парк Зарядье → Шереметьево С»
   обрезалось, хотя справа было пусто. Теперь ряд во всю ширину, а список
   занимает всё, что осталось от кнопки «+ Маршрут». */
.sh-runbar{display:flex;align-items:center;gap:8px;margin:0 0 9px}
.sh-rpick{position:relative;flex:1 1 auto;min-width:320px;max-width:min(1100px,100%)}
.sh-rbtn{width:100%;display:flex;align-items:center;gap:10px;text-align:left;
  border:1px solid var(--line);border-radius:11px;background:var(--surface);
  padding:8px 12px;cursor:pointer;color:var(--ink)}
.sh-rbtn:hover{border-color:var(--accent)}
.sh-rbtn .l{flex:1;min-width:0;font-weight:600;font-size:13px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.sh-rbtn .n{flex:0 0 auto;font-size:11px;color:var(--ink-2);white-space:nowrap}
.sh-rbtn .cv{flex:0 0 auto;color:var(--ink-3);transition:transform .18s ease}
.sh-rpick.open .sh-rbtn{border-color:var(--accent)}
.sh-rpick.open .sh-rbtn .cv{transform:rotate(180deg)}
.sh-rlist{position:absolute;left:0;right:0;top:100%;z-index:40;margin-top:5px;
  background:var(--surface);border:1px solid var(--line);border-radius:11px;
  box-shadow:0 12px 30px rgba(16,24,40,.16);overflow:auto;max-height:60vh}
.sh-ropt{display:flex;align-items:flex-start;gap:10px;width:100%;text-align:left;
  border:0;border-bottom:1px solid var(--line);background:transparent;cursor:pointer;
  padding:9px 12px;color:var(--ink)}
.sh-ropt:last-child{border-bottom:0}
.sh-ropt:hover,.sh-ropt.on{background:var(--accent-soft)}
.sh-ropt .d{flex:0 0 auto;min-width:64px;font-size:11px;font-weight:600;
  color:var(--accent-2);padding-top:2px}
.sh-ropt .b{min-width:0;flex:1;display:flex;flex-direction:column;gap:1px}
.sh-ropt .b b{font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.sh-ropt .b .m{font-size:10.5px;color:var(--ink-3);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.sh-ropt .k{flex:0 0 auto;font-size:9.5px;font-weight:700;text-transform:uppercase;
  padding:1px 7px;border-radius:20px;align-self:center}
/* Заявка из ленты делегаций: время выезда и прибытия, кого везём, что просили */
.rc-task{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:8px;
  padding:7px 11px;border-radius:10px;background:var(--warn-soft);
  border:1px solid #eadcb4}
.rt-h{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  color:#8a5f12}
.rt-t{display:inline-flex;align-items:baseline;gap:5px;font-size:12.5px;color:var(--ink)}
.rt-t i{font-style:normal;font-size:10.5px;color:var(--ink-3)}
.rt-t b{font-weight:700;font-variant-numeric:tabular-nums}
.rt-miss{color:var(--crit);font-size:11.5px}
.rt-note{flex:1 1 100%;font-size:11.5px;color:var(--ink-2)}

/* Пул ограничен составом рейса — говорим об этом, а не молчим */
.sh-roster-note{font-size:11px;color:#8a5f12;background:var(--warn-soft);
  border-radius:8px;padding:4px 9px;margin-bottom:6px}

/* Откуда взялся маршрут: заведённый из ленты делегаций приходит без автобусов,
   и по одному названию это не отличить — отсюда пометка и на вкладке, и в шапке. */
.rc-src{font-size:10.5px;color:var(--ink-3);border:1px solid var(--line);
  border-radius:20px;padding:1px 8px;white-space:nowrap;cursor:help}
.rc-src.feed{color:#8a5f12;background:#fdf3d8;border-color:#eadcb4;font-weight:600}
.seg-b.sh-feed{position:relative}
.sh-feed-i{font-style:normal;color:#b07514;margin-right:5px;font-size:10px}
.rc-route{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12.5px}
.rc-arrow{color:var(--ink-3);font-weight:700}
.rc-pt{display:inline-flex;align-items:baseline;gap:6px;text-decoration:none;max-width:100%}
.rc-addr{font-weight:600;color:var(--accent-2);background:var(--accent-soft);
  border:1px solid var(--accent);border-radius:7px;padding:1px 7px}
.rc-adr2{font-size:11px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis}
a.rc-map:hover .rc-addr{filter:brightness(.97)}
.rc-stats{font-size:11.5px;color:var(--ink-3)}
/* Ответственные за маршрут: два-три человека на весь рейс (раньше ставили на
   каждое ТС — в рейсе их тридцать три). По ним диспетчерская фильтрует ленту,
   поэтому список виден прямо в карточке маршрута, а не спрятан в диалоге. */
.rc-orgs{display:flex;align-items:center;flex-wrap:wrap;gap:7px;margin-top:9px;
  padding-top:9px;border-top:1px solid var(--line)}
.rc-orgs-h{font-size:10.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3)}
.rc-org{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:500;
  padding:3px 4px 3px 10px;border-radius:999px;background:var(--accent-soft);
  color:var(--accent-2);border:1px solid transparent}
.rc-org.vol{background:var(--good-soft);color:var(--good-ink)}
.rc-org i{font-style:normal;font-weight:400;opacity:.75;font-variant-numeric:tabular-nums}
.rc-org-x{border:0;background:none;cursor:pointer;color:inherit;opacity:.55;font-size:11px;
  padding:2px 5px;border-radius:999px;line-height:1}
.rc-org-x:hover{opacity:1;background:rgba(0,0,0,.06)}
.rc-org-add{padding:3px 10px;font-size:11.5px;border-radius:999px}
.sh-bus-d{display:flex;flex-wrap:wrap;gap:4px;min-height:20px}
/* Чип в автобусе — просто метка, кто едет. Снимает только крестик: раньше
   кнопкой был весь чип, и касание названия выкидывало делегацию из ТС. */
.sh-bus-d i{font-style:normal;font-size:10px;padding:1px 6px;border-radius:11px;
  border:1px solid;color:var(--ink);display:inline-flex;align-items:center;gap:4px;
  cursor:default}
.sh-bus-d i .x{font-style:normal;font-weight:600;font-size:11px;line-height:1;
  color:var(--ink-3);cursor:pointer;padding:2px 3px;margin-right:-3px;border-radius:6px;
  opacity:.5}
.sh-bus-d i:hover .x{opacity:1}
.sh-bus-d i .x:hover{background:var(--crit);color:#fff;opacity:1}
/* на тач-экране наведения нет — крестик виден сразу, иначе его не найти */
@media (hover:none){.sh-bus-d i .x{opacity:.75;padding:3px 5px}}
.sh-bus-f{display:flex;align-items:center;gap:6px;font-size:10.5px;color:var(--ink-2);
  border-top:1px dashed var(--line);padding-top:4px;margin-top:auto}
.sh-bus-f .btn{margin-left:auto}
.sh-empty{padding:26px;text-align:center;color:var(--ink-2);font-size:12.5px;
  border:1px dashed var(--line-2);border-radius:10px}
.sh-at{color:var(--accent);font-weight:600}

/* ---------- питание на площадке: блок в карточке события сетки ---------- */
/* Поток приёма пищи — это событие сетки, поэтому состав правят в его карточке, а
   не на отдельном экране: время, место и вместимость там же, полями выше.
   Карточку под этот блок расширяем: в строке делегации имя, категория, диета,
   соседний поток и число едоков, и на 720px они наезжают друг на друга. */
.pg-modal.ml-on{max-width:min(900px,96vw)}
.ml-box{padding:0 15px 13px;display:flex;flex-direction:column;gap:7px}
.ml-box.busy{opacity:.6;pointer-events:none}
.ml-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-top:11px;
  border-top:1px dashed var(--line);font-size:12px}
.ml-h>b{font-size:12.5px}
/* Счётчики приёма в строку: «сколько всего», «сколько разложено» и «сколько
   осталось» читаются только вместе — по одному числу не видно, всё ли накормлено. */
.ml-nums{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:11px;color:var(--ink-3)}
.ml-nums i{font-style:normal}
.ml-nums b{font-size:12px;font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
.ml-crit-t{font-style:normal;font-size:11px;font-weight:600;color:var(--crit)}
.ml-crit-t b{color:var(--crit)}
.ml-ok-t{font-style:normal;font-size:11px;font-weight:600;color:var(--good)}
.ml-ok-t b{color:var(--good)}
.ml-diets{font-size:10.5px;color:var(--ink-2)}
.ml-sibs{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:10.5px}
.ml-sibs .btn{font-variant-numeric:tabular-nums}
.ml-sibs .btn.ml-over{border-color:var(--crit);color:var(--crit)}
/* Вкладки потоков внутри одного блока приёма — вместо отдельных плиток в сетке. */
.ml-flows{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.ml-tab{display:inline-flex;align-items:center;gap:6px;padding:4px 9px;border:1px solid var(--line-2);
  border-radius:8px;background:var(--surface);font:inherit;font-size:11px;color:var(--ink-2);
  cursor:pointer;max-width:100%}
.ml-tab:hover{border-color:var(--accent);color:var(--ink)}
.ml-tab.on{border-color:var(--accent);background:var(--accent-soft);color:var(--ink);font-weight:600}
.ml-tab.ml-over{border-color:var(--crit);color:var(--crit)}
.ml-tab-n{font-variant-numeric:tabular-nums;font-size:10.5px;opacity:.85}
.ml-add{flex:0 0 auto}
.pg-ev.pg-meal .pg-ev-c{font-weight:600}
.ml-note{padding:7px 10px;border:1px solid var(--line-2);background:var(--surface-2);
  border-radius:9px;font-size:11.5px;color:var(--ink-2);display:flex;align-items:center;
  gap:7px;flex-wrap:wrap;line-height:1.45}
.ml-tools{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
/* Поиск и выбор источника стоят в строке с кнопкой, поэтому подогнаны под её
   высоту 26.5px: 11px * 1.5 + 4px*2 + рамка. */
.ml-q,.ml-src{padding:4px 8px;border:1px solid var(--line-2);border-radius:8px;
  background:var(--surface);font:inherit;font-size:11px;line-height:1.5;color:var(--ink)}
.ml-q{flex:1 1 160px;min-width:120px}
.ml-q:focus,.ml-src:focus{outline:none;border-color:var(--accent)}
.ml-f{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--ink-2);
  cursor:pointer;user-select:none}
.ml-rows{max-height:min(34vh,300px);overflow:auto;border:1px solid var(--line);
  border-radius:9px;background:var(--surface)}
.ml-d{display:flex;align-items:center;gap:7px;padding:3px 8px;font-size:11.5px;
  border-bottom:1px solid var(--line);cursor:pointer}
.ml-d:last-child{border-bottom:0}
.ml-d:hover{background:var(--surface-2)}
.ml-d.on{background:var(--accent-soft)}
.ml-d>b{font-weight:500;color:var(--ink);flex:1 1 auto;min-width:110px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.ml-cat{font-size:10px;color:var(--ink-3);flex:0 0 auto}
.ml-diet{font-style:normal;font-size:9px;color:var(--warn);flex:0 0 auto}
/* Где делегация стоит сейчас: без этого «не здесь» не отвечает на «а где», и
   менеджер ищет пропавший регион по остальным потокам руками. */
.ml-at{font-size:10px;color:var(--accent-2);flex:0 0 auto;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;max-width:190px}
/* «Уже добавлена сюда»: список длинный, и одного фона строки не хватает —
   при выверке глазами делегацию сажают в два потока и кормят дважды. */
.ml-here{font-size:9.5px;font-weight:600;color:var(--good);flex:0 0 auto;
  letter-spacing:.02em;white-space:nowrap}
.ml-f-n{display:inline-block;min-width:16px;padding:0 4px;margin-left:3px;
  border-radius:7px;background:var(--surface-2);color:var(--ink-2);
  font-size:9.5px;text-align:center;font-variant-numeric:tabular-nums}
.ml-n{margin-left:auto;font-size:10.5px;color:var(--ink-3);flex:0 0 auto;
  font-variant-numeric:tabular-nums}
/* Тройка как единица набора питания: акцент слева + иконка, регионы — подписью */
.ml-d.ml-triple{box-shadow:inset 3px 0 0 var(--accent);flex-wrap:wrap}
.ml-d.ml-triple>b{font-weight:600}
.ml-tri-i{color:var(--accent-2);font-style:normal}
.ml-d.ml-triple .ml-cat{color:var(--ink-2);white-space:normal;overflow:visible;
  flex:1 1 100%;order:5;margin-left:24px;font-size:10.5px;line-height:1.3}

/* ============================================================
   СИСТЕМА ДВИЖЕНИЯ (motion) — добавлено единым блоком в конец файла.
   Принципы: только transform/opacity/box-shadow/color (60fps),
   длительности 120–320мс, анимируем ХРОМ и КОНТЕЙНЕРЫ, НЕ тело
   виртуализированных таблиц/сеток/досок. Базовое правило элемента
   всегда видимо (opacity:1) — вход задаётся @keyframes 0→1, чтобы
   под prefers-reduced-motion (глобальный guard выше в файле)
   элемент оставался виден. Токены длительностей/easing — в :root.
   ============================================================ */

/* ---------- keyframes ---------- */
@keyframes anim-fade-up{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@keyframes anim-fade-up-sm{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@keyframes anim-pop-in{from{opacity:0;transform:scale(.9)}to{opacity:1;transform:none}}
@keyframes anim-modal-in{from{opacity:0;transform:translateY(8px) scale(.985)}to{opacity:1;transform:none}}
@keyframes anim-panel-in{from{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:none}}
@keyframes anim-slide-right{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:none}}
@keyframes anim-bump{0%{transform:none}30%{transform:scale(1.05)}100%{transform:none}}

/* ---------- утилиты для JS-хуков (навешиваются один раз при монтировании) ---------- */
.anim-in{animation:anim-fade-up var(--dur-2) var(--ease-out) both}      /* контейнер таблицы/вида */
.anim-pop{animation:anim-pop-in var(--dur-2) var(--ease-spring) both}
.sec-in{animation:anim-fade-up var(--dur-2) var(--ease-out) both}       /* смена секции/панели */
.dt-mount{animation:anim-fade-up var(--dur-2) var(--ease-out) both}     /* монтирование грида справочника */
.dt-content-in{animation:anim-fade-up-sm var(--dur-2) var(--ease-out) both} /* первая отрисовка тела таблицы (guard!) */
.content-in{animation:anim-fade-up-sm var(--dur-2) var(--ease-out) both}    /* подмена скелет→контент */
.expand-in{animation:anim-fade-up-sm var(--dur-2) var(--ease-out) both}     /* раскрытие короткого блока */
.just-open{animation:anim-fade-up-sm var(--dur-2) var(--ease-out) both}     /* одна раскрытая группа делегации */
.bump{animation:anim-bump var(--dur-3) var(--ease-spring)}                  /* пульс изменившегося числа/элемента */
/* стаггер контейнера: применять к обёртке, дети — до 8 (KPI-плиток единицы) */
.stagger>*{animation:anim-fade-up var(--dur-3) var(--ease-out) both}
.stagger>*:nth-child(1){animation-delay:0ms}
.stagger>*:nth-child(2){animation-delay:35ms}
.stagger>*:nth-child(3){animation-delay:70ms}
.stagger>*:nth-child(4){animation-delay:105ms}
.stagger>*:nth-child(5){animation-delay:140ms}
.stagger>*:nth-child(6){animation-delay:175ms}
.stagger>*:nth-child(7){animation-delay:210ms}
.stagger>*:nth-child(8){animation-delay:245ms}

/* ---------- модалки: вход самой коробки (фон .modal уже фейдит) ---------- */
/* один класс .modal-box покрывает все модалки (личная карточка, рейс, импорт, пикеры…) */
.modal-box{animation:anim-modal-in var(--dur-3) var(--ease-out) both;transform-origin:center top}

/* ---------- поповеры / выпадающие меню: единый вход из-под триггера ---------- */
.dt-panel,.cs-menu,.tr-menu,.picker-drop,.cat-menu,.coll-menu,.mention-drop,.ds-pop,.lg-redit,.tr-vmenu{
  animation:anim-panel-in var(--dur-2) var(--ease-out) both;transform-origin:top center}
/* боковая панель ТС — выезд справа (fixed у правого края) */
.tr-panel{animation:anim-slide-right var(--dur-2) var(--ease-out) both}

/* ---------- тост и плавающий selbar: сузить transition до transform+opacity ---------- */
.toast{transition:transform var(--dur-2) var(--ease-out),opacity var(--dur-2) var(--ease-out)}
.tr-selbar{transition:transform var(--dur-2) var(--ease-out),opacity var(--dur-2) var(--ease-out)}

/* ---------- баннер обновления: перевести на токены (движение то же) ---------- */
.upd-banner{animation:anim-fade-up var(--dur-3) var(--ease-out)}

/* ---------- кнопки: унифицировать вторичные + пресс + фокус ---------- */
.dt-btn,.dt-reset,.dt-sortbtn,.dt-colsbtn,.dt-exportbtn,.stbtn,.lg-sz,.dt-panel-clear{
  transition:background var(--dur-1),border-color var(--dur-1),box-shadow var(--dur-1),transform var(--dur-press)}
.dt-btn:active,.dt-reset:active,.dt-sortbtn:active,.dt-colsbtn:active,.dt-exportbtn:active,.stbtn:active,.lg-sz:active{transform:translateY(.5px)}
.btn.primary{transition:background var(--dur-1),border-color var(--dur-1),box-shadow var(--dur-1),transform var(--dur-press)}
.btn.primary:hover{box-shadow:0 2px 8px rgba(15,139,131,.30)}
.btn.primary:active{transform:translateY(.5px)}
/* иконочные ×-кнопки — короткий scale на hover */
.tr3-x,.ml-x,.st-x,.sh-rdx,.upd-x,.lk-x{transition:transform var(--dur-1) var(--ease),color var(--dur-1)}
.tr3-x:hover,.ml-x:hover,.st-x:hover,.sh-rdx:hover{transform:scale(1.12)}

/* ---------- чипы / пилюли: плавный hover + pop нового чипа ---------- */
.dt-chip,.pchip,.tr3-mc,.chip.lk,.coll-chip,.veh-chip,.meet-chip{
  transition:background var(--dur-1),color var(--dur-1),box-shadow var(--dur-1),transform var(--dur-1) var(--ease)}
.chip.lk:hover,.coll-chip:hover{transform:translateY(-1px)}
.chip.lk:active,.coll-chip:active{transform:scale(.96)}
/* появление чипа группировки (renderGroupbar вне hot-path скролла) */
.dt-chip{animation:anim-pop-in var(--dur-2) var(--ease-spring) both}

/* ---------- чекбоксы: пресс-отклик + плавное фокус-кольцо ---------- */
input[type="checkbox"]{transition:background-color var(--dur-1),border-color var(--dur-1),box-shadow var(--dur-1),transform var(--dur-press)}
input[type="checkbox"]:active{transform:scale(.9)}

/* ---------- формы: унификация плавного фокус-кольца у «скачущих» полей ---------- */
.dt-search,.userform input:not([type=checkbox]):not([type=radio]),
.modal-body input:not([type=checkbox]):not([type=radio]),.modal-body select,.modal-body textarea,
.login input,.pg-form input,.ds-form input,.fl-grid input,.nameru-in,.mrz-in,.lg-rin,.meet-q,.dg-q,.ds-in{
  transition:border-color var(--dur-1),box-shadow var(--dur-1)}

/* ---------- топбар / вкладки / сегменты ---------- */
/* бегущее подчёркивание активной вкладки .tabs (в дополнение к border-bottom-color) */
.tabs button{position:relative;transition:color var(--dur-1)}
.tabs button::after{content:"";position:absolute;left:8px;right:8px;bottom:-1px;height:2px;border-radius:2px;
  background:var(--accent);transform:scaleX(0);transform-origin:center;transition:transform var(--dur-2) var(--ease-out)}
.tabs button.active::after{transform:scaleX(1)}
/* сегменты и вкладки потоков — пресс + плавный переход состояния */
.seg-b{transition:background var(--dur-1),color var(--dur-1),transform var(--dur-press)}
.seg-b:active{transform:scale(.97)}
.ml-tab{transition:background var(--dur-1),border-color var(--dur-1),color var(--dur-1),transform var(--dur-press)}
.ml-tab:active{transform:scale(.97)}
/* иконка навигации — лёгкий scale на hover */
.topbar nav a svg{transition:transform var(--dur-1) var(--ease),opacity var(--dur-1)}
.topbar nav a:hover svg{transform:scale(1.06)}

/* ---------- KPI-плитки / карточки-сводка ---------- */
.card{transition:transform var(--dur-1) var(--ease-out),box-shadow var(--dur-1)}
.card:hover{transform:translateY(-1px);box-shadow:var(--shadow-lg)}
/* стаггер входа плиток — по классу-хуку на контейнере (#summary/.cards/#lgKpis/#trKpis/#orgKpis) */
.cards.kpi-in>.card,#summary.kpi-in>.card,.kpi-in>.card{animation:anim-fade-up var(--dur-3) var(--ease-out) both}
.kpi-in>.card:nth-child(1){animation-delay:0ms}
.kpi-in>.card:nth-child(2){animation-delay:35ms}
.kpi-in>.card:nth-child(3){animation-delay:70ms}
.kpi-in>.card:nth-child(4){animation-delay:105ms}
.kpi-in>.card:nth-child(5){animation-delay:140ms}
.kpi-in>.card:nth-child(6){animation-delay:175ms}
.kpi-in>.card:nth-child(7){animation-delay:210ms}
.kpi-in>.card:nth-child(8){animation-delay:245ms}

/* ---------- таблицы .dt: контейнер, активная колонка (НЕ тело) ---------- */
/* вход контейнера — по классу .anim-in (навешивается один раз, см. JS-хук) */
.dt-wrap.anim-in{animation:anim-fade-up-sm var(--dur-2) var(--ease-out) both}
/* активная (сортируемая/фильтруемая) колонка — плавная смена фона шапки.
   Только thead (десятки th), НЕ строки тела; transition лишь на цвет. */
table.dt thead th{transition:background-color var(--dur-1)}

/* ---------- клик-редактируемая ячейка (одна под курсором — дёшево) ---------- */
td.dt-cclick{transition:background-color var(--dur-1)}

/* ---------- микро-подтверждения (невиртуализированные) ---------- */
/* галка «сохранено»: усилить существующий opacity-reveal лёгким scale */
.dos-ok{transform:scale(.6);transition:opacity var(--dur-1),transform var(--dur-1) var(--ease-spring)}
.dos-ok.on{transform:scale(1)}
/* копи-ID: тактильный отклик копирования */
.dos-pid,.dos-id{transition:background var(--dur-1),transform var(--dur-press)}
.dos-pid:active,.dos-id:active{transform:scale(.96)}

/* ---------- бейджи-сигналы: attention-pulse НЕ добавляем ---------- */
/* .chg-b.fresh / .miss-b живут ВНУТРИ виртуализированного тела таблицы: узлы
   пересоздаются на каждом кадре скролла, поэтому keyframe-пульс (даже конечный)
   переигрывал бы на каждом кадре прокрутки. Оставляем без анимации. */

/* ---------- карточки-канбан / тройки: отклик выбора и переноса ---------- */
.tcard{transition:border-color var(--dur-1),box-shadow var(--dur-1),transform var(--dur-press)}
.tr3-card{transition:border-color var(--dur-1),box-shadow var(--dur-1)}
/* новая member-chip тройки «прилипает» pop-ом (класс на реально добавленный чип) */
.tr3-mc.anim-pop{animation:anim-pop-in var(--dur-2) var(--ease-spring) both}

/* ---------- доска шаттлов: цель drag&drop и «snap» ---------- */
.sh-bus{transition:transform var(--dur-1) var(--ease),box-shadow var(--dur-1),border-color var(--dur-1)}
.sh-bus.tgt{transform:scale(1.015)}
.sh-bus.snap{animation:anim-bump var(--dur-2) var(--ease-spring)}
/* призрак перетаскивания — pop при создании */
.sm-ghost{animation:anim-pop-in var(--dur-1) var(--ease-out) both}

/* ---------- полоса заполненности ТС: «наливание» через scaleX (не width) ---------- */
/* JS задаёт --occ (0..1); базово видима, ставим transform */
.tp-occ.anim-fill i{transform-origin:left;transform:scaleX(var(--occ,1));transition:transform var(--dur-3) var(--ease-out)}

/* ---------- лайтбокс: вход изображения ---------- */
.lightbox img{animation:anim-pop-in var(--dur-2) var(--ease-out) both}

/* ---------- боковые списки: hover-микро (entrance ЗАПРЕЩЁН — пересборка на ввод) ---------- */
.sh-u,.sm-d,.tr3-di{transition:background var(--dur-1),transform var(--dur-1) var(--ease)}
.sh-u:hover,.sm-d:hover,.tr3-di:hover{transform:translateX(2px)}

/* ---------- гант-тайлы: hover (один тайл за раз; НЕ анимировать left/width) ---------- */
.pg-ev,.pg-dev,.pg-shuttle{transition:transform var(--dur-1) var(--ease-out),box-shadow var(--dur-1)}
.pg-ev:hover,.pg-dev:hover,.pg-shuttle:hover{transform:translateY(-1px)}

/* ============================================================
   ГЛОБАЛЬНЫЙ guard prefers-reduced-motion (дублирует ранний в файле,
   безвредно) + scroll-behavior. Держать САМЫМ ПОСЛЕДНИМ правилом.
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important;scroll-behavior:auto!important}
}

/* ссылка «запросить доступ» на странице входа */
.login-req{display:block;text-align:center;margin-top:14px;font-size:13px;color:var(--ink-2)}
.login-req:hover{color:var(--accent-2)}
/* «не могу войти» — плашкой, а не строчкой-ссылкой: человек у закрытой двери
   ищет глазами что-то заметное, а обычная ссылка теряется под кнопками */
.login-help{display:block;margin-top:12px;padding:11px 14px;border-radius:10px;
  background:var(--warn-soft);color:var(--warn);border:1px solid var(--warn-line,#eddcbc);
  text-align:center;font-size:13px;font-weight:500}
.login-help:hover{background:var(--warn);color:#fff;border-color:var(--warn)}

/* ---------- сверка питания за день ----------
   Место потока считается из зала, а если зал пуст — из названия. Пока это было
   видно только внутри карточки, ужин с залом «Дворец ВИНЕР» уезжал в приложение
   вожатого Виннером. Здесь всё одной таблицей, расхождения подсвечены. */
.ml-check-sum{font-size:12.5px;color:var(--ink-2);margin-bottom:10px}
.ml-check-sum .ok{color:var(--good-2);font-weight:600}
.ml-check-warn{color:var(--crit);font-weight:600}
table.ml-check{width:100%;border-collapse:collapse;font-size:12px}
table.ml-check th,table.ml-check td{padding:7px 9px;text-align:left;
  border-bottom:1px solid var(--line);vertical-align:top}
table.ml-check th{background:var(--surface-2);font-size:10.5px;font-weight:600;
  text-transform:uppercase;letter-spacing:.04em;color:var(--ink-3);white-space:nowrap}
table.ml-check td.n,table.ml-check th.n{text-align:right;font-variant-numeric:tabular-nums}
table.ml-check td.crit{color:var(--crit);font-weight:600}
table.ml-check tr.bad{background:var(--crit-soft)}
table.ml-check tr.warn{background:var(--warn-soft)}
table.ml-check .btn{padding:2px 8px;font-size:10.5px}
.ml-check-note{font-size:10.5px;color:var(--crit);margin-top:2px}
.ml-check-orph{margin-top:12px;padding:9px 11px;border:1px solid var(--warn-line);
  background:var(--warn-soft);border-radius:10px;font-size:12px;color:var(--ink-2)}
.ml-check-orph ul{margin:6px 0 0;padding-left:18px}
