/* Шрифты у себя (23.09.2026): Golos Text 400–700 и JetBrains Mono 400/500, кириллица и латиница — без Google Fonts и без перерисовки текста после загрузки. */
@font-face{font-family:'Golos Text';font-style:normal;font-weight:400;font-display:swap;src:url(/static/fonts/golos-text-400-cyrillic.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Golos Text';font-style:normal;font-weight:400;font-display:swap;src:url(/static/fonts/golos-text-400-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Golos Text';font-style:normal;font-weight:500;font-display:swap;src:url(/static/fonts/golos-text-500-cyrillic.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Golos Text';font-style:normal;font-weight:500;font-display:swap;src:url(/static/fonts/golos-text-500-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Golos Text';font-style:normal;font-weight:600;font-display:swap;src:url(/static/fonts/golos-text-600-cyrillic.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Golos Text';font-style:normal;font-weight:600;font-display:swap;src:url(/static/fonts/golos-text-600-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Golos Text';font-style:normal;font-weight:700;font-display:swap;src:url(/static/fonts/golos-text-700-cyrillic.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'Golos Text';font-style:normal;font-weight:700;font-display:swap;src:url(/static/fonts/golos-text-700-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/static/fonts/jetbrains-mono-400-cyrillic.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/static/fonts/jetbrains-mono-400-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/static/fonts/jetbrains-mono-500-cyrillic.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/static/fonts/jetbrains-mono-500-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}

/* base.css — Токены темы, сброс, типографика. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* NordSvodka — фирменный стиль НОРД-СЕРВИС: синий #033486 + красный #E91E23 с логотипа.
   Светлая тема по умолчанию, тёмная только по переключателю (data-theme="dark"). */
:root{
  --brand:#033486; --brand-dark:#02265F; --brand-ink:#FFFFFF; --brand-soft:#E6EDFA; --brand-band:#EEF3FC;
  --red:#E91E23;
  --bg:#F2F4F8; --surface:#FFFFFF; --surface2:#F6F8FB; --line:#CFD7E3; --line2:#E3E8F0;
  --ink:#0B1220; --ink2:#334155; --ink3:#64748B;
  --accent:var(--brand); --accent-dark:var(--brand-dark); --accent-ink:#FFFFFF; --accent-soft:var(--brand-soft); --accent-band:var(--brand-band);
  --ok:#15803D; --ok-soft:#DCFCE7; --warn:#B45309; --warn-soft:#FEF3C7; --bad:#DC2626; --bad-soft:#FEE2E2; --muted-soft:#E8EDF4;
  --nav-a:#0A3F9C; --nav-b:#032A6E; --nav-ink:#B9C8E8; --nav-active:#FFFFFF; --nav-hi:rgba(255,255,255,.12); --nav-line:rgba(255,255,255,.14);
  --shadow:0 1px 2px rgba(11,18,32,.05),0 4px 14px rgba(11,18,32,.06);
  /* шапки-баннеры экранов: тот же материал, что вход и сайдбар; свои токены — фирменный синий не светлеет в тёмной теме */
  --hero-a:#0A3F9C; --hero-b:#032A6E; --hero-glow1:rgba(40,110,255,.55); --hero-glow2:rgba(24,200,230,.22); --hero-shadow:0 12px 32px rgba(3,42,110,.26);
  color-scheme:light;
}
:root[data-theme="dark"]{
  --brand:#5B8DEF; --brand-dark:#8FB3F7; --brand-soft:#16295A; --brand-band:#132347;
  --bg:#0C1220; --surface:#141C2E; --surface2:#1A2438; --line:#2E3A54; --line2:#233049;
  --ink:#EEF2F8; --ink2:#C4CEDF; --ink3:#93A1B8;
  --ok:#4ADE80; --ok-soft:#14352A; --warn:#FBBF24; --warn-soft:#3A2D10; --bad:#F87171; --bad-soft:#3F1D1D; --muted-soft:#243049;
  --nav-a:#0E1A33; --nav-b:#0A1326; --nav-ink:#9FB0D0; --nav-hi:rgba(255,255,255,.08); --nav-line:rgba(255,255,255,.10);
  --shadow:0 1px 2px rgba(0,0,0,.4);
  --hero-a:#133573; --hero-b:#0A1A3D; --hero-glow1:rgba(40,110,255,.26); --hero-glow2:rgba(24,200,230,.10); --hero-shadow:0 12px 32px rgba(0,0,0,.45);
  color-scheme:dark;
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--ink);font-family:"Golos Text",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;font-size:15px;line-height:1.5}
.mono{font-family:"JetBrains Mono",ui-monospace,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.app{display:grid;grid-template-columns:256px 1fr;min-height:100vh}


/* layout.css — Сайдбар и шапка страницы. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---------- навигация: тот же материал, что на входе (синий + «сияние» + зерно), но неподвижный — во время работы движение отвлекает ---------- */
.nav{position:sticky;top:0;height:100vh;height:100dvh;display:flex;flex-direction:column;padding:22px 12px 12px;color:var(--nav-ink);overflow:hidden;isolation:isolate;
  background:linear-gradient(170deg,var(--nav-a) 0%,var(--nav-b) 100%)}
.nav-glow{position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:var(--lg-aurora,1);
  background:radial-gradient(90% 32% at 0% 0%,rgba(40,110,255,.55),transparent 70%),radial-gradient(70% 26% at 100% 52%,rgba(24,200,230,.16),transparent 70%),radial-gradient(90% 30% at 10% 100%,rgba(70,60,220,.42),transparent 70%)}
.nav-glow::after{content:"";position:absolute;inset:0;opacity:.08;mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.nav .brand{display:flex;padding:0 10px 18px}   /* только логотип в сайдбаре: класс brand ещё у квадратиков легенд */
.nav .brand img{height:36px;width:auto;max-width:100%;display:block;object-fit:contain}
.nav .brand .brand-mark{display:none}   /* знак для свёрнутого сайдбара — показывается только там (см. ниже) */
.nav-list{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;gap:2px;margin:0 -6px;padding:0 6px 8px;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.18) transparent}
.nav-sec{font-size:12px;font-weight:600;padding:14px 10px 6px;color:var(--nav-ink);opacity:.6}
.nav-sec:first-child{padding-top:2px}
.nav button{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:12px;padding:8px 10px;border-radius:10px;cursor:pointer;color:var(--nav-ink);font-size:14.5px;width:100%;font-weight:500;position:relative}
.nav button:hover{background:rgba(255,255,255,.08);color:#fff}
.nav button.on{background:rgba(255,255,255,.15);color:#fff;font-weight:600;box-shadow:inset 0 0 0 1px rgba(255,255,255,.06)}
.nav button:focus-visible{outline:2px solid #fff;outline-offset:-2px}
.nav button:disabled{opacity:.4;cursor:default}
.nav-cnt{margin-left:auto;font-style:normal;font-size:11.5px;font-weight:700;line-height:18px;min-width:20px;padding:0 6px;border-radius:999px;background:#EF4444;color:#fff;text-align:center;font-variant-numeric:tabular-nums}
.nav-cnt.hidden{display:none}
/* профиль внизу сайдбара (на телефоне app.js переносит его в шапку): инициалы, имя, роль; по нажатию — меню «Сменить пароль · Тема · Выйти».
   Правила с префиксом .who, а не .nav — работают в обоих местах */
.who{position:relative;margin-top:8px;padding-top:10px;border-top:1px solid var(--nav-line)}
.who .who-btn{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:10px;width:100%;padding:7px 8px;border-radius:12px;cursor:pointer;color:var(--nav-ink)}
.who .who-btn:hover{background:rgba(255,255,255,.08)}
.who .who-btn:focus-visible{outline:2px solid #fff;outline-offset:-2px}
.who-ava{width:34px;height:34px;border-radius:50%;flex:none;display:grid;place-items:center;background:rgba(255,255,255,.16);color:#fff;font-size:13px;font-weight:600;letter-spacing:.03em}
.who-txt{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.3}
.who-txt b{color:#fff;font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.who-txt span{color:var(--nav-ink);font-size:12.5px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.who-more{display:flex;color:var(--nav-ink);opacity:.8}
.who-more .ico{width:16px;height:16px;vertical-align:0}
.who-menu{position:absolute;left:0;right:0;bottom:calc(100% + 6px);z-index:30;background:var(--surface);border:1px solid var(--line2);border-radius:14px;padding:6px;
  box-shadow:0 18px 50px rgba(3,20,55,.35);animation:dlg-in var(--dur) var(--ease)}
.who .who-menu button{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:10px;width:100%;padding:9px 10px;border-radius:9px;font-size:14px;font-weight:500;color:var(--ink);cursor:pointer}
.who .who-menu button:hover{background:var(--surface2);color:var(--ink)}
.who .who-menu button:focus-visible{outline:none;box-shadow:var(--ring)}
.who .who-menu .danger,.who .who-menu .danger:hover{color:var(--bad)}
.who-menu [data-ico]{display:flex;color:var(--ink3)}.who-menu .danger [data-ico]{color:var(--bad)}
.who-menu .ico{width:18px;height:18px;vertical-align:0}
.t-sun{display:none!important}
:root[data-theme="dark"] .t-sun{display:flex!important}
:root[data-theme="dark"] .t-moon{display:none!important}

/* ---------- свёрнутый сайдбар (кнопка слева от заголовка шапки, только компьютер): полоса 72 px с иконками ----------
   Колонка сетки плавно сужается, иконки стоят на месте, подписи гаснут, логотип обрезается до снежинки, заголовки разделов — тонкие линии */
.nav-toggle{all:unset;box-sizing:border-box;width:36px;height:36px;margin-left:-6px;border-radius:10px;display:grid;place-items:center;color:var(--ink3);cursor:pointer;flex:none;
  transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}
.nav-toggle:hover{background:var(--line2);color:var(--ink)}
.nav-toggle:focus-visible{box-shadow:var(--ring)}
.nav-toggle [data-ico]{display:flex}.nav-toggle .ico{width:20px;height:20px;vertical-align:0}
.nav-tip{position:fixed;z-index:40;left:0;top:0;transform:translate(-4px,-50%);padding:6px 10px;border-radius:8px;background:var(--ink);color:var(--surface);font-size:13px;font-weight:500;
  white-space:nowrap;pointer-events:none;opacity:0;box-shadow:0 8px 20px rgba(3,20,55,.25);transition:opacity var(--dur-fast) var(--ease),transform var(--dur-fast) var(--ease)}
.nav-tip.on{opacity:1;transform:translate(0,-50%)}
@media (min-width:761px){
  .app{transition:grid-template-columns var(--dur-slow) var(--ease)}
  .app.nav-mini{grid-template-columns:72px 1fr}
  .app.no-anim,.app.no-anim *{transition:none!important}
  .nav button{overflow:hidden}
  /* логотип: отступы не меняются и картинка не сжимается (иначе съезжала), полный логотип тает на месте, вместо него — знак из icon.png по центру полосы */
  .nav .brand{position:relative;overflow:hidden}
  .nav .brand .brand-full{max-width:none;transition:opacity var(--dur) var(--ease)}
  .nav .brand .brand-mark{display:block;position:absolute;left:6px;top:0;width:36px;height:36px;border-radius:10px;box-shadow:0 0 0 1px rgba(255,255,255,.18);
    opacity:0;transform:scale(.85);transition:opacity var(--dur-slow) var(--ease),transform var(--dur-slow) var(--ease)}
  .nav-mini .nav .brand .brand-full{opacity:0}
  .nav-mini .nav .brand .brand-mark{opacity:1;transform:none}
  .nl{white-space:nowrap;transition:opacity var(--dur) var(--ease)}
  .nav-mini .nl{opacity:0}
  .nav-mini .nav-cnt{position:absolute;left:30px;top:3px;margin:0;font-size:10px;line-height:15px;min-width:16px;padding:0 4px}
  .nav button .n{transition:transform var(--dur-slow) var(--ease)}
  /* узкая полоса: ползунка нет вовсе (список по-прежнему листается колесом и пальцем), вбок ничего не уезжает —
     подписи погашены, но занимают место, поэтому горизонтальную прокрутку запрещаем и у списка, и у самой полосы */
  .nav-mini .nav-list{scrollbar-width:none;overflow-x:hidden}
  .nav-mini .nav-list::-webkit-scrollbar{display:none}
  .nav-mini .nav-list button .n{transform:translateX(3px)}   /* иконка ровно по центру узкой полосы */
  .nav-sec{position:relative;white-space:nowrap;overflow:hidden;transition:color var(--dur) var(--ease)}   /* overflow: заголовок раздела шире узкой полосы — иначе список можно сдвинуть вбок */
  .nav-sec::before{content:"";position:absolute;left:10px;right:10px;top:55%;height:1px;background:var(--nav-ink);opacity:0;transition:opacity var(--dur) var(--ease)}
  .nav-mini .nav-sec{color:transparent}
  .nav-mini .nav-sec:not(:first-child)::before{opacity:.5}
  .who-txt,.who-more{transition:opacity var(--dur) var(--ease)}
  .nav-mini .who-txt,.nav-mini .who-more{opacity:0}
  .who .who-btn{overflow:hidden}
  /* меню профиля в узкой полосе выходит за её край; сайдбар поднимается над страницей только пока меню открыто */
  .nav-mini .nav{overflow:visible}
  .nav-mini .nav:has(.who-menu:not(.hidden)){z-index:9}
  .nav-mini .who-menu{right:auto;width:230px}
}

/* ---------- шапка ---------- */
.main{padding:0 32px 56px;min-width:0}
.top{display:flex;align-items:center;gap:12px;padding:20px 0 14px;border-bottom:1px solid var(--line);margin-bottom:22px;flex-wrap:wrap}
.top h1{font-size:26px;margin:0 8px 0 0;font-weight:600;letter-spacing:-.025em;color:var(--ink)}
.top .date{color:var(--ink2);font-size:15px;font-weight:500}
.top .date::first-letter{text-transform:uppercase}
.top .sp{flex:1}
.datenav{display:inline-flex;gap:8px;align-items:center;flex-wrap:wrap}
.datenav .btn{padding:8px 12px}
.btn{border:1px solid var(--line);background:var(--surface);color:var(--ink);padding:9px 14px;border-radius:9px;font:inherit;font-size:14px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:6px;text-decoration:none;line-height:1.2}
.btn:hover{background:var(--surface2);border-color:var(--ink3)}
.btn.pri{background:var(--brand);border-color:var(--brand);color:var(--brand-ink)}
.btn.pri:hover{background:var(--brand-dark);border-color:var(--brand-dark)}
.btn:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.screen{display:none}.screen.on{display:block}

#no-screens{display:grid;gap:6px;justify-items:center;text-align:center;padding:60px 20px;color:var(--ink2)}#no-screens b{font-size:18px;color:var(--ink)}   /* роли не открыт ни один раздел */

/* components.css — Карточки, блоки служб, KPI, метки статусов, таблицы. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---------- карточки ---------- */
.grid{display:grid;gap:16px;align-items:start}
.g4{grid-template-columns:repeat(4,1fr)}.g3{grid-template-columns:repeat(3,1fr)}.g2{grid-template-columns:repeat(2,1fr)}
.card{background:var(--surface);border:1px solid var(--line2);border-radius:14px;box-shadow:var(--shadow);min-width:0}
.card .hd{display:flex;align-items:baseline;gap:10px;padding:16px 20px 0;flex-wrap:wrap}
.card .hd h3{margin:0;font-size:16px;font-weight:600;display:flex;align-items:center;gap:10px;letter-spacing:-.01em}
.card .hd h3::before{content:"";width:4px;height:16px;border-radius:2px;background:var(--brand);flex:none}
.card .hd .sub{color:var(--ink3);font-size:13px}
.card .hd .r{margin-left:auto;font-size:13px;color:var(--ink3)}
.card .bd{padding:12px 20px 18px}

/* ---------- раздел службы на сводке ---------- */
.svc{display:flex;align-items:center;gap:12px;margin:28px 0 14px;flex-wrap:wrap}
.svc h2{margin:0;font-size:19px;font-weight:600;letter-spacing:-.02em}
.svc .owner{font-size:13px;color:var(--ink3)}
.svc .line{flex:1;height:1px;background:var(--line)}
.svc:first-child{margin-top:0}
.soon{border-style:dashed;background:transparent;box-shadow:none;padding:18px 20px}
.soon h4{margin:0 0 4px;font-size:15.5px;font-weight:600;display:flex;align-items:center;gap:10px}
.soon h4 .ic{width:32px;height:32px;border-radius:9px;background:var(--brand-soft);color:var(--brand);display:grid;place-items:center;font-size:15px;flex:none}
.soon .own{font-size:12.5px;color:var(--ink3);margin-bottom:8px}
.soon p{margin:0;font-size:13.5px;color:var(--ink2);line-height:1.5}
.soon .st{margin-top:10px}

/* ---------- KPI ---------- */
.kpis{margin-bottom:22px}
.kpi{padding:16px 20px 18px;border-top:4px solid var(--brand)}
.kpi.ok{border-top-color:var(--ok)}.kpi.warn{border-top-color:var(--warn)}.kpi.bad{border-top-color:var(--bad)}
.kpi .l{font-size:13px;color:var(--ink3);font-weight:600;}
.kpi .v{font-size:36px;font-weight:600;letter-spacing:-.03em;margin-top:4px;line-height:1.05;font-variant-numeric:tabular-nums;color:var(--ink)}
.kpi .v small{font-size:15px;color:var(--ink3);font-weight:600;margin-left:6px;letter-spacing:0}
.kpi .d{font-size:13.5px;color:var(--ink2);margin-top:10px;display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.kpi .d b{color:var(--ink);font-weight:700}
.kpi .d .ok{color:var(--ok)}.kpi .d .bad{color:var(--bad)}.kpi .d .warn{color:var(--warn)}
.meter{height:6px;border-radius:3px;background:var(--muted-soft);overflow:hidden;flex:1;min-width:60px}
.meter i{display:block;height:100%;background:var(--brand)}
.meter.ok i{background:var(--ok)}.meter.warn i{background:var(--warn)}.meter.bad i{background:var(--bad)}

/* ---------- метки статусов ---------- */
.pill{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:99px;font-size:12.5px;font-weight:700;white-space:nowrap;line-height:1.4}
.pill:before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor;flex:none}
.pill.ok{background:var(--ok-soft);color:var(--ok)}
.pill.warn{background:var(--warn-soft);color:var(--warn)}
.pill.bad{background:var(--bad-soft);color:var(--bad)}
.pill.mut{background:var(--muted-soft);color:var(--ink2)}
.pill.acc{background:var(--brand-soft);color:var(--brand)}
.pill.sm{font-size:11.5px;padding:1px 8px;vertical-align:1px}

/* ---------- таблицы ---------- */
.tw{overflow-x:auto}
table{border-collapse:collapse;width:100%;font-size:14px}
th{text-align:left;font-size:12.5px;color:var(--ink3);font-weight:600;padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap;background:var(--surface2)}
td{padding:11px 12px;border-bottom:1px solid var(--line2);vertical-align:middle}
tr:last-child td{border-bottom:0}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
td.mono{white-space:nowrap;font-size:13.5px}
tbody tr:hover td{background:var(--surface2)}
td.empty{color:var(--ink3);padding:18px 12px;font-style:italic}
/* журнал операций — только #ops-journal: с 23.09.2026 в #s-ops живёт и программа, и nth-child(6) прятал у неё клетку дня (строки план/факт съезжали) */
#ops-journal table{font-size:13.5px}
#ops-journal th,#ops-journal td{padding:9px 10px}
#ops-journal td:nth-child(5){max-width:230px}
@media (max-width:1500px){ #ops-journal th:nth-child(6),#ops-journal td:nth-child(6){display:none} }
.plate{font-family:"JetBrains Mono",monospace;font-size:12.5px;background:var(--surface2);border:1px solid var(--line);border-radius:6px;padding:2px 7px;white-space:nowrap;color:var(--ink)}
.muted{color:var(--ink3)}
.ed{color:var(--ink3);font-size:12.5px;white-space:nowrap}


/* единый стиль текста (15.09.2026): подписи и заголовки таблиц без капса — первая буква всегда заглавная, даже если текст пришёл строчными */
th::first-letter,.subh::first-letter,.tl-day::first-letter,.frl::first-letter,.fact .fk::first-letter,.kpi .l::first-letter,.grpn::first-letter,.org-total .lbl::first-letter,.egpn::first-letter{text-transform:uppercase}

/* daily.css — Рапорт по заказчикам, сводка дня, реестры и связи между вкладками. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---------- рапорт: секция заказчика ---------- */
.cust{margin-bottom:22px;overflow:hidden}
.cust .ch{display:flex;align-items:center;gap:14px;padding:13px 20px;background:linear-gradient(135deg,var(--hero-a) 0%,var(--hero-b) 100%);color:#fff;flex-wrap:wrap}   /* цвета шапки: --brand в тёмной теме голубой */
.cust .ch h3{margin:0;font-size:15px;font-weight:600;}
.cust .ch .t{font-size:13.5px;color:rgba(255,255,255,.85);display:inline-flex;align-items:center;gap:6px}
.cust .ch .r{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.cust .ch .pill{background:rgba(255,255,255,.16);color:#fff}
.cust .ch .pill.bad{background:var(--red)}
.fleet{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:12px;padding:16px 20px;border-bottom:1px solid var(--line2);background:var(--surface2)}
.fl{border:1px solid var(--line2);border-radius:12px;padding:12px 14px 12px 16px;background:var(--surface);position:relative;box-shadow:var(--shadow)}
.fl.off{opacity:.9}
.fl .fh{display:flex;align-items:center;gap:10px;margin-bottom:8px;padding-right:72px;flex-wrap:wrap}
.fl .fh b{font-size:16px;font-weight:600}
.fl .crew{display:grid;grid-template-columns:auto 1fr;gap:3px 12px;font-size:14px;line-height:1.4}
.fl .crew .k{color:var(--ink3);font-size:12.5px;white-space:nowrap;padding-top:1px}
.fl .crew .v{color:var(--ink);font-weight:600}
.fl .crew .v.none{color:var(--ink3);font-weight:400}
.fl .crew-note{margin-top:6px;font-size:13px;color:var(--ink2)}
.fl .tech{margin-top:10px;display:flex;gap:6px;flex-wrap:wrap}
.fl .reason{margin-top:8px;font-size:13px;color:var(--bad);background:var(--bad-soft);border-radius:6px;padding:5px 8px;font-weight:500}
.fl.off .reason{color:var(--ink2);background:var(--muted-soft)}
.fl .stripe{position:absolute;left:0;top:0;bottom:0;width:4px;border-radius:12px 0 0 12px;background:var(--ok)}
.fl.rep .stripe{background:var(--bad)}.fl.off .stripe{background:var(--ink3)}
.fl .edit{all:unset;position:absolute;right:10px;top:10px;cursor:pointer;color:var(--brand);font-size:13px;font-weight:600;padding:3px 8px;border-radius:6px;border:1px solid transparent}
.fl .edit:hover{background:var(--brand-soft);border-color:var(--brand-soft)}
.subh{padding:14px 20px 6px;font-size:12.5px;color:var(--ink3);font-weight:600}
.add{display:flex;align-items:center;gap:16px;padding:10px 20px 14px}
.add button{all:unset;color:var(--brand);font-weight:700;cursor:pointer;font-size:14px}
.add button:hover{text-decoration:underline}
.lnk{all:unset;color:var(--brand);cursor:pointer;font-size:13.5px;font-weight:700}
.lnk:hover{text-decoration:underline}

/* ---------- сводка дня ---------- */
.ov-top{margin-bottom:6px;align-items:stretch}
.summary{padding:12px 20px 18px}
.summary p{margin:0 0 9px;font-size:16px;line-height:1.55;color:var(--ink)}
.summary p:last-of-type{margin-bottom:0}
.summary b{font-weight:600;color:var(--brand)}
.summary .okline{color:var(--ok);font-weight:700}
.summary .meta{margin-top:14px;padding-top:12px;border-top:1px solid var(--line2);font-size:13px;color:var(--ink3)}
.summary .meta .warn,.frow .warn,.tl .warn{color:var(--warn);font-weight:700}
.attn{padding:8px 0 6px}
.attn .it{display:flex;gap:12px;padding:10px 20px;align-items:flex-start}
.attn .it+.it{border-top:1px solid var(--line2)}
.attn .dot{width:10px;height:10px;border-radius:50%;flex:none;margin-top:7px;background:var(--ink3)}
.attn .bad .dot{background:var(--bad)}.attn .warn .dot{background:var(--warn)}
.attn .it b{display:block;font-size:14.5px;line-height:1.4;font-weight:700}
.attn .it span{color:var(--ink2);font-size:13.5px;display:block;margin-top:2px}
.attn .none{padding:14px 20px 12px;color:var(--ok);font-weight:700;font-size:15px}
.frows{overflow:hidden}
.frows .fh-row,.frow{display:grid;grid-template-columns:118px 112px 124px minmax(240px,1fr) 200px 190px;gap:14px;padding:12px 20px;align-items:start}
.frows .fh-row{font-size:12.5px;color:var(--ink3);font-weight:600;background:var(--surface2);border-bottom:1px solid var(--line);border-top:1px solid var(--line2);margin-top:12px;padding:10px 20px}
.frow{border-bottom:1px solid var(--line2);border-left:4px solid var(--ok);font-size:14px}
.frow:last-child{border-bottom:0;border-radius:0 0 14px 14px}
.frow.rep{border-left-color:var(--bad)}
.frow.off{border-left-color:var(--ink3);background:var(--surface2)}
.frow.off .id b{color:var(--ink2)}
.frow .id b{display:block;font-size:16px;font-weight:600}
.frow .id span{color:var(--ink3);font-size:13px}
.frow .cu{font-weight:600;padding-top:2px;color:var(--ink2)}
.frow .job div{margin-bottom:5px;line-height:1.45}
.frow .job div:last-child{margin-bottom:0}
.frow .job .mono{color:var(--brand);margin-right:8px;font-size:13px;font-weight:600}
.frow .crew b{font-weight:700}
.frow .crew small{color:var(--ink3);margin-left:6px;font-size:12px}
.frow .crew .muted{font-size:13px;margin-top:2px}
.frow .crew i{color:var(--ink3)}
.frow .tech{display:flex;flex-wrap:wrap;gap:5px}
.tl{padding:6px 0 4px}
.tl .it{display:grid;grid-template-columns:64px 1fr auto;gap:14px;padding:12px 20px;align-items:start}
.tl .it+.it{border-top:1px solid var(--line2)}
.tl .t{font-family:"JetBrains Mono",monospace;font-size:14px;color:var(--brand);font-weight:600;padding-top:2px;font-variant-numeric:tabular-nums}
.tl b{font-size:14.5px;font-weight:700}
.tl .d{color:var(--ink2);font-size:13.5px;margin-top:3px;line-height:1.5}
.tl-day{padding:12px 20px 6px;font-size:12.5px;color:var(--brand);font-weight:600;background:var(--brand-band);border-top:1px solid var(--line2);margin-top:6px}
.tl .it.up .t{color:var(--ink3)}
.btn.danger{color:var(--bad);border-color:var(--bad-soft);background:var(--bad-soft)}
.btn.danger:hover{background:var(--bad);color:#fff;border-color:var(--bad)}
.dlg .ft .sp{flex:1}
.legend-box{padding:14px 20px;font-size:13.5px;color:var(--ink2);line-height:1.55;background:var(--surface2)}
.legend-box b{color:var(--ink)}
.todo{background:var(--warn-soft);color:var(--warn);border-radius:10px;padding:10px 16px;font-size:14px;margin-bottom:16px;line-height:1.5;border:1px solid rgba(180,83,9,.2)}
.todo b{margin-right:4px}

/* ---------- реестры и связи между вкладками ---------- */
.lnk-reg{cursor:pointer;color:var(--brand);border-color:var(--brand-soft);background:var(--brand-soft)}
.lnk-reg:hover{border-color:var(--brand)}
.lnk-reg.st-warn{color:var(--warn);background:var(--warn-soft);border-color:transparent}
.lnk-reg.st-bad{color:var(--bad);background:var(--bad-soft);border-color:transparent}
.lnk-name{all:unset;cursor:pointer;color:inherit;border-bottom:1px dotted var(--brand);font:inherit}
.lnk-name:hover{color:var(--brand)}
.attn .it.go{cursor:pointer}
.attn .it.go:hover{background:var(--surface2)}
.attn .arr{margin-left:auto;color:var(--ink3);font-size:20px;line-height:1;padding-top:2px}
.pchip{display:inline-flex;gap:4px;align-items:center;font-size:11.5px;border-radius:6px;padding:2px 7px;margin:2px 4px 2px 0;background:var(--ok-soft);color:var(--ok);white-space:nowrap}
.pchip.warn{background:var(--warn-soft);color:var(--warn)}
.pchip.bad{background:var(--bad-soft);color:var(--bad)}
.pchip.mut{background:var(--muted-soft);color:var(--ink3)}
td.wrap{white-space:normal;min-width:180px;line-height:1.4}
#staff td:first-child{min-width:210px}
#tech td:nth-child(3){min-width:150px}
tr.row-bad td:first-child{box-shadow:inset 3px 0 0 var(--bad)}
tr.row-warn td:first-child{box-shadow:inset 3px 0 0 var(--warn)}
.soon.live{border-style:solid;background:var(--surface);box-shadow:var(--shadow)}
.soon .nums{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:10px 0}
.soon .nums div{background:var(--surface2);border-radius:8px;padding:8px 6px;text-align:center}
.soon .nums b{display:block;font-size:20px;font-weight:600;letter-spacing:-.02em}
.soon .nums span{font-size:11px;color:var(--ink3)}
.soon .nums .ok b{color:var(--ok)}.soon .nums .warn b{color:var(--warn)}.soon .nums .bad b{color:var(--bad)}
.soon .st{display:flex;gap:12px;align-items:center}


/* ===== «Сегодня» по макету 23.09.2026: плитки флотов, кольца, полосы, списки ===== */
.ov-top,.ov-mid{margin-bottom:16px}
.ov-top .card .bd,.ov-mid .card .bd{padding:4px 18px 16px}
.ov-ft{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}
.ov-f{position:relative;border-radius:11px;padding:9px 10px 9px 14px;border:1px solid var(--line2);background:var(--surface2);min-height:74px;display:grid;gap:3px;align-content:start;min-width:0}
.ov-f::before{content:"";position:absolute;left:0;top:10px;bottom:10px;width:4px;border-radius:0 3px 3px 0;background:var(--ok)}
.ov-f.rep{background:var(--bad-soft)}.ov-f.rep::before{background:var(--bad)}
.ov-f.off{background:var(--warn-soft)}.ov-f.off::before{background:var(--warn)}
.ov-f:hover{border-color:var(--brand)}
.ov-f b{font-size:15px}.ov-f .c{font-size:12px;color:var(--ink2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ov-f .j{font-size:12px;color:var(--ink);margin-top:2px;line-height:1.3}.ov-f .m{font-size:11px;color:var(--ink3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ov-f .mono{font-family:"JetBrains Mono",monospace;font-size:11.5px;color:var(--ink3)}
.leg{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--ink3);margin-top:10px}.leg i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}.leg .rt{margin-left:auto}
.don{display:grid;grid-template-columns:110px 1fr;gap:14px;align-items:center;padding-top:6px}
.ring{width:110px;height:110px;border-radius:50%;display:grid;place-items:center;position:relative;flex:none}
.ring::after{content:"";position:absolute;inset:16px;border-radius:50%;background:var(--surface)}
.ring>div{position:relative;z-index:1;text-align:center}.ring b{font-size:22px;line-height:1}.ring small{display:block;font-size:11px;color:var(--ink3);margin-top:2px}
.ring.sm{width:76px;height:76px}.ring.sm::after{inset:11px}.ring.sm b{font-size:15px}.ring.sm small{font-size:10px}
.dl{display:grid;gap:5px;font-size:13px;min-width:0}.dl div{display:flex;justify-content:space-between;gap:8px}.dl i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:7px}
.ov-ops{margin-top:12px;border-top:1px solid var(--line2)}
.ov-op{display:grid;grid-template-columns:44px 1fr auto;gap:10px;padding:7px 0;border-bottom:1px solid var(--line2);font-size:13px;align-items:center}
.ov-op .t{font-family:"JetBrains Mono",monospace;font-size:12px;color:var(--ink3)}.ov-op .p{color:var(--ink3);font-size:12px}.ov-op:hover{background:var(--surface2)}
.note{font-size:12px;color:var(--ink3);margin-top:8px}
.ov-pgh{display:flex;justify-content:space-between;align-items:center;font-size:13px;padding-top:6px}
.meter{height:10px;border-radius:6px;overflow:hidden;display:flex;background:var(--muted-soft);margin:6px 0 4px}.meter i{display:block;height:100%}
.ov-cust{display:grid;gap:6px;margin-top:10px;font-size:12.5px}.ov-cust div{display:grid;grid-template-columns:96px 1fr 58px;gap:8px;align-items:center}
.ov-cust span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ov-cust span:last-child{text-align:right;color:var(--ink3)}
.ov-cust .b{height:8px;background:var(--muted-soft);border-radius:4px;overflow:hidden;display:flex}.ov-cust .b i{display:block;height:100%;background:var(--ok)}.ov-cust .b i.ov{background:var(--bad)}
.ov-h{font-weight:700;font-size:13px;margin-top:14px}
.ov-pgl{display:grid;gap:6px;font-size:13px;margin-top:8px}.ov-pgl div{display:flex;gap:8px;align-items:center;min-width:0}
.ov-two{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding-top:6px}
.mini{display:grid;grid-template-columns:76px 1fr;gap:10px;align-items:center;border-radius:10px;padding:4px}.mini:hover{background:var(--surface2)}
.ov-rows{display:grid;gap:0;margin-top:10px;font-size:13px}.ov-rows div{display:flex;justify-content:space-between;gap:8px;align-items:center;border-top:1px solid var(--line2);padding:7px 0}.ov-rows div:hover{background:var(--surface2)}
.ov-prose-card{margin-top:16px}.ov-prose-card .prose{padding:0 18px 16px;font-size:14px;line-height:1.5}.ov-prose-card .prose p{margin:6px 0}
.click{cursor:pointer}
@media (max-width:1100px){.ov-mid{grid-template-columns:1fr 1fr}.ov-ft{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:760px){.ov-mid{grid-template-columns:1fr}.ov-ft{grid-template-columns:repeat(2,minmax(0,1fr))}.ov-two{grid-template-columns:1fr}.don{grid-template-columns:90px 1fr}.ring{width:90px;height:90px}}

/* forms.css — Фильтры и поля, модалки, вход, токены движения, мелочи. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---------- фильтры, поля ---------- */
.filters{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px;align-items:center}
.search{border:1px solid var(--line);background:var(--surface);border-radius:9px;padding:8px 11px;font:inherit;font-size:14px;color:var(--ink);min-width:220px}
/* фильтры любого экрана: выпадающие списки, даты и текстовые поля без класса — в том же стиле, что .search (ТБ и ОТ, 23.09.2026) */
.filters select,.filters input[type=date],.filters input[type=text],.filters input:not([type]){border:1px solid var(--line);background:var(--surface);border-radius:9px;padding:8px 11px;font:inherit;font-size:14px;color:var(--ink)}
.filters select{padding-right:28px}
.filters .inl input[type=date]{padding:6px 9px}
.search:focus{outline:2px solid var(--brand);border-color:transparent}
.inl{display:inline-flex;align-items:center;gap:10px;font-size:14px;color:var(--ink2);font-weight:600}
.inl .search{min-width:220px}
.temp{width:72px;border:1px solid rgba(255,255,255,.35);background:rgba(255,255,255,.12);border-radius:6px;padding:4px 8px;font:inherit;font-size:14px;color:#fff;font-variant-numeric:tabular-nums}
.temp::placeholder{color:rgba(255,255,255,.6)}
.temp:focus{outline:2px solid #fff;border-color:transparent}
.stsel{border:1px solid var(--line);background:var(--surface);border-radius:99px;padding:4px 10px;font:inherit;font-size:12.5px;font-weight:700;color:var(--ink2);cursor:pointer}
.stsel.plan{color:var(--brand);background:var(--brand-soft);border-color:transparent}
.stsel.done{color:var(--ok);background:var(--ok-soft);border-color:transparent}
.stsel.not_done,.stsel.cancelled{color:var(--bad);background:var(--bad-soft);border-color:transparent}
.stsel.moved{color:var(--warn);background:var(--warn-soft);border-color:transparent}

/* ---------- модалка ---------- */
.modal{position:fixed;inset:0;background:rgba(3,20,55,.5);display:none;place-items:center;z-index:30;padding:16px}   /* выше бокового окна (.drawer z-index 16): диалоги из карточки были под ним и выглядели тусклыми (Эмин, 24.09.2026) */
.modal.on{display:grid}
.dlg{background:var(--surface);border-radius:16px;width:min(680px,100%);box-shadow:0 20px 60px rgba(0,0,0,.3);border:1px solid var(--line2);max-height:calc(100vh - 32px);display:flex;flex-direction:column}
.dlg .hd{padding:18px 22px;border-bottom:1px solid var(--line2);display:flex;align-items:center}
.dlg .hd h3{margin:0;font-size:17px;font-weight:600}
.dlg .hd .x{all:unset;margin-left:auto;cursor:pointer;color:var(--ink3);font-size:22px;padding:0 6px;line-height:1}
.dlg .hd .x:hover{color:var(--ink)}
.form{padding:18px 22px;display:grid;grid-template-columns:1fr 1fr;gap:14px 18px;overflow:auto}
.f{display:flex;flex-direction:column;gap:5px}
.f label{font-size:12.5px;color:var(--ink2);font-weight:700}
.f input,.f select,.f textarea{border:1px solid var(--line);background:var(--surface);border-radius:9px;padding:9px 11px;font:inherit;font-size:14.5px;color:var(--ink)}
.f input:focus,.f select:focus,.f textarea:focus{outline:2px solid var(--brand);border-color:transparent}
/* «глазами пользователя»: полоса сверху во всю ширину */
.viewas-bar{position:sticky;top:0;z-index:60;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 16px;background:#F59E0B;color:#1F1300;font-size:14px}
.viewas-bar b{font-weight:700}.viewas-bar .btn{margin-left:auto;background:#fff;color:#1F1300;border-color:#fff}
.ac-view-b{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.ac-view-b select{min-width:280px;flex:1;max-width:520px}
.ac-view{margin-bottom:16px}
/* подсказки из реестра под полем (Пользователи → ФИО) */
.ac-w{position:relative;display:flex;flex-direction:column}   /* список — сразу под полем ввода */
.ac-l{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;max-height:320px;overflow-y:auto;background:var(--surface);border:1px solid var(--line2);border-radius:10px;box-shadow:0 12px 32px rgba(3,20,55,.18);padding:4px}
.ac-f .muted.sm:empty{display:none}
.ac-o{display:grid;gap:1px;padding:7px 10px;border-radius:8px;cursor:pointer}
.ac-o b{font-size:14px;font-weight:600;color:var(--ink)}.ac-o span{font-size:12px;color:var(--ink3)}
.ac-o:hover,.ac-o.on{background:var(--surface2)}
.f.w{grid-column:1/-1}
.dlg .ft{padding:14px 22px 18px;display:flex;gap:10px;justify-content:flex-end;border-top:1px solid var(--line2)}
.dlg .ft .note{margin-right:auto;font-size:13px;color:var(--ink3);align-self:center}
.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:var(--ink);color:#fff;padding:11px 18px;border-radius:10px;font-size:14px;display:none;z-index:20;box-shadow:0 8px 24px rgba(0,0,0,.25)}
.toast.on{display:block}
.stub{padding:48px;text-align:center;color:var(--ink3);font-size:15px}
.hidden{display:none!important}

/* ---------- вход (15.09.2026): слева фирменная панель, справа форма; на телефоне панель сверху, форма — лист снизу ---------- */
:root{--lg-aurora:1;--lg-field:#F4F6FA}
:root[data-theme="dark"]{--lg-aurora:.6;--lg-field:var(--surface2)}
.login{min-height:100vh;min-height:100dvh;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);background:var(--surface)}
.lg-hero{position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;gap:40px;padding:44px 56px;color:#fff;
  background:linear-gradient(165deg,var(--nav-a) 0%,var(--nav-b) 100%)}
/* живой фон «северное сияние»: цветные пятна медленно плывут (только transform — дёшево для видеокарты), сверху лёгкое зерно */
.lg-aurora{position:absolute;inset:-40px;overflow:hidden;pointer-events:none;opacity:var(--lg-aurora);transition:transform 1.4s var(--ease)}   /* inset с запасом: фон сдвигается за курсором (app.js) */
.lg-aurora i{position:absolute;border-radius:50%;mix-blend-mode:screen;will-change:transform}
.lg-aurora i:nth-child(1){width:80%;height:70%;left:-20%;top:-20%;background:radial-gradient(closest-side,rgba(40,110,255,.9),transparent);animation:lg-d1 24s ease-in-out infinite alternate}
.lg-aurora i:nth-child(2){width:65%;height:55%;right:-20%;top:15%;background:radial-gradient(closest-side,rgba(24,200,230,.55),transparent);animation:lg-d2 30s ease-in-out infinite alternate}
.lg-aurora i:nth-child(3){width:90%;height:60%;left:5%;bottom:-30%;background:radial-gradient(closest-side,rgba(70,60,220,.7),transparent);animation:lg-d3 36s ease-in-out infinite alternate}
.lg-aurora i:nth-child(4){width:45%;height:40%;right:-12%;bottom:-14%;background:radial-gradient(closest-side,rgba(233,30,35,.32),transparent);animation:lg-d4 28s ease-in-out infinite alternate}
.lg-aurora i:nth-child(5){width:150%;height:26%;left:-25%;top:34%;border-radius:50%;background:linear-gradient(90deg,transparent 8%,rgba(60,230,200,.28) 35%,rgba(90,150,255,.32) 60%,transparent 90%);filter:blur(34px);animation:lg-wave 20s ease-in-out infinite alternate}
.lg-aurora::after{content:"";position:absolute;inset:0;opacity:.09;mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
@keyframes lg-d1{0%{transform:translate(0,0) scale(1)}50%{transform:translate(22%,14%) scale(1.15)}100%{transform:translate(6%,30%) scale(.92)}}
@keyframes lg-d2{0%{transform:translate(0,0) scale(1)}50%{transform:translate(-26%,18%) scale(1.2)}100%{transform:translate(-8%,-14%) scale(1)}}
@keyframes lg-d3{0%{transform:translate(0,0) scale(1)}50%{transform:translate(14%,-22%) scale(1.1)}100%{transform:translate(-16%,-8%) scale(1.2)}}
@keyframes lg-d4{0%{transform:translate(0,0)}100%{transform:translate(-30%,-24%) scale(1.3)}}
@keyframes lg-wave{0%{transform:rotate(-14deg) translateY(0) scaleX(1)}50%{transform:rotate(-6deg) translateY(-18%) scaleX(1.1)}100%{transform:rotate(-18deg) translateY(24%) scaleX(.95)}}
@keyframes lg-spin{to{transform:rotate(360deg)}}
.lg-logo{height:42px;width:auto;align-self:flex-start;position:relative}
.lg-copy{position:relative;max-width:30rem}
.lg-copy h1{margin:0 0 14px;font-size:clamp(34px,3.6vw,50px);line-height:1.06;font-weight:600;letter-spacing:-.025em;text-wrap:balance}
.lg-copy .nw{white-space:nowrap}
.lg-copy p{margin:0;font-size:17px;line-height:1.5;color:var(--nav-ink);max-width:34ch;text-wrap:pretty}
.lg-flake{position:absolute;right:-220px;bottom:-250px;width:560px;height:560px;fill:none;stroke:rgba(255,255,255,.07);stroke-width:1.1;stroke-linecap:round;pointer-events:none;animation:lg-spin 240s linear infinite;transition:translate 1.4s var(--ease)}
.lg-pane{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 24px calc(72px + 8vh)}   /* нижний отступ больше — форма чуть выше середины (оптический центр) */
.lg-form{width:min(360px,100%);display:flex;flex-direction:column}
.login:not(.hidden) .lg-form{animation:view-in var(--dur-slow) var(--ease)}
.lg-form h2{margin:0 0 6px;font-size:32px;line-height:1.15;font-weight:600;letter-spacing:-.02em;color:var(--ink)}
.lg-sub{margin:0 0 28px;font-size:15px;color:var(--ink3)}
.lg-group{background:var(--lg-field);border:1px solid var(--line2);border-radius:14px;overflow:hidden;transition:border-color var(--dur) var(--ease)}
.lg-group.bad{border-color:var(--bad);animation:lg-shake .36s var(--ease)}
.lg-field{position:relative}
.lg-field+.lg-field{border-top:1px solid var(--line2)}
.lg-field:focus-within{box-shadow:inset 0 0 0 2px var(--brand)}
.lg-field:first-child:focus-within{border-radius:13px 13px 0 0}.lg-field:last-child:focus-within{border-radius:0 0 13px 13px}
.lg-field label{position:absolute;left:16px;top:10px;font-size:12px;line-height:1;color:var(--ink3);pointer-events:none;transition:top var(--dur) var(--ease),font-size var(--dur) var(--ease)}
.lg-field input{display:block;width:100%;height:58px;border:0;background:transparent;padding:24px 16px 8px;font:inherit;font-size:16px;color:var(--ink);outline:none}
.lg-field .pwrap input{padding-right:52px}
.lg-field input:-webkit-autofill{-webkit-box-shadow:0 0 0 40px var(--lg-field) inset;-webkit-text-fill-color:var(--ink);caret-color:var(--ink)}
@supports selector(:has(a)){
  .lg-field label{top:21px;font-size:16px}
  .lg-field:focus-within label{top:10px;font-size:12px}
  .lg-field:has(input:not(:placeholder-shown)) label{top:10px;font-size:12px}
  .lg-field:has(input:-webkit-autofill) label{top:10px;font-size:12px}
}
.lg-field .eye{right:10px;padding:6px;color:var(--ink3)}
.lg-caps{margin-top:10px;font-size:13px;color:var(--warn)}
.lg-err{min-height:20px;margin:10px 0 12px;font-size:14px;color:var(--bad)}
.lg-btn{display:flex;align-items:center;justify-content:center;gap:8px;height:52px;border:0;border-radius:14px;background:var(--brand);color:#fff;font:inherit;font-size:16px;font-weight:600;cursor:pointer;
  transition:background var(--dur) var(--ease),opacity var(--dur) var(--ease),transform var(--dur-fast) var(--ease)}
.lg-btn svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;transition:transform var(--dur) var(--ease)}
.lg-btn:hover{background:var(--brand-dark)}
:root[data-theme="dark"] .lg-btn:hover{background:#4A7BE0}
.lg-btn:hover svg{transform:translateX(3px)}
.lg-btn:active{transform:scale(.985)}
.lg-btn:focus-visible{outline:none;box-shadow:var(--ring)}
.lg-btn:disabled{opacity:.6;cursor:default}
.lg-btn.busy svg{display:none}
.lg-foot{position:absolute;left:0;right:0;bottom:24px;text-align:center;font-size:12.5px;color:var(--ink3)}
@keyframes lg-shake{0%,100%{transform:none}20%{transform:translateX(-7px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(2px)}}
@media (max-width:760px){
  .login{grid-template-columns:1fr;grid-template-rows:auto 1fr;background:var(--nav-b)}
  .lg-hero{padding:28px 24px 60px;gap:36px}
  .lg-logo{height:28px}
  .lg-copy h1{font-size:30px;margin-bottom:8px}
  .lg-copy p{font-size:15px}
  .lg-flake{width:320px;height:320px;right:-110px;top:-90px;bottom:auto}
  .lg-pane{margin-top:-28px;border-radius:24px 24px 0 0;background:var(--surface);justify-content:flex-start;padding:34px 20px 72px}
  .lg-form h2{font-size:28px}
  .lg-sub{margin-bottom:22px}
}
.err{color:var(--bad);font-size:13px;min-height:1em}

/* ---------- движение: токены как в NordPass, всё гасится prefers-reduced-motion ---------- */
:root{--dur-fast:.12s;--dur:.2s;--dur-slow:.32s;--ease:cubic-bezier(.22,.61,.36,1);--ring:0 0 0 4px rgba(3,52,134,.18)}
:root[data-theme="dark"]{--ring:0 0 0 4px rgba(91,141,239,.3)}
@keyframes view-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@keyframes dlg-in{from{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:none}}
@keyframes sheet-up{from{transform:translateY(40px);opacity:0}to{transform:none;opacity:1}}
@keyframes fade-in{from{opacity:0}to{opacity:1}}
/* вход без рывков (23.09.2026): заставка, пока грузится первый экран; приложение проявляется целиком; полоса сетевой загрузки сверху */
.splash{position:fixed;inset:0;z-index:70;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:22px;background:radial-gradient(900px 600px at 30% 20%,var(--hero-a),var(--hero-b) 70%);transition:opacity var(--dur-slow) var(--ease),visibility 0s var(--dur-slow)}
.splash img{height:40px;opacity:.95}
.splash .sp-ring{width:26px;height:26px;border-radius:50%;border:3px solid rgba(255,255,255,.25);border-top-color:#fff;animation:lg-spin .9s linear infinite}
.splash.off{opacity:0;visibility:hidden;pointer-events:none}
.app.booting{opacity:0}
.app.reveal{animation:fade-in var(--dur-slow) var(--ease)}
.login.leaving{opacity:0;transition:opacity var(--dur-slow) var(--ease);pointer-events:none}
#netbar{position:fixed;top:0;left:0;height:2px;width:0;background:var(--brand);z-index:80;opacity:0;transition:width .4s ease,opacity .3s}
#netbar.on{opacity:1;width:70%}#netbar.done{width:100%;opacity:0;transition:width .15s ease,opacity .4s .15s}
@media (prefers-reduced-motion:reduce){.splash{transition:none}.app.reveal{animation:none}}
@keyframes toast-in{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}
@keyframes drawer-in{from{transform:translateX(24px);opacity:0}to{transform:none;opacity:1}}
.screen.on.anim{animation:view-in var(--dur-slow) var(--ease)}
.modal.on{animation:fade-in var(--dur) var(--ease)}
.modal.on .dlg{animation:dlg-in var(--dur-slow) var(--ease)}
.toast.on{animation:toast-in var(--dur) var(--ease)}
.toast.bad{background:var(--bad)}
.btn,.nav button,.chip,.pill,.kpi,.fl,.frow,.vchip,.acc-h,.lnk-reg,.lnk-name,.search,.f input,.f select,.attn .it,tr.click td{transition:background var(--dur) var(--ease),color var(--dur) var(--ease),border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur-fast) var(--ease)}
.btn:active,.vchip:active,.nav button:active{transform:translateY(1px)}
.fl:hover,.soon.live:hover{box-shadow:0 6px 20px rgba(11,18,32,.10);transform:translateY(-1px)}
.btn:focus-visible,.vchip:focus-visible,.acc-h:focus-visible,.kpi.click:focus-visible,.lnk-reg:focus-visible,.lnk-name:focus-visible{outline:none;box-shadow:var(--ring)}
.search:focus,.f input:focus,.f select:focus,.f textarea:focus,.temp:focus{outline:none;border-color:var(--brand);box-shadow:var(--ring)}
.meter i{transition:width var(--dur-slow) var(--ease)}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* ---------- мелкие ---------- */
.sm{font-size:12.5px}
tr.click{cursor:pointer}
tr.click:hover td{background:var(--brand-band)}
.kpi.click{cursor:pointer;user-select:none}
.kpi.click:hover{box-shadow:0 6px 20px rgba(11,18,32,.10);transform:translateY(-1px)}
.kpi.click.active{box-shadow:var(--ring)}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:var(--surface)}
.seg button{all:unset;padding:8px 14px;font-size:13.5px;font-weight:600;color:var(--ink2);cursor:pointer;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}
.seg button.on{background:var(--brand);color:#fff}
.seg button:not(.on):hover{background:var(--surface2)}
.card.sec{margin-bottom:16px}
.card.sec .none{padding:16px 20px;color:var(--ok);font-weight:700}
td.num.warn{color:var(--warn);font-weight:600}

/* «Настройка платформы»: матрица доступа ролей к разделам */
.ac-grid th.c,.ac-grid td.c{text-align:center;width:88px}
.ac-grid th.c{font-size:12px;line-height:1.15;white-space:normal;vertical-align:bottom}
.ac-grid td:first-child{min-width:220px}
.ac-grid td:first-child .sm{white-space:normal;max-width:300px}
button.ac{all:unset;display:inline-grid;place-items:center;width:38px;height:32px;border-radius:9px;font-size:15px;font-weight:700;cursor:pointer;border:1.5px solid var(--line);color:var(--ink3);background:var(--surface);transition:background var(--dur) var(--ease),color var(--dur) var(--ease),border-color var(--dur) var(--ease)}
button.ac.view{background:var(--surface2);color:var(--ink2)}
button.ac.edit{background:var(--brand);border-color:var(--brand);color:#fff}
button.ac.ns{box-shadow:inset 0 0 0 2px var(--warn)}      /* отличается от стандарта */
button.ac.ch{outline:2px dashed var(--brand);outline-offset:2px}   /* изменено, не сохранено */
button.ac:hover{border-color:var(--brand)}
button.ac:focus-visible{outline:none;box-shadow:var(--ring)}
.ac-grid tr.ac-grp td{background:var(--surface2);padding:8px 12px;font-size:13px}
.ac-grid tr.ac-sub td:first-child{padding-left:28px}
.ac-grid tr.ac-sub td:first-child b::before{content:"↳ ";color:var(--ink3);font-weight:400}
/* переключатели «только …» и галочки форм — тумблер в цветах платформы вместо нативной галочки (Эмин, 24.09.2026: «выбивается из дизайна») */
.inl{cursor:pointer;user-select:none}
.inl input[type=checkbox]{appearance:none;-webkit-appearance:none;width:34px;height:20px;border-radius:999px;background:var(--muted-soft);border:1px solid var(--line);position:relative;cursor:pointer;margin:0;flex:none;transition:background var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.inl input[type=checkbox]::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(15,23,42,.3);transition:left var(--dur) var(--ease)}
.inl input[type=checkbox]:checked{background:var(--brand);border-color:var(--brand)}
.inl input[type=checkbox]:checked::after{left:16px}
.inl input[type=checkbox]:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.inl input[type=checkbox]:disabled{opacity:.5;cursor:default}

/* tech.css — Техника (флоты и типы), матрица КТГ, боковая панель-карточка. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---------- техника: флоты чипами, остальное по типам ---------- */
.fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px;padding:14px 20px 18px}
.fcard{border:1px solid var(--line2);border-radius:12px;padding:12px 14px;background:var(--surface);box-shadow:var(--shadow);border-left:4px solid var(--ok)}
.fcard.has-warn{border-left-color:var(--warn)}
.fcard.has-bad{border-left-color:var(--bad)}
.fcard .fh{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.fcard .fh b{font-size:15.5px;font-weight:600}
.fcard .fs{font-size:12.5px;color:var(--ink3);margin:2px 0 8px}
.fcard .fs .bad{color:var(--bad);font-weight:600}.fcard .fs .warn{color:var(--warn);font-weight:600}
.chips{display:flex;flex-wrap:wrap;gap:6px}
.vchip{all:unset;display:inline-flex;align-items:center;gap:6px;padding:4px 9px 4px 7px;border-radius:8px;border:1px solid var(--line);background:var(--surface2);cursor:pointer;font-size:12.5px;line-height:1.3}
.vchip i{width:8px;height:8px;border-radius:50%;background:var(--ok);flex:none}
.vchip .k{color:var(--ink3);font-size:11.5px}
.vchip b{font-family:"JetBrains Mono",monospace;font-weight:600;font-size:12.5px}
.vchip:hover{border-color:var(--brand);background:var(--brand-soft)}
.vchip.warn{border-color:rgba(180,83,9,.35);background:var(--warn-soft)}.vchip.warn i{background:var(--warn)}
.vchip.bad{border-color:rgba(220,38,38,.35);background:var(--bad-soft)}.vchip.bad i{background:var(--bad)}
.accs{padding:6px 0 8px}
.acc{border-top:1px solid var(--line2)}
.acc-h{all:unset;display:flex;align-items:center;gap:12px;width:100%;box-sizing:border-box;padding:12px 20px;cursor:pointer;font-size:14.5px}
.acc-h:hover{background:var(--surface2)}
.acc-h .chev{display:inline-block;width:18px;color:var(--ink3);font-size:20px;line-height:1;transition:transform var(--dur) var(--ease)}
.acc.open .acc-h .chev{transform:rotate(90deg)}
.acc-h b{font-weight:700}
.acc-h .cnt{font-family:"JetBrains Mono",monospace;font-size:12.5px;color:var(--ink2);background:var(--muted-soft);border-radius:6px;padding:1px 7px}
.acc-h .dots{margin-left:auto;display:inline-flex;gap:10px;font-size:12.5px;color:var(--ink2);font-variant-numeric:tabular-nums}
.acc-h .dots i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px;vertical-align:0}
.acc-h .dots i.ok{background:var(--ok)}.acc-h .dots i.warn{background:var(--warn)}.acc-h .dots i.bad{background:var(--bad)}
.acc-b{animation:view-in var(--dur) var(--ease);border-top:1px solid var(--line2);background:var(--surface2)}

/* ---------- КТГ: матрица по дням ---------- */
table.ktg{font-size:12.5px;border-collapse:separate;border-spacing:0}
table.ktg th,table.ktg td{padding:5px 6px;white-space:nowrap}
table.ktg th.dn{text-align:center;min-width:26px;padding:6px 2px;font-size:11px}
table.ktg th.dn.td{color:var(--brand);background:var(--brand-soft)}
table.ktg .sticky{position:sticky;left:0;background:var(--surface);z-index:1;min-width:220px;box-shadow:1px 0 0 var(--line2)}
table.ktg tr.grp td{background:var(--surface2);font-weight:700;border-top:1px solid var(--line)}
table.ktg tr.grp td.sticky{background:var(--surface2)}
table.ktg td.kc{text-align:center;font-weight:700;font-size:11px;border-left:1px solid var(--line2);color:#fff;border-bottom:1px solid var(--surface)}
table.ktg td.kc.L{background:var(--ok)}table.ktg td.kc.R{background:var(--bad)}table.ktg td.kc.TR{background:var(--warn)}table.ktg td.kc.TO{background:var(--brand)}table.ktg td.kc.O{background:var(--ink3)}
table.ktg td.kc.none{background:var(--muted-soft)}
table.ktg td.kc.ed{cursor:pointer}
table.ktg td.kc.ed:hover{outline:2px solid var(--ink);outline-offset:-2px}
table.ktg td.num.warn{color:var(--bad);font-weight:700}
.legend-k{font-size:12.5px;color:var(--ink2);display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap}
.legend-k i{display:inline-block;width:14px;height:14px;border-radius:3px;margin-left:8px}
.legend-k i.L{background:var(--ok)}.legend-k i.R{background:var(--bad)}.legend-k i.TR{background:var(--warn)}.legend-k i.TO{background:var(--brand)}
tr.off td{opacity:.55}
.drawer .dact{margin-top:14px}
.card .hd .r.lnk{margin-left:auto;font-size:13px}
.card .hd button.r.lnk{all:unset;margin-left:auto;font-size:13px;color:var(--brand);font-weight:700;cursor:pointer}
.card .hd button.r.lnk:hover{text-decoration:underline}

/* ---------- производственная программа: сетка кустов по дням ---------- */
#pg-summary tr.grp td{background:var(--surface2);border-top:1px solid var(--line)}
#pg-summary tr.off td{opacity:.5}

/* ---------- боковая панель с карточкой ---------- */
.drawer-bg{position:fixed;inset:0;background:rgba(3,20,55,.35);display:none;z-index:15}
.drawer-bg.on{display:block;animation:fade-in var(--dur) var(--ease)}
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(460px,100%);background:var(--surface);box-shadow:-12px 0 40px rgba(0,0,0,.18);z-index:16;display:none;overflow:auto;padding:22px 24px 28px}
.drawer.on{display:block;animation:drawer-in var(--dur-slow) var(--ease)}
.drawer .x{all:unset;position:absolute;right:14px;top:12px;font-size:24px;color:var(--ink3);cursor:pointer;padding:2px 8px;border-radius:6px}
.drawer .x:hover{color:var(--ink);background:var(--surface2)}
.drawer .dh{padding-right:36px;margin-bottom:14px}
.drawer .dh h3{margin:8px 0 6px;font-size:20px;font-weight:600;letter-spacing:-.02em}
.drawer .plate.big{font-size:16px;padding:4px 10px}
.drawer .dgrid{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;margin:14px 0;font-size:14px}
.drawer .dgrid dt{color:var(--ink3);font-size:12.5px;padding-top:2px}
.drawer .dgrid dd{margin:0;font-weight:500}
.drawer .dnote{background:var(--surface2);border-radius:10px;padding:10px 12px;margin:10px 0;font-size:14px;line-height:1.5}
.drawer .dnote b{display:block;font-size:12.5px;color:var(--ink3);margin-bottom:3px}
.drawer .dnote.bad{background:var(--bad-soft);color:var(--bad)}.drawer .dnote.bad b{color:var(--bad)}
.drawer .dnote.warn{background:var(--warn-soft);color:var(--warn)}.drawer .dnote.warn b{color:var(--warn)}
.drawer .dlink{border-top:1px solid var(--line2);padding-top:12px;margin-top:12px;font-size:14px}
.drawer .dmeta{margin-top:16px;font-size:12px;color:var(--ink3)}
.drawer .chips-wrap{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
@media (max-width:760px){
  .drawer{top:auto;left:0;width:auto;max-height:85vh;border-radius:16px 16px 0 0;box-shadow:0 -12px 40px rgba(0,0,0,.25)}
  .drawer.on{animation:sheet-up var(--dur-slow) var(--ease)}
  .modal.on .dlg{animation:sheet-up var(--dur-slow) var(--ease)}
  .fgrid{grid-template-columns:1fr;padding:12px}
}


/* медосмотры: клетки матрицы и легенда */
table.ktg.med td.kc{font-size:12px;min-width:26px;cursor:default}
table.ktg.med td.kc.md-ok{background:var(--ok)}table.ktg.med td.kc.md-retry{background:var(--ok);box-shadow:inset 0 0 0 2px var(--warn)}
table.ktg.med td.kc.md-den{background:var(--bad);cursor:pointer}table.ktg.med td.kc.md-miss{background:var(--warn-soft,#fdf0dc);color:var(--warn);border-bottom:1px solid var(--line2)}
table.ktg.med td.kc.md-off{background:transparent;border-bottom:1px solid var(--line2)}
table.ktg.med td.kc.md-ok,table.ktg.med td.kc.md-retry{cursor:pointer}
table.ktg.med tr.unk td.sticky{background:var(--surface2)}
.md-leg i{display:inline-block;width:14px;height:12px;border-radius:3px;vertical-align:-2px;margin:0 4px 0 10px;border:1px solid var(--line2)}
.md-leg i.ok{background:var(--ok);border-color:var(--ok)}.md-leg i.retry{background:var(--ok);box-shadow:inset 0 0 0 2px var(--warn)}.md-leg i.den{background:var(--bad);border-color:var(--bad)}.md-leg i.miss{background:var(--warn-soft,#fdf0dc)}.md-leg i.off{background:transparent}
.md-days{display:flex;flex-wrap:wrap;gap:4px;margin:10px 0}
.md-day{font:600 11px/1 var(--mono);padding:5px 6px;border-radius:6px;color:#fff}
.md-day.md-ok{background:var(--ok)}.md-day.md-retry{background:var(--ok);box-shadow:inset 0 0 0 2px var(--warn)}.md-day.md-den{background:var(--bad);cursor:pointer}.md-day.md-miss{background:var(--warn-soft,#fdf0dc);color:var(--warn)}
.md-day.md-ok,.md-day.md-retry{cursor:pointer}
table.ktg.med td.kc.md-nodata{background:repeating-linear-gradient(135deg,transparent 0 4px,var(--line2) 4px 5px);border-bottom:1px solid var(--line2)}
.md-leg i.nodata{background:repeating-linear-gradient(135deg,transparent 0 3px,var(--line2) 3px 4px)}
.md-day.md-nodata{background:var(--surface2);color:var(--ink3)}
@media (max-width:720px){table.ktg.med .sticky{min-width:150px;max-width:170px;white-space:normal}table.ktg.med td.sticky .sm{display:none}}

/* КТГ: клетка Р/ТР с причиной — уголок; таблица причин под матрицей (23.09.2026) */
table.ktg td.kc.nt{position:relative}
table.ktg td.kc.nt::after{content:"";position:absolute;right:2px;top:2px;width:5px;height:5px;border-radius:50%;background:#fff;opacity:.9}
table.ktg-rs td.wrap{white-space:normal;min-width:260px}
table.ktg-rs td.nw{white-space:nowrap}

/* плановое ТО (24.09.2026): таблица «ТО и пробег», журнал ТО в карточке */
table.maint td,table.maint th{white-space:nowrap}table.maint td.nw{white-space:nowrap}
table.maint input.odo{width:104px;border:1px solid var(--line);border-radius:8px;padding:5px 8px;font:inherit;font-size:13.5px;font-family:"JetBrains Mono",monospace;text-align:right;background:var(--surface)}
table.maint input.odo:focus{outline:2px solid var(--brand);outline-offset:-1px}
.dnote.warn{background:var(--warn-soft)}.dnote.bad{background:var(--bad-soft)}
.svc-list{margin-top:8px}table.svc{width:100%;font-size:12.5px}table.svc th,table.svc td{padding:4px 6px}table.svc td.wrap{white-space:normal}table.svc td.nw{white-space:nowrap}

/* responsive.css — Адаптив, печать, пользователи. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---------- адаптив ---------- */
@media (max-width:1400px){
  .top .date{display:none}
  .frows .fh-row{display:none}
  .frow{grid-template-columns:1fr 1fr;gap:8px 14px;padding:12px 14px}
  .frow .job,.frow .crew,.frow .tech{grid-column:1/-1}
  .frow .cu{grid-column:1/-1;margin-top:-6px}
  .tl .it{grid-template-columns:56px 1fr;gap:8px 12px}
  .tl .it>div:last-child{grid-column:2}
}
@media (max-width:1100px){ .g4{grid-template-columns:repeat(2,1fr)} .g3{grid-template-columns:repeat(2,1fr)} }
@media (max-width:980px){ .g3,.g2{grid-template-columns:1fr} }
@media (max-width:760px){
  .app{grid-template-columns:1fr}
  .nav{position:fixed;bottom:0;left:0;right:0;top:auto;height:auto;flex-direction:row;overflow-x:auto;padding:6px 8px calc(6px + env(safe-area-inset-bottom));gap:2px;z-index:5;background:var(--nav-b)}
  .nav-glow,.nav .brand,.nav-sec,.nav-toggle{display:none}
  .nav-list{display:contents}
  .nav button{flex-direction:column;gap:3px;font-size:11px;padding:6px 10px;width:auto;white-space:nowrap}
  .nav-cnt{position:absolute;top:1px;right:4px;margin:0;font-size:10px;line-height:15px;min-width:16px;padding:0 4px}
  /* профиль — кружок в правом верхнем углу шапки (app.js переносит .who в .top), меню раскрывается вниз */
  .top{position:relative;padding-right:48px}
  .who{position:absolute;top:17px;right:0;margin:0;padding:0;border:0}
  .who .who-btn{padding:0;border-radius:50%}
  .who .who-btn:focus-visible{outline:none;box-shadow:var(--ring)}
  .who-ava{width:36px;height:36px;background:var(--hero-a);box-shadow:0 4px 12px rgba(3,20,55,.22)}
  .who-txt,.who-more{display:none}
  .who-menu{left:auto;right:0;top:calc(100% + 8px);bottom:auto;width:min(260px,calc(100vw - 28px))}
  .who .who-menu button{padding:11px 10px}
  .main{padding:0 14px 96px}
  .top h1{font-size:22px}
  .g4{grid-template-columns:1fr 1fr}
  .form{grid-template-columns:1fr}
  .fleet{grid-template-columns:1fr;padding:12px}
}
@media (prefers-reduced-motion:no-preference){ .btn,.nav button{transition:background .12s,color .12s,border-color .12s} }

/* ---------- печать: как документ ---------- */
@media print{
  :root{--bg:#fff;--shadow:none}
  .nav,.who,.top .btn,.filters .btn,.fl .edit,.add,.theme,#btn-add,#xlsx,.soon{display:none!important}
  .app{display:block}
  .main{padding:0}
  .card,.fl{box-shadow:none;break-inside:avoid}
  .cust{break-inside:auto}
  .cust .ch{background:#eef3fc!important;color:#033486!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .fleet{background:#fff}
  .search,.temp{border:0;padding:0;background:transparent;color:inherit}
  body{font-size:12.5px}
}

/* пользователи */
#users tr.off td{opacity:.55}


/* dashboard.css — Дашборд/аналитика, история, глазок у паролей, внутренние вкладки, кисть КТГ, программа: год и редактор клетки. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---- дашборд ---- */
.db-sub{font-size:13px;color:var(--ink3)}
.db-top{margin-bottom:16px}
.db-blk{margin-bottom:16px}
.db-blk .bd{padding:8px 20px 0}
table.dbt{font-size:13px;white-space:nowrap}
table.dbt th{font-size:12.5px;color:var(--ink3);padding:8px 8px;text-align:center;border-bottom:1px solid var(--line)}
table.dbt th.sub{font-size:11px;padding:4px 6px 8px;color:var(--ink3);text-transform:none;letter-spacing:0}
table.dbt th:first-child,table.dbt td:first-child{text-align:left;font-weight:600;padding-left:20px}
table.dbt td{padding:7px 8px;border-bottom:1px solid var(--line2);font-variant-numeric:tabular-nums}
table.dbt td.num{text-align:center}
table.dbt td.p{color:var(--ink3)}
table.dbt td.f{font-weight:700;color:var(--ink)}
table.dbt .z{color:var(--line);font-weight:400}
table.dbt tr.tot td{font-weight:600;background:var(--surface2);border-top:2px solid var(--line)}
table.dbt tr.pct td{font-weight:700;font-size:12.5px;color:var(--ink2);background:var(--surface2)}
table.dbt .cur{background:var(--brand-soft)}
table.dbt .yr{background:var(--surface2);font-weight:700}
table.dbt td.ok{color:var(--ok)}table.dbt td.warn{color:var(--warn)}table.dbt td.bad{color:var(--bad)}
table.dbt.month td:last-child,table.dbt.month th:last-child{padding-right:20px}
table.dbt .sticky{position:sticky;left:0;background:var(--surface);z-index:1}
table.dbt tr.tot .sticky,table.dbt tr.pct .sticky{background:var(--surface2)}
.pbar{display:inline-block;width:44px;height:7px;border-radius:4px;background:var(--muted-soft);vertical-align:middle;margin-right:8px;overflow:hidden}
.pbar i{display:block;height:100%;background:var(--brand)}.pbar i.ok{background:var(--ok)}.pbar i.warn{background:var(--warn)}.pbar i.bad{background:var(--bad)}
.ctl{margin:10px 20px 16px;font-size:13px;color:var(--ink2)}.ctl.bad{color:var(--bad)}.ctl.ok{color:var(--ok)}
.db-mini{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.mini{border:1px solid var(--line2);border-radius:12px;padding:12px 14px;cursor:pointer;transition:box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.mini:hover{box-shadow:0 6px 20px rgba(11,18,32,.10);transform:translateY(-1px);border-color:var(--brand)}
.mini h4{margin:0 0 2px;font-size:14px;font-weight:700;display:flex;align-items:center;gap:8px}
.mini h4 .ic{width:26px;height:26px;border-radius:7px;background:var(--brand-soft);color:var(--brand);display:grid;place-items:center;font-size:13px;flex:none}
.mini h4 .arr{margin-left:auto;color:var(--ink3);font-weight:400}
.mini .own{font-size:11.5px;color:var(--ink3);margin-bottom:6px}
.mini .rows div{display:flex;justify-content:space-between;gap:8px;font-size:13px;color:var(--ink2);padding:3px 0;border-bottom:1px dashed var(--line2)}
.mini .rows div:last-child{border-bottom:0}
.mini .rows b{font-variant-numeric:tabular-nums;color:var(--ink)}
.mini .rows b.ok{color:var(--ok)}.mini .rows b.warn{color:var(--warn)}.mini .rows b.bad{color:var(--bad)}
.chart svg{width:100%;height:200px;display:block}
.chart .gl{stroke:var(--line2);stroke-width:1}
.chart .ay{font-size:11px;fill:var(--ink3);text-anchor:end}
.chart .ax{font-size:12px;fill:var(--ink2);text-anchor:middle}.chart .ax.cur{fill:var(--brand);font-weight:700}
.chart .bv{font-size:11px;fill:var(--ink2);text-anchor:middle;font-weight:600}
.chart .curbg{fill:var(--brand-soft)}
.chart .bar.p{fill:#93A8D6}.chart .bar.f{fill:var(--brand)}.chart .bar.npv{fill:var(--bad)}.chart .bar.duty{fill:var(--warn)}
.clg{display:flex;gap:16px;font-size:12.5px;color:var(--ink2);padding:6px 0 10px}
.clg i{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:6px;vertical-align:-1px}
.clg i.p{background:#93A8D6}.clg i.f{background:var(--brand)}.clg i.npv{background:var(--bad)}.clg i.duty{background:var(--warn)}
@media (max-width:1100px){.db-mini{grid-template-columns:repeat(2,1fr)}.db-top{grid-template-columns:1fr}}
@media (max-width:640px){.db-mini{grid-template-columns:1fr}}

/* ---- история изменений ---- */
table.hist td{vertical-align:top}
table.hist td.wrap{white-space:normal;max-width:620px}
.hch{display:inline-block;background:var(--surface2);border-radius:7px;padding:3px 8px;margin:2px 4px 2px 0;font-size:12.5px;color:var(--ink2)}
.hch b{color:var(--ink3);font-weight:600}
.hch .arr{color:var(--brand);font-weight:700;margin:0 2px}
.hl.go{cursor:pointer;color:var(--brand);text-decoration:underline dotted;text-underline-offset:3px}
.lbl{font-size:13px;color:var(--ink3);display:inline-flex;align-items:center;gap:6px}
.dact{display:flex;gap:8px;flex-wrap:wrap}

/* ---- глазок у паролей ---- */
.pwrap{position:relative;display:block}
.pwrap input{width:100%;padding-right:40px;box-sizing:border-box}
.eye{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:0;background:none;cursor:pointer;color:var(--ink3);font-size:16px;line-height:1;padding:4px 6px;border-radius:6px}
.eye:hover{color:var(--ink);background:var(--surface2)}
.eye.on{color:var(--brand)}

/* ---- вкладки внутри экрана и полоска КТГ в карточке ---- */
.seg.tabs{margin-bottom:16px}
.kbar{display:flex;height:10px;border-radius:5px;overflow:hidden;background:var(--muted-soft);margin:8px 0 6px}
.kbar i{display:block;height:100%}.kbar i.ok{background:var(--ok)}.kbar i.warn{background:var(--warn)}.kbar i.bad{background:var(--bad)}.kbar i.brand{background:var(--brand)}
.dnote .ok{color:var(--ok)}.dnote .warn{color:var(--warn)}.dnote .bad{color:var(--bad)}

/* ---- КТГ: кисть и редактирование ---- */
.brushbar{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin:-6px 0 14px}
.seg.brush .lb{padding:0 10px;font-size:13px;color:var(--ink3);align-self:center}
.seg.brush button.on.L{background:var(--ok)}.seg.brush button.on.TR{background:var(--warn)}.seg.brush button.on.R{background:var(--bad)}.seg.brush button.on.TO{background:var(--brand)}.seg.brush button.on.none{background:var(--ink3)}
.brushbar .hint{font-size:12.5px;color:var(--ink2);line-height:1.45;flex:1;min-width:280px}
table.ktg.edit td.kc.ed{cursor:crosshair}
table.ktg.edit td.kc.ed:hover{outline:2px solid var(--ink);outline-offset:-2px;z-index:1;position:relative}
table.ktg th.dn.ed{cursor:pointer}table.ktg th.dn.ed:hover{background:var(--brand-soft);color:var(--brand)}
table.ktg{user-select:none}
/* ---- программа: год ---- */

/* ---- программа: редактор клетки, перетаскивание, заявки ---- */
.pop{position:absolute;z-index:40;background:var(--surface);border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 32px rgba(11,18,32,.18);padding:10px 12px;width:360px;animation:dlg-in var(--dur) var(--ease)}
.pop .ph{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:13.5px}
.pop .ph .x{margin-left:auto;border:0;background:none;font-size:18px;cursor:pointer;color:var(--ink3)}
.pop .pr{display:flex;gap:6px;align-items:center;margin-bottom:8px}
.pop .pr input{flex:1;border:1px solid var(--line);border-radius:8px;padding:7px 9px;font:inherit;font-size:14px;min-width:0}
.pop .pr input#pop-code{font-family:"JetBrains Mono",monospace;font-weight:600}
.pop .pr input:focus{outline:2px solid var(--brand);border-color:transparent}
.pop .ps{font-size:13px;color:var(--ink2);margin-bottom:8px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.pop .ps .ok{color:var(--ok);font-weight:600}.pop .ps .bad{color:var(--bad)}.pop .ps .brand{color:var(--brand);font-weight:600}
.pop .pk{font-size:11.5px;color:var(--ink3)}
.btn.sm{padding:5px 10px;font-size:12.5px}


/* пропуска техники по категориям: строка-группа сворачивается */
table.docs-tbl tr.grp td{background:var(--brand-band);cursor:pointer;user-select:none;padding:9px 12px;border-top:1px solid var(--line2)}
table.docs-tbl tr.grp .arr{display:inline-block;width:14px;color:var(--ink3);font-weight:700}
table.docs-tbl tr.grp b{color:var(--brand);margin-right:8px}
table.docs-tbl tr.grp .pill{margin-right:6px}

/* КТГ (24.09.2026): кнопки кисти окрашены всегда — это и легенда; выбранная — залита целиком, остальные — цветная точка */
.seg.brush button{position:relative;padding-left:22px}
.seg.brush button::before{content:"";position:absolute;left:8px;top:50%;width:10px;height:10px;margin-top:-5px;border-radius:3px;background:var(--ink3)}
.seg.brush button.L::before{background:var(--ok)}.seg.brush button.TR::before{background:var(--warn)}.seg.brush button.R::before{background:var(--bad)}.seg.brush button.TO::before{background:var(--brand)}
.seg.brush button.on::before{background:#fff}
.seg.knav b{padding:0 10px;min-width:130px;text-align:center;font-size:14px;align-self:center}
#k-edit.on{background:var(--brand-soft);color:var(--brand-dark);border-color:#B8C9EA}

/* program.css — Производственная программа: hero, сетка месяца, структура плана, год. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ================= Производственная программа: оформление ================= */
.pg-hero,.hero{position:relative;overflow:clip;border-radius:18px;padding:22px 26px;margin-bottom:16px;display:grid;grid-template-columns:minmax(200px,1fr) minmax(310px,auto) auto;gap:20px 22px;align-items:center;
  background:radial-gradient(55% 110% at 0% 0%,var(--hero-glow1),transparent 70%),radial-gradient(40% 90% at 100% 20%,var(--hero-glow2),transparent 70%),linear-gradient(135deg,var(--hero-a) 0%,var(--hero-b) 100%);
  color:#fff;box-shadow:var(--hero-shadow)}
/* зерно как на входе и в сайдбаре */
.pg-hero::before,.hero::before{content:"";position:absolute;inset:0;opacity:.07;mix-blend-mode:overlay;pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.pg-hero::after,.hero::after{content:"";position:absolute;left:-60px;bottom:-140px;width:360px;height:360px;border-radius:50%;background:radial-gradient(closest-side,rgba(233,30,35,.16),transparent 70%);pointer-events:none}
.pg-hero>*,.hero>*{position:relative}
.pg-kicker{display:none}   /* «Реестры · Персонал» дублировал сайдбар и заголовок шапки — убрано (15.09.2026) */
.pg-title{font-size:34px;font-weight:600;letter-spacing:-.025em;line-height:1.05;margin:0 0 6px}
.pg-sub{font-size:13px;opacity:.8;max-width:360px;line-height:1.4}
.pg-stats{display:grid;grid-template-columns:repeat(2,minmax(150px,250px));gap:10px}   /* плитки не шире 250px: длинная подпись обрезается, иначе шапка вылезала за левый край */
.pst{min-width:0;padding:10px 14px;border-radius:12px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.18);backdrop-filter:blur(6px)}
.pst .v{font-size:26px;font-weight:600;letter-spacing:-.02em;line-height:1.05;font-variant-numeric:tabular-nums}
.pst .v small{font-size:12px;font-weight:600;opacity:.8;margin-left:5px}
.pst .l{font-size:12.5px;font-weight:500;opacity:.8;margin-top:4px}   /* без капса — как на входе */
.pst .s{font-size:11.5px;opacity:.85;margin-top:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pst .s b{font-weight:700}
.pst .meter{margin-top:8px;height:5px;background:rgba(255,255,255,.2)}.pst .meter i{background:#fff}
.pst.ok .v{color:#BBF7D0}.pst.bad .v{color:#FECACA}.pst.warn .v{color:#FDE68A}
.pg-hero-r{display:flex;flex-direction:column;gap:10px;align-items:flex-end}
.seg.tabs.light{margin:0;border-color:rgba(255,255,255,.3);background:rgba(255,255,255,.1);flex-wrap:nowrap;white-space:nowrap}   /* вкладки всегда в одну строку; при нехватке места ужимаются плитки (minmax(310px,auto)), а не вкладки; overflow:clip — клик по вкладке шапку не прокручивает */
.seg.tabs.light button{color:rgba(255,255,255,.85);padding:8px 12px}.seg.tabs.light button.on{background:#fff;color:var(--brand)}
.seg.tabs.light button:not(.on):hover{background:rgba(255,255,255,.12)}
.pg-nav{display:inline-flex;align-items:center;gap:4px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.2);border-radius:999px;padding:4px}
.pg-nav b{min-width:150px;text-align:center;font-size:14.5px;letter-spacing:-.01em}
.pg-nav .nb{all:unset;cursor:pointer;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-size:18px;line-height:1;transition:background var(--dur) var(--ease)}
.pg-nav .nb:hover{background:rgba(255,255,255,.2)}
.pg-nav .nb.txt{width:auto;padding:0 12px;font-size:12.5px;font-weight:600;border-radius:999px}
.pg-bar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.pg-custs{display:flex;gap:4px;flex-wrap:wrap}
.pg-custs button{all:unset;cursor:pointer;padding:8px 12px;border-radius:10px;font-size:13.5px;font-weight:600;color:var(--ink2);display:inline-flex;align-items:center;gap:8px;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}
.pg-custs button .n{font-size:11.5px;font-weight:700;padding:1px 7px;border-radius:999px;background:var(--surface2);color:var(--ink3);font-variant-numeric:tabular-nums}
.pg-custs button:hover{background:var(--surface2);color:var(--ink)}
.pg-custs button.on{background:var(--brand);color:#fff}.pg-custs button.on .n{background:rgba(255,255,255,.22);color:#fff}
.pg-custs button.off{opacity:.55}
.pg-legend{font-size:12.5px;color:var(--ink2);display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap}
.pg-legend i{display:inline-block;width:14px;height:14px;border-radius:4px;margin-left:10px;border:1px solid transparent}
.pg-legend i.plan{background:var(--brand-soft);border-color:#B8C9EA}.pg-legend i.done{background:var(--ok-soft);border-color:#9AD9B4}.pg-legend i.over{background:var(--bad-soft);border-color:#F3B4B4}
.pg-legend i.rq{background:var(--brand-soft);border-color:#B8C9EA;position:relative}.pg-legend i.rq::after{content:"";position:absolute;right:2px;bottom:2px;width:5px;height:5px;border-radius:50%;background:var(--brand)}
.pg-card{overflow:hidden}
.pg-scroll{max-height:72vh;overflow:auto}
.pg-foot{padding:10px 20px;font-size:12.5px;color:var(--ink3);border-top:1px solid var(--line2);background:var(--surface2)}
/* сетка месяца */
table.pgrid{font-size:12.5px;border-collapse:separate;border-spacing:0;min-width:100%}
table.pgrid th{position:sticky;top:0;z-index:2;background:var(--surface);border-bottom:1px solid var(--line);font-size:12px;color:var(--ink3);font-weight:600;padding:8px 6px;text-align:left}
table.pgrid th.dn{text-align:center;min-width:44px;padding:6px 2px;line-height:1.15}
table.pgrid th.dn .wd{display:block;font-size:9.5px;font-weight:600;letter-spacing:.04em;opacity:.7}
table.pgrid th.dn .dd{display:block;font-size:13px;font-weight:600;color:var(--ink2);font-variant-numeric:tabular-nums}
table.pgrid th.dn.we{background:var(--surface2)}
table.pgrid th.dn.td{background:var(--brand);color:#fff;border-radius:8px 8px 0 0}table.pgrid th.dn.td .dd{color:#fff}
table.pgrid th.sticky,table.pgrid td.sticky{position:sticky;left:0;z-index:1;background:var(--surface);min-width:210px;max-width:280px;box-shadow:1px 0 0 var(--line2)}
table.pgrid th.sticky{z-index:3}
table.pgrid td{padding:0;border-bottom:1px solid var(--line2);vertical-align:middle;height:44px}
table.pgrid td.sticky{padding:6px 12px 6px 16px}
table.pgrid tr:hover td{background:var(--surface2)}table.pgrid tr:hover td.sticky{background:var(--surface2)}
table.pgrid .cl{display:flex;align-items:center;gap:8px}
table.pgrid .cl .num{font-weight:600;font-size:14px;letter-spacing:-.01em;color:var(--ink)}
table.pgrid .cl .wells{font-size:11.5px;color:var(--ink3);white-space:normal;line-height:1.25;max-width:170px}
table.pgrid .meta{font-size:11px;color:var(--ink3);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px}
table.pgrid td.pc{text-align:center;border-left:1px solid var(--line2);min-width:44px;position:relative}
table.pgrid td.pc.we{background:var(--surface2)}
table.pgrid td.pc.td{box-shadow:inset 2px 0 0 var(--brand),inset -2px 0 0 var(--brand)}
table.pgrid td.pc .op{display:inline-block;padding:3px 6px;border-radius:7px;font-family:"JetBrains Mono",monospace;font-size:11px;font-weight:700;line-height:1.2;border:1px solid transparent;position:relative;animation:view-in var(--dur) var(--ease)}
table.pgrid td.pc.plan .op{background:var(--brand-soft);color:var(--brand-dark);border-color:#B8C9EA}
table.pgrid td.pc.done .op{background:var(--ok-soft);color:var(--ok);border-color:#9AD9B4}
table.pgrid td.pc.done .op::before{content:"✓ ";font-size:10px}
table.pgrid td.pc.over .op{background:var(--bad-soft);color:var(--bad);border-color:#F3B4B4}
table.pgrid td.pc.rq .op::after{content:"";position:absolute;right:-3px;top:-3px;width:8px;height:8px;border-radius:50%;background:var(--brand);border:2px solid var(--surface)}
table.pgrid td.pc.ed{cursor:cell}
table.pgrid td.pc.ed:hover{background:var(--brand-soft)}
table.pgrid td.pc.ed:not(.plan):not(.done):not(.over):hover::after{content:"+";color:var(--brand);font-weight:700;opacity:.6}
table.pgrid td.pc[draggable]{cursor:grab}
table.pgrid td.pc.sel{outline:2px solid var(--brand);outline-offset:-2px;background:var(--brand-soft)}
table.pgrid td.pc.drop{outline:2px dashed var(--brand);outline-offset:-2px;background:var(--brand-soft)}
table.pgrid td.sum{padding:0 12px;min-width:110px;white-space:nowrap}
table.pgrid td.sum .pb{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink2);font-variant-numeric:tabular-nums}
table.pgrid td.sum .pb .meter{width:56px;height:6px}
table.pgrid td.sum .pb b{color:var(--ink)}
table.pgrid td.acts{white-space:nowrap;padding:0 12px 0 4px}
table.pgrid td.acts .lnk{opacity:0;transition:opacity var(--dur) var(--ease)}
table.pgrid tr:hover td.acts .lnk{opacity:1}
table.pgrid td.empty{padding:40px 20px;text-align:center;color:var(--ink3)}
/* структура плана */
.pg-struct{display:grid;gap:10px}
.pg-struct .row{display:grid;grid-template-columns:150px 1fr 120px;gap:14px;align-items:center;font-size:13px}
.pg-struct .row .nm{font-weight:700;color:var(--ink)}
.pg-struct .row .bar{display:flex;height:16px;border-radius:6px;overflow:hidden;background:var(--surface2)}
.pg-struct .row .bar i{display:block;height:100%;min-width:2px;transition:width var(--dur-slow) var(--ease)}
.pg-struct .row .tot{text-align:right;color:var(--ink2);font-variant-numeric:tabular-nums}
.pg-struct .row .tot b{color:var(--ink)}.pg-struct .row .tot .ok{color:var(--ok);font-weight:700}
.pg-struct .lg{display:flex;flex-wrap:wrap;gap:10px 16px;font-size:12px;color:var(--ink2);padding-top:6px;border-top:1px dashed var(--line2)}
.pg-struct .lg i{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:6px;vertical-align:-1px}
.t-n{background:#94A3B8}.t-k{background:#2563EB}.t-pr{background:#7C3AED}.t-ek{background:#033486}.t-x{background:#0891B2}.t-2kk{background:#DB2777}.t-v{background:#D97706}.t-m{background:#059669}
/* год */
table.pgy{font-size:12.5px;border-collapse:separate;border-spacing:0;min-width:100%}
table.pgy th{position:sticky;top:0;z-index:2;background:var(--surface);border-bottom:1px solid var(--line);font-size:12px;color:var(--ink3);font-weight:600;padding:9px 8px;text-align:left}
table.pgy th.mn{text-align:center;min-width:58px}
table.pgy th.mn.td{background:var(--brand);color:#fff;border-radius:8px 8px 0 0}
table.pgy th.mn.past{opacity:.6}
table.pgy th.sticky,table.pgy td.sticky{position:sticky;left:0;z-index:1;background:var(--surface);min-width:210px;max-width:320px;box-shadow:1px 0 0 var(--line2);overflow:hidden;text-overflow:ellipsis}
table.pgy th.sticky{z-index:3}
table.pgy td{padding:6px 8px;white-space:nowrap;vertical-align:middle;border-bottom:1px solid var(--line2)}
table.pgy tr.grp td{background:var(--brand-band);border-top:1px solid var(--line);font-weight:700}
table.pgy tr.grp td.sticky{background:var(--brand-band)}
table.pgy tr.tot td{background:var(--surface2);border-top:2px solid var(--line);font-weight:700}
table.pgy tr.tot td.sticky{background:var(--surface2)}
table.pgy td.yc{text-align:center;border-left:1px solid var(--line2);cursor:pointer;min-width:58px;font-variant-numeric:tabular-nums}
table.pgy td.yc .ch{display:inline-flex;align-items:baseline;gap:4px;padding:3px 8px;border-radius:999px;font-size:12px;font-weight:700;border:1px solid transparent;min-width:34px;justify-content:center}
table.pgy td.yc .ch i{font-style:normal;font-size:10px;font-weight:700}
table.pgy td.yc.plan .ch,table.pgy td.yc.part .ch{background:var(--brand-soft);color:var(--brand-dark);border-color:#B8C9EA}
table.pgy td.yc.done .ch{background:var(--ok-soft);color:var(--ok);border-color:#9AD9B4}
table.pgy td.yc.over .ch{background:var(--bad-soft);color:var(--bad);border-color:#F3B4B4}
table.pgy td.yc .ch i{color:var(--ok)}
table.pgy td.yc:hover{background:var(--brand-soft)}
table.pgy td .cl{font-weight:700}
/* программа: сетка без собственного окна по высоте (прокручивается страница), клетка куста не выпускает текст, строки компактнее */
.pg-scroll{max-height:none;overflow-x:auto;overflow-y:visible}
table.pgrid td{height:36px}
table.pgrid td.sticky{padding:4px 12px 4px 16px;overflow:hidden}
table.pgrid td.sticky .cl{display:flex;flex-wrap:wrap;gap:0 8px;align-items:baseline;min-width:0}
table.pgrid td.sticky .cl .num{white-space:nowrap}
table.pgrid td.sticky .cl .wells{font-size:11.5px;color:var(--ink2);font-weight:500;overflow-wrap:anywhere;word-break:break-word;max-width:100%;line-height:1.25}
table.pgrid .meta{max-width:100%}

/* календарь программы: нагрузка по дням, недели, группы заказчиков, компактный режим */
table.pgrid tr.load th{position:sticky;top:var(--pg-h1,37px);z-index:2;background:var(--surface);border-bottom:2px solid var(--line);padding:0;height:22px;text-transform:none;letter-spacing:0}
table.pgrid tr.load th.sticky{font-size:10.5px;color:var(--ink3);text-align:left;padding-left:16px;font-weight:600}
table.pgrid th.ld{position:relative;text-align:center;font-size:11px;font-weight:700;color:var(--ink2);font-variant-numeric:tabular-nums}
table.pgrid th.ld i{position:absolute;inset:3px 3px;border-radius:5px;background:var(--brand)}
table.pgrid th.ld span{position:relative;z-index:1}
table.pgrid th.ld.td{background:var(--brand-soft)}
table.pgrid th.dn.mon,table.pgrid td.pc.mon,table.pgrid th.ld.mon{border-left:2px solid var(--line)}
table.pgrid tr.grp td{background:var(--brand-band);cursor:pointer;user-select:none;height:34px}
table.pgrid tr.grp td.sticky{background:var(--brand-band);font-size:13px}
table.pgrid tr.grp .arr{display:inline-block;width:14px;color:var(--ink3);font-weight:700}
table.pgrid tr.grp b{color:var(--brand)}
table.pgrid tr.grp td.gbar{padding-left:10px;text-align:left}
table.pgrid td.pc .op.t-n{}
.pg-scroll.compact table.pgrid th.dn{min-width:28px;padding:5px 0}
.pg-scroll.compact table.pgrid th.dn .wd{display:none}
.pg-scroll.compact table.pgrid td.pc{min-width:28px}
.pg-scroll.compact table.pgrid td{height:30px}
.pg-scroll.compact table.pgrid td.pc .op{padding:2px 0;width:24px;text-align:center;font-size:10.5px}
.pg-scroll.compact table.pgrid td.sticky{min-width:190px;max-width:220px}
.pg-scroll.compact table.pgrid td.sticky .meta{display:none}
.pg-scroll.compact table.pgrid td.sum{min-width:80px}
.pg-scroll.compact table.pgrid td.sum .pb .meter{display:none}
/* строка нагрузки: подпись слева липкая и выше клеток дней, чтобы при прокрутке вбок они не наезжали */
table.pgrid tr.load th.sticky{left:0;z-index:5;background:var(--surface);box-shadow:1px 0 0 var(--line2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
table.pgrid tr.load th.ld{z-index:1}

/* «весь месяц» (23.09.2026): таблица по ширине экрана (fixed), день ≈ 27 px, буква типа операции; строка 30 px; подписи — в подсказке */
.pg-scroll.compact table.pgrid{table-layout:fixed;width:100%;min-width:0}
.pg-scroll.compact table.pgrid th.sticky,.pg-scroll.compact table.pgrid td.sticky{width:150px;min-width:0;max-width:none;padding:3px 8px 3px 12px}
.pg-scroll.compact table.pgrid th.dn,.pg-scroll.compact table.pgrid td.pc{min-width:0;padding:3px 0}
.pg-scroll.compact table.pgrid th.dn .dd{font-size:11.5px}

.pg-scroll.compact table.pgrid td.pc.done .op::before{content:""}
.pg-scroll.compact table.pgrid .cl{gap:4px}
.pg-scroll.compact table.pgrid .cl .num{font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pg-scroll.compact table.pgrid .cl .wells{display:none}
.pg-scroll.compact table.pgrid th.sum,.pg-scroll.compact table.pgrid td.sum{width:64px;min-width:0;padding:0 6px;font-size:11px}
.pg-scroll.compact table.pgrid th.acts,.pg-scroll.compact table.pgrid td.acts{width:30px;padding:0}
.pg-scroll.compact table.pgrid tr.load th{padding:2px 0;font-size:10.5px}
@media (max-width:1100px){.pg-scroll.compact table.pgrid{table-layout:auto;width:auto;min-width:100%}.pg-scroll.compact table.pgrid th.dn,.pg-scroll.compact table.pgrid td.pc{min-width:26px}}   /* узко — снова прокрутка вбок */
/* клетки «всего месяца» — залитые квадраты с белой буквой: читаются с любого расстояния */
.pg-scroll.compact table.pgrid td.pc .op{display:inline-grid;place-items:center;width:auto;min-width:22px;max-width:none;height:22px;padding:0 2px;border:0;border-radius:6px;font-size:10px;font-weight:700;color:#fff;letter-spacing:0;white-space:nowrap}
.pg-scroll.compact table.pgrid td.pc.plan .op{background:var(--brand);color:#fff}
.pg-scroll.compact table.pgrid td.pc.done .op{background:var(--ok);color:#fff}
.pg-scroll.compact table.pgrid td.pc.over .op{background:var(--bad);color:#fff}
.pg-scroll.compact table.pgrid td.pc.rq .op::after{right:-4px;top:-4px;width:9px;height:9px;background:#F59E0B}
.pg-scroll.compact table.pgrid td{height:32px}
.pg-scroll.compact table.pgrid td.pc.td{box-shadow:inset 1px 0 0 var(--brand),inset -1px 0 0 var(--brand);background:var(--brand-soft)}

/* план и факт двумя строками (23.09.2026): sticky-ячейка на две строки, подписи «план / факт» справа; факт — зелёные квадраты на реальные даты */
/* строки pg-plan / pg-fact и клетка pf-fact — не «pl» / «fc» / «f»: .fc в hero.css — чип inline-flex (строка факта выпадала из таблицы и не билась по столбцам): .f в forms.css — колонка формы (display:flex), .fact в hero.css — строка «факта» в «Сигнале» (display:grid); и квадрат факта сжимался (Эмин, 23.09.2026: «строчка факт скукоженная») */
/* td.sticky остаётся position:sticky (липкая колонка) — липкий элемент и так служит опорой для .pf; position:relative ломал закрепление (Эмин, 23.09.2026) */
table.pgrid td.sticky .pf{position:absolute;right:6px;top:0;bottom:0;display:flex;flex-direction:column;justify-content:space-around;font-size:9.5px;color:var(--ink3);letter-spacing:.03em;text-transform:uppercase;pointer-events:none}
table.pgrid tr.pg-fact td{height:26px;border-bottom:2px solid var(--line);background:color-mix(in srgb,var(--ok-soft) 45%,var(--surface))}   /* факт — зеленоватая полоса, между кустами линия толще (Эмин, 23.09.2026: «сильнее разделить план и факт») */
table.pgrid tr.pg-fact td.sticky,table.pgrid tr.pg-fact td.sum,table.pgrid tr.pg-fact td.acts{background:var(--surface)}
table.pgrid tr.pg-fact td.pc.we{background:color-mix(in srgb,var(--ok-soft) 55%,var(--surface2))}   /* выходные в строке факта — тот же зелёный оттенок, чуть темнее */
table.pgrid tr.pg-plan td.sticky,table.pgrid tr.pg-plan td.sum,table.pgrid tr.pg-plan td.acts{border-bottom:2px solid var(--line)}
table.pgrid td.sticky .pf span:last-child{color:var(--ok);font-weight:700}
table.pgrid tr.pg-plan td{border-bottom:1px dashed var(--line2)}
table.pgrid tr.pg-fact td.pc.pf-fact .op{background:var(--ok-soft);color:var(--ok);border-color:#9AD9B4}   /* «Подробно» — такая же плашка, как у выполненного плана; залитый квадрат — только в «Весь месяц» ниже */
.pg-scroll.compact table.pgrid tr.pg-fact td.pc.pf-fact .op{background:var(--ok);color:#fff;border-color:transparent}
table.pgrid tr.pg-fact td.pc.pf-fact .op i{font-style:normal;font-size:8px;margin-left:2px;opacity:.85}
.pg-scroll.compact table.pgrid tr.pg-fact td{height:32px}   /* строка факта такой же высоты, что и план */
.pg-scroll.compact table.pgrid tr.pg-fact td.pc .op{height:22px;min-width:22px}   /* квадрат факта — как квадрат плана, ровно под ним */
/* куст завершён: дни после даты — тусклые и штрихом, не редактируются */
table.pgrid td.pc.off,table.pgy td.yc.off{background:repeating-linear-gradient(-45deg,transparent 0 5px,var(--line2) 5px 6px);opacity:.55;cursor:default}
table.pgrid td.pc.off:hover{background:repeating-linear-gradient(-45deg,transparent 0 5px,var(--line2) 5px 6px)}
table.pgrid td.pc.off::after{content:none!important}
table.pgrid .cst{margin-top:2px}table.pgrid .cst .pill{font-size:10px;padding:0 6px}
table.pgrid td.acts .lnk{opacity:.7;font-size:16px;letter-spacing:.05em;line-height:1}table.pgrid tr:hover td.acts .lnk{opacity:1}
.pg-scroll.compact table.pgrid th.acts,.pg-scroll.compact table.pgrid td.acts{width:34px}
.prow-close .row3{display:grid;grid-template-columns:1fr 150px 1fr;gap:8px}
@media (max-width:700px){.prow-close .row3{grid-template-columns:1fr}}

/* режим правки (23.09.2026): «Править» → «Готово» подсвечена, пока правка включена */
#pg-mode.on{background:var(--brand-soft);color:var(--brand-dark);border-color:#B8C9EA}

/* hero.css — Шапки-баннеры всех экранов, графики, «Сегодня», иконки, происшествия. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* уже 1400px (ноутбук 1366/1280): заголовок и правая зона в первой строке, четыре плитки в ряд под ними — иначе пять вкладок «Персонала» не влезают */
@media (max-width:1400px){.pg-hero,.hero{grid-template-columns:minmax(200px,1fr) auto}.pg-hero .pg-hero-l,.hero .pg-hero-l{grid-column:1;grid-row:1}.pg-hero .pg-hero-r,.hero .pg-hero-r{grid-column:2;grid-row:1}.pg-hero .pg-stats,.hero .pg-stats{grid-column:1/-1;grid-row:2;grid-template-columns:repeat(4,minmax(0,1fr))}}
@media (max-width:1100px){.pg-hero,.hero{grid-template-columns:1fr;gap:14px}.pg-hero .pg-hero-r,.hero .pg-hero-r{grid-column:1;grid-row:auto;align-items:flex-start}.pg-hero .pg-stats,.hero .pg-stats{grid-row:auto;grid-template-columns:repeat(2,minmax(0,1fr))}.pg-title{font-size:28px}}
@media print{.pg-hero,.hero{box-shadow:none;background:#fff;color:#000;border:1px solid #ccc}.pg-scroll{max-height:none;overflow:visible}}

/* ---- шапки-баннеры на всех экранах ---- */
.hero{margin-bottom:16px}
.hero .pg-hero-l{min-width:220px}
.pst.click{cursor:pointer;transition:background var(--dur) var(--ease),transform var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.pst.click:hover{background:rgba(255,255,255,.2);transform:translateY(-1px)}
.pst.click.active{background:#fff;color:var(--brand);border-color:#fff}
.pst.click.active .v,.pst.click.active .l,.pst.click.active .s{color:var(--brand)}
.pst.click.active.ok .v{color:var(--ok)}.pst.click.active.bad .v{color:var(--bad)}.pst.click.active.warn .v{color:var(--warn)}
.pst .s .ok{color:#BBF7D0}.pst .s .bad{color:#FECACA}.pst .s .warn{color:#FDE68A}
.pst.click.active .s .ok{color:var(--ok)}.pst.click.active .s .bad{color:var(--bad)}.pst.click.active .s .warn{color:var(--warn)}
.pst .meter.ok i,.pst .meter.bad i,.pst .meter.warn i{background:#fff}
.pst.click.active .meter{background:var(--muted-soft)}.pst.click.active .meter i{background:var(--brand)}
.pst:empty{display:none}
.hero .pg-stats:empty{display:none}
.hero .pg-hero-r:empty{display:none}
.hero .hero-field{color:rgba(255,255,255,.85);font-size:13px;display:inline-flex;align-items:center;gap:8px}
.hero .search{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.3);color:#fff}
.hero .search::placeholder{color:rgba(255,255,255,.6)}
.hero .search:focus{outline:2px solid #fff;border-color:transparent}

/* ---- графики ---- */
.ch-box{padding:6px 16px 4px}
svg.ch{display:block;max-width:100%;height:auto;overflow:visible}
.ch-grid{stroke:var(--line2);stroke-width:1;stroke-dasharray:3 3}
.ch-ay{font-size:11px;fill:var(--ink3);text-anchor:end}
.ch-ax{font-size:12px;fill:var(--ink2);text-anchor:middle}.ch-ax.cur{fill:var(--brand);font-weight:700}
.ch-lb{font-size:12.5px;fill:var(--ink);text-anchor:end;font-weight:600}
.ch-val{font-size:11px;fill:var(--ink2);text-anchor:middle;font-weight:600;opacity:0;animation:ch-fade .4s var(--ease) forwards}
.ch-hv{font-size:11.5px;fill:var(--ink2);font-weight:700;opacity:0;animation:ch-fade .4s var(--ease) forwards}
.ch-cur{fill:var(--brand-soft);opacity:.7}
.ch-hl{fill:var(--ink);opacity:0;transition:opacity var(--dur) var(--ease)}.ch-hl.on{opacity:.05}
.ch-bar{transform-box:fill-box;transform-origin:bottom center;animation:ch-grow .6s var(--ease) both}
.ch-hbar{transform-box:fill-box;transform-origin:left center;animation:ch-grow-x .6s var(--ease) both}
.ch-legend{display:flex;flex-wrap:wrap;gap:8px 16px;font-size:12.5px;color:var(--ink2);padding:6px 0 8px;justify-content:center}
.ch-legend i{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:6px;vertical-align:-1px}
.ch-tip{position:absolute;z-index:60;background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:0 12px 24px rgba(15,23,42,.12);padding:8px 12px;font-size:12.5px;color:var(--ink2);pointer-events:none;min-width:140px}
.ch-tip .t{font-weight:700;color:var(--ink);margin-bottom:4px}
.ch-tip div{display:flex;align-items:center;gap:8px;white-space:nowrap}
.ch-tip div b{margin-left:auto;color:var(--ink);font-variant-numeric:tabular-nums}
.ch-tip div i{display:inline-block;width:9px;height:9px;border-radius:2px}
.ch-tip .x{margin-top:4px;color:var(--ink3);display:block}
.ch-donuts{display:grid;grid-template-columns:repeat(2,1fr);gap:10px 18px}
.ch-donut{display:flex;align-items:center;gap:12px}
.ch-ring-bg{fill:none;stroke:var(--muted-soft);stroke-width:14}
.ch-arc{fill:none;stroke-width:14;stroke-linecap:butt;animation:ch-arc .9s var(--ease) both}
.ch-dv{font-size:20px;font-weight:600;fill:var(--ink);text-anchor:middle;letter-spacing:-.02em}
.ch-dl{font-size:10px;fill:var(--ink3);text-anchor:middle;text-transform:uppercase;letter-spacing:.06em}
.ch-dleg{font-size:12.5px;color:var(--ink2);min-width:0}
.ch-dleg .ttl{font-weight:700;color:var(--ink);margin-bottom:4px;font-size:13.5px}
.ch-dleg div{display:flex;align-items:center;gap:6px;padding:1px 0}
.ch-dleg div b{margin-left:auto;padding-left:10px;color:var(--ink);font-variant-numeric:tabular-nums}
.ch-dleg i{display:inline-block;width:9px;height:9px;border-radius:2px;flex:none}
.ch-dleg .foot{color:var(--ink3);font-size:12px;margin-top:4px;display:block;white-space:normal}
@keyframes ch-grow{from{transform:scaleY(0)}to{transform:scaleY(1)}}
@keyframes ch-grow-x{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes ch-fade{to{opacity:1}}
@keyframes ch-arc{from{stroke-dasharray:0 10000}}
@media (prefers-reduced-motion:reduce){.ch-bar,.ch-hbar,.ch-arc,.ch-val,.ch-hv{animation:none;opacity:1}}
.card .hd .r.lnk{margin-left:auto;font-size:12.5px}
.db-tbl{border-top:1px solid var(--line2)}
/* ---- сводка «Сегодня»: компактнее ---- */
.legend-box.inner{margin:0 20px 8px;font-size:13px;color:var(--ink2);background:var(--surface2);border-radius:10px;padding:10px 14px;line-height:1.5}
.svc-compact .soon.live{padding:12px 14px}
.svc-compact .soon p,.svc-compact .soon .own{display:none}
.svc-compact .soon h4{font-size:14px;margin-bottom:2px}
.svc-compact .soon .nums{margin:8px 0 6px;gap:6px}
.svc-compact .soon .nums div{padding:6px 4px}
.svc-compact .soon .nums b{font-size:15px}
.svc-compact .soon .st{margin-top:4px;font-size:12px}
.svc-compact .soon .st .pill{display:none}
.svc{margin:22px 0 12px}
@media (max-width:900px){.ch-donuts{grid-template-columns:1fr}}

/* ---- «Сегодня»: визуальный итог и группы внимания ---- */
.facts{padding:6px 0 4px}
.fact{display:grid;grid-template-columns:132px 1fr;gap:12px;padding:9px 20px;align-items:start;border-bottom:1px solid var(--line2)}
.fact:last-child{border-bottom:0}
.fact.go{cursor:pointer}.fact.go:hover{background:var(--surface2)}
.fact .fk{font-size:13px;font-weight:600;color:var(--ink3);padding-top:3px}
.fbar{display:flex;height:12px;border-radius:6px;overflow:hidden;background:var(--muted-soft)}
.fbar i{display:block;height:100%;min-width:3px;transform-origin:left;animation:ch-grow-x .6s var(--ease) both}
.fbar i.ok,.fleg i.ok,.fc i.ok{background:var(--ok)}.fbar i.bad,.fleg i.bad{background:var(--bad)}.fbar i.warn,.fleg i.warn{background:var(--warn)}.fbar i.brand,.fleg i.brand{background:var(--brand)}.fbar i.mut,.fleg i.mut{background:#94A3B8}
.fleg{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:6px;font-size:12.5px;color:var(--ink2)}
.fleg i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px;vertical-align:0}
.fleg b{color:var(--ink)}
.fchips{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.fc{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:999px;font-size:12.5px;background:var(--surface2);color:var(--ink2);border:1px solid var(--line2)}
.fc b{color:var(--ink)}
.fc.ok{background:var(--ok-soft);color:var(--ok);border-color:transparent}.fc.ok b{color:var(--ok)}
.fc.bad{background:var(--bad-soft);color:var(--bad);border-color:transparent}.fc.bad b{color:var(--bad)}
.fc.warn{background:var(--warn-soft);color:var(--warn);border-color:transparent}.fc.warn b{color:var(--warn)}
.fc.brand{background:var(--brand-soft);color:var(--brand-dark);border-color:transparent}.fc.brand b{color:var(--brand-dark)}
.fc.muted{color:var(--ink3)}
.fmore{display:flex;align-items:center;gap:14px;padding:10px 20px 4px;font-size:12.5px;color:var(--ink3);border-top:1px solid var(--line2)}
.fmore .meta{margin:0;padding:0;border:0}
.prose{padding:6px 20px 12px}
.prose p{margin:0 0 8px;font-size:14.5px;line-height:1.5;color:var(--ink)}
.prose b{font-weight:600;color:var(--brand)}
.ag{border-bottom:1px solid var(--line2)}.ag:last-child{border-bottom:0}
.agh{display:flex;align-items:center;gap:10px;padding:10px 20px;cursor:pointer;user-select:none}
.agh:hover{background:var(--surface2)}
.agh .ic{width:28px;height:28px;border-radius:8px;background:var(--brand-soft);color:var(--brand);display:grid;place-items:center;font-size:14px;flex:none}
.agh b{font-size:14px}
.agh .pill{font-variant-numeric:tabular-nums}
.agh .agd{flex:1;min-width:0;font-size:12.5px;color:var(--ink3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.agh .arr{color:var(--ink3);transition:transform var(--dur) var(--ease)}
.ag.open .agh .arr{transform:rotate(180deg)}
.agl{display:none;padding:0 0 6px;background:var(--surface2)}
.ag.open .agl{display:block}
.agl .it{padding:8px 20px 8px 36px}
.agl .it+.it{border-top:1px solid var(--line2)}
.agl .it b{font-size:13.5px}.agl .it span{font-size:12.5px}

/* ---- иконки ---- */
.ico{width:18px;height:18px;flex:none;vertical-align:-4px}
.nav button .n{width:22px;height:22px;display:inline-grid;place-items:center;flex:none;color:inherit;opacity:.9}
.nav button.on .n{opacity:1}
.nav button .n .ico{width:19px;height:19px;vertical-align:0}
.btn .ico{width:15px;height:15px;margin-right:6px;vertical-align:-3px}
.soon h4 .ic .ico,.mini h4 .ic .ico,.agh .ic .ico{width:16px;height:16px;vertical-align:0}
#btn-import [data-ico]{display:inline-flex;align-items:center}

/* ---- сигнал (16.09.2026): сообщения по дням с полосой цвета направления; адресаты слева, «Написали боту» справа; диалог в карточке человека ---- */
.sg-filters{gap:10px 14px}
.sg-q{flex:1;min-width:220px;max-width:420px}
.sg-tabhint{margin:-6px 2px 10px}
/* карточка сообщения: главные действия под заголовком, редкие — в «⋯»; доставка и сроки — свёрнуты */
.sg-bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:2px 0 14px}
.sg-bar:empty{display:none}
.sg-menu{position:relative;margin-left:auto}
.sg-menu summary{list-style:none;min-width:40px;text-align:center;font-weight:700;letter-spacing:.1em}
.sg-menu summary::-webkit-details-marker{display:none}
.sg-menu-l{position:absolute;right:0;top:calc(100% + 6px);z-index:5;min-width:280px;background:var(--surface);border:1px solid var(--line2);border-radius:12px;box-shadow:var(--shadow-lg,0 12px 32px rgba(3,20,55,.18));padding:6px;display:grid}
.sg-menu-l button{all:unset;box-sizing:border-box;cursor:pointer;display:grid;gap:1px;padding:8px 10px;border-radius:8px}
.sg-menu-l button:hover,.sg-menu-l button:focus-visible{background:var(--surface2)}
.sg-menu-l b{font-size:14px;font-weight:600;color:var(--ink)}.sg-menu-l span{font-size:12px;color:var(--ink3)}
.sg-tpls{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}
.sg-tpl{all:unset;box-sizing:border-box;cursor:pointer;font-size:12.5px;padding:5px 10px;border-radius:999px;background:var(--surface2);border:1px solid var(--line2);color:var(--ink2)}
.sg-tpl:hover{border-color:var(--brand);color:var(--brand)}.sg-tpl:focus-visible{outline:2px solid var(--brand);outline-offset:1px}
.sg-route{margin-top:10px}
.sg-route summary{cursor:pointer;display:flex;gap:8px;align-items:baseline;padding:8px 0;list-style:none}
.sg-route summary::-webkit-details-marker{display:none}
.sg-route summary::before{content:"›";font-weight:700;transition:transform var(--dur) var(--ease)}
.sg-route[open] summary::before{transform:rotate(90deg)}
/* шапка «Сигнала» — тонкая: заголовок, строка чисел-фильтров, состояние бота (id сильнее общих .hero из staff.css) */
.sgk{all:unset;box-sizing:border-box;cursor:pointer;display:inline-flex;align-items:baseline;gap:6px;padding:6px 12px;border-radius:10px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.18);color:#fff;font-size:19px;font-weight:700;font-variant-numeric:tabular-nums;transition:background var(--dur) var(--ease)}
.sgk span{font-size:13px;font-weight:500;color:rgba(255,255,255,.82)}
.sgk:hover{background:rgba(255,255,255,.2)}.sgk:focus-visible{outline:2px solid #fff;outline-offset:2px}
.sgk.bad{color:#FECACA}.sgk.warn{color:#FDE68A}.sgk.ok{color:#BBF7D0}
.sgk.on{background:#fff;border-color:#fff;color:var(--brand)}.sgk.on span{color:var(--brand)}.sgk.on.bad{color:var(--bad)}
/* входящие: секции «Требуют действия» / «В работе», обработанные — свёрнуты */
.sg-sec{display:flex;align-items:baseline;gap:8px;margin:4px 0 8px;font-size:13px}
.sg-sec~.sg-sec{margin-top:18px}
.sg-sec b{font-weight:700;color:var(--ink2)}.sg-sec.need b{color:var(--bad)}
.sg-sec span,.sg-rest summary span{font-size:12px;font-weight:700;padding:1px 8px;border-radius:999px;background:var(--surface2);color:var(--ink3);font-variant-numeric:tabular-nums}
.sg-sec.need span{background:var(--bad-soft);color:var(--bad)}
.sg-allok{display:flex;align-items:center;gap:8px;padding:12px 14px;border-radius:12px;background:var(--ok-soft);color:var(--ok);font-weight:600;font-size:14px;margin-bottom:6px}
.sg-rest{margin-top:18px}
.sg-rest summary{cursor:pointer;display:flex;align-items:baseline;gap:8px;font-size:13px;color:var(--ink2);padding:8px 0;list-style:none}
.sg-rest summary::-webkit-details-marker{display:none}
.sg-rest summary::before{content:"›";display:inline-block;transition:transform var(--dur) var(--ease);font-weight:700}
.sg-rest[open] summary::before{transform:rotate(90deg)}
.sg-rest summary b{font-weight:700}
@media (max-width:760px){.sg-filters{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin:0 -14px 14px;padding:0 14px}.sg-filters::-webkit-scrollbar{display:none}.sg-filters .seg{flex:none}.sg-filters .seg button{white-space:nowrap}}
.hero .sg-botpill{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.25);color:#fff}
.sg-botpill{display:inline-flex;align-items:center;gap:7px;padding:4px 10px;border-radius:999px;font-size:12.5px;color:var(--ink2);background:var(--surface2);border:1px solid var(--line2);cursor:default;white-space:nowrap}
.sg-botpill i{width:8px;height:8px;border-radius:50%;background:var(--ink3)}
.sg-botpill.ok i{background:var(--ok);box-shadow:0 0 0 3px var(--ok-soft)}.sg-botpill.warn i{background:var(--warn);box-shadow:0 0 0 3px var(--warn-soft)}.sg-botpill.bad i{background:var(--bad);box-shadow:0 0 0 3px var(--bad-soft)}
.sg-day{display:flex;align-items:baseline;gap:8px;margin:18px 0 8px;font-size:13px;color:var(--ink3)}
.sg-day:first-child{margin-top:2px}
.sg-day b{font-weight:600;color:var(--ink2)}
.sg-list{display:grid;gap:10px}
.sg-list .sg-day{margin-bottom:-2px}
.sg-card{position:relative;background:var(--surface);border:1px solid var(--line2);border-radius:14px;box-shadow:var(--shadow);padding:12px 16px 12px 20px;cursor:pointer;overflow:hidden;
  transition:box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.sg-card::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--ink3)}
.sg-card.ot::before{background:var(--bad)}.sg-card.quality::before,.sg-card.risk::before{background:var(--warn)}.sg-card.idea::before{background:var(--ok)}
.sg-card:hover{box-shadow:0 8px 24px rgba(11,18,32,.10);transform:translateY(-1px);border-color:var(--line)}
.sg-card.closed{opacity:.7}
.sg-card .h{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.sg-card .sp,.sg-tr .sp{flex:1}
.sg-card .h b{font-size:15px;font-weight:600;color:var(--ink)}
.sg-card .place{font-size:13px;color:var(--ink2)}
.sg-card .t{font-size:12.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.sg-card .d{margin:6px 0 8px;font-size:13.5px;line-height:1.45;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.sg-card .foot{display:flex;align-items:center;gap:8px 14px;flex-wrap:wrap;font-size:12.5px;color:var(--ink2)}
.sg-card .from{display:inline-flex;align-items:center;gap:7px;font-weight:600;color:var(--ink)}
.sg-card .to{min-width:0;max-width:42%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sg-card .foot .btn.sm{margin-left:4px}
.sg-empty{display:flex;flex-direction:column;align-items:center;gap:6px;padding:48px 20px;text-align:center;color:var(--ink3);font-size:14px}
.sg-empty [data-ico]{display:flex;width:44px;height:44px;border-radius:50%;background:var(--surface2);align-items:center;justify-content:center;margin-bottom:6px}.sg-empty .ico{width:22px;height:22px}
.sg-empty b{font-weight:600;color:var(--ink2);font-size:15px}
.sg-empty.small{padding:22px 8px;font-size:13px}
/* адресаты: две колонки */
.sg-cols{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:start}
.sg-main,.sg-side{min-width:0}   /* иначе колонка растягивается по ширине таблицы и карточка вылезает за экран */
@media (min-width:1500px){.sg-cols{grid-template-columns:minmax(0,1fr) 320px}.sg-side{position:sticky;top:16px}.sg-side .sg-bots{grid-template-columns:1fr}}   /* две колонки только на широком экране: таблице нужно ~820 px */
.sg-rc-card .hd .r{display:inline-flex;align-items:center;gap:14px}
.sg-how-btn{font-size:13px;font-weight:600;color:var(--ink3)}.sg-how-btn:hover,.sg-how-btn.on{color:var(--brand)}
.sg-how{padding:14px 20px 0}
.sg-steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.sg-steps>div{display:flex;gap:10px;align-items:flex-start;background:var(--surface2);border-radius:12px;padding:12px 14px;font-size:13px;line-height:1.4;color:var(--ink2)}
.sg-steps>div>b{flex:none;width:24px;height:24px;border-radius:50%;background:var(--brand);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:600}
.sg-steps a{color:var(--brand)}
.sg-act{display:flex;align-items:center;gap:12px;padding:14px 20px 0;flex-wrap:wrap}
@media (max-width:1100px){.sg-steps{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:640px){.sg-steps{grid-template-columns:1fr}}
.sg-rc-card .tw{margin-top:12px;max-height:calc(100dvh - 150px);overflow:auto}   /* таблица шире карточки — прокрутка внутри; шапка и колонка «Кто» прилипают (Эмин, 23.09.2026) */
.sg-rt thead th{position:sticky;top:0;z-index:3}
.sg-rt th:first-child,.sg-rt td.rcp{position:sticky;left:0;z-index:2;background:var(--surface)}
.sg-rt thead th:first-child{z-index:4}
.sg-rt tbody tr:hover td{background:var(--surface2)}
.sg-rc-card .add{padding-left:0;padding-right:0}.sg-rc-card .add .ed{white-space:normal}
tr.row-off td{opacity:.55}
.sg-checks{display:flex;flex-wrap:wrap;gap:6px 18px}
.sg-rt th.c,.sg-rt td.c{text-align:center;width:50px;padding-left:3px;padding-right:3px}
.sg-rt td.click{cursor:pointer}
.sg-rt td.rcp{min-width:220px}   /* не .who — этот класс занят профилем в сайдбаре */
.sg-rt .who-w{display:flex;align-items:center;gap:10px}   /* flex — на обёртке, не на td: ячейка с display:flex ломала ширину колонки */
.sg-rt .who-w>div{min-width:0}.sg-rt td.rcp b{font-weight:600}
.sg-rt td.rcp .muted{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:240px}
.sg-flag{width:18px;height:18px;cursor:pointer;accent-color:var(--brand)}
.sg-flag:disabled{cursor:default}
.sg-prj{display:inline-block;margin:1px 4px 1px 0;padding:1px 8px;border-radius:999px;background:var(--surface2);font-size:12px;color:var(--ink2)}
/* схема 2: роль адресата, правила, ответ автору, схема во вкладке */
.sg-role{all:unset;box-sizing:border-box;display:inline-block;padding:3px 10px;border-radius:999px;border:1px solid var(--line);background:var(--surface);font-size:12px;font-weight:600;color:var(--ink2);cursor:pointer;white-space:nowrap;transition:background var(--dur) var(--ease),color var(--dur) var(--ease)}
.sg-role.esc{background:var(--warn-soft);color:var(--warn);border-color:transparent}
.sg-role:not(:disabled):hover{border-color:var(--brand);color:var(--brand)}.sg-role:disabled{cursor:default}
.sg-role:focus-visible{box-shadow:var(--ring)}
.sg-card.complaint::before,.sg-card.question::before{background:var(--brand)}
.sg-dot{position:absolute;right:-2px;bottom:-2px;width:11px;height:11px;border-radius:50%;box-shadow:0 0 0 2px var(--surface)}
.sg-dot.ok{background:var(--ok)}.sg-dot.warn{background:var(--warn)}
.sg-scheme-card .hd .r{margin-left:auto;font-size:13px;white-space:nowrap}
.sg-card.late{border-color:var(--bad-soft)}
.sg-ans{margin:0 0 8px;padding:8px 12px;border-radius:10px;background:var(--ok-soft);font-size:13px;color:var(--ink)}
.sg-ans b{display:inline;font-weight:600;margin-right:6px;color:var(--ok)}
.sg-answer{margin:12px 0 4px}
.sg-answer label{display:block;font-size:13.5px;margin-bottom:6px}
.sg-answer textarea{width:100%;box-sizing:border-box;border:1px solid var(--line);background:var(--surface);border-radius:10px;padding:9px 11px;font:inherit;font-size:14px;color:var(--ink);resize:vertical}
.sg-answer textarea:focus{outline:none;border-color:var(--brand);box-shadow:var(--ring)}
.sg-answer .dact{margin-top:8px}
.dnote .warn{color:var(--warn)}
.sg-rules-card{margin-top:16px}
.sg-rules{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px 22px}
.sg-rule{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--ink2)}
.sg-rule span{flex:1}.sg-rule b{font-weight:600;color:var(--ink);white-space:nowrap}
.sg-rule input{width:76px;border:1px solid var(--line);background:var(--surface);border-radius:8px;padding:6px 8px;font:inherit;font-size:14px;color:var(--ink);text-align:center}
.sg-rule input[type=time]{width:110px}
.sg-rule input:focus{outline:none;border-color:var(--brand);box-shadow:var(--ring)}
.sg-rule i{font-style:normal;font-size:12.5px;color:var(--ink3);min-width:26px}
.sg-rules-f{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:12px}.sg-rules-f .btn{margin-left:auto}
.sg-scheme-card .hd{padding-bottom:12px}
#sg-scheme-frame{display:block;width:100%;height:900px;border:0;border-top:1px solid var(--line2);background:transparent}
.sg-role-pick{flex-direction:column;gap:6px}
/* «Написали боту»: две группы, плитки в колонку; на аватаре — число сообщений */
.sg-grp+.sg-grp{margin-top:18px}
.sg-more{display:block;margin-top:14px;font-size:13px}
.sg-pt tr.click{cursor:pointer}.sg-pt tr.click:hover td{background:var(--surface2)}
.sg-pt td{vertical-align:middle}.sg-pt .nw{white-space:nowrap;font-variant-numeric:tabular-nums}
.sg-pt .who-w .pill{margin-left:auto}.sg-pc .pill{margin:2px 4px 2px 0}
#sg-p-q{min-width:260px}
.sg-grp-h{display:flex;align-items:baseline;gap:8px;margin:0 0 2px}
.sg-grp-h b{font-size:14px;font-weight:600;color:var(--ink)}
.sg-grp-h .n{font-size:12px;font-weight:600;padding:1px 8px;border-radius:999px;background:var(--surface2);color:var(--ink3);font-variant-numeric:tabular-nums}
.sg-grp.free .sg-grp-h .n{background:var(--warn-soft);color:var(--warn)}
.sg-grp>.muted{margin-bottom:8px;line-height:1.35}
.sg-bots{display:grid;gap:6px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}
.sg-bot{all:unset;box-sizing:border-box;display:flex;gap:11px;align-items:center;min-width:0;padding:8px 10px;border:1px solid var(--line2);border-radius:12px;background:var(--surface);cursor:pointer;
  transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease)}
.sg-bot:hover{border-color:var(--brand);box-shadow:0 6px 18px rgba(11,18,32,.08);transform:translateY(-1px)}
.sg-bot:focus-visible{box-shadow:var(--ring)}
.sg-bot-arr{margin-left:auto;color:var(--ink3);font-size:18px;line-height:1;opacity:0;transition:opacity var(--dur) var(--ease)}
.sg-bot:hover .sg-bot-arr{opacity:1}
.sg-ava-w{position:relative;display:inline-flex;flex:none}
.sg-cnt{position:absolute;right:-5px;bottom:-4px;min-width:18px;height:18px;padding:0 5px;box-sizing:border-box;border-radius:9px;background:var(--brand);color:#fff;font-size:11px;font-weight:700;font-style:normal;line-height:18px;text-align:center;box-shadow:0 0 0 2px var(--surface)}
.sg-bot-t{min-width:0;display:flex;flex-direction:column;line-height:1.3}
.sg-bot-t b{font-size:13.5px;font-weight:600;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sg-bot-t span{font-size:12px;color:var(--ink3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sg-ava{width:40px;height:40px;border-radius:50%;object-fit:cover;flex:none;background:var(--surface2)}
.sg-ava.ph{display:inline-flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;color:var(--ink2)}
.sg-ava.sm{width:30px;height:30px;font-size:11.5px}
.sg-ava.ph.off{background:transparent;border:1px dashed var(--line);color:var(--ink3)}
.sg-ava.xl{width:72px;height:72px;font-size:24px}
/* выбор аккаунта MAX в форме адресата — плитки с фото */
.sg-userpick{display:grid;gap:4px;max-height:236px;overflow:auto;padding:4px;margin:2px 0 8px;border:1px solid var(--line2);border-radius:12px;background:var(--surface2)}
.sg-pick-u{all:unset;box-sizing:border-box;display:flex;gap:10px;align-items:center;padding:6px 8px;border-radius:9px;cursor:pointer;background:var(--surface);border:1px solid transparent;transition:border-color var(--dur) var(--ease),background var(--dur) var(--ease)}
.sg-pick-u:hover{border-color:var(--line)}
.sg-pick-u.on{border-color:var(--brand);box-shadow:inset 0 0 0 1px var(--brand);background:var(--brand-soft)}
.sg-pick-u.taken{opacity:.6}.sg-pick-u.none{background:transparent}
.sg-pick-u:focus-visible{box-shadow:var(--ring)}
/* карточка человека и сообщения в боковой панели */
.sg-dh{display:flex;gap:16px;align-items:center}.sg-dh h3{margin:0 0 4px}.sg-dh a{display:inline-flex;border-radius:50%}
.sg-dh-t .pill{vertical-align:2px}.sg-dh-t h3{margin-top:8px}
.sg-from{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--line2);border-radius:12px;margin:4px 0 10px}
.sg-from>div{flex:1;min-width:0}.sg-from b{font-weight:600}
.sg-to{padding:2px 0}.sg-to.ok::before{content:"✓ ";color:var(--ok)}.sg-to.bad{color:var(--bad)}
.sg-chat{margin-top:14px;display:flex;flex-direction:column;gap:6px}
.sg-chat .sg-day{justify-content:center;margin:12px 0 6px}
.sg-chat .sg-day b{font-size:12px;font-weight:600;color:var(--ink3);background:var(--surface2);padding:2px 10px;border-radius:999px}
.sg-msg{position:relative;max-width:88%;padding:8px 12px;border-radius:14px;font-size:13.5px;line-height:1.45;color:var(--ink)}
.sg-msg .b{white-space:pre-wrap;word-break:break-word}
.sg-msg .t{display:block;margin-top:3px;font-size:11px;color:var(--ink3);text-align:right;font-variant-numeric:tabular-nums}
.sg-msg.out{align-self:flex-start;background:var(--surface2);border-bottom-left-radius:4px;color:var(--ink2)}
.sg-msg.in{align-self:flex-end;background:var(--brand-soft);border-bottom-right-radius:4px}
.sg-msg.in.btn{background:transparent;padding:2px 0}
.sg-msg.in.btn .chip{display:inline-block;padding:5px 12px;border-radius:999px;border:1px solid var(--brand);color:var(--brand);font-size:13px;font-weight:600}
.sg-msg.in.btn .t{display:inline;margin-left:8px}
.sg-msg.sys{align-self:center;max-width:100%;padding:2px 10px;font-size:12px;color:var(--ink3);background:transparent}
.sg-msg.sys .t{display:inline;margin-left:6px}
.sg-msg.long{cursor:pointer}.sg-msg.long .b{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.sg-msg.long.open .b{display:block}
.sg-chat .sg-tr{align-self:stretch;margin:4px 0}
.sg-tr{padding:10px 12px;border:1px solid var(--line2);border-left-width:4px;border-radius:12px;background:var(--surface);cursor:pointer;transition:border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.sg-tr.ot{border-left-color:var(--bad)}.sg-tr.quality,.sg-tr.risk{border-left-color:var(--warn)}.sg-tr.idea{border-left-color:var(--ok)}
.sg-tr:hover{box-shadow:0 4px 14px rgba(11,18,32,.08)}
.sg-tr .h{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.sg-tr .h b{font-size:14px;font-weight:600;color:var(--ink)}
.sg-tr .h .t{font-size:11.5px;color:var(--ink3)}
.sg-tr .d{margin-top:6px;font-size:13.5px;line-height:1.45;color:var(--ink2);display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.sg-tr .s{margin-top:6px;font-size:12.5px}.sg-tr .s .ok{color:var(--ok)}.sg-tr .s .bad{color:var(--bad)}

/* ---- происшествия ---- */
.inc-list{display:grid;gap:10px}
.inc{background:var(--surface);border:1px solid var(--line2);border-radius:14px;box-shadow:var(--shadow);padding:12px 16px;cursor:pointer;transition:box-shadow var(--dur) var(--ease),transform var(--dur) var(--ease)}
.inc:hover{box-shadow:0 6px 20px rgba(11,18,32,.10);transform:translateY(-1px)}
.inc.closed{opacity:.8}
.inc-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.inc-h b{font-size:14.5px}
.inc-place{color:var(--ink2);font-size:13.5px}
.inc-d{margin-top:6px;font-size:13.5px;color:var(--ink);line-height:1.45}
.inc-f{margin-top:6px;display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12.5px;color:var(--ink2)}
.inc-text{white-space:pre-wrap;font-family:inherit;font-size:13.5px;line-height:1.5;background:var(--surface2);border-radius:10px;padding:12px 14px;margin:10px 0;color:var(--ink)}
.dlg.wide{width:min(760px,100%)}


/* ---- полоса внутренних вкладок под шапкой (решение Эмина 09.09: вкладки не в шапке, а отдельной полосой со счётчиками) ---- */
.tabstrip{display:flex;gap:2px;margin:-4px 0 14px;border-bottom:1px solid var(--line2);overflow-x:auto;scrollbar-width:none}
.tabstrip::-webkit-scrollbar{display:none}
.tabstrip button{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:8px;padding:10px 14px 9px;font-size:14px;font-weight:600;color:var(--ink2);border-bottom:2px solid transparent;white-space:nowrap;transition:color var(--dur) var(--ease),border-color var(--dur) var(--ease),background var(--dur) var(--ease)}
.tabstrip button:hover{color:var(--ink);background:var(--surface2);border-radius:8px 8px 0 0}
.tabstrip button.on{color:var(--brand);border-bottom-color:var(--brand)}
.tabstrip .n{font-size:11.5px;font-weight:700;padding:1px 7px;border-radius:999px;background:var(--surface2);color:var(--ink3);font-variant-numeric:tabular-nums}
.tabstrip .n.bad{background:var(--bad-soft);color:var(--bad)}.tabstrip .n.warn{background:var(--warn-soft);color:var(--warn)}.tabstrip .n.ok{background:var(--ok-soft);color:var(--ok)}
.tabstrip button.on .n{background:var(--brand-soft);color:var(--brand)}.tabstrip button.on .n.bad{background:var(--bad-soft);color:var(--bad)}
@media (max-width:700px){.tabstrip button{padding:9px 10px;font-size:13px}}
.tabstrip .strip-r{margin-left:auto;display:flex;gap:8px;align-items:center;padding:2px 0 6px}
.tabstrip .strip-r .pg-nav b{min-width:130px}
.fact .fbd{min-width:0}

/* ТБ и ОТ: прогресс по замечаниям и чек-лист в карточке предписания */
.sfp{display:inline-flex;align-items:center;gap:8px;min-width:96px}
.sfp i{flex:1;height:6px;border-radius:3px;background:var(--line2);position:relative;overflow:hidden;display:block;min-width:40px}
.sfp i{width:auto!important}
.sfp i::before{content:"";position:absolute;left:0;top:0;bottom:0;width:var(--w,0);background:var(--warn);border-radius:3px}
.sfp.ok i::before{background:var(--ok)}
.sfp b{font:600 12px/1 var(--mono);color:var(--ink2)}
.sfp.ok b{color:var(--ok)}
.sfh{display:flex;align-items:center;gap:10px;margin:14px 0 6px;font-size:14px}
.sfh .sfp{margin-left:auto}
.sfl{list-style:none;margin:0 0 6px;padding:0;display:grid;gap:4px}
.sfl li{display:flex;gap:10px;align-items:flex-start;padding:8px 10px;border:1px solid var(--line2);border-radius:10px;background:var(--surface);font-size:13.5px}
.sfl.ed li{cursor:pointer}
.sfl.ed li:hover{border-color:var(--brand)}
.sfl li.done{opacity:.72}
.sfl li.done .tx{text-decoration:line-through;text-decoration-color:var(--ink3)}
.sfl .bx{flex:none;width:18px;height:18px;border:1.5px solid var(--ink3);border-radius:5px;display:flex;align-items:center;justify-content:center;font-size:12px;color:#fff;margin-top:1px}
.sfl li.done .bx{background:var(--ok);border-color:var(--ok)}
.sfl .tx small{display:block;color:var(--ink3);font-size:12px;margin-top:2px}
.dnote.ok{border-color:var(--ok);background:var(--ok-soft,#e3f3e8)}
@media (max-width:760px){.sg-rt td.rcp{min-width:150px;max-width:150px}.sg-rt td.rcp .muted{display:none}.sg-rt td.rcp b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;max-width:105px}.sg-rt th.c,.sg-rt td.c{width:46px}.sg-rc-card .tw{max-height:calc(100dvh - 210px)}}   /* телефон: колонка «Кто» уже, чтобы было видно несколько галочек */
@media (max-width:760px){.sg-pt td .muted.sm{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;max-width:160px}.sg-pt .who-w b{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px;display:block}}

/* числа в шапке «Сигнала» — просто показатели, не кнопки (24.09.2026) */
#app span.sgk{cursor:default}#app span.sgk:hover{background:rgba(255,255,255,.12);transform:none}

/* staff.css — Персонал: расстановка, график, структура и ШР, реестр по подразделениям. Порядок подключения файлов задан в app/web.py (CSS_FILES) и важен для каскада. */
/* ---- персонал: расстановка ---- */
.board{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:12px}
.board.side{grid-template-columns:2fr 1fr}
.fb{background:var(--surface);border:1px solid var(--line2);border-radius:14px;box-shadow:var(--shadow);padding:12px 14px;min-width:0;transition:box-shadow var(--dur) var(--ease),border-color var(--dur) var(--ease)}
.fb.on{border-top:3px solid var(--ok)}.fb.off{opacity:.6}
.fb.drop{border-color:var(--brand);box-shadow:var(--ring);background:var(--brand-soft)}
.fbh{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:13.5px}
.fbh b{font-size:15px}
.fr{display:grid;grid-template-columns:118px 1fr;gap:8px;align-items:start;padding:5px 0;border-top:1px dashed var(--line2)}
.frl{font-size:12.5px;color:var(--ink3);font-weight:600;padding-top:5px}
.frl small{display:block;font-size:11px;font-weight:600;text-transform:none;letter-spacing:0;color:var(--ink3)}
.frs{display:flex;flex-wrap:wrap;gap:6px}
.pe{display:inline-flex;align-items:center;gap:6px;padding:4px 9px;border-radius:999px;background:var(--surface2);border:1px solid var(--line2);font-size:12.5px;cursor:pointer;max-width:100%;transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.pe:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(11,18,32,.10)}
.pe[draggable]{cursor:grab}
.pe .dot{width:8px;height:8px;border-radius:50%;background:var(--ink3);flex:none}
.pe.ok .dot{background:var(--ok)}.pe.bad .dot{background:var(--bad)}.pe.warn .dot{background:var(--warn)}.pe.brand .dot,.pe.acc .dot{background:var(--brand)}.pe.mut .dot{background:#94A3B8}
.pe.mut b{color:var(--ink3);font-weight:600}
.pe.vac{border-style:dashed;color:var(--bad);background:var(--bad-soft);border-color:#F3B4B4;cursor:default;font-weight:600}
.pe .pp{font-weight:700;font-size:11px;padding:0 5px;border-radius:5px}.pe .pp.bad{background:var(--bad-soft);color:var(--bad)}.pe .pp.warn{background:var(--warn-soft);color:var(--warn)}
.pe .nx{font-size:10.5px;color:var(--ink3);white-space:nowrap}
.fb.res .frs.wrap{gap:6px}
/* ---- персонал: график ---- */
.pg-nav.dark{background:var(--surface);border-color:var(--line);color:var(--ink)}
.pg-nav.dark .nb:hover{background:var(--surface2)}
table.cal td.kc{color:#fff;font-size:10.5px;min-width:24px}
table.cal td.kc.st-ok{background:var(--ok)}table.cal td.kc.st-mut{background:#CBD5E1;color:var(--ink2)}table.cal td.kc.st-brand,table.cal td.kc.st-acc{background:var(--brand)}
table.cal td.kc.st-warn{background:var(--warn)}table.cal td.kc.st-bad{background:var(--bad)}table.cal td.kc.st-none{background:var(--muted-soft);color:var(--ink3)}
table.cal .nm{font-weight:700;color:var(--ink)}
.legend-k i.st-ok{background:var(--ok)}.legend-k i.st-mut{background:#CBD5E1}.legend-k i.st-brand{background:var(--brand)}.legend-k i.st-warn{background:var(--warn)}.legend-k i.st-bad{background:var(--bad)}
.seg.brush button.on.none{background:#64748B}
@media (max-width:1100px){.board{grid-template-columns:repeat(2,1fr)}.board.side{grid-template-columns:1fr}}
@media (max-width:640px){.board{grid-template-columns:1fr}.fr{grid-template-columns:1fr}}

/* ---- внутренние вкладки: мягкое появление панели, шапка не прыгает ---- */
@keyframes pane-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.pane-in{animation:pane-in .22s var(--ease)}
.hero .pg-hero-l{min-height:96px}
.hero .pg-title{min-height:1.1em}
.hero .pg-stats{min-height:96px;align-content:start}
.hero .pg-hero-r{min-height:40px}
table.pgrid td.pc .op{animation:none}
.fbar i{animation:none}
.pe{transition:none}
.seg.tabs button{transition:background .15s var(--ease),color .15s var(--ease)}
@media (prefers-reduced-motion:reduce){.pane-in{animation:none}}
/* шапка: заголовок и подзаголовок всегда занимают по две строки — высота не скачет при смене вкладок */
.hero .pg-title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:1.05em;line-height:1.05}   /* место под одну строку: с двумя под коротким заголовком зияла дыра */
.hero .pg-sub{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.8em;line-height:1.4}
.hero .pg-hero-l{min-height:0}
/* плитки и правая зона шапки одинаковой высоты на всех вкладках */
.pst{min-height:92px;display:flex;flex-direction:column}
.pst .s{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.6em;white-space:normal}
.hero .pg-hero-r{min-height:98px;justify-content:flex-start}
.hero .pg-stats,.pg-hero .pg-stats{grid-auto-rows:minmax(104px,auto)}
.pst{min-height:104px}
.pst .meter{margin-top:auto}
/* плитки фиксированной высоты — шапка одинакова на всех внутренних вкладках */
.hero .pg-stats,.pg-hero .pg-stats{grid-auto-rows:118px}
.pst{height:118px;min-height:0;overflow:hidden;box-sizing:border-box}
.pg-nav{flex-wrap:nowrap;white-space:nowrap}
.pg-hero .pg-hero-r{min-height:98px}

/* ---- структура и ШР ---- */
.org-card .tw{padding:16px 20px 8px;overflow:auto}
.org-root{display:flex;justify-content:center;margin-bottom:14px}
.org-gd{display:inline-flex;align-items:center;gap:12px;background:linear-gradient(135deg,var(--hero-a) 0%,var(--hero-b) 100%);color:#fff;border-radius:12px;padding:10px 18px;font-size:15px;box-shadow:0 8px 20px rgba(3,52,134,.25)}
.org-gd .oc.big{color:#fff;font-size:18px}
.org-gd .muted{color:rgba(255,255,255,.7)}
.org-gd .btn{background:rgba(255,255,255,.14);color:#fff;border-color:rgba(255,255,255,.3)}
/* блоки всегда в один ряд под общей линией (как на схеме); если не влезают — горизонтальная прокрутка, а не перенос: у перенесённых блоков линии шли «в никуда» */
.org-blocks{display:flex;flex-wrap:nowrap;gap:12px;align-items:flex-start;overflow:visible;padding-bottom:8px;width:max-content;min-width:100%}   /* прокручивается весь #org-tree целиком (с директором и линиями), масштаб — css zoom */
.org-blocks>.ob{flex:0 0 250px;max-width:250px}   /* обычные блоки узкие и одинаковые, широкие (УЦС, МТЭС) — по содержимому */
.ob{border:2px solid var(--bc);border-radius:14px;background:var(--surface);min-width:0;transition:box-shadow var(--dur) var(--ease)}
.ob.drop,.ou.drop,.op-row.drop{box-shadow:var(--ring);background:var(--brand-soft)}
.obh{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:2px solid var(--bc);color:var(--bc)}
.obh b{font-size:14px;line-height:1.2;flex:1}
.obb{padding:8px}
.ou{border:1px solid var(--line2);border-radius:10px;margin:6px 0;background:var(--surface)}
.ou.d2{margin:4px 0 4px 8px}.ou.d3{margin:3px 0 3px 8px;border-style:dashed}
.ouh{display:flex;align-items:center;gap:6px;padding:7px 9px;cursor:pointer;font-size:13px}
.ouh:hover{background:var(--surface2)}
.ouh b{flex:1;line-height:1.25}
.ouh .arr{width:12px;color:var(--ink3);font-size:11px;transition:transform var(--dur) var(--ease);display:inline-block}
.ou:not(.open)>.ouh .arr{transform:rotate(-90deg)}
.ou:not(.open)>.oub{display:none}
.ouh .note{font-size:11px;color:var(--ink3);flex-basis:100%;order:9;line-height:1.3}
.oub{padding:0 6px 6px}
.op-row{display:flex;align-items:center;gap:6px;padding:4px 8px 4px 22px;font-size:12.5px;color:var(--ink2);border-radius:6px}
.op-row.ed{cursor:pointer}.op-row.ed:hover{background:var(--surface2)}
.op-row .on{flex:1;line-height:1.3}
.oc{font-weight:600;font-variant-numeric:tabular-nums;color:var(--ink);white-space:nowrap;padding:1px 6px;border-radius:6px}
.oc.warn{background:var(--warn-soft);color:var(--warn)}
.oc small{font-weight:600;font-size:11px;margin-left:1px}.oc small.ok{color:var(--ok)}.oc small.bad{color:var(--bad)}
.ob .oc.big{font-size:16px;color:var(--bc)}
[draggable] .oc{cursor:pointer}
.mini-add{all:unset;cursor:pointer;width:20px;height:20px;border-radius:6px;display:inline-grid;place-items:center;color:var(--ink3);font-weight:700;line-height:1}
.mini-add:hover{background:var(--brand-soft);color:var(--brand)}
.ou [draggable],.ob[draggable]{cursor:grab}
@media print{.org-blocks{flex-wrap:wrap;overflow:visible}.ob::before,.ob::after,.org-root::after{display:none}.ou:not(.open)>.oub{display:block}.ouh .arr{display:none}}

/* ---- структура: линии от директора к блокам, перенос длинных названий ---- */
.org-root{position:relative;margin-bottom:0;padding-bottom:26px}
.org-root::after{content:"";position:absolute;left:50%;bottom:0;width:2px;height:26px;background:var(--line)}
.org-blocks{position:relative;padding-top:18px}
/* горизонтальная линия собирается из отрезков над каждым блоком: от центра первого до центра последнего, с перекрытием зазоров */
.ob::after{content:"";position:absolute;left:-12px;right:0;top:-18px;height:2px;background:var(--line)}
.ob:first-child::after{left:50%}.ob:last-child::after{right:50%}
.ob{position:relative}
.ob::before{content:"";position:absolute;left:50%;top:-18px;width:2px;height:18px;background:var(--line)}
.ob,.ou,.op-row,.obh b,.ouh b,.op-row .on{min-width:0;overflow-wrap:anywhere;word-break:break-word}
.ouh{flex-wrap:wrap}
.ouh b{flex:1 1 60%}
.ouh .oc,.obh .oc{flex:none}
.obh{flex-wrap:wrap}
.op-row .on{white-space:normal}

/* должности при генеральном директоре — плашка справа с линией, как на схеме */
.org-root{gap:0;align-items:center}
.org-asides{display:flex;align-items:center;gap:8px;margin-left:34px;position:relative}
.org-asides::before{content:"";position:absolute;left:-34px;top:50%;width:34px;height:2px;background:var(--line)}
.org-aside{border:2px solid var(--brand);border-radius:10px;padding:6px 12px;background:var(--surface);display:inline-flex;gap:10px;align-items:center;font-size:13px;font-weight:600;color:var(--brand)}
.org-aside .on{white-space:nowrap}

/* ---- реестр персонала столбиком по структуре ---- */
.eg{border-bottom:1px solid var(--line2)}
.egh{display:flex;align-items:center;gap:10px;padding:10px 20px;background:var(--brand-band);font-size:14px;flex-wrap:wrap;position:sticky;top:0;z-index:1;cursor:pointer;user-select:none}
.egh:hover{filter:brightness(.97)}
.egh .arr{width:14px;color:var(--ink3);font-weight:700;text-align:center}
.eg.closed .egh{position:static}
.seg.sm button{padding:6px 10px;font-size:12.5px}
.egh .egp{font-size:12.5px;color:var(--ink3);}
.egh b{color:var(--brand)}
.er{display:grid;grid-template-columns:minmax(200px,1.3fr) minmax(200px,1.6fr) 120px 130px minmax(200px,1.6fr);gap:10px;align-items:center;padding:7px 20px;border-top:1px solid var(--line2);font-size:13.5px}
.er:hover{background:var(--surface2)}
.er .pos{color:var(--ink2)}
.er .ps{display:flex;flex-wrap:wrap;gap:4px}
@media (max-width:1100px){.er{grid-template-columns:1fr 1fr;padding:8px 14px}.er .rt{display:none}}

/* должности ШР внутри группы реестра и в структуре: «факт / по ШР», нехватка — вакансия */
.egpos{display:flex;align-items:center;gap:10px;padding:6px 20px 6px 34px;background:var(--surface2);font-size:12.5px;border-top:1px solid var(--line2)}
.egpos.vac{box-shadow:inset 3px 0 0 var(--bad)}
.egpn{font-weight:600;color:var(--ink2);font-size:12.5px}
.pf{font-weight:700;font-variant-numeric:tabular-nums;padding:1px 7px;border-radius:6px;font-size:12px;white-space:nowrap}
.pf.ok{background:var(--ok-soft);color:var(--ok)}.pf.bad{background:var(--bad-soft);color:var(--bad)}.pf.warn{background:var(--warn-soft);color:var(--warn)}
.op-row .pf{margin-left:auto}
.op-row.vac{box-shadow:inset 3px 0 0 var(--bad)}

.pill.sm{font-size:10.5px;padding:1px 6px;vertical-align:1px}
.dnote.bad{border-left:3px solid var(--bad);background:var(--bad-soft)}

/* ---- расстановка УЦС: проект → флот → строки-места, вахта А / вахта Б ---- */
.cw-legend{margin:-6px 0 12px}
.cw-wrap{display:grid;grid-template-columns:minmax(0,1fr) 260px;gap:14px;align-items:start}
@media (max-width:1200px){.cw-wrap{grid-template-columns:1fr}}
.cw-proj{margin:0 0 18px}
.cw-projh{display:flex;align-items:center;gap:10px;padding:8px 4px 6px;font-size:12.5px;font-weight:600;color:var(--brand)}
.cw-projh .pill{text-transform:none;letter-spacing:0}
.cw{background:var(--surface);border:1px solid var(--line2);border-radius:14px;box-shadow:var(--shadow);margin-bottom:12px;overflow:hidden}
.cwh{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--brand-band);border-bottom:1px solid var(--line2);flex-wrap:wrap}
.cwh b{font-size:15px;color:var(--brand)}
.cwh .sh{display:inline-flex;gap:6px;align-items:center;font-size:12px;color:var(--ink3)}
.cwh .sh i{font-style:normal;padding:2px 8px;border-radius:999px;background:var(--surface);border:1px solid var(--line2)}
.cwh .sh i.now{background:var(--ok-soft);color:var(--ok);border-color:transparent;font-weight:700}
table.cwt{width:100%;border-collapse:collapse;font-size:13px}
table.cwt th{font-size:12px;color:var(--ink3);text-align:left;padding:6px 10px;border-bottom:1px solid var(--line2);background:var(--surface2)}
table.cwt th.now{color:var(--ok)}
table.cwt td{padding:5px 10px;border-bottom:1px solid var(--line2);vertical-align:middle}
table.cwt tr:last-child td{border-bottom:0}
table.cwt td.veh{width:26%;color:var(--ink2)}
table.cwt td.veh .pl{font-family:"JetBrains Mono",monospace;font-size:12px;color:var(--ink);white-space:nowrap}
table.cwt td.pos{width:20%;font-weight:600}
table.cwt td.pos.ed{cursor:pointer}table.cwt td.pos.ed:hover{color:var(--brand)}
table.cwt td.cell{width:20%;min-width:170px}
table.cwt td.cell.now{background:rgba(21,128,61,.045)}
table.cwt td.cell.drop{outline:2px dashed var(--brand);outline-offset:-3px;background:var(--brand-soft)}
table.cwt td.note{color:var(--ink3);font-size:12px}
.cw .pe{max-width:100%}
.cw .pe.text{background:var(--surface2);border:1px dashed var(--line);color:var(--ink2)}
.cw .vac{display:inline-flex;align-items:center;gap:6px;border:1px dashed var(--line);border-radius:999px;padding:3px 10px;font-size:12px;color:var(--ink3);cursor:pointer}
.cw .vac.now{border-color:var(--bad);color:var(--bad);background:var(--bad-soft)}
.cw .vac:hover{border-style:solid}
.cw .pe .rm{all:unset;cursor:pointer;color:var(--ink3);margin-left:4px;font-size:12px;line-height:1}.cw .pe .rm:hover{color:var(--bad)}
.cw-side{position:sticky;top:12px;background:var(--surface);border:1px solid var(--line2);border-radius:14px;padding:12px;box-shadow:var(--shadow)}
.cw-side h4{margin:0 0 8px;font-size:13px}
.cw-side .frs{display:flex;flex-wrap:wrap;gap:6px;max-height:60vh;overflow:auto}
.cw-side .grpn{font-size:12px;font-weight:600;color:var(--ink3);margin:10px 0 4px}
.pick-list{max-height:52vh;overflow:auto;border:1px solid var(--line2);border-radius:10px}
.pick-list .pk{display:flex;align-items:center;gap:10px;padding:8px 12px;border-bottom:1px solid var(--line2);cursor:pointer}
.pick-list .pk:hover{background:var(--surface2)}.pick-list .pk b{flex:1}.pick-list .pk .muted{font-size:12px}
.pick-list .pk.busy{opacity:.6}
.cw-projh.click,.cwh.click{cursor:pointer;user-select:none}
.cw-projh .arr,.cwh .arr{width:14px;color:var(--ink3);font-weight:700;text-align:center}
.cw.closed .cwh{border-bottom:0}
.cw-proj.closed .cw-projh{border-bottom:1px dashed var(--line2);margin-bottom:8px}

/* график по расстановке: строка группы с буквами вахт, бейдж А/Б у человека, линия смены вахт 16-го */
table.cal tr.grp{cursor:pointer;user-select:none}
table.cal tr.grp td{background:var(--brand-band);border-bottom:1px solid var(--line2)}
table.cal tr.grp td.sticky{background:var(--brand-band)}
table.cal tr.grp .arr{display:inline-block;width:14px;color:var(--ink3);font-weight:700}
table.cal td.lt{text-align:center;font-size:10px;font-weight:700;color:var(--ink3);border-left:1px solid var(--line2)}
table.cal td.lt.l-a{background:var(--ok-soft);color:var(--ok)}table.cal td.lt.l-b{background:#DBEAFE;color:#185FA5}
table.cal th.dn.rot,table.cal td.kc.rot,table.cal td.lt.rot{border-left:2px solid var(--brand)}
table.cal .shb{display:inline-block;margin-left:6px;padding:0 5px;border-radius:4px;font-size:10px;font-weight:700;line-height:15px;vertical-align:1px}
table.cal .shb.a{background:var(--ok-soft);color:var(--ok)}table.cal .shb.b{background:#DBEAFE;color:#185FA5}

/* итог структуры — отдельной строкой под блоками, а не у директора */
.org-total{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 10px;margin-top:14px;padding:12px 16px;border-top:2px solid var(--brand);background:var(--brand-band);border-radius:0 0 12px 12px;font-size:13px}
.org-total .lbl{font-size:12px;font-weight:600;color:var(--ink3)}
.org-total b{font-size:18px;font-weight:600;color:var(--brand)}.org-total b.bad{color:var(--bad)}.org-total b.ok{color:var(--ok)}
.org-total .sep{width:1px;height:18px;background:var(--line);align-self:center}
.org-total i{font-style:normal;color:var(--ink3);font-size:12px}

/* структура: плашки у блока, компактный вид, легенда, карточка должности */
.obh .obs{display:flex;gap:4px;flex-basis:100%;order:9}
.org-blocks.compact .op-row{display:none}
.org-blocks>.ob.wide .obh{max-width:none}
.org-legend{display:flex;flex-wrap:wrap;gap:6px 18px;padding:8px 16px 0;align-items:center}
.org-legend .lg{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:6px;vertical-align:-1px}
.org-legend .lg.ok{background:var(--ok)}.org-legend .lg.bad{background:var(--bad)}.org-legend .lg.warn{background:var(--warn)}
.op-row.click{cursor:pointer}.op-row.click:hover{background:var(--surface2)}
.plist{display:flex;flex-direction:column;gap:4px;margin-top:6px}
.plist .pk{all:unset;cursor:pointer;display:flex;align-items:center;gap:10px;padding:6px 10px;border:1px solid var(--line2);border-radius:8px}
.plist .pk:hover{background:var(--surface2)}.plist .pk b{flex:1}

/* широкий блок (Главный инженер): подразделения с участками раскладываются колонками, а не в одну длинную колонку */
.org-blocks>.ob.wide{flex:0 0 auto;width:max-content;max-width:none}
.oub.cols{display:grid;grid-auto-flow:column;grid-auto-columns:196px;gap:6px;align-items:start;padding:6px}   /* участки в одну линию, как на схеме */
.ob.wide .op-row{font-size:11.5px;padding:3px 6px 3px 14px}.ob.wide .ouh{font-size:12.5px;padding:6px 8px}
.oub.cols>.ou{margin:0}
.ob.wide .oub.cols>.ou>.oub.cols{grid-template-columns:1fr}

/* схема на весь экран и масштаб */
.org-card.fs{position:fixed;inset:0;z-index:8;margin:0;border-radius:0;display:flex;flex-direction:column;background:var(--bg)}
.org-card.fs .tw{flex:1;overflow:auto;padding:18px 24px}
.org-card.fs .org-legend,.org-card.fs .add{flex:none;background:var(--surface);border-top:1px solid var(--line2)}
.org-fsbar{display:flex;align-items:center;gap:10px;padding:10px 16px;background:var(--surface);border-bottom:1px solid var(--line2)}
.org-fsbar b{font-size:15px;color:var(--brand)}
body.org-fs-open{overflow:hidden}
.seg.zoom button{min-width:34px;text-align:center}
#org-zoom{display:inline-block;min-width:100%}

.er .nm i.tab{font:500 11px/1 "JetBrains Mono",ui-monospace,Menlo,Consolas,monospace;color:var(--ink3);margin-left:8px;font-style:normal;letter-spacing:.02em}

/* вахта у сотрудника */
.shf{display:inline-block;font:600 10.5px/1 var(--mono);padding:3px 5px;border-radius:5px;margin-left:6px;vertical-align:1px;letter-spacing:.02em}
.shf.a{background:var(--brand-soft);color:var(--brand)}.shf.b{background:#fdf0dc;color:var(--warn)}.shf.o{background:var(--surface2);color:var(--ink3)}
.pf.ab{background:transparent;color:var(--ink3);font-weight:500}
/* проекты */
.pj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(440px,1fr));gap:14px}
.pj{background:var(--surface);border:1px solid var(--line2);border-radius:14px;box-shadow:var(--shadow);padding:14px 16px 12px;display:flex;flex-direction:column;gap:10px}
.pjh{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
.pjt{font-size:17px;font-weight:700;color:var(--ink)}
.pjpm{text-align:right;display:flex;flex-direction:column;line-height:1.2}
.pjs{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:13px;color:var(--ink2)}
.pjs b{color:var(--ink)}.pjs .bad b{color:var(--bad)}.pjs .warn b{color:var(--warn)}
.pjo{display:flex;gap:6px;flex-wrap:wrap}
.pjg td,.pjg th{padding:6px 8px}
.pja{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto;padding-top:4px;border-top:1px solid var(--line)}
@media (max-width:720px){.pj-grid{grid-template-columns:1fr}}
.pe.other{opacity:.85;border-style:dashed}
.pe.other small{display:block;font-size:10px;color:var(--ink3);margin-top:1px}

/* полоска «у вас забрали человека» над расстановкой */
.cw-tr{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 14px;margin:0 0 10px;border-radius:10px;background:#fdf0dc;border:1px solid #f3d9a8;font-size:13.5px;color:var(--ink2)}
.cw-tr b{color:var(--ink)}

/* по местам */
.wh-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.wh{background:var(--surface);border:1px solid var(--line2);border-radius:14px;box-shadow:var(--shadow);padding:10px 12px 12px;min-height:90px}
.wh.special{background:var(--surface2);box-shadow:none}
.wh.drop{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.whh{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.whh b{font-size:14px}
.whb{display:flex;flex-wrap:wrap;gap:6px}
.pe.whp{cursor:pointer}
.pe.whp.moved{border-color:var(--warn)}
.pe.whp em{font-style:normal;color:var(--warn);margin-left:4px;font-weight:700}
.pe.whp small{display:block;font-size:10px;color:var(--ink3)}
@media (max-width:720px){.wh-grid{grid-template-columns:1fr}}

/* структура и ШР: быстрый ввод в режиме правки, предпросмотр списка, закрепление людей */
.org-add{display:flex;gap:6px;padding:4px 6px 2px 22px}
.org-add input{flex:1;min-width:0;border:1px dashed var(--line);border-radius:6px;padding:4px 8px;font:inherit;font-size:12.5px;background:transparent;color:var(--ink)}
.org-add input:focus{outline:none;border-style:solid;border-color:var(--brand);background:var(--surface)}
.ob-preview{max-height:260px;overflow:auto;border:1px solid var(--line);border-radius:8px;padding:6px 8px;font-size:13px}
.ob-preview:empty{display:none}
.ob-preview .r{display:flex;gap:8px;align-items:baseline;padding:2px 0;flex-wrap:wrap}
.ob-preview .r.u>b{font-weight:600}
.ob-preview .c{color:var(--ink3);font-variant-numeric:tabular-nums}
.pin-row{display:flex;gap:6px;align-items:center;margin-top:8px}
.pin-row input{flex:1;min-width:0}
.plist .pk .pin{margin-left:auto;font-size:12px;color:var(--ink3);text-decoration:underline;cursor:pointer}

/* shell.css — единая тонкая шапка всех экранов (Эмин, 23.09.2026: «сделай такую шапку, как в „Сигнале“, для каждой вкладки, одного размера»).
   Подключается последним (app/web.py::CSS_FILES) — перекрывает высоты плиток из staff.css и сетку из program.css/hero.css.
   Шапка = заголовок · ряд чисел-кнопок · состояние справа. Подпись и пояснение плитки ушли в подсказку при наведении (kpiCard → title). */
#app .pg-hero,#app .hero{padding:14px 20px;grid-template-columns:auto minmax(0,1fr) auto;gap:10px 18px;align-items:center;min-height:0}
#app .hero .pg-kicker,#app .hero .pg-sub,#app .pg-hero .pg-kicker,#app .pg-hero .pg-sub{display:none}
#app .hero .pg-title,#app .pg-hero .pg-title{font-size:22px;margin:0;min-height:0;line-height:1.15;display:block;-webkit-line-clamp:unset;white-space:nowrap;max-width:240px;overflow:hidden;text-overflow:ellipsis}   /* длинный заголовок не растит шапку; целиком — в подсказке */
#app .hero .pg-hero-l,#app .pg-hero .pg-hero-l{min-height:0;min-width:0;grid-column:1;grid-row:1}
#app .hero .pg-stats,#app .pg-hero .pg-stats{display:flex;flex-wrap:wrap;gap:8px;min-height:0;grid-column:2;grid-row:1;grid-auto-rows:auto;align-content:center}
#app .hero .pg-hero-r,#app .pg-hero .pg-hero-r{min-height:0;grid-column:3;grid-row:1;justify-content:center}
#app .hero .pg-stats:empty,#app .pg-hero .pg-stats:empty{display:none}
/* плитка → число-кнопка, как .sgk в «Сигнале» */
#app .pst{display:inline-flex;flex-direction:row;align-items:baseline;gap:5px;padding:6px 10px;border-radius:10px;height:auto;min-height:0;overflow:visible;font-size:19px;font-weight:700;line-height:1.2;backdrop-filter:none}
#app .pst .v{font-size:19px;font-weight:700;line-height:1.2;letter-spacing:0;display:inline}
#app .pst .v small{font-size:11px;font-weight:600;margin-left:3px}
#app .pst .l{font-size:13px;font-weight:500;margin:0;opacity:.85;white-space:nowrap}
#app .pst .s,#app .pst .meter{display:none}
#app .pst.click:hover{transform:none;background:rgba(255,255,255,.2)}
#app .pst.click.active{background:#fff;border-color:#fff}
/* ноутбук: заголовок и правая зона в первой строке, числа — второй */
@media (max-width:1100px){
  #app .pg-hero,#app .hero{grid-template-columns:minmax(0,1fr) auto;gap:8px 14px}
  #app .hero .pg-stats,#app .pg-hero .pg-stats{grid-column:1/-1;grid-row:2}
  #app .hero .pg-hero-r,#app .pg-hero .pg-hero-r{grid-column:2;grid-row:1;align-items:flex-end}
}
/* телефон: название экрана уже в верхней строке — заголовок шапки не повторяем */
@media (max-width:760px){
  #app .pg-hero,#app .hero{grid-template-columns:1fr;padding:12px 14px}
  #app .hero .pg-title,#app .pg-hero .pg-title{display:none}
  #app .hero .pg-hero-r,#app .pg-hero .pg-hero-r{grid-column:1;grid-row:1;align-items:flex-start}
  #app .hero .pg-stats,#app .pg-hero .pg-stats{grid-column:1;grid-row:2}
  #app .pst{padding:5px 10px;font-size:17px}#app .pst .l{font-size:12px}
  /* подпись под таблицами (.add .ed) была nowrap и растягивала страницу — нижняя панель уезжала (Эмин, 23.09.2026, «Пропуска») */
  .add .ed{white-space:normal}
}
