/* Портал развития СК Компакт.
   Оформление то же, что в Реестр.html и Источники.html: лист чертежа, основная надпись,
   моноширинные подписи полей. Ничего лишнего на экране. */

/* Экранные шрифты — свои файлы, без обращений к чужим серверам (как Manrope у входа).
   Inter — текст и цифры: сделан для экранов, цифры табличные, одной ширины.
   JetBrains Mono — только мелкие моноширинные подписи: мягче и разборчивее Menlo. */
@font-face{font-family:'Inter Portal';src:url('/static/fonts/inter-cyrillic-wght-normal.woff2') format('woff2');
  font-weight:100 900;font-display:swap;unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Inter Portal';src:url('/static/fonts/inter-latin-wght-normal.woff2') format('woff2');
  font-weight:100 900;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+2000-206F,U+2122,U+2191,U+2193,U+2212,U+2215}
@font-face{font-family:'JBMono Portal';src:url('/static/fonts/jetbrains-mono-cyrillic-wght-normal.woff2') format('woff2');
  font-weight:100 800;font-display:swap;unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'JBMono Portal';src:url('/static/fonts/jetbrains-mono-latin-wght-normal.woff2') format('woff2');
  font-weight:100 800;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+2000-206F,U+2122,U+2191,U+2193,U+2212,U+2215}

:root{
  /* ── краски портала: один словарь на все темы ──
     Тема («Вид портала» в меню человека) переопределяет эти значения на <html
     data-theme="…">. Компоненты ниже знают только имена — ни одного цвета в
     правилах напрямую, иначе тема его не достанет. */
  /* лист и поверхности */
  --paper:#EFF1F4; --panel:#fff; --panel2:#FBFCFD; --field:#fff;
  /* ховер строки — заметная голубая вуаль (по UniVue), зебра — шёпот чернил:
     оба полупрозрачные, чтобы ложились на любой лист, включая просвечивающие */
  --hover:rgba(61,100,146,.09); --zebra:rgba(16,36,66,.03);
  --open:#F8FAFD; --us:#F4F7FB; --us-h:#EFF4FA;
  --cold:#FEFAF1; --cold-h:#FDF6E7; --soft-off:#EDEFF2; --code-bg:#F2F4F7;
  /* подложка страницы: цвет и слои-картинки порознь — в одном свойстве background
     цвет разрешён только в последнем слое, и многослойная тема молча теряла фон */
  --bgc:#eef1f4;
  --bgi:radial-gradient(120% 110% at 50% -10%,#f3f5f7 0%,#e9edf2 52%,#e2e7ee 100%);
  --gapc:var(--paper);            /* цвет разрыва вокруг раскрытой записи */
  --pborder:var(--rule);          /* кромка панелей */
  --pblur:none;                   /* у тем с фоном панели чуть просвечивают */
  /* чернила: значение темнее подписи, подпись темнее служебного */
  --ink:#141821; --ink2:#5A6474; --ink3:#8A94A3;
  --val:#333B49;                  /* значения данных: спокойнее заголовков */
  --name:#333B49;                 /* имена компаний в реестре */
  --link:#3B5A82;                 /* тихая ссылка в данных: без подчёркивания */
  --rule:#CBD2DB; --rule2:#E3E8EE;
  /* акценты */
  --blue:#3D6492; --blue-deep:#2A4A70; --blue-soft:#E4EBF6; --blue-mid:#7C97C4;
  --btn:#3D6492; --btn-h:#0E3468; --rose:#C47B9E;
  --mark:#F0B429; --mark-soft:#FDF3DC; --mark-ink:#8A6A12;
  --gone:#9AA3AF; --alert:#9E2B1E; --alert-soft:#FBECEA; --ok:#1B6B4C; --ok-soft:#EAF3EE;
  --f-ok:#3E6B54; --f-mid:#8A6A12; --f-bad:#93493E;
  --star:#CDD3DB; --star-on:#E8A317;
  /* тона карточек: компания синеватая, объект зеленоватый, группа фиолетовая —
     с одного взгляда видно, в какой карточке находишься. Краска подмешивается
     в панели через color-mix, поэтому каждая тема даёт свой оттенок сама;
     тёмным темам ниже — светлые краски и доля побольше, иначе не разглядеть. */
  --card-co:#3D6492; --card-ob:#317A57; --card-gr:#6C5CA8;
  --card-mix:6%;    /* доля краски в панелях карточки */
  --card-mix2:14%;  /* доля краски в подложке окна-карточки */
  /* ── контролы: один рост, один радиус, один голос (эталон — Master UniVue) ──
     Всё, чем человек управляет в строке (поиск, селект, кнопка, пилюля,
     кнопка-иконка), — высоты --ctl-h; маленькая кнопка в раскрытиях — --ctl-h-sm.
     Каретка селекта и лупа поиска — svg-картинки: в url() токен цвета не
     дотягивается, поэтому у тёмных тем и «Бумаги» свои копии нужного цвета. */
  --ctl-h:28px; --ctl-h-sm:24px; --ctl-r:7px;
  --ctl-ring:0 0 0 3px rgba(61,100,146,.12);   /* мягкое кольцо фокуса поля */
  /* ── плотность реестров: одно место, откуда таблицы берут все свои числа ──
     Приём Master UniVue: высота строки, отступы и шрифты живут одним набором,
     а не расползаются по правилам отдельных экранов — иначе строка у одного
     реестра тихо вырастает, и при переходе между вкладками список едет.
     Наборов два, какой включён — выбор человека в «Виде портала»
     (html[data-density]). Правило: ни один экран не задаёт эти величины сам. */
  --reg-row-h:27px;        /* рост строки реестра — один на все экраны */
  --reg-font:13px;         /* шрифт ячейки */
  --reg-name-font:13.5px;  /* имя записи — на полтона крупнее остального */
  --reg-line:20px;         /* межстрочный: он же рост строки без отступов */
  --reg-pad-y:2px;         /* отступ ячейки сверху и снизу */
  --reg-pad-x:10px;        /* отступ ячейки слева и справа */
  --reg-head-font:9.5px;   /* шрифт шапки таблицы */
  --reg-head-pad:5px;      /* поле под подписью шапки */
  --reg-head-h:23px;       /* рост шапки: по нему липкие строки встают ПОД неё */
  --reg-chip-font:10px;    /* плашки и чипы внутри строки */
  --reg-chip-pad:5px 7px;  /* поля чипа: в плотном наборе они тоже ужимаются */
  --reg-badge:18px;        /* квадратик категории: он задаёт нижний предел строки */
  --reg-ava:20px;          /* кружок с лицом куратора */
  --caret:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5' fill='none' stroke='%238A94A3' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --lupa:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'%3E%3Ccircle cx='6' cy='6' r='4.2' fill='none' stroke='%238A94A3' stroke-width='1.4'/%3E%3Cpath d='m9.4 9.4 3 3' stroke='%238A94A3' stroke-width='1.4' stroke-linecap='round'/%3E%3C/svg%3E");
  --btnr:var(--ctl-r);            /* скругление кнопок: «Компакт» делает пилюли */
  --dimf:brightness(.93);         /* знак наведения на чип: тёмные темы светлеют */
  /* шапка портала */
  --top-bg:rgba(255,255,255,.92); --top-brand:#0F1B2D; --top-ink:#4B5B70;
  --top-on:var(--ink); --top-ink2:var(--ink3);
  /* тени: две сложенные полупрозрачные — приподнятость, а не «тень» */
  --e1:0 1px 2px rgba(16,24,38,.05),0 1px 1px rgba(16,24,38,.03);
  --e2:0 18px 44px -18px rgba(16,24,38,.4);
  --disp:"Avenir Next",'Inter Portal',"Helvetica Neue",-apple-system,sans-serif;
  --body:'Inter Portal',"Helvetica Neue",-apple-system,"Segoe UI",sans-serif;
  --mono:'JBMono Portal',"Menlo","SF Mono",ui-monospace,monospace;
  --sp:clamp(16px,2.4vw,30px);
}

/* ─── темы («Вид портала», страница /look) ───
   Правило одно, из мировой практики (Trello, Битрикс24): декоративный фон живёт
   ВОКРУГ карточек, сами таблицы с цифрами всегда на сплошной светлой или тёмной
   подложке — плотность и читаемость не спорят с красотой. */

/* Синева — фирменная: тёмно-синяя чертёжная подложка с сеткой, светлые листы */
[data-theme="sineva"]{
  --bgc:#0E2136;
  --bgi:radial-gradient(90% 70% at 85% -10%,rgba(103,150,199,.28) 0%,rgba(103,150,199,0) 60%),
    radial-gradient(80% 90% at 0% 100%,rgba(26,58,92,.55) 0%,rgba(26,58,92,0) 55%),
    repeating-linear-gradient(0deg,rgba(255,255,255,.03) 0 1px,transparent 1px 56px),
    repeating-linear-gradient(90deg,rgba(255,255,255,.03) 0 1px,transparent 1px 56px);
  --paper:#122A44; --gapc:rgba(10,28,48,.12);
  --panel:rgba(250,252,254,.94); --pblur:blur(16px) saturate(1.3);
  --pborder:rgba(255,255,255,.45);
  --e1:0 1px 2px rgba(4,14,26,.2),0 10px 34px -18px rgba(4,14,26,.5);
  --top-bg:rgba(9,23,38,.78); --top-brand:#EAF1F8; --top-ink:#A9BDD3;
  --top-on:#fff; --top-ink2:#7E96AF;
}
/* Компакт — как витрина kompakt-24.com: светлая дымка, синий и роза, кнопки-пилюли */
[data-theme="kompakt"]{
  --bgc:#E9EDF2;
  --bgi:radial-gradient(85% 70% at 18% 0%,rgba(255,255,255,.9) 0%,rgba(255,255,255,0) 55%),
    radial-gradient(70% 80% at 100% 10%,rgba(124,151,196,.22) 0%,rgba(124,151,196,0) 55%),
    radial-gradient(60% 60% at 82% 96%,rgba(196,123,158,.12) 0%,rgba(196,123,158,0) 55%);
  --paper:#E9EDF2; --gapc:rgba(96,116,148,.13);
  --panel:rgba(253,254,255,.9); --pblur:blur(18px) saturate(1.25);
  --pborder:rgba(255,255,255,.75);
  --e1:0 1px 2px rgba(16,29,47,.05),0 16px 40px -26px rgba(16,29,47,.35);
  --top-bg:rgba(238,241,244,.72); --top-brand:#101D2F; --top-ink:#4B5B70;
  --btn:#3D6492; --btn-h:#2A4A70; --btnr:999px;
}
/* Небо — светлый воздух: мягкий рассветный градиент, панели чуть просвечивают */
[data-theme="nebo"]{
  --bgc:#DEE6F1;
  --bgi:radial-gradient(55% 60% at 10% 0%,rgba(255,255,255,.85) 0%,rgba(255,255,255,0) 60%),
    radial-gradient(60% 70% at 90% 6%,rgba(203,190,226,.5) 0%,rgba(203,190,226,0) 55%),
    radial-gradient(80% 90% at 50% 110%,rgba(168,199,219,.55) 0%,rgba(168,199,219,0) 60%);
  --paper:#E3E9F3; --gapc:rgba(96,116,148,.14);
  --panel:rgba(255,255,255,.86); --pblur:blur(20px) saturate(1.35);
  --pborder:rgba(255,255,255,.6);
  --e1:0 1px 2px rgba(40,54,80,.06),0 12px 36px -22px rgba(40,54,80,.35);
  --top-bg:rgba(255,255,255,.66);
}
/* Бумага — тёплый лист, никакой декорации, только типографика */
[data-theme="bumaga"]{
  --bgc:#F3EFE7;
  --bgi:radial-gradient(120% 110% at 50% -10%,#F8F5EE 0%,#F1EDE4 60%,#ECE7DC 100%);
  --paper:#F3EFE7; --panel:#FDFCF9; --panel2:#F8F6F0; --field:#FDFCF9;
  --hover:rgba(74,96,118,.075); --zebra:rgba(62,52,20,.04);
  --open:#F8F5EC; --us:#F1EDE1; --us-h:#EDE8DA;
  --soft-off:#ECE8DD; --code-bg:#F0EBE0;
  --ink:#1E1B15; --ink2:#63604F; --ink3:#94907E; --val:#3B382E; --name:#3B382E;
  --link:#5A5340; --rule:#D5CFBF; --rule2:#E6E1D3;
  --blue:#4A6076; --blue-deep:#35485A; --blue-soft:#EAE5D8; --blue-mid:#97A4AC;
  --btn:#4A5568; --btn-h:#333D4D; --rose:#B08496;
  /* тона карточек — в приглушённом голосе «Бумаги», без экранной яркости */
  --card-co:#4A6076; --card-ob:#547862; --card-gr:#75648F;
  --top-bg:rgba(252,250,245,.92); --top-brand:#25221B; --top-ink:#63604F;
  --ctl-ring:0 0 0 3px rgba(74,96,118,.13);
  --caret:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5' fill='none' stroke='%2394907E' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --lupa:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'%3E%3Ccircle cx='6' cy='6' r='4.2' fill='none' stroke='%2394907E' stroke-width='1.4'/%3E%3Cpath d='m9.4 9.4 3 3' stroke='%2394907E' stroke-width='1.4' stroke-linecap='round'/%3E%3C/svg%3E");
}
/* Графит и Ночная смена — тёмные режимы: общий словарь… */
[data-theme="grafit"],[data-theme="nochnaya"]{
  --paper:#0F1216; --panel:#171B21; --panel2:#1C212A; --field:#12161C;
  --hover:rgba(127,169,218,.10); --zebra:rgba(255,255,255,.03);
  --open:#1B212B; --us:#1C2530; --us-h:#212B38;
  --cold:#241F14; --cold-h:#2A2418; --soft-off:#242A33; --code-bg:#20252D;
  --gapc:#0C0F13; --pborder:#262C36;
  --ink:#E8EBF0; --ink2:#A7AFBC; --ink3:#737C8B; --val:#CBD2DD; --name:#D6DBE4;
  --link:#9DB6D4; --rule:#333B47; --rule2:#252B35;
  --blue:#7FA9DA; --blue-deep:#A5C4E8; --blue-soft:#1E2A3A; --blue-mid:#466182;
  --btn:#3E6DA0; --btn-h:#4F81B8;
  --mark:#D9A430; --mark-soft:#2C2514; --mark-ink:#D9B35C;
  --gone:#6C7480; --alert:#E0705F; --alert-soft:#33201C; --ok:#5FB08A; --ok-soft:#1B2B23;
  --f-ok:#7FBD9E; --f-mid:#D9B35C; --f-bad:#DE9184;
  --star:#3C444F; --star-on:#E0A93B;
  /* тона карточек: на тёмных панелях краска берётся светлее и гуще,
     иначе оттенок не разглядеть */
  --card-co:#7FA9DA; --card-ob:#5FB08A; --card-gr:#A493D6;
  --card-mix:9%; --card-mix2:18%;
  --top-bg:rgba(15,18,22,.85); --top-brand:#EDF1F6; --top-ink:#9AA5B4;
  --top-on:#fff; --top-ink2:#6E7885;
  --ctl-ring:0 0 0 3px rgba(127,169,218,.16);
  --caret:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5' fill='none' stroke='%23737C8B' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --lupa:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'%3E%3Ccircle cx='6' cy='6' r='4.2' fill='none' stroke='%23737C8B' stroke-width='1.4'/%3E%3Cpath d='m9.4 9.4 3 3' stroke='%23737C8B' stroke-width='1.4' stroke-linecap='round'/%3E%3C/svg%3E");
  --dimf:brightness(1.22);
  --e1:0 1px 2px rgba(0,0,0,.35),0 1px 1px rgba(0,0,0,.25);
  --e2:0 18px 44px -14px rgba(0,0,0,.7);
}
[data-theme="grafit"]{
  --bgc:#101318;
  --bgi:radial-gradient(120% 110% at 50% -10%,#161A20 0%,#101318 55%,#0C0E12 100%);
}
/* …Ночная смена теплее: почти чёрное небо, янтарный прожектор и янтарные акценты */
[data-theme="nochnaya"]{
  --bgc:#0C0E11;
  --bgi:radial-gradient(70% 55% at 88% -8%,rgba(242,169,59,.13) 0%,rgba(242,169,59,0) 60%),
    radial-gradient(100% 90% at 50% 115%,#121519 0%,rgba(18,21,25,0) 70%);
  --rose:#F2A93B; --btn:#8A6215; --btn-h:#A67A25;
}

*{box-sizing:border-box}
html,body{margin:0}
/* Место под полосу прокрутки занято всегда, даже когда прокручивать нечего.
   Иначе список из десяти записей идёт без полосы, из ста — с полосой, и при
   каждом переключении фильтра вся страница дёргается вбок на её ширину
   (жалоба Николая 20.09.2026: «переключаешь — весь экран прыгает»). */
html{scrollbar-gutter:stable}
/* якорные ссылки («работа · финансы · сведения» на карточке) едут плавно,
   а не прыгают; цель не ныряет под липкую шапку. Явные прыжки скриптов
   (behavior:'instant') это правило не трогает, выключенная анимация — тоже */
@media (prefers-reduced-motion:no-preference){
  html,.cardmodal-body{scroll-behavior:smooth}
}
:target{scroll-margin-top:56px}
body{background-color:var(--bgc);background-image:var(--bgi);
  background-repeat:no-repeat;background-attachment:fixed;
  color:var(--ink);font:15px/1.5 var(--body);-webkit-font-smoothing:antialiased}
.visually-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
a{color:var(--blue)}
.mono{font-family:var(--mono)}
.eyebrow{font:600 10px/1 var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--ink3)}
:focus-visible{outline:2px solid var(--blue);outline-offset:2px;border-radius:2px}
.muted{color:var(--ink3)}
.dim{color:var(--ink2)}
.sm{font-size:12.5px;color:var(--ink2)}
/* счётчик занимает постоянное место: без этого «показано 12» и «показано 142»
   имеют разную ширину, и при переключении тумблера фильтры с кнопками уезжают */
.cnt{font:600 11px/1 var(--mono);color:var(--ink3);letter-spacing:.06em;
  font-variant-numeric:tabular-nums;min-width:92px}
.nowrap{white-space:nowrap}
.right{text-align:right}
/* Цифры — как в Master UniView (просьба Николая 16.08): системный моноширинный
   ui-monospace (на Маке — SF Mono), обычный вес, табличные знаки. Цвет — спокойный
   графит, не чернильный: цифр на экране много, им нельзя кричать. */
.num{font-family:ui-monospace,"SF Mono",SFMono-Regular,Menlo,Monaco,Consolas,monospace;
  font-variant-numeric:tabular-nums;font-size:.93em;color:var(--val)}
th.num{color:var(--ink3)}
/* «21,8 млрд ₽» — одно число, а не две строки: сумму и единицу не разрывать */
td.num{white-space:nowrap}
/* Число в реестре прижато вправо — и в шапке, и в ячейке. Разряды встают
   столбиком, и «9» против «124» видно как разные величины, не вчитываясь.
   Правило одно на все реестры: до 20.09.2026 вправо стояла только шапка ленты
   объектов, а у остальных и заголовок, и значение жались влево. */
.tbl.reg th.num,.tbl.reg td.num{text-align:right}

/* ─── шапка одной строкой ───
   Марка с синей точкой (как на витрине kompakt-24.com), разделы текстом,
   активный подчёркнут фирменной розой; справа дата, учебник-книжка и меню
   человека со служебными разделами. Никаких коробок и этажей. */
/* Плотный набор. Николай смотрит портал, уменьшив масштаб браузера примерно
   до 80%: строка в 27 точек становится 21,6, шрифт 13 — 10,4. То есть плотность
   UniVue он уже себе добывает лупой браузера, а текст от этого мылится. Здесь
   та же плотность при честных 100%: строка 20 точек, шрифт 11,5, и буквы
   остаются чёткими. Горизонтальные поля сжаты меньше — в ячейках не числа,
   а названия объектов и имена компаний, на двух точках они слипнутся. */
html[data-density="compact"]{
  --reg-row-h:20px;
  --reg-font:11.5px;
  --reg-name-font:12px;
  --reg-line:17px;
  --reg-pad-y:1px;
  --reg-pad-x:8px;
  --reg-head-font:9px;
  --reg-head-pad:4px;
  --reg-head-h:20px;
  --reg-chip-font:9px;
  --reg-chip-pad:3px 6px;
  --reg-badge:15px;
  --reg-ava:16px;
}

.topbar{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:4px;
  height:46px;padding:0 var(--sp);background:var(--top-bg);
  -webkit-backdrop-filter:blur(10px) saturate(1.3);
  backdrop-filter:blur(10px) saturate(1.3);border-bottom:1px solid var(--pborder)}
.brand{display:flex;align-items:baseline;gap:8px;margin-right:26px;text-decoration:none;
  font:600 15px/1 var(--disp);letter-spacing:-.01em;color:var(--top-brand);white-space:nowrap}
.brand i{width:9px;height:9px;border-radius:50%;background:var(--blue);display:block;
  align-self:center}
.brand .bsub{font:500 10px/1 var(--mono);letter-spacing:.08em;color:var(--top-ink2)}
.nav{display:flex;align-items:center;gap:2px;min-width:0;overflow-x:auto;scrollbar-width:none}
.nav::-webkit-scrollbar{display:none}
.nav a{padding:14px 10px 12px;font:500 13px/1 var(--body);color:var(--top-ink);text-decoration:none;
  border-bottom:2px solid transparent;white-space:nowrap}
.nav a:hover{color:var(--top-on)}
.nav a.on{color:var(--top-on);font-weight:600;border-bottom-color:var(--rose)}
.navgap{width:18px;flex:0 0 auto}
/* «Ещё» в шапке: редкие разделы не занимают место в ряду, но и не прячутся
   совсем — открываются списком под своим словом. Стоит рядом с рядом
   разделов, а не внутри него: ряд умеет ездить вбок и обрезал бы список. */
.navmore{position:relative;flex:0 0 auto}
.navmore>summary{list-style:none;cursor:pointer;padding:14px 10px 12px;white-space:nowrap;
  font:500 13px/1 var(--body);color:var(--top-ink);border-bottom:2px solid transparent}
.navmore>summary::-webkit-details-marker{display:none}
.navmore>summary:hover{color:var(--top-on)}
.navmore>summary.on{color:var(--top-on);font-weight:600;border-bottom-color:var(--rose)}
.navmore .chev{font-size:9px;color:var(--top-ink2);margin-left:5px}
.navmore .menu{position:absolute;left:0;top:calc(100% - 4px);z-index:40;min-width:170px;
  background:var(--panel);-webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);border-radius:4px;box-shadow:var(--e2);padding:6px;
  display:flex;flex-direction:column}
.navmore .menu a{display:block;padding:8px 10px;border-radius:2px;
  font:500 13px/1.2 var(--body);color:var(--ink2);text-decoration:none}
.navmore .menu a:hover{background:var(--blue-soft);color:var(--ink)}
/* подвкладки раздела в шапке линзы стоят сразу за названием — это переключатель
   взгляда, а не действие, и читается он в начале строки */
.lenshead .subtabs.mtabs{margin-left:2px}
.topbar .spacer{flex:1}
.topbar .today{font:500 11px/1 var(--mono);color:var(--top-ink2);white-space:nowrap;margin-right:2px}
.tico{display:flex;align-items:center;padding:8px;color:var(--top-ink2);border-radius:3px}
.tico:hover{color:var(--blue)}
.tico.on{color:var(--blue)}
/* меню человека: имя-кнопка, поповер со служебными разделами и выходом */
.usermenu{position:relative}
.usermenu>summary{list-style:none;cursor:pointer;padding:8px 2px 8px 10px;
  font:500 13px/1 var(--body);color:var(--top-ink);white-space:nowrap}
.usermenu>summary::-webkit-details-marker{display:none}
.usermenu>summary:hover{color:var(--top-on)}
.usermenu .chev{font-size:9px;color:var(--top-ink2);margin-left:5px}
.usermenu .menu{position:absolute;right:0;top:calc(100% + 8px);z-index:40;min-width:210px;
  background:var(--panel);-webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);border-radius:4px;
  box-shadow:var(--e2);padding:6px;display:flex;flex-direction:column}
.usermenu .who{padding:8px 10px 10px;font:600 12.5px/1.45 var(--body);color:var(--ink);
  border-bottom:1px solid var(--rule2);margin-bottom:5px}
.usermenu .who .dim{font-weight:500;font-size:11px}
.usermenu .menu a,.usermenu .menu button{display:block;width:100%;text-align:left;padding:8px 10px;
  border:0;background:none;border-radius:2px;font:500 13px/1.2 var(--body);color:var(--ink2);
  text-decoration:none;cursor:pointer}
.usermenu .menu a:hover,.usermenu .menu button:hover{background:var(--blue-soft);color:var(--ink)}
.usermenu .menu form{margin-top:4px;border-top:1px solid var(--rule2);padding-top:4px}

main{margin:0 auto;padding:14px var(--sp) 70px}
/* темы с декоративной подложкой: листам больше воздуха, скругление заметнее —
   фон должен дышать по краям, иначе зачем он */
[data-theme="sineva"] main,[data-theme="nebo"] main,[data-theme="kompakt"] main{
  padding:22px calc(var(--sp) + 16px) 84px}
[data-theme="sineva"] .panel,[data-theme="nebo"] .panel,[data-theme="kompakt"] .panel{
  border-radius:9px}
/* Широкая таблица (календарь) прокручивается внутри панели — страница вбок не ездит. */
.panel{background:var(--panel);-webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);
  border-radius:5px;box-shadow:var(--e1);padding:var(--sp);overflow-x:auto}
