/* Стили кабинета, не поместившиеся в общий с лендингом style.css.
   Тот файл поделён надвое: первые 7861 байт заморожены по sha1, всё
   остальное — территория лендинга, где css-guard.py требует лендингового
   предка у каждого селектора. Кабинетным правилам там места нет, поэтому
   они живут здесь и подключаются из cabinet/base.html — плюс из
   login.html, которому нужен только блок .auth-* в конце файла.
   Предок .cab оставлен вторым рубежом. */
.cab .conn{border:1px solid var(--line);border-radius:12px;margin:0 0 18px;
  overflow:hidden;background:#fff}
.cab .conn-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:12px 14px;background:var(--bg-soft);border-bottom:1px solid var(--line)}
.cab .conn-head .who{font-weight:600}
.cab .dot{width:9px;height:9px;border-radius:50%;display:inline-block;flex:none}
.cab .dot--ok{background:var(--ok)}
/* Красный для ТЕКСТА, а не для плашек: --err (#E5484D) на белом даёт
   3.91:1 при норме WCAG AA 4.5:1 — замерено на живой странице. Значение
   взято из готового `.flash--err` дизайн-системы (7.30:1), чтобы не
   плодить третий оттенок красного. Для точки состояния --err остаётся:
   она не текст, к ней применяется порог 3:1 для нетекстовых элементов. */
