/* Mossad Crabs — название шутка, интерфейс всерьёз.
 *
 * Система — DESIGN.md в корне (основа — DESIGN.md Linear): почти чёрный холст,
 * глубина лестницей поверхностей, а не тенью, волосяные границы и ОДИН
 * хроматический акцент — красный. Если красный означает две вещи, он не
 * означает ничего, поэтому роли разведены жёстко:
 *
 *   красный  — знак, главная кнопка экрана (одна), фокус, горящие счётчики
 *              и «Вышел» — то, ради чего всё делается;
 *   danger   — удаление и ошибки, только контуром и текстом, не заливкой:
 *              иначе «Удалить» выглядело бы как «Сохранить»;
 *   статусы  — семь приглушённых цветов агентства; это метки, а не сигналы.
 *
 * Тёмная тема основная: <html> приходит с сервера с data-theme="dark", светлая
 * включается из меню. Блок :root ниже — светлые значения, а тёмные лежат под
 * [data-theme="dark"]: так сотня правил вида [data-theme="dark"] .x, написанных
 * ещё под прежнюю систему, продолжают работать без правок.
 *
 * Имена токенов прежние (--gold, --tint, --nav-*, --p-*-bg/fg): ими набраны
 * все экраны, и перекраска через них переводит экран в новую систему разом.
 * Значения — новые; что каждое значит теперь, сказано рядом.
 */

:root {
  color-scheme: light;

  --bg:        #F4F2EF;
  --surface:   #FFFFFF;
  --raise:     #EDEAE6;
  --raise-2:   #FFFFFF;
  --line:      #E2DED8;
  --line-2:    #CFCAC2;
  --text:      #141416;
  --text-2:    #5E5B57;
  --text-3:    #6B6863;
  --accent:    #D9302A;
  /* Заливка главной кнопки темнее самого сигнала: белый текст на ней — 4.5:1. */
  --accent-btn:#C42A24;
  --accent-soft:#FCE6E3;
  --accent-fg: #B4231D;
  --danger:    #C62F34;
  --danger-bg: #FBE7E7;
  --pop-shadow:0 14px 40px rgba(20,20,22,.14);
  --veil:      rgba(20,20,22,.35);

  /* Статусы: насыщенный тон, фон пилюли — он же на 13%. */
  --p-gray:#5E5B57; --p-amber:#8A6110; --p-blue:#2459A8; --p-teal:#17766A;
  --p-green:#2F7A3E; --p-purple:#6A4BB8; --p-red:#B8323A;
}

[data-theme="dark"] {
  color-scheme: dark;

  /* Не #000: чистый чёрный рядом с серыми панелями «дырявит» экран. */
  --bg:        #0B0B0D;
  --surface:   #131315;
  --raise:     #1B1B1E;
  --raise-2:   #222226;
  --line:      #26262A;
  --line-2:    #34343A;
  --text:      #EDEBE8;
  --text-2:    #A3A09B;
  /* Телефоны и даты в плотных таблицах: ≥ 4.5:1 к --surface. */
  --text-3:    #86837E;
  --accent:    #F0443A;
  --accent-btn:#CF2E26;
  --accent-soft:rgba(240,68,58,.12);
  --accent-fg: #FF7A70;
  --danger:    #E5484D;
  --danger-bg: rgba(229,72,77,.10);
  --pop-shadow:0 14px 40px rgba(0,0,0,.55);
  --veil:      rgba(0,0,0,.6);

  --p-gray:#A8A5A0; --p-amber:#E2B45A; --p-blue:#7EB0F0; --p-teal:#5CC8B8;
  --p-green:#7CC88A; --p-purple:#B49CF0; --p-red:#F07C82;
}

/* Производные — одни на обе темы: считаются от токенов выше. */
:root, [data-theme="dark"] {
  /* «Выделенное» — подложка выбранной строки и информационной плашки. */
  --tint:      var(--accent-soft);
  /* Бывший шафран «достижения». Достижение теперь красное — «цель найдена». */
  --gold:      var(--accent-fg);
  --gold-bg:   var(--accent-soft);
  --ok:        var(--accent-fg);
  --ok-bg:     var(--accent-soft);
  /* Предупреждение — янтарь статусов, а не второй акцент: им не красят кнопки. */
  --warn:      var(--p-amber);
  --warn-bg:   color-mix(in srgb, var(--p-amber) 12%, transparent);
  --accent-2:  var(--accent-btn);
  --on-accent: #FFFFFF;
  --jade:      var(--p-green);
  --shadow:    none;

  --p-gray-bg:   color-mix(in srgb, var(--p-gray) 13%, transparent);   --p-gray-fg:   var(--p-gray);
  --p-blue-bg:   color-mix(in srgb, var(--p-blue) 13%, transparent);   --p-blue-fg:   var(--p-blue);
  --p-teal-bg:   color-mix(in srgb, var(--p-teal) 13%, transparent);   --p-teal-fg:   var(--p-teal);
  --p-green-bg:  color-mix(in srgb, var(--p-green) 13%, transparent);  --p-green-fg:  var(--p-green);
  --p-amber-bg:  color-mix(in srgb, var(--p-amber) 13%, transparent);  --p-amber-fg:  var(--p-amber);
  --p-red-bg:    color-mix(in srgb, var(--p-red) 13%, transparent);    --p-red-fg:    var(--p-red);
  --p-purple-bg: color-mix(in srgb, var(--p-purple) 13%, transparent); --p-purple-fg: var(--p-purple);

  /* Меню больше не тёмный остров на светлой странице: рейка — та же
     поверхность, что и карточки, в обеих темах. */
  --nav-bg:    var(--surface);
  --nav-line:  var(--line);
  --nav-text:  var(--text-2);
  --nav-on-bg: var(--raise);
  --nav-on:    var(--text);

  --r:  8px;
  --r-lg: 12px;
  --font: "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  /* Unbounded — только тяжёлый (700–800), только капсом и только в коротких
     местах: знак и заголовок в одну строку. Широкий шрифт переносит русские
     заголовки, на малых весах истончается — в таблицы и кнопки он не заходит. */
  --display: "Unbounded", "Inter Tight", sans-serif;
  --mono: "JetBrains Mono", ui-monospace, Menlo, monospace;
}

* { box-sizing: border-box; margin: 0; padding: 0; }

/* Без !important атрибут hidden проигрывает любому классу с display,
   и скрытая панель оставалась бы видимой. */
[hidden] { display: none !important; }

html { background: var(--bg); }

body {
  font-family: var(--font);
  font-size: 14px; line-height: 1.5;
  color: var(--text); background: var(--bg);
  -webkit-font-smoothing: antialiased;
}

/* Ссылка — текстом, а не красным: красный на экране один и означает «сюда
   смотреть сейчас». Если им же красить каждое имя в таблице, сигнал тонет. */
a { color: var(--text); text-decoration: none; }
a:hover { text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--text-3); }

:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 6px; }
::selection { background: color-mix(in srgb, var(--accent) 32%, transparent); color: var(--text); }
html { scrollbar-color: var(--line-2) transparent; }

/* --- оболочка: рейка режимов + шапка с подразделами ------------------------
 *
 * Отличие от прежнего меню — не цвет, а устройство. Четырнадцать пунктов
 * столбиком заставляли читать меню при каждом переходе; шесть режимов
 * запоминаются руками. Каждый режим отвечает на один вопрос: кому звонить
 * сейчас · где лежат люди · кто куда продвинулся · кому пишем · что купить ·
 * как идут дела. Подразделы — вкладками в шапке, а не в рейке. */

.app { display: grid; grid-template-columns: 76px minmax(0, 1fr); min-height: 100vh; }

.rail {
  position: sticky; top: 0; height: 100vh; z-index: 30;
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  padding: 14px 8px; background: var(--surface); border-right: 1px solid var(--line);
}
.rail .logo {
  width: 44px; height: 44px; display: grid; place-items: center;
  border-radius: 12px; margin-bottom: 14px;
}
.rail .logo:hover { background: var(--raise); }
.rail .logo svg { width: 28px; height: 28px; }
.crab { fill: var(--accent); overflow: visible; }