.panel + .panel{margin-top:14px}
/* у реестров верхнее поле меньше: экран должен начинаться с записей */
.panel.lens{padding-top:10px}
/* на реестрах экран начинается с записей: поле над листом меньше, чем на
   страницах с текстом — каждые десять точек сверху это треть строки ленты */
main:has(> .panel.lens){padding-top:12px}
h1{margin:0 0 4px;font:600 20px/1.25 var(--disp);letter-spacing:-.02em}
h2{font:600 15px/1.3 var(--disp);letter-spacing:-.015em;margin:26px 0 10px;
  padding-top:16px;border-top:1px solid var(--rule2)}
h2:first-child{margin-top:0;padding-top:0;border-top:0}
h3{font:600 13px/1.3 var(--disp);margin:18px 0 8px}
.lead{font:13px/1.55 var(--body);color:var(--ink2);max-width:78ch;margin:0 0 16px}

/* ─── шапка линзы: одна строка вместо заголовка с абзацем ───
   Название, сводка и действия в один этаж; объяснение «как читать» раскрывается
   по желанию — экран сразу начинается с записей, а не с текста. */
.lenshead{position:relative;display:flex;gap:6px 16px;align-items:center;flex-wrap:wrap;
  margin:0 0 8px}
/* На рабочем экране шапка — всегда одна строка: при нехватке места сжимаются
   фильтры, а не переносится вся строка. Перенос уводил список на этаж вниз,
   и «Источники» начинались на 30 точек ниже «Заказчиков». На узком экране
   перенос снова разрешён — там сжимать уже нечего. */
@media (min-width:1400px){.lenshead{flex-wrap:nowrap}}
/* поле поиска и фильтры стоят в этой же строке: пока они жили этажом ниже,
   две строки объектов уходили под них ни за что. Не хватило ширины — строка
   переносится сама, и вид тот же, что был раньше */
/* Не хватило ширины — сжимаются фильтры, а не переносится вся шапка:
   перенос уводил список на этаж вниз, и «Источники» начинались на 30 точек
   ниже «Заказчиков» (docs/23-UI-ЯДРО.md, правило «шапка — одна строка») */
.lenshead .bar{margin:0;flex:0 1 auto;min-width:0;gap:7px;flex-wrap:nowrap}
/* на узком экране панель снова разрешает себе перенос — иначе она вылезет
   за край листа */
@media (max-width:900px){.lenshead .bar{flex-wrap:wrap}}
.lenshead .bar .grow{flex:0 1 320px;min-width:170px}
/* Селект показывает себя целиком, пока хватает ширины, и ужимается, когда
   её не хватает: на «Источниках» шесть фильтров в одной строке. Подрезанное
   значение целиком видно при раскрытии списка. */
.lenshead .bar select{flex:0 1 auto;min-width:96px}
.lenshead h1{margin:0;font-size:17px}
.lenshead .spacer{flex:1}
.lenshead .sum{margin:0;padding:0;border:0;gap:16px}
.lenshead .sum b{font-size:15px}
.lenshead .sum span{max-width:none}
details.lhelp{flex:0 0 auto}
details.lhelp>summary{list-style:none;cursor:pointer;font:500 12px/1 var(--body);
  color:var(--ink3);white-space:nowrap}
details.lhelp>summary::-webkit-details-marker{display:none}
details.lhelp>summary::before{content:"?";display:inline-block;width:15px;height:15px;
  border:1px solid var(--rule);border-radius:50%;text-align:center;font:600 10px/15px var(--mono);
  margin-right:6px;vertical-align:-3px}
details.lhelp>summary:hover{color:var(--blue)}
details.lhelp[open]>summary{color:var(--ink)}
/* открытое объяснение — карточка поверх таблицы, шапку не дёргает */
details.lhelp .in{position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:12;
  background:var(--panel);-webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);border-radius:4px;
  box-shadow:var(--e2);padding:13px 16px;
  font:13px/1.55 var(--body);color:var(--ink2)}
details.lhelp .in p{margin:0 0 8px} details.lhelp .in p:last-child{margin:0}
/* «Добавить компанию» — та же кнопка в том же месте на всех реестрах;
   форма с ИНН выпадает поповером, не занимая своей строки */
details.addpop{position:relative}
details.addpop>summary{list-style:none}
details.addpop>summary::-webkit-details-marker{display:none}
details.addpop .in{position:absolute;right:0;top:calc(100% + 8px);z-index:20;width:300px;
  background:var(--panel);-webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);border-radius:4px;
  box-shadow:var(--e2);padding:13px 14px}
/* каркас шапки линзы и строки фильтров держит высоту при любом наборе кнопок */
.lenshead{min-height:30px}
.lens .bar{min-height:var(--ctl-h)}
.lenshead .subtabs{padding-top:0}

/* ─── сообщения ─── */
.flash{margin:14px 0 0;padding:10px 13px;font-size:13.5px;border-left:2px solid var(--ok);
  background:var(--ok-soft)}
.flash.bad{border-left-color:var(--alert);background:var(--alert-soft)}

/* ─── сводные числа ─── */
.sum{display:flex;gap:22px;flex-wrap:wrap;align-items:baseline;padding-bottom:15px;
  margin-bottom:16px;border-bottom:1px solid var(--rule2)}
.sum div{display:flex;align-items:baseline;gap:7px}
/* плитка-ссылка выглядит как обычная плитка: фильтр, а не «синяя ссылка» */
.sum a{display:flex;align-items:baseline;gap:7px;text-decoration:none;color:var(--ink)}
.sum a:hover span{color:var(--blue)}
.sum b{font:600 22px/1 var(--disp);letter-spacing:-.02em;font-variant-numeric:tabular-nums;
  color:var(--val)}
.sum b.mk{color:var(--mark-ink)} .sum b.al{color:var(--alert)} .sum b.ok{color:var(--ok)}
.tbl b.al{color:var(--alert)}
.sum span{font:600 9.5px/1.3 var(--mono);letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink3);max-width:14ch}

/* ─── воронка ─── */
.funnel{display:flex;gap:1px;margin:6px 0 18px;flex-wrap:wrap}
.fstep{flex:1;min-width:96px;background:var(--blue-soft);padding:9px 10px;border-radius:2px}
.fstep .n{font:600 19px/1 var(--disp);color:var(--blue);font-variant-numeric:tabular-nums}
.fstep .l{font:600 9px/1.3 var(--mono);letter-spacing:.1em;text-transform:uppercase;
  color:var(--ink3);margin-top:5px}
.fstep.hot{background:var(--mark-soft)} .fstep.hot .n{color:var(--mark-ink)}
.fstep.off{background:var(--soft-off)} .fstep.off .n{color:var(--ink3)}
/* сжатая воронка сводки: шаги не растягиваются во всю ширину, цифра и подпись
   в одну строку — полоса, а не плиты */
.funnel.slim{margin:12px 0 0}
.funnel.slim .fstep{flex:0 1 auto;min-width:0;display:flex;align-items:baseline;
  gap:8px;padding:6px 12px}
.funnel.slim .fstep .n{font-size:15px}
.funnel.slim .fstep .l{margin-top:0}

/* ─── панель фильтров: один этаж высоты --ctl-h ─── */
.bar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
/* поиск — полем размером с задачу, а не с экран; .lg — где поиск и есть задача */
.bar .grow{flex:0 1 300px;min-width:190px}
.bar .grow.lg{flex:0 1 480px;min-width:280px}
/* в строке фильтров поля идут в ряд, а не каждое на всю ширину;
   длинный вариант в селекте не раздувает полосу — список внутри всё равно полный */
.bar select,.bar input[type=text]{width:auto}
.bar select{max-width:200px}
.bar .grow input{width:100%}

/* ─── поля: один рост, спокойный шрифт, мягкое кольцо фокуса (эталон UniVue) ─── */
input[type=text],input[type=date],input[type=number],input[type=password],select,textarea{
  height:var(--ctl-h);padding:0 9px;border:1px solid var(--rule);
  border-radius:var(--ctl-r);background:var(--field);
  font:400 13px/1.4 var(--body);color:var(--ink);width:100%}
input::placeholder,textarea::placeholder{color:var(--ink3)}
textarea{height:auto;min-height:56px;resize:vertical;line-height:1.5;padding:6px 9px}
input[type=text]:hover,input[type=date]:hover,input[type=number]:hover,
input[type=password]:hover,select:hover,textarea:hover{border-color:var(--blue-mid)}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--blue-mid);
  box-shadow:var(--ctl-ring)}
