:root{
  /* Правка 02.10 — «статус пропадает». Выпадающий список селекта рисует не
     страница, а браузер с операционной системой: без color-scheme он берёт
     светлую тему, подставляя под наш светлый текст белый фон (или наоборот,
     тёмный текст на тёмном) — пункты становятся нечитаемыми, и список
     выглядит пустым, хотя в разметке он полный. Объявляем тему явно: это
     чинит и выпадающие списки, и календари у полей с датой, и полосы
     прокрутки. Подписи пунктов на всякий случай красим сами. */
  color-scheme: dark;
  --bg:#0f1216; --panel:#161b22; --panel-2:#1c232c; --line:#262e39;
  --text:#e6edf3; --muted:#8b98a8; --accent:#3b82f6; --accent-soft:#1d4ed8;
  --ok:#22c55e; --warn:#f59e0b; --bad:#ef4444; --violet:#a78bfa;
  --radius:10px;
}
option,optgroup{background:var(--panel);color:var(--text)}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);
  font:14px/1.5 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif}
a{color:inherit;text-decoration:none}

/* ── шапка ───────────────────────────────────────────────────────────── */
.topbar{display:flex;align-items:center;gap:22px;padding:10px 20px;
  background:var(--panel);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:10;
  flex-wrap:wrap}
.brand a{font-weight:700;font-size:17px;letter-spacing:.3px}
.brand span{color:var(--accent);margin-left:5px;font-weight:500;font-size:12px;
  border:1px solid var(--accent);padding:1px 6px;border-radius:20px;vertical-align:middle}
.nav{display:flex;gap:4px;flex:1;flex-wrap:wrap}
.nav a{padding:6px 11px;border-radius:7px;color:var(--muted);font-weight:500}
.nav a:hover{background:var(--panel-2);color:var(--text)}
.nav a.active{background:var(--accent);color:#fff}
.user-box{display:flex;align-items:center;gap:12px}
.who{display:flex;flex-direction:column;line-height:1.25;font-size:13px}
.who em{color:var(--muted);font-style:normal;font-size:11px}
.bell{position:relative;font-size:16px}
.bell i{position:absolute;top:-6px;right:-9px;background:var(--bad);color:#fff;
  font-style:normal;font-size:10px;padding:1px 5px;border-radius:9px}
.ghost{background:transparent;border:1px solid var(--line);color:var(--muted);
  padding:5px 10px;border-radius:7px;cursor:pointer;font-size:13px}
.ghost:hover{border-color:var(--accent);color:var(--text)}
.user-box form{margin:0}

/* ── каркас ──────────────────────────────────────────────────────────── */
.wrap{max-width:1500px;margin:0 auto;padding:22px 20px 60px}
h1{font-size:21px;margin:0 0 4px}
h2{font-size:16px;margin:26px 0 10px;color:var(--text)}
.sub{color:var(--muted);margin:0 0 20px;font-size:13px}
/* 30.10 — где под заголовком нет строки-подписи, вкладки, фильтры и панели стояли в 4px от него */
h1 + .tabs, h1 + .panel, h1 + .filters, h1 + .messages, h1 + form, h1 + .table-wrap,
h1 + .cards, h1 + .row{margin-top:14px}
.panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:16px;margin-bottom:16px}
.row{display:flex;gap:16px;flex-wrap:wrap}
.row>*{flex:1;min-width:260px}

/* ── карточки KPI ────────────────────────────────────────────────────── */
/* auto-fit, а не auto-fill: пустые дорожки схлопываются, и четыре плитки
   занимают строку целиком, а не жмутся слева (правка 30.09) */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(165px,1fr));gap:12px;margin-bottom:8px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px}
.card b{display:block;font-size:25px;font-weight:600;letter-spacing:-.5px}
.card span{color:var(--muted);font-size:12px}
.card.ok b{color:var(--ok)} .card.warn b{color:var(--warn)} .card.bad b{color:var(--bad)}

/* ── таблицы ─────────────────────────────────────────────────────────── */
.table-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}
table{border-collapse:collapse;width:100%;font-size:13px}
th{text-align:left;padding:10px 12px;color:var(--muted);font-weight:500;
  border-bottom:1px solid var(--line);white-space:nowrap;background:var(--panel-2)}
td{padding:9px 12px;border-bottom:1px solid var(--line);vertical-align:top}
tbody tr:last-child td{border-bottom:0}
tbody tr:hover{background:var(--panel-2)}
.num{text-align:right;font-variant-numeric:tabular-nums}
.empty{padding:26px;text-align:center;color:var(--muted)}

/* ── бейджи статусов ─────────────────────────────────────────────────── */
.badge{display:inline-block;padding:2px 8px;border-radius:20px;font-size:11.5px;
  border:1px solid var(--line);background:var(--panel-2);white-space:nowrap}
