:root{
  --bg:#eceae3;--card:#fff;--soft:#e3e1d7;--col:#e6e4db;--line:rgba(0,0,0,.17);
  --text:#161615;--t2:#4a4944;--t3:#63625a;--nav:#fff;
  /* ЦВЕТОВАЯ СИСТЕМА: цвет = смысл, везде одинаково */
  --xps:#FF7A00;--xps-t:#a85200;   /* XPS — оранжевый (-t: для текста) */
  --pvc:#1240AB;--pvc-t:#1240AB;   /* PVC — синий */
  --pg:#539700;--pg-t:#3d6f00;    /* PG — зелёный */
  --komm:#c2417d;  /* коммерческий блок — малиновый */
  --teh:#5f7085;   /* технический блок — стальной */
  --st-ok:#199a62;--st-ok-t:#117048;--bg-ok:#e1f5ee; /* ≥80% (-t: для текста) */
  --st-mid:#d9a400;--st-mid-t:#795d00;/* 40–79% */
  --st-bad:#d1462f;--st-bad-t:#a1301c;/* <40% */
  --accent:#2e2d2a;--accent-bg:#e2e0d8;--accent-t:#1f1e1c;--accent-btn:#2e2d2a;--info:#2a78d6;--info-bg:#e6f1fb;--info-t:#175196;--sel:#2e2d2a;--sel-t:#fff;--sel-bg:#e2e0d8;
  /* дизайн-токены */
  --radius:14px;
  --shadow-1:0 1px 2px rgba(0,0,0,.06),0 2px 8px rgba(0,0,0,.07);
  --shadow-2:0 10px 34px rgba(0,0,0,.16);
  --ring:0 0 0 3px color-mix(in srgb,var(--accent) 28%,transparent);
  --tr:.16s cubic-bezier(.4,0,.2,1);
  /* тему должны знать и системные элементы: полосы прокрутки, выпадающий
     список вариантов, флажки — иначе они остаются светлыми */
  color-scheme:light;
  /* стрелка выпадающих списков — рисуем сами, у системной в разных браузерах
     свой отступ и размер, из-за чего она «уезжала» от края поля */
  --sel-chev:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%2363625a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.75 4.5 6 7.75 9.25 4.5'/%3E%3C/svg%3E");
}
@media(prefers-color-scheme:dark){:root{
  color-scheme:dark;
  --bg:#141413;--card:#212120;--soft:#2f2f2c;--col:#262624;--line:rgba(255,255,255,.17);
  --text:#f4f4f0;--t2:#c0bfb6;--t3:#a4a399;--nav:#1b1b1a;
  --xps:#ff9433;--pvc:#5b7ce8;--pg:#7ebf2e;--komm:#e0619c;--teh:#8fa2b8;
  --xps-t:#ffab5e;--pvc-t:#8fa8f0;--pg-t:#9ed45c;--st-mid-t:#e8b93a;
  --st-ok:#3dbd85;--st-ok-t:#4fd196;--bg-ok:#0f3d33;--st-mid:#e8b93a;--st-bad:#e3684f;--st-bad-t:#f08a72;
  --accent:#e8e7e1;--accent-bg:#363531;--accent-t:#f4f4f0;--accent-btn:#e8e7e1;--info:#4a90e2;--info-bg:#12324f;--info-t:#8fbcf2;--sel:#e8e7e1;--sel-t:#161615;--sel-bg:#363531;
  --sel-chev:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%2398978e' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.75 4.5 6 7.75 9.25 4.5'/%3E%3C/svg%3E");}}
html[data-theme="light"]{
  color-scheme:light;
  --bg:#eceae3;--card:#fff;--soft:#e3e1d7;--col:#e6e4db;--line:rgba(0,0,0,.17);
  --text:#161615;--t2:#4a4944;--t3:#63625a;--nav:#fff;
  --xps:#FF7A00;--pvc:#1240AB;--pg:#539700;--komm:#c2417d;--teh:#5f7085;
  --xps-t:#a85200;--pvc-t:#1240AB;--pg-t:#3d6f00;--st-mid-t:#795d00;
  --st-ok:#199a62;--st-ok-t:#117048;--st-mid:#d9a400;--st-bad:#d1462f;--st-bad-t:#a1301c;
  /* --bg-ok тоже нужно вернуть: иначе на тёмной машине ручное переключение в
     светлую оставляло тёмно-зелёные плашки «отгружено» с тёмным текстом */
  --bg-ok:#e1f5ee;
  --accent:#2e2d2a;--accent-bg:#e2e0d8;--accent-t:#1f1e1c;--accent-btn:#2e2d2a;--info:#2a78d6;--info-bg:#e6f1fb;--info-t:#175196;--sel:#2e2d2a;--sel-t:#fff;--sel-bg:#e2e0d8;
  --sel-chev:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%2363625a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.75 4.5 6 7.75 9.25 4.5'/%3E%3C/svg%3E");}
html[data-theme="dark"]{
  color-scheme:dark;
  --bg:#141413;--card:#212120;--soft:#2f2f2c;--col:#262624;--line:rgba(255,255,255,.17);
  --text:#f4f4f0;--t2:#c0bfb6;--t3:#a4a399;--nav:#1b1b1a;
  --xps:#ff9433;--pvc:#5b7ce8;--pg:#7ebf2e;--komm:#e0619c;--teh:#8fa2b8;
  --xps-t:#ffab5e;--pvc-t:#8fa8f0;--pg-t:#9ed45c;--st-mid-t:#e8b93a;
  --st-ok:#3dbd85;--st-ok-t:#4fd196;--bg-ok:#0f3d33;--st-mid:#e8b93a;--st-bad:#e3684f;--st-bad-t:#f08a72;
  --accent:#e8e7e1;--accent-bg:#363531;--accent-t:#f4f4f0;--accent-btn:#e8e7e1;--info:#4a90e2;--info-bg:#12324f;--info-t:#8fbcf2;--sel:#e8e7e1;--sel-t:#161615;--sel-bg:#363531;
  --sel-chev:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%2398978e' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.75 4.5 6 7.75 9.25 4.5'/%3E%3C/svg%3E");}
*{box-sizing:border-box}
/* Шрифт логотипа — Montserrat Medium, подрезанный до кириллицы и латиницы
   (39 КБ вместо 260). Лежит рядом с порталом: работает и без интернета, и
   в установленном PWA. Системный жирный текст для вывески смотрелся как ещё
   один заголовок, геометрический гротеск читается как знак. */
@font-face{font-family:"Sreda Logo";src:url(/static/logo-montserrat-500.ttf) format("truetype");
  font-weight:400 600;font-style:normal;font-display:swap}
/* жирное начертание вывески — «ДЕВЕЛОПМЕНТ» (тот же Montserrat 700, что в методологии) */
@font-face{font-family:"Sreda Logo";src:url(/static/meth-montserrat-700.ttf) format("truetype");
  font-weight:700;font-style:normal;font-display:swap}
/* Горизонтальной прокрутки у страницы быть не должно: всё широкое (таблицы,
   доски, недельный отчёт) прокручивается внутри своих контейнеров. Без этого
   случайные лишние пиксели уводили вбок всю страницу вместе с «липкой»
   шапкой — логотип уезжал за левый край (07.10.2026). */
html{overflow-x:clip}
body{margin:0;background:var(--bg);color:var(--text);line-height:1.45;
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI","Inter",Roboto,sans-serif;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
nav{position:sticky;top:0;z-index:50;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:6px;padding:8px 18px;flex-wrap:wrap;
  background:color-mix(in srgb,var(--nav) 84%,transparent);
  backdrop-filter:saturate(1.5) blur(14px);-webkit-backdrop-filter:saturate(1.5) blur(14px)}
/* Вывеска: flex:0 0 auto — её нельзя сжимать, когда в шапке становится тесно,
   иначе первым «уезжает» именно знак. */
nav .brand{font-family:"Sreda Logo",Montserrat,-apple-system,BlinkMacSystemFont,sans-serif;
  font-size:14px;font-weight:500;text-transform:uppercase;letter-spacing:.07em;
  margin-right:12px;display:inline-flex;align-items:center;gap:10px;white-space:nowrap;flex:0 0 auto}
/* «СРЕДА» — обычным, «ДЕВЕЛОПМЕНТ» — жирным (30.10.2026).
   em здесь только ради разметки, наклон снимаем. */
nav .brand em{font-style:normal;font-weight:700;color:var(--text)}
/* та же вывеска на экране входа — первое, что видит человек */
.loginmark{font-family:"Sreda Logo",Montserrat,-apple-system,BlinkMacSystemFont,sans-serif;
  font-size:19px;font-weight:500;text-transform:uppercase;letter-spacing:.09em;margin:10px 0 4px}
.loginmark em{font-style:normal;font-weight:700;color:var(--text)}
/* логотип: силуэт «крепости» без подложки, цветом текста — в тёмной теме светлый */
.logo-mark{width:24px;height:24px;flex:0 0 auto;display:block;color:var(--text)}
nav a{font-size:14px;color:var(--t2);text-decoration:none;padding:6px 9px;border-radius:8px;cursor:pointer;white-space:nowrap}
nav a:hover{background:var(--soft);color:var(--text)}
nav a.on{background:var(--sel);color:var(--sel-t);font-weight:500}
/* группы меню (выпадающие) */
.navgrp{position:relative;display:inline-flex}
.navgrp>.navbtn{font:inherit;font-size:14px;color:var(--t2);background:none;border:0;padding:6px 8px 6px 9px;border-radius:8px;cursor:pointer;display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
.navgrp>.navbtn:hover{background:var(--soft);color:var(--text)}
.navgrp>.navbtn .chev{font-size:12px;line-height:1;opacity:.55;transition:transform .15s}
.navgrp.open>.navbtn .chev{transform:rotate(180deg)}
.navgrp.on>.navbtn{background:var(--sel);color:var(--sel-t);font-weight:500}
.navgrp.on>.navbtn .chev{opacity:.85}
.navmenu{position:absolute;top:calc(100% + 7px);left:0;min-width:212px;background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:0 12px 36px rgba(0,0,0,.18);padding:6px;display:none;flex-direction:column;gap:2px;z-index:200}
/* выпадашка — отдельная поверхность, светлее фона, чтобы не сливалась в тёмной теме */
@media(prefers-color-scheme:dark){.navmenu{background:#26241f;border-color:#3a332a;box-shadow:0 14px 40px rgba(0,0,0,.5)}}
:root[data-theme="dark"] .navmenu{background:#26241f;border-color:#3a332a;box-shadow:0 14px 40px rgba(0,0,0,.5)}
:root[data-theme="light"] .navmenu{background:#fff;border-color:var(--line);box-shadow:0 12px 36px rgba(0,0,0,.14)}
.navgrp.open .navmenu{display:flex;animation:navpop .13s ease}
@keyframes navpop{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.navmenu a{font-size:14px;color:var(--t2);padding:8px 12px;border-radius:8px;white-space:nowrap;display:block}
.navmenu a:hover{background:var(--soft);color:var(--text)}
.navmenu a.on{background:var(--sel-bg);color:var(--text);font-weight:600}
.legend{margin-left:auto;display:flex;gap:12px;font-size:12px;color:var(--t3);flex-wrap:wrap}
.legend span{display:inline-flex;align-items:center;gap:4px}
.sw{width:9px;height:9px;border-radius:3px;display:inline-block}
.main{max-width:1300px;margin:0 auto;padding:24px 20px 60px}
h1{font-size:23px;font-weight:650;margin:0 0 4px;letter-spacing:-.015em}
h2{font-size:16px;font-weight:600;margin:24px 0 10px;letter-spacing:-.01em}
.sub{font-size:13px;color:var(--t3);margin-bottom:18px}
.crumb{font-size:13px;color:var(--t3);margin-bottom:10px}
/* ссылки — цветом текста с постоянным тонким подчёркиванием: без синего их
   иначе не отличить от текста, а на телефоне наведения нет (30.10.2026) */
.crumb a,a.link{color:var(--accent-t);cursor:pointer;font-weight:500;
  text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px;
  text-decoration-color:color-mix(in srgb,var(--t3) 55%,transparent)}
.crumb a:hover,a.link:hover{text-decoration-color:currentColor}
a.link:hover{text-decoration:underline}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:20px}
.kpi{background:var(--card);border:0.5px solid var(--line);border-radius:var(--radius);padding:15px 17px;box-shadow:var(--shadow-1)}
.kpiL{cursor:pointer;transition:transform var(--tr),box-shadow var(--tr),border-color var(--tr)}
.kpiL:hover{border-color:var(--accent-t);transform:translateY(-1px);box-shadow:var(--shadow-2)}
/* Подпись занимает ровно две строки, как у плиток в карточках: иначе при
   длинной подписи («Города объектов без тарифа») цифра съезжала вниз и ряд
   плиток разъезжался по вертикали. */
.kpi .l{font-size:12px;color:var(--t2);line-height:1.3;min-height:2.6em;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.kpi .v{font-size:24px;font-weight:650;margin-top:2px;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}
/* Границу у карточек убрали: 0.5px на обычном мониторе рендерится неровно и
   местами пропадает, а тень отделяет карточку от фона надёжнее. */
.card{background:var(--card);border:0;border-radius:var(--radius);padding:16px 18px;box-shadow:var(--shadow-1)}
.dcard{cursor:pointer;transition:transform .12s,box-shadow .12s,border-color .12s}.dcard:hover{border-color:var(--accent-t);transform:translateY(-1px);box-shadow:0 4px 14px rgba(0,0,0,.06)}
.dcard .nm{font-size:16px;font-weight:600;display:flex;align-items:center;gap:10px;
  min-width:0;overflow-wrap:anywhere}
.dcard-arch{position:absolute;top:10px;right:10px;width:28px;height:28px;border-radius:8px;border:0.5px solid var(--line);background:var(--card);color:var(--t3);cursor:pointer;opacity:0;transition:.12s;display:flex;align-items:center;justify-content:center;z-index:2}
.dcard:hover .dcard-arch{opacity:1}
.dcard-arch:hover{color:var(--st-mid-t);border-color:var(--st-mid-t)}
.dot{width:8px;height:8px;border-radius:50%;display:inline-block}
.row{display:flex;align-items:center;gap:8px;margin-top:6px}
.row .k{font-size:12px;width:38px;color:var(--t3)}
.track{flex:1;height:6px;background:var(--soft);border-radius:3px;overflow:hidden}
.fill{height:100%;border-radius:3px}
/* значение справа не переносим: «1 198 м²» ломалось на две строки */
.row .n{font-size:12px;min-width:44px;text-align:right;font-weight:600;white-space:nowrap}
.foot{font-size:12px;color:var(--t2);border-top:1px solid var(--line);margin-top:10px;padding-top:9px}
.btag{font-size:12px;padding:1px 8px;border-radius:6px;color:#fff}
.two{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:820px){.two{grid-template-columns:1fr}}
table{border-collapse:collapse;width:100%;font-size:13px}
th,td{padding:8px 10px;border-bottom:1px solid var(--line);text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
th{color:var(--t2);font-weight:550;background:var(--soft);font-size:12px;text-transform:none;letter-spacing:.01em}
td.l,th.l{text-align:left;white-space:normal}
tbody tr{transition:background var(--tr)}
tbody tr:hover td{background:color-mix(in srgb,var(--soft) 45%,transparent)}
tbody tr:last-child td{border-bottom:none}
.scroll{overflow-x:auto;border:0.5px solid var(--line);border-radius:8px;box-shadow:var(--shadow-1);background:var(--card)}
input,select,textarea{border:1px solid var(--line);background:var(--card);color:var(--text);font-size:13px;padding:7px 10px;border-radius:8px;font-family:inherit;transition:border-color var(--tr),box-shadow var(--tr)}
input:hover,select:hover,textarea:hover{border-color:color-mix(in srgb,var(--t3) 55%,transparent)}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent-t);box-shadow:var(--ring)}
textarea{width:100%;resize:vertical;line-height:1.55}
/* Ширину задаёт колонка таблицы, а не само поле: фиксированные 52px и
   обрезали пятизначные объёмы («12000» → «1200»), и мешали таблице
   ужиматься под ширину экрана. */
input.cell{width:100%;min-width:0;border-color:transparent;text-align:right;padding:4px 5px;
  background:transparent;border-radius:6px}
input.cell.plan{font-weight:600}
/* Ячейка, которую можно исправить: обычный текст с пунктиром снизу, поле
   ввода подставляется по клику (cellEdit). */
/* ===== ОТЧЁТЫ ИИ =====
   Единый вид у дайджеста, отчёта по застройщику, отчёта за период, месячного
   отчёта сотрудника и ответов по срезам: один ритм заголовков и абзацев,
   таблицы — настоящие таблицы портала. Отчёт показывают руководству, поэтому
   ширина строки ограничена, а числа в таблицах — моноширинными цифрами. */
.airep{white-space:normal;font-size:13.5px;line-height:1.6;color:var(--text)}
.airep>*:first-child{margin-top:0}
.airep h4{font-size:14px;font-weight:650;margin:16px 0 6px;letter-spacing:-.01em}
.airep h4:first-child{margin-top:0}
.airep p{margin:0 0 9px;max-width:78ch;color:var(--t2)}
.airep b{color:var(--text);font-weight:650}
.airep ul,.airep ol{margin:0 0 10px;padding-left:20px;max-width:78ch;color:var(--t2)}
.airep li{margin-bottom:4px}
.airep li::marker{color:var(--t3)}
.airep code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;
  background:var(--soft);border-radius:5px;padding:1px 5px}
.airep a{overflow-wrap:anywhere}
.airep hr{border:0;border-top:1px solid var(--line);margin:14px 0}
.airep .scroll{margin:4px 0 12px}
.airep table{font-size:13px}
.airep table th{white-space:normal}
.airep table td{white-space:normal}
.airep table td.l{max-width:380px}
/* печать и выгрузка отчёта: таблицы не рвём по строкам */
@media print{.airep tr{break-inside:avoid}.airep h4{break-after:avoid}}

/* География карточки застройщика: город — полоса — ЖК — корпуса. Колонки
   подписаны шапкой, числовые отделены линией, иначе «19   50» читалось как
   одна цифра с хвостом (12.10.2026). */
.geohead,.georow{display:flex;align-items:center;gap:8px;font-size:12.5px}
.geohead{color:var(--t3);font-size:12px;margin-bottom:5px}
.georow{margin-bottom:6px}
.geoname{width:38%;min-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.geobar{flex:1}
.geonum{width:40px;text-align:right}
.geocorp{width:62px;padding-left:10px;border-left:1px solid var(--line)}
.georow .geocorp{color:var(--t2)}
.geostar{color:var(--st-mid-t)}

/* Короткая сводка в заголовке свёрнутого блока: видно, что внутри, без
   раскрытия. */
.fsec>summary .sumbrief{font-weight:400;color:var(--t3);font-size:12.5px;margin-left:10px}
td.ced{cursor:text;border-bottom:1px solid var(--line)}
td.ced:hover{background:color-mix(in srgb,var(--accent-bg) 55%,transparent)}
td.ced:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
td.ced .cedz{color:var(--t3)}
html[data-density="compact"] input.cell{padding:2px 4px}
/* убираем стрелки-спиннеры: они съедают до 16px в узкой ячейке */
input.cell::-webkit-outer-spin-button,input.cell::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
input.cell[type=number]{-moz-appearance:textfield}
input.cell:hover{border-color:var(--line)}
input.cell:focus{background:var(--card);border-color:var(--accent-t)}
tr.total td{background:var(--soft);font-weight:600}
.btn{border:1px solid var(--line);background:var(--card);color:var(--text);font-size:13px;padding:8px 14px;border-radius:8px;cursor:pointer;
  display:inline-flex;align-items:center;gap:5px;justify-content:center;
  transition:background var(--tr),border-color var(--tr),transform var(--tr),box-shadow var(--tr)}
.btn:hover{background:var(--soft);border-color:color-mix(in srgb,var(--t3) 55%,transparent)}
.btn:active{transform:scale(.97)}
.btn:focus-visible{outline:none;box-shadow:var(--ring)}
/* главная кнопка — графит, как выбранные пункты: синим остаются только ссылки */
.btn.pri{border-color:transparent;background:var(--sel);color:var(--sel-t);font-weight:500;box-shadow:var(--shadow-1)}
.btn.pri:hover{background:color-mix(in srgb,var(--sel) 84%,var(--bg));border-color:transparent}
.controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.seg button{border:none;background:transparent;color:var(--t2);font-size:13px;padding:7px 13px;cursor:pointer}
/* выбранный пункт — графит (--sel), а не синий: синим в портале отмечены действия */
.seg button.on{background:var(--sel);color:var(--sel-t)}
.board{display:flex;gap:14px;overflow-x:auto;padding:10px 0;align-items:stretch;min-height:calc(100vh - 230px)}
.column{background:var(--col);border-radius:8px;padding:11px;min-width:270px;max-width:270px;flex:0 0 auto;display:flex;flex-direction:column}
.column .ch{font-size:14px;font-weight:600;padding:2px 4px 8px}
.column .ch .cnt{color:var(--t3);font-weight:400;font-size:12px;float:right}
.tcard{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:9px 10px;font-size:13px;margin-bottom:8px;line-height:1.5}
.tcard .wk{font-size:12px;color:var(--t3);margin-bottom:3px}
.tcard textarea{border-color:transparent;background:transparent;padding:2px}
.add{font-size:13px;color:var(--accent-t);font-weight:500;cursor:pointer;padding:8px 6px;margin-top:6px;border:1px dashed var(--line);border-radius:8px;text-align:center;font-weight:500}
.colcards{display:flex;flex-direction:column;gap:8px;min-height:20px}
.add:hover{background:var(--accent-bg);border-color:var(--accent-t)}
.rep{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:16px 18px;white-space:pre-wrap;font-size:14px;line-height:1.6;margin-bottom:12px}
.rep .x{float:right;cursor:pointer;color:var(--t3)}
.replist .r{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:12px 15px;margin-bottom:10px;cursor:pointer}
.replist .r:hover{border-color:var(--accent-t)}
.tl{border-left:2px solid var(--line);padding-left:14px;margin-left:4px}
.tl .item{margin-bottom:12px}
.tl .meta{font-size:12px;color:var(--t3)}
.tl .gl{font-size:13px;font-weight:500}
.tl .tx{font-size:13px;color:var(--t2);white-space:pre-wrap;line-height:1.5}
.saved{position:fixed;bottom:20px;left:50%;transform:translateX(-50%) translateY(8px);background:var(--text);color:var(--bg);font-size:13px;padding:9px 18px;border-radius:8px;opacity:0;transition:opacity .22s ease,transform .22s ease;pointer-events:none;box-shadow:var(--shadow-2);z-index:120}
.saved.show{opacity:1;transform:translateX(-50%) translateY(0)}
.err{background:#faeeda;color:#a06400;padding:12px 16px;border-radius:8px;font-size:14px;margin:12px 0}
.spin{width:14px;height:14px;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;display:inline-block;animation:sp .7s linear infinite;vertical-align:-2px}
@keyframes sp{to{transform:rotate(360deg)}}
.empty{color:var(--t3);font-size:14px;padding:8px 0}
/* Шкала лояльности: одиннадцать делений 0–10 в цвете своего уровня.
   Закрашено до текущей оценки, выбранное деление обведено. */
.relscale{display:flex;gap:3px;margin-top:10px}
.relcell{flex:1;min-width:0;height:28px;border:0;border-radius:6px;cursor:pointer;
  font:600 11px/1 inherit;color:var(--t3);transition:transform .08s,filter .12s;padding:0}
.relcell:hover{filter:brightness(1.12);transform:translateY(-1px)}
.relcell.sel{outline:2px solid var(--text);outline-offset:1px}
.relcell:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.score{display:flex;align-items:center;gap:10px}
.score input[type=range]{flex:1;padding:0}
.score .val{font-size:20px;font-weight:700;min-width:34px;text-align:center}
.block-h{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:8px}
.tabs2{display:flex;gap:5px;flex-wrap:wrap;border-top:0.5px solid var(--line);padding-top:12px;margin-top:14px}
.tab2{font-size:13px;padding:6px 13px;border-radius:20px;color:var(--t2);cursor:pointer;border:0.5px solid transparent;background:none;transition:background var(--tr),box-shadow var(--tr)}
.tab2:hover{background:var(--soft);color:var(--text)}
.tab2.on{background:var(--sel-bg);border-color:transparent;color:var(--text);font-weight:600;box-shadow:none}
/* Разделитель между смысловыми группами вкладок: двенадцать одинаковых пилюль
   в ряд читаются как сплошная полоса, глазу не за что зацепиться. */
.tabsep{width:1px;height:16px;background:var(--line);align-self:center;margin:0 4px;flex:0 0 auto}
.tab2:focus-visible{outline:none;box-shadow:var(--ring)}
.tab2 .c{color:var(--t3);font-weight:400}
.al .ago{white-space:nowrap}
/* ===== КАЛЬКУЛЯТОР ЦЕНЫ =====
   Главная беда прежнего вида: справочные числа, поля ввода и результат
   выглядели одинаково, и было непонятно, что можно менять, а что приехало из
   прайса. Разделяем тремя способами сразу: групповой шапкой, фоном ячейки и
   рамкой у полей ввода. */
.pcalc{width:100%;border-collapse:separate;border-spacing:0}
.pcalc th.grp{font-size:12px;font-weight:600;
  color:var(--t3);text-align:center;padding:0 6px 3px}
.pcalc th.grp.ref{color:var(--t2)}
.pcalc th.grp.act{color:var(--accent-t)}
.pcalc th.grp.res{color:var(--st-ok-t)}
.pcalc thead tr.cols th{font-size:12px;font-weight:600;color:var(--t2);padding:5px 8px;
  border-bottom:1px solid var(--line);white-space:nowrap}
.pcalc td{padding:7px 8px;border-bottom:1px solid var(--line);text-align:right;
  font-variant-numeric:tabular-nums}
.pcalc td.l,.pcalc th.l{text-align:left}
.pcalc td.ref{background:var(--soft);color:var(--t2)}
.pcalc td.act{background:color-mix(in srgb,var(--accent) 5%,transparent)}
.pcalc .zone{border-left:2px solid var(--line)}
.pcalc input{width:100%;max-width:110px;text-align:right;padding:5px 8px;border-radius:8px;
  border:1px solid var(--accent);background:var(--card);font-variant-numeric:tabular-nums}
.pcalc input:focus{outline:none;box-shadow:var(--ring)}
.pcalc input.wide{max-width:120px;font-weight:650}
.pcstep{font-size:12.5px;font-weight:600;
  color:var(--t3);margin:14px 0 6px;display:flex;align-items:center;gap:7px}
.pcstep .n{width:17px;height:17px;border-radius:50%;background:var(--accent-bg);
  color:var(--accent-t);font-size:12px;display:flex;align-items:center;justify-content:center}
/* Плитки метрик прижаты влево и ограничены по ширине: растянутые на весь
   экран, они разносили три числа по метру друг от друга — глаз собирал их
   дольше, чем читал. */
.mini{display:grid;grid-template-columns:repeat(auto-fit,minmax(172px,212px));gap:10px;margin:16px 0;justify-content:start}
/* fill — плитки занимают всю ширину контента и выравниваются по карточкам
   выше и ниже. Нужен там, где плиток пять и больше: при потолке в 212px
   строка обрывалась задолго до правого края (07.10.2026). */
.mini.fill{grid-template-columns:repeat(auto-fit,minmax(172px,1fr))}
.mini .m{position:relative;background:var(--card);border:0;border-radius:8px;padding:12px 14px 13px;
  box-shadow:var(--shadow-1);overflow:hidden}
/* Цветная полоса слева — метка смысла плитки: заложения розовые как комм-блок,
   вопросы жёлтые, контакт по свежести. Читается боковым зрением, до чтения цифр. */
.mini .m::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--mc,transparent)}
/* Шапка плитки фиксированной высоты: «Вопросы комм × тех» переносится на две
   строки, а «Заложения» нет — без резерва под вторую строку цифры в соседних
   плитках вставали на разной высоте и ряд выглядел кривым. */
.mini .m .mh{display:flex;align-items:flex-start;gap:7px;margin-bottom:8px;min-height:30px}
.mini .m .mi{width:22px;height:22px;border-radius:7px;flex:0 0 auto;display:flex;align-items:center;
  justify-content:center;background:var(--mbg,var(--soft));color:var(--mc,var(--t2))}
/* Подпись занимает ровно две строки независимо от длины: «Заложения» коротко,
   «Вопросы комм × тех» переносится — без фиксированной высоты цифры соседних
   плиток разъезжались по вертикали на 6 пикселей. */
/* Регистр подписи — как у плиток разделов (.kpi .l): две разные плитки с
   одной ролью читались по-разному — на «Обзоре» обычным текстом, на
   «Потенциале», «Прайсах» и «Логистике» капсом (11.10.2026). */
.mini .m .ml{font-size:12px;font-weight:550;letter-spacing:.01em;color:var(--t2);
  line-height:1.3;padding-top:3px;height:35px;display:-webkit-box;-webkit-line-clamp:2;
  -webkit-box-orient:vertical;overflow:hidden}
.mini .m .mv{font-size:24px;font-weight:680;line-height:1.05;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.mini .m .md{font-size:12px;color:var(--t3);margin-top:4px}
/* Стрелка появляется только у кликабельной плитки и только под курсором:
   иначе четыре стрелки в ряд спорят с цифрами за внимание. */
.mini .m .mgo{margin-left:auto;color:var(--t3);opacity:0;transform:translateX(-3px);
  transition:opacity var(--tr),transform var(--tr);font-size:13px}
.mini .m.kpiL:hover .mgo,.mini .m.kpiL:focus-visible .mgo{opacity:1;transform:none}
/* Комментарий партнёра — две строки: после импорта подрядчиков в нём офис,
   регион и история работы, и строка таблицы вырастала на пол-экрана, сжимая
   остальные колонки (11.10.2026). Полный текст — в подсказке и в карточке. */
.prtnote{font-size:12px;color:var(--t3);line-height:1.35;max-width:430px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.avatar{width:46px;height:46px;border-radius:8px;background:var(--accent-bg);display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:600;color:var(--accent-t)}
.pill{font-size:12px;padding:1px 9px;border-radius:20px}
.tabpane{display:none}.tabpane.on{display:block}
input.rk{-webkit-appearance:none;height:6px;border-radius:3px;outline:none}
input.rk::-webkit-slider-thumb{-webkit-appearance:none;width:18px;height:18px;border-radius:50%;cursor:pointer;border:2px solid var(--card)}
.tcard{position:relative;padding-left:13px!important}
.tcard .sbar{position:absolute;left:0;top:0;bottom:0;width:4px;border-radius:8px 0 0 8px}
.tcard .shead{display:flex;align-items:center;gap:6px;margin-bottom:4px}
.stbtn{border:none;background:none;cursor:pointer;font-size:12px;padding:2px 8px;border-radius:20px;font-weight:500}
.stbtn2{background:var(--card);cursor:pointer;width:22px;height:22px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;line-height:1;flex:0 0 auto}
.cardtext{font-size:12px;line-height:1.5;color:var(--text);cursor:pointer;white-space:pre-wrap;margin-top:2px}
.cardtext:hover{color:var(--accent-t)}
.wkmonth{background:var(--card);color:var(--text);text-align:left;font-weight:600;font-size:14px;padding:9px 12px;border:1px solid var(--line);border-bottom:none;border-radius:8px 12px 0 0;margin-top:22px;
  box-shadow:var(--shadow-1);display:flex;align-items:center;gap:9px}
.wknav{margin-left:auto;display:flex;align-items:center;gap:6px}
.wkpos{font-size:12px;color:var(--t2);font-weight:400;min-width:130px;text-align:center}
.wkbtn{border:1px solid var(--line);background:var(--card);color:var(--text);width:28px;height:28px;
  border-radius:8px;cursor:pointer;font-size:15px;line-height:1;display:inline-flex;align-items:center;justify-content:center;
  transition:background var(--tr)}
.wkbtn:hover:not(:disabled){background:var(--soft)}
.wkbtn:disabled{opacity:.35;cursor:default}
/* колонка цели закреплена, недели прокручиваются */
.wkwrap{overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x proximity;scroll-padding-left:290px}
.wkwrap::-webkit-scrollbar{height:11px}
.wkwrap::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--t3) 60%,transparent);border-radius:6px;
  border:2px solid transparent;background-clip:content-box}
.wkwrap::-webkit-scrollbar-thumb:hover{background:var(--t2);border:2px solid transparent;background-clip:content-box}
.wkwrap::-webkit-scrollbar-track{background:var(--soft);border-radius:6px}
/* в сетке отчёта полосы не нужны — есть рамки; закреплённой колонке нужен
   НЕпрозрачный фон, иначе сквозь неё просвечивают уезжающие недели */
.wkgrid tbody tr td{background:var(--card)}
.wkgrid tbody tr:hover td{background:color-mix(in srgb,var(--accent) 6%,var(--card))}
/* кнопка удаления строки: не мозолит глаза, но доступна с клавиатуры */
.wkgoal{position:relative}
.wkdel{position:absolute;top:6px;right:6px;width:24px;height:24px;padding:0;border-radius:7px;
  border:1px solid transparent;background:var(--card);color:var(--t3);cursor:pointer;
  display:flex;align-items:center;justify-content:center;opacity:.3;
  transition:opacity var(--tr),color var(--tr),border-color var(--tr)}
/* Кнопка видна всегда, просто приглушена. Появление только по наведению
   означало бы, что на планшете и телефоне её нет вообще, а с клавиатуры
   её видно лишь когда окно в фокусе. */
.wkgoal:hover .wkdel,.wkgoal:focus-within .wkdel,.wkdel:focus,.wkdel:focus-visible{opacity:1}
.wkdel:hover{color:var(--st-bad-t);border-color:var(--st-bad-t)}
.wkdel:focus-visible{outline:none;box-shadow:var(--ring)}
.wkgrid tbody tr td.wkgoal{background:var(--soft)}
.wkgrid tbody tr:hover td.wkgoal{background:color-mix(in srgb,var(--accent) 10%,var(--soft))}
.wkgrid thead th{background:var(--soft)}
.wkgrid th:first-child,.wkgrid td:first-child{position:sticky;left:0;z-index:2}
.wkgrid thead th:first-child{z-index:3}
.wkwrap.scrolled .wkgrid th:first-child,.wkwrap.scrolled .wkgrid td:first-child{
  box-shadow:6px 0 10px -6px rgba(0,0,0,.28)}
.wkgrid th+th,.wkgrid td+td{scroll-snap-align:start}
.wkmonth::before{content:"";width:4px;height:16px;border-radius:2px;background:var(--accent);display:inline-block}
.wkgrid{border-collapse:separate;border-spacing:0;width:100%;min-width:1100px;table-layout:fixed}
.wkgrid th{background:var(--soft);border:1px solid var(--line);padding:9px 11px;font-size:12.5px;font-weight:600;color:var(--text);text-align:left !important;vertical-align:top}
.wkgrid th.wkgoalh{width:290px;text-align:left;background:var(--soft)}
.wkdates{font-size:12px;font-weight:400;color:var(--t2);margin-top:2px}
.wkalien{background:color-mix(in srgb,var(--st-mid) 12%,var(--soft))!important}
.wkalien .wkdates{color:var(--st-mid-t)}
.wkgrid col.wkgoalcol{width:290px}
.wkgrid td{border:1px solid var(--line);padding:9px 11px;font-size:12.5px;line-height:1.55;vertical-align:top;text-align:left;overflow-wrap:anywhere;word-break:break-word}
.wkgoal{background:var(--soft);cursor:pointer;font-weight:500;overflow-wrap:anywhere;word-break:break-word;white-space:normal;border-left:3px solid var(--accent)!important}
.wkgoal:hover{background:color-mix(in srgb,var(--accent) 10%,var(--soft))}
.wkgoal:hover{color:var(--accent-t)}
.wkcell{white-space:pre-wrap;color:var(--t2);text-align:left;overflow-wrap:anywhere;word-break:break-word}
.wtbl{display:flex;flex-direction:column;gap:8px}
.wrow{display:grid;grid-template-columns:minmax(220px,1fr) 2fr;gap:14px;background:var(--card);border:0.5px solid var(--line);border-radius:8px;padding:12px 14px}
.wgoal{display:flex;gap:8px;align-items:flex-start;font-size:13px;font-weight:500;cursor:pointer}
.wgoal:hover{color:var(--accent-t)}
.wgoal .stbtn2{flex:0 0 auto;margin-top:1px}
.wweeks{display:flex;flex-direction:column;gap:6px}
.wk-item{font-size:12px;line-height:1.5;color:var(--t2);background:var(--soft);padding:6px 10px;border-radius:8px;white-space:pre-wrap}
.modal-bg{position:fixed;inset:0;background:rgba(0,0,0,.42);z-index:100;display:flex;align-items:flex-start;justify-content:center;padding:4vh 16px;overflow-y:auto;overscroll-behavior:contain;
  backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);animation:fadeIn .18s ease}
/* margin:auto — окно по центру, пока помещается, и без обрезки сверху, когда
   не помещается: тогда контейнер просто прокручивается. */
.modal{background:var(--card);border-radius:8px;max-width:760px;width:100%;padding:24px;margin:auto 0;
  box-shadow:0 20px 60px rgba(0,0,0,.3);animation:popIn .2s cubic-bezier(.2,.9,.3,1.2)}
/* Шапка высокого окна прилипает: закрыть и понять, что открыто, можно с любой
   прокрутки. Включается классом, а не «первым div подряд» — у разных окон
   первым элементом бывает и само содержимое. */
.modal>.mhead{position:sticky;top:-24px;z-index:3;
  background:linear-gradient(var(--card) 76%,transparent);
  margin:-24px -24px 0;padding:24px 24px 10px}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes popIn{from{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:none}}
.cmt{display:flex;gap:10px;margin:12px 0}
.cmt-av{width:32px;height:32px;border-radius:50%;background:var(--accent);color:var(--sel-t);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex:0 0 auto}
.cmt-body{flex:1}
.cmt-meta{font-size:12px;color:var(--t3);margin-bottom:2px}
.cmt-text{font-size:13px;line-height:1.5;background:var(--soft);padding:8px 12px;border-radius:8px;white-space:pre-wrap}
.devtag{font-size:12px;font-weight:600;color:var(--accent-t);background:var(--accent-bg);padding:2px 8px;border-radius:20px;cursor:pointer;max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.colhead{display:flex;align-items:flex-start;gap:6px;padding:2px 4px 10px}
.colprog{height:4px;border-radius:2px;background:var(--soft);overflow:hidden;margin:6px 0 2px}
.colprog>div{height:100%;background:var(--st-ok)}
/* Место под логотип всегда квадратное: без flex:0 0 auto длинное название
   («ГК ЕкатеринодарИнвест-Строй») сжимало картинку в узкую полоску 15×60,
   а сама подложка оставалась высотой в три строки (09.10.2026). */
.logo{width:60px;height:60px;flex:0 0 auto;align-self:flex-start;
  border-radius:8px;object-fit:contain;background:var(--soft)}
.alerts{background:var(--card);border:0.5px solid var(--line);border-radius:8px;padding:6px 0;margin-bottom:22px;overflow:hidden}
.alerts .ah{display:flex;align-items:center;gap:8px;padding:10px 16px 8px;font-weight:600;font-size:15px}
.alerts .ah .cnt{margin-left:auto;font-size:12px;color:var(--t3);font-weight:400}
.al{display:flex;align-items:flex-start;gap:10px;padding:9px 16px;border-top:0.5px solid var(--line);cursor:pointer}
.al:hover{background:var(--soft)}
.al .adot{width:7px;height:7px;border-radius:50%;margin-top:6px;flex:0 0 auto}
.al .adev{font-weight:600;font-size:13px;min-width:96px}
.al .atype{font-size:12px;padding:1px 8px;border-radius:6px;background:var(--soft);color:var(--t2);white-space:nowrap}
.al .atext{font-size:13px;color:var(--t2)}
.al .ago{margin-left:auto;color:var(--t3);font-size:13px}
.alerts .more{padding:9px 16px;font-size:13px;color:var(--accent-t);font-weight:500;cursor:pointer;border-top:0.5px solid var(--line)}
.alerts .more:hover{background:var(--soft)}
.fsec{border:0.5px solid var(--line);border-radius:8px;margin-bottom:12px;overflow:hidden}
.fsec>summary{list-style:none;cursor:pointer;padding:13px 16px;font-weight:600;font-size:15px;background:var(--soft);display:flex;align-items:center;gap:8px}
.fsec>summary::-webkit-details-marker{display:none}
.fsec>summary .cr{margin-left:auto;color:var(--t2);font-size:17px;line-height:1;font-weight:600;transition:transform .18s ease;transform-origin:50% 40%}
.fsec[open]>summary .cr{transform:rotate(180deg)}
.fsec .body{padding:14px 16px}
/* Окно «чем закрыли конструктив»: два поля в строку, на телефоне — в одну колонку */
.fld2{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}
@media(max-width:520px){.fld2{grid-template-columns:1fr}}
.factfrm .cell{border:1px solid var(--line);border-radius:8px;padding:7px 9px;text-align:left}
.fld{margin-bottom:12px}
.fld label{display:block;font-size:12px;color:var(--t2);margin-bottom:4px}
.fld .hint{font-size:12px;color:var(--t3);margin-top:3px}
.fld input,.fld textarea{width:100%}
.f2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@media(max-width:700px){.f2{grid-template-columns:1fr}}
.chk{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}
.chk-dev{display:inline-flex;align-items:center;gap:5px;font-size:12px;border:0.5px solid var(--line);border-radius:8px;padding:3px 9px;cursor:pointer}
.chk-dev input{width:auto;margin:0}
.chk label{display:inline-flex;align-items:center;gap:6px;font-size:13px;border:0.5px solid var(--line);border-radius:20px;padding:5px 12px;cursor:pointer}
.chk input{width:auto;margin:0}
.regform{display:none;gap:6px;flex-wrap:wrap;margin-top:8px}
.regform.open{display:flex}
.tree{margin-top:8px}
.tcenter{display:inline-block;background:var(--accent);color:var(--sel-t);font-weight:600;padding:8px 16px;border-radius:8px}
.tline{width:2px;height:14px;background:var(--line);margin-left:44px}
.tgroups{display:grid;grid-template-columns:repeat(auto-fit,minmax(185px,1fr));gap:10px}
.tg{border:1px solid var(--line);border-radius:8px;padding:10px}
.tgt{font-size:12px;color:var(--t2);font-weight:600;margin-bottom:7px}
.chips{display:flex;flex-wrap:wrap;gap:6px}
.chip{font-size:12px;border:1px solid var(--line);border-radius:8px;padding:2px 9px;background:var(--soft)}

.devhead{margin-bottom:16px}
.dav{width:46px;height:46px;border-radius:8px;background:var(--accent-bg);display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:600;color:var(--accent-t)}
.devmetrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px}
.mtile{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:11px 13px}
.mtile .ml{font-size:12px;color:var(--t2)}
.mtile .mv{font-size:20px;font-weight:600;margin-top:1px}
.mtile .mh{font-size:12px;color:var(--t3);margin-top:1px}
.devtabs{display:flex;gap:4px;flex-wrap:wrap;border-bottom:1px solid var(--line);margin:18px 0 16px}
.dtab{border:none;background:transparent;color:var(--t2);font-size:14px;padding:8px 13px;cursor:pointer;border-bottom:2px solid transparent;border-radius:0}
.dtab:hover{color:var(--text)}
.dtab.on{color:var(--text);border-bottom-color:var(--sel)}
.estate{display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center;color:var(--t2);font-size:14px;padding:28px 16px;border:1px dashed var(--line);border-radius:8px;margin-top:8px}
input[type=range].rng-komm{accent-color:var(--komm)}
input[type=range].rng-teh{accent-color:var(--teh)}
.blk-komm{border-top:3px solid var(--komm)}
.blk-teh{border-top:3px solid var(--teh)}

/* ===== читаемость: контраст, границы, ритм ===== */
/* таблицы — заметная шапка, полосатые строки, различимые границы */
table th{background:var(--soft);color:var(--text);font-weight:600;font-size:12.5px;
  border-bottom:1.5px solid var(--line)}
table td{font-size:13.5px;line-height:1.5;border-bottom:1px solid var(--line)}
tbody tr:nth-child(even) td{background:color-mix(in srgb,var(--soft) 34%,transparent)}
tbody tr:hover td{background:color-mix(in srgb,var(--accent) 7%,var(--card))}
.scroll{border:1px solid var(--line)}
/* карточки и плитки — видимая рамка, чтобы не сливались с фоном */
.card,.kpi,.mini .m,.scroll,.fsec,.alerts,.rep,.replist .r,.tcard,.modal{border-color:var(--line)}
.card,.kpi,.mini .m{border-width:1px}
.column{border:1px solid var(--line)}
/* вспомогательный текст — темнее, крупнее */
.sub{font-size:13.5px;color:var(--t2)}
.kpi .l,.mini .m .ml{font-size:12.5px;color:var(--t2)}
.mini .m .md,.fld .hint,.foot{font-size:12px;color:var(--t3)}
.crumb{font-size:13.5px;color:var(--t2)}
.empty{color:var(--t2)}
/* поля и кнопки — различимая рамка в обеих темах */
input,select,textarea{border-color:color-mix(in srgb,var(--line) 100%,transparent);font-size:13.5px}
.btn{border-color:var(--line);font-weight:500}
.seg{border-color:var(--line)}
.seg button{font-weight:500}
.tab2.on{border-color:var(--line)}
/* чипы и метки — контрастнее */
.pill{font-weight:500}
.chip{border-color:var(--line);color:var(--text)}
.devtag{font-weight:600}
.btag{font-weight:600;padding:2px 9px}
/* шапка — плотнее отделена от контента */
nav{border-bottom:1px solid var(--line);box-shadow:0 1px 3px rgba(0,0,0,.05)}
h1{letter-spacing:-.015em}
h2{padding-bottom:6px;border-bottom:1px solid var(--line)}

/* ===== ТАБЛИЦЫ =====
   Реестры длинные: без закреплённой шапки на 40-й строке уже не понять, что
   за колонка. Плотность переключается и запоминается — «просторно» удобно
   читать, «компактно» нужно, когда сравниваешь много строк разом. */
.scroll{max-height:none}
/* текст только для скринридера: пустой <th> иначе читается как «столбец» без имени */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}
table thead th{position:sticky;top:0;z-index:3;
  /* фон непрозрачный: под шапкой проезжают строки */
  background:var(--soft);
  box-shadow:inset 0 -1px 0 var(--line)}
/* когда таблица внутри .scroll с ограничением высоты — шапка липнет к её верху */
/* Базовое значение — в пикселях, а не в vh. Если высота окна почему-либо
   неизвестна (встраивание, headless-рендер), vh даёт 0 и таблица схлопывается
   в полоску. Проценты высоты подключаем только там, где окно точно измерено. */
.scroll.tall{max-height:560px;overflow-y:auto}
@media(min-height:700px){.scroll.tall{max-height:70vh}}
@media(min-height:1100px){.scroll.tall{max-height:760px}}
/* ===== ТАБЛИЦА ПО ШИРИНЕ ЭКРАНА =====
   .scroll.fit не создаёт своей прокрутки: таблица делит доступную ширину, а её
   шапка липнет к шапке портала (её высота меряется в JS и живёт в --navh).
   min-width на таблице — предохранитель: если экран уже этого, колонки начнут
   сминать цифры, поэтому там прокрутка возвращается. */
.scroll.fit{overflow:visible;border-radius:8px}
.scroll.fit>table{table-layout:fixed;width:100%}
.scroll.fit>table th,.scroll.fit>table td{padding-left:5px;padding-right:5px;overflow:hidden}
.scroll.fit>table td.l,.scroll.fit>table th.l{padding-left:11px}
.scroll.fit>table thead th{top:var(--navh,0px)}
@media(max-width:1240px){
  .scroll.fit{overflow-x:auto}
  .scroll.fit>table{min-width:1140px}
  .scroll.fit>table thead th{top:0}
}
th.sortable{cursor:pointer;user-select:none}
th.sortable:hover{color:var(--text);background:color-mix(in srgb,var(--accent) 8%,var(--soft))}
th .sortmark{opacity:.35;font-size:12px;margin-left:3px}
th.sorted .sortmark{opacity:1;color:var(--accent-t)}
tbody tr:nth-child(even) td{background:color-mix(in srgb,var(--soft) 22%,transparent)}
tbody tr:hover td{background:color-mix(in srgb,var(--accent) 8%,var(--card))}
tbody tr:nth-child(even):hover td{background:color-mix(in srgb,var(--accent) 8%,var(--card))}
td .num{font-variant-numeric:tabular-nums;font-weight:600}
td .unit{color:var(--t3);font-size:12px;font-weight:400;margin-left:2px}
td .sub{font-size:12px;color:var(--t3);margin:0}
/* Итоговая строка обязана выигрывать у «зебры» и у подсветки при наведении:
   правило tbody tr:nth-child(even) td весомее, чем tr.total td, и раньше
   перекрашивало итог в цвет обычной чётной строки — он сливался с таблицей.
   Поэтому перечисляем состояния явно и повышаем специфичность. */
tbody tr.total td,
tbody tr.total:nth-child(even) td,
tbody tr.total:hover td,
tbody tr.total:nth-child(even):hover td{
  position:sticky;bottom:0;z-index:2;
  background:var(--soft);
  color:var(--text);font-weight:700;
  /* линия сверху отделяет итог от данных, тень — когда строка «висит» внизу */
  box-shadow:inset 0 2px 0 var(--line), 0 -6px 12px -6px rgba(0,0,0,.14)}
tbody tr.total td .num{font-weight:700}
tbody tr.total td:first-child{border-bottom-left-radius:11px}
tbody tr.total td:last-child{border-bottom-right-radius:11px}
/* плотность строк: значение хранится на <html>, поэтому применяется сразу ко всему */
html[data-density="compact"] th,html[data-density="compact"] td{padding:4px 9px;font-size:12.5px}
html[data-density="compact"] .card{padding:12px 14px}
html[data-density="compact"] .kpi{padding:11px 13px}
html[data-density="comfortable"] th,html[data-density="comfortable"] td{padding:11px 13px}
.density{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;height:32px}
.density button{border:0;background:transparent;color:var(--t2);font:inherit;font-size:12.5px;
  padding:0 11px;cursor:pointer;display:inline-flex;align-items:center;gap:5px}
.density button.on{background:var(--sel);color:var(--sel-t)}

/* ===== СОСТОЯНИЯ: пусто / ошибка / загрузка =====
   Единый вид вместо разнобоя: у пустого экрана должно быть объяснение и
   следующий шаг, у ошибки — кнопка «повторить», а не тупик. */
.state{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  padding:34px 24px;text-align:center;box-shadow:var(--shadow-1)}
.state .ico{width:44px;height:44px;border-radius:8px;background:var(--soft);color:var(--t3);
  display:flex;align-items:center;justify-content:center;margin:0 auto 12px;font-size:22px}
.state .t{font-size:16px;font-weight:650;margin-bottom:5px}
.state .d{font-size:13.5px;color:var(--t3);line-height:1.6;max-width:52ch;margin:0 auto}
.state .act{margin-top:16px;display:flex;gap:8px;justify-content:center;flex-wrap:wrap}
.state.err{border-color:var(--st-bad-t);background:color-mix(in srgb,var(--st-bad) 5%,var(--card))}
.state.err .ico{background:color-mix(in srgb,var(--st-bad) 14%,transparent);color:var(--st-bad-t)}

/* ===== ГРАФИКА В СТРОКАХ =====
   Спарклайн и дельта отвечают на вопрос «это рост или падение», на который
   голое число не отвечает. */
.spark{display:block}
/* ячейка «Темп» — кнопка: график, направление и средний темп рядом */
/* Две строки вместо одной: так ячейка вдвое уже и таблица помещается в экран. */
.tempcell{display:inline-flex;flex-direction:column;align-items:flex-end;gap:0;background:none;
  border:1px solid transparent;border-radius:8px;padding:2px 6px;cursor:pointer;font:inherit;
  color:inherit;transition:border-color var(--tr),background var(--tr);max-width:100%}
.tempcell:hover{border-color:var(--line);background:var(--card)}
.tempcell:focus-visible{outline:none;box-shadow:var(--ring)}
.tempcell .templine{display:flex;align-items:center;gap:5px}
.tempcell .tempnum{font-size:12px;font-weight:650;font-variant-numeric:tabular-nums;white-space:nowrap}
.tempcell .tempsub{font-size:12px;color:var(--t3);white-space:nowrap;line-height:1.3}
html[data-density="compact"] .tempcell .tempsub{display:none}
/* мини-плитки внутри разбора темпа */
/* окно импорта: зона перетаскивания и отчёт моноширинным */
.impdrop{border:2px dashed var(--line);border-radius:8px;padding:26px 18px;text-align:center;
  cursor:pointer;transition:border-color var(--tr),background var(--tr);background:var(--soft)}
.impdrop:hover,.impdrop.over{border-color:var(--accent-t);background:var(--accent-bg)}
.impdrop:focus-visible{outline:none;box-shadow:var(--ring)}
.impdrop-t{font-size:14px;font-weight:600;margin-top:8px}
.impdrop-s{font-size:12px;color:var(--t3);margin-top:2px}
.impreport{margin:14px 0 0;padding:12px 14px;background:var(--soft);border-radius:8px;
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.55;
  white-space:pre-wrap;max-height:340px;overflow:auto;color:var(--t2)}
.minik-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));gap:10px;margin-bottom:6px}
.mini-k{background:var(--soft);border-radius:8px;padding:10px 12px}
.mini-k .l{font-size:12px;color:var(--t2)}
.mini-k .v{font-size:19px;font-weight:650;margin-top:2px;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.mini-k .s{font-size:12px;color:var(--t3);margin-top:2px}
/* спарклайн живёт на своей строке: если ставить его рядом с подписью, на узкой
   плитке подпись ломается на две строки */
.sparkrow{margin-top:8px;padding-top:8px;border-top:1px solid var(--line);
  display:flex;align-items:center;gap:8px;font-size:12px;color:var(--t3)}
.sparkrow span{white-space:nowrap}
.delta{display:inline-flex;align-items:center;gap:3px;font-size:12px;font-weight:600;
  padding:1px 6px;border-radius:6px;line-height:1.5}
.delta.up{color:var(--st-ok-t);background:color-mix(in srgb,var(--st-ok) 13%,transparent)}
.delta.down{color:var(--st-bad-t);background:color-mix(in srgb,var(--st-bad) 12%,transparent)}
.delta.flat{color:var(--t3);background:var(--soft)}
.mbar{height:5px;border-radius:3px;background:var(--soft);overflow:hidden;min-width:52px}
.mbar>i{display:block;height:100%;border-radius:3px}

/* ===== правая часть шапки =====
   Раньше здесь в строку лежали текст «логин · роль», голые ссылки «Дубли»,
   «Пользователи», «выйти» и три кнопки — читалось как список без иерархии и
   переносилось на вторую строку. Теперь: поле поиска с подсказкой клавиш,
   иконки одного размера и меню пользователя, куда убраны служебные разделы. */
/* строка с галочкой: попадание по всей строке, а не по 13-пиксельному квадрату */
.checkrow{display:flex;align-items:flex-start;gap:9px;cursor:pointer;font-size:13.5px;
  color:var(--text);padding:7px 8px;margin:0 -8px;border-radius:8px;transition:background var(--tr)}
.checkrow:hover{background:var(--soft)}
.checkrow input[type=checkbox]{width:17px;height:17px;margin:1px 0 0;accent-color:var(--sel);flex:0 0 auto;cursor:pointer}
.checkrow .hint{display:block;font-size:12px;color:var(--t3);margin-top:2px}
.checkrow:focus-within{box-shadow:var(--ring)}
.navtools{margin-left:auto;display:flex;align-items:center;gap:6px;flex:0 0 auto}
.searchbox{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px;
  border:1px solid var(--line);border-radius:8px;background:var(--card);color:var(--t3);
  font:inherit;font-size:13px;cursor:pointer;transition:border-color var(--tr),color var(--tr)}
.searchbox:hover{border-color:color-mix(in srgb,var(--t3) 55%,transparent);color:var(--t2)}
.searchbox .ti{font-size:15px;flex:0 0 auto}
.searchbox kbd{font:inherit;font-size:12px;color:var(--t3);background:var(--soft);
  border:1px solid var(--line);border-radius:5px;padding:1px 5px;line-height:1.4}
.navbadge{position:absolute;top:-4px;right:-4px;min-width:16px;height:16px;padding:0 4px;
  border-radius:8px;background:var(--st-mid);color:#fff;font-size:12px;font-weight:700;
  display:flex;align-items:center;justify-content:center;border:2px solid var(--nav)}
#bellNav{position:relative;overflow:visible}
.navbtn-icon{background:none;font:inherit}
/* меню пользователя */
.userbtn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 8px 0 4px;
  border:1px solid var(--line);border-radius:8px;background:var(--card);color:var(--text);
  font:inherit;cursor:pointer;transition:border-color var(--tr)}
.userbtn:hover{border-color:color-mix(in srgb,var(--t3) 55%,transparent)}
.useravatar{width:24px;height:24px;border-radius:7px;background:var(--accent-bg);color:var(--accent-t);
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex:0 0 auto}
.userinfo{display:flex;flex-direction:column;align-items:flex-start;line-height:1.15}
.username{font-size:12.5px;font-weight:600}
.userrole{font-size:12px;color:var(--t3)}
.usermenu .umhead{padding:10px 12px 8px;border-bottom:1px solid var(--line);margin-bottom:4px}
.usermenu .umname{font-size:13.5px;font-weight:650}
.usermenu .umsub{font-size:12px;color:var(--t3);margin-top:2px}
.usermenu button{font:inherit;font-size:14px;color:var(--t2);background:none;border:0;text-align:left;
  padding:8px 12px;border-radius:8px;cursor:pointer;width:100%;display:flex;align-items:center;gap:8px}
.usermenu button:hover{background:var(--soft);color:var(--text)}
.usermenu .umsep{height:1px;background:var(--line);margin:4px 0}
.legendmenu .legend{margin:0;display:flex;flex-direction:column;gap:6px;font-size:12.5px;color:var(--t2)}
.legendmenu .sw{width:10px;height:10px;border-radius:3px;flex:0 0 auto}
/* Шапка должна оставаться в одну строку: две строки съедают вертикаль и
   опускают закреплённые шапки таблиц. Сжимаем по мере сужения экрана —
   сначала подсказка клавиш, затем слово «Поиск» и имя пользователя. */
/* Ниже 1500px шапке уже не хватает одной строки: вместо переноса на вторую
   убираем необязательное — подпись «Поиск», ⌘K и дату у часов (дата видна
   в календаре по клику), и слегка поджимаем пункты меню. Порог подобран по
   реальной ширине шапки: в одну строку ей нужно ~1570px (07.10.2026). */
@media(max-width:1500px){.searchbox kbd{display:none}
  .searchbox-t{display:none}
  .searchbox{padding:0 8px;width:32px;justify-content:center}
  nav .clock-d{display:none}
  nav a,.navbtn{padding-left:8px;padding-right:8px}
  nav .navlinks{gap:4px}
  .userrole{display:none}}
@media(max-width:1100px){.userinfo{display:none}.userbtn{padding:0 4px}}

/* ===== шапка: клавиатура и узкие экраны =====
   Пункты меню теперь настоящие ссылки с href — их видно с клавиатуры, можно
   открыть в новой вкладке и скопировать адрес. Ниже 900px весь блок ссылок
   сворачивается в бургер: 15 пунктов с flex-wrap занимали пол-экрана, а шапка
   ещё и sticky. */
.navlinks{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.navburger{display:none;background:none;border:1px solid var(--line);border-radius:8px;
  color:var(--t2);cursor:pointer;padding:5px 9px;align-items:center}
.navburger:hover{background:var(--soft);color:var(--text)}
/* padding:0 обязателен: общее правило `nav a` даёт 6px 12px, из-за чего на
   саму иконку внутри 30-пиксельной кнопки оставалось 4px и она сплющивалась */
/* background:none обязателен: .navicon висит и на <button> (колокольчик,
   тема, палитра), а у кнопки без явного фона браузер рисует системный
   buttonface — он остаётся светлым и в тёмной теме (08.10.2026) */
.navicon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;
  padding:0;flex:0 0 auto;border-radius:8px;color:var(--t2);text-decoration:none;
  background:none;font:inherit;cursor:pointer;border:1px solid var(--line)}
.navicon .ti{flex:0 0 auto}
.navicon:hover{background:var(--soft);color:var(--text)}
.navicon.on{background:var(--sel);color:var(--sel-t);border-color:transparent}
/* видимый фокус: без него портал непроходим с клавиатуры «вслепую» */
nav a:focus-visible,.navbtn:focus-visible,.navburger:focus-visible,.navicon:focus-visible,
.kpiL:focus-visible,.dcard:focus-visible,tbody tr:focus-visible,.al:focus-visible{
  outline:none;box-shadow:var(--ring);border-radius:8px}
tbody tr:focus-visible td{background:var(--accent-bg)}
@media(max-width:1160px){
  nav{gap:8px;padding:8px 14px}
  .navburger{display:inline-flex}
  .navlinks{display:none;order:99;width:100%;flex-direction:column;align-items:stretch;gap:2px;
    padding:8px 0 4px;border-top:1px solid var(--line);margin-top:6px}
  .navlinks.open{display:flex}
  .navlinks>a,.navgrp>.navbtn{padding:10px 12px;font-size:15px;width:100%;justify-content:flex-start;white-space:normal}
  .navgrp{display:block;width:100%}
  .navmenu{position:static;display:none;box-shadow:none;border:0;padding:0 0 0 12px;min-width:0}
  .navgrp.open .navmenu{display:flex}
  nav .brand{font-size:13px;letter-spacing:.06em;margin-right:8px;gap:8px}
  .legend{display:none}
}
/* таблицы на узких экранах не должны рвать страницу по горизонтали */
@media(max-width:700px){
  .main{padding:16px 12px 48px}
  h1{font-size:20px}
  .board{min-height:auto}
  .column{min-width:82vw;max-width:82vw}
}

/* ===== календарь ===== */
.calgrid{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:8px;overflow:hidden;box-shadow:var(--shadow-1)}
.calhead{background:var(--soft);color:var(--text);font-size:12.5px;font-weight:600;padding:8px 10px;text-align:center}
.calcell{background:var(--card);min-height:104px;padding:6px 7px;display:flex;flex-direction:column;gap:4px}
.calwknd{background:color-mix(in srgb,var(--soft) 40%,var(--card))}
.calempty{background:color-mix(in srgb,var(--soft) 22%,var(--card))}
.caltoday{box-shadow:inset 0 0 0 2px var(--accent)}
.calnum{font-size:12px;color:var(--t2);font-weight:600}
.caltoday .calnum{color:var(--accent-t)}
.calev{font-size:12px;line-height:1.35;background:var(--soft);border-radius:6px;padding:3px 6px;cursor:pointer;
  overflow:hidden;transition:background var(--tr)}
.calev:hover{background:color-mix(in srgb,var(--accent) 12%,var(--soft))}
.calemp{font-size:12px;color:var(--t3)}
@media(max-width:760px){.calcell{min-height:72px}.calev{font-size:12px}}

/* ===== слой полировки: стабильность и современность ===== */
::selection{background:color-mix(in srgb,var(--accent) 25%,transparent)}
:focus-visible{outline:none;box-shadow:var(--ring)}
*::-webkit-scrollbar{height:9px;width:9px}
*::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--t3) 45%,transparent);border-radius:5px;border:2px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:var(--t3);border:2px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-track{background:transparent}
.seg{box-shadow:var(--shadow-1);background:var(--card)}
.seg button{transition:background var(--tr)}
.dcard:hover{box-shadow:var(--shadow-2)}
.replist .r{transition:border-color var(--tr),box-shadow var(--tr)}
.replist .r:hover{box-shadow:var(--shadow-1)}
.al{transition:background var(--tr)}
.fsec{box-shadow:var(--shadow-1);background:var(--card)}
.fsec>summary{transition:background var(--tr)}
.fsec>summary:hover{background:color-mix(in srgb,var(--soft) 70%,var(--card))}
.tcard{transition:border-color var(--tr),box-shadow var(--tr)}
.tcard:hover{border-color:color-mix(in srgb,var(--t3) 45%,transparent);box-shadow:var(--shadow-1)}
.chip{transition:border-color var(--tr)}
.avatar,.dav,.logo{box-shadow:var(--shadow-1)}
/* скелетон загрузки вместо «Загрузка…» */
.skel{background:linear-gradient(100deg,var(--soft) 40%,color-mix(in srgb,var(--card) 70%,var(--soft)) 50%,var(--soft) 60%);background-size:200% 100%;animation:shimmer 1.1s linear infinite;border-radius:8px}
.skel-wrap{display:flex;flex-direction:column;gap:14px;padding-top:6px}
.skel-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
@keyframes shimmer{to{background-position:-200% 0}}
/* плавное появление страниц */
#app>*{animation:pageIn .22s ease}
@keyframes pageIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001s!important;transition-duration:.001s!important}
  .wkwrap{scroll-behavior:auto}
}