/* селект — видно, что раскроется: своя каретка вместо системной ямки */
select{appearance:none;-webkit-appearance:none;padding:0 26px 0 9px;color:var(--ink2);
  background-image:var(--caret);background-repeat:no-repeat;
  background-position:right 8px center}
/* фильтр с выбранным значением — «включён»: полные чернила и синяя кромка,
   класс ставит шаблон (селект сам не знает, что «любая» — это пусто) */
.bar select.on{color:var(--ink);border-color:var(--blue-mid)}
/* поиск — то же поле с тихой лупой внутри, слева */
input.si{padding-left:30px;background-image:var(--lupa);background-repeat:no-repeat;
  background-position:left 9px center}
/* ячейка формы: обычно это <label>, но там, где внутри свои отметки со своими
   подписями (роли карточки), обёрткой служит <div> — этикетка одна и та же */
label.f,div.f{display:block}
label.f .l,div.f>.l{font:600 9px/1.4 var(--mono);letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink3);display:block;margin-bottom:3px}
label.chk{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--ink2);
  white-space:nowrap;cursor:pointer}
label.chk input{width:15px;height:15px;accent-color:var(--blue)}

/* ─── кнопки: рост --ctl-h, человеческий текст вместо капса-моно ─── */
.btn{border:1px solid var(--btn);background:var(--btn);color:#fff;border-radius:var(--btnr);
  height:var(--ctl-h);padding:0 12px;font:500 13px/1 var(--body);letter-spacing:0;
  cursor:pointer;text-decoration:none;display:inline-flex;align-items:center;
  justify-content:center;gap:6px;white-space:nowrap}
.btn:hover{background:var(--btn-h);border-color:var(--btn-h)}
.btn.ghost{background:var(--field);color:var(--ink2);border-color:var(--rule)}
.btn.ghost:hover{color:var(--blue);border-color:var(--blue-mid);background:var(--field)}
.btn.small{height:var(--ctl-h-sm);padding:0 9px;font-size:12px}
.btn.warn{background:var(--field);color:var(--alert);border-color:var(--alert)}

/* ─── сетка формы ─── */
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px 16px}
.grid.wide{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.grid .span2{grid-column:span 2}
.formactions{display:flex;gap:10px;align-items:center;margin-top:16px;padding-top:14px;
  border-top:1px solid var(--rule2);flex-wrap:wrap}

/* ─── таблицы ─── */
.tbl{width:100%;border-collapse:collapse;font-size:13.5px}
.tbl th{font:600 var(--reg-head-font)/1.3 var(--mono);letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink3);text-align:left;padding:0 12px 9px;border-bottom:1px solid var(--rule);
  white-space:nowrap}
.tbl td{padding:11px 12px;border-bottom:1px solid var(--rule2);vertical-align:top}
/* ─── зебра: каждая вторая запись чуть темнее — глаз не теряет строку ───
   Правила обёрнуты в :where (нулевая специфичность): ховер, «мы», разрывы
   и раскрытые записи побеждают зебру без боя. Матрицы лет (.fin/.mini) —
   не списки, их не полосуем. В реестрах записи ходят парами со скрытым
   телом досье, поэтому там чёт считается только среди строк-записей. */
.tbl:where(:not(.fin):not(.mini):not(.reg)) tbody tr:where(:nth-child(even):not(.grp):not(.us):not(.cold):not(.secrow)) td{
  background-color:var(--zebra)}
.tbl:where(.reg) tbody tr:where(:nth-child(even of .xrow):not(.open):not(.us)) td{
  background-color:var(--zebra)}
.tbl tr:where(:not(.secrow)):hover td{background:var(--hover)}
/* ─── строка-подпись секции в составе группы: отделяет дерево головной от
   островков реестра и записей «наше решение» — без неё островки читались
   как «вторые головные» (вопрос Николая 29.08) ─── */
.tbl tr.secrow td{padding:14px 12px 3px;border-bottom:0;
  font:600 9.5px/1.3 var(--mono);letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink3)}
/* ─── колонка действий состава группы: в узком окне (карточка-слайдер) таблица
   уходит в прокрутку, и кнопки «головной»/«вывести» пропадали за краем —
   колонка липнет к правому краю, фон непрозрачный, зебра и ховер поверх ─── */
.tbl td.act,.tbl th.act{position:sticky;right:0;background:var(--panel);
  -webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  box-shadow:-10px 0 10px -10px rgba(16,36,66,.35)}
/* ─── карта владения группы (/groups/N/map): блоки и стрелки из тех же
   токенов, что и остальной портал — карта выглядит его частью ─── */
.gm-nd{fill:var(--panel2);stroke:var(--rule);stroke-width:1.2}
.gm-head{stroke:var(--card-gr);stroke-width:2}
.gm-ext{fill:var(--paper)}
.gm-band{fill:none;stroke:var(--ink3);stroke-dasharray:2 4;stroke-width:1.3}
.gm-pill{fill:var(--paper);stroke:var(--rule);stroke-width:1.2}
.gm-nm{font:600 12.5px var(--body, system-ui);fill:var(--ink)}
.gm-link{cursor:pointer}
a:hover .gm-link{text-decoration:underline}
.gm-sub{font-size:10.5px;fill:var(--ink2)}
.gm-chip{font:500 9.5px var(--mono);letter-spacing:.08em;fill:var(--card-gr)}
.gm-dead{font:400 9px var(--mono);letter-spacing:.05em;fill:var(--alert)}
.gm-sec{font:600 10px var(--mono);letter-spacing:.12em;fill:var(--ink3)}
.gm-sec-man{fill:var(--ink3)}
.gm-own{stroke:var(--ok);stroke-width:1.5;fill:none}
.gm-pct{font:500 11px var(--mono);fill:var(--ok);
  paint-order:stroke;stroke:var(--panel);stroke-width:3px;stroke-linejoin:round}
.gm-person{stroke:var(--ink3);stroke-width:1.1;stroke-dasharray:5 4;fill:none;stroke-opacity:.55}
.tbl:where(:not(.fin):not(.mini):not(.reg)) tbody tr:where(:nth-child(even):not(.grp):not(.us):not(.cold):not(.secrow)) td.act{
  background:linear-gradient(var(--zebra),var(--zebra)) var(--panel)}
.tbl tr:where(:not(.secrow)):hover td.act{background:linear-gradient(var(--hover),var(--hover)) var(--panel)}
.tbl .nm{font-weight:600;min-width:180px}
.tbl .sm{font-size:12.5px;color:var(--ink2)}
.tbl .narrow{max-width:27ch}
.tbl tr.cold td{background:var(--cold)}
.tbl tr.cold:hover td{background:var(--cold-h)}
.tbl tr.off td{opacity:.6}
/* Широкая таблица прокручивается сама, а не режется по краю экрана */
.tscroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tscroll .tbl{min-width:960px}

/* ── настройка таблицы: ширина потягиванием, порядок перетаскиванием ── */
/* Раскладка по дереву Master UniVue (18.08.2026): ширины замораживаются
   в пикселях по столбцам, остаток окна забирает добивочный столбец —
   перетаскивание одного столбца не двигает соседей. Включает table-tune.js. */
.tbl.tune-fixed{table-layout:fixed}
.tbl.tune-fixed thead th{overflow:hidden}
.tbl.tune-fixed tbody td:not([colspan]){overflow:hidden}
.tbl.tune-fixed tbody td:not([colspan]){text-overflow:ellipsis}
/* Ширину столбца задаёт только список столбцов (docs/23-UI-ЯДРО.md, правило 4).
   Потолки и подпорки ширины, написанные у отдельных ячеек, при жёсткой
   раскладке не нужны: границей служит сам столбец. Правило снимает их разом —
   и те, что остались в старых шаблонах, и те, что кто-нибудь припишет завтра. */
.tbl.tune-fixed td{max-width:none !important;min-width:0 !important}
.tbl[data-tune] th{position:relative;user-select:none}
.tune-grip{position:absolute;top:0;right:-3px;width:7px;height:100%;cursor:col-resize;z-index:2}
/* у последнего столбца ручка не выпирает за таблицу — иначе лишние 3px дают
   пустую горизонтальную прокрутку */
.tbl[data-tune] th:last-child .tune-grip{right:0}
.tune-grip:hover{background:linear-gradient(90deg,transparent 2px,var(--mark) 2px,var(--mark) 4px,transparent 4px)}
body.tune-resizing{cursor:col-resize;user-select:none}
.tbl th.tune-dragging{opacity:.45}
.tbl th.tune-over{box-shadow:inset 2px 0 0 var(--mark)}
.tune-panel{margin:0 0 10px}
.tune-list{display:flex;flex-wrap:wrap;gap:10px 20px;margin:10px 0 14px}
/* в шапке линзы настройка столбцов — тихая кнопка с поповером, не своя строка */
/* Кнопка «Столбцы» стоит в шапке линзы и не сжимается: пока она могла
   сжиматься, стрелочка отрывалась от слова и висела над ним отдельной строкой */
.tune-slot{position:relative;flex:0 0 auto}
.tune-slot .tune-panel{margin:0;border:0;background:none}
.tune-slot .tune-panel>summary{padding:0;font:500 12px/1 var(--body);letter-spacing:0;
  text-transform:none;color:var(--ink3);border:0;white-space:nowrap}
.tune-slot .tune-panel>summary::before{margin-right:5px}
.tune-slot .tune-panel>summary:hover{color:var(--blue)}
.tune-slot .tune-panel[open]>summary{border:0;color:var(--ink)}
.tune-slot .tune-panel .in{position:absolute;right:0;top:calc(100% + 8px);z-index:20;
  width:min(560px,80vw);background:var(--panel);
  -webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);border-radius:4px;box-shadow:var(--e2);padding:12px 14px}

/* наша строка в списке конкурентов: она же репер, поэтому выделена и не сливается */
.tbl tr.us td{background:var(--us);font-weight:500;border-bottom:1px solid var(--rule)}
.tbl tr.us:hover td{background:var(--us-h)}

.chip{font:600 var(--reg-chip-font)/1 var(--mono);letter-spacing:.09em;text-transform:uppercase;
  padding:var(--reg-chip-pad);
  border-radius:2px;background:var(--blue-soft);color:var(--blue);white-space:nowrap;
  display:inline-block}
/* display выше перебивает атрибут hidden — возвращаем ему силу: пустой чип
   причины (.outreason) обязан исчезать, а не висеть серым прямоугольником */
.chip[hidden]{display:none}
a.chip{text-decoration:none}
a.chip:hover{filter:var(--dimf)}
.chip.hot{background:var(--mark-soft);color:var(--mark-ink)}
.chip.bad{background:var(--alert-soft);color:var(--alert)}
.chip.good{background:var(--ok-soft);color:var(--ok)}
.chip.off{background:var(--soft-off);color:var(--ink3)}
/* чип-переключатель роли в справочнике компаний (19.08.2026).
   Роль — это только видимость в линзе, поэтому и вид у неё чиповый, а не кнопочный:
   включённая роль читается ровно как чип-пометка, выключенная в покое не видна —
   проступает при наведении на строку, как звезда. Иначе 113 карточек без роли
   встречали бы человека двумя серыми плашками в каждой строке. */
.rchip{font:600 10px/1 var(--mono);letter-spacing:.09em;text-transform:uppercase;
  padding:5px 7px;border-radius:2px;border:0;cursor:pointer;white-space:nowrap;
  background:var(--soft-off);color:var(--ink3);transition:opacity .12s,background .12s,color .12s}
.rchip.on.customer{background:var(--ok-soft);color:var(--ok)}
.rchip.on.competitor{background:var(--mark-soft);color:var(--mark-ink)}
/* две молодые отметки (задание 26) говорят тем же голосом, что и первые две:
   свой цвет каждой роли не нужен — их четыре, и радуга из чипов в строке
   перестала бы читаться. Обе берут спокойный синий портала */
.rchip.on.tech,.rchip.on.designer{background:var(--blue-soft);color:var(--blue)}
/* выключенная роль молчит, пока строка не под курсором */
tr .rchip:not(.on){opacity:0}
tr:hover .rchip:not(.on),tr .rchip:not(.on):focus-visible{opacity:1}
/* на телефоне и планшете наведения не бывает: то, что на Маке проступает под
   курсором (роль, звезда), там видно всегда — иначе до него нечем дотянуться */
@media (hover:none){tr .rchip:not(.on),tr .star:not(.on){opacity:1}}
.rchip:not(.on).customer:hover{background:var(--ok-soft);color:var(--ok)}
.rchip:not(.on).competitor:hover{background:var(--mark-soft);color:var(--mark-ink)}
.rchip:not(.on).tech:hover,.rchip:not(.on).designer:hover{
  background:var(--blue-soft);color:var(--blue)}
.rchip.on:hover{filter:var(--dimf)}
.rchip[disabled]{cursor:default}
.roles{display:inline-flex;gap:4px;align-items:center}
.roles form{margin:0}
/* две отметки роли в форме правки — рядом, одной строкой, пока хватает ширины */
.roleset{display:flex;gap:18px;flex-wrap:wrap;align-items:center;min-height:var(--ctl-h)}
/* кнопки в плашке «роли нет»: продолжают фразу, а не начинают новый этаж */
.roleact{display:inline-flex;gap:8px;margin-left:8px;vertical-align:middle}
.roleact form{margin:0}

/* Плашка категории стоит по середине строки, а не на её базовой линии: сидя на
   базовой линии, квадрат в 18 точек растягивал строку реестра до тридцати,
   и «Заказчики» шли другим шагом, чем остальные реестры. */
.cat{display:inline-block;width:var(--reg-badge);height:var(--reg-badge);border-radius:2px;
  text-align:center;vertical-align:middle;
  font:600 var(--reg-chip-font)/var(--reg-badge) var(--mono);color:#fff;background:var(--gone)}
.cat.A{background:var(--btn)} .cat.B{background:var(--blue-mid)}
.cat.C{background:var(--gone)} .cat.D{background:var(--soft-off);color:var(--ink3)}
/* кнопка-ссылка в строке таблицы: действие без рамки, голосом тихой ссылки */
.linkbtn{border:0;background:none;padding:0;font:inherit;font-size:12px;
  color:var(--link);cursor:pointer}
.linkbtn:hover{color:var(--blue);text-decoration:underline}
/* счётчик состава группы — той же геометрии, что категория, но тихий */
.gn{display:inline-block;min-width:18px;height:18px;padding:0 3px;border-radius:2px;
  text-align:center;font:600 10px/18px var(--mono);font-variant-numeric:tabular-nums;
  color:var(--ink2);background:var(--soft-off)}

/* ─── карточка ─── */
.kv{display:grid;grid-template-columns:190px 1fr;gap:7px 16px;font-size:13.5px;line-height:1.55;
  align-content:start}
.kv dt{font:600 10px/1.5 var(--mono);letter-spacing:.11em;text-transform:uppercase;
  color:var(--ink3);padding-top:2px}
.kv dd{margin:0;color:var(--val)}
.two{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--sp);
  align-items:start}
@media (max-width:1000px){.two{grid-template-columns:1fr}}
.note{background:var(--blue-soft);border-left:2px solid var(--blue-mid);padding:11px 13px;
  font-size:13px;line-height:1.55;margin:14px 0 0}
.note.warn{background:var(--mark-soft);border-left-color:var(--mark)}
.note.bad{background:var(--alert-soft);border-left-color:var(--alert)}

/* ─── журнал взаимодействий ─── */
.log{display:flex;flex-direction:column;gap:9px;margin-top:6px}
.entry{border:1px solid var(--rule2);border-left:3px solid var(--blue-mid);border-radius:2px;
  padding:11px 13px;background:var(--field)}
.entry.moved{border-left-color:var(--ok)}
.entry.back{border-left-color:var(--alert)}
.entry.mark{border-left-color:var(--rule);background:var(--panel2)}
.entry .top{display:flex;gap:10px;flex-wrap:wrap;align-items:baseline;
  font:600 11px/1 var(--mono);color:var(--ink2)}
/* крестик администратора у записи журнала: тихий, краснеет под курсором */
.entry-x{border:0;background:none;padding:0 2px;font:400 14px/1 var(--body);
  color:var(--ink3);cursor:pointer}
.entry-x:hover{color:var(--alert)}
.entry .top .d{color:var(--ink)}
.entry .txt{margin-top:7px;font-size:13.5px;line-height:1.55}
.entry .txt b{font-weight:600}
.entry .prom{margin-top:8px;padding-top:8px;border-top:1px solid var(--rule2);font-size:13px}
.entry .prom.due{color:var(--alert)}

details.box{border:1px solid var(--rule2);border-radius:3px;margin-top:12px;background:var(--panel2)}
details.box>summary{cursor:pointer;padding:10px 13px;font:600 11px/1 var(--mono);
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink2);list-style:none}
details.box>summary::-webkit-details-marker{display:none}
/* стрелочка вниз — знак «кликни, откроется»; открытое переворачивает её */
details.box>summary::before{content:"▾";display:inline-block;margin-right:9px;
  font-size:10px;color:var(--ink3);transition:transform .18s ease}