.badge.ok{color:var(--ok);border-color:#14532d;background:#052e16}
.badge.warn{color:var(--warn);border-color:#78350f;background:#271a06}
.badge.bad{color:var(--bad);border-color:#7f1d1d;background:#2a0d0d}
.badge.info{color:var(--accent);border-color:#1e3a8a;background:#0b1a35}
.badge.violet{color:var(--violet);border-color:#4c1d95;background:#170b2e}

/* ── формы ───────────────────────────────────────────────────────────── */
.form-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px}
label{display:block;color:var(--muted);font-size:12px;margin-bottom:4px}
.form-input,.form-select,input[type=text],input[type=number],input[type=date],
input[type=time],input[type=url],input[type=email],input[type=password],textarea,select{
  width:100%;padding:8px 10px;background:var(--bg);border:1px solid var(--line);
  border-radius:7px;color:var(--text);font-size:13px;font-family:inherit}
.form-input:focus,.form-select:focus,input:focus,textarea:focus,select:focus{
  outline:none;border-color:var(--accent)}
.help{color:var(--muted);font-size:11px;margin-top:3px}
.errors{color:var(--bad);font-size:12px;margin-top:3px}
/* 30.10 (Alastor_it: «кнопки накладываются друг на друга, много что не ровно») — ссылка-кнопка
   <a class="btn"> была строчной: её отступы сверху и снизу вылезали на соседние кнопки и строки,
   а <button> брал шрифт и высоту строки браузера — в одном ряду кнопки выходили разной высоты.
   Теперь обе — строчные блоки с одним шрифтом и высотой строки. [hidden] — иначе display
   перебьёт браузерное «спрятать» у кнопок со скрытием. */
.btn{display:inline-block;background:var(--accent);color:#fff;border:0;padding:9px 16px;border-radius:7px;
  cursor:pointer;font-size:13px;font-weight:500;font-family:inherit;line-height:1.25;
  text-align:center;vertical-align:middle}
.btn[hidden]{display:none}
label.btn{margin-bottom:0}
.btn:hover{background:var(--accent-soft)}
.btn.sm{padding:5px 10px;font-size:12px}
.btn.grey{background:var(--panel-2);border:1px solid var(--line);color:var(--text)}
.btn.green{background:var(--ok)} .btn.red{background:var(--bad)}
/* Некликабельная кнопка должна выглядеть некликабельной, иначе её жмут
   до упора и считают, что интерфейс молча ничего не делает. */
.btn[disabled]{opacity:.4;cursor:not-allowed}
.btn[disabled]:hover{background:var(--accent)}
.btn.grey[disabled]:hover{background:var(--panel-2)}
.actions{display:flex;gap:10px;align-items:center;margin-top:16px;flex-wrap:wrap}

/* ── фильтры ─────────────────────────────────────────────────────────── */
.filters{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;margin-bottom:14px}
/* Пользователь 28.10 — кнопки («+ Заявка», «Архив смен»…) лежали вплотную к панели фильтров:
   у ряда кнопок отступ только сверху */
.actions + .filters, .actions + .panel{margin-top:12px}
/* 30.10 — плашка «В подвязку не уйдёт…» и таблица под рядом кнопок лежали вплотную к кнопкам */
.actions + .messages, .actions + .table-wrap, .actions + .row, .actions + .cards{margin-top:14px}
.filters>div{min-width:150px}

/* ── прочее ──────────────────────────────────────────────────────────── */
.messages{margin-bottom:16px}
.msg{padding:10px 14px;border-radius:8px;margin-bottom:8px;border:1px solid var(--line);
  background:var(--panel)}
.msg.success{border-color:#14532d;background:#052e16;color:#86efac}
.msg.error{border-color:#7f1d1d;background:#2a0d0d;color:#fca5a5}
.kv{display:grid;grid-template-columns:190px 1fr;gap:7px 14px;font-size:13px}
.kv dt{color:var(--muted)}
.kv dd{margin:0;word-break:break-word}
.tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
.tabs a{padding:7px 14px;border-radius:7px;background:var(--panel);border:1px solid var(--line);
  color:var(--muted);font-size:13px}
.tabs a.active{background:var(--accent);border-color:var(--accent);color:#fff}
/* Albus 02.11 — основные банки в табах ACQ (Моно, ПУМБ, НоваПей, ОБанк, Укрсиб) подсвечены */
.tabs a.bank-main:not(.active){border-color:var(--warn);background:rgba(245,158,11,.14);color:var(--text);font-weight:600}
.login-box{max-width:340px;margin:12vh auto;background:var(--panel);border:1px solid var(--line);
  border-radius:var(--radius);padding:28px}
.login-box h1{margin-bottom:18px;text-align:center}
.login-box .field{margin-bottom:14px}
.mini{color:var(--muted);font-size:12px}
.bar{height:5px;background:var(--panel-2);border-radius:4px;overflow:hidden;margin-top:5px}
.bar i{display:block;height:100%;background:var(--accent)}

/* Ссылка вместо inline-onclick на строке: работает средняя кнопка мыши,
   доступно с клавиатуры, и на странице не остаётся ни одного скрипта. */
.row-link{display:block;color:var(--text)}
.row-link:hover{color:var(--accent)}
.msg.warning{border-color:#78350f;background:#271a06;color:#fcd34d}

/* Строки крипто-выплат: адрес пошире, сеть и сумма компактные, крестик справа */
/* Адрес занимает свою строку: в узкой колонке карточки в поле шириной 50px
   от 34-символьного адреса было видно четыре знака — проверить его нельзя. */
.crypto-row{margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--line)}
.crypto-row:last-child{border-bottom:0}
.crypto-row-fields{display:grid;grid-template-columns:1fr 90px 32px;gap:6px;align-items:center}
.crypto-row-fields > :first-child{grid-column:1 / -1;font-family:ui-monospace,Menlo,monospace;
  font-size:12px}
.crypto-row-fields .btn{padding:6px 0;line-height:1}

/* Блок реквизитов, не подходящий под выбранную валюту: виден, но неактивен.
   Раньше он скрывался целиком и читался как «такой оплаты в CRM нет». */
.payout-title{font-size:13px;margin:14px 0 2px;color:var(--text)}
.payout-note{font-size:11px;color:var(--muted);margin-bottom:8px}
.payout-off{opacity:.4}
.payout-off .payout-note::after{content:' — сейчас выключено'}

/* Канбан: колонки прокручиваются вбок, карточка держит фиксированную ширину —
   иначе на пяти-семи колонках доска складывается в нечитаемую кашу. */
/* Правка п.15 — колонок стало семь, и последняя обрезалась краем экрана.
   Прокрутка отдельным контейнером, колонки чуть уже, тень у правого края
   подсказывает, что доска продолжается. */
.board{display:flex;gap:10px;overflow-x:auto;padding:0 2px 12px;align-items:flex-start;
  scroll-snap-type:x proximity}
/* Подсказку «доска продолжается» рисуем, только когда она правда
   продолжается: класс ставит скрипт доски. Иначе тень висела тёмной полосой
   поверх последней колонки, когда прокручивать нечего */
.board.is-scrollable{
  background:linear-gradient(to left,var(--panel-2),transparent 24px) right/24px 100% no-repeat}
/* Правка 30.09 — колонки делят верхнюю линию между собой: 232px теперь
   нижняя граница, а не фиксированная ширина. Когда колонок больше, чем
   влезает, они упираются в неё и доска прокручивается, как раньше. */
.board-col{flex:1 1 205px;min-width:205px;background:var(--panel);
  border:1px solid var(--line);
  border-radius:10px;padding:10px;scroll-snap-align:start}
.board-col-head{display:flex;justify-content:space-between;align-items:center;
  font-size:13px;font-weight:600;margin-bottom:8px;color:var(--text)}
.board-col-head b{background:var(--panel-2);border-radius:20px;padding:1px 8px;font-size:11px}
.card-kanban{background:var(--panel-2);border:1px solid var(--line);border-radius:8px;
  padding:9px 10px;margin-bottom:8px}
.card-kanban.stale{border-color:var(--bad)}
.card-timer{margin-top:6px;color:var(--muted)}

/* Верхний уровень меню — отделы. Плоский список из тринадцати разделов
   читался как свалка: рядом стояли «Доска поставки» и «Расходники». */
.nav-back{opacity:.7}
.groups{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:18px}
.group-tile{display:flex;flex-direction:column;gap:2px;min-width:150px;padding:12px 16px;
  background:var(--panel);border:1px solid var(--line);border-radius:10px;
  text-decoration:none;color:var(--text)}
.group-tile:hover{border-color:var(--accent)}
.group-tile b{font-size:15px}
.group-tile span{font-size:11px;color:var(--muted)}

.card-move{display:flex;flex-direction:column;gap:5px;margin-top:8px;
  padding-top:8px;border-top:1px solid var(--line)}
.card-move .form-select,.card-move .form-input{font-size:11px;padding:5px 7px}

/* Перетаскивание: подсвечиваем всю колонку целиком — она и есть зона сброса */
.card-kanban[draggable="true"]{cursor:grab}
.card-kanban.dragging{opacity:.4}
.board-col.drop-ok{border-color:var(--accent);background:var(--panel-2)}
.board-col.drop-no{border-color:var(--bad)}
.board-col-head .btn.sm{padding:1px 8px;line-height:1.4}

/* Форма таски: два столбца полей, нумерация из схемы банка */
.task-fields{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}
.task-field label{display:block;font-size:11px;color:var(--muted);margin-bottom:3px}
/* 30.10 — плашка «из анкеты» в подписи поля была выше строки подписи: поле под ней съезжало
   ниже соседних в том же ряду */
.task-field label .badge,.anketa-row label .badge{padding:0 6px;font-size:10px;line-height:15px;
  vertical-align:1px}
.task-field.missing .form-input,.task-field.missing .form-select{border-color:var(--warn)}
.task-field.has-error .form-input,.task-field.has-error .form-select{border-color:var(--bad)}
.task-field .field-error{font-size:11px;color:var(--bad);margin-top:2px}
.sensitive{display:flex;gap:6px}
.sensitive .form-input{flex:1;font-family:ui-monospace,Menlo,monospace}
.save-state{color:var(--muted)}
.save-state.bad{color:var(--bad)}

/* Графики без библиотек: столбики div-ами. Внешний скрипт ради пяти
   колонок тянуть незачем, а сломаться ему проще, чем CSS. */
.chart{display:flex;align-items:flex-end;gap:3px;height:130px;padding:10px;
  background:var(--panel);border:1px solid var(--line);border-radius:10px;
  overflow-x:auto;margin-bottom:18px}
.chart-bar{flex:1 0 22px;display:flex;flex-direction:column;justify-content:flex-end;
  align-items:center;height:100%;gap:4px}
.chart-bar i{display:block;width:100%;min-height:2px;background:var(--accent);
  border-radius:3px 3px 0 0}
.chart-bar span{font-size:9px;color:var(--muted);white-space:nowrap}
.goal-row{background:var(--panel);border:1px solid var(--line);border-radius:10px;
  padding:12px 14px;margin-bottom:10px}
.goal-head{display:flex;justify-content:space-between;align-items:baseline;
  gap:10px;margin-bottom:8px;flex-wrap:wrap}

/* Разделы отдела — левой колонкой (правка п.5). В хедере они не помещались:
   у подвязки их одиннадцать, и вторая строка меню читалась как отдельное. */
.shell.with-side { display: grid; grid-template-columns: 208px minmax(0, 1fr); }
/* margin:0 auto у .wrap — наследство обычного потока, где авто-поля ничего
   не делают без ширины. Здесь .wrap это grid-элемент, а в гриде авто-поля
   отменяют растягивание: блок сжимается по содержимому и встаёт по центру
   колонки. Отсюда и пустая полоса слева от доски — сама доска была ни при
   чём. Правка 30.09 — «растянуть колонки на всю верхнюю линию». */
.shell.with-side .wrap { max-width: none; padding-left: 22px; min-width: 0;
  margin-inline: 0; }
.sidenav {
  display: flex; flex-direction: column; gap: 2px;
  padding: 18px 12px 24px; border-right: 1px solid var(--line);
  background: var(--panel); min-height: calc(100vh - 56px);
}
.sidenav-title {
  font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--muted); padding: 0 10px 8px;
}
/* Ссылка должна читаться как ссылка: на скриншоте у заказчика разделы
   выглядели строкой текста. Отсюда фон под курсором, шеврон и явная
   активная плашка — по одному ряду на раздел. */
.sidenav a {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 8px 10px; border-radius: 7px; font-size: 13px; line-height: 1.25;
  color: var(--text); text-decoration: none;
  border: 1px solid transparent;
  transition: background .12s, border-color .12s, color .12s;
}
.sidenav a::after {
  content: '›'; color: var(--muted); font-size: 14px; opacity: 0;
  transition: opacity .12s, transform .12s; transform: translateX(-2px);
}
.sidenav a:hover {
  background: var(--panel-2); border-color: var(--line); color: #fff;
}
.sidenav a:hover::after { opacity: 1; transform: translateX(0); }
.sidenav a:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.sidenav a.active {
  background: var(--accent); border-color: var(--accent);
  color: #fff; font-weight: 500;
}
.sidenav a.active::after { opacity: 1; color: #fff; }
.sidenav .nav-back {
  color: var(--muted); font-size: 12px; margin-bottom: 8px;
  padding-bottom: 10px; border-bottom: 1px solid var(--line);
  border-radius: 0; justify-content: flex-start;
}
.sidenav .nav-back::after { content: none; }
.sidenav .nav-back:hover { background: none; border-color: transparent;
  border-bottom-color: var(--line); color: var(--text); }
@media (max-width: 900px) {
  .shell.with-side { grid-template-columns: 1fr; }
  .sidenav { flex-direction: row; flex-wrap: wrap; min-height: 0; gap: 6px;
             padding: 10px 12px; border-right: 0;
             border-bottom: 1px solid var(--line); }
  .sidenav-title { display: none; }
  /* В строку — чипами: иначе одиннадцать разделов подвязки сливаются */
  .sidenav a { border-color: var(--line); background: var(--panel-2); }
  .sidenav a::after { content: none; }
  .sidenav .nav-back { border-bottom: 0; padding-bottom: 8px; margin-bottom: 0; }
}

/* Компактная сетка полей с копированием (правка п.3): как на борде подвязки —
   три колонки и кнопка копирования у каждого поля. */
.task-fields { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 10px 12px; }
.field-copy { display: flex; gap: 4px; align-items: center; }
.field-copy .form-input, .field-copy .form-select { flex: 1; min-width: 0; padding: 6px 8px; font-size: 13px; }
.field-copy .btn.sm { padding: 5px 8px; line-height: 1; flex: 0 0 auto; }
/* Поиск над длинным списком (правка 19.10): строка поменьше самого поля и без
   красной/жёлтой рамки «не заполнено» — рамка относится к списку, а не к поиску */
.task-field .select-search { margin-bottom: 4px; padding: 4px 8px; font-size: 12px; }
.task-field.missing .select-search, .task-field.has-error .select-search { border-color: var(--line); }
.field-copy select[size] { height: auto; }
.anketa { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 8px 12px; }
.anketa-row label, .task-field label { display: block; font-size: 11px; color: var(--muted); margin-bottom: 3px; }
.anketa-row.missing .form-input { border-color: var(--warn); }
.check-group { font-size: 11px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--muted); margin: 12px 0 4px; }
.check-row { display: flex; gap: 8px; align-items: flex-start; padding: 3px 0; font-size: 13px; }
.check-row input { margin-top: 3px; flex: 0 0 auto; }
.check-row i { margin-left: auto; color: var(--muted); font-style: normal; white-space: nowrap; }

/* Тред комментариев на задаче (правка п.20) */
.comment { border-left: 2px solid var(--line); padding: 6px 0 6px 10px; margin: 8px 0; }
.comment-head { color: var(--muted); }
.comment-text { white-space: pre-wrap; }
.comment.reply { margin: 6px 0 6px 14px; border-left-color: var(--accent); }
.comment-reply { display: flex; gap: 6px; margin-top: 6px; }
.comment-reply .form-input { flex: 1; }

/* Форма лида (правка 09.09): два поля в ряд, блок «другой ресурс» отделён,
   неактивное поле видно как неактивное, а не просто пустое. */
.lead-form { display: grid; gap: 14px; max-width: 760px; }
.lead-row { display: grid; gap: 14px; grid-template-columns: 1fr 1fr; }
@media (max-width: 700px) { .lead-row { grid-template-columns: 1fr; } }
.lead-field { display: grid; gap: 5px; }
.lead-field label { font-size: 12px; color: var(--muted); }
.lead-field.off { opacity: .45; }
/* Правка 21.09 — ответ реестра по поставщику: красным блокирующая смена
   ника, жёлтым «не зарегистрирован» (лид при этом создаётся) */
.lead-field.bad .help, .lead-field.bad .help a { color: var(--bad); }
.lead-field.warn .help { color: var(--warn); }
.lead-field input[disabled] { color: var(--text); opacity: .85; }
.lead-other {
  display: grid; gap: 10px; padding: 12px 14px; border-radius: 8px;
  background: var(--panel-2); border: 1px solid var(--line);
}
.lead-other .check-row { margin: 0; }
b.req { color: var(--bad); font-weight: 600; }
input:disabled, select:disabled, textarea:disabled { opacity: .5; cursor: not-allowed; }

/* Строка кошелька в карточке поставщика (правка 09.09): имя первым полем,
   сеть/валюта/сумма в один ряд — иначе шесть полей читаются как список. */
.wallet-row { display: grid; gap: 4px; padding: 10px 12px; border: 1px solid var(--line);
  border-radius: 8px; background: var(--panel-2); }
.wallet-row label { font-size: 11px; color: var(--muted); }
.wallet-cols { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }

.panel-head { display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin-bottom: 8px; }

/* Три исполнителя на карточке доски (правка 09.09): поставка, подвязка,
   процессинг — видно в любой колонке, а не только у своего отдела. */
.doers { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.doers span { font-size: 11px; color: var(--muted); background: var(--panel-2);
  border: 1px solid var(--line); border-radius: 5px; padding: 1px 5px; }

/* Чипы наборных столбцов таба «Подвязка» (дополнение 16.09 #5). */
.chips { display:flex; flex-wrap:wrap; gap:6px; }
.chip { display:inline-flex; align-items:center; gap:6px; padding:4px 10px;
  border:1px solid var(--line); border-radius:999px; background:var(--panel-2);
  font-size:12px; cursor:pointer; user-select:none; }
.chip.active { border-color:var(--accent); color:var(--accent); }
.chip input { margin:0; }
#cols-panel summary::-webkit-details-marker { display:none; }
/* Косметика — панель выпадает поверх контента, кнопка «Столбцы» остаётся в ряду. */
#cols-panel { display:inline-block; }
#cols-panel > summary { list-style:none; }
#cols-panel > form { position:absolute; left:0; right:0; top:100%;
  margin-top:10px; z-index:20; box-shadow:0 8px 24px rgba(0,0,0,.35);
  padding:14px 16px 16px; }
#cols-panel > form .actions { margin:12px 0 0; }
#cols-panel .chips { margin:0; }
.actions.toolbar { margin-bottom:12px; }

/* Ссылка на менеджера в «Статистике» поставки — видно, что кликабельна. */
.manager-link{color:var(--accent);text-decoration:underline;text-decoration-style:dotted;text-underline-offset:3px}
.manager-link:hover{color:var(--accent-soft);text-decoration-style:solid}
.manager-link .link-icon{font-size:11px;opacity:.7;margin-left:2px}

/* Заливка строки в учёте блокировок по виду блока (ТЗ 17.09).
   Соответствие цветов выведено из смысла: кража — самый тяжёлый случай,
   финмон — блок с деньгами, лимит перевода — рабочая ситуация, без блока —
   счёт отработал. Если у заказчика другое соответствие, меняется здесь. */
.block-row.kind-theft         { background: rgba(127, 29, 29, .38); }  /* тёмно-красный */
.block-row.kind-finmon        { background: rgba(239, 68, 68, .20); }  /* красный */
.block-row.kind-transfer_limit{ background: rgba(245, 158, 11, .18); } /* жёлтый */
.block-row.kind-none          { background: rgba(34, 197, 94, .16); }  /* зелёный */
.block-row td { vertical-align: top; }
.note-cell { max-width: 280px; white-space: normal; }
.note-cell a { word-break: break-all; }

/* Фильтры доски (ТЗ 17.09 п.8): узкая полоса над колонками, не отъедающая
   высоту у самой доски. */
.board-filters { margin-bottom: 10px; padding: 8px 10px; }
.board-filters label { font-size: 11px; }
.board-filters select, .board-filters input { padding: 4px 6px; font-size: 12px; }

/* Витрина финансиста: статус выплаты цветом (ТЗ 18.09, колонка R) */
.badge.pay-success { background: rgba(34,197,94,.22); color: #86efac; }
.badge.pay-pending { background: rgba(245,158,11,.2); color: #fcd34d; }
.badge.pay-fail    { background: rgba(239,68,68,.2); color: #fca5a5; }
/* Правка 22.09 п.14 — оплачен зелёным, всё остальное красным: у финансиста
   вопрос ровно один, «оплачено или нет», и жёлтая середина его не решает */
.pay-row.pay-success { background: rgba(34,197,94,.09); }
.pay-row.pay-fail,
.pay-row.pay-pending { background: rgba(239,68,68,.09); }
.reveal { cursor: pointer; border-bottom: 1px dashed var(--muted); }

/* Правка 17.09 п.3 и п.7 — чужой блок карточки виден как чужой, а не просто
   не нажимается: выключенные поля выглядели как обычные, и менеджер бился
   в них, не понимая, почему ничего не вводится. */
.panel-foreign { opacity: .72; border-style: dashed; }
.foreign-note {
  display: inline-block; font-size: 11px; color: var(--muted);
  border: 1px dashed var(--line); border-radius: 5px; padding: 1px 7px;
  margin-left: 6px;
}
/* Правка 17.09 п.5 — state отдельным блоком, зелёным */
.panel-state { border-color: rgba(34,197,94,.45); background: rgba(34,197,94,.07); }
.panel-state h2 { color: #86efac; }
.state-readonly { font-size: 15px; font-weight: 500; }

/* Скриншоты в комментариях (правка 18.09): миниатюра в треде, полный размер
   в модалке — уводить менеджера со страницы ради картинки незачем. */
.comment-shot { max-width: 240px; max-height: 160px; border-radius: 6px;
  border: 1px solid var(--line); margin-top: 6px; cursor: zoom-in; display: block; }
.shot-row { display: flex; gap: 8px; align-items: center; margin-top: 6px; }
.shot-row .form-input { flex: 1; }
#shot-preview img { max-width: 220px; max-height: 140px; margin-top: 6px;
  border-radius: 6px; border: 1px solid var(--line); }
#shot-modal { position: fixed; inset: 0; z-index: 50; display: flex;
  align-items: center; justify-content: center; }
/* display:flex перебивает браузерное [hidden]{display:none} — без этой строки
   модалка висит поверх страницы всегда: экран затемнён, клики не проходят,
   а пустой <img> рисуется битой картинкой. */
#shot-modal[hidden] { display: none; }
#shot-modal .shot-backdrop { position: absolute; inset: 0; background: rgba(0,0,0,.78); }
#shot-modal img { position: relative; max-width: 92vw; max-height: 92vh;
  border-radius: 8px; box-shadow: 0 18px 60px rgba(0,0,0,.6); cursor: zoom-out; }

/* Время с момента приёмки на месте прежней кнопки (правка 18.09 п.1) */
.accepted-timer { font-size: 12px; color: var(--muted); border: 1px solid var(--line);
  border-radius: 6px; padding: 3px 9px; white-space: nowrap; }

/* Таблица 500 (правка 18.09 п.3): сетка слотов, статус — цветом ячейки */
.slot-device { margin-bottom: 14px; }
.cloner { margin-top: 10px; }
.cloner-head { font-size: 12px; color: var(--muted); margin-bottom: 6px; }
.slot-grid { display: grid; gap: 6px;
  grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); }
.slot { display: grid; grid-template-columns: 22px 1fr; gap: 3px 5px;
  align-items: center; padding: 5px 7px; border: 1px solid var(--line);
  border-radius: 7px; background: var(--panel-2); }
.slot-no { grid-row: span 3; font-size: 11px; color: var(--muted); text-align: center; }
.slot input, .slot select { width: 100%; font-size: 12px; padding: 3px 5px;
  background: var(--panel); color: var(--text); border: 1px solid var(--line);
  border-radius: 5px; }
.slot-empty    { border-color: rgba(34,197,94,.35); }
.slot-accepted { border-color: var(--accent); }
.slot-pause    { border-color: rgba(245,158,11,.5); }
.slot-hold     { border-color: rgba(167,139,250,.5); }
.slot-dead     { border-color: rgba(239,68,68,.5); opacity: .75; }

/* ── Доска «500»: серверы → трубки → клонеры → аккаунты ──────────────────
   Перенос раздела с моб-сервера (доработки 21.09). Разметка и классы взяты
   из их фронта один в один, чтобы менеджеры читали доску не переучиваясь;
   цвета переведены на наши токены. */
.acc500-page { display: flex; flex-direction: column; gap: 14px; }

.acc-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: 10px; }
.acc-tile { position: relative; overflow: hidden; padding: 11px 14px;
  border: 1px solid var(--line); border-radius: var(--radius);
  background: linear-gradient(155deg, var(--panel-2), var(--panel)); }
.acc-tile-l { font-size: 11px; letter-spacing: .06em; text-transform: uppercase;
  color: var(--muted); }
.acc-tile-v { font: 700 24px/1.1 inherit; margin-top: 5px; }
.acc-tile.c-green .acc-tile-v { color: var(--ok); }
.acc-tile.c-yellow .acc-tile-v { color: var(--warn); }
.acc-tile.c-orange .acc-tile-v { color: #f9860b; }
.acc-tile.c-red .acc-tile-v { color: var(--bad); }
.acc-free-tile .acc-tile-v { color: var(--accent); }

.acc-legend { display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  color: var(--muted); font-size: 12.5px; }
.acc-legend b { color: var(--text); }
.acc-legend .cdot { display: inline-block; width: 9px; height: 9px; border-radius: 50%;
  margin-right: 6px; vertical-align: middle; background: var(--muted); }
.cdot.s-accepted { background: var(--ok); }
.cdot.s-pause { background: var(--warn); }
.cdot.s-hold { background: #f9860b; }
.cdot.s-dead { background: var(--bad); }

.acc-tools { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
/* Поля формы у нас во всю ширину — в строке фильтров это давало столбец */
.acc-tools .form-input, .acc-tools .form-select { width: auto; flex: 0 1 200px; }
.acc-tools #acc-search { flex: 1 1 260px; }

.acc-board { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(290px, 1fr);
  gap: 12px; overflow-x: auto; padding-bottom: 8px; align-items: start; }
@media (max-width: 860px) { .acc-board { grid-auto-flow: row; } }
.acc-board .hidden { display: none; }
.acc-col { border: 1px solid var(--line); border-top: 3px solid var(--srv, var(--accent));
  border-radius: var(--radius); background: var(--panel); padding: 10px; }
.acc-col-head { display: flex; align-items: center; gap: 8px; padding: 2px 4px 10px; }
.acc-col-head::before { content: ""; width: 9px; height: 9px; border-radius: 50%;
  background: var(--srv, var(--accent)); }
.acc-col-head b { font-size: 14px; }
.acc-col-n { margin-left: auto; min-width: 22px; text-align: center; padding: 1px 8px;
  border-radius: 999px; background: var(--panel-2); color: var(--muted);
  font-size: 12px; font-weight: 700; }
.acc-col-cards { display: flex; flex-direction: column; gap: 8px; }

.acc-dev { border: 1px solid var(--line); border-left: 3px solid var(--line);
  border-radius: var(--radius); background: var(--panel-2); overflow: hidden; }
.acc-dev.c-green { border-left-color: var(--ok); }
.acc-dev.c-yellow { border-left-color: var(--warn); }
.acc-dev.c-orange { border-left-color: #f9860b; }
.acc-dev.c-purple { border-left-color: var(--violet); }
.acc-dev.c-red { border-left-color: var(--bad); }
.acc-dev.locked { box-shadow: inset 3px 0 0 var(--bad); }
.dev-head { display: flex; align-items: center; gap: 8px; padding: 8px 10px;
  cursor: pointer; user-select: none; }
.dev-head:hover { background: rgba(255,255,255,.03); }
.dev-dot { border: 0; background: transparent; cursor: pointer; font-size: 13px;
  line-height: 1; padding: 0; }
.dev-open { flex: 1; min-width: 0; border: 0; background: transparent; text-align: left;
  color: var(--text); cursor: pointer; padding: 0; display: grid; gap: 2px; }
.dev-id-txt { font-weight: 600; font-size: 13px; }
.dev-sub { color: var(--muted); font-size: 11.5px; }
.dev-lock { color: var(--bad); font-size: 11px; font-weight: 700; }
.dev-mini { display: flex; gap: 4px; }
.dev-chev { color: var(--muted); transition: transform .18s ease; }
.acc-dev.open .dev-chev { transform: rotate(90deg); }
.dev-body { padding: 0 10px 10px; }
.dev-body.hidden { display: none; }
.dev-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: 6px; margin-bottom: 8px; }
.dev-fields .form-input { padding: 5px 8px; font-size: 12px; }
.dev-actions { display: flex; gap: 8px; margin-top: 8px; }

.cnt, .mini-cnt { display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 16px; padding: 0 4px; border-radius: 999px; font-size: 10.5px;
  font-weight: 700; font-style: normal; color: #0b0f14; }
.cnt.c-green { background: var(--ok); }
.cnt.c-yellow { background: var(--warn); }
.cnt.c-orange { background: #f9860b; }
.cnt.c-red { background: var(--bad); }
.cnt.c-purple { background: var(--violet); }

.cloners { display: flex; flex-direction: column; gap: 6px; }
.cloner { border: 1px solid var(--line); border-radius: 8px; background: var(--panel);
  overflow: hidden; }
.cloner-head { display: flex; align-items: center; gap: 8px; padding: 5px 8px; }
.cloner-toggle { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px;
  text-align: left; border: 0; background: transparent; color: var(--text);
  cursor: pointer; font-size: 12.5px; font-weight: 600; padding: 0; }
.cloner-toggle .chev { color: var(--muted); font-size: 11px; transition: transform .18s ease; }
.cloner.open .cloner-toggle .chev { transform: rotate(90deg); }
.cloner-n { color: var(--muted); font-weight: 500; }
.cloner-counts { display: flex; gap: 4px; }
.cloner-del { border: 0; background: transparent; color: var(--muted); cursor: pointer;
  font-size: 15px; line-height: 1; }
.cloner-del:hover { color: var(--bad); }
.cloner-body { padding: 8px; border-top: 1px solid var(--line); background: var(--panel-2); }
.cloner-body.hidden { display: none; }

.acc-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(48px, 1fr));
  gap: 5px; }
.acc-cell { position: relative; aspect-ratio: 1 / 1; display: flex; align-items: center;
  justify-content: center; border: 1px solid var(--line); border-radius: 9px;
  background: var(--panel); cursor: pointer; padding: 2px;
  font-variant-numeric: tabular-nums; transition: transform .08s ease; }
.acc-cell:hover { transform: translateY(-1px); border-color: var(--accent); }
.acc-cell-i { position: absolute; top: 3px; left: 5px; font-size: 9px; color: var(--muted);
  line-height: 1; }
.acc-cell-n { font-size: 12.5px; font-weight: 700; color: var(--text); }
.acc-cell.c-green { background: rgba(34,197,94,.22); border-color: rgba(34,197,94,.55); }
.acc-cell.c-yellow { background: rgba(245,158,11,.22); border-color: rgba(245,158,11,.55); }
.acc-cell.c-orange { background: rgba(249,134,11,.22); border-color: rgba(249,134,11,.55); }
.acc-cell.c-red { background: rgba(239,68,68,.22); border-color: rgba(239,68,68,.55); }

.acc-pop { position: absolute; z-index: 60; width: 226px; padding: 12px;
  border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel-2);
  box-shadow: 0 20px 46px rgba(0,0,0,.5); display: flex; flex-direction: column; gap: 10px; }
.acc-pop.hidden { display: none; }
.acc-pop-num, .acc-pop-ipn { width: 100%; padding: 7px 9px; border: 1px solid var(--line);
  border-radius: 8px; background: var(--panel); color: var(--text); font-size: 13px; }
.acc-pop-colors { display: flex; gap: 7px; }
.acc-pop-c { width: 26px; height: 26px; flex: none; border-radius: 50%;
  border: 2px solid transparent; cursor: pointer; background: var(--panel); }
.acc-pop-c.c-green { background: var(--ok); }
.acc-pop-c.c-yellow { background: var(--warn); }
.acc-pop-c.c-orange { background: #f9860b; }
.acc-pop-c.c-red { background: var(--bad); }
.acc-pop-c.c-none { background: repeating-linear-gradient(45deg, var(--panel), var(--panel) 4px,
  var(--line) 4px, var(--line) 7px); }
.acc-pop-c.active { border-color: var(--text); }
.acc-pop-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; }

.acc-note { position: fixed; left: 50%; bottom: 18px; transform: translateX(-50%) translateY(12px);
  z-index: 70; padding: 8px 16px; border-radius: 999px; background: var(--panel-2);
  border: 1px solid var(--line); color: var(--text); font-size: 13px; opacity: 0;
  pointer-events: none; transition: opacity .15s ease, transform .15s ease; }
.acc-note.on { opacity: 1; transform: translateX(-50%) translateY(0); }
.acc-note.bad { border-color: var(--bad); color: var(--bad); }

/* ── Полоса отдела над доской (правка 22.09 п.6) ─────────────────────────── */
.crew { display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
  margin: -4px 0 12px; }
.crew-total { font-size: 12px; color: var(--muted); border: 1px solid var(--line);
  border-radius: 999px; padding: 4px 12px; background: var(--panel); }
.crew-chip { display: inline-flex; align-items: center; gap: 6px; font-size: 12px;
  border: 1px solid var(--line); border-radius: 999px; padding: 4px 10px;
  background: var(--panel); color: var(--muted); }
.crew-chip b { color: var(--text); font-variant-numeric: tabular-nums; }
.crew-chip .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--line); }
.crew-chip.on { color: var(--text); }
.crew-chip.on .dot { background: var(--ok); box-shadow: 0 0 6px var(--ok); }

/* Правка 19.10 — на виду активные, остальные под «ещё N»; полоса не растёт
   выше трёх рядов даже при десятках активных, дальше она прокручивается */
.crew { max-height: 104px; overflow-y: auto; }
.crew-idle > summary { list-style: none; cursor: pointer; width: max-content; }
.crew-idle > summary::-webkit-details-marker { display: none; }
.crew-chip.more { cursor: pointer; border-style: dashed; }
.crew-idle[open] { flex: 0 0 100%; }
.crew-idle[open] > summary { color: var(--text); }
.crew-idle-list { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }

/* Подсказка над доской свёрнута (правка 19.10, «сверху ненужная инфа») */
.board-hint { margin: -4px 0 8px; }
.board-hint > summary { cursor: pointer; font-size: 12px; color: var(--muted);
  list-style: none; width: max-content; }
.board-hint > summary::-webkit-details-marker { display: none; }
.board-hint > summary::before { content: 'ⓘ '; }
.board-hint[open] > summary { margin-bottom: 4px; }
.board-hint .sub { margin: 0; }

/* Выбор ответственного на карточке доски (правка 22.09 п.4) */
.card-assign { margin-top: 6px; }
.card-assign .form-select { font-size: 12px; padding: 4px 6px; }

/* Всплывающие уведомления (правка 22.09 п.7) */
.notify-shelf { position: fixed; right: 18px; bottom: 18px; z-index: 80;
  display: flex; flex-direction: column; gap: 8px; max-width: 320px; }
.notify-pop { display: block; padding: 10px 14px; border-radius: var(--radius);
  border: 1px solid var(--accent); background: var(--panel-2); color: var(--text);
  font-size: 13px; box-shadow: 0 12px 30px rgba(0,0,0,.4); opacity: 0;
  transform: translateY(8px); transition: opacity .2s ease, transform .2s ease; }
.notify-pop.on { opacity: 1; transform: translateY(0); }

/* Разобранный отделом блок — зелёная строка (правка 22.09 п.15) */
.block-row.handled { background: rgba(34,197,94,.09); }

/* ── Дашборд «Банки» (правка 22.09 п.16–18) ─────────────────────────────── */
.pies { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 12px; margin-bottom: 18px; }
.pie-panel h2 { margin: 0 0 10px; font-size: 15px; }
.pie-row { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }
.pie { width: 150px; height: 150px; transform: rotate(-90deg); flex: none; }
.pie-hole { fill: var(--panel); }
.pie-seg { fill: transparent; stroke-width: 6; }
.pie-total { fill: var(--text); font-size: 6px; text-anchor: middle;
  transform: rotate(90deg); transform-origin: 21px 21px; font-weight: 700; }
.pie-legend { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px;
  font-size: 12.5px; }
.pie-legend li { display: flex; align-items: center; gap: 7px; }
.pie-legend i { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.pie-legend b { margin-left: auto; }
.pie-legend span { color: var(--muted); min-width: 42px; text-align: right; }
.ok-text { color: var(--ok); }
.two-col { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 12px; }

/* ── Мобильная доска (правка 22.09 п.2) ─────────────────────────────────────
   На телефоне колонки шириной 232 px и горизонтальная прокрутка превращают
   доску в щель: видно четверть карточки и ничего не понятно. Поэтому на узком
   экране колонки становятся секциями во всю ширину, одна под другой, а шапка
   колонки — липким заголовком, чтобы было видно, где ты. */
@media (max-width: 720px) {
  .board { display: block; overflow-x: visible; background: none; padding: 0 0 12px; }
  .board-col { width: auto; flex: none; margin-bottom: 10px; }
  .board-col-head { position: sticky; top: 52px; z-index: 3; background: var(--panel);
    padding: 6px 2px; margin: -6px -2px 8px; border-bottom: 1px solid var(--line); }
  /* Пустые колонки на телефоне только мешают скроллить */
  .board-col:has(.empty) { opacity: .55; }
  .card-kanban { padding: 10px 12px; }
  .card-kanban .form-select, .card-kanban .form-input { font-size: 15px; padding: 7px 9px; }
  .card-kanban .btn { padding: 8px 12px; }

  /* Полоса отдела на телефоне занимала треть экрана — сворачиваем в строку */
  .crew { gap: 6px; max-height: 64px; overflow-y: auto; }
  .crew-chip { font-size: 11.5px; padding: 3px 8px; }

  /* Фильтры доски — в одну колонку, а не в шесть узких */
  .board-filters { grid-template-columns: 1fr; display: grid; }
  .board-filters input, .board-filters select { width: 100%; }

  /* Таблицы на телефоне листаются пальцем, а не ломают вёрстку */
  .table-wrap { -webkit-overflow-scrolling: touch; }
  .cards { grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); }
  h1 { font-size: 20px; }
}

/* Черновик и ошибка сохранения поля (правка 24.09) */
.field-error { color: var(--bad); font-size: 11px; min-height: 0; margin-top: 2px; }
.has-error .form-input { border-color: var(--bad); }

/* Правка 25.09 — форма сотрудника: списки разделов отдельным блоком, иначе
   две колонки по два десятка галочек разносили общую сетку полей */
.form-split{margin:22px 0 4px;font-size:15px;border-top:1px solid var(--line);padding-top:16px}
.access-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:18px;
  margin-top:10px}
.check-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));
  gap:4px 12px;margin-top:4px}
.check-grid div{margin:0}
.check-grid label{display:flex;align-items:center;gap:6px;margin:0;color:var(--text);
  font-size:12px;cursor:pointer}
.check-grid input[type=checkbox]{width:auto;margin:0}
@media (max-width:720px){
  .access-cols{grid-template-columns:1fr}
  .check-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}
}