.mode {
  position: relative; width: 60px; padding: 9px 0 7px; border-radius: 10px;
  display: flex; flex-direction: column; align-items: center; gap: 4px;
  color: var(--text-2); font-size: 11px; font-weight: 500; line-height: 1.2;
  text-align: center;
}
.mode svg {
  width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.5;
  stroke-linecap: round; stroke-linejoin: round;
}
.mode:hover { background: var(--raise); color: var(--text); text-decoration: none; }
.mode.on { background: var(--raise); color: var(--text); }
.mode.on::before {
  content: ""; position: absolute; left: -8px; top: 12px; bottom: 12px; width: 3px;
  border-radius: 0 3px 3px 0; background: var(--accent);
}
/* Счётчик красный всегда: в рейке их два — «пора звонить» и «залежались»,
   оба про то, что ждёт человека прямо сейчас. */
.mode .n {
  position: absolute; top: 5px; right: 7px; min-width: 16px; height: 16px;
  padding: 0 4px; border-radius: 99px; background: var(--accent-btn); color: #fff;
  font: 600 10px/16px var(--mono); text-align: center;
}
.rail .sp { flex: 1; }
.rbtn {
  position: relative; width: 40px; height: 40px; border-radius: 10px;
  display: grid; place-items: center; color: var(--text-2);
  background: none; border: 0; padding: 0;
}
.rbtn:hover { background: var(--raise); color: var(--text); text-decoration: none; }
.rbtn svg {
  width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.6;
  stroke-linecap: round; stroke-linejoin: round;
}
.rbtn .dot {
  position: absolute; top: 9px; right: 9px; width: 7px; height: 7px; border-radius: 50%;
  background: var(--accent); border: 2px solid var(--surface); box-sizing: content-box;
}

/* Аватар и меню профиля. Профиль — личное, а не рабочий раздел, поэтому
   он здесь, а не кнопкой в рейке. <details> открывается без скрипта. */
.avam { position: relative; margin-top: 8px; }
.avam > summary { list-style: none; cursor: pointer; }
.avam > summary::-webkit-details-marker { display: none; }
.ava {
  position: relative; width: 36px; height: 36px; border-radius: 50%;
  display: grid; place-items: center; font-size: 12px; font-weight: 600;
  background: var(--raise-2); color: var(--text);
}
.ava::after {
  content: ""; position: absolute; inset: -3px; border-radius: 50%;
  border: 2px solid var(--accent); border-right-color: transparent; transform: rotate(-30deg);
}
.amenu {
  position: fixed; left: 84px; bottom: 16px; z-index: 70; width: 260px; padding: 6px;
  background: var(--raise-2); border: 1px solid var(--line-2); border-radius: 12px;
  box-shadow: var(--pop-shadow); animation: rise .16s;
}
.am-h { padding: 10px 10px 12px; border-bottom: 1px solid var(--line); margin-bottom: 4px; }
.am-h b { display: block; font-size: 13.5px; font-weight: 600; }
.am-h small { display: block; font: 400 12px var(--mono); color: var(--text-3); margin: 2px 0 6px; }
.am-h .rank { font-size: 12px; color: var(--text-2); }
.amenu a, .amenu button {
  display: block; width: 100%; text-align: left; padding: 8px 10px; border-radius: 8px;
  font-size: 13.5px; color: var(--text); background: none; border: 0;
}
.amenu a:hover, .amenu button:hover { background: var(--raise); text-decoration: none; transform: none; }
.amenu form { margin: 0; }
.badge {
  display: inline-block; min-width: 16px; padding: 0 5px; border-radius: 99px;
  background: var(--accent-btn); color: #fff; font: 600 10px/16px var(--mono); text-align: center;
}
.amenu .badge { margin-left: 6px; }

.main { min-width: 0; display: flex; flex-direction: column; }
.hdr {
  position: sticky; top: 0; z-index: 20; display: flex; align-items: center; gap: 18px;
  height: 58px; padding: 0 24px; border-bottom: 1px solid var(--line);
  background: color-mix(in srgb, var(--bg) 88%, transparent); backdrop-filter: blur(10px);
}
.hdr .mt {
  font: 800 15px var(--display); letter-spacing: -.01em; text-transform: uppercase;
  white-space: nowrap; margin: 0;
}
.htabs { display: flex; gap: 2px; height: 100%; overflow-x: auto; scrollbar-width: none; }
.htab {
  position: relative; display: flex; align-items: center; padding: 0 12px;
  font-size: 13.5px; color: var(--text-2); white-space: nowrap;
}
.htab:hover { color: var(--text); text-decoration: none; }
.htab.on { color: var(--text); font-weight: 600; }
.htab.on::after {
  content: ""; position: absolute; left: 12px; right: 12px; bottom: -1px; height: 2px;
  background: var(--accent); border-radius: 2px;
}
.hdr .org {
  margin-left: auto; font: 500 12px var(--mono); color: var(--text-3);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 220px;
}

/* Путь обучения: этапы по порядку, он же переключатель. Порядок несёт смысл —
   кандидат идёт слева направо, отчисление стоит отдельно. */
/* Вкладки работ над этапами обучения: у каждой работы своя воронка. */
.twork { margin-bottom: 12px; }
/* Ссылка вкладки — flex, а во flex пробел между названием и числом
   схлопывается: «Чаты0». Отступ задаём явно. */
.twork a { gap: 7px; }
.twork a .mono { color: var(--text-3); }
.twork a.on .mono { color: var(--text-2); }
.tpath {
  display: flex; gap: 2px; padding: 3px; margin-bottom: 16px; width: max-content; max-width: 100%;
  overflow-x: auto; border-radius: 10px; background: var(--surface); border: 1px solid var(--line);
}
.tpath a {
  display: flex; align-items: center; gap: 8px; height: 30px; padding: 0 12px;
  border-radius: 7px; font-size: 13px; color: var(--text-2); white-space: nowrap;
}
.tpath a i {
  font: 600 10.5px/18px var(--mono); font-style: normal; width: 18px; height: 18px;
  border-radius: 50%; text-align: center; border: 1px solid var(--line-2); color: var(--text-3);
}
.tpath a:hover { color: var(--text); text-decoration: none; }
.tpath a.on { background: var(--raise); color: var(--text); font-weight: 600; }
.tpath a.on i { border-color: var(--accent); background: var(--accent); color: #fff; }

/* Вкладки внутри страницы (досье, рассылка): подчёркивание, как у вкладок
   шапки, но мельче — это уровень ниже режима. Переключает ui.js (data-tab). */
.dtabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); margin: 14px 0 16px; overflow-x: auto; }
.dtab { position: relative; height: 40px; padding: 0 12px; border: 0; border-radius: 0; background: none; font-size: 13.5px; color: var(--text-2); white-space: nowrap; }
.dtab:hover { background: none; color: var(--text); border-color: transparent; }
.dtab:active { transform: none; }
.dtab.on { color: var(--text); font-weight: 600; }
.dtab.on::after { content: ""; position: absolute; left: 12px; right: 12px; bottom: -1px; height: 2px; background: var(--accent); }
.dtab .n { font: 500 11px var(--mono); color: var(--text-3); margin-left: 5px; }

/* Палитра поиска ⌘K — поповер по центру сверху, а не окно посреди экрана. */
dialog.palette {
  margin: 12vh auto auto; width: min(620px, calc(100vw - 32px)); padding: 0; border: 1px solid var(--line-2);
  border-radius: 12px; background: var(--raise-2); color: var(--text); box-shadow: var(--pop-shadow); overflow: hidden;
}
dialog.palette::backdrop { background: var(--veil); }
dialog.palette[open] { animation: rise .16s; }
.pal-in { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--line); }
.pal-in svg { width: 18px; height: 18px; fill: none; stroke: var(--text-3); stroke-width: 1.6; flex: none; }
.pal-in input { border: 0; background: none; padding: 4px 0; font-size: 15px; box-shadow: none; }
.pal-in input:focus { box-shadow: none; }
.pal-list { max-height: min(52vh, 420px); overflow-y: auto; padding: 6px; }
.pal-it { display: flex; align-items: center; gap: 12px; padding: 8px 10px; border-radius: 8px; color: var(--text); }
.pal-it:hover { text-decoration: none; background: var(--raise); }
.pal-it.on { background: var(--raise); box-shadow: inset 2px 0 0 var(--accent); }
.pal-av { width: 28px; height: 28px; border-radius: 50%; flex: none; display: grid; place-items: center; font-size: 11px;
  font-weight: 600; background: var(--surface); border: 1px solid var(--line-2); }