details.box[open]>summary::before{transform:rotate(-180deg)}
details.box>summary:hover{color:var(--blue)}
details.box[open]>summary{border-bottom:1px solid var(--rule2);color:var(--ink)}
details.box .in{padding:14px}
/* вложенная свёртка в ячейке таблицы: без своей рамки и фона */
details.box.flat{margin:0;border:0;background:none}
/* плавное раскрытие свёртков — той же скоростью, что и строки реестра */
@media (prefers-reduced-motion:no-preference){
  :root{interpolate-size:allow-keywords}
  details.box::details-content{block-size:0;overflow:clip;
    transition:block-size .22s ease,content-visibility .22s allow-discrete}
  details.box[open]::details-content{block-size:auto}
}

/* ─── зоны источников на карточке ───
   Видно, что откуда обновляется: у каждой зоны имя, метка источника и своя
   кнопка обновления в заголовке. Рамка — граница ответственности источника. */
.zone{margin-top:12px;border:1px solid var(--rule2);border-radius:2px;padding:9px 12px 12px}
.zone .zh{display:flex;gap:4px 14px;align-items:baseline;flex-wrap:wrap;margin-bottom:4px}
.zone .zh b{font:600 9.5px/1.8 var(--mono);letter-spacing:.11em;text-transform:uppercase;
  color:var(--ink2)}
.zone .zh .spacer{flex:1}
.zone>p{margin:4px 0 2px}
/* свежесть зоны: когда данные обновлялись — месяц зелёным, до года жёлтым,
   дольше — красным; тона бледные, кричать индикатору нельзя */
.fchip{font:500 10px/1 var(--mono);letter-spacing:.04em;padding:4px 7px;border-radius:2px;
  white-space:nowrap}
.f-ok{background:var(--ok-soft);color:var(--f-ok)}
.f-mid{background:var(--mark-soft);color:var(--f-mid)}
.f-bad{background:var(--alert-soft);color:var(--f-bad)}

/* плотная таблица карточки: одна строка на запись, 22px, лишнее — многоточием */
.tbl.dense{font-size:var(--reg-font)}
.tbl.dense th{padding:0 var(--reg-pad-x) var(--reg-head-pad)}
.tbl.dense td{padding:var(--reg-pad-y) var(--reg-pad-x);line-height:var(--reg-line);
  white-space:nowrap;vertical-align:top}
.tbl.dense td.el{max-width:min(400px,26vw);overflow:hidden;text-overflow:ellipsis}
/* ячейка с прозой в плотной таблице: перенос разрешён, строка чуть дышит */
.tbl.dense td.wr{white-space:normal;line-height:1.45;padding-top:4px;padding-bottom:4px}
.tbl.dense .chip{font-size:9px;padding:2px 5px}
.tbl.dense .src{display:block;line-height:16px}
/* подпись места в строке объектов карточки — в той же строке, не этажом */
#objects .tbl.dense .src{display:inline;line-height:inherit;margin-left:4px}

/* ужатые панели карточки компании: тот же лист, меньше воздуха */
.panel.tight{padding:14px clamp(14px,1.8vw,22px) 16px}
.panel.tight h2{margin:14px 0 8px;padding-top:11px}
.panel.tight h2:first-child{margin-top:0;padding-top:0}
.panel.tight h3{margin:12px 0 6px}
.sum.compact{gap:16px}
.sum.compact b{font-size:17px}

/* ─── происхождение цифр ───
   Один язык на всю карточку: тихая моноширинная подпись у блока или под цифрой.
   Ровно три пометки: «≡ источник · дата», «✎ введено рукой», «Σ посчитано». */
.src{font:500 10.5px/1.5 var(--mono);color:var(--ink3);letter-spacing:.02em}
/* заголовок блока с подписью происхождения справа */
.bh{display:flex;justify-content:space-between;align-items:baseline;gap:14px;flex-wrap:wrap}
.bh h2{margin:0;padding:0;border:0}
/* разделы, у которых источник ещё не подключён: честные тихие строки, без кнопок */
.planned{margin-top:16px;border-top:1px solid var(--rule2);padding-top:12px;
  display:flex;flex-direction:column;gap:7px}
.planned .p{display:flex;gap:12px;align-items:baseline;flex-wrap:wrap}
.planned .p b{font:600 9.5px/1.4 var(--mono);letter-spacing:.11em;text-transform:uppercase;
  color:var(--ink3)}
.planned .p span{font-size:12.5px;color:var(--ink3)}
/* подраздел с данными на месте бывшей тихой строки: тот же заголовок,
   но обычной краской — раздел больше не «в планах» */
.subsec{margin-top:16px;border-top:1px solid var(--rule2);padding-top:12px}
.subsec .sh{display:flex;gap:12px;align-items:baseline;flex-wrap:wrap;margin-bottom:2px}
.subsec .sh b{font:600 9.5px/1.4 var(--mono);letter-spacing:.11em;text-transform:uppercase;
  color:var(--ink2)}

/* ─── карточки поверх страницы: окно и половины ───
   Открывает modal.js: первая карточка — почти весь экран, по краям видна
   страница-подложка (как слайдер в Битрикс24). Ссылка на карточку из открытой
   карточки НЕ закрывает её: окно делится пополам, старая слева, новая справа;
   третья сдвигает ленту влево. Каждую половину закрывает свой крестик; Esc —
   правую, клик по подложке — все сразу. Без скрипта ссылки работают как страницы. */
dialog.cardstack{width:min(1500px,88vw);height:93vh;max-height:93vh;padding:0;border:0;
  background:transparent;gap:10px;overflow:visible}
/* одна карточка — окно скромнее, подложка видна (просьба Николая 23.08);
   открылась вторая половина — окно раздаётся почти на весь экран,
   чтобы обе карточки остались читаемыми */
dialog.cardstack:has(.cardpane ~ .cardpane){width:min(1920px,96vw)}
dialog.cardstack[open]{display:flex}
/* подложка без размытия и полупрозрачная: страница-список остаётся читаемой,
   по ней видно, куда вернёшься; клик по ней закрывает все карточки (modal.js) */
dialog.cardstack::backdrop{background:rgba(10,14,20,.32)}
/* подложка стоит на месте: body фиксируется со сдвигом на текущую прокрутку,
   modal.js возвращает прокрутку при закрытии */
html.modal-open{overflow:hidden}
html.modal-open body{position:fixed;left:0;right:0}
/* половина окна = одна карточка: кромка-тон сверху, свой крестик, своя прокрутка.
   Одна половина занимает всё окно, две делят его поровну. */
.cardpane{position:relative;flex:1 1 0;min-width:0;display:flex;flex-direction:column;
  border-radius:6px;box-shadow:var(--e2);
  border-top:3px solid var(--ctint,var(--rule));
  background:color-mix(in srgb,var(--paper),var(--ctint,var(--paper)) var(--card-mix2))}
.cardmodal-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;
  padding:20px clamp(16px,2vw,26px) 56px;outline:none}
.cardmodal-close{position:absolute;top:10px;right:12px;z-index:8;
  width:var(--ctl-h);height:var(--ctl-h);border:1px solid var(--rule);
  border-radius:var(--ctl-r);background:var(--panel);color:var(--ink2);
  font:400 17px/1 var(--body);cursor:pointer}
.cardmodal-close:hover{color:var(--alert);border-color:var(--alert)}
.cardmodal-wait{margin:26px;font:13px var(--body);color:var(--ink3)}
/* плашка после действия липнет к верху прокрутки своей половины: человек
   остаётся у той кнопки, которую нажал, а ответ портала всё равно на виду */
.cardmodal-body .flash{position:sticky;top:0;z-index:7;margin:0 0 12px;
  box-shadow:0 6px 14px -8px rgba(0,0,0,.5),0 1px 0 var(--rule)}
@media (prefers-reduced-motion:no-preference){
  .cardpane{animation:pane-in .16s ease-out}
  @keyframes pane-in{from{opacity:0;transform:translateX(18px)}to{opacity:1;transform:none}}
}
/* ссылка на карточку, уже открытую в соседней половине: копию не плодим,
   миг подсветки показывает, где она */
.cardpane.pulse{animation:pane-pulse .55s ease-out}
@keyframes pane-pulse{from{box-shadow:0 0 0 3px var(--ctint,var(--blue)),var(--e2)}
  to{box-shadow:var(--e2)}}
/* совсем узкий экран, а половин уже две (окно сузили после открытия):
   половины встают друг под друга, обе остаются читаемыми */
@media (max-width:1100px){dialog.cardstack[open]{flex-direction:column}}

/* ─── тона карточек: в окне и на полной странице один голос ───
   компания синеватая, объект зеленоватый, группа фиолетовая; краска из токенов
   --card-* подмешивается в панели, тему уважает color-mix */
.pane-company,body.page-company{--ctint:var(--card-co)}
.pane-object,body.page-object{--ctint:var(--card-ob)}
.pane-group,body.page-group{--ctint:var(--card-gr)}
.pane-company .panel,.pane-object .panel,.pane-group .panel,
body.page-company .panel,body.page-object .panel,body.page-group .panel{
  background:color-mix(in srgb,var(--panel),var(--ctint) var(--card-mix))}
/* номер в шапке карточки — чип в её тоне: «К-…» синий, «О-…» зелёный,
   «Группа» фиолетовая; шрифт наследует eyebrow */
.eid{display:inline-block;padding:2px 7px;border-radius:4px;
  background:color-mix(in srgb,var(--ctint,var(--ink3)),transparent 86%);
  color:color-mix(in srgb,var(--ctint,var(--ink3)),var(--ink) 30%)}

/* ─── документ (учебник) ─── */
.doc{max-width:90ch;font-size:14.5px;line-height:1.68}
.doc h1{font:600 22px/1.25 var(--disp);margin:0 0 14px}
.doc h2{font:600 17px/1.3 var(--disp);margin:32px 0 10px;padding-top:20px;border-top:1px solid var(--rule2)}
.doc h3{font:600 14.5px/1.35 var(--disp);margin:22px 0 7px}
.doc p{margin:0 0 12px}
.doc ul,.doc ol{margin:0 0 12px;padding-left:22px}
.doc li{margin-bottom:5px}
.doc table{border-collapse:collapse;font-size:13.5px;margin:14px 0;width:100%}
.doc th{text-align:left;font:600 9.5px/1.3 var(--mono);letter-spacing:.11em;text-transform:uppercase;
  color:var(--ink3);border-bottom:1px solid var(--rule);padding:0 10px 7px}
.doc td{padding:8px 10px;border-bottom:1px solid var(--rule2);vertical-align:top}
.doc blockquote{margin:14px 0;padding:11px 14px;background:var(--mark-soft);
  border-left:2px solid var(--mark);font-size:13.5px}
.doc code{font:13px var(--mono);background:var(--code-bg);padding:1px 4px;border-radius:2px}
.doc pre{background:var(--code-bg);padding:12px;overflow-x:auto;border-radius:2px}
.doclist{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px}

/* ─── шапка раздела с подстраницами (источники: реестр / каналы) ─── */
.split{display:flex;justify-content:space-between;gap:20px;align-items:flex-start;flex-wrap:wrap}
.subtabs{display:flex;gap:6px;flex-shrink:0;padding-top:3px}
/* вкладка-пилюля (карточка компании, календарь, источники) — по образцу
   Master UniVue (просьба Николая 17.08): человеческий текст вместо машинописного
   капса, активная — мягкая заливка, счётчик — кружком .tct */
.stab{border:1px solid var(--rule);border-radius:var(--ctl-r);background:var(--field);
  color:var(--ink2);height:var(--ctl-h);padding:0 12px;font:500 13px/1 var(--body);
  letter-spacing:-.005em;text-decoration:none;display:inline-flex;align-items:center;
  gap:7px;cursor:pointer;white-space:nowrap}
.stab:hover{color:var(--blue);border-color:var(--blue-mid)}
.stab.on{background:var(--blue-soft);border-color:var(--blue-mid);color:var(--blue-deep);
  font-weight:600}
.stab .tct{font:600 10px/1 var(--mono);font-variant-numeric:tabular-nums;color:var(--ink3);
  background:var(--soft-off);border-radius:999px;padding:3px 7px}
.stab.on .tct{background:var(--panel);color:var(--blue-deep)}

/* кнопка-иконка 28px (добавить, выгрузить, корзина): действие узнаётся по
   знаку, слова — в подсказке. Размер и голос — как у контролов UniVue */
.icobtn{position:relative;display:inline-flex;align-items:center;justify-content:center;
  width:var(--ctl-h);height:var(--ctl-h);border:1px solid var(--rule);
  border-radius:var(--ctl-r);background:var(--field);color:var(--ink2);cursor:pointer;
  text-decoration:none;flex:0 0 auto;padding:0}