/* Первый заголовок панели без лишнего верхнего отступа: раньше это писали
   inline-стилем на каждом h2 */
.panel > h2:first-child{margin-top:0}

/* Правка 25.09 п.3 — скрин-пруф: ссылка под полем и просмотр модалкой */
.shot-line{margin-top:4px;font-size:11px}
.shot-line.hidden{display:none}
.shot-modal{position:fixed;inset:0;background:rgba(0,0,0,.78);display:flex;
  align-items:center;justify-content:center;padding:24px;z-index:60;cursor:zoom-out}
.shot-modal img{max-width:96vw;max-height:92vh;border-radius:10px;
  box-shadow:0 18px 50px rgba(0,0,0,.6)}

/* Правка 28.09 — компактная форма поставщика: поля узкой сеткой, чекбоксы
   банков в несколько колонок, между группами тонкая линия вместо пустоты */
.form-grid.tight{grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px 14px}
.supplier-form h2.form-split,.supplier-form h3.form-split{margin:18px 0 2px;font-size:14px}
.supplier-form .wallet-row{border:1px solid var(--line);border-radius:9px;padding:10px}
.supplier-form ul{list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:2px 10px}
.supplier-form ul label{display:flex;align-items:center;gap:6px;margin:0;
  color:var(--text);font-size:12px}
