  /* ==========================================================================
     [блок].офис - дизайн-система CRM
     Айдентика (бренд-бук [блок]): монохромная типографика, скобки как
     единственный графический мотив, «отсутствие дизайна - только типографика».
     Поверхности - liquid glass: полупрозрачные слои с blur и бликом по
     верхней кромке над мягкой серой «атмосферой».
     ВАЖНО: имена классов - контракт с app.js, не переименовывать.
     ========================================================================== */
  :root {
    --sans: -apple-system, "Helvetica Neue", "Segoe UI", Roboto, Arial, sans-serif;
    --mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
    --ink: #0b0b0d;            /* фирменный чёрный */
    --ink2: #47474e;
    --mut: #7c7c84;
    --ghost: #94949c; /* apple-аудит §12: было #ababb2 (~2.2:1) - над стеклом нечитаемо */
    --bd: rgba(11,11,13,.09);  /* волосяная граница */
    --bd2: rgba(11,11,13,.16);
    --bg2: #f1f1f4;            /* доп-фон (подложка раскрывашек) - нейтральный, чуть темнее белого */
    --glass: rgba(255,255,255,.55);
    --glass2: rgba(255,255,255,.78);
    --blur: saturate(160%) blur(20px);
    --shadow-panel: 0 1px 1px rgba(11,11,13,.03), 0 18px 44px -18px rgba(11,11,13,.22);
    --shadow-float: 0 2px 6px rgba(11,11,13,.05), 0 22px 48px -16px rgba(11,11,13,.28);
    --ring: 0 0 0 3px rgba(11,11,13,.14);
    --r-ctl: 10px; --r-card: 16px;
    /* семантика статусов (смягчённые тона, оттенки прежние - их уже выучили) */
    --ok-bg:#e2f2e6; --ok-tx:#1d6f42;
    --warn-bg:#f9efd6; --warn-tx:#8a5a0b;
    --bad-bg:#fbe7e5; --bad-tx:#a3352d;
    --info-bg:#e9edfb; --info-tx:#3b3f9e;
  }
  * { box-sizing: border-box; }
  html { height: 100%; }
  body {
    margin: 0; min-height: 100vh;
    font-family: var(--sans); color: var(--ink);
    background: #e9e9ec;
    -webkit-font-smoothing: antialiased;
    line-height: 1.45; /* apple-аудит §15: копия дышит; плотным местам - 1.25 ниже */
  }
  table, .uchip, .rel-st, .dlg-st, .src, .fmt { line-height: 1.25; }
  /* атмосфера: крупные монохромные пятна, чтобы стеклу было что преломлять */
  body::before {
    content: ""; position: fixed; inset: -20%; z-index: -1; pointer-events: none;
    background:
      radial-gradient(42% 34% at 16% 12%, rgba(255,255,255,.9), rgba(255,255,255,0) 70%),
      radial-gradient(50% 44% at 86% 8%, rgba(199,199,207,.55), rgba(199,199,207,0) 72%),
      radial-gradient(46% 40% at 78% 88%, rgba(214,212,206,.6), rgba(214,212,206,0) 70%),
      radial-gradient(38% 34% at 8% 78%, rgba(186,186,196,.42), rgba(186,186,196,0) 70%);
    /* apple-аудит §11: вечный дрейф заставлял пересчитывать blur ВСЕХ стеклянных
       панелей каждый кадр ради незаметных 0.5px/с - фон теперь статичен */
  }
  ::selection { background: rgba(11,11,13,.85); color: #fff; }
  /* apple-аудит §1: отклик В МОМЕНТ нажатия - у пилюль лёгкое сжатие, у плоских
     рядов затемнение; transition короткий, чтобы press читался мгновенно */
  .tab:active, .seg a:active, .btn-send:active, .actions-btn:active,
  .chatbtn:active, .bub-tool:active, .uiconfirm-btn:active, .scard-btn:active,
  .bellbtn:active, .af-save:active, .lead-share:active, .btn-godialog:active {
    transform: scale(.96); transition-duration: 60ms; }
  .ddmenu .b:active { background: rgba(11,11,13,.09); transition-duration: 60ms; }
  /* остальные плоские ряды - в конце файла: их :hover объявлен ниже и при равной
     специфичности перебивал бы press (мышью нажатие всегда идёт с наведением) */

  /* ---------- логотип [блок].офис ---------- */
  /* «[блок].» жирный; «офис» - тот же шрифт и размер, только тоньше. */
  .glogo {
    display: inline-flex; align-items: baseline;
    color: var(--ink); text-decoration: none;
    font-weight: 600; letter-spacing: -.02em; line-height: 1;
    white-space: nowrap;
  }
  .gl-br { display: inline-block; font-weight: 300; }
  .gl-word { display: inline-block; overflow: hidden; white-space: nowrap; min-width: 0; }
  .gl-word > span { display: inline-block; }
  /* точка = квадрат той же «толщины», что и тонкий «офис» (не глиф «.») */
  .gl-dot { display: inline-block; width: .1em; height: .1em; background: currentColor;
    border-radius: .5px; margin: 0 .05em .04em; }
  .gl-suffix { display: inline-block; font-weight: 300; color: var(--ink); margin-left: .02em; }
  /* анимация: [] появляются -> «блок» печатается внутри и раздвигает скобки в
     стороны -> «офис» проявляется из размытия. На центрированном логотипе
     (хаб/вход) скобки расходятся симметрично: строка растёт от центра. */
  .glogo.anim .gl-br { animation: glbr .3s ease .05s backwards; }
  .glogo.anim .gl-word { animation: glword .62s cubic-bezier(.2,.75,.28,1) .34s both; }
  .glogo.anim .gl-dot { animation: glbr .3s ease .92s backwards; }
  .glogo.anim .gl-suffix { animation: glsuf .55s ease 1.04s backwards; }
  @keyframes glbr { from { opacity: 0; } to { opacity: 1; } }
  @keyframes glword { from { max-width: 0; } to { max-width: 5ch; } }
  @keyframes glsuf { from { opacity: 0; filter: blur(6px); } to { opacity: 1; filter: blur(0); } }
  /* явные классы gl-l/gl-r - чтобы при наведении гарантированно ехали ОБЕ скобки
     (а не полагаться на :last-of-type, который ловит последний span = «офис»). */
  a.glogo:hover .gl-l { transform: translateX(-.07em); }
  a.glogo:hover .gl-r { transform: translateX(.07em); }
  a.glogo .gl-br { transition: transform .25s cubic-bezier(.3,.7,.3,1); }

  /* ---------- топбар (стеклянная плашка) ---------- */
  header {
    display: flex; align-items: center; justify-content: space-between; gap: 14px;
    margin: 14px 16px 0; padding: 11px 18px;
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.65);
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.9);
    border-radius: var(--r-card);
    /* backdrop-filter создаёт stacking context; поднимаем шапку над полосой
       подразделов (сиблинг ниже по DOM), иначе выпадашка «Заявки» уходит под неё.
       apple-аудит §12: sticky - контент скроллится ПОД стекло, материал живёт */
    position: sticky; top: 10px; z-index: 30;
  }
  .brand { font-weight: 600; font-size: 17px; }
  .who { display: flex; align-items: center; font-size: 13px; color: var(--ink2); }
  .who a { color: var(--ink); text-decoration: none; margin-left: 12px; }
  .who .logoutform { display: inline; margin: 0; }
  .logoutbtn { font: inherit; font-family: var(--mono); font-size: 12px; color: var(--mut);
    background: none; border: none; padding: 2px 2px; margin-left: 14px; cursor: pointer; }
  .logoutbtn:hover { color: var(--ink); }
  .logoutbtn::before { content: "[ "; opacity: 0; transition: opacity .18s; }
  .logoutbtn::after { content: " ]"; opacity: 0; transition: opacity .18s; }
  .logoutbtn:hover::before, .logoutbtn:hover::after { opacity: 1; }
  .rolebadge { display: inline-block; padding: 3px 10px; margin: 0 10px 0 4px; border-radius: 999px;
    background: rgba(11,11,13,.85); color: #fff; font-family: var(--mono); font-size: 11px; vertical-align: middle; }
  .roleswitch { font-family: var(--mono); font-size: 11px; padding: 3px 8px; margin: 0 10px 0 4px;
    border-radius: 999px; background: rgba(11,11,13,.85); color: #fff;
    border: 1px solid transparent; cursor: pointer; vertical-align: middle; appearance: none; -webkit-appearance: none; }
  .roleswitch:focus { outline: none; box-shadow: var(--ring); }
  .roleswitch.preview { background: var(--warn-bg); color: var(--warn-tx); border-color: rgba(138,90,11,.25); }
  /* навигация по разделам живёт в шапке (по центру), а не отдельной строкой */
  .topnav { flex: 1 1 auto; display: flex; justify-content: center; min-width: 0; overflow-x: auto; }
  .topnav::-webkit-scrollbar { display: none; }
  .topnav { scrollbar-width: none; }
  /* overflow-x:auto делает и overflow-y=auto -> режет низ активной вкладки
     (скругление + тень). Пунктов мало, скролл не нужен -> visible (иначе
     закругление обрезается снизу, находка user 2026-07-14). */
  header .topnav { overflow: visible; }
  /* Узкий экран (ручной прогон по ролям, этап 5, 28.08.2026). Шапка - одна
     нерушимая строка из трёх колонок, и на телефоне (390 px) она разъезжалась:
     боковые колонки сжимались в ноль, а полоса разделов, которой в шапке
     запрещено и переноситься, и прокручиваться (overflow: visible выше - чтобы
     не резать выпадающее), вылезала за ОБА края. «Заявки» уходили за левый край
     экрана, и попасть в них было нельзя вообще. Ставим шапку в две строки:
     логотип и вошедший сверху, разделы - отдельной прокручиваемой строкой. */
  @media (max-width: 760px) {
    header { flex-wrap: wrap; row-gap: 8px; }
    header > .hcol { flex: 0 1 auto; }
    header > .who { flex: 1 1 auto; }
    header .topnav { order: 3; flex: 1 0 100%; overflow-x: auto; justify-content: flex-start; }
    header .topnav .tab { flex: none; }
  }
  header .tabs { margin-bottom: 0; }
  body.hubpage header { justify-content: flex-end; }
  /* Полоса подразделов (.subwrap) центрируется по СТРАНИЦЕ, а .topnav - только
     по остатку между логотипом и блоком .who, поэтому пилюли разъезжались тем
     сильнее, чем длиннее имя вошедшего. Уравниваем боковые колонки шапки -
     тогда у обеих полос общая ось центра (owner 2026-08-24).
     Растягиваем именно КОЛОНКУ (.who и распорку у логотипа), а не саму ссылку
     логотипа: иначе её кликабельная зона расползлась бы на треть шапки. */
  header > .hcol { flex: 1 1 0; display: flex; align-items: center; min-width: 0; }
  header > .who { flex: 1 1 0; justify-content: flex-end; min-width: 0; }
  /* длинное ФИО не должно раздвигать правую колонку: иначе оси центра у
     навигации и полосы подразделов снова разъедутся */
  .who .whoname { overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    min-width: 0; }

  /* ---------- колокол уведомлений ---------- */
  .bell { position: relative; display: inline-block; margin-right: 6px; vertical-align: middle; }
  .bellbtn { position: relative; background: none; border: none; padding: 6px; cursor: pointer;
    color: var(--mut); line-height: 0; border-radius: 999px; transition: color .15s, background .15s; }
  .bellbtn:hover { color: var(--ink); background: rgba(11,11,13,.06); }
  .bellbtn svg { width: 21px; height: 21px; display: block; }
  .bell-badge { position: absolute; top: 0; right: 0; min-width: 16px; height: 16px; padding: 0 4px;
    border-radius: 9px; background: #c93a30; color: #fff; font-size: 10px; font-weight: 700;
    line-height: 16px; text-align: center; box-sizing: border-box; }
  .bell-badge[hidden] { display: none; }
  .bell-menu { position: absolute; top: 40px; right: 0; width: 348px; max-width: 86vw;
    /* непрозрачный фон (owner 2026-07-23): панель уведомлений сплошная, не
       просвечивает содержимое под ней */
    background: var(--panel, #fff);
    border: 1px solid var(--bd); border-radius: 14px;
    box-shadow: var(--shadow-float), inset 0 1px 0 rgba(255,255,255,.9);
    z-index: 60; overflow: hidden; }
  .bell-menu[hidden] { display: none; }
  .bell-head { display: flex; align-items: center; justify-content: space-between; padding: 11px 14px;
    border-bottom: 1px solid var(--bd); font-size: 13px; font-weight: 600; color: var(--ink); }
  .bell-readall { font: inherit; font-family: var(--mono); font-size: 11px; color: var(--mut);
    background: none; border: none; cursor: pointer; padding: 0; }
  .bell-readall:hover { color: var(--ink); }
  /* Тумблер звука уведомлений (владелец 27.08.2026: «иконка перечёркнутого
     динамика сверху в окошке»). Одна иконка на два состояния: включён - видны
     волны (.bm-on), выключен - перечёркнут (.bm-off). */
  .bell-headr { display: inline-flex; align-items: center; gap: 10px; }
  .bell-mute { display: inline-flex; background: none; border: none; padding: 0;
    cursor: pointer; color: var(--mut); line-height: 0; }
  .bell-mute svg { width: 16px; height: 16px; }
  .bell-mute:hover { color: var(--ink); }
  .bell-mute .bm-off { display: none; }
  .bell-mute.muted { color: var(--bad-tx); }
  .bell-mute.muted .bm-on { display: none; }
  .bell-mute.muted .bm-off { display: inline; }

  /* ---------- всплывающие уведомления (справа внизу) ----------
     Владелец 27.08.2026: «уведомления должны приходить справа внизу в виде
     окошка со звуком». Полоса сдвинута выше нижней кромки на высоту .savetoast
     (подтверждения сохранения) - иначе два вида всплывашек накладывались бы. */
  .ntoasts { position: fixed; right: 20px; bottom: 68px; z-index: 99;
    display: flex; flex-direction: column-reverse; gap: 10px;
    width: 330px; max-width: calc(100vw - 40px); pointer-events: none; }
  .ntoast { pointer-events: auto; background: var(--panel, #fff);
    border: 1px solid var(--bd); border-left: 3px solid var(--bad-tx);
    border-radius: 12px; box-shadow: var(--shadow-float);
    padding: 11px 12px 11px 13px; display: flex; gap: 10px; align-items: flex-start;
    opacity: 0; transform: translateY(8px);
    transition: opacity .18s ease, transform .18s ease; }
  .ntoast.show { opacity: 1; transform: translateY(0); }
  .nt-main { min-width: 0; flex: 1; }
  .nt-title { font-size: 13px; font-weight: 600; color: var(--ink); }
  .nt-body { font-size: 12.5px; color: var(--ink2); margin-top: 3px;
    overflow-wrap: anywhere; }
  .nt-go { flex: 0 0 auto; color: var(--mut); text-decoration: none;
    font-size: 12px; align-self: center; }
  .nt-go:hover { color: var(--ink); }
  .nt-x { flex: 0 0 auto; background: none; border: none; cursor: pointer;
    color: var(--ghost); font-size: 15px; line-height: 1; padding: 0 2px; }
  .nt-x:hover { color: var(--ink); }
  @media (prefers-reduced-motion: reduce) {
    .ntoast { transition: none; }
  }
  .bell-list { max-height: 380px; overflow-y: auto; }
  /* owner 2026-08-22: пункт = контент + серая стрелка-редирект справа; ховер -
     фирменная подсветка (как строки карточек/таблиц), transition как у .clilink */
  /* owner 2026-08-24: пункт НЕ кнопка - кликабельны только имена и стрелка,
     поэтому ни курсора-руки, ни ховер-подсветки всей строки */
  .bell-item { display: flex; align-items: center; gap: 8px; padding: 10px 14px;
    border-bottom: 1px solid rgba(11,11,13,.05);
    text-decoration: none; color: var(--ink);
    transition: background-color .16s ease; }
  .bell-item .bi-main { flex: 1; min-width: 0; }
  .bell-item:last-child { border-bottom: none; }
  /* строка целиком не подсвечивается: она не кликабельна. Подсветка нажимаемых
     мест (имена, стрелка) описана ниже - .bi-link:hover и .bell-go:hover. */
  .bell-item.unread { background: rgba(59,63,158,.07); }

  /* apple-аудит §7/§12: поповеры материализуются от источника (scale+fade),
     transform-origin ставит positionPanel по направлению открытия */
  .selx-menu, .datex-cal, .ddmenu:not([hidden]), .calpop:not([hidden]),
  .staffpick:not([hidden]), .react-pop:not([hidden]), .mentionpop:not([hidden]),
  .bell-menu:not([hidden]), .rcal:not([hidden]) {
    animation: popin .13s cubic-bezier(.2,.8,.3,1); }
  @keyframes popin { from { opacity: 0; transform: scale(.97); } to { opacity: 1; transform: none; } }
  /* мини-карточка при наведении на ФИО (owner 2026-08-24): визитка без клика.
     z-index выше колокола (60), но НИЖЕ модалок и оверлея загрузки - подсказка
     не должна перекрывать то, что блокирует экран. */
  .minicard { position: fixed; z-index: 150; cursor: pointer;
    width: 268px; max-width: calc(100vw - 16px);
    padding: 12px 14px; border-radius: 14px; background: var(--panel, #fff);
    border: 1px solid var(--bd); box-shadow: 0 18px 44px -14px rgba(11,11,13,.4);
    font-size: 12.5px; color: var(--ink); animation: popin .13s cubic-bezier(.2,.8,.3,1); }
  .minicard[hidden] { display: none; }
  .mc-head { display: flex; align-items: center; gap: 7px; margin-bottom: 7px; }
  .mc-name { font-size: 13.5px; font-weight: 650; letter-spacing: -.01em; }
  .mc-chip { font-size: 10.5px; padding: 1px 7px; border-radius: 999px;
    background: rgba(11,11,13,.06); color: var(--mut); }
  .mc-row { display: flex; gap: 8px; padding: 2px 0; }
  .mc-k { flex: 0 0 104px; color: var(--ghost); white-space: nowrap; }
  .mc-v { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .mc-note { color: var(--mut); }
  .mc-foot { margin-top: 8px; padding-top: 7px; border-top: 1px solid var(--bd);
    font-family: var(--mono); font-size: 10px; color: var(--ghost); letter-spacing: .03em; }
  /* участники события в колоколе, когда их имён нет в тексте уведомления */
  .bi-who { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 3px; font-size: 12px; }
  .bi-sep { color: var(--ghost); }
  /* сенсорные экраны: наведения нет, подсказка только мешала бы */
  @media (hover: none) { .minicard { display: none !important; } }
  /* страница «Все уведомления» (owner 2026-08-24): та же строка, что в
     колоколе, но во всю ширину раздела и с догрузкой */
  .bell-foot { border-top: 1px solid var(--bd); padding: 9px 14px; text-align: center; }
  .bell-foot a { font-family: var(--mono); font-size: 11px; color: var(--mut);
    text-decoration: none; }
  .bell-foot a:hover { color: var(--ink); }
  .nhist-wrap { padding: 4px 0; border-radius: var(--r-card);
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.65);
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.9);
    overflow: hidden; }
  .nhist-list .bell-item { padding: 12px 18px; }
  .nhist-more { display: flex; justify-content: center; padding: 12px; }
  /* серая кнопка-стрелка: редирект на тему уведомления */
  .bell-go { display: inline-flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; flex-shrink: 0; border-radius: 8px;
    background: rgba(11,11,13,.05); color: var(--mut);
    transition: background-color .15s ease, color .15s ease, transform .15s ease; }
  .bell-go svg { width: 14px; height: 14px; }
  .bell-go:hover { background: rgba(11,11,13,.12); color: var(--ink);
    transform: translateX(1px); }
  /* кликабельные фрагменты текста уведомления (ФИО/лид) - пунктир, как
     ссылки-сущности по всему софту */
  .bell-item .bi-link { color: var(--ink); cursor: pointer; text-decoration: none;
    border-bottom: 1px dashed var(--bd2); transition: border-color .15s ease, color .15s ease; }
  .bell-item .bi-link:hover { color: #14567d; border-bottom-color: currentColor; }
  .bell-item .bi-title { font-size: 13px; font-weight: 600; }
  .bell-item .bi-body { font-size: 12px; color: var(--ink2); margin-top: 2px; white-space: normal; }
  .bell-item .bi-time { font-family: var(--mono); font-size: 10.5px; color: var(--ghost); margin-top: 3px; }
  .bell-item.newlead .bi-title { color: var(--warn-tx); }
  .bell-empty { padding: 22px 14px; text-align: center; color: var(--ghost); font-size: 13px; }
  .bell-empty[hidden] { display: none; }
  tr.flash > td { animation: flashrow 1.6s ease; }
  @keyframes flashrow { 0% { background-color: rgba(233,225,180,.6); } 100% { background-color: rgba(233,225,180,0); } }

  /* ---------- каркас страницы ---------- */
  .wrap { padding: 16px; }
  .tabs { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; margin-bottom: 14px; padding: 5px;
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.65); border-radius: 21px;
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.9); }
  .tab { padding: 7px 16px; border: none; border-radius: 999px; background: transparent;
    font-size: 13px; color: var(--ink2); text-decoration: none; display: inline-block;
    align-self: center; line-height: 1.3; transition: background .15s, color .15s; }
  a.tab { cursor: pointer; }
  a.tab:hover { background: rgba(11,11,13,.06); color: var(--ink); }
  /* apple-аудит §12: у мелких элементов лёгкие тени (тяжёлые - у больших) */
  .tab.act { background: var(--ink); color: #fff; font-weight: 500; box-shadow: 0 2px 6px -2px rgba(11,11,13,.3); }
  .tab.off { color: var(--ghost); }
  .tab.off::after { content: "скоро"; font-family: var(--mono); font-size: 9px; color: var(--ghost);
    margin-left: 6px; vertical-align: super; letter-spacing: .04em; }

  /* выпадашку у «Заявок» убрали (решение user 2026-07-14) - подразделы живут
     только в полосе под шапкой; пункт «Заявки» - обычная вкладка-ссылка */
  /* полоса подразделов под шапкой (вариант B), по центру - ровно под навигацией */
  .subwrap { padding: 14px 16px 0; text-align: center; }
  .subwrap .tabs { margin-bottom: 0; }
  .controls { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 14px; }
  .seg { display: inline-flex; gap: 2px; padding: 4px;
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.65); border-radius: 999px; font-size: 13px;
    box-shadow: inset 0 1px 0 rgba(255,255,255,.9), 0 1px 2px rgba(11,11,13,.04); }
  .seg a { padding: 5px 14px; border-radius: 999px; color: var(--ink2); text-decoration: none; transition: background .15s, color .15s; }
  .seg a:hover { color: var(--ink); }
  .seg a.on { background: var(--ink); color: #fff; font-weight: 500; }
  .filters { display: flex; gap: 8px; flex-wrap: wrap; }
  .fsel { font-family: inherit; font-size: 13px; padding: 7px 12px;
    border: 1px solid rgba(255,255,255,.65); border-radius: var(--r-ctl);
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    color: var(--ink); cursor: pointer;
    box-shadow: inset 0 1px 0 rgba(255,255,255,.9), 0 1px 2px rgba(11,11,13,.04); }
  .fsel:focus { outline: none; box-shadow: var(--ring); }
  .searchbar { margin-bottom: 14px; }
  .fsearch { min-width: 340px; max-width: 100%; cursor: text; }
  .fsearch::placeholder { color: var(--ghost); }

  /* ---------- таблица (стеклянная панель) ---------- */
  /* НЕ ставить backdrop-filter/transform/filter на .tablewrap: это делает его
     containing block для position:fixed, и плавающие .ddmenu (их JS позиционирует
     в координатах вьюпорта) слетают. Стекло даём translucent-фоном без blur. */
  .tablewrap { overflow: auto; max-height: calc(100vh - 210px);
    background: linear-gradient(170deg, rgba(255,255,255,.92), rgba(250,250,253,.84));
    border: 1px solid rgba(255,255,255,.7); border-radius: var(--r-card);
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.95); cursor: grab; }
  .tablewrap.grabbing { cursor: grabbing; }
  table { border-collapse: collapse; width: 100%; font-size: 13px; white-space: nowrap; }
  th, td { padding: 9px 12px; border-bottom: 1px solid rgba(11,11,13,.06); text-align: left; vertical-align: middle; }
  tbody tr[data-lead]:hover > td { background: rgba(11,11,13,.025); }
  th { color: var(--mut); font-weight: 500; }
  /* без backdrop-filter: th - containing block для fixed .fio-menu (ddmenu в
     шапке), иначе меню ФИО слетает. Липкая шапка остаётся читаемой за счёт
     почти непрозрачного фона. */
  thead th { position: sticky; top: 0; z-index: 20;
    background: rgba(246,246,249,.97);
    /* apple-аудит §12: край шапки не постоянная линия, а тень, проявляющаяся
       ТОЛЬКО когда контент реально ушёл под шапку (.is-scrolled ставит JS) */
    box-shadow: inset 0 -1px 0 rgba(11,11,13,0);
    transition: box-shadow .2s ease;
    font-family: var(--mono); font-size: 10.5px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .05em; }
  .tablewrap.is-scrolled thead th {
    box-shadow: inset 0 -1px 0 var(--bd), 0 6px 12px -8px rgba(11,11,13,.22); }
  /* ---------- телефон: таблица заявок как карточки ----------
     Рабочая сетка «Заявок» - 26 колонок. На 390 px она остаётся таблицей только
     формально: человек листает вбок и теряет, о ком строка. Поэтому строка
     становится карточкой «подпись - значение»; подписи проставляет app.js по
     ШАПКЕ таблицы (колонки условные - «Сумма» видна не всем, - и нумерация в
     CSS разъехалась бы). В свёрнутом виде показываем главное, остальное - по
     кнопке «Ещё»: карточка из 26 строк ничем не лучше таблицы из 26 колонок. */
  @media (max-width: 760px) {
    .tablewrap { max-height: none; overflow: visible; cursor: auto;
      background: transparent; border: 0; box-shadow: none; }
    .tablewrap table { display: block; white-space: normal; font-size: 14px; }
    .tablewrap thead { display: none; }
    .tablewrap tbody { display: block; }
    /* строка - колонка из ячеек: только так работает order у полей ниже */
    .tablewrap tbody tr { display: flex; flex-direction: column;
      margin: 0 0 10px; padding: 4px 14px;
      background: var(--panel, #fff); border: 1px solid var(--bd);
      border-radius: var(--r-card); box-shadow: var(--shadow-panel); }
    .tablewrap tbody tr.mob-wide { padding: 0; }
    .tablewrap tbody tr.mob-wide > td { display: block; }
    /* ячейка - строка «подпись - значение». ФЛЕКС, а не грид: в ячейке бывает
       несколько элементов (кнопка чата и кнопка «поделиться»), и в гриде каждый
       следующий уезжал бы на свою строку. */
    .tablewrap tbody td { display: flex; align-items: center; gap: 10px;
      flex-wrap: wrap; padding: 9px 0;
      border-bottom: 1px solid var(--line2, rgba(11,11,13,.06)); }
    .tablewrap tbody td:last-of-type { border-bottom: 0; }
    .tablewrap tbody td::before { content: attr(data-label);
      flex: 0 0 108px; font-family: var(--mono); font-size: 10.5px;
      letter-spacing: .05em; text-transform: uppercase; color: var(--mut); }
    /* служебная колонка без подписи - без пустого отступа слева */
    .tablewrap tbody td[data-label=""]::before { content: none; }
    /* Сначала - кто это и что с ним, потом остальное: в таблице порядок колонок
       выбирали под широкий экран, на телефоне он читается сверху вниз. */
    .tablewrap tbody td[data-label="ФИО"] { order: -3; }
    .tablewrap tbody td[data-label="Артист"] { order: -2; }
    .tablewrap tbody td[data-label="Статус"],
    .tablewrap tbody td[data-label="Услуга"] { order: -1; }
    .mob-more-cell { order: 99; }
    /* второстепенное - под кнопкой «Ещё» */
    .tablewrap tbody tr:not(.mob-open) .mob-extra { display: none; }
    .mob-more-cell { display: flex !important; padding: 8px 0 10px !important;
      border-bottom: 0 !important; }
    .mob-more { font: inherit; font-size: 12.5px; color: var(--ink2);
      background: transparent; border: 1px solid var(--bd);
      border-radius: 999px; padding: 6px 14px; cursor: pointer; }
    .mob-more:hover { background: rgba(11,11,13,.05); }
  }
  /* Плитки KPI на телефоне - по две в ряд. Столбиком они съедали весь первый
     экран, и до списка клиентов приходилось листать мимо четырёх цифр. */
  @media (max-width: 760px) {
    /* селектор с родителем НАМЕРЕННО: базовое `.kpi { flex: 1 1 180px }` стоит
       ниже по файлу, и при равной специфичности выигрывало бы оно. */
    /* 7px = половина зазора .kpi-row (14px): базовое правило стоит ниже по
       файлу и переживает переопределение, поэтому считаем от НЕГО, а не от
       своего. С запасом в 4px две плитки не влезали и вставали столбиком. */
    .kpi-row > .kpi { flex: 1 1 calc(50% - 7px); padding: 11px 13px; min-width: 0; }
    .kpi-row > .kpi .kpi-v { font-size: 21px; }
    .kpi-row > .kpi .kpi-l { font-size: 9.5px; }
    .kpi-row > .kpi .kpi-s { font-size: 11px; }
  }

  /* Телефон, «Сообщения»: список и переписка друг под другом означают, что до
     чата надо пролистать весь список. Открыт диалог - показываем ТОЛЬКО его,
     со ссылкой назад; список без открытого диалога занимает экран целиком. */
  .conv-back { display: none; }
  @media (max-width: 760px) {
    .conv-back { display: block; margin: 0 0 10px; padding: 9px 14px;
      background: var(--panel, #fff); border: 1px solid var(--bd);
      border-radius: 999px; color: var(--ink2); text-decoration: none;
      font-size: 13.5px; width: max-content; }
    .conv-back:hover { color: var(--ink); }
    .msgr:has(.conv-back) .conv-col { display: none; }
    /* запас для браузеров без :has() - класс ставит app.js */
    .msgr.has-open .conv-col { display: none; }
  }

  /* на широком экране кнопка «Ещё» не нужна: там видно всё */
  @media (min-width: 761px) { .mob-more-cell { display: none; } }

  .mut { color: var(--ghost); }
  /* Пустая панель раздела («Пока нет лидов»). Скоуп .tablewrap > .empty, чтобы
     большой паддинг + «[ ]» не протекали на .datex-btn.empty (кнопка даты без
     значения) и .datex-day.empty (пустые ячейки календаря) - они переиспользуют
     имя .empty, но должны оставаться компактными. */
  .tablewrap > .empty { padding: 56px 40px; text-align: center; color: var(--mut); font-size: 14px; }
  .tablewrap > .empty::before { content: "[ ]"; display: block; font-family: var(--mono); font-size: 26px;
    color: var(--ghost); margin-bottom: 10px; letter-spacing: .1em; }
  a.lnk { color: var(--ink); text-decoration: underline; text-decoration-color: rgba(11,11,13,.28);
    text-underline-offset: 2px; }
  a.lnk:hover { text-decoration-color: var(--ink); }

  /* ---------- бейджи и чипы ---------- */
  /* apple-аудит §14: «нет материала/ссылки» отличимо ФОРМОЙ (пунктирный контур,
     полупрозрачность), не только серым против зелёного */
  .b { display: inline-block; min-width: 21px; text-align: center; padding: 2px 6px; border-radius: 7px;
    font-size: 11px; font-weight: 500; margin-right: 2px; background: rgba(11,11,13,.03);
    border: 1px dashed var(--bd2); color: var(--ghost); opacity: .75; box-sizing: border-box; }
  .b.y { background: var(--ok-bg); color: var(--ok-tx); border: 1px solid transparent; opacity: 1; }
  .b.w { background: var(--warn-bg); color: var(--warn-tx); border: 1px solid transparent; opacity: 1; }
  a.b { text-decoration: none; cursor: pointer; }
  a.b.y:hover { filter: brightness(0.95); }
  a.b:not([href]) { cursor: default; }
  .icn { display: inline-block; margin-right: 4px; color: #cdd0d6; vertical-align: middle; line-height: 0; }
  .icn:last-child { margin-right: 0; }
  .icn.y { color: #1d9e75; }
  a.icn { text-decoration: none; }
  a.icn.y:hover { filter: brightness(0.94); }
  .icn svg { width: 20px; height: 20px; display: block; }
  .pay { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 500; white-space: nowrap; }
  .pay.yes { background: var(--ok-bg); color: var(--ok-tx); }
  .pay.wait { background: rgba(37,99,235,.12); color: #1d4ed8; }  /* ожидает оплаты (счёт выставлен) */
  .pay.no { background: var(--warn-bg); color: var(--warn-tx); }
  .rate { display: inline-block; padding: 1px 8px; border-radius: 7px; font-family: var(--mono); font-size: 12px; font-weight: 600; }
  .rate.hi { background: var(--ok-bg); color: var(--ok-tx); }
  .rate.mid { background: var(--warn-bg); color: var(--warn-tx); }
  .rate.lo { background: var(--bad-bg); color: var(--bad-tx); }
  .cst { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 500; white-space: nowrap; text-transform: none; }
  /* ссылка-иконка «Открыть договор» в группе «Договор» модалки «Действия» */
  .contract-open { display: inline-flex; align-items: center; gap: 6px; margin-top: 6px;
    padding: 5px 11px; border: 1px solid var(--bd2); border-radius: 10px; font-size: 12px;
    color: var(--ink); text-decoration: none; background: rgba(11,11,13,.02); }
  .contract-open:hover { background: rgba(11,11,13,.06); }
  .contract-open svg { flex: none; }
  /* закреплённый чат «Договора» вверху списка «Клиенты» + список договоров */
  .conv-pinned { border-bottom: 1px solid var(--bd); }
  .ci-list { display: flex; flex-direction: column; padding: 4px 2px; }
  .ci-row { display: flex; gap: 11px; padding: 12px 6px; border-bottom: 1px solid var(--bd); }
  .ci-row:last-child { border-bottom: none; }
  .ci-main { flex: 1; min-width: 0; }
  .ci-top { display: flex; justify-content: space-between; gap: 8px; align-items: baseline; }
  .ci-name { font-weight: 600; font-size: 13.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .ci-sub { font-size: 12.5px; color: var(--ink2); margin: 2px 0 8px; }
  .ci-actions { display: flex; gap: 6px; flex-wrap: wrap; }
  .cst-waiting_artist { background: var(--warn-bg); color: var(--warn-tx); }
  .cst-waiting_inflton { background: var(--info-bg); color: var(--info-tx); }
  .cst-signed { background: var(--ok-bg); color: var(--ok-tx); }
  /* Папка «Отчёты»: срок отчёта по кампании. Просроченный - тревожным цветом,
     ждущий - нейтральным: «ждёт» это нормальный ход дел, и красить его в
     тревогу значит обесценить настоящую тревогу. */
  .cst-overdue { background: var(--bad-bg); color: var(--bad-tx); }
  .cst-waiting { background: var(--warn-bg); color: var(--warn-tx); }
  .fmt { display: inline-block; padding: 2px 9px; border-radius: 7px; font-size: 11px; font-weight: 500;
    background: var(--info-bg); color: var(--info-tx); }
  .fmt.single { background: rgba(11,11,13,.06); color: var(--mut); }
  .mat { display: inline-block; padding: 2px 8px; border-radius: 7px; font-size: 11px; font-weight: 600;
    background: var(--bad-bg); color: var(--bad-tx); }
  .ab { display: inline-block; padding: 2px 8px; border-radius: 7px; font-size: 11px;
    background: rgba(11,11,13,.06); color: var(--ink2); margin: 1px 4px 1px 0; }
  .ab.ab-none { background: var(--warn-bg); color: var(--warn-tx); }
  .ab[hidden] { display: none; }
  .fio-client[hidden] { display: none; }
  .svc { display: inline-block; padding: 2px 9px; border-radius: 7px; font-size: 11px; font-weight: 500;
    background: var(--info-bg); color: var(--info-tx); }
  .svc.mastering { background: rgba(11,11,13,.06); color: var(--mut); }
  .svc.urgent { background: var(--bad-bg); color: var(--bad-tx); }
  .src { display: inline-block; padding: 2px 9px; border-radius: 7px; font-size: 11px; font-weight: 500;
    background: #e3eef7; color: #14567d; }
  /* Значок канала вместо слова (владелец 31.08.2026). Цвета фирменные - канал
     узнают по цвету раньше, чем по форме; размер как у текстового бейджа,
     чтобы строки таблиц не «прыгали» при смешанных источниках. */
  .srci { display: inline-flex; align-items: center; justify-content: center;
    width: 22px; height: 22px; border-radius: 7px; vertical-align: middle; }
  .srci svg { width: 14px; height: 14px; display: block; }
  .srci-tg { background: #e3f2fd; color: #229ed9; }
  .srci-vk { background: #e5efff; color: #0077ff; }
  .srci-site { background: rgba(11,11,13,.06); color: var(--ink2); }
  /* Тумблер каналов в шапке чата: у склеенного клиента переписка идёт и в
     Telegram, и во ВКонтакте, и это ДВЕ разные ленты. Владелец 31.08.2026
     просил переключать их логотипами, а не словами - те же значки, что в
     колонке «Источник», так что канал читается одинаково по всей СРМ.
     Неактивный приглушён, а не спрятан: видно, что второй канал существует. */
  .chtog { display: inline-flex; gap: 2px; padding: 2px; border-radius: 9px;
    background: rgba(11,11,13,.05); vertical-align: middle; }
  .chtog a { display: inline-flex; position: relative; border-radius: 7px;
    text-decoration: none; opacity: .45; filter: grayscale(1);
    transition: opacity .12s ease, filter .12s ease; }
  .chtog a:hover { opacity: .8; filter: grayscale(.3); }
  .chtog a.on { opacity: 1; filter: none; box-shadow: 0 1px 3px rgba(11,11,13,.16); }
  .chtog a:focus-visible { outline: 2px solid var(--ink); outline-offset: 1px; }
  /* Точка непрочитанного на СКРЫТОМ канале - иначе сообщение, пришедшее во
     вторую ленту, ничем бы о себе не заявило. */
  .chtog .chdot { position: absolute; top: -2px; right: -2px; width: 8px; height: 8px;
    border-radius: 50%; background: var(--bad-tx); border: 1.5px solid #fff; }
  /* Несколько каналов подряд в колонке «Источник». Зазор маленький: значки
     читаются как ОДНА характеристика клиента («он есть тут и тут»), а не как
     два независимых поля. */
  .srcs { display: inline-flex; gap: 3px; align-items: center; }
  /* Вложение в пузыре переписки: значок документа с именем файла. Владелец
     01.09.2026: «приходит ссылкой, надо - иконкой документа». Ссылка на файл
     ВКонтакте живёт не вечно, поэтому имя рядом обязательно: по нему видно,
     что приходило, даже когда ссылка протухла. Файлы из Telegram приходят без
     ссылки вовсе (медиа не храним) - такой чип приглушён и не кликается. */
  .filechip { display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
    margin: 4px 0 0; padding: 5px 10px 5px 8px; border-radius: 10px;
    background: rgba(11,11,13,.05); font-size: 12.5px; }
  .filechip svg { width: 15px; height: 15px; flex: none; color: var(--ink2); }
  .filechip a { color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--bd2);
    overflow-wrap: anywhere; }
  .filechip a:hover { border-bottom-color: var(--ink); }
  .filechip.noload { color: var(--mut); }
  .filechip.noload svg { color: var(--ghost); }
  /* Исходящий пузырь чёрный, и серый чип на нём давал 3.6:1 - имя файла,
     которое менеджеру надо ПРОЧИТАТЬ, читалось хуже всего остального в ленте.
     На тёмном фоне чип светлый. */
  .bub.out .filechip { background: rgba(255,255,255,.14); color: rgba(255,255,255,.92); }
  .bub.out .filechip svg { color: rgba(255,255,255,.66); }
  .bub.out .filechip a { color: #fff; border-bottom-color: rgba(255,255,255,.4); }
  .bub.out .filechip a:hover { border-bottom-color: #fff; }
  .bub.out .filechip.noload { color: rgba(255,255,255,.8); }
  /* Промокод в таблице акций: щелчок копирует. Моноширинный - код диктуют
     по телефону и путают «0» с «O». */
  /* Три ссылки под метку. Кнопка, а не текст ссылки: полный адрес занял бы
     полстроки таблицы, а нужен он не для чтения, а для вставки в рекламный
     кабинет. Сам адрес - в подсказке при наведении. */
  .reflinks { display: flex; flex-wrap: wrap; gap: 6px; }
  .reflink { font: inherit; font-size: 12px; padding: 4px 10px; cursor: pointer;
    border: 1px solid var(--bd2); border-radius: 8px; background: #fff;
    color: var(--ink2); }
  .reflink:hover { background: rgba(11,11,13,.05); color: var(--ink); }
  .reflink.copied { border-color: var(--ink); color: var(--ink); }
  .promocode { font: inherit; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 12.5px; letter-spacing: .04em; padding: 4px 9px; cursor: pointer;
    border: 1px dashed var(--bd2); border-radius: 8px; background: transparent;
    color: var(--ink); }
  .promocode:hover { border-style: solid; background: rgba(11,11,13,.04); }
  .promocode.copied { border-style: solid; border-color: var(--ok-bd, var(--ink));
    background: rgba(11,11,13,.06); }
  /* поле-галочка в строке формы: подпись сверху, как у соседних полей */
  .chk-f { flex-direction: row; align-items: center; gap: 8px; flex-wrap: wrap; }
  .chk-f > span:first-child { flex: 0 0 100%; }
  .crossflag { display: inline-block; padding: 2px 8px; border-radius: 7px; font-size: 11px; font-weight: 600;
    background: var(--ok-bg); color: var(--ok-tx); }

  /* ---------- раздел «Клиенты» ---------- */
  /* чип состояния клиента (бан / доступ / заблокировал бота) + реф. отметка */
  .uchip { display: inline-block; padding: 1px 7px; border-radius: 7px; font-size: 10.5px;
    font-weight: 600; line-height: 16px; vertical-align: 1px; white-space: nowrap; }
  .uchip.bad { background: var(--bad-bg); color: var(--bad-tx); }
  .uchip.warn { background: var(--warn-bg); color: var(--warn-tx); }
  .uchip.gray { background: rgba(11,11,13,.06); color: var(--mut); }
  .uchip.ref { background: var(--ok-bg); color: var(--ok-tx); }
  /* строка поиска идёт СРАЗУ под KPI-плашками - без отступа наезжает на них
     (.kpi-row задаёт только margin-top, под Селектор) */
  .kpi-row + .searchbar { margin-top: 16px; }
  /* сортируемый заголовок колонки (ссылка) + кликабельная строка клиента */
  .thsort { color: inherit; text-decoration: none; border-bottom: 1px dashed transparent; }
  .thsort:hover { border-bottom-color: currentColor; }
  .thsort.act { color: #14567d; font-weight: 700; }
  tr[data-client-card] { cursor: pointer; }
  tr[data-client-card]:hover td { background: #f3f7fb; }
  .clientstbl td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
  /* заголовок раздела (h1) - как org-h2, но уровнем выше */
  .page-h1 { font-size: 22px; font-weight: 700; letter-spacing: -.015em; margin: 4px 2px 14px; }

  /* ---------- карточка клиента (редизайн owner 2026-08-20) ----------
     Секции с волосяными разделителями; раскрывашки = кликабельная ВСЯ строка
     с маленьким шевроном справа (поворот), панель - мягкая подложка --bg2 без
     рамок-лесенок; строки заявок/релизов - крупные, с hover-подсветкой. */
  /* overflow-y: базовый .actmodal-card (НИЖЕ по файлу - его hidden побеждал бы
     при равной специфичности) режет 82vh - длинные списки релизов/заявок должны
     скроллиться внутри карточки (аудит MED); двойной класс поднимает вес */
  .cpop-card { width: 520px; max-width: calc(100vw - 32px); padding: 0 0 16px; }
  .actmodal-card.cpop-card { overflow-y: auto; -webkit-overflow-scrolling: touch; }
  .cpop-head { display: flex; align-items: center; gap: 14px; padding: 18px 20px 12px; }
  .cpop-name { font-weight: 700; font-size: 16px; display: flex; align-items: center; flex-wrap: wrap; gap: 4px; }
  .cpop-sub { font-size: 12.5px; color: var(--mut); margin-top: 2px; }
  .cpop-sec { padding: 10px 20px 4px; font-size: 13px; display: flex; flex-direction: column; gap: 2px; }
  .cpop-sec + .cpop-sec { border-top: 1px solid var(--bd); margin-top: 8px; padding-top: 12px; }
  .cpop-kv { display: flex; gap: 8px; padding: 2px 0; align-items: baseline; }
  .cpop-kv .mut { color: var(--mut); }
  /* строка с дропдауном (менеджер): метка и дата «с ...» - ровно по центру
     относительно кнопки кастомного селекта */
  .cpop-kv-mid { align-items: center; }
  .cpop-kv .selx .selx-btn { max-width: 230px; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap; }
  /* раскрывашка: вся строка кликабельна */
  .cpop-row { display: flex; align-items: center; justify-content: space-between; gap: 10px;
    padding: 7px 10px; margin: 0 -10px; border-radius: 10px; cursor: pointer; user-select: none;
    transition: background .15s ease; }
  .cpop-row:hover { background: var(--bg2); }
  .cpop-row b { font-weight: 700; }
  .cpop-row .mut { color: var(--mut); }
  .cpop-chev { flex: 0 0 auto; width: 7px; height: 7px; border-right: 1.6px solid var(--ghost);
    border-bottom: 1.6px solid var(--ghost); transform: rotate(-45deg);
    transition: transform .18s ease, border-color .15s ease; }
  .cpop-row:hover .cpop-chev { border-color: var(--ink); }
  .cpop-row[aria-expanded="true"] .cpop-chev { transform: rotate(45deg); }
  /* панель раскрывашки: мягкая подложка, появление с фейдом */
  .cpop-pane { background: var(--bg2); border-radius: 12px; padding: 5px; margin: 2px -6px 8px; }
  .cpop-pane[hidden] { display: none; }
  .cpop-pane:not([hidden]) { animation: cpopin .16s ease; }
  @keyframes cpopin { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: none; } }
  .cpop-item { display: flex; align-items: center; justify-content: space-between; gap: 10px;
    padding: 8px 11px; border-radius: 9px; font-size: 13px;
    color: var(--ink); text-decoration: none; cursor: default;
    transition: background .12s ease, transform .12s ease; }
  .cpop-item:hover { background: rgba(255,255,255,.85); transform: translateX(2px); }
  a.cpop-item { cursor: pointer; }
  a.cpop-item:hover .cpop-item-t { color: #14567d; }
  .cpop-item-t { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
    white-space: nowrap; }
  .cpop-item .nolink { color: var(--ink2); flex: 1; min-width: 0; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap; }
  .cpop-item .pay, .cpop-item .dlg-st { flex: 0 0 auto; }
  /* вложенная панель заявок направления - чуть утоплена, без второй подложки */
  .cpop-pane .cpop-row { margin: 0; border-radius: 9px; padding: 7px 11px; }
  .cpop-pane .cpop-row:hover { background: rgba(255,255,255,.85); }
  .cpop-pane .cpop-pane { background: none; padding: 0 0 2px 8px; margin: 0; }
  /* дропдаун смены менеджера в карточке */
  .cpop-mgr-sel { font: inherit; font-size: 12.5px; padding: 3px 8px; border-radius: 8px;
    border: 1px solid var(--bd2); background: #fff; max-width: 210px; }
  .cpop-ref { display: flex; gap: 8px; align-items: center; cursor: pointer; padding: 2px 0; }
  .cpop-ref input[type="checkbox"] { accent-color: var(--ink); }
  /* ФИО-ссылка на карточку клиента в разделах заявок */
  /* owner 2026-08-22 п.7: ФИО-плашка как строки карточки (скрин «Выручка
     лейбла») - фон и шеврон появляются при наведении; отрицательные поля
     компенсируют padding, чтобы колонки таблиц не разъезжались; ширина
     шеврона зарезервирована (opacity, не display) - без дёрганья строки */
  .clilink { display: inline-flex; align-items: center; gap: 2px; cursor: pointer;
    padding: 3px 7px; margin: -3px -7px; border-radius: 8px;
    transition: background-color .16s ease; }
  .clilink::after { content: "›"; font-size: 12px; font-weight: 600; color: var(--mut);
    width: 9px; flex-shrink: 0; opacity: 0; transform: translateX(-3px);
    transition: opacity .16s ease, transform .16s ease; }
  .clilink:hover, .clilink:focus-visible { background: rgba(11,11,13,.06); }
  .clilink:hover::after, .clilink:focus-visible::after { opacity: 1; transform: translateX(0); }

  /* «Реклама»: ввод слева, воронки справа (owner 2026-08-20) + логотипы каналов */
  /* owner 2026-08-24 п.2: 4 РОВНЫХ прямоугольника - грид по рядам (ввод канала
     строго напротив его воронки, высоты ряда равны), отступ сверху больше */
  .ads-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px;
    align-items: stretch; margin-top: 22px; }
  .ads-grid .fin-card { height: 100%; box-sizing: border-box; margin: 0;
    display: flex; flex-direction: column; }
  .ads-grid .fin-card .funnel, .ads-grid .fin-card .adsform { flex: 1; }
  @media (max-width: 980px) { .ads-grid { grid-template-columns: 1fr; } }
  .adlogo { display: inline-flex; align-items: center; justify-content: center;
    width: 18px; height: 18px; border-radius: 5px; margin-right: 7px; vertical-align: -3px;
    font-size: 10px; font-weight: 800; color: #fff; letter-spacing: -.02em; }
  .adlogo.vk::before { content: "VK"; }
  .adlogo.vk { background: #07f; }
  .adlogo.yd::before { content: "Я"; font-size: 11px; }
  .adlogo.yd { background: #FC3F1D; }
  .surcharge { display: inline-block; padding: 2px 8px; border-radius: 7px; font-size: 11px; font-weight: 600;
    background: var(--ok-bg); color: var(--ok-tx); margin-left: 6px; }
  .surcharge[hidden] { display: none; }
  .ddl { display: inline-block; margin-left: 6px; padding: 2px 9px; border-radius: 999px;
    font-family: var(--mono); font-size: 10.5px; font-weight: 600; white-space: nowrap; }
  .ddl.warn { background: #f2dfa4; color: #7c5308; }
  .ddl.over { background: #f4c8c4; color: #8f2c24; }

  /* ---------- раздел «Сообщения» (мессенджер) ---------- */
  /* бейдж-счётчик «в очереди» рядом с пунктом навигации / кнопкой хаба */
  .navbadge { display: inline-block; min-width: 17px; padding: 0 5px; margin-left: 3px;
    border-radius: 999px; background: var(--bad-tx); color: #fff; font-family: var(--mono);
    font-size: 10.5px; font-weight: 600; line-height: 17px; text-align: center; vertical-align: middle; }
  /* цветовой код: КРАСНЫЙ - сообщения (по умолчанию), СИНИЙ (.b) - заявки/лиды
     (тот же синий, что у подсветки лида при переходе из чата). Цвет держим и
     на активной чёрной вкладке - код важнее инверсии. */
  /* счётчик в навигации носит класс b ради размера/скругления, но он НЕ бейдж
     материала: пунктирный контур и приглушение из .b здесь снимаем */
  .navbadge.b { background: #586eeb; border: 0; opacity: 1; }
  /* статус диалога: в очереди / открыт / закрыт (чип) */
  .dlg-st { display: inline-block; padding: 2px 9px; border-radius: 999px; font-size: 11px;
    font-weight: 500; white-space: nowrap; }
  .dlg-st.pending { background: var(--warn-bg); color: var(--warn-tx); }
  .dlg-st.open { background: var(--ok-bg); color: var(--ok-tx); }
  .dlg-st.closed { background: rgba(11,11,13,.06); color: var(--mut); }
  /* чипы «лид» и «ведёт» */
  .lead-chip { display: inline-block; padding: 2px 8px; border-radius: 7px; font-size: 11px;
    font-weight: 500; background: rgba(11,11,13,.05); color: var(--ink2); white-space: nowrap; }
  .mgr-chip { display: inline-block; padding: 2px 9px; border-radius: 999px; font-size: 11px;
    font-weight: 500; background: var(--info-bg); color: var(--info-tx); white-space: nowrap; }
  /* Длинная поясняющая подпись в шапке папки. nowrap у mgr-chip рассчитан на
     короткие метки («ведёт Дима») и на узком экране выпихивал такую строку за
     карточку - здесь перенос разрешён. */
  .mgr-chip.wrap { white-space: normal; }
  .cd-user { font-family: var(--mono); font-size: 11.5px; color: var(--mut); }

  /* две панели: список слева, диалог справа */
  .msgr { display: flex; gap: 14px; align-items: stretch;
    height: calc(100vh - 148px); min-height: 440px; }
  .conv-col, .conv-detail {
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid var(--bd); border-radius: var(--r-card);
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.9); overflow: hidden; }
  .conv-col { flex: 0 0 340px; display: flex; flex-direction: column; }
  .conv-detail { flex: 1; min-width: 0; display: flex; flex-direction: column; }

  /* фильтр статусов над списком */
  .conv-filter { display: flex; gap: 2px; padding: 8px; border-bottom: 1px solid var(--bd); }
  .conv-filter a { flex: 1; text-align: center; padding: 6px 4px; border-radius: 8px; font-size: 12px;
    color: var(--ink2); text-decoration: none; transition: background .15s, color .15s; }
  .conv-filter a:hover { background: rgba(11,11,13,.06); color: var(--ink); }
  .conv-filter a.on { background: var(--ink); color: #fff; font-weight: 500; }

  /* список диалогов */
  .conv-scroll { flex: 1; overflow-y: auto; }
  .conv { display: flex; gap: 10px; padding: 11px 12px; text-decoration: none; color: var(--ink);
    border-bottom: 1px solid var(--bd); position: relative; transition: background .12s; }
  .conv:hover { background: rgba(11,11,13,.04); }
  .conv.sel { background: rgba(11,11,13,.07); }
  .conv.sel::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--ink); }
  .av { flex: 0 0 auto; width: 38px; height: 38px; border-radius: 50%; display: inline-flex;
    align-items: center; justify-content: center; color: #fff; font-weight: 600; font-size: 13.5px;
    box-shadow: inset 0 1px 0 rgba(255,255,255,.25); }
  .av.lg { width: 48px; height: 48px; font-size: 18px; }
  .av.sm { width: 26px; height: 26px; font-size: 11px; }
  /* имя сотрудника с аватаром в таблице ФОТ (owner 2026-07-23) */
  .fot-name { display: inline-flex; align-items: center; gap: 8px; }
  .conv-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
  .conv-top { display: flex; justify-content: space-between; gap: 8px; align-items: baseline; }
  .conv-name { font-weight: 600; font-size: 13.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .conv-time { flex: 0 0 auto; font-family: var(--mono); font-size: 10.5px; color: var(--ghost); }
  .conv-sub { font-size: 12.5px; color: var(--ink2); margin: 1px 0 6px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .conv-chips { display: flex; flex-wrap: wrap; gap: 5px; align-items: center; }
  .conv.pend .conv-name::after { content: ""; display: inline-block; width: 7px; height: 7px;
    border-radius: 50%; background: var(--warn-tx); margin-left: 6px; vertical-align: middle; }
  /* у клиентских строк «в очереди» видно чипом статуса ниже - жёлтую точку у имени
     не дублируем (в flex-раскладке имя+счётчик она уехала бы за счётчик) */
  .conv.pend .conv-name-staff::after { content: none; }
  /* красный кружок: у лида есть заявка, требующая действия модератора */
  .conv-act { width: 8px; height: 8px; border-radius: 50%; background: var(--bad-tx); flex: 0 0 auto; }
  /* строка коллеги/клиента: имя - (бэйдж должности) - счётчик непрочитанного. Полоса
     тянется на всю ширину, счётчик прижат вправо (margin-left:auto) и не режется
     никогда. У СОТРУДНИКОВ имя не ужимается (короткое), при нехватке места режется
     БЭЙДЖ. У КЛИЕНТОВ бэйджа нет - длинное ФИО усекается само (.conv-name-cli),
     иначе имя не ужалось бы и счётчик налез на время. */
  .conv-name-staff { display: flex; align-items: center; gap: 6px; min-width: 0; flex: 1 1 auto; }
  .conv-name-staff .conv-nm { min-width: 0; flex-shrink: 0;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .conv-name-staff .conv-role { margin-left: 0; min-width: 0; flex-shrink: 100;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .conv-name-cli .conv-nm { flex-shrink: 1; }
  .conv-count { flex: 0 0 auto; margin-left: auto; display: inline-flex; align-items: center; justify-content: center;
    min-width: 17px; height: 17px; padding: 0 5px; border-radius: 9px;
    background: var(--bad-tx); color: #fff; font-size: 10.5px; font-weight: 700;
    line-height: 1; font-variant-numeric: tabular-nums; }
  /* Диалог в очереди, где клиент ещё ничего не написал: числа непрочитанных
     нет, а в бейдж раздела он попадает - без этой точки его было не найти. */
  /* «Показано N из M» под поиском: список диалогов ограничен потолком, и это
     обязано быть видно - иначе кажется, что клиента в системе нет. */
  .conv-more { font-size: 11.5px; line-height: 1.45; color: var(--ghost);
    padding: 2px 2px 0; }
  .conv-more a { color: var(--ink2); }
  /* Подвал таблицы заявок: «Показано N», «сколько всего», «в начало списка».
     Полного числа «из M» тут нет намеренно - см. _leadnav.html. */
  .leads-pager { padding: 10px 2px 0; display: flex; gap: 12px; flex-wrap: wrap; }
  /* Кнопка, которая читается как ссылка (запрос «сколько всего» - действие,
     а не переход, поэтому button, а не <a>). */
  .lnkbtn { font: inherit; font-size: inherit; color: var(--ink2); cursor: pointer;
    background: none; border: 0; padding: 0; text-decoration: underline;
    text-decoration-style: dashed; }
  .lnkbtn:disabled { cursor: default; text-decoration: none; color: var(--ghost); }
  .conv-wait { flex: 0 0 auto; margin-left: auto; width: 8px; height: 8px;
    border-radius: 50%; background: var(--bad-tx); }
  .conv-empty { padding: 34px 16px; text-align: center; color: var(--ghost); font-size: 13px; }

  /* панель диалога */
  .cd-head { display: flex; gap: 13px; padding: 16px 18px; border-bottom: 1px solid var(--bd); align-items: flex-start; }
  .cd-headmain { min-width: 0; flex: 1; }
  .cd-name { font-size: 16px; font-weight: 600; }
  .cd-badges { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 7px; }
  .cd-subj { font-size: 12.5px; color: var(--ink2); margin-top: 8px; }
  .cd-acctmgr { display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
    margin-top: 8px; font-size: 12.5px; }
  .acctmgr-name { font-weight: 600; }
  .acctmgr-form { display: inline-flex; align-items: center; gap: 6px; }
  /* padding-right держим под стрелку .sel (28px), иначе шорхенд перебивал бы
     его и стрелка ложилась на имя сотрудника (owner 2026-08-20) */
  .acctmgr-form .sel { font-size: 12px; padding: 4px 26px 4px 8px; }
  .acctmgr-go { font-size: 12px; padding: 5px 11px; border: 1px solid var(--bd2);
    border-radius: 8px; background: var(--ink); color: #fff; cursor: pointer; }
  .acctmgr-go:hover { opacity: .9; }
  .acctmgr-hist { font-size: 12px; }
  .acctmgr-hist summary { cursor: pointer; }
  .acctmgr-hist ul { margin: 4px 0 0; padding-left: 16px; }
  .cd-body { flex: 1; overflow-y: auto; padding: 16px 18px; }
  .cd-note { padding: 11px 14px; border-radius: 12px; background: var(--info-bg); color: var(--info-tx);
    font-size: 12.5px; line-height: 1.45; }
  .cd-body .toast { margin-top: 12px; margin-bottom: 0; }
  /* лента переписки: пузыри (in = клиент слева, out = мы справа) */
  .cd-thread { display: flex; flex-direction: column; gap: 9px; }
  .bub { max-width: 68%; padding: 8px 12px 6px; border-radius: 14px; font-size: 13px;
    line-height: 1.45; word-break: break-word; }
  .bub-text { white-space: pre-wrap; }
  .bub.in { align-self: flex-start; background: #fff; border: 1px solid var(--bd);
    border-bottom-left-radius: 5px; box-shadow: 0 1px 2px rgba(11,11,13,.05); }
  .bub.out { align-self: flex-end; background: var(--ink); color: #fff;
    border-bottom-right-radius: 5px; box-shadow: 0 2px 6px -3px rgba(11,11,13,.28); }
  .bub-who { font-size: 11px; font-weight: 600; margin-bottom: 2px; color: var(--info-tx); }
  .bub.out .bub-who { color: rgba(255,255,255,.75); }
  .bub-meta { font-family: var(--mono); font-size: 9.5px; color: var(--ghost);
    margin-top: 3px; text-align: right; }
  .bub.out .bub-meta { color: rgba(255,255,255,.55); }
  /* модерация: системное авто-событие - серый, по центру, отличается от обеих сторон */
  .bub.mod { align-self: center; max-width: 82%; text-align: center;
    background: rgba(11,11,13,.05); color: var(--ink2);
    border: 1px dashed var(--bd2); border-radius: 10px; box-shadow: none; }
  .bub.mod .bub-who { color: var(--mut); text-transform: uppercase; letter-spacing: .05em; }
  .bub.mod .bub-meta { color: var(--ghost); text-align: center; }
  /* группы «Клиенты | Сотрудники» над фильтрами диалогов + счётчики */
  .conv-groups { display: flex; gap: 2px; padding: 8px 8px 0; }
  .conv-groups a { flex: 1; display: inline-flex; align-items: center; justify-content: center;
    gap: 6px; padding: 7px 10px; border-radius: 10px; text-decoration: none;
    font-size: 13px; font-weight: 600; color: var(--mut); }
  .conv-groups a:hover { background: rgba(11,11,13,.05); color: var(--ink); }
  .conv-groups a.on { background: var(--ink); color: #fff; }
  /* индикатор непрочитанного у вкладки группы - аккуратная красная точка */
  /* счётчик непрочитанного на подвкладках «Клиенты»/«Сотрудники» (цифра, не точка).
     На активной тёмной вкладке инвертируем: белый фон, тёмный текст - иначе красный
     на почти-чёрном плохо читается. */
  .grp-count { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
    min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--bad-tx);
    color: #fff; font-size: 10px; font-weight: 700; line-height: 1; font-variant-numeric: tabular-nums; }
  .conv-groups a.on .grp-count { background: #fff; color: var(--ink); }
  /* сообщение = столбик [пузырь, иконки ПОД ним]; align по стороне сообщения */
  .msgrow { display: flex; flex-direction: column; gap: 3px; max-width: 68%; }
  .msgrow.in { align-self: flex-start; align-items: flex-start; }
  .msgrow.out { align-self: flex-end; align-items: flex-end; }
  .msgrow.mod { align-self: center; align-items: center; max-width: 82%; }
  .msgrow .bub { max-width: 100%; }
  .msgrow.selected .bub { box-shadow: 0 0 0 2px var(--info-tx); }
  /* иконки ПОД пузырём (не внутри), видны при наведении на сообщение */
  .bub-tools { display: flex; gap: 4px; opacity: 0; transition: opacity .12s; }
  .msgrow:hover .bub-tools { opacity: 1; }
  .bub-tool { display: inline-flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; padding: 0; border: 1px solid var(--bd2); border-radius: 7px;
    background: #fff; color: var(--mut); cursor: pointer; }
  .bub-tool svg { width: 15px; height: 15px; }
  .bub-tool:hover { background: rgba(11,11,13,.06); color: var(--ink); }
  .bub-tool.on { background: var(--ink); color: #fff; border-color: var(--ink); }
  .bub-tool.copied { color: var(--ok-tx); border-color: rgba(29,111,66,.4); }
  /* реакция на пузыре (эмодзи в чёрной пилюле - в стиле софта) */
  .bub-react { position: absolute; bottom: -10px; right: 8px; padding: 1px 6px; border-radius: 999px;
    background: var(--ink); color: #fff; font-size: 12px; line-height: 1.4; box-shadow: 0 2px 6px -2px rgba(11,11,13,.5); }
  .msgrow.in .bub-react { right: auto; left: 8px; }
  .msgrow .bub { position: relative; }
  /* пикер реакций (динамично-чёрный) */
  .react-pop { position: absolute; z-index: 320; display: flex; gap: 2px; padding: 4px 6px;
    border-radius: 999px; background: var(--ink); box-shadow: 0 12px 30px -12px rgba(11,11,13,.6); }
  .react-pop button { border: 0; background: none; cursor: pointer; font-size: 18px; line-height: 1;
    padding: 3px 4px; border-radius: 999px; }
  .react-pop button:hover { background: rgba(255,255,255,.16); }
  /* карточка заявки в стафф-чате («поделиться») - визитка; аватар во всю высоту */
  .leadcard { display: flex; align-items: stretch; gap: 0; text-decoration: none;
    min-width: 230px; border: 1px solid var(--bd2); border-radius: 12px; overflow: hidden;
    background: rgba(255,255,255,.75); color: var(--ink); }
  .bub.out .leadcard { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.25); color: #fff; }
  .leadcard-av { flex: none; width: 52px; align-self: stretch;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--ink); color: #fff; font-weight: 700; font-size: 18px; }
  .bub.out .leadcard-av { background: rgba(255,255,255,.22); color: #fff; }
  .leadcard-main { padding: 10px 12px; }
  .bub.out .leadcard-av { background: rgba(255,255,255,.22); color: #fff; }
  .leadcard-main { min-width: 0; }
  .leadcard-t { display: block; font-size: 13.5px; font-weight: 600; color: inherit;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .leadcard-s { display: block; margin-top: 2px; font-size: 11px; color: var(--mut); }
  .bub.out .leadcard-s { color: rgba(255,255,255,.7); }
  .leadcard-open { margin-top: 5px; font-family: var(--mono); font-size: 10px;
    text-transform: uppercase; letter-spacing: .05em; color: var(--info-tx); }
  .bub.out .leadcard-open { color: #fff; }
  .leadcard:hover .leadcard-t { text-decoration: underline; }
  /* иконка «поделиться заявкой» - ТОЧНО как иконка чата (.chatbtn): тот же
     размер, рамка и фон, чтобы стояли в одном стиле (owner 2026-07-22) */
  .lead-share { display: inline-flex; align-items: center; justify-content: center;
    width: 30px; height: 30px; margin-left: 4px; padding: 0; border: 1px solid var(--bd2);
    border-radius: 9px; background: #fff; color: var(--ink2); cursor: pointer;
    vertical-align: middle; flex: none; transition: color .15s, background .15s; }
  .lead-share svg { width: 16px; height: 16px; flex: none; }
  .lead-share:hover { background: rgba(11,11,13,.05); color: var(--ink); }
  /* чат + «поделиться» в одну линию, строго по центру (иначе share съезжал вниз) */
  .cell-chatshare { white-space: nowrap; }
  .cell-chatshare > * { vertical-align: middle; }
  .lead-chipwrap { display: inline-flex; align-items: center; }
  /* у чипов «Заявки клиента» в чате - БЕЗ подложки (голая иконка, как было) */
  .cd-leadschips .lead-share { width: 24px; height: 24px; margin-left: 2px;
    border-color: transparent; background: none; }
  .cd-leadschips .lead-share svg { width: 15px; height: 15px; }
  .cd-leadschips .lead-share:hover { background: rgba(11,11,13,.06); }
  /* отметка прочтения на своих сообщениях в стафф-чате (✓ / ✓✓) */
  .bub.out .rr { margin-left: 4px; font-family: var(--mono); }
  /* бейдж должности - цвет по роли/специализации (r-<key>) */
  .conv-role { display: inline-block; margin-left: 6px; padding: 1px 7px; border-radius: 999px;
    background: rgba(11,11,13,.06); color: var(--mut); font-size: 10.5px; font-weight: 600;
    vertical-align: middle; }
  .conv-role.r-owner    { background: #f4ecd0; color: #8a6d15; }
  .conv-role.r-director { background: #efe6f8; color: #6b21a8; }
  .conv-role.r-manager  { background: #e3e9fb; color: #35408f; }
  .conv-role.r-sound    { background: #e2f2e6; color: #1d6f42; }
  .conv-role.r-target   { background: #fdeadc; color: #b45309; }
  .conv-role.r-contracts{ background: #dff1f4; color: #0e6f8a; }
  /* бейдж не меняет цвет при выборе диалога (owner 2026-07-23): фон выделения
     светлый, поэтому раньше белый текст «пропадал» - оставляем цвет по роли */
  /* в шапке стафф-чата бейдж крупнее */
  .cd-name .conv-role { font-size: 11px; padding: 2px 9px; }
  /* полоса закреплённых сообщений вверху стафф-переписки */
  .pinned-strip { display: flex; flex-direction: column; gap: 4px; margin-bottom: 8px;
    padding: 8px 10px; border-radius: 10px; background: rgba(11,11,13,.04);
    border-left: 3px solid var(--ink); }
  .pinned-item { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: var(--ink2); }
  .pin-ic { width: 14px; height: 14px; flex: none; color: var(--mut); }
  .pinned-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .pinned-unpin { border: 0; background: none; color: var(--ghost); cursor: pointer; font-size: 13px; }
  .pinned-unpin:hover { color: var(--bad-tx); }
  /* панель мульти-пересылки: компактная «пилюля», ТОЛЬКО при выборе сообщений.
     [hidden] обязателен - иначе display:inline-flex перебивает html-атрибут hidden
     и панель висит всегда (owner 2026-07-23: «Выбрано: 0» на весь экран). */
  .fwdbar { display: inline-flex; align-items: center; gap: 8px; margin-top: 8px;
    padding: 4px 6px 4px 12px; border-radius: 999px; background: var(--ink); color: #fff;
    font-size: 12px; }
  .fwdbar[hidden] { display: none; }
  .fwdbar-go { border: 0; border-radius: 999px; background: #fff; color: var(--ink); font: inherit;
    font-weight: 600; padding: 4px 12px; cursor: pointer; }
  .fwdbar-x { border: 0; background: none; color: rgba(255,255,255,.7); font: inherit;
    padding: 4px 6px; cursor: pointer; }
  .fwdbar-x:hover { color: #fff; }
  /* автодополнение @упоминаний */
  .mentionpop { position: absolute; z-index: 320; min-width: 180px; max-height: 200px; overflow-y: auto;
    padding: 6px; border-radius: 12px; background: #fff; border: 1px solid var(--bd);
    box-shadow: 0 18px 40px -18px rgba(11,11,13,.35); }
  .mentionpop button { display: flex; align-items: center; gap: 6px; width: 100%; padding: 6px 10px;
    border: 0; border-radius: 8px; background: none; font: inherit; font-size: 13px; color: var(--ink);
    text-align: left; cursor: pointer; }
  .mentionpop button:hover, .mentionpop button.on { background: rgba(11,11,13,.06); }
  .mention-av { flex: none; width: 24px; height: 24px; border-radius: 50%; color: #fff;
    display: inline-flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600; }
  .mention-nm { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* подгруппы в пикере «кому переслать» (коллеги / клиенты) */
  .staffpick-sub { padding: 6px 10px 3px; font-family: var(--mono); font-size: 9.5px;
    text-transform: uppercase; letter-spacing: .06em; color: var(--ghost); }
  /* пикер «кому отправить» (список активных коллег) */
  .staffpick { position: absolute; z-index: 300; min-width: 180px; padding: 6px;
    border-radius: 12px; background: #fff; border: 1px solid var(--bd);
    box-shadow: 0 18px 40px -18px rgba(11,11,13,.35); }
  .staffpick-cap { padding: 4px 10px 6px; font-family: var(--mono); font-size: 10px;
    text-transform: uppercase; letter-spacing: .06em; color: var(--ghost); }
  .staffpick-opt { display: block; width: 100%; padding: 7px 10px; border: 0;
    border-radius: 8px; background: none; font: inherit; font-size: 13px;
    color: var(--ink); text-align: left; cursor: pointer; }
  .staffpick-opt:hover { background: rgba(11,11,13,.06); }
  /* иконка чата в строке лида + счётчик «без ответа» */
  .chatbtn { position: relative; display: inline-flex; align-items: center; justify-content: center;
    width: 30px; height: 30px; padding: 0; border: 1px solid var(--bd2); border-radius: 9px;
    background: #fff; color: var(--ink2); cursor: pointer; transition: color .15s, background .15s; }
  .chatbtn svg { width: 16px; height: 16px; }
  .chatbtn:hover { color: var(--ink); background: rgba(11,11,13,.05); }
  .chatbtn.open { background: var(--ink); color: #fff; border-color: var(--ink); }
  .chatcnt { position: absolute; top: -6px; right: -7px; min-width: 16px; padding: 0 4px;
    border-radius: 999px; background: var(--bad-tx); color: #fff; font-family: var(--mono);
    font-size: 10px; font-weight: 600; line-height: 16px; text-align: center; }
  /* мини-чат в раскрывашке строки лида: во всю ширину ВИДИМОЙ таблицы.
     Таблица дистрибуции шире экрана (горизонтальный скролл) - фикс. ширина от
     вьюпорта + sticky, чтобы бокс не уезжал за экран при скролле вбок. */
  .chatbox { display: flex; gap: 16px; align-items: flex-end; padding: 12px 14px;
    background: rgba(11,11,13,.025); border-radius: 12px;
    position: sticky; left: 12px; width: calc(100vw - 92px); max-width: 1600px; }
  .chatmini { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 7px; }
  .chatmini .bub { max-width: 55%; font-size: 12.5px; }
  .chatmore { font-family: var(--mono); font-size: 10.5px; color: var(--ghost); }
  /* Ответ прямо из мини-чата (владелец 27.08.2026). Колонка, а не строка:
     .chatbox выравнивает детей по нижнему краю, и поле должно стоять вровень
     с кнопкой «Перейти к диалогу», а не растягивать бокс. */
  .mini-reply { flex: 0 0 260px; display: flex; gap: 6px; align-items: center; }
  .mini-reply-in { flex: 1; min-width: 0; padding: 7px 11px; font: inherit;
    font-size: 12.5px; border: 1px solid var(--bd); border-radius: 999px;
    background: var(--panel, #fff); color: var(--ink); }
  .mini-reply-in:focus { outline: 2px solid var(--ink); outline-offset: 1px; }
  .mini-reply-go { flex: 0 0 auto; padding: 7px 13px; border: 1px solid var(--bd);
    border-radius: 999px; background: var(--panel, #fff); color: var(--ink);
    font-size: 12px; font-weight: 500; cursor: pointer; white-space: nowrap; }
  .mini-reply-go:hover { background: rgba(11,11,13,.05); }
  .btn-godialog { flex: 0 0 auto; display: inline-block; padding: 7px 16px; border-radius: 999px;
    background: var(--ink); color: #fff; font-size: 12px; font-weight: 500; text-decoration: none;
    box-shadow: 0 2px 6px -2px rgba(11,11,13,.3); white-space: nowrap; }
  .btn-godialog:hover { background: var(--ink2); }
  /* чипы «лиды клиента» в панели диалога (переход в раздел с подсветкой) */
  .cd-leadschips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center;
    margin-top: 8px; font-size: 12px; }
  a.lead-chip.golead { text-decoration: none; transition: background .15s, color .15s; }
  a.lead-chip.golead:hover { background: var(--ink); color: #fff; }
  /* «все заявки»: чип-обводка (прозрачный + чёрная рамка) + стрелка СПРАВА от
     обводки (▾ вниз = свёрнуто, ▸ вправо = развёрнуто). Прячем сверх-3 чипы
     КЛАССОМ .collapsed на контейнере (не hidden - его перебивает display у .lead-chip). */
  .cd-leadschips.collapsed .lead-extra { display: none; }
  .leads-more { display: inline-flex; align-items: center; gap: 4px; border: 0;
    background: none; padding: 0; font: inherit; cursor: pointer; }
  .leads-more .lm-box { padding: 2px 9px; border-radius: 7px; border: 1px solid var(--ink);
    background: transparent; color: var(--ink); font-size: 11px; font-weight: 500; white-space: nowrap; }
  .leads-more .lm-arrow { font-size: 10px; line-height: 1; color: var(--ink); }
  .leads-more:hover .lm-box { background: rgba(11,11,13,.06); }
  /* «Действия» стоит НАД кнопкой «Отправить» в правой колонке компоуза
     (только менеджер) + модалка Договор/Счёт */
  /* Колонка кнопок ВРОВЕНЬ с окном ввода (та же высота, top и bottom совпадают):
     Действия над Отправить, вплотную (owner 2026-07-22). staff: одна кнопка по
     центру по вертикали (#9). */
  .cd-sendcol { display: flex; flex-direction: column; justify-content: flex-end; gap: 6px;
    align-items: stretch; min-width: 150px; }
  /* стафф-компоуз = как клиентский (без «Действия»): «Отправить» прижата вниз */
  .cd-sendcol.staff-sendcol { justify-content: flex-end; min-width: 130px; }
  .cd-sendcol .actions-btn, .cd-sendcol .btn-send { width: 100%; justify-content: center; text-align: center; }
  .actions-btn { display: inline-flex; align-items: center; justify-content: center; gap: 5px;
    padding: 8px 13px; border: 1px solid var(--bd2); border-radius: 12px; background: #fff;
    color: var(--ink); font: inherit; font-size: 13px; font-weight: 500; cursor: pointer;
    white-space: nowrap; }
  .actions-btn:hover { background: rgba(11,11,13,.05); }
  /* красный счётчик заявок, требующих действия, у кнопки «Действия» */
  .act-badge { display: inline-flex; align-items: center; justify-content: center;
    min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px;
    background: var(--bad-tx); color: #fff; font-size: 11px; font-weight: 700;
    line-height: 1; font-variant-numeric: tabular-nums; }
  .cd-sendcol .btn-send { align-self: auto; }   /* низ колонки задаёт justify-content: flex-end */
  /* модалка: оверлей поверх страницы */
  .actmodal { position: fixed; inset: 0; z-index: 200; display: flex;
    align-items: center; justify-content: center; padding: 20px; }
  .actmodal[hidden] { display: none; }
  .actmodal-back { position: absolute; inset: 0; background: rgba(11,11,13,.42); }
  .actmodal-card { position: relative; width: 640px; max-width: 100%; max-height: 82vh;
    display: flex; flex-direction: column; background: var(--panel, #fff); border-radius: 16px;
    box-shadow: 0 24px 60px -12px rgba(11,11,13,.5); overflow: hidden;
    animation: actmpop .22s cubic-bezier(.2,.9,.3,1.15); }
  @keyframes actmpop { from { opacity: 0; transform: translateY(10px) scale(.97); }
    to { opacity: 1; transform: none; } }
  /* apple-аудит §7: выход тем же путём, что вход (раньше все закрытия - жёсткий
     обрыв). Класс .closing вешает JS-хелпер closeFx перед hidden/remove. */
  .closing .actmodal-card, .closing .uiconfirm-card {
    animation: actmout .15s ease-in forwards; }
  .closing .actmodal-back, .closing .uiconfirm-back {
    animation: actmfout .15s ease forwards; }
  @keyframes actmout { to { opacity: 0; transform: translateY(8px) scale(.98); } }
  @keyframes actmfout { to { opacity: 0; } }
  .actmodal-back { animation: actmfade .2s ease; }
  @keyframes actmfade { from { opacity: 0; } to { opacity: 1; } }
  .actmodal-head { display: flex; align-items: center; justify-content: space-between;
    padding: 14px 18px; border-bottom: 1px solid var(--bd); font-weight: 600; font-size: 14px; }
  .actmodal-x { border: 0; background: none; font-size: 16px; color: var(--mut); cursor: pointer; line-height: 1; }
  .actmodal-x:hover { color: var(--ink); }
  .actmodal-empty { padding: 30px 18px; text-align: center; }
  .actmodal-body { display: flex; min-height: 0; }
  .actmodal-list { flex: 0 0 220px; border-right: 1px solid var(--bd); overflow-y: auto; padding: 8px; }
  .req-pick { display: block; width: 100%; text-align: left; border: 0; background: none;
    padding: 8px 10px; border-radius: 9px; cursor: pointer; font: inherit; margin-bottom: 2px;
    transition: background-color .15s ease; }
  .req-pick:hover { background: rgba(11,11,13,.05); }
  /* тонкий скроллбар списка и панелей модалки (webkit) */
  .actmodal-list::-webkit-scrollbar, .actmodal-panels::-webkit-scrollbar { width: 6px; }
  .actmodal-list::-webkit-scrollbar-thumb, .actmodal-panels::-webkit-scrollbar-thumb {
    background: rgba(11,11,13,.16); border-radius: 3px; }
  .actmodal-list::-webkit-scrollbar-thumb:hover, .actmodal-panels::-webkit-scrollbar-thumb:hover {
    background: rgba(11,11,13,.28); }
  .req-pick.on { background: var(--ink); }
  .req-pick.on .req-pick-name { color: #fff; }
  .req-pick.on .rel-st { filter: brightness(1.06); }
  .req-pick-name { display: block; font-size: 13px; font-weight: 500; margin-bottom: 4px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* красный кружок «требует действия» слева от имени заявки в списке модалки */
  .req-pick-name .conv-act { display: inline-block; margin-right: 6px; vertical-align: middle; }
  /* «Все заявки (N)»: раскрыть хвост списка (по умолчанию видны 3 последних) */
  .req-more { display: flex; align-items: center; justify-content: center; gap: 6px; width: 100%;
    margin: 4px 0; padding: 7px 10px; border: 1px dashed var(--bd2); border-radius: 9px;
    background: none; color: var(--mut); font: inherit; font-size: 12.5px; cursor: pointer; }
  .req-more:hover { background: rgba(11,11,13,.04); color: var(--ink); }
  /* apple-аудит §8: единая конвенция раскрывашек ▸ -> поворот 90° = ▾ */
  .req-more-ar { display: inline-block; transition: transform .15s; }
  .req-more.open .req-more-ar { transform: rotate(90deg); }
  /* «Счёт без заявки» - отдельный пункт списка модалки (не релиз, а услуга) */
  .req-pick-calc { margin-top: 4px; border-top: 1px dashed var(--bd2); padding-top: 9px; }
  .req-pick-calc .req-pick-name { color: var(--mut); }
  /* сколько счетов-услуг ждут подтверждения (панель за этим пунктом) */
  .req-pick-cnt { display: inline-flex; align-items: center; justify-content: center;
    min-width: 17px; height: 17px; padding: 0 5px; border-radius: 9px;
    background: var(--warn-bg); color: var(--warn-tx); font-size: 11px; font-weight: 600; }
  .req-pick-calc.on .req-pick-name { color: #fff; }
  /* калькулятор: поля столбиком, кнопки в ряд, разбивка расчёта под ними */
  /* .mod-actform ниже задаёт display:inline - тот же вес селектора, но ПОЗЖЕ
     по файлу и потому побеждал: поля калькулятора вставали в строку. Двойной
     класс поднимает специфичность (аудит Ф4). */
  .mod-actform.calcform { display: flex; flex-direction: column; gap: 9px; }
  .calc-field[hidden] { display: none; }
  .calc-row { margin-top: 2px; }
  .calc-out { padding: 9px 11px; border: 1px solid var(--bd2); border-radius: 9px;
    background: rgba(11,11,13,.03); font-size: 12.5px; line-height: 1.55; }
  .calc-out[hidden] { display: none; }
  .actmodal-panels { flex: 1; min-width: 0; overflow-y: auto; padding: 16px 18px; }
  .req-panel-h { font-size: 14px; font-weight: 600; margin-bottom: 14px; display: flex;
    flex-wrap: wrap; gap: 7px; align-items: center; }
  .req-panel-lead { color: var(--ink); text-decoration: none; border-bottom: 1px dashed var(--bd2); }
  .req-panel-lead:hover { border-bottom-color: var(--ink); color: var(--info-tx); }
  /* группы-секции панели: мягкие карточки на сером (совр. тренд: разделение
     фоном, не линиями) - фирменные скругления, как строки карточки клиента */
  .actgroup { padding: 12px 14px; margin-bottom: 10px; border-radius: 12px;
    background: rgba(11,11,13,.028); }
  .actgroup:last-child { margin-bottom: 0; }
  .actgroup-h { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
    color: var(--ink2); margin-bottom: 9px; display: flex; align-items: center; gap: 7px; }
  .actline { font-size: 13px; margin-bottom: 9px; display: flex; align-items: center; gap: 7px; }
  .actrow { display: flex; flex-wrap: wrap; gap: 6px; }
  /* статус-действия столбиком, слева: «Одобрить», под ним «Причина» + «На правки» */
  .actcol { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
  .actcol .mod-actform { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
  .actcol .actlbl { margin-bottom: 0; }
  .actlbl { display: block; font-size: 12px; color: var(--ink2); margin-bottom: 9px; }
  .actlbl input { display: block; margin-top: 5px; width: 180px; max-width: 100%; font: inherit;
    font-size: 14px; padding: 8px 11px; border: 1px solid var(--bd2); border-radius: 10px; }
  .actlbl input:focus { outline: none; box-shadow: var(--ring); }
  .actnote { font-size: 12px; margin-top: 4px; }
  .issueform { margin: 0; }
  @media (max-width: 620px) {
    .actmodal-body { flex-direction: column; }
    .actmodal-list { flex-basis: auto; border-right: 0; border-bottom: 1px solid var(--bd); max-height: 150px; }
  }
  /* подсказка над компоузом закрытого диалога (отправка переоткроет) */
  .cd-reopen { padding: 8px 16px; border-top: 1px solid var(--bd); background: var(--warn-bg);
    color: var(--warn-tx); font-size: 12px; }
  /* принудительное удаление истории: двухшаговое раскрытие (без JS, CSP) */
  .purgebox { margin-top: 16px; }
  .purgebox > summary { display: inline-block; cursor: pointer; list-style: none;
    font-size: 11.5px; color: var(--mut); text-decoration: underline dotted; user-select: none; }
  .purgebox > summary::-webkit-details-marker { display: none; }
  .purgebox > summary:hover { color: var(--bad-tx); }
  .purgeform { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-top: 8px;
    padding: 10px 14px; border-radius: 12px; background: var(--bad-bg); color: var(--bad-tx);
    font-size: 12.5px; }
  .btn-purge { font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
    padding: 6px 14px; border: none; border-radius: 999px; background: var(--bad-tx); color: #fff; }
  .btn-purge:hover { filter: brightness(1.12); }
  /* Компоуз - КОЛОНКА: тулбар во всю ширину сверху, ниже строка [ввод | кнопки].
     В строке align-items: stretch -> окно ввода и колонка кнопок одной высоты,
     кнопки ровно по краям окна (owner 2026-07-22). position:relative - якорь
     для эмодзи-панели и пикеров. */
  .cd-compose { display: flex; flex-direction: column; gap: 8px; padding: 13px 16px;
    border-top: 1px solid var(--bd); position: relative; }
  .cd-inputrow { display: flex; gap: 10px; align-items: stretch; }
  .cd-compose textarea[name="text"][hidden] { display: none; }
  .cd-closed { padding: 14px 16px; border-top: 1px solid var(--bd); color: var(--ghost);
    font-size: 13px; text-align: center; }
  .cd-placeholder { flex: 1; display: flex; flex-direction: column; gap: 12px;
    align-items: center; justify-content: center; color: var(--ghost); font-size: 14px; }
  .cd-ph-ic { opacity: .45; }
  .btn-send { align-self: flex-end; font: inherit; font-size: 13px; font-weight: 500; cursor: pointer;
    padding: 9px 20px; border: none; border-radius: 12px; background: var(--ink); color: #fff;
    box-shadow: 0 2px 6px -2px rgba(11,11,13,.3); white-space: nowrap; }
  .btn-send:hover { background: var(--ink2); }
  /* WYSIWYG-композер: тулбар форматирования отдельной строкой сверху */
  .fmtbar { display: flex; flex-wrap: wrap; gap: 4px; }
  .fmtbtn { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px;
    padding: 0; font: inherit; font-size: 13px; line-height: 1; cursor: pointer;
    border: 1px solid var(--bd2); border-radius: 8px; background: #fff; color: var(--ink2); }
  .fmtbtn:hover { background: rgba(11,11,13,.05); color: var(--ink); }
  .rich-input { flex: 1; min-width: 0; min-height: 72px; max-height: 360px; overflow-y: auto; font: inherit;
    font-size: 13px; line-height: 1.45; padding: 9px 12px; border: 1px solid var(--bd2);
    border-radius: 12px; background: #fff; color: var(--ink); white-space: pre-wrap; word-break: break-word; }
  .rich-input:focus { outline: none; box-shadow: var(--ring); border-color: var(--bd2); }
  .rich-input:empty::before { content: attr(data-placeholder); color: var(--ghost); pointer-events: none; }
  .rich-input a { color: var(--info-tx); text-decoration: underline; }
  .emojipop { position: absolute; bottom: 100%; left: 12px; margin-bottom: 6px; z-index: 30;
    width: 300px; max-height: 220px; overflow-y: auto; padding: 8px; display: grid;
    grid-template-columns: repeat(8, 1fr); gap: 2px; background: #fff; border: 1px solid var(--bd2);
    border-radius: 12px; box-shadow: 0 12px 34px -12px rgba(11,11,13,.4); }
  .emoji-cell { border: none; background: none; cursor: pointer; font-size: 18px; line-height: 1;
    padding: 4px; border-radius: 7px; }
  .emoji-cell:hover { background: rgba(11,11,13,.07); }
  /* авторский display:grid перебивает UA [hidden]{display:none} -> скрываем явно */
  .emojipop[hidden] { display: none; }
  /* активный формат (жирный/курсив/...): подсвечиваем кнопку тулбара тёмной */
  /* Скрепка «прикрепить файл клиенту» - такая же кнопка панели, но её щёлкает
     <label> поверх спрятанного input[type=file]: браузерная кнопка «Выберите
     файл» выбивалась бы из ряда. Рядом - имя выбранного файла, оно же кнопка
     «убрать»: без него менеджер не видит, приложился файл или нет. */
  .fmtbtn-file { cursor: pointer; }
  /* Размер значка в панели ЯВНО. Без правила svg растягивался на всю кнопку -
     26x26 при 14x13 у соседних букв Ж К Ч З, отсюда и «урод».
     14px, а не 15px иконочной ступени (.bub-tool 26/15, .chatbtn 30/16): те
     кнопки стоят особняком, а эта - в ряду ТЕКСТОВЫХ глифов, и меру задаёт
     кегль строки. Замерено канвасом на 1x: краска значка 30.8 px² против
     Ж 43 и З 21, то есть внутри разброса самих букв.
     Правило на .fmtbtn, а не на .fmtbtn-file: следующий значок этой панели
     должен быть таким же, и отдельный override только плодил бы спор
     специфичности. */
  .fmtbtn svg { width: 14px; height: 14px; flex: none; }
  .filepick-input:focus-visible + .fmtbtn-file { outline: 2px solid var(--ink); outline-offset: 1px; }
  /* Имя выбранного файла в панели. Токены те же, что у чипа-вложения выше
     (.attach-chip): радиус 10, кегль 12.5, крестик приглушён - иначе рядом в
     одном окне ввода два разных «вложения». */
  .docpick-name { max-width: 240px; margin-left: 2px; padding: 5px 9px; overflow: hidden;
    font: inherit; font-size: 12.5px; line-height: 1.35; white-space: nowrap;
    text-overflow: ellipsis; cursor: pointer; border: 1px solid var(--bd2);
    border-radius: 10px; background: rgba(11,11,13,.045); color: var(--ink2); }
  .docpick-name:hover { color: var(--ink); }
  .docpick-name::after { content: "✕"; margin-left: 7px; opacity: .55; }
  .docpick-name:hover::after { opacity: 1; }
  .fmtbtn.on { background: var(--ink); color: #fff; }
  .fmtbtn.on:hover { background: var(--ink); color: #fff; }
  /* инлайн-код и ссылки внутри пузырей (читаемо на белом in и тёмном out) */
  .bub-text code { font-family: var(--mono); font-size: 12px; padding: 1px 5px; border-radius: 5px;
    background: rgba(11,11,13,.07); }
  .bub.out .bub-text code { background: rgba(255,255,255,.16); }
  .bub-text a { color: inherit; text-decoration: underline; }

  /* мессенджер на узком экране: панели в столбик */
  @media (max-width: 760px) {
    .msgr { flex-direction: column; height: auto; }
    .conv-col { flex: none; max-height: 46vh; }
    .conv-detail { min-height: 340px; }
  }

  /* ---------- строки-состояния ---------- */
  tr.unpaid td { background: rgba(240,196,120,.13); }
  tr.warn td { background: rgba(240,220,120,.2); }
  tr.overdue td { background: rgba(226,116,106,.14); }
  /* лид, открытый переходом из чата (?focus=): синяя подсветка НАСОВСЕМ (пока
     не уйти со страницы). Ниже строк-состояний - перекрывает их фон. */
  tr.focused td { background: rgba(88,110,235,.16); }
  tr.focused td:first-child { box-shadow: inset 3px 0 0 #586eeb; }
  tr.trow > td { background: rgba(11,11,13,.028); border-bottom: 1px solid rgba(11,11,13,.05); }
  tr.trow > td:first-child { box-shadow: inset 3px 0 0 rgba(11,11,13,.22); }
  tr.trow[hidden], tr.cdetail[hidden] { display: none; }
  .trk-title { font-weight: 500; }
  .trk-title .pos { font-family: var(--mono); color: var(--ghost); margin-right: 5px; font-size: 11px; }
  tr.cdetail > td { background: var(--bg2); padding: 12px 16px; }
  .cbox { font-size: 13px; color: var(--ink2); white-space: normal; max-width: 960px; line-height: 1.5; }
  .clabel { color: var(--mut); font-weight: 500; margin-right: 6px; }
  /* промо-текст артиста (раскрывашка «промо» в дистрибуции): сохраняем переносы */
  .promo-text { display: block; margin-top: 4px; white-space: pre-line; }
  .minicopy { display: inline-flex; align-items: center; justify-content: center; width: 22px;
    height: 20px; padding: 0; vertical-align: middle; border: 1px solid var(--bd2);
    border-radius: 6px; background: rgba(255,255,255,.9); color: var(--mut); cursor: pointer; }
  .minicopy svg { width: 13px; height: 13px; }
  .minicopy:hover { background: rgba(11,11,13,.06); color: var(--ink); }
  .minicopy.copied { color: var(--ok-tx); border-color: rgba(29,111,66,.4); }
  .reqbox .reqrow { margin: 3px 0; line-height: 1.55; word-break: break-word; }
  .reqbox .linklist { display: block; margin-top: 2px; }
  .reqbox .linkrow { display: block; margin: 2px 0; line-height: 1.55; overflow-wrap: anywhere; }
  .reqbox .lnklabel { color: var(--mut); font-weight: 500; }

  /* ---------- «Продвижение»: панель результатов кампании ---------- */
  .res-toggle.has { border-color: var(--ink); color: var(--ink); }
  .resform { max-width: 100%; white-space: normal; }  /* таблица nowrap - тут подписи должны переноситься */
  /* единое рабочее поле: один кард, секции разделены волосяными линиями
     (gap 1px поверх фона-границы) - все блоки одной высоты */
  .resgrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 1px; background: var(--bd); border: 1px solid var(--bd); border-radius: 12px;
    overflow: hidden; }
  /* фон секций = как у таблицы (светлое стекло), чтобы пилюли .sel/.inp читались */
  .ressec { background: linear-gradient(170deg, rgba(255,255,255,.97), rgba(250,250,253,.92));
    padding: 14px 16px 16px; min-width: 0; }
  .ressec-t { margin: 0 0 10px; font-size: 12.5px; font-weight: 600; color: var(--ink); }
  .ressec-t .mut { font-weight: 400; }
  /* строка поля: подпись слева, контрол справа фикс-ширины -> всё выровнено */
  .resf { display: grid; grid-template-columns: minmax(0,1fr) 160px; align-items: center;
    column-gap: 10px; margin: 7px 0; font-size: 12.5px; color: var(--ink2); }
  .resf > input, .resf > select, .resf .calbtn, .rcalcwrap { grid-column: 2; }
  .resf.reschk { grid-template-columns: 1fr; }
  .resf.reschk input { width: 16px; height: 16px; margin-right: 8px; accent-color: var(--ink); vertical-align: -2px; }
  .rlbl { color: var(--mut); }
  .resf > input, .splitgrid input { font-family: inherit; font-size: 13px; padding: 6px 9px;
    border: 1px solid var(--bd); border-radius: var(--r-ctl); background: rgba(255,255,255,.75);
    color: var(--ink); width: 100%; transition: border-color .15s, box-shadow .15s; }
  .resf > input:focus, .splitgrid input:focus { outline: none; border-color: var(--bd2); box-shadow: var(--ring); }
  .resf > select.sel { width: 100%; }
  .resf > input.inp { width: 100%; }              /* дата как в «Сведении» (.inp), на всю колонку */
  /* ФОТ: подсказка «процент от чего» под полем %. Absolute - чтобы НЕ распирать
     сетку поля: окно ввода процента остаётся выровненным с остальными. */
  .termform .resf { position: relative; }
  .fot-hint { position: absolute; top: 100%; right: 0; margin-top: 2px;
    font-size: 11px; color: var(--mut); white-space: nowrap; }
  .fot-hint:empty { display: none; }
  .repwrap { display: flex; align-items: center; min-height: 30px; }  /* кружок «отчёт отправлен» по строке */
  /* enhance.js оборачивает контролы (.numx/.selx/.datex) - обёртка занимает
     колонку контрола, кнопка/инпут внутри - на всю её ширину */
  .resf > .numx, .resf > .selx, .resf > .datex { grid-column: 2; width: 100%; }
  .resf .numx input { width: 100%; }
  .resf .selx-btn { width: 100%; max-width: none; }
  .resf .datex-btn { width: 100%; }
  /* бюджет-сплит: подпись | (инпут как «Правки» + %) | ₽. Знак % РЯДОМ с
     инпутом, не поверх - иначе перекрывал бы нативные стрелочки количества */
  .splitgrid { display: grid; grid-template-columns: auto max-content 1fr; align-items: center;
    gap: 8px 10px; margin: 4px 0 6px; }
  .pctcell { display: flex; align-items: center; gap: 5px; }
  .pctcell i { color: var(--mut); font-style: normal; font-size: 12px; }
  .rubcell { font-size: 12.5px; color: var(--ink2); white-space: nowrap; }
  .splithint { font-size: 11px; margin: 2px 0 9px; }
  /* «синие ячейки» = формулы */
  .rescalc { font-weight: 600; color: var(--info-tx); font-variant-numeric: tabular-nums; }
  .resstat { font-size: 11px; color: var(--mut); margin-left: 4px; }
  .resstat.over { color: #8f2c24; font-weight: 600; }
  /* метрики: друг под другом (подпись | значение) */
  .resmetrics { margin-top: 10px; padding-top: 9px; border-top: 1px dashed var(--bd); display: grid; gap: 5px; }
  .resmetrics > div { display: grid; grid-template-columns: 1fr auto; align-items: baseline;
    gap: 10px; font-size: 12px; color: var(--mut); }
  .resmetrics b { color: var(--info-tx); font-variant-numeric: tabular-nums; }
  .resactions { display: flex; align-items: center; gap: 12px; margin-top: 14px; flex-wrap: wrap; }
  .resnote { font-size: 11.5px; margin-right: auto; }
  .btn-save-res { font: inherit; font-size: 13px; font-weight: 500; cursor: pointer;
    padding: 8px 18px; border-radius: var(--r-ctl); border: 1px solid var(--ink);
    background: var(--ink); color: #fff; transition: background .15s; }
  .btn-save-res:hover { background: var(--ink2); }
  .btn-save-res:disabled { opacity: .6; cursor: default; }
  /* «Сформировать отчёт» - живая ссылка на .pptx (этап 6). Была пунктирной
     заглушкой «скоро» с cursor: not-allowed. */
  .btn-report { font: inherit; font-size: 12.5px; padding: 8px 14px; border-radius: var(--r-ctl);
    border: 1px solid var(--bd); background: transparent; color: var(--ink2);
    text-decoration: none; cursor: pointer; display: inline-block;
    transition: background .15s, color .15s, border-color .15s; }
  .btn-report:hover { background: var(--ink); border-color: var(--ink); color: #fff; }
  /* «Отправить клиенту» - тот же размер и ритм, что «Сформировать отчёт», но
     это ДЕЙСТВИЕ наружу, а не выгрузка себе: заливка, а не контур. */
  .btn-report-send { font: inherit; font-size: 12.5px; padding: 8px 14px;
    border-radius: var(--r-ctl); border: 1px solid var(--ink); background: var(--ink);
    color: #fff; cursor: pointer; display: inline-block;
    transition: opacity .15s; }
  .btn-report-send:hover { opacity: .85; }
  .btn-report-send[disabled] { opacity: .5; cursor: default; }
  /* кнопка-триггер календаря периода: вид ОДИН-В-ОДИН с дата-полем «Сведения»
     (.inp[type=date]) - тот же фон/рамка/шрифт, чёрная иконка календаря */
  .calbtn { width: 100%; font: inherit; font-size: 13px; text-align: left; cursor: pointer;
    padding: 6px 30px 6px 9px; border: 1px solid var(--bd); border-radius: var(--r-ctl);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--ghost);
    background: rgba(255,255,255,.75) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13' height='13' viewBox='0 0 24 24' fill='none' stroke='%230b0b0d' stroke-width='2' stroke-linecap='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2'/%3E%3Cpath d='M16 2v4M8 2v4M3 10h18'/%3E%3C/svg%3E") no-repeat right 9px center;
    background-size: 13px; transition: border-color .15s, box-shadow .15s; opacity: 1; }
  .calbtn.set { color: var(--ink); }
  .calbtn:hover { border-color: var(--bd2); }
  .calbtn:focus { outline: none; border-color: var(--bd2); box-shadow: var(--ring); }
  /* поповер календаря */
  .calpop { position: absolute; z-index: 300; width: 272px; padding: 12px;
    background: var(--panel, #fff); border: 1px solid var(--bd); border-radius: 14px;
    box-shadow: var(--shadow-float); }
  .calpop[hidden] { display: none; }
  .cal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
  .cal-title { font-size: 13px; font-weight: 600; color: var(--ink); }
  .cal-nav { width: 26px; height: 26px; border: 1px solid var(--bd); border-radius: 8px;
    background: rgba(255,255,255,.7); color: var(--ink2); cursor: pointer; font-size: 15px; line-height: 1; }
  .cal-nav:hover { border-color: var(--bd2); }
  .cal-wd { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-bottom: 4px; }
  .cal-wd span { text-align: center; font-size: 10.5px; color: var(--mut); }
  .cal-wd span.we { color: #b5544c; }
  .cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
  .cal-e { height: 32px; }
  .cal-d { height: 32px; border: none; background: transparent; border-radius: 8px;
    font: inherit; font-size: 12.5px; color: var(--ink); cursor: pointer; padding: 0; }
  .cal-d:hover { background: rgba(11,11,13,.06); }
  .cal-d.we { color: #b5544c; }
  .cal-d.today { font-weight: 700; color: #2563eb; }
  .cal-d.inrange, .cal-d.hoverend { background: var(--info-bg); border-radius: 0; }
  .cal-d.sel { background: var(--ink); color: #fff; font-weight: 600; }
  .cal-d.sel.start { border-radius: 8px 0 0 8px; }
  .cal-d.sel.end { border-radius: 0 8px 8px 0; }
  .cal-d.sel.start.end { border-radius: 8px; }
  .cal-foot { display: flex; align-items: center; justify-content: space-between;
    margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--bd); }
  .cal-hint { font-size: 11px; color: var(--mut); }
  .cal-clear { font: inherit; font-size: 11.5px; color: var(--ink2); background: none;
    border: none; cursor: pointer; text-decoration: underline; }

  /* ---------- поля и селекты ---------- */
  .inp, .sel { font-family: inherit; font-size: 13px; padding: 6px 9px;
    border: 1px solid var(--bd); border-radius: var(--r-ctl);
    background: rgba(255,255,255,.75); color: var(--ink);
    transition: border-color .15s, box-shadow .15s; }
  .inp { width: 120px; }
  .inp::placeholder { color: var(--ghost); }
  /* UPC read-only (не директор/владелец): просто значение, без поля ввода */
  .upc-ro { font-variant-numeric: tabular-nums; color: var(--ink); font-size: 13px; }
  .inp:focus, .sel:focus { outline: none; border-color: var(--bd2); box-shadow: var(--ring); }
  .inp.bad { border-color: #c93a30; box-shadow: 0 0 0 3px rgba(201,58,48,.15); }
  .inp.datestart { width: 142px; }
  .inp.rname { width: 150px; }
  .inp.revnum { width: 58px; }
  /* селект = стеклянная пилюля с кастомным шевроном (нативную стрелку убираем).
     Цветовую дифференциацию статусов сохраняем через background-COLOR, чтобы не
     затирать фон-картинку шеврона. Открытый список опций рисует ОС - его CSS не
     стилизует (нужен кастомный компонент). */
  .sel { font-weight: 500; cursor: pointer; appearance: none; -webkit-appearance: none;
    padding-right: 28px; background-color: rgba(255,255,255,.82);
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10'%3E%3Cpath d='M2 4l3 3 3-3' fill='none' stroke='%230b0b0d' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 10px center; background-size: 10px; }
  .mgr-ro { font-size: 13px; color: var(--ink2); }
  .sel.st-new { background-color: var(--info-bg); border-color: rgba(59,63,158,.25); color: var(--info-tx); }
  .sel.st-in_progress { background-color: var(--warn-bg); border-color: rgba(138,90,11,.28); color: var(--warn-tx); }
  .sel.st-review { background-color: #efe6f8; border-color: rgba(107,33,168,.22); color: #6b21a8; }
  /* конвейер дистрибуции: «Отправлен на модерацию» (сиреневый) и
     «Отгружен - требует UPC» (оранжевый - требует действия менеджера) */
  .sel.st-on_moderation { background-color: #e9e7fb; border-color: rgba(85,96,200,.25); color: #4a4fae; }
  .sel.st-shipped_upc { background-color: #fdeadc; border-color: rgba(180,83,9,.3); color: #b45309; }
  .sel.st-done { background-color: var(--ok-bg); border-color: rgba(29,111,66,.28); color: var(--ok-tx); }
  /* «Закрыта»: серый бейдж вместо селекта, строка заявки приглушена */
  .st-closed-badge { display: inline-block; padding: 5px 12px; border-radius: 999px;
    background: rgba(11,11,13,.06); color: var(--mut); font-size: 12.5px; font-weight: 500; }
  tr.lead-closed td { opacity: .55; }
  tr.lead-closed:hover td { opacity: .85; }
  /* кнопка «Закрыть заявку» (видна, когда заявка дошла до финального статуса) */
  .lead-close-btn { display: block; margin-top: 5px; padding: 4px 10px;
    border: 1px solid var(--bd2); border-radius: 999px; background: none;
    color: var(--mut); font: inherit; font-size: 11.5px; cursor: pointer; white-space: nowrap; }
  .lead-close-btn:hover { background: rgba(11,11,13,.05); color: var(--ink); }
  /* авторский display:block перебивает UA [hidden]{display:none} -> скрываем явно
     (иначе кнопка «Закрыть» светится на всех статусах, не только «Отгружен») */
  .lead-close-btn[hidden] { display: none; }
  /* «Открыть заявку» обратно (в закрытой строке) - только owner/director */
  .lead-reopen-btn { padding: 4px 10px; border: 1px solid var(--bd2); border-radius: 999px;
    background: none; color: var(--info-tx); font: inherit; font-size: 11.5px; cursor: pointer; white-space: nowrap; }
  .lead-reopen-btn:hover { background: rgba(88,110,235,.1); }
  /* ФОТ за диапазон >1 месяца: подсказка про режим агрегата */
  .fin-rangenote { margin: 6px 0 0; padding: 8px 12px; border-radius: 10px;
    background: var(--info-bg); color: var(--info-tx); font-size: 12.5px; }
  /* поле даты: чёрная иконка календаря (сам поп-ап календаря рисует ОС). */
  .inp[type="date"]::-webkit-calendar-picker-indicator { filter: grayscale(1) brightness(0);
    opacity: .5; cursor: pointer; }
  .inp[type="date"]:hover::-webkit-calendar-picker-indicator { opacity: .9; }
  form[data-row] { display: inline; }
  .paidbox { display: inline-flex; align-items: center; justify-content: center; cursor: pointer; }
  .paidbox input { width: 17px; height: 17px; margin: 0; cursor: pointer; accent-color: var(--ink); }

  /* ---------- дропдауны и кнопки-раскрывашки ---------- */
  .dd { display: inline-block; }
  .ddbtn, .cmtbtn { font-family: inherit; font-size: 12px; line-height: 1; padding: 6px 10px;
    border: 1px solid var(--bd); border-radius: var(--r-ctl);
    background: rgba(255,255,255,.72); color: var(--mut); cursor: pointer; white-space: nowrap;
    transition: color .15s, border-color .15s, background .15s; }
  .ddbtn:hover, .cmtbtn:hover { border-color: var(--bd2); color: var(--ink); }
  .ddbtn.open, .cmtbtn.open { color: #fff; background: var(--ink); border-color: var(--ink); }
  .ddbtn .cnt { font-family: var(--mono); color: var(--ok-tx); font-weight: 600; }
  .ddbtn .cnt.zero { color: var(--ghost); font-weight: 400; }
  .ddbtn.open .cnt, .ddbtn.open .cnt.zero { color: #fff; }
  .ddmenu { position: fixed; z-index: 50; padding: 9px 11px;
    background: linear-gradient(165deg, rgba(255,255,255,.94), rgba(255,255,255,.8));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.7); border-radius: 12px;
    box-shadow: var(--shadow-float), inset 0 1px 0 rgba(255,255,255,.9);
    white-space: nowrap; display: flex; align-items: center; gap: 2px; }
  .ddmenu[hidden] { display: none; }
  .fio-menu { flex-direction: column; align-items: flex-start; gap: 8px; }
  .fio-menu label { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--ink);
    font-weight: 400; cursor: pointer; white-space: nowrap; }
  .fio-menu input { cursor: pointer; accent-color: var(--ink); }
  .ddopts { flex-direction: column; align-items: stretch; gap: 10px; }
  .optrow { display: flex; align-items: flex-start; gap: 12px; }
  .optcell { display: flex; flex-direction: column; align-items: center; gap: 6px; }
  .optlinks { display: flex; flex-direction: column; gap: 6px; border-top: 1px solid var(--bd); padding-top: 8px; }
  .lnkrow { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--mut); font-weight: 400; margin: 0; }
  .lnklbl { min-width: 84px; }
  .lnkinp { font-family: inherit; font-size: 12px; padding: 6px 9px; border: 1px solid var(--bd);
    border-radius: 8px; width: 210px; background: rgba(255,255,255,.8); color: var(--ink); }
  .lnkinp:focus { outline: none; border-color: var(--bd2); box-shadow: var(--ring); }
  .lnkinp.bad { border-color: #c93a30; box-shadow: 0 0 0 3px rgba(201,58,48,.15); }
  th.cx, td.cx { width: 22px; padding-left: 12px; padding-right: 0; text-align: center; }
  .exp { border: none; background: none; cursor: pointer; font-size: 13px; color: var(--mut);
    padding: 2px 3px; line-height: 1; display: inline-block; transition: transform .15s ease, color .15s; }
  .exp:hover { color: var(--ink); }
  .exp.open { transform: rotate(90deg); color: var(--ink); }
  /* apple-аудит §14: состояние отличимо ФОРМОЙ, не только цветом - «не сделано»
     полый кружок, «сделано» залитый с галочкой */
  .mchk { width: 15px; height: 15px; padding: 0; border-radius: 50%; border: 1.5px solid #c93a30;
    background: transparent; cursor: pointer; position: relative;
    transition: background .15s ease, border-color .15s ease, transform .1s ease; }
  .mchk:hover:not(.done):not(.locked) { border-color: #1d9e75; }
  .mchk:active { transform: scale(0.88); }
  /* нет ссылки - отметить нельзя (owner 2026-08-24): кружок гаснет и не жмётся */
  .mchk.locked { border-color: var(--bd2); opacity: .45; cursor: not-allowed; }
  .mchk.locked:active { transform: none; }
  .mchk.done { background: #1d9e75; border-color: #1d9e75; }
  .mchk.done::after { content: "✓"; position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center;
    font-size: 10px; font-weight: 700; color: #fff; line-height: 1; }
  .mchk.done:hover { background: #16805e; border-color: #16805e; }

  /* ---------- тосты ---------- */
  .savetoast { position: fixed; right: 20px; bottom: 20px; z-index: 100;
    background: rgba(11,11,13,.92); color: #fff;
    -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
    padding: 11px 18px; border-radius: 12px; font-size: 13px; font-weight: 500;
    box-shadow: var(--shadow-float); opacity: 0; transform: translateY(8px);
    transition: opacity .18s ease, transform .18s ease; pointer-events: none; }
  .savetoast.show { opacity: 1; transform: translateY(0); }
  .savetoast.err { background: rgba(143,44,36,.95); }
  .savetoast.ok { background: rgba(29,111,66,.95); }   /* зелёный: «Счёт выставлен» и т.п. */
  /* ---------- «нет связи с сервером» ----------
     Проверка деградации «оба сразу» (28.08.2026): фоновые опросы (колокол раз
     в 30 с, чат раз в 5 с) свои сбои глотали, и при лежащей базе открытая СРМ
     выглядела ИСПРАВНОЙ - те же счётчики, те же сообщения, просто ничего
     нового. Тишину читают как «сегодня никто не пишет», а не как аварию.
     Полоса слева внизу: правый угол занят тостами (.savetoast, .ntoasts). */
  .netlost { position: fixed; left: 20px; bottom: 20px; z-index: 100;
    max-width: min(360px, calc(100vw - 40px));
    display: flex; gap: 9px; align-items: flex-start;
    background: var(--bad-bg); color: var(--bad-tx);
    border: 1px solid rgba(163,53,45,.28); border-radius: 12px;
    box-shadow: var(--shadow-float); padding: 10px 13px;
    font-size: 13px; line-height: 1.45; }
  .netlost[hidden] { display: none; }
  .netlost-dot { flex: none; width: 8px; height: 8px; margin-top: 6px;
    border-radius: 50%; background: var(--bad-tx);
    animation: netpulse 1.4s ease-in-out infinite; }
  @keyframes netpulse { 0%, 100% { opacity: 1; } 50% { opacity: .25; } }
  @media (prefers-reduced-motion: reduce) { .netlost-dot { animation: none; } }

  .toast { margin-bottom: 14px; padding: 11px 15px; border-radius: 12px; font-size: 13px;
    border: 1px solid transparent; }
  .toast.ok { background: var(--ok-bg); color: var(--ok-tx); border-color: rgba(29,111,66,.2); }
  .toast.err { background: var(--bad-bg); color: var(--bad-tx); border-color: rgba(163,53,45,.2); }

  /* ---------- кастомное окно подтверждения (замена window.confirm) ---------- */
  .uiconfirm { position: fixed; inset: 0; z-index: 300; display: flex;
    align-items: center; justify-content: center; padding: 20px; }
  .uiconfirm[hidden] { display: none; }
  .uiconfirm-back { position: absolute; inset: 0; background: rgba(11,11,13,.42); }
  .uiconfirm-card { position: relative; width: 380px; max-width: 100%; background: var(--panel, #fff);
    border-radius: 16px; box-shadow: 0 24px 60px -12px rgba(11,11,13,.5); padding: 20px 20px 16px;
    animation: uiconfirm-in .14s ease; }
  @keyframes uiconfirm-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
  .uiconfirm-msg { font-size: 14px; line-height: 1.5; color: var(--ink); margin-bottom: 18px; text-align: center; }
  .uiprompt-input { width: 100%; box-sizing: border-box; margin: 0 0 16px; padding: 9px 11px;
    border: 1px solid var(--bd2); border-radius: 8px; font: inherit; font-size: 14px; }
  .uiprompt-input:focus { outline: none; border-color: var(--ink); }
  .uiconfirm-actions { display: flex; justify-content: center; gap: 8px; }
  .uiconfirm-btn { font: inherit; font-size: 13px; font-weight: 500; cursor: pointer;
    padding: 9px 18px; border-radius: 12px; border: 1px solid var(--bd2); background: #fff; color: var(--ink); }
  .uiconfirm-btn:hover { background: rgba(11,11,13,.05); }
  .uiconfirm-btn.primary { border-color: var(--ink); background: var(--ink); color: #fff; }
  .uiconfirm-btn.primary:hover { background: var(--ink2); }

  /* ---------- главный экран (хаб) ---------- */
  body.hubpage header { background: transparent; border-color: transparent; box-shadow: none;
    -webkit-backdrop-filter: none; backdrop-filter: none; }
  body.hubpage header .glogo { display: none; }
  body.hubpage header .hcol { display: none; }
  .hub { min-height: calc(100vh - 120px); display: flex; flex-direction: column;
    align-items: center; justify-content: center; padding: 24px 20px 64px; }
  .hub-logo { font-size: clamp(46px, 8.5vw, 76px); user-select: none; margin-bottom: 52px; }
  .hub-logo .glogo { cursor: pointer; }
  /* повторный вход за сессию - интро выключено (apple-аудит §1). Гасим ТОЛЬКО
     анимацию: конечное состояние теперь базовое (см. .hubbtn/.hub-tag ниже),
     поэтому transform не переопределяем и :hover/:active остаются живыми.
     Клик по логотипу снимает no-intro (app.js) - реплей анимации работает. */
  .hub.no-intro .hubbtn, .hub.no-intro .hub-tag { animation: none; }
  .hub.no-intro .glogo.anim .gl-br, .hub.no-intro .glogo.anim .gl-word,
  .hub.no-intro .glogo.anim .gl-suffix, .hub.no-intro .glogo.anim .gl-dot { animation: none; }
  .hub-tag { font-family: var(--mono); font-size: 13px; color: var(--mut);
    letter-spacing: .06em; margin: 20px 0 40px;
    animation: hubfade .7s ease 1.15s backwards; }
  .hub-nav { display: flex; flex-direction: column; gap: 10px; width: 100%; max-width: 520px; }
  .hubbtn { position: relative; display: flex; align-items: center; gap: 16px;
    padding: 17px 24px; border-radius: 18px; text-decoration: none; color: var(--ink);
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.68);
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.92);
    transition: transform .22s cubic-bezier(.3,.7,.3,1), box-shadow .22s;
    /* конечное состояние - БАЗОВОЕ, въезд описан в keyframes «from».
       С forwards заливка анимации перебивала :hover/:active (подъём и сжатие
       не работали вообще); backwards держит стартовый кадр только на задержке. */
    animation: hubin .55s cubic-bezier(.25,.8,.3,1) calc(.55s + var(--i, 0) * 90ms) backwards; }
  .hubbtn:hover { transform: translateY(-2px); box-shadow: var(--shadow-float), inset 0 1px 0 rgba(255,255,255,.95); }
  .hubbtn:active { transform: translateY(0) scale(.995); }
  .hubbtn:focus-visible { outline: none; box-shadow: var(--ring), var(--shadow-panel); }
  .hb-name { position: relative; font-size: 17px; font-weight: 600; letter-spacing: -.01em; }
  .hb-name::before { content: "["; position: absolute; left: -15px; opacity: 0;
    font-weight: 400; color: var(--mut); transform: translateX(5px); transition: opacity .2s, transform .2s; }
  .hb-name::after { content: "]"; position: absolute; right: -15px; opacity: 0;
    font-weight: 400; color: var(--mut); transform: translateX(-5px); transition: opacity .2s, transform .2s; }
  a.hubbtn:hover .hb-name::before, a.hubbtn:hover .hb-name::after { opacity: 1; transform: translateX(0); }
  .hb-name { white-space: nowrap; }
  .hb-meta { font-family: var(--mono); font-size: 11px; color: var(--mut); letter-spacing: .02em;
    margin-left: auto; white-space: nowrap; }
  @media (max-width: 700px) {
    .hb-meta { display: none; }
    .hb-arrow { margin-left: auto; }
    .hubbtn.off .hb-soon { margin-left: auto; }
  }
  .hb-arrow { font-family: var(--mono); font-size: 16px; color: var(--ghost);
    transition: color .2s, transform .2s; }
  a.hubbtn:hover .hb-arrow { color: var(--ink); transform: translateX(4px); }
  .hubbtn.off { pointer-events: none; }
  .hubbtn.off .hb-name, .hubbtn.off .hb-meta { color: var(--ghost); }
  .hubbtn.off { background: rgba(255,255,255,.32); border-style: dashed; border-color: rgba(11,11,13,.1);
    box-shadow: none; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
  .hb-soon { font-family: var(--mono); font-size: 10px; color: var(--ghost); letter-spacing: .08em;
    text-transform: uppercase; padding: 3px 9px; border: 1px dashed rgba(11,11,13,.16); border-radius: 999px; }
  @keyframes hubin { from { opacity: 0; transform: translateY(14px); } }
  @keyframes hubfade { from { opacity: 0; } }

  /* ---------- вход ---------- */
  body.loginpage { display: flex; align-items: center; justify-content: center; min-height: 100vh; }
  .logincard { width: 384px; max-width: 90vw; padding: 40px 36px 32px; text-align: center;
    background: linear-gradient(160deg, var(--glass2), var(--glass));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.68); border-radius: 24px;
    box-shadow: var(--shadow-float), inset 0 1px 0 rgba(255,255,255,.92); }
  .logincard .glogo { font-size: 34px; }
  .login-sub { font-family: var(--mono); color: var(--mut); font-size: 12px; margin: 14px 0 26px;
    letter-spacing: .04em; }
  .login-err { color: var(--bad-tx); background: var(--bad-bg); border-radius: 10px;
    font-size: 13px; padding: 9px 12px; margin: 0 0 16px; }
  .loginform { display: flex; flex-direction: column; gap: 10px; margin: 0 0 6px; }
  .fld { font-family: inherit; font-size: 15px; padding: 12px 14px;
    border: 1px solid var(--bd); border-radius: 12px; background: rgba(255,255,255,.72); color: var(--ink); }
  .fld::placeholder { color: var(--ghost); }
  .fld:focus { outline: none; border-color: var(--bd2); box-shadow: var(--ring); }
  .btn { font-family: inherit; background: var(--ink); color: #fff; padding: 12px 22px;
    border: none; border-radius: 12px; font-size: 15px; font-weight: 500; cursor: pointer;
    transition: transform .15s, box-shadow .15s; box-shadow: 0 4px 12px -6px rgba(11,11,13,.35); }
  .btn:hover { transform: translateY(-1px); box-shadow: 0 14px 30px -10px rgba(11,11,13,.6); }
  .btn:active { transform: translateY(0) scale(.99); }
  .login-hint { font-family: var(--mono); color: var(--ghost); font-size: 11px; margin: 16px 0 0; }
  .tgwrap { margin-top: 8px; }
  /* «Войти через ВКонтакте» - обычная ссылка (чужого JS на странице входа нет).
     Фирменный синий ВК, чтобы кнопку узнавали, но форма та же, что у остальных
     элементов входа. */
  .vkbtn { display: inline-flex; align-items: center; justify-content: center;
    gap: 8px; margin-top: 10px; padding: 11px 18px; border-radius: var(--r-ctl);
    background: #07f; color: #fff; text-decoration: none; font-size: 14px;
    font-weight: 500; transition: filter .15s; }
  .vkbtn:hover { filter: brightness(1.08); }
  .vkbtn:active { filter: brightness(.94); }

  /* ---------- кастомные контролы (enhance.js): селект + календарь ----------
     Нативные контролы скрыты (источник истины), поверх - стеклянный UI. */
  .selx, .datex { display: inline-block; position: relative; }
  .selx-native, .datex-native { display: none !important; }
  .selx-btn { text-align: left; display: inline-flex; align-items: center; max-width: 220px; }
  .selx-btn .selx-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .selx-menu, .datex-cal { position: fixed; z-index: 320;
    background: linear-gradient(165deg, rgba(255,255,255,.95), rgba(255,255,255,.82));
    -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    border: 1px solid rgba(255,255,255,.7);
    box-shadow: var(--shadow-float), inset 0 1px 0 rgba(255,255,255,.9); }
  .selx-menu { min-width: 132px; max-height: 264px; overflow-y: auto; padding: 6px;
    border-radius: 12px; display: flex; flex-direction: column; gap: 2px; }
  .selx-opt { display: flex; align-items: center; gap: 8px; padding: 7px 10px;
    border: none; background: none; border-radius: 8px; cursor: pointer;
    font-family: inherit; font-size: 13px; color: var(--ink); text-align: left; white-space: nowrap; }
  .selx-opt:hover { background: rgba(11,11,13,.06); }
  .selx-opt.on { font-weight: 600; }
  /* выбранный пункт помечаем жирной чёрной точкой */
  .selx-opt.on::after { content: "\25CF"; margin-left: auto; padding-left: 14px; color: var(--ink); font-size: 9px; line-height: 1; }
  .selx-optlbl { overflow: hidden; text-overflow: ellipsis; }
  .selx-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ghost); flex: none; }
  .selx-opt.st-new .selx-dot { background: #5560c8; }
  .selx-opt.st-in_progress .selx-dot { background: #c08a1a; }
  .selx-opt.st-review .selx-dot { background: #8a4fc0; }
  .selx-opt.st-on_moderation .selx-dot { background: #5560c8; }
  .selx-opt.st-shipped_upc .selx-dot { background: #b45309; }
  .selx-opt.st-done .selx-dot { background: #2a9c68; }
  .selx-opt.st-closed .selx-dot { background: var(--mut); }
  /* календарь: чёрно-белый liquid glass */
  .datex-btn { display: inline-flex; align-items: center; gap: 6px; text-align: left; cursor: pointer; }
  .datex-btn .datex-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .datex-btn.empty .datex-label { color: var(--ghost); }
  .datex-btn .datex-ic { margin-left: auto; color: var(--ink2); line-height: 0; flex: none; }
  .datex-btn .datex-ic svg { width: 15px; height: 15px; display: block; }
  .datex-cal { width: 246px; padding: 12px; border-radius: 14px; }
  .datex-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
  .datex-title { font-size: 13px; font-weight: 600; }
  .datex-nav { border: none; background: none; cursor: pointer; font-size: 20px; line-height: 1;
    color: var(--ink2); width: 28px; height: 28px; border-radius: 8px; }
  .datex-nav:hover { background: rgba(11,11,13,.06); color: var(--ink); }
  .datex-wd { display: grid; grid-template-columns: repeat(7,1fr); gap: 2px; margin-bottom: 4px; }
  .datex-wd span { text-align: center; font-family: var(--mono); font-size: 10px;
    color: var(--ghost); text-transform: uppercase; letter-spacing: .02em; }
  .datex-grid { display: grid; grid-template-columns: repeat(7,1fr); gap: 2px; }
  .datex-day { border: none; background: none; cursor: pointer; font-family: inherit; font-size: 12.5px;
    color: var(--ink); height: 30px; border-radius: 8px; display: flex; align-items: center;
    justify-content: center; padding: 0; }
  .datex-day.empty { visibility: hidden; cursor: default; }
  .datex-day:hover:not(.empty) { background: rgba(11,11,13,.07); }
  .datex-day.today { box-shadow: inset 0 0 0 1px var(--bd2); }
  .datex-day.on { background: var(--ink); color: #fff; font-weight: 600; box-shadow: none; }
  /* диапазон в широком календаре Селектора */
  .datex-day.in-range { background: var(--bg2); border-radius: 0; }
  .datex-day.range-end2 { background: var(--ink); color: #fff; font-weight: 600; box-shadow: none; }
  .datex-day.disabled { color: var(--ghost); cursor: default; pointer-events: none; }
  .datex-day.disabled:hover { background: none; }
  .datex-foot { display: flex; justify-content: space-between; margin-top: 8px;
    border-top: 1px solid var(--bd); padding-top: 8px; }
  .datex-today, .datex-clear { border: none; background: none; cursor: pointer;
    font-family: var(--mono); font-size: 11px; color: var(--mut); padding: 3px 6px; border-radius: 6px; }
  .datex-today:hover, .datex-clear:hover { color: var(--ink); background: rgba(11,11,13,.05); }
  /* степпер числа (колонка «Правки»): стрелки ВНУТРИ поля справа (вверх сверху /
     вниз снизу), нативный спиннер убран */
  .numx { position: relative; display: inline-block; vertical-align: middle; }
  .numx input { padding-right: 20px; -moz-appearance: textfield; appearance: textfield; }
  .numx input::-webkit-outer-spin-button, .numx input::-webkit-inner-spin-button {
    -webkit-appearance: none; margin: 0; }
  .numx .revnum { width: 58px; text-align: center; }
  .numx-btns { position: absolute; top: 2px; bottom: 2px; right: 4px;
    display: flex; flex-direction: column; justify-content: center; }
  .numx-btn { border: none; background: none; cursor: pointer; color: var(--mut);
    padding: 0; width: 15px; height: 11px; border-radius: 3px; line-height: 0;
    display: flex; align-items: center; justify-content: center; }
  .numx-btn:hover { color: var(--ink); background: rgba(11,11,13,.08); }
  .numx-btn:active { transform: scale(.85); }
  .numx-btn svg { width: 11px; height: 11px; display: block; }

  /* ---------- Действия по релизу (кнопки/чипы в модалке «Действия») ---------- */
  /* статус релиза - цветной чип по группе статуса */
  .rel-st { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px;
    font-weight: 500; white-space: nowrap; background: rgba(11,11,13,.06); color: var(--ink2);
    text-transform: none; }
  .rel-st.submitted, .rel-st.on_review,
  .rel-st.contract_signed, .rel-st.delivering { background: var(--info-bg); color: var(--info-tx); }
  .rel-st.needs_changes, .rel-st.awaiting_payment { background: var(--warn-bg); color: var(--warn-tx); }
  .rel-st.paid, .rel-st.live { background: var(--ok-bg); color: var(--ok-tx); }
  .rel-st.rejected, .rel-st.failed, .rel-st.removed_from_platforms,
  .rel-st.cancelled_by_user { background: var(--bad-bg); color: var(--bad-tx); }
  /* действия по релизу */
  .mod-actform { display: inline; margin: 0; }
  .mbtn { display: inline-block; padding: 5px 11px; margin: 2px 3px 2px 0; border: 1px solid var(--bd2);
    border-radius: 9px; background: #fff; color: var(--ink); font: inherit; font-size: 12px;
    font-weight: 500; cursor: pointer; white-space: nowrap; text-decoration: none; }
  .mbtn:hover { background: rgba(11,11,13,.05); transform: translateY(-1px);
    box-shadow: 0 3px 10px -4px rgba(11,11,13,.25); }
  .mbtn { transition: background-color .15s ease, transform .15s ease, box-shadow .15s ease; }
  .mbtn:active { transform: none; box-shadow: none; }
  .mbtn.approve, .mbtn.paid { border-color: rgba(29,111,66,.4); color: var(--ok-tx); }
  .mbtn.approve:hover, .mbtn.paid:hover { background: var(--ok-bg); }
  .mbtn.danger { border-color: rgba(176,42,42,.4); color: var(--bad-tx); }
  .mbtn.danger:hover { background: var(--bad-bg); }
  /* чёрная кнопка-ссылка (напр. «В чат клиента» в папке «Договора») */
  .mbtn.edit { background: var(--ink); color: #fff; border-color: var(--ink); }
  .mbtn.edit:hover { background: #000; }
  .mbtn:disabled { opacity: .5; cursor: default; }
  /* выбор типа договора (физлицо/самозанятый/ИП) при «Сформировать» */
  /* owner 2026-08-23 п.3: строкам контролов договора тесно - row-gap больше
     колоночного, у вложенных наборов (std/custom) те же отступы */
  .ctype-form { display: flex; align-items: center; gap: 12px 10px; flex-wrap: wrap; margin: 4px 0 2px; }
  /* :not([hidden]) обязателен: голый display:contents перебил бы UA-правило
     [hidden]{display:none} и скрытый набор контролов остался бы видимым */
  .ctype-form .ctr-std:not([hidden]), .ctype-form .ctr-custom:not([hidden]) { display: contents; }
  .ctype-lbl { display: inline-flex; align-items: center; gap: 7px; font-size: 12px; color: var(--ink2); }
  .ctype-sel { font: inherit; font-size: 12px; padding: 5px 9px; border: 1px solid var(--bd2);
    border-radius: 8px; background: #fff; color: var(--ink); cursor: pointer; }
  /* enhance.js подменяет селекты модалки кастомной кнопкой (.selx-btn берёт
     стили .sel - они крупнее): возвращаем размер поля модалки. По просьбе
     владельца на этих полях БЕЗ стрелки - глушим шеврон .sel
     (background-image:none), правый отступ под него не резервируем. */
  .ctype-lbl .selx-btn { font-size: 12px; padding: 5px 9px; background-image: none; }
  /* проценты договора по заявке (owner 2026-08-22): узкие поля в форме
     «Сформировать» - % артисту / % лейблу */
  .pct-inp { width: 52px; font: inherit; font-size: 12px; padding: 5px 7px;
    border: 1px solid var(--bd2); border-radius: 8px; background: #fff;
    color: var(--ink); text-align: center; }
  .pct-inp:focus { outline: none; border-color: #7fb4d6; }
  /* apple-аудит §16: невалидный ввод не глотается молча - красная рамка */
  .pct-inp.bad { border-color: #c93a30; background: rgba(201,58,48,.05); }
  /* Busy-оверлей (owner батч п.5): «процесс идёт» поверх всего - спиннер +
     текст, блокирует клики на время долгих действий (генерация договора и др.) */
  .busy-overlay { position: fixed; inset: 0; z-index: 400; display: flex;
    align-items: center; justify-content: center;
    background: rgba(11,11,13,.38); backdrop-filter: blur(2px);
    animation: actmfade .18s ease; }
  .busy-box { display: flex; align-items: center; gap: 12px; padding: 16px 22px;
    background: var(--panel, #fff); border-radius: 14px;
    box-shadow: 0 18px 50px -12px rgba(11,11,13,.45);
    font-size: 13.5px; font-weight: 500; color: var(--ink); }
  /* Выход из затянувшегося действия: появляется через 8с, не при каждом
     показе оверлея - иначе кнопка мигала бы на обычных операциях. */
  .busy-cancel { margin-left: 6px; padding: 6px 12px; border-radius: 9px;
    border: 1px solid var(--bd, #e3e3e8); background: transparent;
    font: inherit; font-size: 12.5px; color: var(--ink); cursor: pointer;
    transition: background .15s ease, transform .08s ease;
    animation: actmfade .2s ease; }
  .busy-cancel:hover { background: var(--hover, rgba(11,11,13,.05)); }
  .busy-cancel:hover:active { transform: scale(.97); transition-duration: 80ms; }
  .busy-cancel:focus-visible { outline: 2px solid var(--acc, #0b0b0d);
    outline-offset: 2px; }
  /* спиннер в скобках - как логотип «[блок]» (owner 2026-08-23) */
  .busy-logo { display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0; }
  .busy-br { font-size: 22px; font-weight: 700; line-height: 1; color: var(--ink);
    transform: translateY(-1px); user-select: none; }
  .busy-spin { width: 16px; height: 16px; flex-shrink: 0; border-radius: 50%;
    border: 2.5px solid var(--bd2); border-top-color: var(--ink);
    animation: busyspin .7s linear infinite; }
  @keyframes busyspin { to { transform: rotate(360deg); } }
  /* поиск + фильтры списка диалогов (owner батч п.6) */
  .conv-search { padding: 8px 10px 4px; border-bottom: 1px solid var(--bd);
    display: flex; flex-direction: column; gap: 6px; }
  .conv-search .fsearch { width: 100%; box-sizing: border-box; }
  .conv-search-row { display: flex; gap: 6px; }
  /* enhance.js прячет native select и ставит .selx-обёртку - флексуем ЕЁ
     (аудит: правило на .fsel применялось к скрытому селекту и не работало) */
  .conv-search-row .fsel, .conv-search-row .selx { flex: 1; min-width: 0; }
  .conv-search-row .selx .selx-btn { width: 100%; justify-content: space-between; }
  /* кликабельные аватарки/ФИО в «Сообщениях» (owner батч п.7) */
  .avlink { cursor: pointer; }
  .avlink:hover { filter: brightness(1.07); }
  /* файл подписанного договора в колонке «Договор» (owner 2026-08-22 п.2) */
  .contract-dl { display: inline-flex; align-items: center; justify-content: center;
    width: 22px; height: 22px; margin-left: 4px; border-radius: 6px;
    color: var(--ink2); vertical-align: middle; transition: background-color .15s ease; }
  .contract-dl svg { width: 14px; height: 14px; }
  .contract-dl:hover { background: rgba(11,11,13,.07); color: var(--ink); }
  /* бар привязки индивидуального шаблона к клиенту - сразу под шапкой модалки */
  .actmodal-bind { padding: 9px 16px; border-bottom: 1px solid var(--bd);
    background: var(--bg2); }
  .actmodal-bind .mod-actform { display: flex; align-items: center; gap: 8px;
    flex-wrap: wrap; }
  /* звёздочка «индивидуальный договор» у ФИО клиента (везде).
     flex-shrink:0 - в списке диалогов и инбоксе «Договора» имя обрезается
     многоточием, и звезда пропадала бы вместе с хвостом имени (аудит). */
  .indiv-star { color: #d29a1e; font-size: .92em; cursor: default;
    margin-left: 3px; flex-shrink: 0; }
  /* закреплённый за клиентом процент договора - бейдж «90/10» рядом с именем */
  .rsplit { display: inline-block; padding: 1px 7px; border-radius: 999px;
    border: 1px solid var(--bd2); background: rgba(11,11,13,.04);
    font-size: 11px; font-weight: 600; color: var(--ink2); cursor: default;
    vertical-align: 1px; white-space: nowrap; }
  /* инбокс «Договора»: имя усекается, звезда и ник - отдельными флекс-детьми */
  .ci-name { display: flex; align-items: center; gap: 0; min-width: 0; }
  .ci-nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    min-width: 0; }
  .ci-art { flex-shrink: 100; overflow: hidden; text-overflow: ellipsis;
    white-space: nowrap; margin-left: 4px; }
  /* дропдаун на время запроса (app.js ставит disabled на нативный select) */
  .selx.busy .selx-btn { opacity: .55; cursor: progress; }
  /* счета-услуги в модалке: каждый - своим блоком, иначе кнопки одного счёта
     липнут к строке следующего */
  .svc-inv + .svc-inv { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--bd); }

  /* ---------- Раздел «Документы» ---------- */
  .doc-h { font-size: 17px; font-weight: 650; letter-spacing: -.01em; margin: 22px 0 6px; }
  .doc-note { font-size: 12.5px; margin-bottom: 12px; max-width: 660px; }
  .doc-err { background: var(--bad-bg); color: var(--bad-tx); border: 1px solid rgba(176,42,42,.3);
    border-radius: 10px; padding: 9px 13px; margin: 12px 0; font-size: 13px; }
  .doc-tpls { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; }
  .doc-tpl { border: 1px solid var(--bd); border-radius: 14px; padding: 14px; background: var(--glass); }
  .doc-tpl-h { font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
  /* 4-я плитка «Создать новый шаблон» - серая с пунктирной обводкой */
  .doc-tpl-new { border: 1.5px dashed var(--bd2); background: rgba(11,11,13,.02);
    display: flex; flex-direction: column; gap: 8px; margin: 0; }
  .doc-tpl-new-plus { font-size: 26px; line-height: 1; color: var(--mut); text-align: center; }
  .doc-tpl-new-t { font-weight: 600; font-size: 14px; text-align: center; margin-bottom: 4px; color: var(--ink2); }
  .doc-up { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 8px 0; }
  .doc-file { font-size: 12px; max-width: 100%; }
  .doc-vers { margin-top: 8px; display: flex; flex-direction: column; gap: 2px; }
  .doc-file-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 6px 0; border-top: 1px solid var(--bd); }
  .doc-name { color: var(--ink); text-decoration: none; border-bottom: 1px dashed var(--bd2); font-size: 13px; word-break: break-all; }
  .doc-name:hover { color: var(--info-tx); }
  .doc-badge-on { font-size: 11px; color: var(--ok-tx); background: var(--ok-bg); border-radius: 999px; padding: 2px 9px; }
  .doc-inline { display: inline; margin: 0; }
  .doc-newfolder { display: flex; gap: 8px; flex-wrap: wrap; margin: 6px 0 16px; }
  .doc-folder { border: 1px solid var(--bd); border-radius: 14px; padding: 14px; margin-bottom: 12px; background: var(--glass); }
  .doc-folder-h { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-weight: 600; margin-bottom: 6px; }
  .doc-folder-name { font-size: 14px; }
  /* файловый менеджер (папки-плитки + файлы-строки, как в я.диске/битрикс) */
  .doc-vis-badge { font-size: 11px; color: var(--ink2); background: rgba(11,11,13,.05); border-radius: 999px; padding: 2px 10px; }
  .fm-crumbs { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 6px 0 12px; font-size: 14px; }
  .fm-crumbs a { color: var(--ink2); text-decoration: none; }
  .fm-crumbs a:hover { color: var(--ink); }
  .fm-crumb-sep { color: var(--ghost); }
  .fm-crumb-cur { font-weight: 600; }
  .fm-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 10px; margin-bottom: 14px; }
  .fm-folder { display: flex; flex-direction: column; gap: 4px; padding: 14px; border: 1px solid var(--bd);
    border-radius: 14px; background: var(--glass); text-decoration: none; color: var(--ink); transition: background .15s, border-color .15s; }
  .fm-folder:hover { background: rgba(11,11,13,.03); border-color: var(--bd2); }
  .fm-folder-ic { color: var(--ink2); }
  .fm-folder-name { font-weight: 600; font-size: 13.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .fm-folder-meta { font-size: 11.5px; color: var(--mut); }
  .fm-files { display: flex; flex-direction: column; margin-bottom: 12px; border: 1px solid var(--bd); border-radius: 12px; overflow: hidden; }
  .fm-file { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-top: 1px solid var(--bd); }
  .fm-file:first-child { border-top: none; }
  .fm-ext { flex: none; font-size: 10px; font-weight: 700; letter-spacing: .3px; color: var(--ink2);
    background: rgba(11,11,13,.06); border-radius: 6px; padding: 3px 6px; min-width: 42px; text-align: center; }
  .fm-fname { flex: 1; min-width: 0; color: var(--ink); text-decoration: none; font-size: 13px; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap; border-bottom: 1px dashed var(--bd2); }
  .fm-fname:hover { color: var(--info-tx); }
  .fm-size { flex: none; font-size: 11.5px; color: var(--mut); font-family: var(--mono); }
  .fm-empty { padding: 14px 12px; font-size: 13px; }
  .fm-uprow { margin-top: 4px; }
  .fm-newname { min-width: 220px; }

  /* ---------- Финансы -> «Выплаты» ---------- */
  .fin-head { display: flex; align-items: center; justify-content: space-between;
    gap: 14px; flex-wrap: wrap; margin-bottom: 16px; }
  .fin-sub { display: inline-flex; gap: 2px; align-items: center; flex-wrap: wrap; }
  .monthnav { display: inline-flex; align-items: center; gap: 3px; padding: 4px;
    background: var(--glass2); border: 1px solid var(--bd); border-radius: 999px;
    box-shadow: var(--shadow-panel); }
  .monthnav .mn-arrow { display: inline-flex; align-items: center; justify-content: center;
    width: 30px; height: 30px; border-radius: 999px; color: var(--ink2); text-decoration: none;
    font-size: 17px; line-height: 1; transition: background .15s, color .15s; }
  .monthnav .mn-arrow:hover { background: rgba(11,11,13,.06); color: var(--ink); }
  .monthnav .mn-arrow.off { color: var(--ghost); pointer-events: none; }
  .monthnav .mn-cur { display: inline-flex; align-items: center; justify-content: center;
    min-width: 150px; padding: 0 12px; height: 30px; font-weight: 500; font-size: 13px;
    text-transform: capitalize; }
  /* числовые колонки таблицы выплат - вправо, табличные цифры */
  table.pays td.num, table.pays th.num { text-align: right; font-variant-numeric: tabular-nums; }
  /* длинный заголовок «Премия за кол-во сотрудников» - в 2 строки, узкая колонка */
  table.pays thead th.thw { white-space: normal; max-width: 120px; line-height: 1.25; }
  table.pays td.pay-amt { font-weight: 600; font-family: var(--mono); }
  table.pays td.pct-none { color: var(--ghost); }
  .fin-cards { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 16px; align-items: flex-start; }
  .fin-card { flex: 1 1 260px; padding: 16px 18px; border-radius: var(--r-card);
    background: linear-gradient(170deg, rgba(255,255,255,.92), rgba(250,250,253,.84));
    border: 1px solid rgba(255,255,255,.7);
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.95); }
  .fin-card h4 { margin: 0 0 10px; font-family: var(--mono); font-size: 10.5px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .05em; color: var(--mut); }
  .fin-total { font-size: 26px; font-weight: 600; letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
  .fin-total .cur { font-size: 17px; font-weight: 500; color: var(--mut); margin-left: 3px; }
  .fin-sub2 { margin-top: 8px; font-size: 13px; color: var(--ink2); }
  .fin-sub2 b { font-variant-numeric: tabular-nums; }
  /* Селектор: KPI-плитки + таблица P&L */
  .kpi-row { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 16px; }
  .kpi { flex: 1 1 180px; padding: 14px 16px; border-radius: var(--r-card);
    background: var(--glass); backdrop-filter: var(--blur); -webkit-backdrop-filter: var(--blur);
    border: 1px solid var(--bd); }
  .kpi-l { font-family: var(--mono); font-size: 10.5px; font-weight: 500; text-transform: uppercase;
    letter-spacing: .05em; color: var(--mut); }
  .kpi-v { margin-top: 6px; font-size: 22px; font-weight: 600; letter-spacing: -.02em;
    font-variant-numeric: tabular-nums; }
  .kpi-v .cur { font-size: 14px; font-weight: 500; color: var(--mut); margin-left: 2px; }
  .kpi-v.neg { color: var(--bad-tx); }
  .kpi-v.pos { color: var(--ok-tx); }
  .kpi-s { margin-top: 3px; font-size: 12px; }
  .pnl { width: 100%; border-collapse: collapse; font-size: 13.5px; }
  .pnl td { padding: 7px 0; border-bottom: 1px solid var(--bd); }
  .pnl td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
  .pnl tr:last-child td { border-bottom: none; }
  .pnl .minus td { color: var(--ink2); }
  .pnl .sum td { font-weight: 600; border-top: 1px solid var(--bd2); }
  .pnl .total td { font-size: 15px; }
  .pnl .num.neg { color: var(--bad-tx); }
  /* Селектор: раскрытие направления -> заказы (нативный <details>, без JS) */
  .dir { border-bottom: 1px solid var(--bd); }
  .dir > summary { display: flex; justify-content: space-between; gap: 12px; align-items: baseline;
    padding: 7px 0; cursor: pointer; font-size: 13px; list-style: none; }
  .dir > summary::-webkit-details-marker { display: none; }
  .dir > summary::marker { content: ""; }
  .dir-caret { color: var(--ghost); font-size: 10px; display: inline-block; transition: transform .15s; }
  .dir[open] > summary { font-weight: 500; }
  .dir[open] .dir-caret { transform: rotate(180deg); }
  .dir .fin-orders { padding: 0 0 8px; }
  .dir-empty { display: flex; justify-content: space-between; gap: 12px; padding: 7px 0;
    font-size: 13px; color: var(--mut); border-bottom: 1px solid var(--bd); }
  /* Селектор: панель периода (пресеты + широкий календарь-диапазон) */
  .selctl { display: flex; flex-wrap: wrap; gap: 8px 10px; align-items: center; }
  /* wrap: семь кнопок периода (Сегодня...Год) в одну строку не влезают на
     телефоне и растягивали страницу вбок - ручной прогон, этап 5 (390 px:
     полоса 425 px в теле 390). Пилюля переносится, форма сохраняется. */
  .presets { display: inline-flex; flex-wrap: wrap; gap: 2px; padding: 3px;
    border-radius: 999px; max-width: 100%;
    background: var(--glass); border: 1px solid var(--bd); }
  .preset { padding: 6px 14px; border-radius: 999px; font-size: 12.5px; color: var(--ink2);
    text-decoration: none; cursor: pointer; white-space: nowrap; }
  .preset:hover { color: var(--ink); }
  .preset.act { background: var(--ink); color: #fff; font-weight: 500; }
  .rangepicker { display: inline-flex; align-items: center; gap: 8px; padding: 7px 14px;
    border: 1px solid var(--bd); border-radius: 999px; background: var(--glass);
    backdrop-filter: var(--blur); -webkit-backdrop-filter: var(--blur);
    font: inherit; font-size: 13px; color: var(--ink); cursor: pointer; }
  .rangepicker:hover { border-color: var(--bd2); }
  .rp-caret { color: var(--ghost); font-size: 10px; }
  /* широкий поповер: 3 месяца в ряд */
  .rcal { position: fixed; z-index: 60; padding: 16px 18px; border-radius: var(--r-card);
    /* apple-аудит §12: 78% белого над стеклом - цифры просвечивали в сетку дней */
    background: linear-gradient(165deg, rgba(255,255,255,.95), rgba(255,255,255,.87)) !important;
    background: var(--glass2); backdrop-filter: var(--blur); -webkit-backdrop-filter: var(--blur);
    border: 1px solid var(--bd); box-shadow: 0 20px 50px -16px rgba(11,11,13,.35); }
  .rcal-months { display: flex; flex-wrap: nowrap; align-items: flex-start; gap: 32px; }
  .rcal-m { width: 210px; flex: none; }
  .rcal-title { text-align: center; font-size: 13px; font-weight: 500; margin-bottom: 8px; }
  .rcal-nav { flex: none; align-self: center; border: none; background: none; cursor: pointer;
    color: var(--ink2); width: 30px; height: 30px; border-radius: 8px; font-size: 18px; }
  .rcal-nav:hover { background: rgba(11,11,13,.06); color: var(--ink); }
  .rcal-nav.off { color: var(--ghost); cursor: default; pointer-events: none; }
  .rcal-foot { display: flex; justify-content: space-between; align-items: center; gap: 14px;
    margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--bd); }
  .rcal-range { display: inline-flex; align-items: center; gap: 8px; }
  .rcal-in { font-size: 13px; font-variant-numeric: tabular-nums; padding: 6px 10px;
    border: 1px solid var(--bd); border-radius: var(--r-ctl); background: var(--glass); min-width: 92px; text-align: center; }
  .rcal-dash { color: var(--mut); }
  .rcal-apply { height: 34px; }
  @media (max-width: 900px) { .rcal-months { flex-wrap: wrap; justify-content: center; } }
  /* Селектор: подразделы (Обзор/Продажи/Реклама/Расходы/Отчёты) */
  .secnav { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
  .secpill { padding: 8px 18px; border-radius: 999px; font-size: 13px; color: var(--ink2);
    text-decoration: none; background: var(--glass); border: 1px solid var(--bd);
    backdrop-filter: var(--blur); -webkit-backdrop-filter: var(--blur); }
  .secpill:hover { color: var(--ink); border-color: var(--bd2); }
  .secpill.act { background: var(--ink); border-color: var(--ink); color: #fff; font-weight: 500; }
  /* Селектор: СКВОЗНЫЕ цвета сущностей (валидированная палитра, см. reports.py:
     сущность держит один цвет во всех подразделах - KPI/донаты/графики/точки) */
  :root { --c-dist: #3B6FD4; --c-mix: #1D6F42; --c-promo: #B45309; --c-other: #6B7280;
          --c-fot: #6D4FC4; --c-ins: #9B85DC; --c-ads: #0E7FA8; --c-exp: #A84E68; }
  /* сетка карточек подразделов: grid вместо flex - разные высоты не наезжают */
  .cards-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: 14px; margin-top: 16px; align-items: stretch; }
  .cards-grid > .fin-card { min-width: 0; }
  .fin-card.mt { margin-top: 14px; }
  .dtl-wrap { overflow-x: auto; }
  /* Прайс-лист («Финансы» -> «Цены») */
  .prices td { vertical-align: top; }
  .prc-note { font-size: 12px; margin-top: 2px; }
  .prc-plan { font-size: 12px; margin-top: 4px; color: var(--c-promo); }
  .prc-formrow > td { background: var(--glass2); }
  .prc-hist { margin-top: 10px; width: 100%; }
  .prc-hist .dtl-h td { font-size: 12px; }
  .prc-edit { padding: 5px 12px; font-size: 13px; }
  .prc-manual { font-size: 11px; color: var(--ink2); border: 1px solid var(--bd2);
    border-radius: 999px; padding: 1px 7px; white-space: nowrap; }
  /* Состав пакета: услуга + поле количества */
  .pkg-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 8px 16px; margin: 10px 0 4px; }
  .pkg-item { display: flex; align-items: center; justify-content: space-between;
    gap: 10px; font-size: 13.5px; border: 1px solid var(--bd2);
    border-radius: 10px; padding: 6px 10px; }
  .pkg-item input { width: 72px; }
  /* Суммы в разделах «Заявки» (видит только владелец/директор) */
  td.money { font-variant-numeric: tabular-nums; white-space: nowrap; }
  .money-src { font-size: 11px; line-height: 1.2; }
  .money-due { color: var(--warn, #8a6d1f); }
  /* Маржа направления рядом с выручкой (Селектор -> Обзор) */
  .dir-margin { display: inline-block; margin-left: 10px; font-size: 12px;
    font-weight: 500; color: var(--mut, #6b7280); white-space: nowrap; }

  /* «Финансы» -> «Селектор» -> План: выполнение и сетка правки */
  .planfact-h { font-size: 15px; font-weight: 650; margin: 0 0 10px; }
  .planhead { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
  .planyears { display: flex; gap: 6px; }
  table.plantbl td.pf-bar { width: 140px; padding-right: 0; }
  .pf-bar { position: relative; }
  .pf-bar::after { content: ""; position: absolute; left: 0; right: 0; top: 50%;
    transform: translateY(-50%); height: 6px; border-radius: 3px;
    background: var(--line, #e6e6ea); }
  .pf-fill { position: absolute; left: 0; top: 50%; transform: translateY(-50%);
    height: 6px; border-radius: 3px; z-index: 1; }
  .pf-hi { color: #1D6F42; }
  .pf-mid { color: #A46A0C; }
  .pf-lo { color: #B02A2A; }
  span.pf-fill.pf-hi { background: #1D6F42; }
  span.pf-fill.pf-mid { background: #A46A0C; }
  span.pf-fill.pf-lo { background: #B02A2A; }

  /* Тумблер «План»: стоит РЯДОМ с плашками бизнес-показателей и включает план
     сразу в двух местах - строкой внутри каждой плашки и таблицей под ними.
     Чекбокс настоящий и скрыт визуально: показ делает CSS-соседний селектор,
     инлайн-скрипты запрещены CSP. Состояние помнит selector.js. */
  .planswt-in { position: absolute; width: 1px; height: 1px; opacity: 0;
    margin: 0; pointer-events: none; }
  .planswt-row { display: flex; align-items: center; gap: 10px;
    /* Сверху воздух по шагу секции (как margin-top у .secnav и .kpi-row):
       2px прижимали тумблер к ряду подразделов, и он читался их продолжением. */
    flex-wrap: wrap; margin: 20px 0 10px; }
  .planswt { display: inline-flex; align-items: center; gap: 8px;
    cursor: pointer; font-size: 13.5px; font-weight: 600; user-select: none; }
  .planswt-track { position: relative; flex: none; width: 38px; height: 22px;
    border-radius: 11px; background: var(--bg2); border: 1px solid var(--bd2);
    transition: background .15s ease, border-color .15s ease; }
  .planswt-knob { position: absolute; top: 2px; left: 2px; width: 16px;
    height: 16px; border-radius: 50%; background: #fff;
    box-shadow: 0 1px 2px rgba(11,11,13,.25); transition: transform .15s ease; }
  .planswt-in:checked ~ .planswt-row .planswt-track { background: var(--ink);
    border-color: var(--ink); }
  .planswt-in:checked ~ .planswt-row .planswt-knob { transform: translateX(16px); }
  .planswt-in:focus-visible ~ .planswt-row .planswt-track {
    outline: 2px solid var(--ink); outline-offset: 2px; }
  .planswt-note { font-size: 12.5px; }
  .kpi-plan, .planfact { display: none; }
  .planswt-in:checked ~ .kpi-row .kpi-plan { display: block; }
  .planswt-in:checked ~ .planfact { display: block; }
  .kpi-plan { margin-top: 8px; padding-top: 7px;
    border-top: 1px dashed var(--bd2); }
  .kpi-plan-top { display: flex; align-items: baseline; gap: 6px;
    font-size: 12.5px; flex-wrap: wrap; }
  .kpi-plan-l { color: var(--mut); }
  .kpi-plan-v { font-variant-numeric: tabular-nums; font-weight: 600;
    white-space: nowrap; }
  .kpi-plan .pf-bar { display: block; height: 6px; margin-top: 7px; }
  .plangrp td { font-size: 11.5px; text-transform: uppercase;
    letter-spacing: .04em; color: var(--ink2); background: var(--bg2);
    font-weight: 650; }
  .pfd { font-variant-numeric: tabular-nums; font-weight: 600; }
  .planlo { font-size: 11px; }
  @media (prefers-reduced-motion: reduce) {
    .planswt-track, .planswt-knob { transition: none; }
  }
  table.plangrid td { padding: 4px 6px; }
  .planinp { width: 92px; text-align: right; font-variant-numeric: tabular-nums; }
  .planinp.saving { opacity: .55; }
  .planinp.bad { border-color: #B02A2A; }

  /* Колонка «Промо»: ссылка на пресс-релиз + кружок готовности */
  .promo-cell { display: flex; align-items: center; gap: 6px; }
  td.col-promo { white-space: nowrap; }
  /* Страница пресс-релиза */
  .pr-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
  .pr-actions { display: flex; gap: 8px; }
  .pr-doc { margin-top: 14px; max-width: 720px; }
  .pr-title { font-size: 20px; font-weight: 650; letter-spacing: -0.01em; }
  .pr-meta { font-size: 13px; margin-top: 4px; }
  .pr-field { margin-top: 14px; }
  .pr-label { font-size: 12px; text-transform: uppercase; letter-spacing: .04em;
    color: var(--ink2); }
  .pr-value { margin-top: 2px; white-space: pre-wrap; }
  /* Пресс-релиз в модалке: тело прокручивается, кнопки закреплены снизу */
  .pr-body { padding: 16px 18px; overflow-y: auto; -webkit-overflow-scrolling: touch; }
  .pr-body .pr-doc { margin-top: 0; }
  .pr-foot { display: flex; justify-content: flex-end; gap: 8px;
    padding: 12px 18px; border-top: 1px solid var(--bd); background: var(--panel, #fff); }
  /* KPI: цветовой акцент слева + кликабельные плитки (сквозные переходы) */
  .kpi { border-left: 3px solid transparent; }
  a.kpi { display: block; color: inherit; text-decoration: none; }
  a.kpi:hover { border-color: var(--bd2); background: var(--glass2); }
  .kpi.kc-dist { border-left-color: var(--c-dist); }
  .kpi.kc-mix { border-left-color: var(--c-mix); }
  .kpi.kc-promo { border-left-color: var(--c-promo); }
  .kpi.kc-other { border-left-color: var(--c-other); }
  .kpi.kc-fot { border-left-color: var(--c-fot); }
  .kpi.kc-ins { border-left-color: var(--c-ins); }
  .kpi.kc-ads { border-left-color: var(--c-ads); }
  .kpi.kc-exp { border-left-color: var(--c-exp); }
  .kpi.kc-ink { border-left-color: var(--ink); }
  /* результат (good/bad) - цвет уходит в ФОН плитки, не в полоску слева */
  .kpi.kc-pos { background: var(--ok-bg); border-color: rgba(29,111,66,.22); }
  .kpi.kc-neg { background: var(--bad-bg); border-color: rgba(163,53,45,.22); }
  /* кликабельная плитка: чёрная полоса-аффорданс (перебивает цвет сущности и держится на ховере) */
  .kpi.kpi-link { border-left-color: var(--ink); border-left-width: 4px; cursor: pointer; }
  .kpi.kpi-link:hover { border-left-color: var(--ink); }
  /* цветовая точка сущности (легенды, строки направлений, таблицы) */
  .kdot { display: inline-block; width: 9px; height: 9px; border-radius: 3px;
    margin-right: 7px; vertical-align: 1px; flex: none; }
  /* тултип графиков (crosshair при наведении) */
  .ctip { position: fixed; z-index: 80; pointer-events: none; padding: 9px 12px;
    border-radius: 12px; background: rgba(22,22,26,.95); color: #fff; font-size: 12px;
    line-height: 1.55; box-shadow: 0 12px 30px -8px rgba(11,11,13,.5);
    max-width: 280px; display: none; }
  .ctip .tt-t { font-weight: 600; margin-bottom: 3px; }
  .ctip .tt-r { display: flex; align-items: center; gap: 7px; white-space: nowrap; }
  .ctip .tt-v { margin-left: auto; font-variant-numeric: tabular-nums; font-weight: 500;
    padding-left: 12px; }
  .chart .hover-col { fill: transparent; }
  .chart .hover-col.on { fill: rgba(11,11,13,.05); }
  .chart .cross { stroke: rgba(11,11,13,.35); stroke-width: 1; stroke-dasharray: 3 3; }
  .pnl .lnk, .dir .lnk2 { color: inherit; text-decoration: none; border-bottom: 1px dashed var(--bd2); }
  .pnl .lnk:hover, .dir .lnk2:hover { border-bottom-color: var(--ink); }
  /* Селектор: детальные таблицы («Продажи»/«Реклама»/«Расходы») */
  .dtl { width: 100%; border-collapse: collapse; font-size: 13px; }
  .dtl td { padding: 7px 8px 7px 0; border-bottom: 1px solid var(--bd); }
  .dtl td.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
  .dtl tr:last-child td { border-bottom: none; }
  .dtl .dtl-h td { font-family: var(--mono); font-size: 10px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .05em; color: var(--mut); }
  .dtl .dtl-sum td { font-weight: 600; border-top: 1px solid var(--bd2); }
  .dtl .adc { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* Селектор: воронка рекламы паблика */
  .funnel { display: flex; flex-direction: column; gap: 2px; margin-top: 4px; }
  .fstage { position: relative; height: 34px; display: flex; align-items: center; }
  .fbar { position: absolute; inset: 0 auto 0 0; border-radius: 9px; min-width: 6px;
    background: linear-gradient(90deg, rgba(11,11,13,.14), rgba(11,11,13,.06));
    border: 1px solid var(--bd); }
  .fstage .fl { position: relative; z-index: 1; margin-left: 10px; font-size: 12.5px; color: var(--ink2); }
  .fstage .fv { position: relative; z-index: 1; margin-left: auto; font-size: 13px;
    font-weight: 500; font-variant-numeric: tabular-nums; }
  .fcr { font-size: 11px; padding: 1px 0 1px 10px; }
  /* Селектор: формы «Реклама»/«Расходы» */
  .adsform .af-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; margin-top: 10px; }
  .adsform .af-row[hidden] { display: none; }
  .adsform .af-f { display: flex; flex-direction: column; gap: 5px; flex: 0 1 auto; }
  .adsform .af-f.grow { flex: 1 1 200px; }
  .adsform .af-f > span { font-family: var(--mono); font-size: 10px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .05em; color: var(--mut); }
  .adsform input[type="number"], .adsform input[type="text"] { height: 30px; padding: 0 10px;
    border: 1px solid var(--bd); border-radius: var(--r-ctl); background: rgba(255,255,255,.75);
    font: inherit; font-size: 13px; color: var(--ink); min-width: 0; width: 110px; }
  .adsform .af-f.grow input { width: 100%; }
  .adsform input:focus { outline: none; border-color: var(--bd2); }
  .adsform .af-save { height: 30px; margin: 0; }
  /* Селектор: фильтр «Отчётов» по категориям (логическим) */
  .rep-filter { display: flex; flex-wrap: wrap; gap: 8px; margin: 16px 0 4px; }
  .repcat { padding: 8px 18px; border-radius: 999px; font-size: 13px; color: var(--ink2);
    background: var(--glass); border: 1px solid var(--bd); cursor: pointer; font-family: inherit;
    backdrop-filter: var(--blur); -webkit-backdrop-filter: var(--blur); }
  .repcat:hover { color: var(--ink); border-color: var(--bd2); }
  .repcat.act { background: var(--ink); border-color: var(--ink); color: #fff; font-weight: 500; }
  .rep-group[hidden] { display: none; }
  .rep-h { display: flex; align-items: center; margin: 22px 0 2px; font-family: var(--mono);
    font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: .05em;
    color: var(--mut); }
  /* когда выбрана одна категория, её заголовок дублирует активную пилюлю - прячем */
  .rep-filtered .rep-h { display: none; }
  /* Селектор: сетка графиков («Отчёты», DataLens-стиль) */
  .charts-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 14px; margin-top: 16px; }
  .chart-card { padding: 16px 18px; border-radius: var(--r-card);
    background: linear-gradient(170deg, rgba(255,255,255,.92), rgba(250,250,253,.84));
    border: 1px solid rgba(255,255,255,.7);
    box-shadow: var(--shadow-panel), inset 0 1px 0 rgba(255,255,255,.95); }
  .chart-card.wide { margin-top: 16px; }
  .chart-card h4 { margin: 0 0 10px; font-family: var(--mono); font-size: 10.5px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .05em; color: var(--mut); }
  .chart { min-height: 150px; }
  .chart svg { display: block; width: 100%; height: auto; }
  .chart .cbar { fill: rgba(11,11,13,.55); }
  .chart .cbar.alt { fill: rgba(29,111,66,.5); }
  .chart .cbar:hover { fill: var(--ink); }
  .chart .cline { fill: none; stroke: rgba(11,11,13,.75); stroke-width: 2; }
  .chart .carea { fill: rgba(11,11,13,.08); stroke: none; }
  .chart .cline.alt { stroke: rgba(29,111,66,.75); }
  .chart .carea.alt { fill: rgba(29,111,66,.08); }
  .chart .cdot { fill: var(--ink); }
  .chart .cax { stroke: var(--bd2); stroke-width: 1; }
  .chart .clab { font-size: 9.5px; fill: var(--mut); font-family: var(--mono); }
  .chart .cval { font-size: 10px; fill: var(--ink2); font-variant-numeric: tabular-nums; }
  .chart-legend { display: flex; flex-wrap: wrap; gap: 6px 14px; margin-top: 10px; font-size: 12.5px; }
  .chart-legend .cl-i { display: inline-flex; align-items: center; gap: 7px; color: var(--ink2); }
  .chart-legend .cl-dot { width: 10px; height: 10px; border-radius: 3px; flex: none; }
  .chart-legend .cl-v { font-variant-numeric: tabular-nums; font-weight: 500; color: var(--ink); }
  .fin-leftover { margin: 0; padding: 0; list-style: none; font-size: 13px; }
  .fin-leftover li { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0;
    border-bottom: 1px solid var(--bd); color: var(--ink2); }
  .fin-leftover li:last-child { border-bottom: none; }
  .fin-leftover .lo-sum { font-variant-numeric: tabular-nums; white-space: nowrap; }
  .fin-warn { margin-top: 12px; padding: 9px 13px; border-radius: 12px; font-size: 12.5px;
    background: var(--warn-bg); color: var(--warn-tx); border: 1px solid rgba(138,90,11,.18); }
  .fin-note { margin-top: 16px; font-size: 12px; color: var(--mut); line-height: 1.55; max-width: 660px; }
  /* детализация заказов (кнопка «Заказов N») */
  .fin-detail { display: flex; flex-wrap: wrap; gap: 14px; padding: 4px 2px 8px; white-space: normal; }
  .fin-dir { flex: 1 1 280px; min-width: 260px; padding: 12px 14px; border-radius: 12px;
    background: rgba(255,255,255,.6); border: 1px solid var(--bd); }
  .fin-dir-h { display: flex; align-items: baseline; gap: 8px; margin-bottom: 8px; font-size: 13px; }
  .fin-dir-h .mut { font-size: 12px; }
  .fin-dir-h .lo-sum { margin-left: auto; font-weight: 500; }
  .fin-orders { margin: 0; padding: 0; list-style: none; font-size: 12.5px; }
  .fin-orders li { display: flex; align-items: baseline; gap: 10px; padding: 5px 0;
    border-top: 1px solid var(--bd); }
  .fin-orders .fo-t { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  .fin-orders .fo-d { font-size: 11.5px; white-space: nowrap; }
  /* редактор условий (кнопка «Условия») */
  .fin-terms { padding: 6px 2px 10px; white-space: normal; }
  .termform { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 12px; }
  .termform .resf { display: flex; flex-direction: column; gap: 5px; }
  .termform .resf > .sel, .termform .resf > .inp { min-width: 150px; }
  .termform .tsave { min-width: 0; }
  .termform .termsave { height: 30px; margin: 0; }
  .reschk { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px;
    color: var(--ink2); cursor: pointer; user-select: none; }
  .reschk input { width: 16px; height: 16px; accent-color: var(--ink); cursor: pointer; }
  /* «Облагается страховыми» - своя строка сразу под «Должностью» (не в общем ряду) */
  .termform .reschk { flex-basis: 100%; }
  /* колонка «Страховые»: галочка (облагается) + сумма/ИП, в одну строку справа */
  .inscell { display: inline-flex; align-items: center; gap: 7px; justify-content: flex-end;
    cursor: pointer; }
  .inscell input { width: 15px; height: 15px; accent-color: var(--ink); cursor: pointer; flex: none; }
  .inscell .insval { font-variant-numeric: tabular-nums; }
  .fin-terms .fin-note { margin-top: 10px; }
  .fin-hist { margin-top: 12px; max-width: 520px; }
  .fin-hist h4 { margin: 0 0 6px; font-family: var(--mono); font-size: 10.5px; font-weight: 500;
    text-transform: uppercase; letter-spacing: .05em; color: var(--mut); }
  .termdel { margin-left: 8px; padding: 0 4px; border: none; background: transparent;
    color: var(--ghost); font: inherit; font-size: 12px; cursor: pointer; border-radius: 5px; }
  .termdel:hover { color: var(--bad-tx); background: var(--bad-bg); }

  /* ---------- раздел «Сотрудники»: карточки персонала (owner 2026-07-23) ---------- */
  .btn-addstaff { font: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
    border: 0; border-radius: 999px; background: var(--ink); color: #fff; padding: 8px 16px; }
  .btn-addstaff:hover { background: var(--ink2); }
  .staffgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
    gap: 14px; margin-top: 14px; }
  .scard { display: flex; flex-direction: column; gap: 10px; padding: 14px 16px;
    background: var(--card, #fff); border: 1px solid var(--bd); border-radius: 14px; }
  .scard.off { opacity: .62; }
  .scard-top { display: flex; align-items: center; gap: 10px; cursor: pointer; border-radius: 10px; }
  .scard-top:hover .scard-name { text-decoration: underline; }
  .scard-main { min-width: 0; }
  .scard-name { font-weight: 700; font-size: 14.5px; display: flex; align-items: center; flex-wrap: wrap; gap: 2px; }
  .scard-sub { font-size: 12px; color: var(--mut); margin-top: 1px; }
  .scard-offbadge { display: inline-block; padding: 1px 8px; border-radius: 999px;
    background: var(--bad-bg); color: var(--bad-tx); font-size: 11px; font-weight: 600; }
  .scard-info { display: flex; flex-direction: column; gap: 3px; font-size: 12.5px; }
  .scard-row b { font-weight: 700; }
  .scard-money { margin-top: 4px; padding-top: 6px; border-top: 1px dashed var(--bd);
    display: flex; flex-direction: column; gap: 3px; }
  .scard-fotlink { color: var(--info-tx); text-decoration: none; font-weight: 600; }
  .scard-fotlink:hover { text-decoration: underline; }
  .scard-actions { display: flex; flex-wrap: wrap; gap: 5px; margin-top: auto; padding-top: 8px;
    border-top: 1px solid var(--bd); align-items: center; }
  .scard-actions form { display: inline; margin: 0; }
  /* компактнее, чтобы 4 кнопки (Написать/Поделиться/ФОТ/Изменить) влезали в один
     ряд и в узкой карточке, и в попапе - без второго ряда (owner 2026-07-23) */
  .scard-btn { font: inherit; font-size: 11.5px; font-weight: 600; cursor: pointer;
    border: 1px solid var(--bd); border-radius: 999px; background: none; color: var(--ink);
    padding: 5px 9px; text-decoration: none; display: inline-block; white-space: nowrap; }
  .scard-btn:hover { background: rgba(11,11,13,.05); }
  .scard-btn.primary { background: var(--ink); color: #fff; border-color: var(--ink); }
  .scard-btn.primary:hover { background: var(--ink2); }
  /* «Изменить»: серая с пунктирной обводкой (owner 2026-07-23) */
  .scard-btn.edit { color: var(--mut); border: 1px dashed var(--mut); }
  .scard-btn.edit:hover { color: var(--ink); border-color: var(--ink); background: none; }
  .scard-btn.danger { color: var(--bad-tx); border-color: rgba(163,53,45,.35); }
  .scard-btn.danger:hover { background: var(--bad-bg); }
  /* «Уволить» в модалке: красный шрифт + красная обводка */
  .scard-btn.fire { color: var(--bad-tx); border: 1px solid var(--bad-tx); }
  .scard-btn.fire:hover { background: var(--bad-bg); }
  .scard-me { font-size: 12px; color: var(--mut); }
  /* статус «в сети»: зелёная точка на аватаре + текст под именем */
  .av { position: relative; }
  .av-img { position: absolute; inset: 0; width: 100%; height: 100%;
    object-fit: cover; border-radius: 50%; }
  .pres-dot { position: absolute; right: -1px; bottom: -1px; width: 10px; height: 10px;
    border-radius: 50%; background: #2f9e44; border: 2px solid var(--panel, #fff); }
  .pres-inline { color: var(--mut); }
  .pres-inline.on { color: #2f9e44; font-weight: 600; }
  .pres-chip { display: inline-block; padding: 2px 9px; border-radius: 999px;
    background: rgba(11,11,13,.06); color: var(--mut); font-size: 11px; }
  .pres-chip.on { background: #e2f2e6; color: #1d6f42; font-weight: 600; }
  /* чип-вложение над композером (пересылка «как в TG», owner 2026-07-23) */
  .attach-chip { display: flex; align-items: center; gap: 8px; margin-bottom: 6px;
    padding: 7px 10px; border-radius: 10px; border: 1px solid var(--bd);
    background: var(--info-bg); color: var(--info-tx); font-size: 12.5px; }
  .attach-ic { flex: none; width: 15px; height: 15px; }
  .attach-main { min-width: 0; display: flex; flex-direction: column; }
  .attach-lbl { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .attach-sub { font-size: 11px; opacity: .75; }
  .attach-x { margin-left: auto; border: 0; background: none; color: inherit;
    font: inherit; cursor: pointer; opacity: .7; }
  .attach-x:hover { opacity: 1; }
  .sf-spacer { flex: 1; }
  /* модалка добавления/редактирования сотрудника */
  .staffmodal-card { width: 480px; padding: 0 0 14px; }
  /* .actmodal-card - флекс-колонка с max-height 82vh и overflow:hidden, значит
     скроллить обязан ВНУТРЕННИЙ блок. В «Сообщениях» это .actmodal-panels, а у
     модалок сотрудника и специальностей такого блока не было - низ (кнопки
     «Уволить»/«Добавить»/«Сохранить») просто срезался. min-height:0 снимает
     автоминимум флекс-элемента, иначе форма не сжимается под потолок карточки.
     display НЕ трогаем: иначе оживёт грабля с [hidden] (см. ниже). */
  .staffmodal-card > .actmodal-head { flex: none; }
  .staffmodal-card > .staffform,
  .staffmodal-card > .spec-wrap { min-height: 0; overflow-y: auto; overscroll-behavior: contain; }
  /* запас снизу, чтобы последняя строка полей не пряталась под липкие кнопки */
  .staffmodal-card > .staffform { padding-bottom: 6px; }
  .staffform { display: flex; flex-direction: column; gap: 10px; padding: 12px 18px 0; }
  .sf-lbl { display: flex; flex-direction: column; gap: 4px; font-size: 12.5px; font-weight: 600; }
  .sf-lbl input, .sf-lbl select { font: inherit; font-size: 13px; font-weight: 400;
    padding: 7px 10px; border: 1px solid var(--bd); border-radius: 9px; background: #fff; }
  .sf-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .sf-hint { font-size: 11.5px; font-weight: 400; color: var(--mut); }
  /* своя карточка: роль/специализация заблокированы (анти-самолокаут) */
  .sf-lbl select:disabled { opacity: .55; cursor: not-allowed; }
  /* мультиспециальность (A1): чекбоксы специализаций вместо одиночного select */
  .sf-checks { display: flex; flex-direction: column; gap: 7px; margin-top: 2px; }
  .sf-check { flex-direction: row; align-items: center; gap: 8px; font-size: 13px; font-weight: 400; cursor: pointer; }
  .sf-checks input[type="checkbox"] { width: 16px; height: 16px; padding: 0; border-radius: 4px; flex: none; background: #fff; cursor: pointer; accent-color: var(--ink); }
  .sf-checks input:disabled { opacity: .55; cursor: not-allowed; }
  /* A3: управление специальностями */
  /* «Специальности» - та же форма, что «Добавить сотрудника», но прозрачная с
     чёрным контуром (owner 2026-08-24); кнопки стоят парой в .fin-actions */
  .fin-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
  .btn-secondary { background: transparent; color: var(--ink);
    border: 1px solid var(--ink); box-shadow: none; }
  .btn-secondary:hover { background: rgba(11,11,13,.06); }
  /* модалка специальностей шире: четыре колонки на 480px не помещались и
     таблицу приходилось листать вбок (owner 2026-08-24) */
  .specmodal-card { width: 880px; }
  .spec-wrap { padding-bottom: 8px; }
  .spec-table { width: 100%; border-collapse: collapse; font-size: 13px; margin: 4px 0;
    table-layout: fixed; }
  /* разделы и права переносятся по строкам, а не уезжают за край */
  .spec-table td.mut { white-space: normal; word-break: break-word; }
  .spec-table th:nth-child(1), .spec-table td:nth-child(1) { width: 22%; }
  .spec-table th:nth-child(2), .spec-table td:nth-child(2) { width: 21%; }
  .spec-table th:nth-child(3), .spec-table td:nth-child(3) { width: 22%; }
  .spec-table th:nth-child(4), .spec-table td:nth-child(4) { width: 9%; }
  /* кнопкам «Изменить»/«Выключить» нужен свой запас, иначе они распирают
     таблицу и возвращается горизонтальный скролл */
  .spec-table th:nth-child(5), .spec-table td:nth-child(5) { width: 27%; padding-left: 8px; }
  /* ячейки таблицы выравниваем по верху: у длинных «Разделов»/«Прав» строка
     высокая, и кнопки не должны висеть по её центру */
  .spec-table td { vertical-align: top; }
  /* название специальности переносится, а не толкает соседние колонки */
  .spec-table td:nth-child(1) { white-space: normal; word-break: break-word; }
  .spec-table th { text-align: left; font-size: 11.5px; color: var(--mut); font-weight: 600; padding: 6px 18px; border-bottom: 1px solid var(--bd); }
  .spec-table td { padding: 8px 18px; border-bottom: 1px solid var(--bd); vertical-align: middle; }
  .spec-table tr.spec-off td { opacity: .5; }
  .spec-badge { display: inline-block; font-size: 11px; padding: 1px 7px; border-radius: 999px; background: rgba(0,0,0,.06); }
  .spec-sys { font-size: 10.5px; color: var(--mut); }
  .spec-on-badge { color: #1a7f37; font-weight: 600; font-size: 12px; }
  .spec-off-badge { color: var(--mut); font-size: 12px; }
  /* .spec-actions - это САМ <td>: display:flex тут ломает табличную раскладку
     (ячейка схлопывается до содержимого). Держим кнопки в ряд обычным
     инлайном, а на узком экране разрешаем перенос. */
  .spec-actions { white-space: nowrap; text-align: right; }
  .spec-actions .scard-btn { margin-left: 4px; }
  @media (max-width: 900px) { .spec-actions { white-space: normal; } }
  /* display:flex у .staffform перебивал атрибут hidden - форма спец. светилась
     под списком (та же грабля, что у .sf-lbl[hidden]/.fwdbar[hidden]). */
  .staffform[hidden] { display: none; }
  /* display:flex у .sf-lbl перебивал html-атрибут hidden - при правке карточки
     светилось «Telegram ID *» (поле disabled, менять его нельзя). Та же грабля,
     что была у .fwdbar[hidden]. */
  .sf-lbl[hidden] { display: none; }
  /* кастомная кнопка выбора файла (owner 2026-07-23): нативный input скрыт */
  .filepick { display: flex; align-items: center; gap: 8px; min-width: 0; }
  .filepick-input { position: absolute; width: 1px; height: 1px; opacity: 0;
    overflow: hidden; clip: rect(0 0 0 0); }
  .filepick-btn { flex: none; font: inherit; font-size: 12.5px; font-weight: 600;
    cursor: pointer; border: 1px solid var(--bd); border-radius: 9px;
    background: rgba(11,11,13,.04); color: var(--ink); padding: 7px 12px; }
  .filepick-btn:hover { background: rgba(11,11,13,.08); }
  .filepick-input:focus-visible + .filepick-btn { outline: 2px solid var(--ink); }
  .filepick-name { min-width: 0; overflow: hidden; text-overflow: ellipsis;
    white-space: nowrap; font-size: 12px; color: var(--mut); }
  .filepick-name.chosen { color: var(--ink); }
  /* кнопки формы прилипают к низу скроллящейся модалки - иначе на длинной
     форме (специализации, доступы) до «Сохранить» надо было доскроллить */
  .sf-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px;
    position: sticky; bottom: 0; z-index: 2; padding: 10px 0 4px;
    background: linear-gradient(to top, var(--panel, #fff) 72%, rgba(255,255,255,0)); }
  /* кликабельный сотрудник (ФОТ, шапка чата) + «поделились сотрудником» */
  .stafflink { cursor: pointer; border-bottom: 1px dotted var(--mut); }
  .stafflink:hover { color: var(--info-tx); border-bottom-color: var(--info-tx); }
  .staffclick { cursor: pointer; }
  .cd-name .staffclick:hover { text-decoration: underline; }
  button.leadcard.staffcardmsg { font: inherit; text-align: left; cursor: pointer; width: 100%; }
  button.leadcard.staffcardmsg:disabled { cursor: default; opacity: .75; }
  /* кликабельное @упоминание в переписке сотрудников */
  .mention-link { color: var(--info-tx); font-weight: 600; cursor: pointer; border-radius: 4px; }
  .mention-link:hover { text-decoration: underline; }
  .bub.out .mention-link { color: #cdd6ff; }
  /* попап карточки сотрудника (строится в app.js) */
  .spopup-card { width: 430px; max-width: calc(100vw - 32px); padding: 0 0 16px; }
  .spopup-head { display: flex; align-items: center; gap: 12px; padding: 16px 18px 10px; }
  .spopup-name { font-weight: 700; font-size: 15px; display: flex; align-items: center; flex-wrap: wrap; gap: 2px; }
  .spopup-sub { font-size: 12px; color: var(--mut); margin-top: 1px; }
  .spopup-body { display: flex; flex-direction: column; gap: 4px; padding: 4px 18px 0; font-size: 12.5px; }
  .spopup-body .mut { color: var(--mut); }
  .spopup-money { margin-top: 6px; padding-top: 8px; border-top: 1px dashed var(--bd);
    display: flex; flex-direction: column; gap: 3px; }
  .spopup-actions { display: flex; flex-wrap: wrap; gap: 5px; padding: 12px 18px 0; }

  /* ---------- #51 «Структура компании» (оргчарт, owner) ---------- */
  .org-top { margin: 10px 2px 14px; }
  /* apple-аудит §15: h2-уровень единый (17/650/-.01em) - как .doc-h */
  .org-h2 { font-size: 17px; font-weight: 650; letter-spacing: -.01em; margin: 0 0 4px; }
  .org-hint { font-size: 13px; color: var(--ink2); margin: 0; max-width: 660px; line-height: 1.5; }
  .org-flash { display: inline-block; margin: 0 0 10px; padding: 6px 12px; border-radius: 999px;
    font-size: 12.5px; font-weight: 500; background: var(--ok-bg); color: var(--ok-tx); }
  .org-flash.err { background: var(--bad-bg); color: var(--bad-tx); }
  .org-flash[hidden] { display: none; }
  .org-msg { display: inline-block; margin: 0 0 10px; padding: 6px 12px; border-radius: 999px; font-size: 12.5px; }
  .org-msg.err { background: var(--bad-bg); color: var(--bad-tx); }
  .org-msg:not(.show) { display: none; }

  /* дерево: горизонтальный оргчарт с коннекторами (классический CSS-подход на ul/li) */
  .tree { overflow-x: auto; padding: 8px 4px 26px; }
  .tree ul { display: flex; justify-content: center; position: relative;
    padding-top: 22px; margin: 0; padding-left: 0; list-style: none; }
  .tree > ul { padding-top: 0; }
  .tree li { list-style: none; position: relative; padding: 22px 10px 0;
    display: flex; flex-direction: column; align-items: center; }
  /* коннекторы соседних узлов: две половинки горизонтали + короткая вертикаль вверх */
  .tree li::before, .tree li::after { content: ""; position: absolute; top: 0; right: 50%;
    width: 50%; height: 22px; border-top: 1px solid var(--bd2); }
  .tree li::after { right: auto; left: 50%; border-left: 1px solid var(--bd2); }
  .tree li::before { border-right: 1px solid var(--bd2); }
  .tree li:only-child { padding-top: 0; }
  .tree li:only-child::before, .tree li:only-child::after { display: none; }
  .tree li:first-child::before, .tree li:last-child::after { border: 0 none; }
  .tree li:last-child::before { border-right: 1px solid var(--bd2); }
  /* вертикаль от родителя вниз к строке детей */
  .tree ul ul::before { content: ""; position: absolute; top: 0; left: 50%;
    width: 0; height: 22px; border-left: 1px solid var(--bd2); }
  .tree ul.org-lv:empty, .tree ul.org-lv.is-empty { padding-top: 0; }
  .tree ul.org-lv:empty::before, .tree ul.org-lv.is-empty::before { display: none; }

  /* карточка узла */
  .orgcard { position: relative; min-width: 150px; max-width: 232px;
    border: 1px solid var(--bd); border-top: 3px solid var(--ghost); border-radius: var(--r-card);
    background: var(--glass2); -webkit-backdrop-filter: var(--blur); backdrop-filter: var(--blur);
    box-shadow: var(--shadow-panel); padding: 10px 12px 11px; }
  .orgcard .oc-head { display: flex; align-items: center; gap: 8px; }
  .oc-title { font-size: 14px; font-weight: 600; letter-spacing: -.01em; flex: 1; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .oc-count { flex: none; font-size: 11px; font-weight: 600; color: var(--ink2);
    background: rgba(11,11,13,.06); border-radius: 999px; padding: 1px 8px; }
  .oc-grip { flex: none; color: var(--ghost); font-size: 13px; cursor: grab; line-height: 1; }
  .oc-sub { font-size: 11.5px; color: var(--mut); margin-top: 2px; }
  .oc-people { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
  .oc-empty { font-size: 11.5px; color: var(--ghost); font-style: italic; }
  .oc-p { display: inline-flex; align-items: center; gap: 5px; max-width: 100%;
    background: rgba(11,11,13,.04); border-radius: 999px; padding: 2px 8px 2px 2px;
    cursor: pointer; transition: background .15s, box-shadow .15s; }
  .oc-p:hover { background: rgba(11,11,13,.1); }
  .oc-p:focus-visible { outline: none; box-shadow: var(--ring); }
  .oc-ava { flex: none; width: 20px; height: 20px; border-radius: 50%;
    background: var(--ink); color: #fff; font-size: 9.5px; font-weight: 700;
    display: inline-flex; align-items: center; justify-content: center; }
  img.oc-ava { object-fit: cover; background: var(--bg2); }
  .oc-pn { font-size: 11.5px; color: var(--ink); white-space: nowrap; overflow: hidden;
    text-overflow: ellipsis; max-width: 132px; }
  .oc-p.on .oc-ava { box-shadow: 0 0 0 2px var(--glass2), 0 0 0 3.5px #1d6f42; }

  /* верхняя кромка по роли/специальности (палитра .conv-role.r-*) */
  .orgcard.k-company  { border-top-color: var(--ink); }
  .orgcard.k-owner    { border-top-color: #cbb04a; }
  .orgcard.k-director { border-top-color: #8b46c9; }
  .orgcard.k-manager  { border-top-color: #4658b0; }
  .orgcard.k-sound    { border-top-color: #2e9e5b; }
  .orgcard.k-target   { border-top-color: #d98324; }
  .orgcard.k-contracts{ border-top-color: #1596b3; }
  .orgcard.k-spec     { border-top-color: var(--ghost); }

  /* drag-drop состояния */
  .orgcard.spec { cursor: grab; }
  .orgcard.spec:active { cursor: grabbing; }
  .orgcard.dragging { opacity: .4; }
  .orgcard.drop-ok { border-color: var(--ink); box-shadow: var(--ring); }
  .orgcard[draggable="true"]:focus-visible { outline: none; box-shadow: var(--ring); }

  /* ---------- press-отклик плоских рядов (apple-аудит §1) ----------
     Объявлен В КОНЦЕ и через :hover:active - иначе поздние :hover-правила той
     же специфичности съедают нажатие. :not(.on) бережёт выбранные тёмные
     пункты: у них белый текст, светлый фон нажатия сделал бы их нечитаемыми -
     им вместо этого лёгкое осветление. */
  .conv-filter a:not(.on):hover:active { background: rgba(11,11,13,.10); transition-duration: 60ms; }
  .req-pick:not(.on):hover:active { background: rgba(11,11,13,.09); transition-duration: 60ms; }
  .selx-opt:hover:active { background: rgba(11,11,13,.10); transition-duration: 60ms; }
  .datex-day:hover:active:not(.empty):not(.on) { background: rgba(11,11,13,.11); transition-duration: 60ms; }
  .conv-filter a.on:active, .req-pick.on:active, .datex-day.on:active {
    filter: brightness(1.35); transition-duration: 60ms; }

  /* ---------- доступность ---------- */
  @media (prefers-reduced-motion: reduce) {
    /* apple-аудит §14: глушим И keyframes (раньше только transition; селектор
       логотипа был мёртвый - glword объявлен на .gl-word, не на span) */
    .glogo.anim .gl-br, .glogo.anim .gl-word, .glogo.anim .gl-suffix,
    .glogo.anim .gl-dot { animation: none; }
    /* конечное состояние теперь базовое - достаточно снять анимацию, transform
       не переопределяем, иначе задавили бы :hover/:active кнопок хаба */
    .hubbtn, .hub-tag { animation: none; }
    * { transition-duration: .01ms !important;
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important; }
    /* спиннер - статус, ему крутиться можно (не вестибулярное движение) */
    .busy-spin { animation: busyspin .7s linear infinite !important; }
  }
  @media (prefers-reduced-transparency: reduce) {
    /* apple-аудит §14: стекло -> плотные поверхности без blur */
    header, .tabs, .seg, .fsel, .conv-col, .conv-detail, .ddmenu, .selx-menu,
    .datex-cal, .kpi, .fin-card, .rcal, .actmodal-card, .bell-menu, .busy-box {
      -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
      background: #fbfbfc !important; }
    /* тост - тёмная плашка с БЕЛЫМ текстом: светлый фон сделал бы его невидимым.
       Снимаем только blur, цвет доводим до полной непрозрачности. */
    .savetoast { -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
      background: #0b0b0d !important; }
    .savetoast.err { background: #8f2c24 !important; }
    .savetoast.ok { background: #1d6f42 !important; }
  }
  @media (prefers-contrast: more) {
    /* apple-аудит §14: волосяные границы и призрачный текст - контрастнее */
    :root { --bd: rgba(11,11,13,.32); --bd2: rgba(11,11,13,.45);
            --mut: #3c3c42; --ghost: #55555c; --ink2: #222226; }
  }