.icobtn:hover{color:var(--blue);border-color:var(--blue-mid)}
.icobtn svg{width:15px;height:15px;display:block}
.icobtn.primary{background:var(--btn);border-color:var(--btn);color:#fff}
.icobtn.primary:hover{background:var(--btn-h);color:#fff}
/* числовая крошка в углу иконки (корзина · N) */
.icobtn .bdg{position:absolute;top:-6px;right:-6px;min-width:15px;height:15px;
  padding:0 4px;border-radius:999px;background:var(--soft-off);color:var(--ink2);
  font:600 9px/15px var(--mono);text-align:center;box-shadow:0 0 0 2px var(--panel)}
/* вкладки карточки компании: те же плитки, что у подстраниц источников */
.ctabs{margin-top:12px}
.ctabs .stab{cursor:pointer}

/* ─── вкладка «Работа»: строка действий, раскрывные формы, «что дальше» ───
   Всё, что человек записывает, — кнопками в одной строке; форма раскрывается
   под ней, по одной за раз. Невыполненные обещания — плотные строки с датой,
   просроченное горит. Журнал и люди — зоны, как на финансах: один голос. */
.wbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:2px 0 2px}
.wbar .spacer{flex:1}
.wbar .btn.on{background:var(--btn-h);border-color:var(--btn-h);color:#fff}
.wform{margin-top:10px;border:1px solid var(--rule2);border-left:2px solid var(--blue-mid);
  border-radius:3px;background:var(--panel2);padding:10px 12px 12px}
.wform>h3{margin:0 0 8px;font:600 9.5px/1 var(--mono);letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink2)}
/* форма — плотная: поля ниже и мельче, сетка теснее, длинные поля не выше
   двух строк. Запись разговора должна умещаться на экран целиком */
.wform .grid{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:8px 12px}
.wform .grid.wide{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
.wform textarea{min-height:38px}
.wform label.f .l{margin-bottom:2px}
.wform label.chk{font-size:12.5px}
.wform .note{padding:8px 11px;font-size:12px;margin-top:10px}
.wform .formactions{margin-top:10px;padding-top:9px}
.next-list{display:flex;flex-direction:column;gap:3px;margin-top:4px}
.next-list .nx{display:flex;gap:12px;align-items:baseline;font-size:13px;line-height:1.55;
  min-width:0}
.nx .d{flex:0 0 auto;min-width:52px;font:500 11px/1.55 var(--mono);color:var(--ink3);
  white-space:nowrap;font-variant-numeric:tabular-nums}
.nx .t{min-width:0;color:var(--val)}
.nx .t b{font:600 9.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink3)}
.nx.due .d{color:var(--alert);font-weight:600}
.nx.due .t{color:var(--ink)}

/* ─── реестровые карточки: источники и конкуренты ─── */
.cards{display:flex;flex-direction:column;gap:7px}
.card{border:1px solid var(--rule2);border-left:3px solid var(--blue-mid);border-radius:2px;background:var(--panel)}
.card.hi{border-left-color:var(--mark)}
.card.dead{border-left-color:var(--rule);opacity:.62}
.card>summary{list-style:none;cursor:pointer;padding:12px 16px;display:grid;
  grid-template-columns:auto minmax(0,1fr) auto;gap:4px 18px;align-items:start}
.card>summary::-webkit-details-marker{display:none}
.card>summary:hover{background:var(--hover)}
.card[open]>summary{border-bottom:1px solid var(--rule2);background:var(--panel2)}
.cmain .nm{font:600 14.5px/1.35 var(--disp);letter-spacing:-.01em;margin:0}
.cmain .sub{font:12px/1.5 var(--body);color:var(--ink2);margin:3px 0 0}
.rr{display:flex;gap:7px;flex-wrap:wrap;justify-content:flex-end;align-items:center;padding-top:2px}
.cbody{padding:2px 16px 16px}

/* процент и полоса рейтинга источника */
.pcw{width:64px}
.pc{font:600 17px/1 var(--disp);letter-spacing:-.02em;text-align:right;padding-top:2px;
  font-variant-numeric:tabular-nums}
.pc small{font:500 10px var(--mono);color:var(--ink3);margin-left:1px}
.pbar{height:3px;background:var(--rule2);border-radius:2px;margin-top:6px;overflow:hidden}
.pbar i{display:block;height:100%;background:var(--blue)}
.pbar i.hi{background:var(--mark)}

/* ─── единый реестр конкурентов ───
   Одна таблица вместо «карточек» и «финансов»: свёрнутая строка — два текстовых
   этажа, всё остальное живёт в раскрытии. Таблица прокручивается в своём окне,
   поэтому шапка и строка «мы» всегда на глазах. */
.fresh{font:500 11px/1 var(--mono);color:var(--ink3);text-align:right;margin:0 0 7px}
/* место под полосу прокрутки списка занято всегда: иначе короткий список идёт
   без полосы, длинный — с полосой, и правый край таблицы дёргается */
.treg{max-height:calc(100vh - 151px);min-height:340px;overflow:auto;
  scrollbar-gutter:stable;-webkit-overflow-scrolling:touch}
.treg .tbl{min-width:1120px}
/* специфичность не ниже, чем у .tbl[data-tune] th{position:relative} — иначе шапка не липнет.
   Шапка чуть просвечивает и размывает строки, уезжающие под неё, — так видно,
   что список едет, а шапка стоит */
.treg .tbl[data-tune] thead th,.treg .tbl thead th{position:sticky;top:0;z-index:6;
  background:var(--panel);
  background:color-mix(in srgb,var(--panel) 82%,transparent);
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  padding:var(--reg-head-pad) var(--reg-pad-x)}
/* строка реестра — статичные два этажа: главный 22px + подпись 16px, поля по 4px.
   Всё, что не влезает, обрезается многоточием — остальное живёт в раскрытии */
.tbl.reg{font-size:var(--reg-font)}
.tbl.reg td{padding:var(--reg-pad-y) var(--reg-pad-x);line-height:var(--reg-line)}
/* ─── рост строки задан числом, а не содержимым ───
   Пока высоту строки определяло то, что в ней лежит, она у каждого реестра
   выходила своя: 27 у заказчиков, 26,5 у групп, 25 у источников. Одна и та же
   запись на соседних вкладках стояла на разной высоте, и список при
   переключении ехал. Теперь рост приходит из общего набора плотности, а
   содержимое стоит по середине строки. Ячейки на всю ширину (досье, складка,
   «ничего не найдено») правилу не подчиняются — у них своя высота. */
.tbl.reg[data-tune] tbody td:not([colspan]){height:var(--reg-row-h);
  padding-top:0;padding-bottom:0;vertical-align:middle;white-space:nowrap}
/* Шаг строки у всех реестров один. Ломали его украшения: плашка, чип, кружок
   с лицом — это инлайновые блоки, и стоя на базовой линии каждый резервирует
   под собой место под «хвосты» букв. Строка от этого росла на три-пять точек,
   у «Заказчиков» до тридцати против двадцати семи у остальных, и при
   переключении вкладок список ехал. По середине строки они место не просят. */
.tbl.reg td .chip,.tbl.reg td .cat,.tbl.reg td .avaline,.tbl.reg td .ava,
.tbl.reg td .gchip,.tbl.reg td .tct,.tbl.reg td .stepdot{vertical-align:middle}
/* свёрнутая запись — строго одна полоса: ничего не переносится, длинное
   обрезается многоточием (полное — в раскрытии и в подсказке) */
.tbl.reg tr.xrow>td{white-space:nowrap}
.tbl td.el{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tbl.reg .nm2{min-width:230px;max-width:420px}
.reg .l1{display:block;line-height:var(--reg-line);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* наша строка — липкий репер сразу под шапкой, с воздухом-разрывом после себя.
   top на 1px меньше высоты шапки: строка заходит ПОД неё, иначе между ними
   остаётся волосяная щель, сквозь которую мелькают уезжающие строки. Рост
   шапки берём из набора плотности: своим числом (22) он в плотном наборе
   промахивался мимо шапки на 1,8 точки, и щель возвращалась. */
.tbl tr.us.pin td{position:sticky;top:calc(var(--reg-head-h) - 1px);z-index:5;background:var(--us);
  border-bottom:6px solid var(--gapc)}
.usnm{font:500 13.5px/22px var(--disp);letter-spacing:-.01em}
/* заголовки секций: фавориты и остальные */
.tbl tr.grp td{padding:12px 10px 4px;background:var(--panel);border-bottom:1px solid var(--rule);
  font:600 9.5px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--ink3)}
.tbl tr.grp:hover td{background:var(--panel)}
.catcell{width:38px;white-space:nowrap}
/* ─── тумблер «отслеживаемые / все» в шапке линзы ───
   Вправо-зелёный — показываем только звёзды (режим по умолчанию у компаний).
   Это ссылка на противоположный режим: без скриптов, состояние в адресе. */
.tgl{display:inline-flex;align-items:center;gap:7px;font:500 12px/1 var(--body);
  color:var(--ink2);text-decoration:none;cursor:pointer;white-space:nowrap}
.tgl i{width:30px;height:16px;border-radius:8px;background:var(--soft-off);
  position:relative;box-shadow:inset 0 0 0 1px var(--rule);transition:background .15s}
.tgl i::after{content:"";position:absolute;left:2px;top:2px;width:12px;height:12px;
  border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.3);transition:left .15s}
.tgl:hover{color:var(--blue)}
.tgl.on{color:var(--ok)}
.tgl.on i{background:var(--ok);box-shadow:none}
.tgl.on i::after{left:16px}

/* кружки-фото людей (из оргструктуры); без фото — инициалы на тихом фоне.
   Зона кружков — фиксированной ширины под три штуки со срезом внахлёст:
   текст справа у всех строк начинается на одной вертикали (образец Николая) */
.avaline{display:inline-flex;align-items:center;min-width:0;max-width:100%}
.avastack{flex:0 0 46px;display:flex;align-items:center}
.avaline .t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* кружок с лицом живёт в общем наборе плотности: в плотном наборе он тоже
   ужимается, иначе именно он держал строку выше положенного */
.ava{flex:0 0 auto;width:var(--reg-ava);height:var(--reg-ava);border-radius:50%;
  background:var(--blue-soft) center/cover no-repeat;
  font:600 8px/var(--reg-ava) var(--mono);color:var(--blue-deep);text-align:center;
  box-shadow:0 0 0 2px var(--panel)}
.avastack .ava + .ava{margin-left:calc(var(--reg-ava) * -0.4)}

/* ─── дерево куратора в сводке: компании, у компании — объекты ветвями ───
   Раскрытие строки — общий механизм реестров (registry.js), объекты — стрелкой
   details.more. Строки 22px, ветка объектов — тонкая линия слева. */
.cur-tree{margin:10px 0 6px;display:flex;flex-direction:column;gap:1px}
.cur-tree .ct-plain,.cur-tree details.ct>summary{display:flex;gap:9px;align-items:baseline;
  line-height:22px;min-width:0}
.cur-tree .ct-plain{padding-left:19px}   /* без стрелки — на одной оси со стрелочными */
.cur-tree details.ct>summary{cursor:pointer;list-style:none}
.cur-tree details.ct>summary::-webkit-details-marker{display:none}
.cur-tree details.ct>summary::before{content:"▸";flex:0 0 10px;font-size:9px;
  color:var(--ink3);transition:transform .15s ease;line-height:22px}
.cur-tree details.ct[open]>summary::before{transform:rotate(90deg)}
.cur-tree details.ct>summary:hover .ct-nm{color:var(--blue)}
.ct-nm{color:var(--name);text-decoration:none;font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct-nm:hover{color:var(--blue)}
.cur-tree .star.on{font-size:10px}
.ct-objs{margin:1px 0 6px 20px;border-left:1px solid var(--rule2);padding-left:13px;
  display:flex;flex-direction:column;gap:1px}
.ct-obj{display:flex;gap:9px;align-items:baseline;line-height:22px;min-width:0}
.ct-obj a{color:var(--link);text-decoration:none;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.ct-obj a:hover{color:var(--blue);text-decoration:underline}
@media (prefers-reduced-motion:no-preference){
  .cur-tree details.ct::details-content{block-size:0;overflow:clip;
    transition:block-size .18s ease,content-visibility .18s allow-discrete}
  .cur-tree details.ct[open]::details-content{block-size:auto}
}

/* красная точка у категории: у компании есть красные факты (статус, банкротство,
   чёрные списки — по данным Чекко/ФНС); что именно — в подсказке и в карточке */
.fdot{display:inline-block;width:7px;height:7px;border-radius:50%;
  background:var(--alert);margin-left:4px;vertical-align:5px}
/* строка красных фактов в зоне Чекко на карточке */
.flagline{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin:6px 0 4px}
/* Звезда фаворита — у самого названия, маленькая, но своего цвета: серой её
   было не отличить от чужой строки под курсором, и «показать только
   отслеживаемые» выглядело как «показать всё». Размер оставлен прежним —
   в ряду из трёхсот строк кричать ей незачем. У не-фаворита звезда
   проступает только при наведении на строку и по клавиатурному фокусу. */
.nmline{display:flex;gap:2px;align-items:center;min-width:0}
/* отступ дерева владения в составе группы: уголок тихим цветом, ширина по уровню */
.tind{display:inline-block;flex:0 0 auto;font:11px/22px var(--mono);color:var(--ink3);
  text-align:right;padding-right:3px;user-select:none}
.star{border:0;background:none;padding:0 5px;font-size:10px;line-height:var(--reg-line);
  color:var(--star);cursor:pointer}
.star:hover{color:var(--ink2)}
.star.on{color:var(--star-on)}
tr .star:not(.on){opacity:0}
tr:hover .star:not(.on),tr .star:not(.on):focus-visible{opacity:1}
/* имя-кнопка раскрытия с чевроном; полужирный 500 и чернила чуть светче —
   плотный список из жирных чёрных имён напрягал глаза */
/* Указатель-рука — только там, где строка и правда раскрывается щелчком.
   У «Людей» строка — тоже запись (зебра, тихие ссылки), но дерево компаний
   открывает плюсик, и рука над такой строкой обещала бы несуществующее. */
tr.xrow:has(.xbtn){cursor:pointer}
.xbtn{border:0;background:none;padding:0;max-width:100%;display:flex;gap:7px;align-items:baseline;
  font:500 var(--reg-name-font)/var(--reg-line) var(--disp);letter-spacing:-.01em;
  color:var(--name);cursor:pointer;text-align:left}
.xbtn:hover{color:var(--blue)}
.xbtn .t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* плавное раскрытие досье: решётка 0fr → 1fr разворачивает настоящую высоту
   содержимого без прыжка; при отключённой анимации срабатывает сразу */
.xwrap{display:grid;grid-template-rows:0fr}
.xwrap.open{grid-template-rows:1fr}
.xwrap>.xin{overflow:hidden;min-height:0}
@media (prefers-reduced-motion:no-preference){
  .xwrap{transition:grid-template-rows .22s ease}
}
/* календарь: день недели тихим знаком перед числами, ближайшие две недели — жирно.
   Межстрочный — из общего набора плотности: своим числом он раздувал строку
   списка в плотном наборе (22 против 20) */
.reg .dow{display:inline-block;min-width:20px;
  font:500 10px/var(--reg-line) var(--mono);color:var(--ink3)}
.reg .soon{font-weight:600;color:var(--ink)}
/* баллы и рост: цвет — только у сигнала (60 и выше, падение/рост) */
.reg .sc{font-weight:500;font-variant-numeric:tabular-nums}
.reg .sc.ok{color:var(--ok)} .reg .sc.al{color:var(--alert)}
.reg .xs{display:block;font:10px/16px var(--mono);color:var(--ink3);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
/* текстовые столбцы не раздувают таблицу: длинное обрезается, полное — в раскрытии */
.tbl.reg td.sm{max-width:210px;font-size:var(--reg-font)}
/* чип в обрезаемой ячейке (имя группы) режется многоточием по ширине столбца:
   растянул столбец — имя раскрылось, сузил — спряталось; текст не режем на сервере */
.tbl td.el .chip{max-width:100%;overflow:hidden;text-overflow:ellipsis;
  vertical-align:text-bottom}
/* ссылка в свёрнутой строке реестра (заказчик у объекта) — тихая, как все данные */
.tbl.reg tr.xrow td a:not(.btn){color:var(--link);text-decoration:none}
.tbl.reg tr.xrow td a:not(.btn):hover{color:var(--blue);text-decoration:underline}

/* ─── дерево «плюсиком»: у заказчика раскрываются его лоты и объекты ───
   Плюс живёт перед именем; у компаний без работы — пустая прокладка той же
   ширины, чтобы имена всех строк стояли вровень. */
.twix,.twix-slot{flex:0 0 15px;width:15px;height:15px}
.twix{border:1px solid var(--rule);border-radius:4px;background:var(--field);
  color:var(--ink3);cursor:pointer;padding:0;font:500 12px/13px var(--mono);text-align:center}
.twix::before{content:'+'}
.twix[aria-expanded="true"]::before{content:'−'}
.twix:hover{border-color:var(--blue-mid);color:var(--blue-deep)}
/* вложенная строка: уголок-ветка, номер, имя, короткая мета и воронка справа.
   Свободная вёрстка в одной ячейке на всю ширину — «Столбцы» такие строки
   не трогают (colspan), зебра считает только строки-записи. */
tr.krow>td{padding:0 10px;border-bottom:1px solid var(--rule2)}
.kid{display:flex;gap:9px;align-items:center;min-width:0;padding:2px 0 2px 34px;line-height:20px}
/* таблица реестра бывает шире окна — ребёнок, как и досье, липнет к видимой
   ширине: воронка справа всегда на экране, вбок ездят только столбцы */
.treg tr.krow .kid{position:sticky;left:20px;width:calc(100cqw - 40px)}
.kid .kguide{flex:0 0 9px;height:14px;margin-top:-8px;border-left:1px solid var(--rule);
  border-bottom:1px solid var(--rule);border-radius:0 0 0 3px}
.kid .kn0{flex:0 0 44px;font:500 10px/1 var(--mono);letter-spacing:.05em;
  text-transform:uppercase;color:var(--ink3)}
.kid .kn{flex:0 1 auto;min-width:120px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;font:500 12.5px/20px var(--body)}
.kid .kn .chip{margin-left:6px;font-size:9px;padding:2px 5px}
.kid .km{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;font:400 11.5px/20px var(--body);color:var(--ink3)}
.kid .funnel{flex:0 0 auto;margin-left:auto}
tr.krow.off>td{opacity:.62}

/* ─── воронка работы по лоту и объекту: лента ступеней + исходы значками ───
   Один вид везде: дерево заказчиков, карточка компании, карточка объекта.
   Пройденное — мягкая заливка, текущая ступень — синяя. Исходы справа сжаты
   до значков (✓ ✕ ‖ −), слово разворачивается только у выбранного — лента
   остаётся короткой даже с четырьмя исходами. Клик — фоном (registry.js). */
.funnel{display:inline-flex;gap:8px;align-items:center;margin:0}
.funnel .steps,.funnel .outs{display:inline-flex}
.funnel button{height:20px;padding:0 7px;border:1px solid var(--rule);margin:0;
  background:var(--field);font:500 11px/1 var(--body);color:var(--ink3);
  cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;gap:4px}
.funnel button+button{margin-left:-1px}
.funnel .steps button:first-child{border-radius:var(--ctl-r) 0 0 var(--ctl-r)}
.funnel .steps button:last-child{border-radius:0 var(--ctl-r) var(--ctl-r) 0}
.funnel .outs button:first-child{border-radius:var(--ctl-r) 0 0 var(--ctl-r)}
.funnel .outs button:last-child{border-radius:0 var(--ctl-r) var(--ctl-r) 0}
.funnel button:hover{border-color:var(--blue-mid);color:var(--blue-deep);
  position:relative;z-index:1}
.funnel button.done{background:var(--blue-soft);color:var(--blue-deep)}
/* текущая ступень — голосом первичной кнопки: пара --btn/белый живёт во всех темах */
.funnel button.cur{background:var(--btn);border-color:var(--btn);color:#fff;
  font-weight:600;position:relative;z-index:1}
/* исходы: значок ровной ширины, слово видно только у выбранного */
.funnel .outs button{padding:0 5px;min-width:21px;justify-content:center}
.funnel .outs i{font-style:normal;font-size:10px;line-height:1}
.funnel .outs em{font-style:normal;display:none}
.funnel .outs button.cur{padding:0 7px}
.funnel .outs button.cur em{display:inline}
/* цвета исходов — парами чипов (мягкий фон + свой цвет), контраст живёт во всех темах:
   0 выиграли · 1 проиграли · 2 отложен (их пауза) · 3 не пошли (наш отказ) */
.funnel .outs button[data-out="0"].cur{background:var(--ok-soft);color:var(--ok);border-color:var(--ok)}
.funnel .outs button[data-out="1"].cur{background:var(--alert-soft);color:var(--alert);border-color:var(--alert)}
.funnel .outs button[data-out="2"].cur{background:var(--mark-soft);color:var(--mark-ink);border-color:var(--mark)}
.funnel .outs button[data-out="3"].cur{background:var(--soft-off);color:var(--ink2);border-color:var(--gone)}
/* работа закрыта исходом — лента ступеней отходит на второй план */
.funnel.closed .steps button{opacity:.55}
.funnel.closed .steps button:hover{opacity:1}
/* наблюдателю воронка видна, но не нажимается и не отзывается на курсор */
.funnel.ro button{pointer-events:none}
/* воронка строкой в шапке карточки объекта: тихая подпись + лента */
.funnelrow{display:flex;gap:12px;align-items:center;margin-top:14px;flex-wrap:wrap}
.funnelrow .spacer{flex:1}

/* ─── дисциплина воронки (docs/19) ───
   «В ступени N дн» — тихий хронометр положения; пересидел порог своей
   ступени — цифра краснеет. Только цвет, никаких заливок строк. */
.indays{font:500 11px/1 var(--mono);color:var(--ink3);white-space:nowrap}
.indays.bad{color:var(--alert);font-weight:600}
/* точки дисциплины в реестрах: жёлтая — следующий шаг не назначен (пустота
   тревожнее просрочки), красная — шаг просрочен или пора вернуться
   к отложенному. Точка, не чип: сигнал, а не текст. */
.stepdot{flex:0 0 7px;width:7px;height:7px;border-radius:50%;display:inline-block}
.stepdot.none{background:var(--mark)}
.stepdot.late{background:var(--alert)}
/* строка «дальше: …» под воронкой карточки: следующее действие с датой —
   обязательный атрибут живой карточки; пустота показывается честно */
.nextrow{display:flex;gap:10px;align-items:baseline;margin-top:10px;
  font:400 13px/1.45 var(--body);flex-wrap:wrap}
.nextrow .none{color:var(--mark-ink)}
.nextrow .late{color:var(--alert);font-weight:500}
/* мини-форма следующего шага: клик по строке «дальше» — и два поля на месте,
   без похода в большую правку. Раскрытие — details, работает без скрипта. */
.nextedit{flex:1 1 auto;min-width:0}
.nextedit>summary{cursor:pointer;list-style:none;display:inline-flex;gap:10px;
  align-items:baseline;flex-wrap:wrap}
.nextedit>summary::-webkit-details-marker{display:none}
.nextedit>summary:hover span{text-decoration:underline dotted;text-underline-offset:3px}
.nextform{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:8px 0 0}
.nextform input[type=text]{flex:0 1 340px;width:auto}
.nextform input[type=date]{flex:0 0 150px;width:auto}
/* подсказка текущей ступени — голосом чертежа, не кричит */
.fhint{margin-top:6px;font:400 12px/1.5 var(--body);color:var(--ink3)}

/* ─── правка прямо в карточке (docs/20): клик по значению — контрол на месте ───
   Чтение → ховер (карандаш + вуаль) → правка → сохранено (галочка, «вернуть»)
   → ошибка (значение не теряется). Кому нельзя — просто текст без карандаша. */
/* форма и кнопка-значение живут В ПОТОКЕ текста (display:inline): значение
   переносится по краю колонки, как обычные слова, а не внутри своей коробки —
   inline-flex здесь сжимал поле до min-content и рвал фразы */
.ied{display:inline;margin:0}
.ied .iedv{display:inline;border:0;background:none;padding:1px 3px;margin:-1px -3px;
  font:inherit;color:inherit;cursor:pointer;text-align:left;border-radius:5px;
  -webkit-box-decoration-break:clone;box-decoration-break:clone}
.ied .iedv .t.dim{color:var(--ink3)}
.ied .iedv .pen{font-style:normal;font-size:11px;color:var(--ink3);opacity:0;
  margin-left:4px;transition:opacity .12s}
.ied .iedv:hover{background:var(--hover)}
.ied .iedv:hover .pen{opacity:1}
/* пустая кнопка-карандаш (значение показано ссылкой рядом) — карандаш чуть виден всегда */
.ied .iedv .t:empty+.pen{opacity:.45;margin-left:0}
.curform select{height:var(--ctl-h-sm);max-width:240px}
.ied.on .iedv{display:none}
.ied [name]{height:var(--ctl-h-sm);vertical-align:baseline}
.ied textarea[name]{height:auto;min-height:56px;width:min(520px,80vw)}
.ied input[name]{width:auto;min-width:140px;max-width:100%}
.ied select[name]{max-width:280px}
/* «вернуть» — тихая ссылка-кнопка на несколько секунд после сохранения */
.ied .iedu{border:0;background:none;padding:0;font:500 11px/1 var(--body);
  color:var(--blue);cursor:pointer;white-space:nowrap}
.ied .iedu:hover{text-decoration:underline}
.ied.err::after{content:'не сохранилось';font:500 11px/1 var(--body);
  color:var(--alert);white-space:nowrap}
/* лента журнала изменений на карточке: правки полей и переходы воронки */
.cjour{margin-top:12px}
.cjour>summary{cursor:pointer;list-style:none;display:inline-flex;gap:6px;
  align-items:center;font:500 12px/1 var(--body);color:var(--ink3)}
.cjour>summary::-webkit-details-marker{display:none}
.cjour>summary::before{content:'▸';font-size:9px;line-height:1}
.cjour[open]>summary::before{content:'▾'}
.cjour>summary:hover{color:var(--blue)}
.cjour ul{list-style:none;margin:8px 0 0;padding:0;max-width:720px}
.cjour li{display:flex;gap:10px;align-items:baseline;padding:4px 0;
  font:400 12.5px/1.45 var(--body);border-bottom:1px solid var(--rule2)}
.cjour li:last-child{border-bottom:0}
.cjour .d{font:500 11px/1.45 var(--mono);color:var(--ink3);flex:0 0 76px}
.cjour .rs{color:var(--ink2)}
.cjour .who{margin-left:auto;color:var(--ink3);font-size:11.5px;white-space:nowrap}
.cjour .bot{font:600 9px/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink3);background:var(--soft-off);border-radius:2px;padding:3px 5px}
/* печать (docs/20): квитанция вместо содержимого — факт есть, деталей нет */
.sealed{display:inline-flex;gap:7px;align-items:center;font:400 12.5px/1.4 var(--body);
  color:var(--ink3)}
.sealed::before{content:'🔒';font-size:11px}
/* история работы: тихое раскрытие со строками «когда · откуда → куда · кто» */
.fhist{margin-top:12px}
.fhist>summary{cursor:pointer;list-style:none;display:inline-flex;gap:6px;
  align-items:center;font:500 12px/1 var(--body);color:var(--ink3)}
.fhist>summary::-webkit-details-marker{display:none}
.fhist>summary::before{content:'▸';font-size:9px;line-height:1}
.fhist[open]>summary::before{content:'▾'}
.fhist>summary:hover{color:var(--blue)}
.fmoves{list-style:none;margin:8px 0 0;padding:0;max-width:640px}
.fmoves li{display:flex;gap:10px;align-items:baseline;padding:4px 0;
  font:400 12.5px/1.4 var(--body);border-bottom:1px solid var(--rule2)}
.fmoves li:last-child{border-bottom:0}
.fmoves .d{font:500 11px/1.4 var(--mono);color:var(--ink3);flex:0 0 76px}
.fmoves .rs{color:var(--ink2)}
.fmoves .who{margin-left:auto;color:var(--ink3);font-size:11.5px;white-space:nowrap}
/* лоты объекта: строка на лот — предмет, срок, воронка */
.olots{margin-top:12px;display:flex;flex-direction:column;gap:2px}
.olot{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:2px 0;
  font:400 12.5px/20px var(--body)}
/* запись лота с карточки объекта: тихая строка-раскрытие под списком лотов —
   голосом «дальше», а не кнопкой: спорить с воронкой выше ей незачем */
.lotadd{margin-top:4px}
.lotadd>summary{cursor:pointer;list-style:none;display:inline-flex;gap:5px;align-items:baseline;
  font:400 12.5px/20px var(--body);color:var(--ink3)}
.lotadd>summary::-webkit-details-marker{display:none}
.lotadd>summary::before{content:"+";font:500 13px/1 var(--mono)}
.lotadd>summary:hover{color:var(--blue)}
.lotadd[open]>summary{color:var(--ink)}
.lotadd .wform{margin-top:8px;max-width:760px}
/* на кого запишется лот: имена компаний в базе бывают с описанием на строку —
   подпись обрезается, целиком читается наведением */
.lotadd .who{min-width:0;max-width:min(420px,44vw);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;font:400 12.5px/1.5 var(--body);color:var(--ink3)}
/* окно причины исхода: маленький разговор об одном — причина и пояснение */
dialog.outdlg{width:min(440px,92vw);border:1px solid var(--rule);border-radius:10px;
  background:var(--panel);color:var(--ink);padding:18px 18px 16px}
dialog.outdlg::backdrop{background:rgba(10,14,20,.38)}
.outdlg h3{margin:0 0 4px;font:600 15px/1.3 var(--body)}
.outdlg label.f{margin-top:10px}
.outdlg select,.outdlg input{width:100%}
/* тихая мета-ссылка в шапке линзы («архив · 3») — голосом «как читать» */
.metabtn{font:500 12px/1 var(--body);color:var(--ink3);text-decoration:none;white-space:nowrap}
.metabtn:hover{color:var(--blue)}
.metabtn.on{color:var(--ink);font-weight:600}

.lens .bar{margin-bottom:0}
/* раскрытое досье.
   Таблица реестра бывает шире окна и ездит вбок — раскрытие в ней не участвует:
   его содержимое липнет к левому краю прокрутки и укладывается в видимую ширину
   (100cqw = ширина окна списка), поэтому кнопки справа всегда на экране, а
   широкая таблица лет прокручивается внутри своей зоны (.xfin) */
.treg{container-type:inline-size}
.treg tr.xbody .xwrap>.xin{position:sticky;left:20px;width:calc(100cqw - 40px)}
.xtop{display:flex;gap:10px;align-items:center;margin-top:11px;min-height:26px}
.xtop .spacer{flex:1}
tr.xbody .flash{margin:10px 0 0}
tr.xbody>td{background:var(--panel2);padding:2px 20px 18px;border-bottom:1px solid var(--rule)}
tr.xbody:hover>td{background:var(--panel2)}
/* раскрытая запись — отдельная плашка на подложке списка: разрыв цветом фона
   сверху и снизу, свой чуть голубоватый тон (глаз сразу видит, что это
   открытая карта, а не строки списка), синяя кромка слева держит её одной картой */
tr.xrow.open td{border-top:10px solid var(--gapc);border-bottom-color:transparent;
  background:var(--open)}
tr.xrow.open:hover td{background:var(--open)}
tr.xrow.open td:first-child{box-shadow:inset 2px 0 0 var(--blue-mid)}
tr.xrow.open .xbtn{color:var(--blue-deep);font-weight:600}
tr.xbody.on>td{background:var(--open);border-bottom:10px solid var(--gapc);
  box-shadow:inset 2px 0 0 var(--blue-mid)}
tr.xbody.on:hover>td{background:var(--open)}
tr.xbody.on details.box{background:var(--panel)}
/* таблица лет в раскрытии: плотные строки, годы одной ширины (живёт в .xfin) */
.tbl.mini{width:auto;min-width:0;font-size:12.5px}
.tbl.mini th,.tbl.mini td{padding:2px 9px;line-height:20px;white-space:nowrap}
.tbl.mini th.num,.tbl.mini td.num{min-width:86px;text-align:right}

/* ─── содержимое раскрытия: два столбца вместо пустой правой половины ───
   Слева — отчётность по годам (таблица на всю ширину своей зоны), справа —
   короткие факты: карточка, группа, ИНН, сайт. Внизу на всю ширину — досье
   и кнопки. На узком экране столбцы складываются. */
.xgrid{display:grid;grid-template-columns:minmax(0,7fr) minmax(300px,5fr);
  gap:2px clamp(24px,3vw,56px);align-items:start;margin-top:2px}
@media (max-width:1180px){.xgrid{grid-template-columns:1fr}}
/* зона отчётности: собственная тонкая рамка не нужна — хватает воздуха */
.xfin{min-width:0;overflow-x:auto}
.tbl.fin{width:100%;min-width:0;font-size:12.5px;border-collapse:collapse}
.tbl.fin th,.tbl.fin td{padding:2px 9px;line-height:21px;white-space:nowrap;
  border-bottom:1px solid var(--rule2)}
.tbl.fin thead th{padding-bottom:5px;border-bottom:1px solid var(--rule)}
.tbl.fin th.num,.tbl.fin td.num{text-align:right;min-width:64px}
.tbl.fin td:first-child{color:var(--ink2);padding-left:0;min-width:118px}
.tbl.fin th:first-child{padding-left:0}
.tbl.fin tr:last-child td{border-bottom:0}
.tbl.fin tr:hover td{background:none}
/* последний год — тонкая подсветка столбца: глаз сразу на свежей цифре */
.tbl.fin th.cur,.tbl.fin td.cur{background:var(--blue-soft);
  background:color-mix(in srgb,var(--blue-soft) 55%,transparent)}
.tbl.fin td.cur{font-weight:600}
.tbl.fin th.cur{color:var(--blue-deep)}
/* источник цифр — тихая подпись в конце строки, прижата вправо */
.tbl.fin td.srcc{width:34%;text-align:right;padding-right:0}
.tbl.fin th.srcc{text-align:right;padding-right:0}
/* полоса динамики: столбики выручки по годам прямо под шапкой лет —
   траектория компании видна раньше, чем прочитана хоть одна цифра */
.tbl.fin tr.spark td{border-bottom:1px solid var(--rule2);padding-top:3px;padding-bottom:3px}
.sparkbar{display:block;margin-left:auto;width:min(30px,100%);height:20px;position:relative}
.sparkbar i{position:absolute;bottom:0;right:0;width:100%;
  background:var(--blue-mid);border-radius:1px 1px 0 0;opacity:.55}
.tbl.fin td.cur .sparkbar i{background:var(--blue);opacity:.9}
.sparkbar i.zero{height:2px;background:var(--rule);opacity:1}
/* правый столбец фактов: подпись и значение на одной оси, значения спокойные */
.xfacts{min-width:0}
.xfacts .kv2{margin-top:8px}
/* значение данных — тише заголовка; ссылка в данных — тихая: цвет чуть синее
   чернил, подчёркивание приходит только под курсором. Один голос во всех местах,
   где живут данные: развороты, плотные таблицы карточки, зоны, сетки фактов */
.kv2 dd{color:var(--val)}
.kv2 dd a,.tbl.fin a,.tbl.dense a,.zone a,.kv dd a,.eyebrow a,.dim a,.bar.toc a{
  color:var(--link);text-decoration:none}
.kv2 dd a:hover,.tbl.fin a:hover,.tbl.dense a:hover,.zone a:hover,.kv dd a:hover,
.eyebrow a:hover,.dim a:hover,.bar.toc a:hover{color:var(--blue);text-decoration:underline}
/* ссылки в плашках-примечаниях: подчёркивание оставить (иначе не найти), цвет тише */
.note a{color:var(--link)}
.note a:hover{color:var(--blue)}
/* перечень ИНН: цифры моноширинные и серые, имя компании — тихая ссылка */
.entline{display:flex;gap:7px;align-items:baseline;min-width:0;line-height:21px}
.entline .num{flex:0 0 auto}
.entline .en{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.entline .chip{flex:0 0 auto}
/* длинный перечень свёрнут: строка-стрелочка тем же голосом, что тихие ссылки */
details.more>summary{list-style:none;cursor:pointer;font-size:12px;line-height:21px;
  color:var(--link)}
details.more>summary::-webkit-details-marker{display:none}
details.more>summary::before{content:"▾";display:inline-block;margin-right:6px;
  font-size:10px;color:var(--ink3);transition:transform .18s ease}
details.more[open]>summary::before{transform:rotate(-180deg)}
details.more>summary:hover{color:var(--blue);text-decoration:underline}
@media (prefers-reduced-motion:no-preference){
  details.more::details-content{block-size:0;overflow:clip;
    transition:block-size .22s ease,content-visibility .22s allow-discrete}
  details.more[open]::details-content{block-size:auto}
}

/* разворот карточки: плотная сетка, подпись и значение на одной оси */
.kv2{display:grid;grid-template-columns:150px 1fr;gap:3px 16px;margin-top:10px;
  font-size:13px;line-height:1.5}
/* длинная проза досье не тянется во всю ширь экрана: строка длиннее ~95 знаков
   не читается — глаз теряет начало следующей */
.kv2 dd{max-width:95ch}
.kv2 dt{font:600 9.5px/1.9 var(--mono);letter-spacing:.11em;text-transform:uppercase;color:var(--ink3)}
.kv2 dd{margin:0}
.kv2 a{color:var(--blue)}
.flds{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px}
.fl h4{margin:0 0 6px;font:600 9.5px/1 var(--mono);letter-spacing:.11em;text-transform:uppercase}
.fl.y h4{color:var(--ok)} .fl.n h4{color:var(--alert)}
.fl ul{margin:0;padding-left:16px;font-size:12.5px;line-height:1.55;color:var(--ink2)}
.corr{background:var(--mark-soft);border-left:2px solid var(--mark);padding:9px 12px;
  margin-top:13px;font-size:12.5px;line-height:1.5}
.corr b{display:block;font:600 9.5px/1 var(--mono);letter-spacing:.11em;text-transform:uppercase;
  color:var(--mark-ink);margin-bottom:5px}
.calc{margin-top:12px;font:11.5px/1.6 var(--mono);color:var(--ink3);
  border-top:1px dashed var(--rule2);padding-top:9px}

/* строка рабочих полей источника: статус, ответственный, заметки */
.workline{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;margin-top:14px;
  padding-top:13px;border-top:1px solid var(--rule2)}
.workline .f{min-width:170px}
.workline .grow{flex:1;min-width:230px}

/* плитки типов источников и паспорт типа */
.kchips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:18px;padding-bottom:16px;
  border-bottom:1px solid var(--rule2)}
.kchip{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--rule);
  background:var(--field);border-radius:var(--ctl-r);height:var(--ctl-h);padding:0 11px;
  font:500 12.5px/1 var(--disp);letter-spacing:-.01em;
  color:var(--ink2);text-decoration:none}
.kchip:hover{border-color:var(--blue-mid);color:var(--ink)}
.kchip.on{background:var(--btn);border-color:var(--btn);color:#fff}
.kchip .kci{font:600 9px/1 var(--mono);color:var(--ink3)}
.kchip .kcn{font:500 11px/1 var(--mono);color:var(--ink3)}
.kchip .kcp{font:600 11px/1 var(--mono);color:var(--mark-ink)}
/* подписи на активной (цветной) плитке — белые с прозрачностью: читаются на кнопке
   любого цвета темы, тёплый акцент процента держит контраст и на янтарной */
.kchip.on .kci{color:rgba(255,255,255,.72)} .kchip.on .kcn{color:rgba(255,255,255,.86)}
.kchip.on .kcp{color:#FFD37E}
.kh{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.kpass{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:6px}
.kpass .kp{padding:11px 13px;font-size:13px;line-height:1.55}
.kpass .kp h4{margin:0 0 5px;font:600 9.5px/1 var(--mono);letter-spacing:.11em;text-transform:uppercase}
.kpass .kp p{margin:0}
.kpass .kp.y{background:var(--ok-soft)} .kpass .kp.y h4{color:var(--ok)}
.kpass .kp.n{background:var(--alert-soft)} .kpass .kp.n h4{color:var(--alert)}
@media (max-width:900px){.kpass{grid-template-columns:1fr}}

/* индекс отдачи в таблице каналов */
.ibar{height:4px;background:var(--rule2);border-radius:2px;width:84px;display:inline-block;
  vertical-align:middle;margin-right:8px;overflow:hidden}
.ibar i{display:block;height:100%;background:var(--mark)}

/* формула рейтинга */
.formula{font:600 14px/1.5 var(--mono);background:var(--code-bg);padding:12px 14px;
  border-left:2px solid var(--blue-mid);max-width:640px}

/* ─── вход ───
   Единственный экран портала, сделанный не «листом чертежа», а в фирменном виде
   «Компакт-Портала»: человек приходит сюда с витрины компании, и дверь должна
   выглядеть так же, как соседние двери. Внутри портала стиль снова чертёжный. */
@font-face{font-family:'Manrope Portal';src:url('/static/fonts/manrope-cyrillic-wght-normal.woff2') format('woff2');
  font-weight:200 800;font-display:swap;unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Manrope Portal';src:url('/static/fonts/manrope-latin-wght-normal.woff2') format('woff2');
  font-weight:200 800;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+2000-206F,U+2122,U+2191,U+2193,U+2212,U+2215}
@font-face{font-family:'Lora Portal';src:url('/static/fonts/lora-cyrillic-wght-italic.woff2') format('woff2');
  font-weight:400 700;font-style:italic;font-display:swap;unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Lora Portal';src:url('/static/fonts/lora-latin-wght-italic.woff2') format('woff2');
  font-weight:400 700;font-style:italic;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+2000-206F,U+2122,U+2191,U+2193,U+2212,U+2215}

body.gate{background:#eef1f4;
  background-image:radial-gradient(120% 110% at 50% -10%,#f3f5f7 0%,#e9edf2 52%,#dfe5ec 100%)}
.gate-wrap{min-height:100vh;display:flex;flex-direction:column;padding:clamp(20px,4vw,44px)}
.gate-mark{display:flex;align-items:center;gap:9px;font:600 17px/1 'Manrope Portal',var(--disp);
  color:#0f1b2d;letter-spacing:-.01em}
.gate-mark i{width:11px;height:11px;border-radius:50%;background:#3d6492;display:block}
.gate-body{flex:1;display:flex;align-items:center;width:100%;max-width:1180px;margin:0 auto;
  padding-left:clamp(0px,7vw,120px)}
.gate-eyebrow{display:flex;align-items:center;gap:12px;font:600 11px/1 'Manrope Portal',var(--disp);
  letter-spacing:.16em;text-transform:uppercase;color:#5d6f86;margin-bottom:22px}
.gate-eyebrow::before{content:"";width:26px;height:1px;background:#93a6bd;display:block}
.gate h1{font:200 clamp(40px,6.4vw,62px)/1.06 'Manrope Portal',var(--disp);letter-spacing:-.03em;
  color:#101d2f;margin:0 0 6px}
.gate h1 em{font-style:normal;color:#3d6492;position:relative;white-space:nowrap}
.gate h1 em::after{content:"";position:absolute;left:0;right:0;bottom:-.06em;height:4px;
  background:#c47b9e;border-radius:2px}
.gate .lead{font:italic 400 clamp(16px,1.7vw,19px)/1.5 'Lora Portal',Georgia,serif;
  color:#4b5b70;max-width:30ch;margin:16px 0 30px}
.gate .btn{display:inline-flex;align-items:center;gap:10px;background:#3d6492;color:#fff;
  border:0;border-radius:999px;height:auto;padding:13px 26px;font:600 15px/1 'Manrope Portal',var(--disp);
  letter-spacing:0;text-transform:none;box-shadow:0 14px 30px -16px rgba(16,29,47,.6);
  transition:background .15s,transform .15s}
.gate .btn:hover{background:#2a4a70;transform:translateY(-1px)}
/* Подсказки и сообщения на этом экране — обычный текст, без чертёжных плашек:
   на двери не должно быть внутренней «мебели» портала. */
.gate .note{background:none;border:0;padding:0;font:400 13px/1.55 'Manrope Portal',var(--disp);
  color:#71839a;max-width:46ch;margin:24px 0 0}
.gate .flash{background:none;border:0;border-left:2px solid #93a6bd;border-radius:0;padding:2px 0 2px 12px;
  margin:0 0 24px;max-width:46ch;font:400 14px/1.5 'Manrope Portal',var(--disp);color:#4b5b70}
.gate .flash.bad{border-left-color:#b4566f;color:#8c2f45}
.gate-foot{font:400 12px/1 'Manrope Portal',var(--disp);color:#8494a8}

@media (max-width:760px){
  .kv{grid-template-columns:1fr}
  .kv dt{padding-top:8px}
  .sf{padding-right:12px;margin-right:12px}
  .bar select{max-width:100%}
  .card>summary{grid-template-columns:1fr;gap:8px}
  .pcw{width:100%;display:flex;align-items:baseline;gap:8px}
  .pcw .pbar{flex:1;margin-top:0}
  .duo{width:100%}
  .rr{justify-content:flex-start}
  .kv2{grid-template-columns:1fr}
  .flds{grid-template-columns:1fr}
}

/* ─── страница «Вид портала» (/look) ───
   Плитка темы — настоящий мини-портал: несёт свой data-theme, поэтому рисуется
   ровно теми красками, что и большой экран. Наведение примеряет тему на всю
   страницу (только показ — сохраняет кнопка). */
.looks{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));
  gap:14px;margin:16px 0 4px}
.thx{position:relative;display:block;cursor:pointer;border:1px solid var(--rule);
  border-radius:6px;overflow:hidden;background:var(--field);
  transition:border-color .12s,box-shadow .12s}
.thx:hover{border-color:var(--blue-mid);box-shadow:var(--e1)}
.thx input{position:absolute;opacity:0;pointer-events:none}
.thx:has(input:checked){border-color:var(--blue);box-shadow:0 0 0 1px var(--blue)}
.thx:has(input:focus-visible){outline:2px solid var(--blue);outline-offset:2px}
/* сцена: подложка темы, полоска шапки и лист с строками-рыбами */
.thx-view{display:block;height:118px;padding:0;position:relative;
  background-color:var(--bgc);background-image:var(--bgi);background-repeat:no-repeat}
.thx-top{position:absolute;inset:0 0 auto 0;height:14px;background:var(--top-bg)}
.thx-top::before{content:"";position:absolute;left:8px;top:5px;width:4px;height:4px;
  border-radius:50%;background:var(--blue)}
.thx-top::after{content:"";position:absolute;left:17px;top:6px;width:34px;height:2px;
  border-radius:1px;background:var(--top-ink)}
.thx-panel{position:absolute;left:12px;right:12px;top:26px;bottom:-6px;
  background:var(--panel);border:1px solid var(--pborder);border-radius:4px 4px 0 0;
  box-shadow:var(--e1);padding:9px 10px;display:flex;flex-direction:column;gap:5px}
.thx-panel i{display:block;height:4px;border-radius:2px;background:var(--ink3);opacity:.55}
.thx-panel i.t{height:5px;width:46%;background:var(--ink);opacity:.9}
.thx-panel i.a{width:30%;background:var(--blue);opacity:.9}
.thx-panel i.m{width:64%}
.thx-panel i.s{width:78%;opacity:.35}
/* Плитка плотности: та же рамка, что у тем, но внутри — строки списка в том
   шаге, который плитка обещает. Обычная показывает просторные, плотная —
   частые: выбор видно, не читая подписи. */
.looks.dens{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));margin-top:4px}
.dnx-view{display:block;height:88px;padding:11px 12px;background:var(--panel);
  display:flex;flex-direction:column;justify-content:flex-start}
.dnx-view i{display:block;height:3px;border-radius:2px;background:var(--ink3);opacity:.5}
.dnx-view i:nth-child(odd){width:72%} .dnx-view i:nth-child(even){width:54%}
.dnx[data-density=""] .dnx-view i{margin-bottom:9px}
.dnx[data-density="compact"] .dnx-view i{margin-bottom:4px}
.thx-meta{display:block;padding:9px 11px 10px;border-top:1px solid var(--rule2)}
.thx-name{display:block;font:600 13px/1.3 var(--disp);color:var(--ink)}
.thx-note{display:block;margin-top:2px;font:11.5px/1.45 var(--body);color:var(--ink2)}
.thx-mark{position:absolute;top:8px;right:8px;z-index:2;font:600 9px/1 var(--mono);
  letter-spacing:.08em;padding:3px 5px;border-radius:2px;background:var(--btn);
  color:#fff;opacity:0;text-transform:uppercase}
.thx:has(input:checked) .thx-mark{opacity:1}

/* ─── досье разведки: журнальная укладка ───
   Раньше — стена абзацев во всю ширину (подпись слева, текст на 200 знаков).
   Теперь: короткие факты одной лентой сверху, длинные темы — газетными
   колонками с заголовком над текстом. Мера строки ~60 знаков, глаз не тонет. */
.intel{margin-top:6px}
.intel .quick{display:flex;flex-wrap:wrap;gap:8px 30px;margin:0 0 13px;
  padding-bottom:11px;border-bottom:1px solid var(--rule2)}
.intel .quick>div{max-width:56ch}
.intel .quick b{display:block;font:600 9.5px/1.6 var(--mono);letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink3)}
.intel .quick span{font-size:13px;line-height:1.4;color:var(--val)}
.intel .quick a{color:var(--link);text-decoration:none}
.intel .quick a:hover{color:var(--blue);text-decoration:underline}
/* газетные колонки: тема не рвётся между колонками, ширина колонки ~площадь чтения */
.intel .themes{columns:3 340px;column-gap:40px}
.intel .it{break-inside:avoid;margin:0 0 15px}
.intel .it h4{margin:0 0 3px;font:600 9.5px/1.5 var(--mono);letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink3)}
.intel .it p{margin:0;font:13px/1.6 var(--body);color:var(--val)}
/* маркеры разведки («УГРОЗА 5», «ПРОВЕРЯЕМОЕ») — тёмный жир: структура видна до чтения */
.intel .it p b{font-weight:650;color:var(--ink)}

/* ─── календарь: каждый месяц — отдельный лист ───
   Месяц — свой лист чертежа с крупным именем и своей строкой дней недели
   (лист + строка липнут при прокрутке). Над листами — липкая полоса
   инструментов: «Сегодня», стрелки, месяцы со счётчиками. Ширина ограничена:
   на широком экране клетки не расползаются. Номера дней — моноширинные
   координаты клеток, событие — полоса 22px, как строка реестра. Тон полосы —
   наше решение (залито «едем», подсвечено «решаем», бледное «не идём»):
   лестница одного цвета вместо радуги. Красная кромка слева — приоритет 1.
   Многодневное режется по неделям; срез без скругления — «продолжается». */
.calzone{max-width:1240px;margin:0 auto}
/* шапка календаря — та же колонка, что и листы месяцев: края совпадают,
   плашка фильтров и полоса месяцев не разъезжаются по ширине; под фильтрами
   таблицы нет — нижнее поле ужато, плашка не тянет пустоту */
.panel.calw{max-width:1240px;margin-left:auto;margin-right:auto;padding-bottom:15px}
.panel.calw .bar{margin-bottom:0}
/* липнет на 1px ПОД шапку портала — без волосяной щели, сквозь которую
   мелькают уезжающие листы (тот же приём, что у строки «мы» в реестрах) */
.calbar{position:sticky;top:45px;z-index:24;display:flex;gap:12px;align-items:center;
  height:44px;padding:0 10px;background:var(--panel);
  -webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);border-radius:5px;box-shadow:var(--e1);
  overflow-x:auto;scrollbar-width:none}
.calbar::-webkit-scrollbar{display:none}
.arrs{display:flex;gap:3px;flex:0 0 auto}
.calarr{width:var(--ctl-h);height:var(--ctl-h);border:1px solid var(--rule);
  border-radius:var(--ctl-r);background:var(--field);color:var(--ink2);
  font:400 16px/26px var(--body);cursor:pointer;padding:0;text-align:center}
.calarr:hover{color:var(--blue);border-color:var(--blue-mid)}
.mchips{display:flex;gap:2px;align-items:center;min-width:0}
.mchip{display:inline-flex;align-items:center;gap:4px;height:var(--ctl-h);padding:0 9px;
  border-radius:var(--ctl-r);font:500 12px/1 var(--body);color:var(--ink2);
  text-decoration:none;white-space:nowrap}
.mchip b{font-weight:600;color:var(--ink2);font-variant-numeric:tabular-nums;margin-left:1px}
.mchip:hover{color:var(--blue);background:var(--hover)}
.mchip.on{color:var(--blue-deep);background:var(--blue-soft)}       /* месяц на экране */
.mchip.on b{color:var(--blue-deep)}
.mchip.now{box-shadow:inset 0 -2px 0 var(--rose)}                   /* текущий месяц */
/* лист месяца: сетка от кромки до кромки, без внутренних полей листа */
.panel.calsheet{overflow:visible;padding:0;margin-top:14px}
/* имя месяца + дни недели — один липкий блок сразу под полосой инструментов */
.calstick{position:sticky;top:89px;z-index:5;background:var(--panel);
  -webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border-radius:5px 5px 0 0;border-bottom:1px solid var(--rule)}
.calhead{display:flex;gap:14px;align-items:baseline;padding:13px 18px 9px}
.calhead h2{margin:0;padding:0;border:0;font:600 19px/1.15 var(--disp);letter-spacing:-.02em}
.calhead .y{color:var(--ink3);font-weight:500}
.caldow{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}
.caldow span{padding:0 10px;font:600 9px/24px var(--mono);letter-spacing:.13em;
  text-transform:uppercase;color:var(--ink3);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.caldow span.we{color:color-mix(in srgb,var(--rose) 55%,var(--ink3))}
.cw{position:relative;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));
  grid-template-rows:30px repeat(var(--ln,2),24px);padding-bottom:8px;
  border-bottom:1px solid var(--rule2)}
.calsheet .cw:last-child{border-bottom:0;border-radius:0 0 5px 5px;overflow:hidden}
/* клетка дня — фон на всю высоту недели, номер — моноширинная координата.
   Колонка задана явно: авторасстановка не умеет класть клетку ПОД полосы
   событий и уводила бы её в первую свободную колонку */
.cd{grid-row:1 / -1;position:relative;min-width:0;padding:0 10px;
  border-right:1px solid var(--rule2)}
.cd:nth-child(1){grid-column:1}.cd:nth-child(2){grid-column:2}
.cd:nth-child(3){grid-column:3}.cd:nth-child(4){grid-column:4}
.cd:nth-child(5){grid-column:5}.cd:nth-child(6){grid-column:6}
.cd:nth-child(7){grid-column:7;border-right:0}
.cd.we{background:color-mix(in srgb,var(--soft-off) 55%,transparent)}
/* чужой месяц в переходной неделе — притушенная клетка */
.cd.out{background:color-mix(in srgb,var(--soft-off) 30%,transparent)}
.cd.td{background:color-mix(in srgb,var(--blue-soft) 50%,transparent)}
.dn{font:500 12.5px/30px var(--mono);color:var(--ink2);letter-spacing:.02em;white-space:nowrap}
.dn.f{font-weight:700;color:var(--ink)}
.cd.out .dn{opacity:.45}
.cd.past .dn{opacity:.55}
/* «сегодня» — единственная залитая метка на листе */
.cd.td .dn{display:inline-block;min-width:24px;height:24px;margin-top:3px;padding:0 6px;
  border-radius:12px;background:var(--btn);color:#fff;font-weight:600;line-height:24px;
  text-align:center;opacity:1}
/* полоса события: 22px в шаге 24, текст режется многоточием, буква — вид */
.cbar{display:flex;gap:5px;align-items:center;min-width:0;margin:1px 4px;border:0;
  padding:0 7px;border-radius:2px;cursor:pointer;text-align:left;z-index:1;
  font:500 12.5px/22px var(--body);letter-spacing:-.005em}
.cbar i{font:600 9px/1 var(--mono);font-style:normal;opacity:.72;letter-spacing:.04em;flex:0 0 auto}
.cbar .t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.cbar.go{background:var(--btn);color:#fff}
.cbar.go:hover{background:var(--btn-h)}
.cbar.mid{background:var(--blue-soft);color:var(--blue-deep)}
.cbar.mid:hover,.cbar.off:hover{filter:var(--dimf)}
.cbar.off{background:var(--soft-off);color:var(--ink2)}
.cbar.p1{box-shadow:inset 3px 0 0 var(--alert);font-weight:600}
.cbar.q{outline:1px dashed var(--mark);outline-offset:-1px}
.cbar.cx .t{text-decoration:line-through}
.cbar.gone{opacity:.5}
.cbar.cutl{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0}
.cbar.cutr{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:0}
/* события без даты — свой тихий лист под месяцами */
.calsheet.calnd{display:flex;gap:8px 8px;align-items:center;flex-wrap:wrap;
  padding:12px 16px}
.calnd .ndl{font:600 9.5px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink3)}
.cbar.nod{display:inline-flex;max-width:340px}
/* узкий экран: сетке нужна ширина — лист прокручивается вбок сам */
@media (max-width:900px){
  .calstick{position:static}
  .panel.calsheet{overflow-x:auto}
  .calstick,.cw{min-width:720px}
}
/* карточка события — поповер у полосы: короткий разбор, правка — в списке */
.calpop{position:fixed;inset:auto;margin:0;width:min(400px,92vw);padding:14px 16px 13px;
  background:var(--panel);-webkit-backdrop-filter:var(--pblur);backdrop-filter:var(--pblur);
  border:1px solid var(--pborder);border-radius:4px;box-shadow:var(--e2);color:var(--ink)}
.calpop::backdrop{background:none}
.calpop h3{margin:0 0 3px;font:600 14.5px/1.35 var(--disp);letter-spacing:-.01em}
.calpop .sub{margin:0 0 6px;font:12px/1.5 var(--body);color:var(--ink2)}
.calpop .dts{margin:0 0 9px;font:500 12.5px/1.4 var(--body);color:var(--val);
  font-variant-numeric:tabular-nums}
.calpop .row{display:flex;gap:6px;flex-wrap:wrap}
.calpop .why{margin:9px 0 0;font:13px/1.5 var(--body);color:var(--val);
  display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.calpop .tg{margin:7px 0 0;font:12.5px/1.5 var(--body);color:var(--ink2)}
.calpop .tg a{color:var(--link);text-decoration:none}
.calpop .tg a:hover{color:var(--blue);text-decoration:underline}
.calpop .rsp{margin:7px 0 0;font:12px/1.4 var(--body);color:var(--ink3)}
.calpop .acts{display:flex;gap:8px;margin-top:11px;padding-top:11px;
  border-top:1px solid var(--rule2)}
@media (prefers-reduced-motion:no-preference){
  .calpop:popover-open{animation:calpop-in .14s ease-out}
  @keyframes calpop-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
}

/* ─── лента наблюдений по объектам (задание 24, 08.09.2026) ───
   Слева «дерево» объекта (имя, заказчик, генподрядчик, сумма), справа шкала
   заходов разведки: ячейки — месяцы, внутри — недели. Четыре отметки —
   четыре события, цвет кодирует событие, а не важность. Шкала ездит вбок
   внутри окна реестра, имя объекта прилипает слева; страница не едет. */
.tlwrap{container-type:inline-size}
/* Лента занимает всю ширину окна реестра, а не столько, сколько попросило
   содержимое: пустого поля справа при обрезанных названиях быть не должно.
   Ширины двух текстовых столбцов заданы долей окна (46cqw и 24cqw в списке
   столбцов objects.html) — лента растёт вместе с окном, но от того, что лежит
   в ячейках, не зависит. Шкала заходов растёт со временем; когда окна на всё
   перестаёт хватать, лента едет вбок, а имя объекта остаётся липким слева. */
.treg .tbl.tl{min-width:0;width:100%}
/* Ширины столбцов ленты объявлены в списке столбцов самого шаблона
   (objects.html, договор из docs/23-UI-ЯДРО.md) — одно место, откуда таблица
   берёт свои числа. Здесь их нет намеренно: пока они стояли и тут, и там,
   любая правка ширины требовала помнить про два места. */
.tl .nmline>.xbtn{min-width:0;flex:0 1 auto}
/* ручке нужна опора — заголовок с собственным положением. Имя слева липкое,
   и липкость сама служит опорой: перебивать её на relative нельзя, иначе
   столбец перестанет держаться при прокрутке вбок */
.tl thead th[data-col]:not(.nmh){position:relative}
/* Ручка ширины. Она заходит на пару пикселей на соседний заголовок, а из двух
   соседей мышь достаётся тому, кто нарисован позже. Поэтому левым заголовкам
   даётся слой выше правых: иначе прицел в саму границу столбца попадает в
   соседа, и столбец «не двигается» — так и было до 19.09.2026.
   Слой считается по месту в ряду, а не по имени столбца: столбцы меняются
   местами, и привязка к имени сломалась бы при первой же перестановке. */
.tbl.reg thead tr th:nth-child(1){z-index:19}
.tbl.reg thead tr th:nth-child(2){z-index:18}
.tbl.reg thead tr th:nth-child(3){z-index:17}
.tbl.reg thead tr th:nth-child(4){z-index:16}
.tbl.reg thead tr th:nth-child(5){z-index:15}
.tbl.reg thead tr th:nth-child(6){z-index:14}
.tbl.reg thead tr th:nth-child(7){z-index:13}
.tbl.reg thead tr th:nth-child(8){z-index:12}
.tbl.reg thead tr th:nth-child(9){z-index:11}
.tbl.reg thead tr th:nth-child(10){z-index:10}
.tbl.reg thead tr th:nth-child(11){z-index:9}
.tbl.reg thead tr th:nth-child(12){z-index:8}
.tbl.reg thead tr th:nth-child(13){z-index:7}
/* Добивочный столбец у правого края — общий для всех реестров. Пустой, без
   полей и боковых границ; видно его только как продолжение строки до края
   окна: полоса зебры и подсветка ряда идут по нему дальше. Весь остаток
   ширины достаётся ему — поэтому тянут один столбец, а соседи стоят. */
.tbl .tune-filler{padding:0;border-left:0;width:auto}
/* Заголовок можно потянуть вбок — переставить столбец. Курсор говорит об этом
   на самом заголовке; на подписи внутри он прежний, потому что подпись —
   кнопка сортировки. «Объект» не тянется: он держится слева, когда едет шкала.
   Текстом шапку не выделяем: её тянут — и за ширину, и за место столбца.
   Правила общие для всех реестров: заголовок ведёт себя одинаково всюду
   (docs/23-UI-ЯДРО.md, заход 4) */
.tbl.reg thead th{user-select:none;-webkit-user-select:none}
.tbl.reg thead th[draggable=true]{cursor:grab}
.tbl.reg thead th[draggable=true] .sortth{cursor:pointer}
.tbl.reg thead th[draggable=true]:active{cursor:grabbing}
/* Пока курсор не у шапки, ручки не видно — лишняя линия на экране не нужна.
   Курсор подошёл к шапке — у края каждого столбца проступает светлая черта:
   вот за это можно потянуть. Навёлся на саму черту — она синеет. */
.tbl.reg thead th[data-col] .tune-grip{right:-6px;width:13px}
.tbl.reg thead:hover th[data-col] .tune-grip{background:linear-gradient(90deg,
  transparent 6px,var(--rule) 6px,var(--rule) 7px,transparent 7px)}
.tbl.reg thead th[data-col] .tune-grip:hover{background:linear-gradient(90deg,
  transparent 5px,var(--blue) 5px,var(--blue) 8px,transparent 8px)}
/* У шкалы клеток много, и подсвечивать их все при подходе к шапке было бы рябью:
   черта проступает только под самим курсором. */
.tune-grip.tune-scale{right:0;width:12px}
.tune-grip.tune-scale:hover{background:linear-gradient(90deg,
  transparent 9px,var(--blue) 9px,var(--blue) 12px,transparent 12px)}
/* заголовок-ссылка выглядит заголовком, а не синей ссылкой: стрелка
   появляется только у столбца, по которому сейчас идёт порядок */
.tbl.reg thead .sortth{color:inherit;text-decoration:none;display:inline-flex;
  align-items:baseline;gap:4px;max-width:100%;overflow:hidden}
.tbl.reg thead .sortth:hover,.tbl.reg thead .sortth.on{color:var(--ink)}
.tbl.reg thead .sortth i{font-style:normal;font-size:10.5px;line-height:1;color:var(--blue)}
/* Клетка шкалы — одна неделя. Все недели на оси времени равны, поэтому ширина
   у них общая: тянут любую, меняются все. 54 точки — ровно столько, чтобы
   целиком помещалась неделя из трёх дней («07·08·09» просит 49) и подпись
   «4 захода»; шире или уже — дело смотрящего, ручка у правого края. */
.tl th.tlc,.tl td.tlc{width:var(--w-tlc,48px);min-width:var(--w-tlc,48px);
  max-width:var(--w-tlc,48px);padding:0;text-align:center;vertical-align:middle}
.treg .tbl.tl thead th.tlc{padding:0 2px 2px}
/* ─── шапка ленты в один этаж ───
   Этажей было два: сверху месяц над первой своей неделей, снизу голые числа.
   Над столбцом «16» не стояло ничего, а «АВГ 26» стоял ровно там, где глаз
   ждёт день, — и год читался как день (Николай, 20.09.2026). Теперь каждая
   клетка несёт свою дату целиком: месяц тихой строкой, под ним число.
   Все заголовки выровнены по низу — подписи столбцов стоят на одной черте
   с числами шкалы. */
.treg .tbl.tl thead th{top:0;vertical-align:bottom;
  border-bottom:1px solid var(--rule2)}
/* тонкая черта — граница месяца: видно, где кончился август и начался сентябрь */
.tl th.tlc.first,.tl td.tlc.first{border-left:1px solid var(--rule2)}
/* В клетке шапки — только числа недели: «7·8·9». Сколько заходов было и как
   они назывались, показывает подсказка; строкой ниже это был мелкий шрифт,
   который никто не читал, а место занимал. */
/* Подпись клетки — целая дата в два тихих яруса: месяц мелким набором,
   под ним число или промежуток недели («7–9»). Числа стоят одной строкой
   через всю шкалу — ось времени читается одним взглядом; месяц повторяется
   у каждой клетки, потому что число без месяца не значит ничего. */
.tlh{display:inline-flex;flex-direction:column;align-items:center;gap:1px;
  max-width:100%;line-height:1;text-transform:none;letter-spacing:0}
.tlh i{font:600 9px/1 var(--mono);font-style:normal;color:var(--ink3);
  text-transform:uppercase;letter-spacing:.08em;white-space:nowrap;
  overflow:hidden;text-overflow:clip}
.tlh b{display:block;min-height:12px;font:500 12px/1 var(--body);color:var(--ink2);
  font-variant-numeric:tabular-nums;white-space:nowrap}
/* месяц без заходов: одно название, тихо — в этот месяц разведка не ходила */
.tl th.tlc.empty .tlh i{color:var(--rule)}
/* свежая неделя: число чернее остальных, под ним синяя черта */
.tl th.tlc.wk .tlh b{color:var(--ink)}
/* Последняя неделя помечена чертой под своим заголовком. Черта не добавляется
   к общей линии шапки, а заменяет её собой: иначе синее ложилось поверх серого
   и выходила толстая полоса в три точки. Заливки столбца больше нет — это был
   второй знак об одном и том же, и столбец выглядел серым пятном. */
.tl th.tlc.wk{border-bottom-color:var(--blue-mid);box-shadow:inset 0 -1px 0 var(--blue-mid)}
/* четыре отметки */
.ob{display:inline-block;vertical-align:middle;line-height:0}
.ob.found{width:9px;height:9px;border-radius:50%;background:var(--blue);box-shadow:0 0 0 2px var(--panel),0 0 0 3px var(--blue-mid)}
.ob.upd{width:8px;height:8px;border-radius:50%;background:var(--ok)}
.ob.same{width:3px;height:3px;border-radius:50%;background:var(--rule)}
.ob.gone{font:600 12px/1 var(--body);color:var(--gone)}
tr.off .ob.found{background:var(--gone);box-shadow:0 0 0 2px var(--panel),0 0 0 3px var(--rule)}
tr.off .ob.upd{background:var(--gone)}
/* вне целей: приглушены, свёрнуты под строкой-складкой */
.tl tr.off .xbtn,.tl tr.off td{color:var(--ink3)}
.tl tr.off td{opacity:1}
.foldbtn{border:0;background:none;padding:0;cursor:pointer;color:var(--ink2);
  font:inherit;letter-spacing:inherit;text-transform:inherit}
.foldbtn:hover{color:var(--blue)}
.foldsub{font-weight:500;letter-spacing:.04em;text-transform:none;color:var(--ink3);margin-left:8px}
.gchip{font-size:9px;padding:2px 5px;letter-spacing:.06em;margin-left:4px;vertical-align:1px}
.gc-unk,.gc-taken,.gc-self{color:var(--ink3)} .gc-free{color:var(--ink2)}
/* Сумма читается столбиком: знак «≈» в своём поле слева, число прижато к своей
   черте, единица стоит в своём узком поле — «787 млн» и «3 млрд» видно как
   разные величины, не вчитываясь в слово. Оценку помечают и знак, и светлая
   цифра: знак говорит о ней тем же словом, что остальной портал, оттенок
   работает боковым зрением. Знак снимали 08.09.2026 — «стоит почти у каждой
   строки и не значит ничего»; вернули 20.09.2026: без него лента оставалась
   единственным экраном, где оценку от документа на глаз не отличить. */
.tl td.sumw .money{display:grid;grid-template-columns:9px 1fr 27px;gap:4px;align-items:baseline}
/* знак «≈» — своё узкое поле слева: цифры от него не съезжают и стоят столбиком */
.tl td.sumw .money em{grid-column:1;font-style:normal;font-size:11px;color:var(--ink3);text-align:left}
.tl td.sumw .money b{grid-column:2;font-weight:500;font-variant-numeric:tabular-nums;text-align:right}
.tl td.sumw .money i{grid-column:3;font-style:normal;font-size:11px;color:var(--ink3);text-align:left}
.tl td.num.est{color:var(--ink2)}
.bar .tgl{margin-left:2px}
.lenshead .sum.wk{gap:14px}
.lenshead .sum.wk b{font-size:15px}
.archf{margin:0;display:inline-flex;gap:6px;align-items:center}
.archf select{height:var(--ctl-h-sm);font-size:12px;padding:0 22px 0 8px;max-width:170px}
/* Имя объекта липнет слева при прокрутке шкалы; зебра и ховер сохраняются.
   Подложка непрозрачная: в темах «Компакт», «Синева» и «Небо» цвет панели
   сам по себе полупрозрачный (матовое стекло), и сквозь липкий столбец
   просвечивал заказчик, уезжающий под него. Кладём цвет панели на плотный
   цвет страницы — вид тот же, но насквозь уже не видно. */
.tl td.nm2,.tl th.nmh{position:sticky;left:0;z-index:2;
  background:linear-gradient(var(--panel),var(--panel)) var(--paper)}
.tbl.tl tbody tr:where(:nth-child(even of .xrow):not(.open)) td.nm2{
  background:linear-gradient(var(--zebra),var(--zebra)),
    linear-gradient(var(--panel),var(--panel)) var(--paper)}
.tbl.tl tbody tr.xrow:hover td.nm2{
  background:linear-gradient(var(--hover),var(--hover)),
    linear-gradient(var(--panel),var(--panel)) var(--paper)}
/* узкий экран: остаются имя и шкала, шкала ездит */
@container (max-width:720px){
  .tl th.m-hide,.tl td.m-hide,.tl th.num,.tl td.num{display:none}
  .tl th.tlc,.tl td.tlc{width:var(--w-tlc,38px);min-width:var(--w-tlc,38px);max-width:var(--w-tlc,38px)}
}
@media (max-width:720px){
  .lenshead .sum.wk{gap:10px}
}