/* ===== Иконки: встроенный набор (CSS mask, без CDN, красятся currentColor,
   размер по font-size). Раньше <i class="ti ti-*"> не отображались вовсе. ===== */
.ti{display:inline-block;width:1em;height:1em;vertical-align:-.125em;background-color:currentColor;-webkit-mask:var(--_i) center/contain no-repeat;mask:var(--_i) center/contain no-repeat}
/* дорисованы 30.10.2026: использовались в разметке, но не были определены — на их месте был квадрат */
.ti-file-text{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5'/%3E%3Cpath d='M9 13h6M9 17h6'/%3E%3C/svg%3E")}
.ti-report{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 5H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2'/%3E%3Cpath d='M9 3h6v4H9z'/%3E%3Cpath d='M8 12h8M8 16h5'/%3E%3C/svg%3E")}
.ti-report-analytics{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 5H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2'/%3E%3Cpath d='M9 3h6v4H9z'/%3E%3Cpath d='M9 17v-3M12 17v-6M15 17v-4'/%3E%3C/svg%3E")}
.ti-list-check{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M11 6h9M11 12h9M11 18h9'/%3E%3Cpath d='M4 6l1.5 1.5L8 5M4 12l1.5 1.5L8 11M4 18l1.5 1.5L8 17'/%3E%3C/svg%3E")}
.ti-target{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Ccircle cx='12' cy='12' r='5'/%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3C/svg%3E")}
.ti-star{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l2.8 5.7 6.2.9-4.5 4.4 1.1 6.2L12 17.3l-5.6 2.9 1.1-6.2L3 9.6l6.2-.9z'/%3E%3C/svg%3E")}
.ti-star-off{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l2.8 5.7 6.2.9-4.5 4.4 1.1 6.2L12 17.3l-5.6 2.9 1.1-6.2L3 9.6l6.2-.9z'/%3E%3Cpath d='M3 3l18 18'/%3E%3C/svg%3E")}
.ti-plus{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}
.ti-trash{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16M10 11v6M14 11v6M6 7l1 13h10l1-13M9 7V4h6v3'/%3E%3C/svg%3E")}
.ti-check{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12l5 5L20 7'/%3E%3C/svg%3E")}
.ti-circle-check{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M8 12l3 3 5-6'/%3E%3C/svg%3E")}
.ti-paperclip{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 11l-8 8a5 5 0 0 1-7-7l8-8a3.3 3.3 0 0 1 5 5l-8 8a1.7 1.7 0 0 1-2-2l7-7'/%3E%3C/svg%3E")}
.ti-file{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5'/%3E%3C/svg%3E")}
.ti-currency-rubel{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 20V4h5a4 4 0 0 1 0 8H6M6 16h8'/%3E%3C/svg%3E")}
.ti-upload{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 15V4M7 9l5-5 5 5M5 19h14'/%3E%3C/svg%3E")}
.ti-camera{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 8h3l1-2h6l1 2h3v11H5z'/%3E%3Ccircle cx='12' cy='13' r='3'/%3E%3C/svg%3E")}
.ti-refresh{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 11a8 8 0 1 0-2.3 5.6M20 5v6h-6'/%3E%3C/svg%3E")}
.ti-message{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5h16v10H9l-4 4z'/%3E%3C/svg%3E")}
.ti-map-pin{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21s7-5.5 7-11a7 7 0 0 0-14 0c0 5.5 7 11 7 11z'/%3E%3Ccircle cx='12' cy='10' r='2.5'/%3E%3C/svg%3E")}
.ti-help-circle{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.5 9a2.5 2.5 0 1 1 3 2.5c-1 .5-1.5 1-1.5 2M12 17h.01'/%3E%3C/svg%3E")}
.ti-alert-triangle{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l9 16H3z'/%3E%3Cpath d='M12 9v4M12 17h.01'/%3E%3C/svg%3E")}
.ti-calendar-event{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 6h14v14H5z'/%3E%3Cpath d='M5 10h14M8 3v4M16 3v4M12 14h.01'/%3E%3C/svg%3E")}
.ti-building-community{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 21h18M5 21V7l6-4v18M11 21V10l6 4v7M8 8v.01M8 12v.01M8 16v.01'/%3E%3C/svg%3E")}
.ti-sparkles{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4l1.5 4.5L18 10l-4.5 1.5L12 16l-1.5-4.5L6 10l4.5-1.5z'/%3E%3C/svg%3E")}
.ti-target-arrow{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Ccircle cx='12' cy='12' r='5'/%3E%3Ccircle cx='12' cy='12' r='1.4'/%3E%3C/svg%3E")}
.ti-arrow-back-up{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 14l-4-4 4-4M5 10h9a5 5 0 0 1 0 10h-1'/%3E%3C/svg%3E")}
.ti-archive{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16v3H4zM6 10v10h12V10M10 14h4'/%3E%3C/svg%3E")}
/* иконки, которые раньше использовались в разметке, но не были объявлены —
   рисовались пустым местом (кнопки «скачать» и «скопировать» в отчётах) */
.ti-download{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v12M7 11l5 5 5-5M4 21h16'/%3E%3C/svg%3E")}
.ti-copy{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='11' height='11' rx='2'/%3E%3Cpath d='M5 15V5a2 2 0 0 1 2-2h10'/%3E%3C/svg%3E")}
.ti-menu{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h16M4 12h16M4 18h16'/%3E%3C/svg%3E")}
.ti-search{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20 20l-4-4'/%3E%3C/svg%3E")}
.ti-help{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.5 9a2.5 2.5 0 1 1 3.4 2.3c-.6.3-.9.8-.9 1.4v.3'/%3E%3Cpath d='M12 17v.01'/%3E%3C/svg%3E")}
.ti-eye{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='2.5'/%3E%3Cpath d='M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6-10-6-10-6z'/%3E%3C/svg%3E")}
.ti-building{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 21V4a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v17M16 9h3a1 1 0 0 1 1 1v11M3 21h18M9 7v.01M9 11v.01M9 15v.01M12 7v.01M12 11v.01M12 15v.01'/%3E%3C/svg%3E")}
.ti-users{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3'/%3E%3Cpath d='M3 20v-1a5 5 0 0 1 5-5h2a5 5 0 0 1 5 5v1M16 5.1a3 3 0 0 1 0 5.8M18 20v-1a5 5 0 0 0-2-4'/%3E%3C/svg%3E")}
.ti-bell{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9a6 6 0 0 1 12 0c0 5 2 6 2 6H4s2-1 2-6M10 20a2 2 0 0 0 4 0'/%3E%3C/svg%3E")}
.ti-moon{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 14A8 8 0 0 1 10 4a7 7 0 1 0 10 10z'/%3E%3C/svg%3E")}
.ti-x{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E")}
.ti-folder-plus{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5h5l2 2h9v12H4zM12 11v4M10 13h4'/%3E%3C/svg%3E")}
.ti-palette{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21a9 9 0 1 1 9-9c0 2-1.6 3-3.5 3H16a2 2 0 0 0-1.4 3.4c.3.3.4.7.4 1.1a1.5 1.5 0 0 1-1.5 1.5z'/%3E%3Cpath d='M7.5 10.5v.01M10 7.5v.01M14 7.5v.01M17 10.5v.01'/%3E%3C/svg%3E")}
.ti-logout{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-2'/%3E%3Cpath d='M9 12h12M18 9l3 3-3 3'/%3E%3C/svg%3E")}
.ti-trending-up{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 17l6-6 4 4 8-8'/%3E%3Cpath d='M14 7h7v7'/%3E%3C/svg%3E")}
.ti-inbox{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 13h4l2 3h4l2-3h4'/%3E%3Cpath d='M4 13V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v7v3a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2z'/%3E%3C/svg%3E")}
.ti-rows{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='16' height='16' rx='2'/%3E%3Cpath d='M4 10h16M4 15h16'/%3E%3C/svg%3E")}
.ti-tag{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M3%2011V5a2%202%200%200%201%202-2h6l9%209-8%208z%27%2F%3E%3Ccircle%20cx%3D%277.5%27%20cy%3D%277.5%27%20r%3D%271.5%27%2F%3E%3C%2Fsvg%3E")}
.ti-truck{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M5%2017h-2v-4m-1-8h11v12m-4%200h6m4%200h2v-6h-8m0-5h5l3%205%27%2F%3E%3Ccircle%20cx%3D%277%27%20cy%3D%2717%27%20r%3D%272%27%2F%3E%3Ccircle%20cx%3D%2717%27%20cy%3D%2717%27%20r%3D%272%27%2F%3E%3C%2Fsvg%3E")}
.ti-temperature{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 13.5a4 4 0 1 0 4 0V5a2 2 0 0 0-4 0z'/%3E%3Cpath d='M10 9h4'/%3E%3C/svg%3E")}
.ti-droplet{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l5.2 7.8a6.2 6.2 0 1 1-10.4 0z'/%3E%3C/svg%3E")}
.ti-building-arch{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 21h18M5 21V10l7-5 7 5v11M9.5 21v-5.5a2.5 2.5 0 0 1 5 0V21'/%3E%3C/svg%3E")}
.ti-calculator{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Crect%20x%3D%275%27%20y%3D%273%27%20width%3D%2714%27%20height%3D%2718%27%20rx%3D%272%27%2F%3E%3Cpath%20d%3D%27M8%207h8M8.5%2011.5h.01M12%2011.5h.01M15.5%2011.5h.01M8.5%2015.5h.01M12%2015.5h.01M15.5%2015.5h.01M8%2019h8%27%2F%3E%3C%2Fsvg%3E")}
.ti-phone{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M5%204h4l2%205-2.5%201.5a11%2011%200%200%200%205%205L15%2013l5%202v4a2%202%200%200%201-2%202A16%2016%200%200%201%203%206a2%202%200%200%201%202-2%27%2F%3E%3C%2Fsvg%3E")}
.ti-photo{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Crect%20x%3D%273%27%20y%3D%274%27%20width%3D%2718%27%20height%3D%2716%27%20rx%3D%272%27%2F%3E%3Ccircle%20cx%3D%278.5%27%20cy%3D%279.5%27%20r%3D%271.5%27%2F%3E%3Cpath%20d%3D%27M4%2017l5-5%203%203%203-3%205%205%27%2F%3E%3C%2Fsvg%3E")}
.ti-progress{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Ccircle%20cx%3D%2712%27%20cy%3D%2712%27%20r%3D%279%27%2F%3E%3Cpath%20d%3D%27M12%203a9%209%200%200%201%200%2018z%27%20fill%3D%27currentColor%27%20stroke%3D%27none%27%2F%3E%3C%2Fsvg%3E")}
.ti-chart-bar{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M4%2020V10M10%2020V4M16%2020v-7M22%2020H2%27%2F%3E%3C%2Fsvg%3E")}
.ti-filter{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M4%205h16l-6%207v6l-4%202v-8z%27%2F%3E%3C%2Fsvg%3E")}
.ti-briefcase{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Crect%20x%3D%273%27%20y%3D%277%27%20width%3D%2718%27%20height%3D%2713%27%20rx%3D%272%27%2F%3E%3Cpath%20d%3D%27M9%207V5a2%202%200%200%201%202-2h2a2%202%200%200%201%202%202v2M3%2013h18%27%2F%3E%3C%2Fsvg%3E")}
.ti-ruler{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M4%2014%2014%204l6%206L10%2020z%27%2F%3E%3Cpath%20d%3D%27M8%208l2%202M11%205l2%202M5%2011l2%202%27%2F%3E%3C%2Fsvg%3E")}
.ti-package{--_i:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27currentColor%27%20stroke-width%3D%272%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M12%203l8%204.5v9L12%2021l-8-4.5v-9z%27%2F%3E%3Cpath%20d%3D%27M4%207.5l8%204.5%208-4.5M12%2012v9%27%2F%3E%3C%2Fsvg%3E")}

/* Реестр объектов: редактируемые в строке ячейки */
td.objedit{position:relative;cursor:text}
td.objedit:hover{background:var(--accent-bg);box-shadow:inset 0 0 0 1px var(--accent)}
td.objedit:hover::after{content:"✎";position:absolute;right:6px;top:50%;transform:translateY(-50%);font-size:12px;color:var(--accent-t)}

/* ===== телефон / PWA (16.09.2026) =====
   Портал устанавливается на экран «Домой»: учитываем вырез и нижнюю полосу
   (safe-area), списки задач «Мой день» и сводки переносятся в столбик,
   кнопки-фильтры не выпадают за край. */
@media(max-width:700px){
  nav{padding-top:calc(8px + env(safe-area-inset-top))}
  .main{padding-bottom:calc(48px + env(safe-area-inset-bottom))}
  .kpis{grid-template-columns:repeat(2,1fr);gap:8px}
  .kpi{padding:12px 13px}
  .kpi .v{font-size:22px}
  .al{flex-wrap:wrap;row-gap:4px}
  .al .atext{flex:1 1 70%;min-width:0}
  .al .ago{flex-basis:100%;margin-left:0;padding-left:44px;font-size:12px}
  .seg{flex-wrap:wrap}
  .controls select,.controls input{max-width:100%}
  td.objedit:hover::after{display:none}
}
@media(display-mode:standalone){
  body{-webkit-tap-highlight-color:transparent;overscroll-behavior-y:none}
}

/* Еженедельный отчёт: строка «+ цель» под месяцем */
.wkadd{display:flex;gap:6px;align-items:center}
.wkadd input{flex:1;min-width:0;font-size:13px}
.wkadd select{max-width:130px;font-size:12px}
.wkadd .btn{padding:4px 10px}
.wkaddrow td.wkgoal{background:color-mix(in srgb,var(--soft) 40%,var(--card))}

/* Календарь: ячейка не растягивается, лишние события — в окно дня */
.calev .calemp{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.calev{flex-shrink:0}
.calnum{display:flex;align-items:center;gap:6px}
.calcnt{font-size:12px;font-weight:600;color:var(--t3);background:var(--soft);border-radius:999px;padding:0 6px}
.calmore{border:0;background:transparent;color:var(--accent-t);font-size:12px;font-weight:600;padding:2px 4px;text-align:left;cursor:pointer;border-radius:5px;margin-top:auto}
.calmore:hover{background:var(--accent-bg)}
.calauto summary::-webkit-details-marker{display:none}
.calauto[open] summary .chev{transform:rotate(180deg)}
.calauto summary .chev{transition:transform var(--tr)}

/* ===== Аудит доступности 17.09.2026 ===== */
/* видимый фокус для клавиатуры везде, где его не задали точечно */
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* цели нажатия в таблицах не меньше 24–28 px (WCAG 2.5.8) */
td .btn{min-height:28px;min-width:28px;padding:4px 9px}
td input[type="checkbox"],th input[type="checkbox"]{width:18px;height:18px;margin:3px;cursor:pointer}
.btag,.devtag,.pill{display:inline-flex;align-items:center;min-height:22px;line-height:1.2}
.devtag{padding:3px 9px}
.wkdel{width:28px;height:28px}
/* чипы блоков в тёмной теме: подложка темнее, белый текст читается (было 2.6–3.3:1) */
@media(prefers-color-scheme:dark){html:not([data-theme="light"]) .btag{box-shadow:inset 0 0 0 100px rgba(0,0,0,.45)}}
html[data-theme="dark"] .btag{box-shadow:inset 0 0 0 100px rgba(0,0,0,.45)}
/* тост: кликабельный, чтобы закрыть сразу */
.saved.show{pointer-events:auto;cursor:pointer}
/* редактируемые ячейки план/факта — видно, что можно править */
input.cell{border-bottom:1px dashed var(--line)}
input.cell:hover{border-bottom-color:var(--accent)}
td a.link,.news a.link{display:inline-block;padding:3px 0}

/* карточка застройщика: «Ещё ▾» для редких вкладок */
.tabmore{position:relative;display:inline-flex}
.tabmore .navmenu{min-width:220px}
.tabmore .navmenu a{padding:8px 12px;border-radius:8px;font-size:13px;cursor:pointer;color:var(--text)}
.tabmore .navmenu a:hover{background:var(--soft)}
.tabmore .navmenu a.on{background:var(--sel-bg);color:var(--text);font-weight:600}

/* синхронизация: группы по застройщику */
.syncdev{border:0.5px solid var(--line);border-radius:8px;margin:6px 0;background:var(--card)}
.syncdev>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;padding:8px 12px}
.syncdev>summary::-webkit-details-marker{display:none}
.syncdev>summary::before{content:"▸";color:var(--t3);font-size:11px;transition:transform var(--tr)}
.syncdev[open]>summary::before{transform:rotate(90deg)}
.syncdev>div{padding:0 8px 6px}
.syncdev .al{margin:0}

/* строка таблицы: действия за «⋯» */
.rowmore{padding:2px 9px;font-size:15px;line-height:1;min-height:28px}
/* Действия строки открываются панелькой слева от «⋯», а не встраиваются в
   ячейку: реестр объектов шире экрана, и раскрытые кнопки уезжали за правый
   край карточки — «в архив» было видно наполовину (09.10.2026).
   display в авторском правиле сильнее браузерного [hidden]{display:none},
   поэтому скрытое состояние задаём явно. */
.rowacts-cell{position:relative}
.rowacts{display:inline-flex;gap:4px;position:absolute;right:calc(100% - 4px);top:50%;
  transform:translateY(-50%);z-index:6;padding:4px;border-radius:8px;
  background:var(--card);border:1px solid var(--line);box-shadow:0 6px 18px rgba(0,0,0,.18);
  white-space:nowrap}
.rowacts[hidden]{display:none}
.rowacts .btn{padding:4px 8px;font-size:12px}
/* календарь на телефоне: список дней */
.callist{display:flex;flex-direction:column;gap:8px}
.calday{background:var(--card);border:0.5px solid var(--line);border-radius:8px;padding:10px 12px;display:flex;flex-direction:column;gap:6px}
.calday.caltoday{box-shadow:inset 0 0 0 2px var(--accent)}
.caldayh{display:flex;align-items:center;gap:6px;font-size:14px}

/* Методология внутри портала: оглавление слева, текст справа */
.methwrap{display:grid;grid-template-columns:270px minmax(0,1fr);gap:22px;margin-top:14px;align-items:start}
.methbody{min-width:0}
.methtoc{position:sticky;top:64px;max-height:calc(100vh - 88px);overflow-y:auto;padding-right:4px}
.methtoc input{width:100%;margin-bottom:10px}
.methtoc .toc a{display:block;color:var(--t2);text-decoration:none;font-size:13.5px;padding:6px 10px;border-radius:8px;line-height:1.35;cursor:pointer}
.methtoc .toc a.sub{font-size:12.5px;color:var(--t3);padding-left:20px}
.methtoc .toc a:hover{background:var(--soft);color:var(--text)}
.methtoc .toc a.on{background:var(--accent-bg);color:var(--accent-t);font-weight:600}
.methbody section{background:var(--card);border:0.5px solid var(--line);border-radius:8px;padding:18px 22px;margin-bottom:14px;box-shadow:var(--shadow-1);scroll-margin-top:70px}
.methbody h2{font-size:19px;margin:0 0 10px;scroll-margin-top:70px;border:0;padding:0}
.methbody h2 .n{color:var(--t3);font-weight:600;margin-right:8px}
.methbody h3{font-size:15px;margin:20px 0 6px;scroll-margin-top:70px}
.methbody p{margin:9px 0;color:var(--t2);font-size:14px;line-height:1.6}
.methbody table{border-collapse:collapse;width:100%;font-size:13px;margin:10px 0;display:block;overflow-x:auto}
.methbody th,.methbody td{border-bottom:1px solid var(--line);padding:7px 9px;text-align:left;vertical-align:top}
/* в таблицах портала ячейки не переносятся (th,td{white-space:nowrap}) — в методологии
   это текст, а не цифры: без переноса абзацы в карточках формул уезжали за карточку */
.methbody td{white-space:normal}
.methbody th{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--t3);white-space:nowrap}
.methbody tbody tr:nth-child(even) td{background:color-mix(in srgb,var(--soft) 40%,transparent)}
/* карточка формулы: формула → что значит → пример (методология с 08.10.2026) */
.methbody h4{font-size:14.5px;margin:18px 0 4px;color:var(--text)}
.methbody table.fcard{display:table;border:1px solid var(--line);border-radius:8px;overflow:hidden;margin:6px 0 14px}
.methbody .fcard th{width:118px;text-transform:none;letter-spacing:0;font-size:12.5px;color:var(--t2);white-space:normal;background:color-mix(in srgb,var(--soft) 45%,transparent)}
.methbody .fcard td.f{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:var(--text)}
.methbody .fcard td.ex{font-family:ui-monospace,Menlo,monospace;font-size:12.5px;color:var(--xps-t)}
.methbody .fcard tbody tr:nth-child(even) td{background:none}
/* Метка типа обоснования внутри текста: [данные], [допущение] */
.methbody .bt{color:var(--xps-t);font-size:.92em}
/* Инфографика методологии (12.10.2026). Пособие отдаёт картинки данными, а не
   рисунком: make_method_html.py выкладывает их полосками, и портал показывает
   тот же HTML у себя — поэтому правила продублированы здесь под .methbody.
   Без них столбики и подписи расползались за карточку раздела. */
.methbody .fig{--fig1:var(--xps-t);--fig2:var(--teh);--fig3:var(--t3);margin:14px 0 16px}
.methbody .fig .ft{font-weight:600;font-size:14px;margin-bottom:9px;color:var(--text)}
.methbody .fig .fn{color:var(--t3);font-size:12.5px;margin-top:8px;line-height:1.45}
.methbody .fig .lg{display:flex;flex-wrap:wrap;gap:14px;margin-bottom:8px;font-size:12.5px;color:var(--t2)}
.methbody .fig .lg i{display:inline-block;width:11px;height:9px;border-radius:2px;margin-right:5px}
.methbody .fig .row{display:grid;grid-template-columns:minmax(90px,30%) minmax(0,1fr) auto;gap:10px;
  align-items:center;padding:3px 0;font-size:13px}
.methbody .fig .row .lb{color:var(--text);text-align:right}
.methbody .fig .row .hint{color:var(--t3);font-size:12px;white-space:nowrap}
.methbody .fig .bars{display:flex;flex-direction:column;gap:3px;min-width:0}
.methbody .fig .bar{display:flex;align-items:center;gap:6px;min-width:0}
.methbody .fig .bar>span{height:9px;border-radius:2px;min-width:2px}
.methbody .fig .bar b{font-weight:600;font-size:12px;color:var(--t2);font-variant-numeric:tabular-nums;
  white-space:nowrap}
.methbody .fig .s0{background:var(--fig1)}
.methbody .fig .s1{background:var(--fig2)}
.methbody .fig .s2{background:var(--fig3)}
.methbody .fig .track{position:relative;height:13px;background:var(--soft);border-radius:3px;min-width:0}
.methbody .fig .track i{position:absolute;top:0;bottom:0;border-radius:3px;background:var(--soft);
  box-shadow:inset 0 0 0 1px var(--line)}
.methbody .fig .track u{position:absolute;top:-2px;bottom:-2px;width:2px;background:var(--xps);text-decoration:none}
.methbody .fig .track u b{position:absolute;top:-15px;left:50%;transform:translateX(-50%);font-size:11px;color:var(--t2)}
.methbody .fig .axis{display:flex;justify-content:space-between;color:var(--t3);font-size:11px;margin-top:4px}
.methbody .fig .split{display:flex;height:16px;border-radius:4px;overflow:hidden;margin-bottom:10px}
.methbody .fig .split i{display:flex;align-items:center;justify-content:center;color:#fff;font-size:11px;font-weight:600}
.methbody .fig .lgrow{display:flex;align-items:center;gap:8px;font-size:13px;padding:3px 0}
.methbody .fig .lgrow em{flex:1;font-style:normal;color:var(--text)}
.methbody .fig .lgrow b{font-variant-numeric:tabular-nums;color:var(--t2)}
.methbody .fig .path{display:flex;gap:6px;overflow-x:auto;padding-bottom:4px}
.methbody .fig .path div{flex:1;min-width:88px;border:1px solid var(--line);border-radius:8px;padding:7px 8px;
  background:var(--soft);text-align:center;font-size:12.5px;color:var(--text)}
.methbody .fig .path div.on{border-color:var(--xps);background:var(--accent-bg);font-weight:600}
.methbody .fig .path div small{display:block;color:var(--t3);font-weight:400;font-size:12px;margin-top:2px}
.methbody .fig .sees{margin-top:8px}
.methbody .fig .sees div{background:var(--soft);border-radius:4px;padding:3px 8px;font-size:12.5px;margin-top:4px;
  color:var(--t2)}
@media(max-width:900px){.methwrap{grid-template-columns:minmax(0,1fr)}
  .methtoc{position:static;max-height:230px}}
/* узкий экран: подпись строки встаёт над столбиком, иначе они сжимаются в нитку */
@media(max-width:620px){.methbody .fig .row{grid-template-columns:1fr;gap:2px;padding:6px 0}
  .methbody .fig .row .lb{text-align:left;font-weight:600}
  .methbody .fig .row .hint{text-align:left}
  .methbody .fig .path{flex-wrap:wrap;overflow-x:visible}
  .methbody .fig .path div{flex:1 1 44%}
  .methbody .fig .sees div{margin-left:0 !important}}

/* Конструктор КП: форма слева, бланк справа */
.kpwrap{display:grid;grid-template-columns:minmax(0,1fr) 210mm;gap:18px;margin-top:14px;align-items:start}
.kpform{min-width:0}
.kpf{display:block;margin-bottom:10px}
.kpf>span{display:block;font-size:12px;color:var(--t2);margin-bottom:3px}
.kpf input,.kpf textarea{width:100%}
.kppreview{position:sticky;top:64px}
.kpdoc{background:var(--soft);border:0.5px solid var(--line);border-radius:8px;overflow:hidden}
.kpdoc iframe{width:210mm;height:297mm;border:0;background:#fff;display:block}
@media(max-width:1500px){.kpwrap{grid-template-columns:minmax(0,1fr) 160mm}
  .kpdoc iframe{width:160mm;height:226mm}}
@media(max-width:1100px){.kpwrap{grid-template-columns:1fr}.kppreview{position:static}
  .kpdoc iframe{width:100%;height:60vh}}

/* КП: быстрый поиск материала в прайсе */
.kpsearch{margin-bottom:10px}
.kphits{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:30;background:var(--card);
  border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-2);max-height:280px;overflow-y:auto;padding:4px}
.kphit{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:7px;cursor:pointer;font-size:13px}
.kphit.on,.kphit:hover{background:var(--accent-bg)}
.kphit .it{font-weight:600}
.kphit .gr{font-size:12px;color:var(--t3);background:var(--soft);border-radius:999px;padding:1px 7px}
.kphit .pr{margin-left:auto;color:var(--t2);font-size:12.5px;white-space:nowrap}
.kphit.empty{color:var(--t3);cursor:default}

/* КП: города чипами — общие для «одной цены» и «по городам» */
.kpchips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:8px}
.kpchip{display:inline-flex;align-items:center;gap:5px;padding:4px 6px 4px 10px;border-radius:999px;
  border:1px solid var(--line);background:var(--soft);font-size:12.5px;min-height:28px}
.kpchip.on{border-color:var(--accent);background:var(--accent-bg);font-weight:600}
.kpchip[onclick]{cursor:pointer}
.kpchip button{border:0;background:none;color:var(--t3);cursor:pointer;font-size:12px;line-height:1;
  padding:4px 5px;border-radius:50%}
.kpchip button:hover{background:var(--line);color:var(--text)}
.kpcityadd{position:relative;display:inline-block}
.kpcityadd input{width:130px;font-size:12.5px;padding:4px 10px;border-radius:999px;min-height:28px}
.kpcityadd .kphits{width:240px;left:0;right:auto}

/* Часы МСК и мини-календарь в шапке (30.09.2026).
   Время показываем московское независимо от часового пояса компьютера:
   вся работа отдела и сроки в портале — по Москве. */
.clockbtn{display:flex;align-items:center;gap:8px;padding:5px 10px;border-radius:8px;
  border:1px solid transparent;background:none;cursor:pointer;color:var(--text);min-height:32px}
.clockbtn:hover{background:var(--soft);border-color:var(--line)}
.navgrp.open .clockbtn{background:var(--soft);border-color:var(--line)}
.clock-t{font-size:15px;font-weight:650;letter-spacing:.02em;font-variant-numeric:tabular-nums;line-height:1.1}
.clock-t i{font-style:normal;animation:clockblink 1s step-end infinite}
@keyframes clockblink{0%,49%{opacity:1}50%,100%{opacity:.25}}
.clock-d{display:flex;flex-direction:column;align-items:flex-start;line-height:1.25;
  font-size:12px;color:var(--t3);white-space:nowrap}
.clock-d .wk{font-size:11px}
@media (max-width:1100px){.clock-d{display:none}}
@media (prefers-reduced-motion:reduce){.clock-t i{animation:none}}

.calmenu{min-width:272px;padding:10px 12px 12px}
.mcal-top{display:flex;align-items:center;gap:6px;margin-bottom:8px}
.mcal-top b{font-size:13.5px;flex:1;text-align:center}
.mcal-nav{border:1px solid var(--line);background:var(--card);border-radius:8px;cursor:pointer;
  width:26px;height:26px;color:var(--t2);font-size:14px;line-height:1}
.mcal-nav:hover{background:var(--soft);color:var(--text)}
.mcal{width:100%;border-collapse:collapse;font-size:12px}
.mcal th{font-weight:500;color:var(--t3);font-size:11px;text-transform:lowercase;padding:2px 0 4px}
.mcal td{text-align:center;padding:1px}
.mcal .wkn{color:var(--t3);font-size:11px;font-variant-numeric:tabular-nums;
  border-right:1px solid var(--line);padding-right:5px;width:22px}
.mcal .d{width:28px;height:28px;border-radius:8px;border:1px solid transparent;background:none;
  cursor:pointer;color:var(--text);font-size:12.5px;font-variant-numeric:tabular-nums;position:relative}
.mcal .d:hover{background:var(--soft)}
.mcal .d.dim{color:var(--t3);opacity:.55}
.mcal .d.wknd{color:var(--st-bad-t)}
.mcal .d.today{background:var(--accent);color:var(--sel-t);font-weight:650}
.mcal .d.today:hover{background:var(--accent)}
.mcal .d .dot{position:absolute;left:50%;bottom:3px;transform:translateX(-50%);
  width:4px;height:4px;border-radius:50%;background:var(--accent)}
.mcal .d.today .dot{background:#fff}
.mcal-foot{display:flex;align-items:center;gap:8px;margin-top:8px;padding-top:8px;
  border-top:1px solid var(--line);font-size:12px;color:var(--t3)}
.mcal-foot .link{margin-left:auto}
.mcal tbody tr{background:none}          /* без «зебры» общих таблиц */
/* На узком экране панель инструментов и так тесная — часы прячем, чтобы не
   выдавливать кнопку пользователя за край; календарь остаётся в меню «Работа» */
@media (max-width:700px){#clockGrp{display:none}}

/* Теплокарта план/факта */
.heatmap td.heat{text-align:center;font-size:12px;padding:4px 2px;min-width:46px}
.heatmap td.heat span{color:var(--text);mix-blend-mode:normal}
.heatmap tbody tr{background:none}

/* Легенда карты объектов */
.maplegend{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:10px;font-size:12px;color:var(--t2)}
.maplegend span{display:inline-flex;align-items:center;gap:5px}
.maplegend i{width:10px;height:10px;border-radius:50%;display:inline-block}

/* Плитки обзора: цифра с контекстом */
.kpis-ov{align-items:stretch}
.kpis-ov .kpi{display:flex;flex-direction:column;gap:6px}
.kpis-ov .kpi .u{font-size:12.5px;font-weight:400;color:var(--t3)}
.kpis-ov .kspark{line-height:0}
.kpis-ov .krow{display:flex;align-items:center;gap:8px}
.kpis-ov .krow .track{flex:1}
.kpis-ov .kpct{font-size:12.5px;font-weight:600}
.kpis-ov .kline{display:flex;align-items:center;gap:6px;font-size:13px}
.kpis-ov .kline .kname{font-weight:700;width:34px}
.kpis-ov .kline .track{height:6px}
.kstack{display:flex;height:8px;border-radius:5px;overflow:hidden;background:var(--soft)}
.kstack span{display:block;height:100%}
.kpis-ov .md{margin-top:auto;line-height:1.45}

/* ===================================================================
   ДВИЖЕНИЕ (06.10.2026)
   Анимации только там, где они что-то сообщают: сохранилось, изменилось,
   собралось, закрылось. Длительности интерфейсные: 120–180 мс на переходы,
   до 500 мс на появление. Двигаем transform и opacity — их считает видеокарта.
   =================================================================== */

/* Сохранение в таблице: строка коротко подсвечивается зелёным. Тост сообщает
   в углу экрана, а взгляд в этот момент на ячейке. */
@keyframes flashOk{
  0%{background-color:color-mix(in srgb,var(--st-ok) 28%,transparent)}
  100%{background-color:transparent}}
tr.flash-ok>td,.flash-ok{animation:flashOk .9s ease-out}

/* Появление карточек лесенкой: порядок чтения вместо «мигнуло всем сразу» */
@keyframes cardIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.grid>.card{animation:cardIn .32s cubic-bezier(.2,.8,.3,1) both}
.grid>.card:nth-child(1){animation-delay:0ms}
.grid>.card:nth-child(2){animation-delay:30ms}
.grid>.card:nth-child(3){animation-delay:60ms}
.grid>.card:nth-child(4){animation-delay:90ms}
.grid>.card:nth-child(5){animation-delay:120ms}
.grid>.card:nth-child(6){animation-delay:150ms}
.grid>.card:nth-child(7){animation-delay:180ms}
.grid>.card:nth-child(n+8){animation-delay:200ms}

/* Матрица потенциала: точка переезжает в новое положение при смене фильтра —
   видно, кто ушёл в красный квадрант, а кто вышел из него */
.matrix-dot{transition:transform .5s cubic-bezier(.2,.8,.3,1),opacity .3s}

/* Предпросмотр КП: подмена бланка без белой вспышки */
#kpDoc iframe{transition:opacity .22s ease}
#kpDoc iframe.loading{opacity:.35}

/* Закрытая задача уезжает и схлопывается — подтверждение действия */
@keyframes rowGone{
  to{opacity:0;transform:translateX(26px);max-height:0;padding-top:0;padding-bottom:0}}
.row-gone{animation:rowGone .32s ease-in forwards;overflow:hidden}

/* Полосы и цифры: плавное изменение вместо перескока */
.track .fill{transition:width .45s cubic-bezier(.2,.8,.3,1)}
.kstack span{transition:width .45s cubic-bezier(.2,.8,.3,1)}

/* Одно правило на весь портал: выключили движение в системе — выключилось
   везде, включая всё, что добавят позже. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;animation-iteration-count:1 !important;
    transition-duration:.01ms !important;scroll-behavior:auto !important}
}

/* Авто-задачи движка — строка на задачу, причина в подсказке (07.10.2026) */
.autotasks{padding:8px 12px;margin-bottom:12px;border-left:3px solid var(--accent)}
.autotasks>summary,.autotasks .asum{list-style:none;cursor:pointer;padding:2px 0}
.autotasks>summary::-webkit-details-marker{display:none}
.autotasks .asum{cursor:default}
.ahead{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:650}
.ahead .ti{font-size:14px;color:var(--accent-t)}
.ahead .acnt{display:inline-flex;gap:8px;font-weight:600;font-size:12px}
.ahead .acnt span{display:inline-flex;align-items:center;gap:3px}
.ahead .alink{margin-left:auto;font-weight:400;font-size:12px}
.abody{display:flex;flex-direction:column;gap:1px;margin-top:6px}
/* развёрнутый список не выталкивает сами доски за экран */
details.autotasks .abody{max-height:min(44vh,330px);overflow:auto;padding-right:2px}
.aline{display:flex;align-items:center;gap:7px;padding:4px 6px;border-radius:8px;
  cursor:pointer;font-size:12.5px;color:var(--text);text-decoration:none;min-height:26px}
.aline:hover{background:var(--soft)}
.aline:focus-visible{outline:none;box-shadow:var(--ring)}
.adot{width:7px;height:7px;border-radius:50%;flex:0 0 auto;display:inline-block}
.atitle{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.adev{font-size:12px;color:var(--t3);white-space:nowrap}
.ablock{width:3px;height:14px;border-radius:2px;flex:0 0 auto;opacity:.8}
@media (max-width:620px){.adev{display:none}}

/* Панель фильтров, сгруппированных по смыслу: «кого», «где», «когда».
   Общая для разделов — Потенциал 2027 и реестр объектов (07.10.2026). */
.erzyears{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.erzyears-l{font-size:12.5px;color:var(--t3);font-weight:600}
.fltbar{padding:12px 14px;margin-bottom:14px}
.flt-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.flt-q{flex:1;min-width:220px}
.flt-state{font-size:12.5px;color:var(--t3);white-space:nowrap}
.flt-state b{color:var(--text)}
.flt-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
  gap:14px 20px;align-items:start;padding-top:12px;border-top:1px solid var(--line)}
.flt-g{display:flex;flex-direction:column;gap:5px;min-width:0}
.flt-g>.flt-sel,.flt-g{min-width:0}
.flt-g{position:relative}
.flt-g::after{content:"";position:absolute;right:-10px;top:18px;bottom:2px;width:1px;background:var(--line)}
.flt-g:last-of-type::after{display:none}
.flt-gl{font-size:12px;
  color:var(--t3);font-weight:700;white-space:nowrap}
.flt-g{flex-direction:column}
.flt-g .flt-row{display:flex;gap:8px;flex-wrap:wrap}
.flt-sel{display:inline-flex;flex-direction:column;gap:3px;min-width:0;flex:1}
/* одинокий список не тянется на всю колонку: иначе «Город» в группе из одного
   поля вдвое шире соседних и панель выглядит кривой */
.flt-row>.flt-sel:only-child{max-width:240px}
.flt-ll{font-size:12px;color:var(--t3)}
.flt-sel select{min-width:0;width:100%}
.flt-more{white-space:nowrap}
.flt-top .flt-state{margin-left:auto}
.flt-extra{margin-top:20px}
/* Нижняя строка панели: раскрыть остальные фильтры, сбросить всё и забрать
   ссылку на выборку. Это действия над панелью, а не ещё одно поле, поэтому
   они отделены чертой и прижаты: открывающие — слева, ссылка — справа. */
.flt-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-top:12px;padding-top:10px;border-top:1px solid var(--line)}
/* Короткая форма панели: до трёх фильтров групп не нужно — одна строка полей
   под поиском, но поле выглядит так же, как в большой панели: подпись сверху,
   нейтральный первый пункт. Так два размера читаются как один вид. */
.flt-line{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;
  padding-top:12px;border-top:1px solid var(--line)}
.flt-line .flt-sel{flex:0 1 190px}
.flt-line .flt-sel.wide{flex:0 1 230px}
.flt-line .flt-act{margin-left:auto;display:flex;gap:8px;align-items:flex-end}
/* сегмент внутри поля-с-подписью: высота как у списка */
.flt-sel .seg{align-self:stretch}
.flt-sel .seg button{padding:7px 11px;font-size:12.5px}
/* переключатель вида — отдельной строкой под заголовком раздела */
.viewseg{margin:14px 0 12px}
/* счётчик внутри кнопки переключателя: «Застройщики 2027 · 28» */
.seg button .cnt{margin-left:6px;font-size:12px;color:var(--t3);font-variant-numeric:tabular-nums}
.seg button.on .cnt{color:inherit;opacity:.85}
.seg button.on .cnt{opacity:.9}
/* чекбокс в ряду фильтров живёт по тем же правилам, что и списки */
.flt-chk .flt-chkbox{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--t2);
  border:1px solid var(--line);border-radius:8px;padding:7px 10px;cursor:pointer;white-space:nowrap}
.flt-chk input{width:auto;margin:0}
.colrow{display:flex;gap:7px;align-items:center;font-size:13px;padding:3px 0;cursor:pointer}
.colrow input{width:auto;margin:0}
.erzview{margin:18px 0 12px}
@media (max-width:760px){.flt-g::after{display:none}.flt-more{margin-left:0;width:100%}}

/* Потенциалы 2026: выбор продукта — это переключатель, от которого зависят
   и итоги, и таблица, поэтому стоит первым и выглядит нажимаемым (08.10.2026) */
.ptprod{margin:16px 0 14px}
.ptprod-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin-top:6px}
.ptcard{display:flex;flex-direction:column;gap:7px;text-align:left;cursor:pointer;
  background:var(--card);border:1px solid var(--line);border-top:3px solid var(--pc,var(--t3));
  border-radius:8px;padding:11px 13px;color:var(--text);font:inherit;transition:background var(--tr),border-color var(--tr)}
.ptcard:hover{background:var(--soft)}
.ptcard.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.ptcard:focus-visible{outline:none;box-shadow:var(--ring)}
.ptcard-h{display:flex;align-items:baseline;gap:6px;font-size:15px}
.ptcard-u{font-size:12px;color:var(--t3)}
.ptcard-pct{margin-left:auto;font-size:13px;font-weight:650;font-variant-numeric:tabular-nums}
.ptcard-f{font-size:12px;color:var(--t2)}
.ptcard .track{flex:0 0 auto;height:6px;width:100%}

/* Строка ИИ-оценки: заголовок, режимы и кнопка в одну линию. Ответ
   появляется под ней и только после запуска. */
.aibar{border-radius:8px;border-left:3px solid var(--accent);padding:10px 14px;margin-top:14px}
.aibar-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.aibar-t{font-size:14px;white-space:nowrap}
.aibar-t .ti{font-size:14px;vertical-align:-2px;color:var(--accent-t)}
.aibar .seg.sm button{font-size:12px;padding:5px 10px}
.aibar-q{flex:1;min-width:220px}
.aibar-n{margin-left:auto;font-size:12px;color:var(--t3);white-space:nowrap}
.aibar-out{margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}

/* «Где сосредоточен объём» — разрезы среза. Строка это не подпись, а фильтр:
   клик оставляет в срезе один регион, город, застройщика или год сдачи,
   повторный клик снимает. Материал переключается для всех разрезов сразу. */
.erzsum-h{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:20px 0 10px}
.erzsum-h h2{margin:0;font-size:16px;border:0;padding:0}
.erzsum-h .seg.sm button{font-size:12px;padding:4px 10px}
.erzsum-fold{margin-left:auto;white-space:nowrap}
.sumcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:14px}
.sumcard{border-radius:8px;padding:12px 14px}
.sumcard-h{display:flex;align-items:center;gap:7px;font-weight:650;font-size:14px;margin-bottom:8px}
.sumcard-h .ti{font-size:14px;color:var(--t3)}
.sumcard-n{margin-left:auto;font-size:12px;font-weight:500;color:var(--t3)}
.sumrow{display:flex;align-items:center;gap:8px;font-size:12.5px;cursor:pointer;
  padding:3px 6px;margin:0 -6px;border-radius:8px;border:1px solid transparent;transition:background var(--tr)}
.sumrow:hover{background:var(--soft)}
.sumrow.on{background:var(--accent-bg);border-color:color-mix(in srgb,var(--accent) 35%,transparent)}
.sumrow:focus-visible{outline:none;box-shadow:var(--ring)}
.sumrow .nm{width:40%;min-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sumrow .num{width:64px;text-align:right}
.sumrow .sumchk{width:10px;font-size:11px;color:var(--accent-t)}
.sumnote{font-size:12px;color:var(--t3);margin-top:8px}
.linkbtn{background:none;border:0;padding:4px 0 0;margin:0;cursor:pointer;
  font-size:12px;color:var(--accent-t)}
.linkbtn:hover{text-decoration:underline}
/* Столбцы по годам сдачи — тоже кнопки: рамкой отмечен расчётный год */
.ybars{display:flex;gap:8px;align-items:flex-end}
.ybar{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;cursor:pointer;
  background:none;border:1px solid transparent;border-radius:8px;padding:4px 2px;transition:background var(--tr)}
.ybar:hover{background:var(--soft)}
.ybar.on{background:var(--accent-bg);border-color:color-mix(in srgb,var(--accent) 35%,transparent)}
.ybar.calc{border-color:var(--line);border-style:dashed}
.ybar:focus-visible{outline:none;box-shadow:var(--ring)}
.ybar .yv{font-size:12px;color:var(--t3);font-variant-numeric:tabular-nums}
.ybar .yb{width:100%;border-radius:4px 4px 0 0;transition:height .45s cubic-bezier(.2,.8,.3,1)}
.ybar .yl{font-size:12px;font-weight:600;color:var(--t2)}
.ybar.on .yl,.ybar.on .yv{color:var(--accent-t)}
@media (prefers-reduced-motion:reduce){.ybar .yb{transition:none}}

/* Жизненный цикл корпуса: строка подсвечивается целиком при наведении —
   взгляд не теряет линию от названия стадии до её доли справа */
.lcrow .lchover{transition:opacity .12s}
.lcrow:hover .lchover{opacity:.1}

/* Мой день: блок «сегодня», цели месяца, группы задач (07.10.2026) */
.myday{margin-top:14px}
.myh{display:flex;align-items:center;gap:7px;font-weight:650;font-size:13.5px;margin-bottom:8px}
.myh .ti{font-size:15px;color:var(--t3)}
.myh .cnt{font-size:12px;font-weight:600;color:var(--t3);background:var(--soft);border-radius:999px;padding:1px 8px}
.myev{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:8px;font-size:12.5px;cursor:pointer}
.myev:hover{background:var(--soft)}
.myev-t{font-variant-numeric:tabular-nums;color:var(--t3);width:42px;flex:0 0 auto}
.myev-x{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mygoal{display:flex;align-items:flex-start;gap:7px;padding:5px 2px;font-size:12.5px;line-height:1.35}
.mygoal .ti{font-size:14px;color:var(--t3);flex:0 0 auto;margin-top:1px}
.mygoal.done{color:var(--t3)}
.mygoal.done .ti{color:var(--st-ok-t)}
.mygoal span:first-of-type{flex:1;min-width:0}
/* Цель месяца — абзац на 150–300 знаков. В «Моём дне» показываем две строки,
   остальное по клику: обрезка на сервере рубила текст на полуслове, а полный
   абзац превращал блок в простыню (09.10.2026). */
.mygoal{cursor:pointer;border-radius:8px;transition:background var(--tr)}
.mygoal:hover{background:var(--soft)}
.mygoal:focus-visible{outline:none;box-shadow:var(--ring)}
.mygoal .mygoal-t{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mygoal.open .mygoal-t{display:block;overflow:visible}
.myfilters{display:inline-flex;gap:6px;margin-left:auto;align-items:center;flex-wrap:wrap}
.myfilters select{font-size:12px;padding:4px 8px}
.asnooze{border:0;background:none;color:var(--t3);cursor:pointer;padding:4px 6px;border-radius:7px;flex:0 0 auto}
.asnooze:hover{background:var(--soft);color:var(--text)}
.asnooze .ti{font-size:15px}
.algroup .chev{color:var(--t3);transition:transform .15s}
.algroup.open .chev{transform:rotate(180deg)}
.algroup-body{margin:2px 0 6px 18px;border-left:2px solid var(--line);padding-left:8px}
.mydim{opacity:.72}   /* приглушено, но читается: при .5 контраст падал до 3,4 */
.mysep{width:1px;align-self:stretch;background:var(--line);margin:0 4px}
.btn .cnt.hi{background:var(--st-bad);color:#fff;border-radius:999px;padding:0 6px;margin-left:3px;font-size:11px}

/* Недостающие значки: «Мой день» использовал часы, календарь, машину и кружки,
   а они не были определены — вместо иконки рисовался залитый квадрат */
.ti-clock{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E")}
.ti-calendar{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='5' width='16' height='16' rx='2'/%3E%3Cpath d='M16 3v4M8 3v4M4 11h16'/%3E%3C/svg%3E")}
.ti-car{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='7' cy='17' r='2'/%3E%3Ccircle cx='17' cy='17' r='2'/%3E%3Cpath d='M5 17H3v-6l2-5h9l4 5h2a2 2 0 0 1 2 2v4h-2M9 17h6'/%3E%3C/svg%3E")}
.ti-circle{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3C/svg%3E")}
.ti-point{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3C/svg%3E")}
.ti-arrow-right{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M13 6l6 6-6 6'/%3E%3C/svg%3E")}
.ti-address-book{--_i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='3' width='14' height='18' rx='2'/%3E%3Cpath d='M3 8h2M3 12h2M3 16h2'/%3E%3Ccircle cx='12' cy='10' r='2'/%3E%3Cpath d='M9 16c0-1.5 1.3-2.5 3-2.5s3 1 3 2.5'/%3E%3C/svg%3E")}

/* План/факт 2027: строка-заголовок группы «Действующие» / «Новые» */
.p27grp td{background:var(--soft);font-size:12.5px}
.p27grp td:first-child{border-top-left-radius:8px;border-bottom-left-radius:8px}
/* 12 месяцев в строке: таблица шире экрана, поэтому колонка застройщика
   закреплена слева — иначе при прокрутке неясно, чей это факт */
#p27tbl th:first-child,#p27tbl td:first-child{position:sticky;left:0;z-index:2;background:var(--card)}
#p27tbl .p27grp td:first-child{background:var(--soft)}
#p27tbl input.cell{width:52px;min-width:52px}

/* Реестр объектов: фаза стройки в строке. У ЖК из нескольких корпусов фаз
   бывает несколько сразу — тогда вместо полосы прогресса показываем доли
   корпусов по фазам (08.10.2026). */
.phdot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:6px;vertical-align:1px}
.phbar{height:3px;border-radius:2px;background:var(--soft);margin-top:4px;max-width:90px;overflow:hidden}
.phbar span{display:block;height:100%;border-radius:2px}
.phn{font-size:12px;color:var(--t3);margin-left:6px;white-space:nowrap}
.phmix{display:flex;gap:1px;height:4px;border-radius:2px;margin-top:4px;max-width:90px;overflow:hidden}
.phmix span{display:block;height:100%}

/* ===== ВЫПАДАЮЩИЕ СПИСКИ =====
   Системную стрелку браузер ставил по своим правилам: в Chrome она стояла
   глубоко внутри поля, в Safari прижималась к краю, а размер не зависел от
   нашего шрифта — на широких списках стрелка выглядела «уехавшей». Рисуем
   свою: один и тот же шеврон, всегда 10px от правого края, цвет берётся из
   темы (08.10.2026). Правило стоит в конце файла намеренно — выше background
   у полей задаётся сокращённой записью (стеклянный слой), и фон перетёр бы
   картинку. */
select{
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  padding-right:28px;
  background-image:var(--sel-chev);
  background-repeat:no-repeat;
  background-position:right 10px center;
  background-size:12px 12px;
}
select:disabled{opacity:.6}
/* в многострочном списке стрелки быть не должно */
select[multiple],select[size]:not([size="1"]){background-image:none;padding-right:10px}
/* мелкие списки — стрелка и отступ по месту */
.myfilters select,.wkadd select{padding:4px 22px 4px 8px;background-position:right 7px center;background-size:10px 10px}

/* Еженедельный отчёт: основные и дополнительные цели (20.10.2026) */
.wkplan{display:inline-block;margin-left:10px;padding:2px 9px;border-radius:999px;font-size:12px;font-weight:500;
  background:var(--soft);color:var(--t2);vertical-align:middle}
.wkplan.ok{background:var(--bg-ok);color:var(--st-ok-t)}
.wkplan.warn{background:color-mix(in srgb,var(--st-mid) 18%,transparent);color:var(--st-mid-t)}
.wkdivrow td{background:var(--soft)!important;border-top:1px solid var(--line)}
.wkdiv{font-size:13px;font-weight:600;color:var(--t2)}
.wkdiv span{font-weight:400;text-transform:none;letter-spacing:0;color:var(--t3)}
.wkextra .wkgoal{color:var(--t2)}
.wkkindtag{display:inline-block;font-size:11px;font-weight:600;padding:0 6px;border-radius:6px;margin-right:5px;
  background:var(--soft);color:var(--t3);vertical-align:middle}
.wkkindtag.warn{background:color-mix(in srgb,var(--st-mid) 18%,transparent);color:var(--st-mid-t)}
/* переключатель вида стоит левее корзины, обе кнопки появляются при наведении */
.wkdel.wkkind{right:38px}
.wkdel.wkkind:hover{color:var(--st-mid-t);border-color:var(--st-mid-t)}
/* две кнопки справа — текст цели не должен под них заходить */
.wkgrid tbody tr:not(.wkaddrow):not(.wkdivrow) td.wkgoal{padding-right:72px}
.wkguest .wkgoal{color:var(--t3);font-style:italic}

/* ── как в PDF: шрифты Roboto/Montserrat, обложка, ссылки, схема и стадии (27.10.2026) ── */
@font-face{font-family:"Meth Roboto";src:url(/static/meth-roboto-400.ttf) format("truetype");font-weight:400;font-display:swap}
@font-face{font-family:"Meth Roboto";src:url(/static/meth-roboto-500.ttf) format("truetype");font-weight:500 600;font-display:swap}
@font-face{font-family:"Meth Roboto";src:url(/static/meth-roboto-700.ttf) format("truetype");font-weight:700 800;font-display:swap}
@font-face{font-family:"Meth Montserrat";src:url(/static/meth-montserrat-700.ttf) format("truetype");font-weight:600 800;font-display:swap}
.methbody{font-family:"Meth Roboto",Roboto,-apple-system,"Segoe UI",sans-serif;--pnx:#EB6708}
.methbody h2,.methbody h3,.methbody h4,.methbody .kick,.methbody .kpi b{font-family:"Meth Montserrat","Meth Roboto",sans-serif}
.methbody h3{color:var(--xps-t)}
.methbody .intro{border-top:3px solid var(--pnx)}
.methbody .kick{font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--xps-t)}
.methbody .subt{font-size:16px;color:var(--text);margin:6px 0 12px;line-height:1.45}
.methbody .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:0 0 12px}
.methbody .kpi{border:1px solid var(--line);border-top:3px solid var(--pnx);border-radius:8px;padding:9px 12px}
.methbody .kpi b{display:block;font-size:19px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}
.methbody .kpi b span{font-size:12px;font-weight:600;color:var(--t3);margin-left:3px}
.methbody .kpi em{display:block;font-style:normal;color:var(--t2);font-size:12.5px;margin-top:2px;line-height:1.3}
.methbody a.xref{color:var(--xps-t);font-weight:500;text-decoration:underline dotted;text-underline-offset:2px;cursor:pointer}
.methbody a.xref:hover{text-decoration-style:solid}
.methbody a.ext{color:var(--xps-t)}
.methbody a.ext::after{content:"↗";font-size:.8em;margin-left:1px}
.methbody h4[id]{scroll-margin-top:70px}
.methbody .flash{animation:methflash 1.8s ease-out}
@keyframes methflash{0%{background:color-mix(in srgb,#EB6708 30%,transparent)}100%{background:transparent}}
.methbody .flow{display:flex;flex-direction:column;gap:6px}
.methbody .fl-row{display:grid;gap:8px}
.methbody .fl-srcs{grid-template-columns:repeat(4,minmax(0,1fr))}
.methbody .fl-steps{grid-template-columns:repeat(3,minmax(0,1fr))}
.methbody .fl-src,.methbody .fl-step,.methbody .fl-book{border:1px solid var(--line);border-radius:8px;padding:8px 10px;text-align:center;font-size:12.5px;line-height:1.35}
.methbody .fl-src{background:color-mix(in srgb,#EB6708 9%,var(--card))}
.methbody .fl-step{display:block;background:var(--soft);color:var(--text)}
.methbody a.fl-step.xref{text-decoration:none;font-weight:400}
.methbody a.fl-step:hover{border-color:var(--pnx)}
.methbody .fl-final,.methbody .fl-book{width:62%;margin:0 auto}
.methbody .fl-book{background:#2B2B2B;border-color:#2B2B2B;color:#fff}
.methbody .fl-src b,.methbody .fl-step b,.methbody .fl-book b{display:block;font-weight:600}
.methbody .flow small{display:block;color:var(--t3)}
.methbody .fl-book small{color:#d6d6d6}
.methbody .fl-step em{display:block;font-style:normal;color:var(--xps-t)}
.methbody .fl-arr{text-align:center;color:var(--t3);line-height:1;font-size:14px}
.methbody .srow{display:grid;grid-template-columns:minmax(90px,24%) minmax(0,1fr) 46px;gap:10px;align-items:center;padding:4px 0;font-size:13px}
.methbody .srow .lb{text-align:right;color:var(--text)}
.methbody .strack{position:relative;height:16px;background:var(--soft);border-radius:3px}
.methbody .strack .yr{position:absolute;top:-5px;bottom:-5px;border:1px dashed var(--pnx);background:color-mix(in srgb,#EB6708 12%,transparent);border-radius:3px}
.methbody .strack .bar{position:absolute;top:3px;bottom:3px;border-radius:2px}
.methbody .srow .k{text-align:right;font-weight:600;color:var(--xps-t);font-variant-numeric:tabular-nums}
.methbody .srow .k.z{color:var(--t3);font-weight:400}
.methbody .sq{display:grid;font-size:11px;color:var(--t3);text-align:center}
.methbody .sylab{position:relative;height:16px;font-size:11px;font-weight:700;color:var(--xps-t)}
.methbody .sylab span{position:absolute;transform:translateX(-50%);white-space:nowrap}
@media(max-width:620px){.methbody .fl-srcs{grid-template-columns:repeat(2,minmax(0,1fr))}.methbody .fl-steps{grid-template-columns:1fr}
  .methbody .fl-final,.methbody .fl-book{width:100%}.methbody .srow{grid-template-columns:84px minmax(0,1fr) 38px;gap:6px}.methbody .srow .lb{overflow-wrap:anywhere;hyphens:auto;font-size:12px}.methbody .sq{font-size:11px}.methbody .sq span:nth-child(even){visibility:hidden}}
.methback{position:fixed;left:50%;transform:translateX(-50%);bottom:22px;z-index:60;background:var(--card);border:1px solid var(--line);border-radius:999px;padding:9px 16px;font-size:13px;color:var(--text);box-shadow:0 6px 20px rgba(0,0,0,.14);cursor:pointer}

.methbody .badge{display:inline-block;padding:0 6px;border-radius:5px;font-size:.86em;font-weight:500;line-height:1.5;white-space:nowrap;vertical-align:baseline}
.methbody .callout{background:color-mix(in srgb,#EB6708 7%,var(--card));border-left:3px solid #EB6708;border-radius:0 10px 10px 0;padding:10px 14px;margin:12px 0 16px;font-size:14px;line-height:1.55;color:var(--text)}
.methbody .callout>b{display:block;font-family:"Meth Montserrat","Meth Roboto",sans-serif;font-size:13px;margin-bottom:3px;color:var(--xps-t)}
.methbody .svgwrap{background:#fff;border:1px solid var(--line);border-radius:8px;padding:10px;overflow-x:auto}
.methbody .svgwrap svg{display:block;max-width:820px;height:auto;margin:0 auto}
.methbody .exlab{font-size:12.5px;font-weight:600;color:var(--t2);margin:2px 0 6px}
.methbody .fl-src{color:#2B2B2B}
.methbody .fl-src small{color:#5a5a5a}

.methbody .fcard td.f{font-family:"Meth Roboto",Roboto,sans-serif;font-weight:500;font-size:13.5px}
.methbody .fcard td.ex{font-family:"Meth Roboto",Roboto,sans-serif;font-size:13px}

@media(max-width:700px){.methbody .svgwrap svg{min-width:640px}}

.methbody .fl-n{display:inline-flex;width:20px;height:20px;border-radius:50%;background:#EB6708;color:#fff;font-style:normal;font-size:11px;align-items:center;justify-content:center;margin-right:6px}
.methbody .fl-steps .fl-step{text-align:left}
.methbody .fl-step em{margin:3px 0 4px}
.methbody .fl-step small{margin-top:3px}
.methbody .fl4{background:color-mix(in srgb,#EB6708 10%,var(--card));border-color:#EB6708}
.methbody .fl-arr{letter-spacing:.9em}
.methbody .fig .stk{display:flex;height:16px;border-radius:3px;overflow:hidden;min-width:0}
.methbody .fig .stk span{display:flex;align-items:center;justify-content:center;color:#fff;font-size:11px;font-weight:600;min-width:0;overflow:hidden}

.methbody .fl-steps .fl-step{display:flex;flex-direction:column;gap:2px;padding:10px 12px}
.methbody .fl-q{font-weight:600;font-size:13px;color:var(--text);margin:2px 0 4px}
.methbody .fl-from{font-size:12px;color:var(--t3)}
.methbody .fl-steps .fl-step em{margin-top:auto;padding-top:6px;border-top:1px solid var(--line);font-weight:600}
.methbody .fl4 b{font-size:14px}

.methbody .rg-leg{display:flex;flex-wrap:wrap;gap:16px;font-size:12.5px;color:var(--t2);margin-bottom:10px}
.methbody .rg-leg span{display:inline-flex;align-items:center;gap:6px}
.methbody .rg-leg .rg-bar{position:static;display:inline-block;width:22px;height:10px}
.methbody .rg-leg .rg-mid{position:static;display:inline-block;height:14px}
.methbody .rg-row{display:grid;grid-template-columns:minmax(90px,18%) minmax(0,1fr) minmax(120px,32%);gap:12px;align-items:center;padding:20px 0 4px;font-size:13px}
.methbody .rg-row .lb{text-align:right;font-weight:600;color:var(--text)}
.methbody .rg-row .hint{font-size:12px;color:var(--t3)}
.methbody .rg-track{position:relative;height:16px}
.methbody .rg-tick{position:absolute;top:-6px;bottom:-6px;width:1px;background:var(--line)}
.methbody .rg-bar{font-style:normal;position:absolute;top:2px;height:12px;background:#F7C9A4;border:1px solid #EB6708;border-radius:2px;box-sizing:border-box}
.methbody .rg-mid{position:absolute;top:-2px;width:3px;height:20px;margin-left:-1.5px;background:#2B2B2B;border-radius:1px}
.methbody .rg-mid b{font-style:normal;position:absolute;bottom:21px;left:50%;transform:translateX(-50%);font-size:11px;white-space:nowrap;color:var(--text)}
.methbody .rg-axis{padding-top:2px}
.methbody .rg-axis .rg-track{height:14px}
.methbody .rg-axis em{position:absolute;transform:translateX(-50%);font-style:normal;font-size:11px;color:var(--t3);white-space:nowrap}
@media(max-width:620px){.methbody .rg-row{grid-template-columns:70px minmax(0,1fr);gap:8px}.methbody .rg-row .hint{grid-column:2;margin-top:2px}.methbody .rg-row .lb{font-size:12px}}

/* Водопад «За счёт кого изменился объём» (План/факт → Прирост) */
.wf-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}
.wf-sum{font-size:13.5px;color:var(--t2);margin-top:2px;font-variant-numeric:tabular-nums}
.wf-sum b{color:var(--text);font-weight:650}
.wf-row{display:grid;grid-template-columns:minmax(96px,170px) 1fr 124px;align-items:center;gap:10px;
  min-height:28px;border-radius:6px}
.wf-row[role=link]{cursor:pointer}
.wf-row[role=link]:hover{background:var(--soft)}
.wf-row[role=link]:focus-visible{outline:none;box-shadow:var(--ring)}
.wf-name{font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:6px}
.wf-other .wf-name{color:var(--t2)}
.wf-other[role=button]{cursor:pointer}
.wf-other[role=button]:hover{background:var(--soft)}
.wf-other[role=button]:focus-visible{outline:none;box-shadow:var(--ring)}
.wf-more{color:var(--accent-t);font-size:12.5px;margin-left:2px}
.wf-other[role=button]:hover .wf-more{text-decoration:underline}
.wf-fold{margin-top:6px;border:none;background:none;color:var(--accent-t);font-size:12.5px;cursor:pointer;padding:4px 6px;border-radius:6px}
.wf-fold:hover{background:var(--soft)}
.wf-fold:focus-visible{outline:none;box-shadow:var(--ring)}
.wf-track{position:relative;align-self:stretch;min-height:28px}
.wf-bar{position:absolute;top:7px;bottom:7px;border-radius:4px}
.wf-bar.up{background:var(--st-ok)}
.wf-bar.down{background:var(--st-bad)}
.wf-other .wf-bar{opacity:.55}
.wf-g{position:absolute;top:0;bottom:0;width:0;border-left:1px dashed var(--t3);opacity:.55}
.wf-g1{border-left-style:solid;border-left-color:var(--t2);opacity:.7}
.wf-val{font-size:13px;font-weight:650;font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;padding-right:6px}
.wf-val span{font-weight:400;color:var(--t3);font-size:12px;margin-left:4px}
.wf-scale{min-height:18px}
.wf-scale .wf-track{min-height:18px}
.wf-lab{position:absolute;top:0;font-size:12px;color:var(--t3);white-space:nowrap;padding:0 4px}
.wf-lab1{color:var(--t2);font-weight:600}
@media(max-width:640px){.wf-row{grid-template-columns:88px 1fr 78px;gap:6px}.wf-val span{display:none}}

/* Палитры категорий — одни на обе темы: фазы стройки, отношения, источники
   данных. Раньше жили цветами прямо в app.js (30.10.2026). */
:root{
  --brand:#eb6708;--neutral:#9aa0a6;
  --danger-bg:color-mix(in srgb,var(--st-bad) 14%,transparent);
  /* фоны плашек статуса: были в коде, но нигде не заданы — плашки шли без фона */
  --bg-warning:color-mix(in srgb,var(--st-mid) 18%,transparent);--bg-success:var(--bg-ok);
  --ph-prep:#9aa0a6;--ph-found:#8d6e63;--ph-styl:#a1887f;--ph-mono:#5c6bc0;--ph-panel:#7986cb;
  --ph-roof:#eb6708;--ph-fac:#b54708;--ph-fin:#26a69a;--ph-land:#43a047;--ph-done:#bdbdbd;
  --rel-none:#9aa0a6;--rel-cold:#e05252;--rel-work:#f0a33a;--rel-warm:#7cb342;--rel-part:#2e9e6b;
  --src-erz-bg:#fde8d7;--src-erz-t:#a84a00;--src-egrz-bg:#e1e8ef;--src-egrz-t:#34536b;
  --src-norm-bg:#e3f1e5;--src-norm-t:#2e6b36;
}

/* Плашка ожидания ИИ (aiCall): внизу по центру, поверх страницы */
.aiwait{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:300;display:flex;align-items:center;gap:12px;
  background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-2);padding:10px 12px 10px 16px;
  font-size:13.5px;color:var(--text);max-width:calc(100vw - 32px)}
.aiwait .aiw-s{font-variant-numeric:tabular-nums}
.aiwait .aiw-h{display:block;font-size:12px;color:var(--t3)}
.aiwait .btn{flex:0 0 auto}

/* ===================================================================
   ПЛОСКИЙ ВИД (30.10.2026)
   Вместо стекла и цветных пятен — ровный тёплый фон с едва заметной
   фактурой бумаги, плотные карточки с тонкой рамкой и скруглением 8 px.
   Тень остаётся только у того, что всплывает поверх страницы: меню и окна.
   Пятна, размытие и блики выдавали шаблон, а таблицам и цифрам не помогали.
   =================================================================== */
:root{--radius:8px;--shadow-1:none;--shadow-2:0 8px 24px rgba(0,0,0,.12);--brd:rgba(0,0,0,.11);--paper:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.35  0 0 0 0 0.3  0 0 0 0 0.22  .07 0 0 0 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
@media(prefers-color-scheme:dark){:root{--brd:rgba(255,255,255,.10);--shadow-2:0 10px 28px rgba(0,0,0,.5);--paper:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  .035 0 0 0 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}}
html[data-theme="light"]{--brd:rgba(0,0,0,.11);--shadow-2:0 8px 24px rgba(0,0,0,.12);--paper:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.35  0 0 0 0 0.3  0 0 0 0 0.22  .07 0 0 0 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
html[data-theme="dark"]{--brd:rgba(255,255,255,.10);--shadow-2:0 10px 28px rgba(0,0,0,.5);--paper:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  .035 0 0 0 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
body{background-color:var(--bg);background-image:var(--paper);background-attachment:fixed}
.card,details.card,.kpi,.mini .m,.state{background:var(--card);border:1px solid var(--brd);border-radius:8px;box-shadow:none}
.scroll,.scroll.fit,.scroll.tall{background:var(--card);border:1px solid var(--brd);border-radius:8px;box-shadow:none}
nav{background:var(--nav);border-bottom:1px solid var(--brd);box-shadow:none}
.navmenu{background:var(--card);border:1px solid var(--brd);border-radius:8px;box-shadow:var(--shadow-2)}
.modal{background:var(--card);border:1px solid var(--brd);border-radius:8px;box-shadow:var(--shadow-2)}
.btn{background:var(--card);border:1px solid var(--brd);border-radius:6px;box-shadow:none}
.btn:hover{background:var(--soft)}
.btn.pri{background:var(--sel);color:var(--sel-t);border-color:transparent;box-shadow:none}
.btn.pri:hover{background:color-mix(in srgb,var(--sel) 86%,var(--bg))}
.seg{background:var(--card);border:1px solid var(--brd);border-radius:6px;box-shadow:none}
input,select,textarea{background:var(--card);border:1px solid var(--brd)}
/* наведение — только рамка темнее, без подъёма и тени */
.kpiL:hover,.dcard:hover{transform:none;box-shadow:none;border-color:var(--t3)}

/* Плитки показателей: подпись, число, пояснение. Без цветной полосы слева,
   иконки в квадратике и стрелки при наведении — цвет несёт само число. */
.mini .m::before,.mini .m .mi,.mini .m .mgo{display:none}
.mini .m .mh{margin-bottom:6px;min-height:0}
.mini .m .ml{padding-top:0}

/* Сворачиваемые секции — как карточки: белый фон и тонкая рамка; шапка без
   бежевой заливки, она выбивалась из плоского вида (30.10.2026) */
.fsec{background:var(--card);border:1px solid var(--brd);border-radius:8px;box-shadow:none}
.fsec>summary{background:var(--card)}
.fsec>summary:hover{background:var(--soft)}

/* Современнее (30.10.2026): шире рабочая область, отчёты — одним списком,
   спокойный календарь, опасные действия красные только при наведении. */
.main{max-width:1440px}
.replist{background:var(--card);border:1px solid var(--brd);border-radius:8px;overflow:hidden}
.replist .r{border:0;border-radius:0;margin:0;border-bottom:1px solid var(--brd);padding:11px 16px;box-shadow:none}
.replist .r:last-child{border-bottom:0}
.replist .r:hover{background:color-mix(in srgb,var(--soft) 45%,var(--card));box-shadow:none}
.replist .r .btn{border-color:transparent;background:transparent;color:var(--t3)}
.replist .r:hover .btn{border-color:var(--brd);color:var(--t2)}
.btn.btn-del:hover{color:var(--st-bad-t);border-color:color-mix(in srgb,var(--st-bad) 40%,transparent)}
.calgrid{background:var(--brd);border-color:var(--brd);box-shadow:none}
.calhead{background:var(--card);color:var(--t3);font-weight:500}
.calwknd{background:color-mix(in srgb,var(--soft) 22%,var(--card))}
.calempty{background:color-mix(in srgb,var(--soft) 12%,var(--card))}

/* Читаемость и удобство (30.10.2026, проверка контраста по WCAG AA):
   текстовые варианты цветов блоков; мелкий текст не меньше 12 px;
   кнопки и флажки не меньше 24 px под клик. */
:root{--komm-t:#a3346a;--teh-t:#4a5b6f}
@media(prefers-color-scheme:dark){:root{--komm-t:#ec86b4;--teh-t:#aebdcf}}
html[data-theme="light"]{--komm-t:#a3346a;--teh-t:#4a5b6f}
html[data-theme="dark"]{--komm-t:#ec86b4;--teh-t:#aebdcf}
.btn{min-height:24px;min-width:24px}
input[type=checkbox],input[type=radio]{width:16px;height:16px}
.seg button{min-height:26px}
.tempcell{min-height:26px}
.stbtn2{min-width:24px;min-height:24px}
/* вывеска ведёт на «Обзор» (30.10.2026) */
nav .brand{cursor:pointer;border-radius:8px}
nav .brand:focus-visible{outline:none;box-shadow:var(--ring)}

/* ===== телефон: аккуратнее (01.11.2026) =====
   Шапка — одна строка: вывеска, поиск, колокольчик, тема, пользователь,
   бургер; легенда цветов уходит (она же в «Справке»). Сетки показателей —
   ровно две колонки без вылета за край, нечётная последняя плитка во всю
   ширину. Вкладки сотрудников и пилюли «Мой день» — одна строка с
   прокруткой вместо 3–4 рядов. */
/* ноутбук 1280–1500px: шапке не хватало ~150px и инструменты уезжали на
   вторую строку — убираем часы (время есть в системе) и имя у аватара */
@media(max-width:1500px) and (min-width:1161px){#clockGrp{display:none}.userinfo{display:none}.userbtn{padding:0 4px}}
/* 1161–1360px: от вывески остаётся башня, слова — в подсказке; уже 1160px
   пункты меню сворачиваются в бургер, иначе шапка становится двухэтажной */
@media(max-width:1360px) and (min-width:1161px){nav .brand-t{display:none}nav .brand{margin-right:4px}}
.mypills{display:flex;gap:6px;flex-wrap:wrap;margin-top:12px}
.mywhat-m{display:none;color:var(--t3);font-size:12px;font-weight:400;margin-top:2px;line-height:1.35}
@media(max-width:1160px){
  .navtools{order:1}
  .navburger{order:2}
}
@media(max-width:600px){
  nav{padding-left:12px;padding-right:12px;gap:6px;flex-wrap:wrap}
  nav .brand{font-size:11px;letter-spacing:.03em;gap:6px;margin-right:0;min-width:0}
  nav .logo-mark{width:20px;height:20px}
  .navtools{gap:4px}
  #legendGrp{display:none}
  .userbtn .chev{display:none}
  .userbtn{padding:0 3px}
  .navburger{padding:5px 7px}
  .main{padding:14px 12px 48px}
  h1{font-size:19px;margin-bottom:6px}
  .kpis{grid-template-columns:repeat(2,minmax(0,1fr)) !important;gap:8px}
  .kpi{min-width:0;padding:11px 12px}
  .kpi .v{font-size:21px}
  .kpi .md,.kpi .s{font-size:12.5px}
  .kpis>.kpi:last-child:nth-child(odd){grid-column:1/-1}
  .kpi svg{max-width:100%}
  .viewseg{overflow-x:auto;scrollbar-width:none;margin-left:-12px;margin-right:-12px;padding:0 12px}
  .viewseg::-webkit-scrollbar{display:none}
  .viewseg .seg{flex-wrap:nowrap;max-width:none}
  .viewseg .seg button{white-space:nowrap;flex:0 0 auto}
  .mypills{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin-left:-12px;margin-right:-12px;padding:0 12px 2px}
  .mypills::-webkit-scrollbar{display:none}
  .mypills .btn{flex:0 0 auto;white-space:nowrap}
  /* еженедельный отчёт: заголовок месяца в две строки, колонка цели уже */
  .wkmonth{flex-wrap:wrap;row-gap:6px;padding:9px 10px}
  .wknav{margin-left:auto}
  .wkpos{min-width:0}
  .wkmonth .wkplan{order:3;flex-basis:100%;margin-left:0;border-radius:8px;white-space:normal}
  .wkgrid col.wkgoalcol,.wkgrid th.wkgoalh{width:232px}
  .wkgrid col:not(.wkgoalcol){width:220px !important}
  .wkwrap{scroll-padding-left:232px}
  .wkgrid{min-width:0}
  /* кнопки «основная/доп.» и корзина — полкой над текстом, а не колонкой справа */
  .wkgrid tbody tr:not(.wkaddrow):not(.wkdivrow) td.wkgoal{padding:9px 10px 10px}
  .wkgrid tbody tr:not(.wkaddrow):not(.wkdivrow) td.wkgoal:has(.wkdel){padding-top:36px}
  .wkadd{flex-wrap:wrap}
  .wkadd input{flex:1 1 100%}
  .wkadd select{flex:1 1 0;min-width:0}
  /* «Мой день» → «По застройщикам»: что именно — под названием */
  .mywhat{display:none}
  .mywhat-m{display:block}
  .seg{max-width:100%}
  /* счётчик среза над фильтрами («313 ЖК из 313 · 985 корпусов…») —
     своей строкой и с переносом, а не за край экрана */
  .flt-state{white-space:normal;min-width:0;line-height:1.45}
  .flt-top .flt-state{margin-left:0;flex:1 1 100%}
  .fnhead .fnlabel{min-width:0 !important;flex:1 1 100%}
  .flt-q{min-width:0}
  /* таблицы без своего скролл-контейнера (подрядчики, проектировщики,
     воронка…) листаются сами, а не растягивают страницу вбок */
  table.tbl:not(.scroll table):not(.wkgrid){display:block;overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch}
  /* правая группа кнопок у заголовка страницы переносится, а не уезжает */
  [style*="margin-left:auto"][style*="display:flex"]{flex-wrap:wrap;min-width:0;max-width:100%}
}
@media(max-width:380px){
  nav .brand span,nav .brand em{letter-spacing:0}
}