.pal-av.sec { border-radius: 8px; color: var(--text-3); }
.pal-t { min-width: 0; flex: 1; }
.pal-t b { display: block; font-size: 13.5px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pal-t small { display: block; font: 400 11.5px var(--mono); color: var(--text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pal-empty { padding: 18px 12px; font-size: 13px; color: var(--text-3); text-align: center; }
.pal-foot { display: flex; gap: 16px; padding: 8px 14px; border-top: 1px solid var(--line); font-size: 12px; color: var(--text-3); }
.kbd { font: 500 11px var(--mono); color: var(--text-3); border: 1px solid var(--line-2); border-radius: 4px; padding: 0 5px; line-height: 17px; display: inline-block; }

/* Должность: крабы на погонах — сколько звёзд, столько крабов. */
.rank { display: inline-flex; align-items: center; gap: 2px; font-size: 12.5px; color: var(--text-2); white-space: nowrap; }
.rank svg { width: 11px; height: 11px; fill: var(--accent); }
.rank svg:last-of-type { margin-right: 5px; }

/* Сегментный переключатель — виды одного списка (Список · Неделя). */
.seg {
  display: inline-flex; gap: 2px; padding: 3px; border-radius: 9px;
  background: var(--bg); border: 1px solid var(--line);
}
.seg a, .seg button {
  height: 26px; padding: 0 12px; border: 0; border-radius: 6px; background: none;
  display: inline-flex; align-items: center; font-size: 12.5px; color: var(--text-2);
}
.seg a:hover, .seg button:hover { color: var(--text); text-decoration: none; background: none; }
.seg a.on, .seg button.on { background: var(--raise); color: var(--text); font-weight: 600; }

.view { padding: 22px 24px 60px; width: 100%; max-width: 1340px; min-width: 0; }

@keyframes rise { from { opacity: 0; transform: translateY(6px); } }

/* --- типографика --------------------------------------------------------- */

/* Заголовок страницы — Unbounded капсом в одну строку. Длинное название
   режется многоточием, а не переносится: перенос широкого шрифта и был
   причиной, по которой прежняя система от него отказалась. */
h1 {
  font-family: var(--display); font-size: 20px; font-weight: 700; line-height: 1.25;
  letter-spacing: -.02em; text-transform: uppercase; margin-bottom: 6px; color: var(--text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
h2 { font-size: 13.5px; font-weight: 600; margin: 24px 0 10px; color: var(--text); }
.sub { color: var(--text-2); font-size: 13px; margin-bottom: 20px; }
.sub b { color: var(--text); font-family: var(--mono); font-weight: 500; }
.muted { color: var(--text-2); }
.tiny { font-size: 12px; }
.mono, .num { font-family: var(--mono); font-variant-numeric: tabular-nums; }

/* --- поверхности --------------------------------------------------------- */

.card {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 16px 18px; margin-bottom: 14px;
}
.row { display: flex; gap: 12px; flex-wrap: wrap; }
.row > * { flex: 1; min-width: 140px; }
.gap { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.between { display: flex; align-items: center; justify-content: space-between; gap: 14px; }

.stat {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 13px 16px;
}
.stat .k { font-size: 12px; color: var(--text-2); }
.stat .v {
  font-family: var(--mono); font-size: 26px; font-weight: 500;
  margin-top: 3px; font-variant-numeric: tabular-nums; letter-spacing: -.02em;
}

/* --- управление ---------------------------------------------------------- */

button, .btn {
  font: inherit; font-size: 13px; font-weight: 500; line-height: 1.4; border: 1px solid var(--line-2);
  background: var(--surface); padding: 6.5px 13px; border-radius: var(--r);
  cursor: pointer; color: var(--text); display: inline-block;
  transition: background .12s, border-color .12s;
}
button:hover, .btn:hover { background: var(--raise); border-color: var(--text-3); text-decoration: none; }
button:active, .btn:active { transform: translateY(1px); }
/* Главная — одна на экран. Заливка темнее сигнала, чтобы белый текст читался. */
.btn.pri, button.pri {
  background: var(--accent-btn); border-color: transparent; color: #fff;
}
.btn.pri:hover, button.pri:hover { background: var(--accent-btn); border-color: transparent; filter: brightness(1.08); }
/* Опасное — контуром и текстом, никогда заливкой: иначе «Удалить» выглядит
   как «Сохранить», а ошибиться тут дороже всего. */
.btn.danger, button.danger { background: transparent; border-color: color-mix(in srgb, var(--danger) 55%, transparent); color: var(--danger); }
.btn.danger:hover, button.danger:hover { background: var(--danger-bg); border-color: var(--danger); }
.btn.sm, button.sm { padding: 3.5px 10px; font-size: 12.5px; }
.btn.ghost, button.ghost { background: transparent; border-color: transparent; color: var(--text-2); }
.btn.ghost:hover, button.ghost:hover { background: var(--raise); color: var(--text); }
button[disabled] { opacity: .45; cursor: default; }
/* Выход — POST-форма (GET ничего не меняет), но в строке текста он должен
   выглядеть как прежняя ссылка, а не как кнопка посреди подписи. */
form.inl { display: inline; margin: 0; }
button.as-link, button.as-link:hover, button.as-link:active {
  background: none; border: 0; padding: 0; font-size: inherit;
  color: inherit; transform: none;
}
button.as-link:hover { text-decoration: underline; text-underline-offset: 3px; }

input, select, textarea {
  font: inherit; font-size: 13.5px; width: 100%;
  border: 1px solid var(--line-2); border-radius: var(--r);
  padding: 8px 11px; background: var(--surface); color: var(--text);
}
input::placeholder, textarea::placeholder { color: var(--text-3); }
input:hover, select:hover, textarea:hover { border-color: var(--text-3); }
input:focus, select:focus, textarea:focus {
  outline: none; border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-soft);
}
input[type="checkbox"], input[type="radio"] {
  width: 15px; height: 15px; accent-color: var(--accent); box-shadow: none;
}
label.f { display: block; font-size: 12.5px; color: var(--text-2); margin-bottom: 5px; }
.field { margin-bottom: 14px; }

/* --- таблицы ------------------------------------------------------------- */

table { width: 100%; border-collapse: collapse; font-size: 13px; background: var(--surface); }
th {
  text-align: left; font-weight: 500; color: var(--text-3);
  font-size: 11px; letter-spacing: .06em; text-transform: uppercase;
  padding: 9px 11px; border-bottom: 1px solid var(--line);
  background: var(--raise); position: sticky; top: 0; z-index: 1;
}
td { padding: 10px 11px; border-bottom: 1px solid var(--line); color: var(--text); }
tr:last-child td { border-bottom: none; }
.tw { border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; }

table.dense th { padding: 8px 10px; }
table.dense td { padding: 9px 10px; vertical-align: middle; }
table.dense tbody tr:hover td, table.dense tr:hover td { background: var(--raise); }

/* Отмеченная строка видна целиком, а не одной галочкой на краю: при выборе
   пачки с Shift важно с одного взгляда понять, что именно попало в отрезок. */
tr.picked td { background: var(--tint); }
tr.picked td:first-child { box-shadow: inset 2px 0 0 var(--accent); }
table.dense tr.picked:hover td { background: var(--tint); }

/* Разделители колонок. На таблице в десять колонок глаз теряет строку
   на середине и читает возраст одного человека рядом с именем другого;
   вертикаль его удерживает. Линия слабее горизонтальной: строка остаётся
   главным направлением чтения, столбец — вспомогательным. */
table.ruled th, table.ruled td { border-right: 1px solid color-mix(in srgb, var(--line) 55%, transparent); }
table.ruled th:last-child, table.ruled td:last-child { border-right: 0; }


/* Заголовок как ссылка сортировки. Подчёркивания нет: десять подчёркнутых
   слов в шапке читались бы как сплошная ссылка на что-то одно. */
.sh {
  display: inline-flex; align-items: baseline; gap: 4px; color: inherit;
  text-decoration: none; white-space: nowrap;
}
.sh:hover { color: var(--text-2); text-decoration: none; }
.sh.on { color: var(--accent); }
.sh .ar { font-size: 10px; line-height: 1; }

/* Строки проявляются по очереди: движение показывает, что список
   перечитался, — иначе смена страницы или сортировки выглядит так, будто
   ничего не произошло. Сдвиг маленький и без размытия: размывать текст в
   таблице на полсотни строк дорого и выглядит грязно. */
@keyframes rowin { from { opacity: 0; transform: translateY(5px); } }
table.ruled tbody tr {
  animation: rowin .24s cubic-bezier(.32, .72, .3, 1) both;
  animation-delay: calc(var(--i, 0) * 14ms);
}

/* --- пилюли -------------------------------------------------------------- */

.pill {
  display: inline-block; font-size: 11px; font-weight: 600; line-height: 1.3;
  padding: 3px 9px; border-radius: 999px;
  background: var(--p-gray-bg); color: var(--p-gray-fg); white-space: nowrap;
}
.pill.gray  { background: var(--p-gray-bg);   color: var(--p-gray-fg); }
.pill.blue  { background: var(--p-blue-bg);   color: var(--p-blue-fg); }
.pill.teal  { background: var(--p-teal-bg);   color: var(--p-teal-fg); }
.pill.green { background: var(--p-green-bg);  color: var(--p-green-fg); }
.pill.amber { background: var(--p-amber-bg);  color: var(--p-amber-fg); }
.pill.red   { background: var(--p-red-bg);    color: var(--p-red-fg); }
.pill.purple{ background: var(--p-purple-bg); color: var(--p-purple-fg); }
.pill.mini { font-size: 10px; padding: 2px 7px; margin-right: 3px; }

/* --- сообщения ----------------------------------------------------------- */

/* Плашка — поверхность с полоской слева, а не цветная заливка: сообщений на
   экране бывает несколько, и залитые красным они перекрикивали бы кнопку. */
.note {
  border-radius: var(--r); padding: 11px 14px; font-size: 13px; margin-bottom: 14px;
  background: var(--surface); border: 1px solid var(--line);
  box-shadow: inset 2px 0 0 var(--accent); color: var(--text);
}
.note.warn { box-shadow: inset 2px 0 0 var(--danger); }

/* --- вход и экраны вне CRM ----------------------------------------------- */

.login { min-height: 100vh; display: grid; grid-template-columns: 1.15fr 1fr; }
.login .l {
  position: relative; overflow: hidden; padding: 48px; display: flex; flex-direction: column;
  justify-content: space-between; background: var(--surface); border-right: 1px solid var(--line);
}
.login .l::after {
  content: ""; position: absolute; inset: auto -20% -40% -20%; height: 70%; pointer-events: none;
  background: radial-gradient(50% 50% at 50% 50%, color-mix(in srgb, var(--accent) 16%, transparent), transparent 70%);
}
/* Знак стоит у названия как ®: маленький, справа сверху от CRABS. */
.login .big {
  font: 800 clamp(44px, 6.4vw, 92px)/.94 var(--display); letter-spacing: -.035em;
  text-transform: uppercase; position: relative; z-index: 1;
}
.login .big svg { width: .26em; height: .26em; vertical-align: top; margin-left: .06em; }
.login .tag { font: 400 13px var(--mono); color: var(--text-2); position: relative; z-index: 1; }
.login .ltop {
  display: flex; justify-content: space-between; font: 500 12px var(--mono);
  color: var(--text-3); letter-spacing: .04em;
}
.login .r { display: grid; place-items: center; padding: 48px 32px; }
.login form { width: min(360px, 100%); display: flex; flex-direction: column; gap: 12px; }
.login h2 { font: 600 22px var(--font); letter-spacing: -.02em; margin: 0 0 6px; }
.login label { font-size: 12.5px; color: var(--text-2); display: flex; flex-direction: column; gap: 6px; }
.login input { height: 40px; }
.login button.pri { height: 40px; font-size: 14px; margin-top: 6px; }
.login .fine { font-size: 12.5px; color: var(--text-3); text-align: center; margin-top: 8px; line-height: 1.55; }
.login .note { margin: 0; }
@media (max-width: 860px) {
  .login { grid-template-columns: 1fr; }
  .login .l { min-height: 38vh; padding: 28px; }
}

/* Экран вне CRM: без рейки, по центру, одна карточка, одна главная кнопка. */
.svcc {
  min-height: 100vh; display: grid; place-items: center; padding: 32px 16px;
  background: radial-gradient(60% 50% at 50% 40%, color-mix(in srgb, var(--accent) 6%, transparent), transparent 70%), var(--bg);
}
.svcbox {
  width: min(460px, 100%); padding: 32px; display: flex; flex-direction: column;
  align-items: center; gap: 10px; text-align: center;
  background: var(--surface); border: 1px solid var(--line); border-radius: 12px;
}
.svcbox.wide { width: min(520px, 100%); align-items: stretch; text-align: left; }
.svcbox > svg.crab { width: 40px; height: 40px; margin-bottom: 6px; }
.svcbox h1, .svcbox h2 { font: 600 22px/1.25 var(--font); letter-spacing: -.02em; text-transform: none; margin: 0; white-space: normal; }
.svcbox p { font-size: 13.5px; color: var(--text-2); line-height: 1.55; }
.svcbox .ecode { font: 500 56px/1 var(--mono); letter-spacing: -.04em; color: var(--text-3); }
.svcbox .acts { display: flex; gap: 8px; justify-content: center; flex-wrap: wrap; margin-top: 10px; }
.svcbox .wm {
  font: 800 15px var(--display); letter-spacing: -.01em; text-transform: uppercase;
  display: flex; align-items: center; gap: 10px;
}
.svcbox .wm svg { width: 26px; height: 26px; }

/* --- панель инструментов -------------------------------------------------- */

.toolbar {
  display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 10px 12px; margin-bottom: 14px;
}
.toolbar input, .toolbar select { width: auto; padding: 6px 10px; font-size: 13px; }

.chip {
  display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px;
  border: 1px solid var(--line-2); border-radius: 20px; padding: 5px 12px;
  cursor: pointer; user-select: none; background: var(--surface); color: var(--text-2);
}
.chip:hover { border-color: var(--text-3); color: var(--text); }
.chip.on { background: var(--tint); border-color: var(--accent); color: var(--accent); }
.chip input { width: 14px; height: 14px; margin: 0; }
.chip.hot { border-color: color-mix(in srgb, var(--warn) 45%, transparent); color: var(--warn); }
.chip.hot.on { background: var(--warn-bg); border-color: var(--warn); }

select.quick {
  font-size: 12px; padding: 5px 8px; border-radius: 7px;
  border: 1px solid var(--line); background: var(--raise); width: 100%;
}
select.quick:hover { border-color: var(--accent); }

/* --- выбор статуса -------------------------------------------------------- */

/* Кнопка выглядит как сама метка: человек нажимает на то, что меняет,
   а не на отдельный элемент управления рядом с ней. */
/* Пилюля по ширине текста, но в одну строку. Растянутая на всю колонку она
   образует стену из ста одинаковых прямоугольников и перетягивает взгляд с
   имени кандидата; перенесённая на две строки — ломает высоту строк. */
.stbtn {
  display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
  font: inherit; font-size: 12px; text-align: left; cursor: pointer;
  padding: 4px 9px 4px 11px; border-radius: 20px;
  border: 1px solid transparent; white-space: nowrap;
  background: var(--p-gray-bg); color: var(--p-gray-fg);
}
.stbtn .stn { overflow: hidden; text-overflow: ellipsis; }
.stbtn.blue  { background: var(--p-blue-bg);   color: var(--p-blue-fg); }
.stbtn.teal  { background: var(--p-teal-bg);   color: var(--p-teal-fg); }
.stbtn.green { background: var(--p-green-bg);  color: var(--p-green-fg); }
.stbtn.amber { background: var(--p-amber-bg);  color: var(--p-amber-fg); }
.stbtn.red   { background: var(--p-red-bg);    color: var(--p-red-fg); }
.stbtn.purple{ background: var(--p-purple-bg); color: var(--p-purple-fg); }
.stbtn:hover { border-color: currentColor; background: var(--p-gray-bg); }
.stbtn.blue:hover  { background: var(--p-blue-bg); }
.stbtn.teal:hover  { background: var(--p-teal-bg); }
.stbtn.green:hover { background: var(--p-green-bg); }
.stbtn.amber:hover { background: var(--p-amber-bg); }
.stbtn.red:hover   { background: var(--p-red-bg); }
.stbtn.purple:hover{ background: var(--p-purple-bg); }
.stbtn .cv { opacity: .45; flex-shrink: 0; }
.stbtn[aria-expanded="true"] { border-color: currentColor; }
.stbtn.wide { font-size: 13px; padding: 7px 12px 7px 15px; }

.stpop {
  position: fixed; z-index: 60; width: 296px;
  background: var(--surface); border: 1px solid var(--line-2);
  border-radius: 12px; padding: 6px; box-shadow: 0 12px 30px rgba(20,20,22,.16);
}
[data-theme="dark"] .stpop { box-shadow: 0 12px 34px rgba(0,0,0,.5); }
.stpop .stq { margin: 2px 2px 6px; width: calc(100% - 4px); font-size: 13px; padding: 7px 10px; }
/* Высоту задаёт скрипт под свободное место на экране. Здесь только запасное
   значение на случай, если панель успела показаться до расчёта.
   overscroll-behavior не даёт странице поехать, когда список докручен до
   конца, а палец продолжает движение. */
.stpop .stlist { max-height: 330px; overflow-y: auto; overscroll-behavior: contain; }
.stpop .stlist::-webkit-scrollbar { width: 9px; }
.stpop .stlist::-webkit-scrollbar-thumb {
  background: var(--line-2); border-radius: 20px;
  border: 3px solid var(--surface);
}
.stpop .stg {
  font-size: 10px; letter-spacing: .13em; text-transform: uppercase;
  color: var(--text-3); padding: 9px 10px 4px;
}
.stpop .sto {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 7px 10px; border: none; border-radius: 8px; background: transparent;
  color: var(--text); font: inherit; font-size: 13px; text-align: left; cursor: pointer;
}
.stpop .sto:hover, .stpop .sto.at { background: var(--raise); }
.stpop .sto.at { box-shadow: inset 0 0 0 1px var(--accent); }
.stpop .sto.cur .stn { font-weight: 500; }
.stpop .sto.cur::after {
  content: "✓"; color: var(--accent); font-size: 12px; margin-left: 2px;
}
.stpop .stn { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.stpop .std { font-family: var(--mono); font-size: 11px; color: var(--text-3); }
/* «Передал → работа»: название статуса не растягиваем, иначе работа уехала бы
   к правому краю, далеко от слова, к которому относится. */
.stpop .sto:has(.stw) .stn { flex: 0 1 auto; }
.stpop .stw { flex: 1; min-width: 0; color: var(--text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.stpop .stk {
  font-family: var(--mono); font-size: 10px; color: var(--text-3);
  min-width: 15px; text-align: center; border: 1px solid var(--line);
  border-radius: 4px; line-height: 15px;
}
.stpop .stk:empty { border-color: transparent; }
.stpop .stf {
  font-size: 11px; color: var(--text-3); padding: 7px 10px 3px;
  border-top: 1px solid var(--line); margin-top: 4px; white-space: nowrap;
}
.dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; background: var(--p-gray-fg); }
.dot.blue  { background: var(--p-blue-fg); }
.dot.teal  { background: var(--p-teal-fg); }
.dot.green { background: var(--p-green-fg); }
.dot.amber { background: var(--p-amber-fg); }
.dot.red   { background: var(--p-red-fg); }
.dot.purple{ background: var(--p-purple-fg); }
.dot.gray  { background: var(--p-gray-fg); }

/* --- вкладки ------------------------------------------------------------- */

.tabs { display: flex; gap: 2px; margin: 16px 0 18px; border-bottom: 1px solid var(--line); }
.tab {
  padding: 9px 15px; text-decoration: none; color: var(--text-2);
  border-bottom: 2px solid transparent; margin-bottom: -1px; font-size: 13.5px;
}
.tab:hover { color: var(--text); text-decoration: none; }
.tab.on { color: var(--text); font-weight: 500; border-bottom-color: var(--accent); }

/* --- состояния ------------------------------------------------------------ */

tr.bl { opacity: .5; }
tr.bl a { color: var(--text-3); }

.locked { filter: blur(3px); opacity: .5; pointer-events: none; user-select: none; }
.lockbar {
  display: flex; align-items: center; gap: 14px; padding: 14px 16px;
  border: 1px solid color-mix(in srgb, var(--warn) 35%, transparent);
  border-radius: var(--r-lg); background: var(--warn-bg); color: var(--text);
}

/* Окно посередине экрана.
 *
 * Браузер центрует dialog сам — через margin: auto. Но в начале этого файла
 * стоит сброс `* { margin: 0 }`, и он это отменял: все окна прижимались к
 * левому верхнему углу. Возвращаем отступ явно, всем сразу, а не каждому
 * окну в своём шаблоне.
 *
 * Заодно ограничиваем высоту: длинное окно (правка собеседования с лентой
 * комментариев) иначе уезжает за нижний край, и кнопку «Сохранить» не достать.
 */
dialog.modal {
  margin: auto;
  border: 1px solid var(--line-2); border-radius: var(--r-lg); padding: 22px;
  width: min(700px, 92vw); background: var(--surface); color: var(--text);
  max-height: min(88vh, 900px); overflow-y: auto; overscroll-behavior: contain;
}
dialog.modal::backdrop { background: var(--veil); }
/* Выезжающая панель справа (.ndraw): детали, а не подтверждение. Список
   остаётся виден слева, и между строками можно переходить, не теряя места.
   Это тот же <dialog> — открывается и закрывается теми же data-open/data-close. */
dialog.modal.ndraw {
  margin: 0 0 0 auto; height: 100vh; max-height: 100vh; width: min(480px, 100vw);
  border-radius: 0; border-width: 0 0 0 1px; padding: 22px 24px;
  box-shadow: var(--pop-shadow);
}
dialog.modal.ndraw[open] { animation: ndraw .24s cubic-bezier(.2, .8, .2, 1); }
@keyframes ndraw { from { transform: translateX(24px); opacity: 0; } }
/* Секции панели — через волосяную границу; действия внизу секции. */
.ndraw .dsec { padding: 16px 0; border-top: 1px solid var(--line); }
.ndraw .dsec:first-of-type { border-top: 0; }
tr.clk { cursor: pointer; }

.empty { text-align: center; padding: 46px 20px; color: var(--text-2); }
.empty .ring { margin: 0 auto 16px; display: block; }
.empty h2 { margin: 0 0 6px; font-family: var(--display); font-size: 16px; font-weight: 700; text-transform: uppercase; letter-spacing: -.01em; }

/* --- знак ----------------------------------------------------------------- */

/* Кольцо-пиктограмма на пустых и служебных экранах. */
.enso { display: block; }
.enso circle, .enso path { fill: none; stroke-linecap: round; }

/* --- узкий экран ---------------------------------------------------------- */

/* На телефоне рейка уходит вниз, под большой палец: шесть режимов влезают
   в одну строку, поиск и тема — в меню профиля. Вкладки шапки прокручиваются. */
@media (max-width: 860px) {
  .app { grid-template-columns: minmax(0, 1fr); padding-bottom: 64px; }
  .rail {
    position: fixed; inset: auto 0 0 0; height: 64px; width: 100%;
    flex-direction: row; justify-content: space-around; padding: 6px;
    border-right: 0; border-top: 1px solid var(--line); z-index: 40;
  }
  .rail .logo, .rail .sp, .rbtn { display: none; }
  .mode { width: auto; flex: 1; padding: 8px 0 6px; font-size: 10.5px; }
  .mode.on::before {
    left: 12px; right: 12px; top: -6px; bottom: auto; width: auto; height: 3px;
    border-radius: 0 0 3px 3px;
  }
  .avam { margin: 0 4px; align-self: center; }
  .amenu { left: 8px; right: 8px; width: auto; bottom: 72px; }
  .hdr { gap: 10px; padding: 0 16px; }
  .hdr .org { display: none; }
  .view { padding: 16px 16px 40px; }
  th { position: static; }
}

@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; }
}

/* --- чужая учётка --------------------------------------------------------- */

/* Янтарь, как в админке: тот же цвет означает «ты сейчас в роли владельца
   платформы, а не сотрудника». Полоса висит на каждой странице намеренно. */
.asbar {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  background: var(--gold-bg); color: var(--text);
  border: 1px solid color-mix(in srgb, var(--gold) 45%, transparent);
  border-radius: var(--r); padding: 10px 14px; margin-bottom: 14px;
  font-size: 13px;
}
.asbar .btn { margin-left: auto; }



/* ── Выдвижная карточка ────────────────────────────────────────────────
   Открывать кандидата новой вкладкой значило терять место в списке и
   копить вкладки за смену. Панель оставляет список позади нетронутым:
   закрыл — и ты там же, где был. Уровень ниже, чем у панели статусов,
   чтобы выбор статуса внутри карточки открывался поверх, а не под ней. */
.drw { position: fixed; inset: 0; z-index: 50; display: flex; justify-content: flex-end; }
.drw[hidden] { display: none !important; }
body.drw-on { overflow: hidden; }

/* Панель выезжает от края, а не проявляется на месте: движение объясняет,
   откуда взялась карточка и куда она денется. Плавность держится на
   переходах, а не на ключевых кадрах, — тогда закрытие само становится
   обратным ходом того же движения, без второй анимации. */
.drw-veil {
  position: absolute; inset: 0; background: rgba(20,20,22, .26);
  opacity: 0; transition: opacity .3s ease;
}
[data-theme="dark"] .drw-veil { background: rgba(0, 0, 0, .52); }
.drw.in .drw-veil { opacity: 1; }

.drw-panel {
  position: relative; width: min(780px, 94vw); background: var(--bg);
  border-left: 1px solid var(--line-2); display: flex; flex-direction: column;
  box-shadow: -22px 0 54px rgba(20,20,22, .18);
  transform: translateX(100%);
  transition: transform .3s cubic-bezier(.32, .72, .3, 1);
  will-change: transform;
}
[data-theme="dark"] .drw-panel { box-shadow: -22px 0 54px rgba(0, 0, 0, .5); }
.drw.in .drw-panel { transform: none; }

.drw-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 10px 14px 10px 20px; border-bottom: 1px solid var(--line);
  flex-shrink: 0; background: var(--surface);
}
.drw-head a { font-size: 12px; color: var(--text-2); }
/* Кнопка фиксированного размера со значком внутри. Значок — это буква, а у
   буквы своя высота строки и свои свисающие части, поэтому «line-height: 1»
   центрует её только на глаз и в одном шрифте. Раскладка по обеим осям
   решает это честно и одинаково во всех браузерах. */
.drw-x {
  width: 30px; height: 30px; display: inline-flex;
  align-items: center; justify-content: center;
  border: 1px solid var(--line-2); border-radius: 8px;
  background: var(--surface); color: var(--text-2); cursor: pointer; font-size: 13px;
  line-height: 1; flex-shrink: 0; padding: 0;
}
.drw-x:hover { color: var(--text); border-color: var(--text-3); }
.drw-body { overflow-y: auto; overscroll-behavior: contain; padding: 18px 22px 44px; }
.drw-body > h1:first-child, .drw-body .between h1 { font-size: 24px; }
.drw-wait { color: var(--text-3); padding: 30px 0; }
@media (max-width: 700px) { .drw-panel { width: 100vw } .drw-body { padding: 14px 15px 40px } }
/* Широкий экран: список и превью рядом (макет v2, «База»). Затемнения нет,
   обёртка не ловит щелчки, таблица сжимается на ширину панели — она остаётся
   рабочей, и щелчок по другой строке просто меняет превью. Узкий экран —
   по-прежнему панель поверх списка: рядом там места нет. */
@media (min-width: 1280px) {
  .drw { pointer-events: none; }
  .drw-veil { display: none; }
  .drw-panel { pointer-events: auto; width: min(560px, 40vw); box-shadow: none; }
  body.drw-on { overflow: auto; }
  body.drw-on .view { padding-right: calc(min(560px, 40vw) + 24px); max-width: none; }
}
/* Строка, чьё досье открыто, — как выбранная в макете: подложка и полоска. */
tr.cur td { background: var(--raise); }
tr.cur td:first-child { box-shadow: inset 2px 0 0 var(--accent); }

/* ── Свой выпадающий список ────────────────────────────────────────────
   Системный select рисует ОС: на macOS это серое меню поверх страницы,
   чужое по цвету и шрифту, и его нельзя ни искать, ни разложить по
   группам. Родной элемент остаётся в форме — с ним работают отправка,
   атрибут form и onchange, — но показывает его кнопка, а список берёт
   ту же панель, что и статусы. Без JS остаётся обычный select. */
.sel-native {
  position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; opacity: 0;
  pointer-events: none;
}
.selbtn {
  display: inline-flex; align-items: center; justify-content: space-between; gap: 8px;
  width: 100%; font: inherit; font-size: 13.5px; text-align: left; cursor: pointer;
  border: 1px solid var(--line-2); border-radius: var(--r); padding: 8px 11px;
  background: var(--surface); color: var(--text);
}
.selbtn:hover { border-color: var(--text-3); }
.selbtn[aria-expanded="true"] { border-color: var(--accent); box-shadow: 0 0 0 3px var(--tint); }
.selbtn .sn { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.selbtn .cv { width: 12px; height: 12px; flex-shrink: 0; color: var(--text-3); }
.selbtn.empty .sn { color: var(--text-3); }
.toolbar .selbtn { width: auto; padding: 6px 10px; font-size: 13px; }
.selbtn.quick { width: auto; padding: 5px 9px; font-size: 12.5px; }
.selpop { width: auto; min-width: 190px; max-width: 340px; }


/* ── Выбор периода подписки ────────────────────────────────────────────
   Настоящие радиокнопки под видом плиток: выбор с клавиатуры, стрелками
   и через программу чтения экрана работает сам, без единой строки кода. */
.pers { display: flex; gap: 10px; flex-wrap: wrap; }
.per {
  display: flex; flex-direction: column; gap: 3px; cursor: pointer;
  padding: 12px 18px; border: 1px solid var(--line-2); border-radius: 12px;
  background: var(--surface); min-width: 116px;
  transition: border-color .15s ease, background .15s ease;
}
.per:hover { border-color: var(--text-3); }
.per input { position: absolute; opacity: 0; width: 0; height: 0; }
.per b { font-size: 13px; font-weight: 500; color: var(--text-2); }
.per span { font-family: var(--mono); font-size: 17px; color: var(--text); }
.per.on { border-color: var(--accent); background: var(--tint); }
.per.on b { color: var(--accent); }
.per:focus-within { box-shadow: 0 0 0 3px var(--tint); }


/* ── Календарь собеседований ───────────────────────────────────────────
   Сетка на CSS Grid, а не на таблице: клетка должна тянуться по числу
   событий, а строка таблицы навязывает одну высоту всему ряду.

   Читаемость важнее плотности ровно до предела клетки. Дальше в ней
   появляется «ещё N» со ссылкой в неделю: шесть плашек — тот предел, при
   котором день ещё видно целиком, а не превращается в столбик обрубков. */
.calbar { margin-bottom: 10px; flex-wrap: wrap; gap: 10px; }

.cal {
  border: 1px solid var(--line); border-radius: 12px; overflow: hidden;
  background: var(--surface);
}

/* Месяц */
.cal-week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
.cal-week + .cal-week { border-top: 1px solid var(--line); }
.cal-dow { background: var(--raise); }
.cal-dow-c {
  padding: 7px 10px; font-size: 11.5px; color: var(--text-3);
  text-transform: uppercase; letter-spacing: .04em;
}
.cal-dow-c + .cal-dow-c, .cal-cell + .cal-cell { border-left: 1px solid var(--line); }

.cal-cell {
  min-height: 104px; padding: 6px; display: flex; flex-direction: column;
  gap: 3px; transition: background .12s ease;
}
/* Дни соседних месяцев остаются на месте, но уходят на второй план: без них
   ряд рвётся, а с полной яркостью они спорят за внимание с текущим месяцем. */
.cal-cell.out { background: var(--raise); }
.cal-cell.out .cal-num { color: var(--text-3); }
.cal-cell.now { box-shadow: inset 0 2px 0 var(--accent); }
.cal-cell.cal-hot { background: var(--tint); }
.cal-num { font-size: 12px; color: var(--text-2); margin-bottom: 1px; }
.cal-cell.now .cal-num { color: var(--accent); font-weight: 600; }

.cal-ev {
  display: flex; align-items: baseline; gap: 5px; min-width: 0;
  padding: 3px 6px; border-radius: 6px; font-size: 11.5px; cursor: grab;
  background: var(--p-gray-bg); color: var(--p-gray-fg);
  text-decoration: none;
  /* Safari не начинает перенос по одному атрибуту draggable, если элемент —
     ссылка: он предпочитает тащить адрес. Это свойство говорит прямо, что
     тащим сам элемент. */
  -webkit-user-drag: element;
}
.cal-ev:hover { text-decoration: none; filter: brightness(.97); }
.cal-ev b { font-family: var(--mono); font-size: 11px; flex-shrink: 0; }
.cal-ev .cal-nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cal-ev.blue  { background: var(--p-blue-bg);   color: var(--p-blue-fg); }
.cal-ev.teal  { background: var(--p-teal-bg);   color: var(--p-teal-fg); }
.cal-ev.green { background: var(--p-green-bg);  color: var(--p-green-fg); }
.cal-ev.amber { background: var(--p-amber-bg);  color: var(--p-amber-fg); }
.cal-ev.red   { background: var(--p-red-bg);    color: var(--p-red-fg); }
.cal-ev.purple{ background: var(--p-purple-bg); color: var(--p-purple-fg); }
/* Выход на работу — не собеседование: другой день, другое действие. Пунктир
   отличает его от плашки собеса без второго цвета в легенде. */
.cal-ev.exit {
  background: transparent; border: 1px dashed var(--line-2); color: var(--text-2);
  cursor: pointer;
}
.cal-more {
  font-size: 11px; color: var(--text-3); padding: 1px 6px; margin-top: auto;
}
.cal-more:hover { color: var(--accent); }

/* Перенос. Тащится не сама плашка, а её летящая копия: оригинал остаётся на
   месте приглушённым, поэтому видно, откуда событие уходит. Правило
   pointer-events здесь было ошибкой — Safari отменяет перенос, если у
   тащимого элемента оно меняется по ходу дела. */
.cal-ghost {
  position: fixed; z-index: 70; pointer-events: none; opacity: .95;
  box-shadow: 0 8px 22px rgba(20,20,22, .22);
}
[data-theme="dark"] .cal-ghost { box-shadow: 0 8px 22px rgba(0, 0, 0, .55); }
.cal-lift { opacity: .35; }
body.cal-drag { cursor: grabbing; user-select: none; }
body.cal-drag .cal-cell, body.cal-drag .wk-slot { cursor: grabbing; }
/* touch-action: пальцем плашка должна тащиться, а не прокручивать страницу. */
.cal-ev[data-iv] { touch-action: none; }

/* Неделя. Высота часа — переменная: от неё считаются и сетка, и положение
   каждой плашки, поэтому менять масштаб можно одним числом. */
.cal-wk { --h: 44px; }
.wk-head, .wk-body { display: grid; grid-template-columns: 58px repeat(7, minmax(0, 1fr)); }
.wk-head { background: var(--raise); border-bottom: 1px solid var(--line); }
.wk-day { padding: 7px 8px; font-size: 12px; color: var(--text-2); }
.wk-day + .wk-day { border-left: 1px solid var(--line); }
.wk-day.now { color: var(--accent); box-shadow: inset 0 2px 0 var(--accent);
  background: color-mix(in srgb, var(--accent) 9%, transparent); }
.wk-day b { font-family: var(--mono); }

.wk-gut { border-right: 1px solid var(--line); }
.wk-hour { height: var(--h); position: relative; }
/* Подпись сидит на самой линии часа, а не под ней: иначе глаз относит 09:00
   к промежутку 9–10, и время читается со сдвигом на час. */
.wk-hour span {
  position: absolute; top: -7px; right: 7px;
  font-family: var(--mono); font-size: 10.5px; color: var(--text-3);
}
.wk-hour:first-child span { top: 1px; }

.wk-col { position: relative; border-left: 1px solid var(--line); }
/* Сегодняшний столбец только помечен, а не залит. Полный тон съедал линии
   часов, и день превращался в зелёное поле без разметки — то есть терял
   ровно то, зачем нужна недельная сетка. Пятнадцати процентов хватает,
   чтобы найти столбец глазами, и мало, чтобы спорить с линиями. */
.wk-col.now { background: color-mix(in srgb, var(--accent) 7%, transparent); }
/* Линии часов рисуются цветом рамок, а не подложки: на подкрашенном столбце
   подложка сливалась с фоном и линии исчезали. */
.wk-slot { height: var(--h); border-top: 1px solid var(--line); cursor: cell; }
.wk-slot:first-child { border-top: 0; }
.wk-slot:hover { background: color-mix(in srgb, var(--accent) 5%, transparent); }
.wk-slot.cal-hot { background: var(--tint); box-shadow: inset 0 0 0 1px var(--accent); }
.wk-ev { position: absolute; padding: 0 2px; }
.wk-ev .cal-ev.tall {
  flex-direction: column; gap: 0; align-items: flex-start;
  min-height: calc(var(--h) - 6px); padding: 4px 6px;
}

/* «+» в клетке и окно назначения. Кнопка появляется по наведению: тридцать
   постоянных плюсов на экране — это тридцать приглашений нажать, и клетка
   перестаёт читаться как день. */
.cal-add {
  opacity: 0; padding: 0 4px; margin: -2px -2px 0 0; line-height: 1;
  font-size: 15px; border: 0; background: none; color: var(--text-3);
  cursor: pointer; transition: opacity .12s ease, color .12s ease;
}
.cal-cell:hover .cal-add, .cal-add:focus-visible { opacity: 1; }
.cal-add:hover { color: var(--accent); }
.cal-num.between { align-items: flex-start; gap: 4px; }

.ivfound { margin-top: 12px; max-height: 210px; overflow-y: auto; }
.ivf {
  display: flex; flex-direction: column; gap: 2px; width: 100%;
  text-align: left; padding: 8px 10px; border: 1px solid transparent;
  border-radius: 9px; background: none; font: inherit; color: var(--text);
  cursor: pointer;
}
.ivf:hover { background: var(--raise); }
.ivf.on { border-color: var(--accent); background: var(--tint); }
.ivf b { font-weight: 500; }

/* ── Выбор даты ────────────────────────────────────────────────────────
   Родное поле остаётся в форме и продолжает отправляться, наружу смотрит
   своя кнопка. Причина та же, что и у списков: родной календарь браузера
   нельзя привести к одному виду, а в Safari он выглядит как окно из другой
   эпохи и тянет за собой весь экран. */
.datebtn {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  font: inherit; text-align: left; border: 1px solid var(--line-2);
  border-radius: var(--r); padding: 8px 11px; background: var(--surface);
  color: var(--text);
}
.datebtn:hover { border-color: var(--text-3); }
.datebtn[aria-expanded="true"] { border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--tint); }
.datebtn .dn { font-family: var(--mono); font-size: 13px; }
.datebtn.empty .dn { color: var(--text-3); font-family: var(--font); }
.datebtn .dic { width: 14px; height: 14px; flex-shrink: 0; fill: none;
  stroke: var(--text-3); stroke-width: 1.4; }
.toolbar .datebtn { padding: 6px 10px; font-size: 13px; }

.dpop { width: auto; padding: 10px; }
.dhead { display: flex; align-items: center; justify-content: space-between;
  gap: 6px; padding: 2px 4px 8px; }
.dhead b { font-size: 13px; font-weight: 500; text-transform: capitalize; }
.dnav { border: 0; background: none; cursor: pointer; color: var(--text-3);
  font-size: 17px; line-height: 1; padding: 2px 8px; border-radius: 7px; }
.dnav:hover { background: var(--raise); color: var(--text); }

/* Сетка и время рядом. Колонка со временем отделена линией, а не рамкой:
   это одна панель, а не два элемента управления. */
.dbody { display: flex; gap: 10px; align-items: flex-start; }
.dgrid { display: grid; grid-template-columns: repeat(7, 32px); gap: 2px; }
.dtimes {
  display: grid; gap: 3px; width: 76px; max-height: 216px; overflow-y: auto;
  padding-left: 10px; border-left: 1px solid var(--line);
  scrollbar-width: thin;
}
.dt {
  border: 1px solid var(--line); border-radius: 7px; background: var(--surface);
  cursor: pointer; font: inherit; font-size: 12.5px; font-family: var(--mono);
  color: var(--text); padding: 5px 0;
}
.dt:hover { border-color: var(--text-3); }
.dt.on { background: var(--accent); border-color: var(--accent);
  color: var(--on-accent); }
.dw { font-size: 10px; color: var(--text-3); text-align: center;
  padding-bottom: 4px; }
.dc {
  height: 30px; border: 0; border-radius: 8px; background: none; cursor: pointer;
  font: inherit; font-size: 12.5px; font-family: var(--mono); color: var(--text);
}
.dc:hover { background: var(--raise); }
/* Сегодня обведено, выбранное залито: два разных вопроса — «где я» и «что
   стоит в поле», и путать их нельзя. */
.dc.now { box-shadow: inset 0 0 0 1px var(--line-2); }
.dc.on { background: var(--accent); color: var(--on-accent); }
.dc.out { visibility: hidden; }
.dfoot { display: flex; align-items: center; justify-content: space-between;
  gap: 10px; padding: 9px 3px 1px; margin-top: 6px;
  border-top: 1px solid var(--line); }
.dtoday { border: 0; background: none; cursor: pointer; font: inherit;
  font-size: 12px; color: var(--accent); padding: 2px 0; }
.dtoday:hover { text-decoration: underline; }

/* Полоса ответа на перенос. Живёт над сеткой, а не всплывающим окном:
   сообщение относится к календарю, и уводить из него внимание незачем. */
.calmsg {
  margin: 0 0 10px; padding: 8px 12px; border-radius: var(--r); font-size: 12.5px;
  background: var(--tint); color: var(--text);
  border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent);
}
.calmsg.warn {
  background: var(--danger-bg); color: var(--text);
  border-color: color-mix(in srgb, var(--danger) 38%, transparent);
}

/* ── Список кандидатов: телефон, комментарий, прокрутка ────────────────
   Телефон вынесен из подписи под именем в свою колонку: по нему звонят сто
   раз за смену, а мелким шрифтом в подписи он не читался и не копировался. */
.ph {
  font-family: var(--mono); font-size: 13px; letter-spacing: 0; font-variant-numeric: tabular-nums;
  color: var(--text); text-decoration: none;
}
.ph:hover { color: var(--accent); text-decoration: none; }
.cp {
  border: 0; background: none; cursor: pointer; color: var(--text-3);
  font-size: 12px; padding: 2px 5px; border-radius: 6px; margin-left: 4px;
}
.cp:hover { background: var(--raise); color: var(--accent); }

/* Метка Telegram у имени. Не цветная заливка, а контур: в таблице на сотню
   строк заливка рябила бы. Сплошной — ник есть, рассылка напишет; пунктир —
   Telegram есть, ника нет; серый — Telegram нет вовсе. */
.tgb {
  display: inline-block; vertical-align: 1px; margin-left: 6px; padding: 0 5px;
  border-radius: 4px; font: 500 10.5px/16px var(--mono); color: var(--p-teal);
  border: 1px solid color-mix(in srgb, var(--p-teal) 45%, transparent);
}
.tgb.dash { border-style: dashed; }
.tgb.no { color: var(--text-3); border-color: var(--line-2); }
/* Имя с меткой — в одну строку: перенос метки удваивал высоту каждой строки. */
td.nm { white-space: nowrap; }

/* Комментарий переносится, а не обрезается: в нём лежит то, о чём
   договорились, и обрубок «сказала, что подума…» бесполезен. */
.cmt {
  white-space: normal; line-height: 1.45; color: var(--text-2);
  max-height: 46px; overflow: hidden;
}

/* Прокрутка в бок вместо сжатия: телефон и комментарий важнее, чем влезание
   всей таблицы в экран. Отметка и имя остаются на месте — уехав вправо,
   иначе перестаёшь понимать, чья это строка. */
.scrollx { overflow-x: auto; overscroll-behavior-x: contain; }
table.wide { min-width: 1080px; }
.scrollx th.stick1, .scrollx td.stick1 {
  position: sticky; left: 0; z-index: 2; background: var(--surface);
}
.scrollx th.stick2, .scrollx td.stick2 {
  position: sticky; left: 30px; z-index: 2; background: var(--surface);
}
.scrollx thead th.stick1, .scrollx thead th.stick2 { z-index: 3; background: var(--raise); }
.scrollx tr:hover td.stick1, .scrollx tr:hover td.stick2 { background: var(--raise); }
.scrollx tr.picked td.stick1, .scrollx tr.picked td.stick2 { background: var(--tint); }

/* Пора звонить: строка светится сама на следующий день после «не берёт
   трубку». Это то же знание, что давала колонка «Вернуться», но его не надо
   искать глазами в каждой строке. Полоса слева, а не фон: фоном уже помечены
   отметка и наведение, и третий фон превратил бы таблицу в светофор. */
tr.ring td.stick1 { box-shadow: inset 3px 0 0 var(--warn); }
tr.ring:not(:hover) td { background: color-mix(in srgb, var(--warn-bg) 45%, transparent); }

/* Окно настройки колонок */
.colslist { margin-top: 12px; border: 1px solid var(--line); border-radius: 10px; }
.colrow {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 7px 10px;
}
.colrow + .colrow { border-top: 1px solid var(--line); }
.colon { display: flex; align-items: center; gap: 9px; cursor: pointer; flex: 1; }
.colon input { width: 15px; height: 15px; }
.colon input:disabled + span { color: var(--text-3); }


/* ── Кнопки со значком вместо подписи ──────────────────────────────────
   Все они центруют содержимое раскладкой. Проверено по всей системе: крестик
   карточки, копирование номера, стрелки месяца в датнике, «плюс» в клетке
   календаря, «ещё» в таблицах, стрелки страниц, карандаш правки и знак
   чёрного списка. Один способ на все — иначе следующая такая кнопка снова
   окажется сдвинутой на пиксель. */
button.sm, .btn.sm, .cp, .dnav, .cal-add, .dc, .dtoday {
  display: inline-flex; align-items: center; justify-content: center;
}
/* Значок в такой кнопке не должен растягивать её по высоте больше подписи:
   у знаков вроде ⦸ и ✎ высота строки больше, чем у цифр. */
button.sm, .btn.sm { line-height: 1.25; }

/* Перетаскивание колонок за заголовок. Курсор-«рука» появляется только на
   заголовках, которые можно двигать: остальные — отметка и знак чёрного
   списка — не про порядок. */
/* Выделение запрещаем заранее, на самой шапке: если ждать начала переноса,
   Safari успевает начать выделение текста, и половина таблицы синеет. */
th.cdrag { cursor: grab; user-select: none; -webkit-user-select: none; }
th.cdragging { opacity: .4; }
/* Линия у той колонки, куда встанет перенесённая. Линия, а не заливка: заливка
   в шапке уже занята — ею помечена сортировка. */
th.cdrop { box-shadow: inset 3px 0 0 var(--accent); }
.colghost {
  position: fixed; z-index: 70; pointer-events: none;
  padding: 4px 10px; border-radius: 7px; font-size: 11px;
  letter-spacing: .04em; text-transform: uppercase;
  background: var(--accent); color: var(--on-accent);
  box-shadow: 0 6px 18px rgba(20,20,22, .25);
}
body.cols-drag { cursor: grabbing; user-select: none; }
body.cols-drag th.cdrag { cursor: grabbing; }


/* ── Портрет удачи ────────────────────────────────────────────────────────
   Строка на человека, внутри — чипы сегментов. Чип, а не таблица с колонками
   «пол / возраст / город / источник»: у половины людей часть сегментов не
   набирает порога, и таблица стояла бы наполовину пустой. Чип просто не
   появляется, и строка читается как фраза. */
.pt { display: flex; flex-direction: column; gap: 8px; }
.ptrow {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: 11px 14px;
}
.pthead {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 8px;
}
.ptrow.quiet .pthead b { color: var(--text-2); font-weight: 500; }
.ptchips { display: flex; gap: 7px; flex-wrap: wrap; }
/* Заливка тинтом, а не рамкой: чипов в строке до четырёх, и четыре рамки
   рядом дают решётку, которую глаз читает дольше самих слов. */
.ptchip {
  display: inline-flex; align-items: baseline; gap: 7px;
  background: var(--tint); border-radius: 20px; padding: 4px 11px;
  font-size: 13px; color: var(--text); cursor: help;
}
.ptchip i {
  font-style: normal; font-family: var(--mono); font-size: 12px;
  color: var(--accent);
}
/* Прирост к собственному среднему — самое важное число здесь и единственное
   выделенное: без него «45%» ничего не значит. */
.ptchip em {
  font-style: normal; font-family: var(--mono); font-size: 11px;
  color: var(--gold);
}


/* Заказчик — только просмотр (<body data-ro>). Сервер отклонит любую запись и
   так; здесь прячем то, что всё равно не сработает, чтобы не было кнопок,
   которые «ничего не делают». Формы со статусом остаются: статус —
   это то, что заказчику смотреть, — но выбрать другой нельзя. */
[data-ro] form[method="post"]:not(:has([data-status-pick])):not([action="/logout"]):not([action="/client/password"]),
[data-ro] details:has(form[method="post"]:not([action="/logout"]):not([action="/client/password"])),
[data-ro] [data-open], [data-ro] .pick, [data-ro] .bulk, [data-ro] [data-ro-hide],
[data-ro] a[href^="/import"], [data-ro] a[href="/call"], [data-ro] a[href^="/call?"],
[data-ro] a[href^="/candidates/new"], [data-ro] [data-show], [data-ro] [data-toggle="edit"],
[data-ro] th.stick1:has(#pickall), [data-ro] td.stick1:has(.pick) { display: none !important; }
[data-ro] [data-status-pick] { pointer-events: none; }
[data-ro] [data-status-pick] .cv { display: none; }