.cab{--err-ink:#A3262B}
.cab .dot--dead{background:var(--err)}
.cab .dot--unknown{background:var(--muted)}
.cab .conn-clients{width:100%;font-size:13px;margin:0}
/* Раскрыватель строки — один и тот же для целей и для плана: две кнопки
   в соседних ячейках обязаны выглядеть одинаково, поэтому у них общее
   правило, а не две копии значений, которые разъедутся. */
.cab .goal-toggle,.cab .kpi-toggle{background:none;border:0;padding:2px 4px;
  cursor:pointer;color:var(--ink);font:inherit;text-align:left}
.cab .goal-toggle:hover,.cab .kpi-toggle:hover{text-decoration:underline}
.cab .goal-toggle.is-empty{color:var(--err-ink)}
.cab .goal-panel>td{background:var(--bg-soft);padding:12px 16px}
.cab .goal-counter{font-size:13px;font-weight:600;margin:10px 0 6px}
.cab .goal-list{display:flex;flex-wrap:wrap;gap:6px 20px;margin:0}
.cab .goal-item{display:flex;align-items:center;gap:6px;font-size:13px;
  font-weight:400;cursor:pointer}
.cab .clients-panel{padding:12px 16px;background:var(--bg-soft);
  border-bottom:1px solid var(--line)}

/* Панель плана: шесть строк одной сеткой, а не шестью самостоятельными
   флексами. Общие дорожки — единственное, что выравнивает поля в столбцы:
   при флексах подписи разной длины («Клики» против «Цена лида, ₽»)
   сдвигали бы ввод каждая на своей строке, и шесть строк читались бы как
   шесть разных форм.
   Ширины дорожек фиксированные, потому что содержимое у них известно:
   число, период, направление, допуск — дальше факт забирает остаток. */
.cab .kpi-panel>td{background:var(--bg-soft);padding:12px 16px}
.cab .kpi-row{display:grid;grid-template-columns:15ch 8ch 12ch 13ch 8ch 1fr auto;
  align-items:center;gap:6px 10px;font-size:13px;margin-bottom:6px}
.cab .kpi-row input,.cab .kpi-row select{font-size:13px;padding:3px 6px;
  min-width:0;width:100%}
/* Допуск — «±10 %», а не три элемента врозь: знак и процент относятся
   к полю, и разрывать их переносом нельзя. */
.cab .kpi-tol{display:flex;align-items:center;gap:2px;color:var(--muted);
  white-space:nowrap}
/* 4ch съедали второй разряд: `ch` меряет содержимое, а padding в 6px с
   каждой стороны в него не входит — «10» показывалось как «1С».
   Замерено на кадре, не на глаз. */
.cab .kpi-tol input{width:7ch;text-align:right}
.cab .kpi-flat{color:var(--muted);font-size:12px}
.cab .kpi-fact{color:var(--muted);font-size:12px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.cab .kpi-actions{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  margin-top:12px}
/* Узкий экран: сетка рассыпается в поток, иначе семь дорожек уезжают
   за правый край таблицы вместе с кнопкой «взять из факта». */
@media (max-width:900px){
  .cab .kpi-row{grid-template-columns:1fr 1fr}
  .cab .kpi-name{grid-column:1 / -1;font-weight:600}
}
.cab .inline-note{font-size:12px;margin-top:10px;color:var(--muted)}
.cab .inline-note--err{color:var(--err-ink)}
.cab .row-menu{position:relative;display:inline-block}
.cab .row-menu>summary{cursor:pointer;list-style:none}
.cab .row-menu>summary::-webkit-details-marker{display:none}
.cab .row-menu-body{position:absolute;right:0;z-index:5;margin-top:6px;
  padding:12px;background:#fff;border:1px solid var(--line);border-radius:10px;
  box-shadow:0 8px 24px rgba(0,0,0,.10);display:grid;gap:10px}

/* Бейдж состояния: штатный `.badge--ok` даёт 2.27:1 (#3FB950 на #E7F6EA) —
   нечитаемо. Берём тот же тёмно-зелёный, что у `.flash--ok` (5.80:1).
   Долг унаследованный, но правим здесь: экран «Реестр» ставит бейдж
   в заголовок каждой группы, то есть делает его заметным. Правка
   кабинетная и в общий style.css не лезет.
   ВАЖНО: тон нужен и в `.cab .badge--err`, если он появится. */
.cab .badge--ok{color:#1B6B2C}

/* ── 6. Отчёт: раскладка исходной таблицы ─────────────────────────────
   Показатель — группа колонок шириной в семь периодов, шапка
   двухэтажная. Так было в листах «Статистика» и «Детально», и владелец
   попросил один в один.

   Широкая таблица читается только при двух условиях, и оба здесь есть:
   прокрутка живёт ВНУТРИ таблицы, а колонка с именем липкая. Без
   второго прокрутка уносит ровно то, что идентифицирует строку, — из-за
   этого исходные 35 колонок и не читались. */
.cab .rep-note{font-size:12px;color:var(--muted);margin:0 0 16px}
.cab .crumb{color:var(--muted)}
.cab .crumb:hover{color:var(--ink);text-decoration:underline}

/* Элемент грида по умолчанию не сжимается уже содержимого
   (`min-width:auto`) — без сброса таблица распирала бы всю страницу. */
.cab .cab-main{min-width:0}
.cab .rep-wrap{overflow-x:auto;max-width:100%}

/* `overflow:hidden` базового `table` (оно там ради скругления углов)
   делает саму таблицу контейнером прокрутки — и липкая колонка внутри
   перестаёт липнуть, молча. Скругление переезжает на .rep-wrap. */
/* Компактнее по просьбе владельца: базовый шрифт таблиц в системе —
   15px, здесь 12px и вдвое меньшие отступы. Ниже 12px не опускаемся:
   в NEG-011 уменьшение шрифта уже применялось как «лечение» нечитаемой
   таблицы и сделало хуже — читаемость держит раскладка, а не кегль. */
.cab table.rep{width:100%;font-size:12px;border-collapse:separate;
  border-spacing:0;overflow:visible;border:0;border-radius:0}
/* Место под горизонтальную полосу прокрутки. На macOS она overlay:
   рисуется ПОВЕРХ содержимого у нижней кромки контейнера — и накрывала
   последнюю строку. Раньше последней была строка клиента, теперь итог,
   поэтому полоса стала съедать самое важное число на экране.
   14px — заведомо больше overlay-полосы (~9px) и системной (~15px
   с классическими полосами она и так занимает своё место в потоке). */
.cab .rep-wrap{border:1px solid var(--line);border-radius:14px;background:#fff;
  padding-bottom:14px}
/* Кегль обязан стоять на САМИХ ячейках: в дизайн-системе у `th,td`
   есть явный `font-size:15px`, и он побеждает наследование от таблицы.
   Из-за этого числа отчёта рисовались пятнадцатым кеглем, сколько бы ни
   стояло на `table` — вскрыто замером computed style, не на глаз. */
.cab table.rep th,.cab table.rep td{padding:3px 8px;line-height:1.35;
  font-size:12px}
.cab table.rep thead th{position:sticky;top:0;z-index:2;background:var(--bg-soft);
  font-size:10px;font-weight:600;color:var(--muted);text-align:right;
  white-space:nowrap;border-bottom:1px solid var(--line);padding-top:5px;
  padding-bottom:5px}
.cab table.rep td.num{text-align:right;font-variant-numeric:tabular-nums;
  white-space:nowrap}

/* Шапка показателя: подпись по центру своей семёрки, единица второй
   строкой — «Цена лида с НДС, ₽» в одну строку растянуло бы группу. */
/* Подпись группы прижата к её левому краю, а не по центру. В таблице
   центрирование было побочным эффектом объединённых ячеек; здесь оно
   вредит: над семью колонками в 630px центр уезжает за экран, и при
   прокрутке видно ряд периодов без названия показателя. У левого края
   подпись появляется ровно тогда, когда начинается сама группа. */
.cab table.rep thead th.grp{text-align:left;font-size:11px;color:var(--ink);
  border-left:2px solid var(--line);padding-left:12px}
.cab table.rep thead th.grp .unit{display:block;font-weight:400;font-size:9px;
  letter-spacing:0;text-transform:none;opacity:.75}
.cab table.rep thead th.per{font-size:10px;font-weight:400;padding:3px 8px}
/* Вертикальная линейка на стыке показателей: без неё сорок две колонки
   сливаются в сплошное поле цифр. */
.cab table.rep .grp-start{border-left:2px solid var(--line)}

/* Баланс: одна колонка, а не семь — у остатка на счёте нет окон. Своя
   линейка слева отделяет его от статуса: иначе он читается как хвост
   служебной колонки, а это деньги. Вторая строка ячейки («на 8 дн.»)
   набрана мельче — главное здесь сумма, дни лишь её толкование. */
.cab table.rep .bal{border-left:2px solid var(--line)}
.cab table.rep thead th.bal{vertical-align:bottom}
.cab table.rep thead th.bal .unit{display:block;font-weight:400;font-size:9px;
  letter-spacing:0;text-transform:none;opacity:.75}
.cab table.rep td.bal .bal-days{display:block;font-weight:400;color:var(--muted);
  font-size:10px;margin-top:1px}
/* «Н/д» — не ноль и не пусто: выкачка была и не удалась, причина в title. */
.cab table.rep td.bal .bal-na{color:var(--muted)}

/* Колонка сущности — липкая. Базовое `th` дизайн-системы капслочит и
   разряжает: верно для шапки, но здесь лежат имя клиента и домен, и
   «AVTOMOSH54.RU» читается как крик. */
.cab table.rep th.ent{position:sticky;left:0;z-index:1;background:#fff;
  text-align:left;vertical-align:top;font-weight:600;width:1%;
  white-space:nowrap;text-transform:none;letter-spacing:normal;
  color:var(--ink);font-size:12px}
.cab table.rep thead th.ent{z-index:3;background:var(--bg-soft);
  vertical-align:bottom}
.cab table.rep th.ent .ent-name{display:block}
.cab table.rep th.ent a.ent-name:hover{text-decoration:underline}
.cab table.rep th.ent .ent-sub{display:block;font-weight:400;color:var(--muted);
  font-size:10px;margin-top:1px}

/* Статус: узкая колонка со свежестью или причиной, по которой цифрам
   нельзя верить. */
.cab table.rep .st{text-align:left;white-space:normal;max-width:20ch;
  font-size:10px;font-weight:400;color:var(--muted)}
.cab table.rep thead th.st{text-align:left;vertical-align:bottom}
.cab table.rep .ent-warn{display:block;color:var(--err-ink)}
.cab table.rep .ent-fix{display:inline-block;margin-top:2px;font-weight:600;
  color:var(--ink);text-decoration:underline}
.cab .warn{color:var(--err-ink)}

.cab table.rep tbody tr{border-bottom:1px solid var(--line)}
.cab table.rep tbody td,.cab table.rep tbody th{border-bottom:1px solid var(--line)}
.cab table.rep tbody tr:hover td{background:var(--bg-soft)}
.cab table.rep tbody tr.is-flagged th.ent{box-shadow:inset 3px 0 0 var(--err-ink)}

/* Единственная тяжёлая линейка — под итогом, и он стоит первым: на
   вопрос «как в целом» отвечают раньше, чем «у кого именно». */
/* Единственная тяжёлая линейка на странице — НАД итогом: он теперь
   последняя строка, и черта отделяет сумму от слагаемых. */
.cab table.rep tbody.rep-total td,
.cab table.rep tbody.rep-total th.ent{font-weight:700;
  border-top:2px solid var(--ink);border-bottom:0}
.cab table.rep tbody.rep-total tr:hover td{background:transparent}

/* ── 6b. Обвязка кабинета: ширина и сворачивание меню ─────────────────
   `.cab-main` в общем style.css ограничен 980px — для отчёта в сорок три
   колонки это половина экрана впустую. Снимаем ограничение ТОЛЬКО там:
   реестр и админка — текст и формы, и строки в 2560px в них нечитаемы. */
.cab .cab-main--wide{max-width:none}

/* Свёрнутое меню: узкая полоса, на которой остаётся только переключатель.
   Иконок в проекте нет, поэтому показывать в полосе нечего — сворачивают
   ради ширины, а навигацию разворачивают обратно. */
.cab.is-nav-collapsed{grid-template-columns:52px 1fr}
.cab.is-nav-collapsed .cab-side{padding:16px 8px}
.cab.is-nav-collapsed .cab-side .logo,
.cab.is-nav-collapsed .cab-side a,
.cab.is-nav-collapsed .nav-who{display:none}
.cab.is-nav-collapsed .cab-main{padding-left:20px;padding-right:20px}

.cab .nav-toggle{display:block;width:36px;height:32px;margin:0 0 14px;
  padding:0;border:1px solid var(--line);border-radius:9px;background:#fff;
  cursor:pointer}
.cab .nav-toggle:hover{border-color:var(--muted)}
/* Три полосы гамбургера — средняя из самого элемента, крайние из теней.
   Так значок не тянет за собой ни картинку, ни шрифт иконок. */
.cab .nav-toggle-bars{display:block;width:16px;height:2px;margin:0 auto;
  background:var(--ink);
  box-shadow:0 -5px 0 var(--ink), 0 5px 0 var(--ink)}
.cab .nav-who{margin-top:24px;padding:0 14px;color:var(--muted);
  font-size:11px;line-height:1.4}

/* ── 7. Клавиатурный фокус ─────────────────────────────────────────────
   В общем style.css кольца перечислены по одному селектору на каждый
   элемент лендинга, и до кабинета их не довели: весь кабинет проходился
   с клавиатуры наощупь. Одно правило на все интерактивные элементы. */
.cab a:focus-visible,
.cab button:focus-visible,
.cab summary:focus-visible,
.cab select:focus-visible,
.cab input:focus-visible{outline:3px solid var(--ink);outline-offset:2px;
  border-radius:4px}

/* ── 8. Подсветка KPI ──────────────────────────────────────────────────
   Приглушённые фоны: заливка в полную силу на кегле 12px превращает
   отчёт в светофор, в котором не видно самих цифр (спека §4b). Палитра
   от --err-ink и .badge--ok, чтобы не заводить четвёртый оттенок.
   Красный дополнительно перекрашивает текст: цвет фона в 8 % насыщенности
   не должен оставаться единственным носителем смысла.

   Оттенки вынесены в переменные: каждый повторяется трижды (обычное
   состояние и два наведения), и разъехаться копиям нельзя. */
.cab table.rep{--kpi-ok:#EDF6EF;--kpi-warn:#FBF3DF;--kpi-bad:#FAECEC}
.cab table.rep td.kpi--ok{background:var(--kpi-ok)}
.cab table.rep td.kpi--warn{background:var(--kpi-warn)}
.cab table.rep td.kpi--bad{background:var(--kpi-bad);color:var(--err-ink)}

/* Наведение НЕ стирает подсветку. Подсветка объясняет себя подсказкой
   `title`, а она появляется только под курсором: без этих правил цвет
   гаснет ровно в тот момент, когда его читают. Строчное `tr:hover td`
   (0,3,4) и «прозрачный» итог (0,4,4) специфичнее одиночного
   `td.kpi--*` (0,3,2) и побеждали бы его. */
.cab table.rep tbody tr:hover td.kpi--ok,
.cab table.rep tbody.rep-total tr:hover td.kpi--ok{background:var(--kpi-ok)}
.cab table.rep tbody tr:hover td.kpi--warn,
.cab table.rep tbody.rep-total tr:hover td.kpi--warn{background:var(--kpi-warn)}
.cab table.rep tbody tr:hover td.kpi--bad,
.cab table.rep tbody.rep-total tr:hover td.kpi--bad{background:var(--kpi-bad)}

/* ── 9. Алерты ─────────────────────────────────────────────────────────
   Экран собран из готовых кабинетных панелей: `.conn` — коробка секции,
   `.conn-head` — её шапка, `.conn-clients` — таблица внутри. Новое здесь
   только то, чего в реестре не было: сетка строки условия, галерея
   пресетов и блок предпросмотра. */
.cab .al-body{padding:12px 14px}
.cab .al-field{display:grid;gap:4px;font-size:12px;color:var(--muted)}
.cab .al-field input,.cab .al-field select{font-size:13px;padding:4px 6px;
  color:var(--ink)}
.cab .al-check{display:flex;align-items:center;gap:6px;font-size:12px}
.cab .al-add{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}
.cab .al-add .al-field{min-width:260px}

/* Раскрывающиеся секции — те же коробки, что и обычные. `.conn-head`
   ставит display:flex, а он в Chrome съедает треугольник раскрытия:
   возвращаем блок, иначе единственный признак «сюда можно нажать»
   исчезает. */
.cab .al-details>summary.conn-head{display:block;cursor:pointer;
  font-weight:600}

/* Код привязки — крупно и моноширинно: его набирают руками в чате. */
.cab .al-code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:26px;letter-spacing:3px;font-weight:700;margin:10px 0}

/* Галерея пресетов: карточки одной высоты, кнопка прижата к низу — иначе
   четырнадцать карточек с описаниями разной длины дают рваный низ ряда. */
.cab .al-gallery{display:grid;gap:12px;
  grid-template-columns:repeat(auto-fill,minmax(260px,1fr))}
.cab .al-preset{display:flex;flex-direction:column;gap:6px;padding:12px;
  border:1px solid var(--line);border-radius:12px;background:#fff}
.cab .al-preset-name{margin:0;font-size:14px}
.cab .al-preset-desc{margin:0;font-size:12px;color:var(--muted);flex:1}
.cab .al-preset-foot{display:flex;gap:8px;align-items:center;margin-top:4px}
.cab .al-preset-foot select{font-size:12px;padding:3px 6px;min-width:0;flex:1}

/* Шапка формы: поля в общую сетку, как строки KPI-панели в реестре. */
.cab .al-head-fields{display:grid;gap:10px 14px;align-items:end;
  grid-template-columns:repeat(auto-fit,minmax(150px,1fr));margin-bottom:14px}

/* Строка условия. Дорожки фиксированные, потому что содержимое известно:
   галочка, показатель, окно, сравнение, вид правой части — и дальше её
   поля. Флексом подписи разной длины сдвигали бы каждую строку по-своему,
   и четыре условия читались бы как четыре разные формы. */
.cab .al-conds{display:grid;gap:8px}
/* Дорожки долевые, а не в `ch`: пять селектов фиксированной ширины в
   сумме шире формы, и последняя колонка — коэффициент — уезжала за правый
   край панели. `minmax(0,…fr)` обязателен именно нулём: элемент грида по
   умолчанию не сжимается уже своего содержимого, и `1fr` сам по себе
   переполнение не убирает. */
.cab .al-cond{display:grid;align-items:center;gap:6px 8px;
  grid-template-columns:auto minmax(0,1.2fr) minmax(0,1fr) minmax(0,1fr)
    minmax(0,1.4fr) minmax(0,1fr) auto;
  padding:6px 8px;border:1px solid var(--line);border-radius:10px;
  background:var(--bg-soft)}
.cab .al-cond select,.cab .al-cond input{font-size:12px;padding:3px 5px;
  min-width:0;width:100%}
.cab .al-cond [hidden]{display:none}
.cab .al-cond-on{gap:4px}
.cab .al-cond-num{color:var(--muted)}
/* Выключенное условие остаётся на экране, но приглушено: спрятать его
   значило бы заставить искать, куда делась третья строка. */
.cab .al-cond.is-off{opacity:.45}
.cab .al-factor{display:flex;align-items:center;gap:3px;color:var(--muted);
  white-space:nowrap}
.cab .al-factor input{width:7ch;text-align:right}
@media (max-width:900px){
  .cab .al-cond{grid-template-columns:4ch 1fr 1fr}
}

/* Предпросмотр — главное место формы: ложное чувство прикрытия возникает
   в секунду включения правила, поэтому предложение набрано крупнее
   остального, а охват выделен цветом отдельно. */
.cab .al-preview{margin:14px 0 4px;padding:12px 14px;border-radius:12px;
  background:var(--bg-soft);border:1px solid var(--line)}
.cab .al-preview-sentence{margin:0;font-size:14px;font-weight:600}
.cab .al-preview--err{color:var(--muted);font-weight:400}
.cab .al-preview-coverage{margin:6px 0 0;font-size:12px;color:var(--muted)}
.cab .al-coverage--partial{color:var(--ink)}
.cab .al-coverage--silent{color:var(--err-ink);font-weight:600}
.cab .al-preview-list{margin:8px 0 0;padding-left:18px;font-size:12px}
.cab .al-preview-list li{margin:2px 0}
.cab .al-skipped,.cab .al-quiet{color:var(--muted)}

/* Список правил. Предложение стоит под именем, а не в отдельной колонке:
   оно длинное, и колонка в 30ch превратила бы каждую строку в абзац. */
.cab table.al-rules td{vertical-align:top}
.cab .al-mark{margin-right:6px}
.cab .al-sentence{display:block;color:var(--muted);font-size:12px;
  margin-top:2px;max-width:60ch}
.cab .al-coverage{white-space:normal;max-width:28ch}
.cab .al-when{white-space:normal;max-width:22ch;color:var(--muted)}
.cab .al-row-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.cab .al-check-panel>td{background:var(--bg-soft);padding:12px 16px}
/* Путь к починке охвата — отдельной строкой под причиной. */
.cab .al-fix{display:block;margin-top:3px;font-weight:600;
  text-decoration:underline}

/* Форма входа и регистрации. Единственные правила файла без предка .cab:
   страница входа — публичная, кабинетной оболочки на ней нет. Классы
   узкие (.auth-*), поэтому на кабинетные экраны, которые подключают тот
   же файл, они не попадают. */
.auth-form{display:grid;gap:14px;max-width:360px;margin:20px 0 8px}
.auth-form label{display:grid;gap:6px;font-weight:600;font-size:14px}
.auth-form input{padding:10px 12px;border:1px solid var(--line);
  border-radius:10px;font:inherit;background:#fff}
.auth-form input:focus-visible{outline:2px solid var(--green);outline-offset:1px}
.auth-form .btn{justify-self:start}
/* Разделитель «или» и подсказки под формой: приглушены, чтобы основным
   действием осталась сама форма, а не альтернативный вход. */
.auth-alt{margin:14px 0 8px;color:var(--muted);font-size:14px}
/* Белым по лайму — 1.95:1, ниже порога WCAG AA. Лендинг ту же кнопку уже
   красит тёмным (`.hdr/.hero--product/.cta-row .btn--primary` в style.css),
   так что тёмная надпись — это облик сайта, а не исключение для входа.
   --on-green-ink объявлен в :root, предок .cab здесь не нужен.
   Замерено по WCAG: было 1.95:1, стало 7.72:1. */
.auth-form .btn--primary{color:var(--on-green-ink)}

/* Форма регистрации. Дописана в конец, а не врезана в правила входа
   выше: там только поля ввода, здесь добавляются многострочное поле и
   подсказки под ними. */
.auth-form textarea{padding:10px 12px;border:1px solid var(--line);
  border-radius:10px;font:inherit;background:#fff;resize:vertical}
.auth-form textarea:focus-visible{outline:2px solid var(--green);
  outline-offset:1px}
/* Поле-ловушка. `.hp` в style.css объявлен только под `.form` (форма
   лендинга), поэтому своей формой регистрация обязана прятать ловушку
   сама — иначе она выедет на страницу настоящим полем и её заполнят. */
.auth-form .hp{position:absolute;left:-9999px}
/* Пояснения под полями: приглушены, чтобы не спорить с подписями. */
.auth-hint{color:var(--muted);font-size:13px;font-weight:400}

/* Профиль. Переиспользует `.auth-form` формы входа — поля те же самые, и
   вторая раскладка под них разъехалась бы с первой. Дописано в конец:
   правила выше не трогаем. */
.cab .pf-form{max-width:380px}
/* Снятие пароля — отдельной формой под основной: своя кнопка и своё
   подтверждение. Черта сверху отделяет его от «Сохранить», чтобы две
   кнопки не читались как пара равнозначных действий. */
.cab .pf-remove{margin-top:28px;padding-top:20px;border-top:1px solid var(--line)}

/* Панель клиентов агентства. Сетка своя, а не `.goal-list` целей: там
   подписи короткие и однородные, здесь — «Гифт-код (e-16505628) — уже в
   реестре» вперемешку с короткими, и flex-wrap рвал такой список как
   попало, колонок не получалось вовсе. Дорожки фиксированной ширины
   дают колонки, обрезка многоточием их держит. */
.cab .clients-tools{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  margin:0 0 10px}
.cab .clients-search{padding:6px 10px;border:1px solid var(--line);
  border-radius:8px;font:inherit;font-size:13px;background:#fff;min-width:240px}
.cab .clients-arch{display:flex;align-items:center;gap:6px;font-size:13px;
  color:var(--muted);cursor:pointer}
/* `min(280px, 100%)` вместо голых 280px: на узком экране дорожка шире
   контейнера выпихнула бы список за край страницы горизонтальной
   прокруткой — у кабинета есть мобильная раскладка (style.css, 900px). */
.cab .clients-grid{display:grid;
  grid-template-columns:repeat(auto-fill,minmax(min(280px,100%),1fr));
  gap:4px 20px}
.cab .clients-item{display:flex;align-items:center;gap:6px;font-size:13px;
  font-weight:400;cursor:pointer;min-width:0}
/* Внутри строки переносов нет: они вернули бы ту самую рванину, ради
   которой заводилась сетка. Длинное имя обрезается, полный текст в title. */
.cab .clients-item>span{overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
/* Архивные показываются только по просьбе — и приглушены, чтобы среди
   живых кабинетов их было видно с одного взгляда. */
.cab .clients-item--arch{color:var(--muted)}
.cab .clients-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-top:14px}
/* Размеры кнопок панели — здесь, а не инлайном из скрипта: рядом стоят
   три штуки, и три копии значений в JS разъехались бы. */
.cab .clients-actions .btn{padding:6px 14px;font-size:13px}
.cab .clients-actions .btn[disabled]{opacity:.45;cursor:default}
.cab .clients-count{font-size:12px;color:var(--muted)}

/* Плашка подмены: висит на КАЖДОМ экране чужого кабинета, поэтому
   заметная, но не крикливая — красным здесь кричать не о чем, ошибки
   нет, а красный в кабинете уже занят предупреждениями об утрате
   доступа. Янтарная подложка с тёмным текстом: #23262B на #FFF4E5
   даёт 13.9:1, кнопка возврата стоит в той же строке справа, чтобы
   выход был там же, где сообщение, а не искался глазами. */
.cab .imp-bar{display:flex;align-items:center;justify-content:space-between;
  gap:12px;flex-wrap:wrap;margin:0 0 18px;padding:10px 14px;
  border:1px solid #E0B15C;border-radius:10px;background:#FFF4E5;
  font-size:13px}
/* Кнопка не тянется на всю ширину при переносе строки: плашка узкая,
   и растянутая кнопка выглядела бы главным элементом страницы. */
.cab .imp-bar .btn{flex:none;padding:5px 12px;font-size:12px;
  background:#fff}

/* Заблокированная кнопка. `.btn` в style.css задаёт только рабочий вид, а
   `:disabled` там нет вовсе — «Опросить сейчас» у неподготовленного
   подключения выглядела пиксель в пиксель как рабочая и молча съедала
   клики. Дописано в конец (первые 7861 байт style.css под тестом, а
   правила выше не трогаем). */
.btn:disabled,.btn[disabled]{opacity:.45;cursor:not-allowed}