.supplier-form ul input[type=checkbox]{width:auto;margin:0}

/* Правка 28.09 п.11 — поле-пруф принимает скрин мышью и из буфера */
.task-field.shot-over{outline:2px dashed var(--accent);outline-offset:3px;border-radius:8px}

/* Правка 28.09 — модалка запроса оплаты анкеты */
.payout-modal{position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:70;
  display:flex;align-items:flex-start;justify-content:center;padding:40px 16px;
  overflow:auto}
.payout-modal[hidden]{display:none}
.payout-form{max-width:640px;width:100%;margin:0}
.btn.green{background:var(--ok,#22c55e)}
.btn.green:disabled{opacity:.55;cursor:default}
.reject-form{display:inline-flex;gap:4px;align-items:center;margin-left:6px}
.reject-form .form-input{width:150px;padding:5px 8px;font-size:12px}

/* Правка 28.09 п.7 — панель аренды трубок */
.rt-table td{vertical-align:top}
.rt-row.rt-free td:first-child{box-shadow:inset 3px 0 0 var(--ok,#22c55e)}
.rt-row.rt-in_use td:first-child{box-shadow:inset 3px 0 0 var(--warn,#f59e0b)}
.rt-row.rt-reserved td:first-child{box-shadow:inset 3px 0 0 var(--accent)}
.rt-row.rt-broken td:first-child,.rt-row.rt-maintenance td:first-child{
  box-shadow:inset 3px 0 0 var(--bad,#ef4444);opacity:.7}
.rt-row.rt-mine{background:color-mix(in srgb,var(--accent) 8%,transparent)}
.rt-form{display:inline-flex;gap:4px;align-items:center}
.rt-form .form-input{width:120px;padding:5px 8px;font-size:12px}
.rt-actions form{margin:0 2px 2px 0}
.rt-lead-row{display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:6px 0;border-bottom:1px solid var(--line)}
.mini.bad{color:var(--bad,#ef4444)}

/* Правка 29.09 — запрос оплаты живёт в анкете, рядом с её полями */
.payout-line{margin:10px 0 4px;display:flex;flex-direction:column;gap:6px}

/* Правка 29.09 — при прокрутке доски вниз исчезали разделы слева и шапки
   колонок, и было непонятно, куда тащить карточку. Держим то и другое на
   виду: боковое меню липнет под верхним меню. Высота 52px — это шапка
   (.topbar), она уже sticky. */
.shell.with-side .sidenav{position:sticky;top:52px;align-self:start;
  max-height:calc(100vh - 52px);overflow-y:auto}

/* Той же правке доску не вылечило: position:sticky у шапки колонки отмеряет
   от ближайшего прокручиваемого предка, а .board из-за overflow-x:auto сам
   стал таким (по спецификации второй оси visible превращается в auto). Внутри
   себя доска по вертикали не прокручивалась, поэтому шапка просто уезжала
   вместе со страницей.

   Поэтому доску не листают страницей вообще: на ширине от планшета экран
   занимают шапка, фильтры и сама доска, а прокручивается каждая колонка
   отдельно. Шапка колонки липнет к её верху, разделы слева и «куда тащить»
   всегда на месте, и колонка-цель видна во всю высоту. */
/* Колонка сама решает, где её верх: без этого sticky-заголовок уезжает за
   границу колонки вместе с её фоном */
.board-col{align-self:stretch}

@media (min-width: 721px) {
  /* Правило живёт здесь, а не выше: на телефоне доска — это список секций,
     и там шапка колонки липнет к верхнему меню (top:52px, media до 720px).
     Если объявить его снаружи, оно перебьёт мобильное просто тем, что идёт
     ниже по файлу. */
  .board-col-head{position:sticky;top:0;z-index:4;background:var(--panel);
    padding:6px 0 8px;margin-top:-6px}
}

/* Экран-во-весь-экран включаем только с настольной ширины. До 900px разделы
   стоят строкой чипов и переносятся на вторую-третью строку, а высота тут
   была заперта в 100vh: лишние ряды уезжали в скрытую прокрутку, и раздел
   просто пропадал с экрана — без полосы, без намёка. На планшете и в
   альбомной ориентации страница теперь прокручивается как обычная. */
@media (min-width: 901px) {
  body.board-page{height:100vh;overflow:hidden}
  body.board-page .shell{height:calc(100vh - 52px);min-height:0}
  body.board-page .shell.with-side .sidenav{position:static;max-height:100%}
  /* Albus 03.11 13:59 («скролл вниз ушёл, не даёт вниз листать»; доска поставки): над доской
     «Что нового», сообщение, фильтры и полоса менеджеров — колонкам оставалась полоска. Теперь у
     доски есть минимальная высота, а лишнее листается внутри страницы */
  body.board-page .wrap{display:flex;flex-direction:column;
    height:100%;min-height:0;overflow-y:auto;overflow-x:hidden}
  /* Доска забирает остаток экрана: min-height:0 обязателен, иначе flex-элемент
     не даёт себя сжать и прокрутка снова уезжает на страницу */
  /* Вчерашнюю ширину по содержимому сняла правка 30.09: колонки сами делят
     строку, пустому полю справа взяться неоткуда, а max-content мешал бы им
     растягиваться — доска получила бы ширину суммы колонок и только */
  body.board-page .board{flex:1 0 auto;min-height:max(360px, 60vh);height:0;overflow:auto;
    align-items:stretch}
  body.board-page .board-col{max-height:100%;overflow-y:auto}
  /* Правка 19.10 — полоса менеджеров и подсказка не сжимаются под доску: у полосы
     свой потолок (max-height), доска забирает только остаток */
  body.board-page .crew, body.board-page .board-hint{flex-shrink:0}
  /* Пользователь 28.10 — колонки не доходили до низа экрана: у страницы общий нижний
     отступ 60px, на доске он оставлял пустую полосу под колонками */
  body.board-page .wrap{padding-bottom:14px}
  body.board-page .board{padding-bottom:2px}
}

/* Пользователь 28.10 — «некрасивые скроллбары»: полосы прокрутки доски, колонок, полосы
   менеджеров и меню слева — тонкие, в цвет рамок, без серой дорожки */
.board, .board-col, .crew, .sidenav{scrollbar-width:thin;scrollbar-color:var(--line) transparent}

/* ── очередь ACQ (правка 28.09) ───────────────────────────────────────────
   Строка-«карточка» вместо таблицы: у процессинга в строке и свои поля, и
   данные подвязки, в столбцы это не укладывается. */
.acq-row{padding:10px 14px;margin-bottom:10px}
.acq-row[open]{border-color:var(--accent)}
.acq-head{display:flex;gap:14px;align-items:flex-start;cursor:pointer;
          list-style:none}
.acq-head::-webkit-details-marker{display:none}
.acq-head-id{display:flex;flex-direction:column;gap:5px;min-width:120px}
.acq-head-grid{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr));
               gap:6px 14px;flex:1}
.acq-head-state{display:flex;flex-direction:column;gap:5px;min-width:150px}
/* Срочные задачи 20.10, п. 6 — способ оплаты не указан: красная рамка, пока не выберут */
.acq-head-state select.need{border-color:var(--bad)}
.acq-head .btn[disabled]{opacity:.45;cursor:not-allowed}
.acq-l{display:block;font-size:10.5px;letter-spacing:.05em;
       text-transform:uppercase;color:var(--muted)}
.acq-sect{font-size:12px;letter-spacing:.06em;text-transform:uppercase;
          color:var(--muted);border-left:3px solid var(--accent);
          padding-left:8px;margin:14px 0 8px}
.acq-white,.acq-black{display:grid;
    grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px}
.acq-field label{display:block;font-size:11px;color:var(--muted);margin-bottom:3px}
.acq-field input,.acq-field select,.acq-field textarea{width:100%}
.acq-ro{padding:7px 9px;border:1px solid var(--line);border-radius:6px;
        background:var(--panel-2);font-size:13px;min-height:33px}

/* Таймер «в Принято». Правка 08.10 убрала отсюда галочку «берётся сразу»
   вместе с самой выдержкой 24 часа */
.hold-box{display:flex;align-items:center;gap:10px;flex-wrap:wrap}

/* Правка 30.09 — поле, которое подставилось само (возраст по ИПН, сервер по
   трубке): короткая подсветка, иначе подстановку не замечают */
.task-field.auto-filled input,.task-field.auto-filled select{
  border-color:var(--ok,#22c55e);transition:border-color .4s}

/* Правка 30.09 — номер столбца на чипе: показывает, в каком порядке столбцы
   встанут в таблице (порядок кликов) */
.chip [data-cols-no]{display:inline-flex;align-items:center;justify-content:center;
  min-width:16px;height:16px;padding:0 4px;border-radius:9px;font-size:10px;
  background:var(--accent);color:#fff}

/* Правка 02.10 — кнопка просмотра скрина рядом с кнопкой вставки */
.shot-eye{padding:4px 8px;line-height:1.2;text-decoration:none}
.shot-eye.hidden{display:none}
.payout-done{margin-top:8px}
.payout-done summary::-webkit-details-marker{display:none}

/* Правка 02.10 — чек-лист на форме заявки: в две-три колонки, иначе
   шестнадцать пунктов растягивают форму на экран */
.check-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
  gap:2px 18px}

/* Правка 02.10 — телефон: минимум для отдела поставки. Доска уже стала
   списком секций (правка 22.09), здесь остальное: шапка, боковое меню,
   формы и таблицы перестают требовать горизонтальной прокрутки. */
@media (max-width: 720px) {
  .topbar{flex-wrap:wrap;gap:8px 12px;padding:8px 12px;position:static}
  .topbar .nav{order:3;width:100%;overflow-x:auto;gap:4px;padding-bottom:2px}
  .topbar .nav a{white-space:nowrap}
  .user-box .who em{display:none}
  .shell.with-side{display:block}
  .shell.with-side .sidenav{position:static;flex-direction:row;flex-wrap:wrap;
    min-height:0;border-right:0;border-bottom:1px solid var(--line);
    padding:8px 12px;gap:6px;max-height:none}
  .sidenav-title{display:none}
  .sidenav a{padding:6px 10px;font-size:13px}
  .sidenav a::after{display:none}
  .shell.with-side .wrap{padding:14px 12px 40px}
  .filters{gap:8px}
  .filters>div{min-width:0;flex:1 1 140px}
  .form-grid,.form-grid.tight,.check-grid,.task-fields{grid-template-columns:1fr}
  .cards{grid-template-columns:repeat(auto-fit,minmax(120px,1fr))}
  .actions{flex-wrap:wrap}
  .btn{padding:10px 14px}
  /* Карточка заявки: две колонки анкеты складываются в одну */
  .row{flex-direction:column}
  .row>div{flex:1 1 auto !important;width:100%}
}

/* Правка 02.10 — текущий статус читается текстом, а не только по выбранному
   пункту списка: селект мог прийти пустым (перевод страницы расширением) */
.state-now{font-size:13px;color:var(--muted);margin-bottom:6px}
.state-now b{color:var(--text);font-size:15px}

/* Правка 05.10 — поле скрина в очереди принимает вставку из буфера */
.acq-shot{outline:none}
.acq-shot.shot-over{outline:2px dashed var(--accent);outline-offset:3px;border-radius:8px}
.acq-shot.acq-shot-ready input[type=file]{border-color:var(--ok,#22c55e)}

/* Правка 05.10 — соседние блоки статистики выравниваются по верху, а
   таблицы — по строке заголовков: у блоков теперь одинаковая структура */
.row.stats-pair{align-items:flex-start}
.row.stats-pair>div{flex:1 1 320px;min-width:0}
.two-col>div>h2:first-child{margin-top:0}

/* Правка 05.10 — оплаченное размещение только для чтения: строка гаснет */
.placement-paid{opacity:.55}
.placement-paid b{font-weight:500}
.placement-shot{min-width:230px}
/* Правка 06.10 — поле скрина встаёт в одну строку с остальными: подсказка
   ушла в заголовок, а нативный file-инпут получил высоту обычного поля */
.placement-shot label i{font-style:normal;font-size:11px;opacity:.75}
.placement-shot input[type=file]{width:100%;padding:7px 10px;background:var(--bg);
  border:1px solid var(--line);border-radius:7px;color:var(--text);font-size:12px}
.placement-shot input[type=file]::file-selector-button{margin-right:8px;padding:3px 9px;
  background:var(--panel-2);border:1px solid var(--line);border-radius:6px;
  color:var(--text);font-size:12px;font-family:inherit;cursor:pointer}

/* Правка 05.10 — рекламодатели полосами: из каких банков пришли счета */
.adv-list{display:flex;flex-direction:column;gap:10px;margin-bottom:18px}
.adv-row{background:var(--panel);border:1px solid var(--line);border-radius:10px;
  padding:10px 14px}
.adv-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px}
.adv-bar{display:flex;height:10px;border-radius:6px;overflow:hidden;
  background:var(--panel-2);margin:6px 0 4px}
.adv-bar i{display:block;height:100%;background:var(--accent)}
.adv-bar i:nth-child(2){background:var(--ok,#22c55e)}
.adv-bar i:nth-child(3){background:var(--warn,#f59e0b)}
.adv-bar i:nth-child(4){background:var(--violet,#a78bfa)}
.adv-bar i:nth-child(5){background:var(--bad,#ef4444)}
.adv-legend{color:var(--muted)}

/* Правка 05.10 — цель вписывают прямо в таблицу: узкое поле под число */
.target-input{width:90px;text-align:right;padding:5px 8px}
.bad-text{color:var(--bad)}
/* Albus 04.11 12:47 — «Статусы моих задач»: комментарий под статусом сжат в две строки (целиком —
   во всплывающей подсказке), выплаты дропу, дроповоду и бонусом — строками с отступом */
.mt-note{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  max-width:22em}
.mt-pay{min-width:9em}
.mt-pay-line{margin-bottom:4px}
.mt-pay-line .badge{margin-right:4px}

/* ── Правка 06.10 — «Менеджеры»: карточки смены, банки и график ───────── */
.row-between{display:flex;justify-content:space-between;align-items:center;gap:12px;
  flex-wrap:wrap;margin-bottom:8px}
.team-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));
  gap:10px;margin-bottom:16px}
.team-card{background:var(--panel);border:1px solid var(--line);border-radius:10px;
  padding:10px 12px}
.team-card.team-on{border-color:var(--ok)}
.team-card .dot{display:inline-block;width:7px;height:7px;border-radius:50%;
  background:var(--line);margin-right:4px}
.team-card .dot-on{background:var(--ok);box-shadow:0 0 6px var(--ok)}
.chk{display:inline-flex;align-items:center;gap:6px;color:var(--text);font-size:12px;
  margin:0;white-space:nowrap}
.chk input{width:auto}
/* Банки менеджера раскрываются якорем: обычный блок, скрытый до :target */
.bank-pick{display:none}
.bank-pick:target{display:block}
.bank-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));
  gap:8px;margin:10px 0 14px}
.shift-grid td{vertical-align:middle}
.shift-grid .shift-cell{min-width:104px;font-size:12px;padding:5px 7px}
/* Правка 06.10 — кнопка переноса в мобсервер в одной строке с полями банка */
/* 30.10 — кнопки переноса и отметки «админка/мобсервер …» в одном ряду с промежутком; подпись
   под ними отдельной строкой */
.mob-line{margin:10px 0 0;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.mob-line .mini{flex-basis:100%}
/* 30.10 — список и кнопка «Применить» одной строкой (снять/передать в панели процессинга) */
.inline-pick{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:10px}
.inline-pick > select{flex:1 1 160px;min-width:0}
.inline-pick > div:first-of-type{min-width:160px}
.inline-pick .btn{flex:0 0 auto}
/* Albus 31.10 15:54 — «Статусы моих задач» на телефоне: кнопки оплаты под ФИО, колонка «Оплата»
   уезжает вправо */
.mt-actions{display:none}
@media (max-width:720px){.mt-actions{display:block;margin-top:6px}.mt-actions:empty{display:none}}

/* Баг-фикс 06.10 — выбор смены в клетке графика: попап на <details> */
.shift-pick{position:relative}
.shift-pick>summary{list-style:none;cursor:pointer;display:inline-block;
  min-width:72px;text-align:center;padding:4px 9px;border-radius:7px;
  border:1px solid var(--line);background:var(--panel-2);font-size:12px}
.shift-pick>summary::-webkit-details-marker{display:none}
.shift-pick[open]>summary{border-color:var(--accent)}
.shift-chip.shift-off,.shift-chip.shift-none{color:var(--muted)}
.shift-chip.shift-sick{color:var(--bad);border-color:var(--bad)}
.shift-chip.shift-vacation{color:var(--warn,#f59e0b)}
.shift-chip.shift-work{color:var(--text)}
.shift-menu{position:absolute;z-index:30;top:calc(100% + 4px);left:0;width:230px;
  padding:10px;border:1px solid var(--line);border-radius:10px;
  background:var(--panel);box-shadow:0 10px 30px rgba(0,0,0,.45)}
.shift-spans{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
.shift-menu .shift-wide{display:block;width:100%;margin-bottom:6px;text-align:center}
.shift-own{display:flex;gap:6px;margin:8px 0}
.shift-own input{font-size:12px;padding:5px 8px}

/* Правка 06.10 — суммы и заявка на разблок в строке таблицы блоков */
.block-handle{display:flex;gap:5px;align-items:center;margin-bottom:5px;flex-wrap:wrap}
.block-handle .form-input{width:92px;font-size:12px;padding:4px 7px}

/* Правка 06.10 — кликабельные плитки статистики ведут в разбор */
a.card-link{text-decoration:none;color:inherit;cursor:pointer}
a.card-link:hover{border-color:var(--accent)}

/* Правка 07.10 — разбор очереди: почему карточки стоят без менеджера */
.assign-note{margin-bottom:14px;border-color:var(--warn,#f59e0b)}
.assign-list{margin:8px 0 6px;padding-left:18px;font-size:13px}
.assign-list li{margin-bottom:3px}

/* Правка 07.10 — зона вставки скрина: по голому file-инпуту кликали,
   открывался системный диалог, и Ctrl+V уходил уже в него */
.shot-drop{display:flex;flex-direction:column;gap:2px;justify-content:center;
  min-height:38px;padding:5px 10px;border:1px dashed var(--line);border-radius:7px;
  background:var(--bg);cursor:pointer;outline:none}
.shot-drop b{font-size:12px;font-weight:500}
.shot-drop:focus,.shot-drop:hover{border-color:var(--accent)}
.acq-shot-ready .shot-drop{border-color:var(--ok,#22c55e);border-style:solid}
/* Правка 13.10 — скрин в учёте обязателен: зона вставки говорит об этом
   сама, потому что спрятанный file-инпут браузер подсветить не может */
.shot-drop.shot-missing{border-color:var(--bad);border-style:solid}
.shot-drop.shot-missing b{color:var(--bad)}
.shot-input-hidden{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
/* 30.10 — правило input[type=url]{width:100%} сильнее класса: спрятанное поле ссылки растягивалось
   на всю ширину и давало странице лишнюю горизонтальную прокрутку («Рекламодатели») */
input.shot-input-hidden{width:1px;height:1px;padding:0;border:0;overflow:hidden}

/* Правка 07.10 — переключение периода графика: стрелки подписаны и стоят
   рядом с датами, а не у правого края экрана */
.period-nav{display:flex;align-items:center;gap:10px;margin:0 0 6px;flex-wrap:wrap}
.period-nav b{font-size:14px}
/* Месячный обзор графика: клетка — ссылка на свою неделю */
a.shift-chip{display:inline-block;text-decoration:none;min-width:58px;
  text-align:center;padding:3px 6px;border-radius:6px;border:1px solid var(--line);
  background:var(--panel-2);font-size:11px}
a.shift-chip:hover{border-color:var(--accent)}

/* ── Правка 07.10 — таба «Статистика» в виде, который показал заказчик ──
   Крупные показатели с изменением к прошлому отрезку, две полосы по дням,
   приём по банкам и рейтинг менеджеров полосой. */
.stat-main{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  gap:12px;margin-bottom:10px}
.stat-card{position:relative;background:var(--panel);border:1px solid var(--line);
  border-left-width:3px;border-radius:12px;padding:14px 16px}
.stat-card.stat-1{border-left-color:var(--ok,#22c55e)}
.stat-card.stat-2{border-left-color:var(--warn,#f59e0b)}
.stat-card.stat-3{border-left-color:var(--accent)}
.stat-key{display:block;font-size:11px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--muted);margin-bottom:6px}
.stat-value{display:block;font-size:30px;line-height:1.1;font-weight:600}
.stat-delta{display:block;margin-top:6px;font-size:12px;color:var(--muted)}
.stat-delta i{font-style:normal;margin-left:6px;opacity:.75}
.stat-delta.stat-up{color:var(--ok,#22c55e)}
.stat-delta.stat-down{color:var(--bad)}

.stat-small{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
  gap:10px;margin-bottom:16px}
.stat-chip{display:block;background:var(--panel);border:1px solid var(--line);
  border-left-width:3px;border-radius:10px;padding:10px 14px;text-decoration:none;
  color:inherit}
a.stat-chip:hover{border-color:var(--accent)}
.stat-chip b{display:block;font-size:22px;font-weight:600;line-height:1.2}
.stat-chip i{font-style:normal;font-size:11px;color:var(--muted)}
.stat-chip.chip-waiting{border-left-color:var(--violet,#a78bfa)}
.stat-chip.chip-ban{border-left-color:var(--bad)}
.stat-chip.chip-pause{border-left-color:var(--warn,#f59e0b)}

/* Две полосы рядом в столбце дня: «обработал» и «принял» */
.chart-pair{margin-bottom:0}
.pair-cols{display:flex;align-items:flex-end;justify-content:center;gap:2px;
  width:100%;height:100%}
.pair-cols i{display:block;width:45%;min-height:2px;border-radius:3px 3px 0 0}
.pair-cols .col-taken{background:var(--panel-2);border:1px solid var(--line);
  border-bottom:0}
.pair-cols .col-accepted{background:var(--accent)}
.legend{display:inline-block;width:9px;height:9px;border-radius:2px;
  margin:0 3px 0 10px;vertical-align:middle}
.legend-taken{background:var(--panel-2);border:1px solid var(--line)}
.legend-accepted{background:var(--accent)}

.bank-bars{list-style:none;margin:0;padding:0;font-size:13px}
.bank-bars li{display:grid;grid-template-columns:120px 1fr 44px;gap:10px;
  align-items:center;padding:4px 0}
.bank-bars li span{color:var(--muted);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.bank-bars li b{text-align:right}
.bank-bars .bank-total{border-top:1px solid var(--line);margin-top:4px;
  padding-top:8px}

.rank-bar{position:relative;height:18px;border-radius:5px;background:var(--panel-2);
  overflow:hidden;min-width:120px}
.rank-bar i{display:block;height:100%;background:var(--accent);opacity:.65}
.rank-bar em{position:absolute;inset:0;display:flex;align-items:center;
  padding-left:8px;font-style:normal;font-size:11px}
/* Правка 09.10 — менеджер «на стопе»: упёрся в лимит, заявки ему не идут */
.team-card.team-stop{border-color:var(--bad)}
/* Правка 09.10 — загрузка по банкам: лимит действует на каждый отдельно */
.bank-load{line-height:1.5}

/* Правка 13.10 — возврат на доску прямо на карточке архива смен */
.card-kanban .card-assign{display:flex;gap:6px;align-items:center;margin-top:6px}
.card-kanban .card-assign .form-select{flex:1;min-width:0}

/* Правка 08.10 — статус и оплата в правом верхнем углу карточки доски.
   Не абсолютом: длинный статус («Нет в админ панели») наехал бы на ФИО,
   а так метки просто переносятся на вторую строку. */
.card-marks{display:flex;flex-wrap:wrap;gap:4px;justify-content:flex-end;
            margin-bottom:4px}
.card-marks .badge{font-size:11px}

/* ── доплаты (постановка 14.10) ───────────────────────────────────────────
   Цвета строк из §1.4: ждёт — зелёный, взята — жёлтый, оплачена — серый.
   Красным кричат просроченные и отклонённые: по первым сорван срок, по
   вторым ждут новых реквизитов, и обе требуют человека. Цвет — полосой
   слева, а не заливкой: заливка на десяти строках читается как авария. */
.dopl-row{border-left:3px solid var(--line)}
.dopl-row.dopl-ok{border-left-color:var(--ok,#22c55e)}
.dopl-row.dopl-warn{border-left-color:var(--warn)}
.dopl-row.dopl-bad{border-left-color:var(--bad)}
.dopl-row.dopl-done{border-left-color:var(--muted);opacity:.72}
/* §1.1 — новая заявка подсвечивается, пока её не открыли */
.dopl-row.dopl-fresh{box-shadow:inset 3px 0 0 var(--accent)}
.dopl-body{display:flex;flex-direction:column;gap:12px;padding:10px 14px 14px}
.dopl-facts{display:grid;gap:10px 12px;
            grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}
.dopl-act{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;
          padding-top:10px;border-top:1px solid var(--line)}
.dopl-act .acq-field{min-width:180px}
/* Подсказка по картам списания: список приходит от партнёра, выбор мышью */
.dopl-hits{display:flex;flex-direction:column;gap:2px;margin-top:4px}
.dopl-hit{text-align:left;font-family:ui-monospace,monospace;font-size:12px;
          padding:6px 8px;border:1px solid var(--line);border-radius:6px;
          background:var(--panel-2);color:var(--text);cursor:pointer}
.dopl-hit:hover{border-color:var(--accent)}

/* Срочные задачи 20.10, п. 5: строка «вставь id девайса» под списком девайсов */
.device-add{display:flex;gap:6px;margin-top:6px}
.device-add .form-input{flex:1;min-width:0}

/* Срочные задачи 20.10, п. 2–3: кнопка «Открыть трубку» и правка ссылки в таблице «Трубки», кнопка на доске «500» */
.rt-open{margin-top:5px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.rt-url summary{cursor:pointer;color:var(--muted)}
.rt-url .rt-form{display:flex;gap:6px;margin-top:5px}
.rt-url .form-input{min-width:220px}
.dev-link{margin-left:8px;text-decoration:none;white-space:nowrap}
.dev-link.hidden{display:none}

/* ── светлая тема (срочные задачи 20.10, п. 7) ─────────────────────────────
   «Лайт режим: на чёрном, когда много карточек, их не видно». Включается кнопкой
   в шапке (скрипт theme.js ставит data-theme на <html>), по умолчанию тёмная.
   Почти всё в стилях сидит на переменных, поэтому здесь они и подменяются; ниже
   только то, что в тёмной теме было задано цветом напрямую. */
.theme-toggle{padding:4px 9px;font-size:14px;line-height:1}
:root[data-theme="light"]{
  color-scheme: light;
  --bg:#e9edf2; --panel:#ffffff; --panel-2:#f1f4f8; --line:#cbd3de;
  --text:#18212b; --muted:#566475; --accent:#2563eb; --accent-soft:#1d4ed8;
  --ok:#15803d; --warn:#b45309; --bad:#dc2626; --violet:#7c3aed;
}
:root[data-theme="light"] .panel,
:root[data-theme="light"] .card,
:root[data-theme="light"] .table-wrap{box-shadow:0 1px 2px rgba(15,23,42,.08)}
:root[data-theme="light"] .badge.ok{color:#166534;border-color:#86efac;background:#dcfce7}
:root[data-theme="light"] .badge.warn{color:#92400e;border-color:#fcd34d;background:#fef3c7}
:root[data-theme="light"] .badge.bad{color:#991b1b;border-color:#fca5a5;background:#fee2e2}
:root[data-theme="light"] .badge.info{color:#1e40af;border-color:#93c5fd;background:#dbeafe}
:root[data-theme="light"] .badge.violet{color:#5b21b6;border-color:#c4b5fd;background:#ede9fe}
:root[data-theme="light"] .msg.success{color:#166534;border-color:#86efac;background:#dcfce7}
:root[data-theme="light"] .msg.error{color:#991b1b;border-color:#fca5a5;background:#fee2e2}
:root[data-theme="light"] .msg.warning{color:#92400e;border-color:#fcd34d;background:#fef3c7}
:root[data-theme="light"] .badge.pay-success{background:rgba(34,197,94,.18);color:#166534}
:root[data-theme="light"] .badge.pay-pending{background:rgba(245,158,11,.2);color:#92400e}
:root[data-theme="light"] .badge.pay-fail{background:rgba(239,68,68,.16);color:#991b1b}
:root[data-theme="light"] .panel-state h2{color:#166534}
:root[data-theme="light"] .block-row.kind-theft{background:rgba(220,38,38,.14)}
:root[data-theme="light"] .dev-head:hover{background:rgba(15,23,42,.05)}

/* Аренда карты через Lab (док 16.10, п. 1): статус заявки под кнопкой оплаты */
.lab-line{margin-top:8px}
.lab-line .actions{margin-top:6px;gap:6px}
.lab-line form{display:inline}
.lab-body pre{margin:6px 0 0;padding:8px;border:1px solid var(--line,#2a3140);border-radius:6px;white-space:pre-wrap;word-break:break-word}

/* ── Albus 21.10 п. 3: статус в таблицах виден целиком и окрашен по группе ── */
.state-cell{white-space:nowrap}
.state-cell .badge{margin:0 6px 0 0;vertical-align:middle}
.state-cell select[data-row-state]{vertical-align:middle}
.state-select,[data-state-cell] select[data-row-state]{min-width:13em}
.st-ok select[data-row-state]{color:var(--ok);border-color:#14532d;background:#052e16}
.st-warn select[data-row-state]{color:var(--warn);border-color:#78350f;background:#271a06}
.st-bad select[data-row-state]{color:var(--bad);border-color:#7f1d1d;background:#2a0d0d}
.st-info select[data-row-state]{color:var(--accent);border-color:#1e3a8a;background:#0b1a35}
.st-violet select[data-row-state]{color:var(--violet);border-color:#4c1d95;background:#170b2e}
:root[data-theme="light"] .st-ok select[data-row-state]{color:#166534;border-color:#86efac;background:#dcfce7}
:root[data-theme="light"] .st-warn select[data-row-state]{color:#92400e;border-color:#fcd34d;background:#fef3c7}
:root[data-theme="light"] .st-bad select[data-row-state]{color:#991b1b;border-color:#fca5a5;background:#fee2e2}
:root[data-theme="light"] .st-info select[data-row-state]{color:#1e40af;border-color:#93c5fd;background:#dbeafe}
:root[data-theme="light"] .st-violet select[data-row-state]{color:#5b21b6;border-color:#c4b5fd;background:#ede9fe}

/* ── Albus 21.10 п. 8: вторая полоса прокрутки над широкой таблицей (tablescroll.js) ── */
.table-topscroll{overflow-x:auto;overflow-y:hidden;height:14px;margin-bottom:4px}
.table-topscroll>div{height:1px}
/* Albus 21.10 п. 6 — отметка «дбсм»: подвязка сменила статус после работы процессинга */
.badge.dbsm{color:var(--muted,#9aa3b2);border-color:var(--line,#2a3340);background:transparent;margin-left:4px}
/* ── Woody/Albus 21.10: ровные строки таблицы «Подвязка» ──────────────────── */
/* все ячейки по средней линии и без переносов; длинный текст (комментарии) переносится как раньше */
.binding-table td{vertical-align:middle;white-space:nowrap}
/* Pacifica 28.10 — строка фильтров по столбцам под заголовком «Подвязки» */
.binding-table tr.col-filters th{padding:4px 6px;font-weight:400}
.binding-table .cf-input{width:100%;min-width:6em;box-sizing:border-box;font-size:12px;padding:3px 6px}
.binding-table .cf-input.active{border-color:var(--accent);background:var(--panel-2)}
.binding-table td.note-cell{white-space:normal}
.binding-table .row-link{display:inline}
.binding-table .name-cell .mini{margin-left:6px}
/* список статуса одной ширины во всех строках: иначе ширина плясала от набора статусов */
.binding-table select[data-row-state]{width:15em;min-width:0}  /* док 26.10 — «чуть уменьшить» */
/* бейдж статуса одной ширины: «Готов» и «Готов руками» были разной ширины и сдвигали список
   (стенд 21.10, скрин пользователя); длинное название режется многоточием, целиком оно в списке рядом */
.binding-table .state-cell [data-state-badge]{display:inline-block;width:11.5em;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;text-align:center}

/* ── С-82: аналитика процессинга (вкладки отдела выплат, kk1sa) ─────────── */
.analytics{--text2:var(--muted);--green:var(--ok);--red:var(--bad);--yellow:var(--warn);
  --blue:var(--accent);--border:var(--line)}
.analytics-tabs{flex-wrap:wrap}
.analytics .an-filters{margin-bottom:12px;padding:10px 14px}
.analytics .fr{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end}
.analytics .fg label{display:block;font-size:11px;color:var(--muted);margin-bottom:3px}
.analytics .fg select,.analytics .fg input{padding:5px 8px;border-radius:7px;border:1px solid var(--line);
  background:var(--panel-2);color:var(--text)}
.analytics .kg{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:14px}
.analytics .kc{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px}
.analytics .kl{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.6px;margin-bottom:5px}
.analytics .kv{font-size:20px;font-weight:700}
.analytics .kv.g{color:var(--ok)}.analytics .kv.y{color:var(--warn)}.analytics .kv.r{color:var(--bad)}
.analytics .kv.bl{color:var(--accent)}.analytics .kv.ac{color:var(--violet)}
.analytics .ks{font-size:10px;color:var(--muted);margin-top:2px}
.analytics .sc{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;margin-bottom:14px}
.analytics .sc h3{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;margin:0 0 12px;
  display:flex;align-items:center;gap:8px}
.analytics .d{width:4px;height:14px;background:linear-gradient(180deg,var(--accent),var(--violet));border-radius:2px}
.analytics .g2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.analytics .g3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px}
@media (max-width:900px){.analytics .g2,.analytics .g3{grid-template-columns:1fr}}
.analytics .tw{overflow-x:auto}
.analytics table.t{width:100%;border-collapse:collapse;font-size:12px}
.analytics table.t th{padding:8px 10px;text-align:left;font-size:9px;text-transform:uppercase;color:var(--muted);
  font-weight:700;border-bottom:1px solid var(--line);white-space:nowrap}
.analytics table.t td{padding:7px 10px;border-bottom:1px solid var(--line)}
.analytics table.t td.meth{font-size:10px;color:var(--muted);max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.analytics .bd{display:inline-flex;padding:3px 10px;border-radius:20px;font-size:11px;font-weight:600}
.analytics .bg{background:rgba(34,197,94,.15);color:var(--ok)}
.analytics .by{background:rgba(245,158,11,.15);color:var(--warn)}
.analytics .br{background:rgba(239,68,68,.15);color:var(--bad)}
.analytics .em{text-align:center;color:var(--muted);padding:40px 20px;font-size:13px}
.analytics .hm-row{display:flex;align-items:center;margin-bottom:2px}
.analytics .hm-cells{display:flex;gap:2px;flex:1}
.analytics .hm-label{width:110px;font-size:10px;color:var(--muted);flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.analytics .hm-th{flex:1;text-align:center;font-size:8px;color:var(--muted);font-weight:600;overflow:hidden}
.analytics .hm-cell{flex:1;height:22px;border-radius:3px;font-size:9px;display:flex;align-items:center;
  justify-content:center;color:var(--text);min-width:0;overflow:hidden}
.analytics canvas{width:100% !important}

/* Woody/Albus 23.10 — «лайф режим»: плашка «Есть изменения — обновить» */
.live-banner{position:fixed;top:10px;left:50%;transform:translateX(-50%);z-index:1000;
  padding:8px 16px;border-radius:999px;border:1px solid var(--accent,#3b82f6);
  background:var(--accent,#3b82f6);color:#fff;font-weight:600;cursor:pointer;
  box-shadow:0 4px 16px rgba(0,0,0,.35)}

/* Док 23.10 (доп) — скрин пруфы по выписке на странице блока */
.proof-grid{display:flex;flex-wrap:wrap;gap:12px}
.proof-item{max-width:180px}
.proof-thumb{max-width:170px;max-height:120px;border-radius:6px;border:1px solid var(--line);display:block}

/* Док 26.10 — поля разблока отдельным блоком на странице блока */
.block-group{border:1px solid var(--line);border-radius:8px;padding:10px 12px 2px;margin:0 0 14px}
.block-group legend{padding:0 6px;font-weight:600;font-size:13px;color:var(--muted,#9aa4b2)}
.block-group-unblock{border-color:var(--accent,#3b82f6)}

/* С-122 — отчёты процессинга */
.rep-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(420px,1fr));gap:12px;margin-bottom:14px}
.rep-group .cards{grid-template-columns:repeat(5,1fr);gap:6px;margin-bottom:0}
.rep-group .card{padding:8px 10px}
.rep-group .card b{font-size:17px}
.rep-group .card span{font-size:11px}
.rep-group textarea{width:100%;margin-top:8px}
.rep-pre{white-space:pre-wrap;font-family:inherit;font-size:13px}
.rep-chart{width:100%;max-height:280px}
.rep-toggles > div{margin-bottom:8px}
.rep-toggles .chk{margin-right:10px}

/* marcovaldo 27.10 — счёт без отлёжки (подвязан < 24 ч): красная обводка, сама пропадает */
.acq-row.acq-fresh,.acq-row.acq-fresh[open]{border-color:var(--bad);box-shadow:inset 0 0 0 1px var(--bad)}

/* Woody 27.10 — кнопка смены в шапке */
.shift-box{display:inline;margin:0}
.shift-box .shift-on{color:var(--ok)}

/* Woody 27.10 — плашка «без менеджера» свёрнута: одна строка, подробности по клику */
.assign-note summary{cursor:pointer;list-style:none}
.assign-note summary::-webkit-details-marker{display:none}
.assign-note summary .mini{white-space:normal}

/* Поставка 27.10 — варианты цены банка под базовой строкой */
.bank-prices .variant-row td:first-child{padding-left:22px;color:var(--muted)}
/* 30.10 — на экране поуже список «Валюта» сжимался до «гри» */
.bank-prices .form-select{min-width:7.5em}
.bank-prices input.form-input{min-width:6.5em}

/* Пользователь 28.10 — «Сгенерировать» пароль в форме сотрудника */
.pwd-gen{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px}
.pwd-gen-note{font-size:12px;color:var(--muted)}
.pwd-gen-note.ok{color:var(--ok)}
.pwd-gen-note.bad{color:var(--bad);user-select:all}

/* Пользователь 28.10 — «Сотрудники»: «Править» справа, светлее «отключить»; «копия» отдельно */
.btn.soft{background:#2a3340;border:1px solid #3a4555;color:var(--text)}
.btn.soft:hover{background:#344050}
:root[data-theme="light"] .btn.soft{background:#ffffff;border-color:var(--line)}
:root[data-theme="light"] .btn.soft:hover{background:#e3e8ef}
.staff-actions{display:flex;align-items:center;justify-content:flex-end;gap:14px}
.staff-copy{margin-right:6px}

/* Woody 28.10 — devise id из таблицы у счёта без привязанной трубки: серым */
.muted{color:var(--muted)}

/* Pacifica 28.10 — строка поиска над длинным списком в фильтрах */
.select-search{margin-bottom:4px;padding:4px 8px;font-size:12px}

/* Albus 29.10 — плашка «Что нового» после выкладки */
.release-note{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 12px;
  padding:8px 12px;border:1px solid var(--accent);border-radius:var(--radius);
  background:var(--panel);font-size:13px}
.release-note[hidden]{display:none}
.release-note .btn{margin-left:auto}
.release-items{margin:0;padding-left:18px;line-height:1.55}
.release-items li{margin-bottom:6px}

/* Anton_prc 30.10 — копирование нажатием в шапке строки ACQ */
.acq-copy { cursor: copy; border-bottom: 1px dashed transparent; }
.acq-copy:hover { border-bottom-color: currentColor; }
.acq-copy.copied { color: var(--ok, #2e9e5b); }
.acq-copy.copied::after { content: ' ✓ скопировано'; font-size: 11px; font-weight: 400; }
/* Albus 02.11 — комментарий разблока в строке «Разблоков» */
.unblock-note textarea{min-width:200px;font-size:12px}
.unblock-note textarea.saved{border-color:var(--ok)}
.unblock-note textarea.failed{border-color:var(--bad)}
/* Albus 02.11 19:31 — «ИПН — ровно 10 цифр (сейчас N)» под полем (static/js/digits.js) */
.digits-hint{font-size:11px;color:var(--warn);margin-top:2px}
.digits-hint.hidden{display:none}

/* Albus 03.11 11:21 — итог по отбору в ACQ: объём и сумма блока */
.acq-sums{margin:4px 0 0;font-size:13px;color:var(--muted)}
.acq-sums b{color:var(--text)}

/* Albus 03.11 14:41 — несколько статусов галочками вместо Ctrl+клик (static/js/checklist.js) */
.checklist{position:relative;min-width:200px}
.checklist-button{width:100%;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.checklist-panel{position:absolute;z-index:30;top:100%;left:0;min-width:240px;margin-top:4px;
  padding:8px;background:var(--panel);border:1px solid var(--line);border-radius:8px;
  box-shadow:0 8px 24px rgba(0,0,0,.35)}
.checklist-search{width:100%;margin-bottom:6px}
.checklist-clear{display:inline-block;margin-bottom:6px}
.checklist-list{max-height:260px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}
.checklist-list label{display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;
  padding:2px 4px;border-radius:4px}
.checklist-list label:hover{background:var(--line)}
/* Albus 04.11 15:06 — «+ трубка» у каждой колонки сервера «500» */
.acc-col-add{margin-left:auto;margin-right:6px;padding:2px 8px}
