/* dashhub.css — единый слой стилей Dashhub.
   Создан 29.08.2026: перенесён 1:1 из <style> в base.html, ни одно правило не изменено.
   Дальше сюда поднимаются компоненты из библиотеки (design_system/vitrina.html),
   а локальные <style> в шаблонах вычищаются. Правки — только здесь. */
/* Шрифт облика В — IBM Plex Sans, тот же, что на складе версии 2.
   Файлы уже лежали в static/fonts (положены 05.09 вместе с темой второй версии). */
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/static/fonts/IBMPlexSans-400-cyrillic.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/static/fonts/IBMPlexSans-400-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+2000-206F,U+20AC,U+2122,U+2212,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/static/fonts/IBMPlexSans-500-cyrillic.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/static/fonts/IBMPlexSans-500-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+2000-206F,U+20AC,U+2122,U+2212,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/static/fonts/IBMPlexSans-600-cyrillic.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/static/fonts/IBMPlexSans-600-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+2000-206F,U+20AC,U+2122,U+2212,U+FEFF,U+FFFD}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:700;font-display:swap;src:url(/static/fonts/IBMPlexSans-700-cyrillic.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:700;font-display:swap;src:url(/static/fonts/IBMPlexSans-700-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+2000-206F,U+20AC,U+2122,U+2212,U+FEFF,U+FFFD}
:root{
    /* 09.09.2026: базовая палитра светлой темы приведена к теме склада версии 2
       («Бумага и графит»), как и просил Алексей: цвет и шрифт оттуда. Значения
       дословно из static/dashhub_v2.css, блок html.v2. Откат: dashhub.css.bak-20260909-palette */
    --bg:#F2F3F5; --panel:#FFFFFF; --panel2:#E9EBEF; --ink:#15181D; --muted:#5B6470; --line:#D9DDE3;
    --shadow:0 1px 3px rgba(20,25,40,.06),0 6px 24px rgba(20,25,40,.05);
    /* Облик В (выбор Алексея 08.09.2026): акцент — графит, оранжевый оставлен
       ТОЛЬКО как сигнал (тревога, просрочка, «горит»). Прежний фирменный оранжевый
       сохранён как --brand: он нужен логотипу и градиентам, но кнопкам больше не даётся.
       Откат: dashhub.css.bak-20260908-oblikV */
    --accent:#15181D; --accent-d:#000000; --on-accent:#ffffff; --on-fill:#ffffff;
    --brand:#e8843c; --brand-d:#cf6e2a;
    --signal:#d9480f; --signal-d:#b03806;
    --warn-d:#8a5c00;
    --pos-d:#15703c; --neg-d:#b02a2a; --info-d:#1e50c0;  /* ТЕКСТОВЫЕ оттенки pos/neg — пара к --warn-d;
                         добавлены 31.08.2026, блок 7. Зачем: --pos/--neg рассчитаны на
                         заливку (точка, полоса), как текст на своей же светлой подложке
                         дают 2,7:1. Эти — для текста, и они переключаются в тёмной теме;
                         замер до/после — qa/block7/contrast_before.json / contrast_after.json */
    --wb:#a80f8d; --oz:#0049cc; --fin:#3a7d5c; --skl:#5b6472; --log:#0d7d8a; --pur:#b8681f;
    --pos:#1f9d55; --warn:#d99a16; --neg:#d8453a; --chip:#f0f1f4; --track:#eceef2;
    --info:#2f6fed;   /* «в работе»/нейтрально-информационный; добавлен 30.08.2026, блок 2 */
    --vio:#7c3aed;    /* «комплект/составной» — фиолетовая семья тегов; добавлен 31.08.2026,
                         блок 6: экраны рисовали #7c3aed/#7e22ce литералом и не переключались в тёмной */
    --mask:rgba(15,19,32,.5); /* подложка модальных окон; добавлен 30.08.2026, блок 5:
                                 экранные окна рисовали свою rgba, слоёв было два */
    --sidebar:#141926; --side-ink:#e7eaf2; --side-mut:#8b93a7; --side-line:#232a3a;
    --sbw:234px; --sbc:64px;
  }
  html.dark{--accent:#e7eaf2;--accent-d:#ffffff;--on-accent:#15181d;--on-fill:#10131c;--signal:#f2732f;--signal-d:#ff9257;--wb:#f06fd0;--oz:#5b9dff;--bg:#0f1320;--panel:#171c2b;--panel2:#1c2233;--ink:#e7eaf2;--muted:#8b93a7;--line:#252c3e;--info:#5b8cff;--warn-d:#e0b357;--vio:#a78bfa;--pos-d:#5cd39a;--neg-d:#ef8b82;--info-d:#8fb4ff;
    --shadow:0 1px 3px rgba(0,0,0,.4),0 8px 28px rgba(0,0,0,.35);--chip:#1e2434;--track:#232a3c}
  @media(prefers-color-scheme:dark){html:not(.light){--accent:#e7eaf2;--accent-d:#ffffff;--on-accent:#15181d;--on-fill:#10131c;--signal:#f2732f;--signal-d:#ff9257;--wb:#f06fd0;--oz:#5b9dff;--bg:#0f1320;--panel:#171c2b;--panel2:#1c2233;--ink:#e7eaf2;--info:#5b8cff;--warn-d:#e0b357;--vio:#a78bfa;--pos-d:#5cd39a;--neg-d:#ef8b82;--info-d:#8fb4ff;
    --muted:#8b93a7;--line:#252c3e;--shadow:0 1px 3px rgba(0,0,0,.4),0 8px 28px rgba(0,0,0,.35);--chip:#1e2434;--track:#232a3c}}
  *{box-sizing:border-box}
  body{margin:0;background:var(--bg);color:var(--ink);font-family:"IBM Plex Sans",-apple-system,"Segoe UI",Roboto,Inter,Arial,sans-serif;
    font-size:14px;line-height:1.45;-webkit-font-smoothing:antialiased;display:flex;min-height:100vh}
  a{color:inherit;text-decoration:none}

  /* ===== Сайдбар (тёмный, как в РНП) ===== */
  .sb{width:var(--sbw);flex:0 0 var(--sbw);height:100vh;position:sticky;top:0;background:var(--sidebar);color:var(--side-ink);
    display:flex;flex-direction:column;transition:width .16s,flex-basis .16s;z-index:30}
  html.sbc .sb{width:var(--sbc);flex-basis:var(--sbc)}
  .sb-top{display:flex;align-items:center;gap:10px;padding:16px 14px;height:60px;border-bottom:1px solid var(--side-line)}
  .brand{font-weight:800;font-size:16px;display:flex;align-items:center;gap:10px;color:#fff;overflow:hidden;white-space:nowrap}
  .brand .mark{width:30px;height:30px;border-radius:8px;background:linear-gradient(135deg,var(--brand),#f0a060);
    display:grid;place-items:center;flex:none;font-size:15px}
  html.sbc .brand .btxt{display:none}
  .burger{margin-left:auto;width:32px;height:32px;border:1px solid #2b3346;background:#1b2130;border-radius:9px;
    cursor:pointer;color:#9aa4bd;font-size:15px;display:grid;place-items:center;font-family:inherit;flex:none}
  .burger:hover{color:#fff;border-color:#3a445c}
  html.sbc .sb-top{justify-content:center;padding:16px 0}
  html.sbc .burger{margin:0}
  .sb-nav{flex:1;overflow-y:auto;overflow-x:hidden;padding:10px 10px}
  .grp{font-size:10px;text-transform:uppercase;letter-spacing:.07em;color:#98a1b5;font-weight:700;/* 09.09.2026: было #6f7890 — 3,98 к фону рейки при норме 4,5 (проверка check_dark) */ 
    padding:13px 10px 5px;white-space:nowrap}
  html.sbc .grp{opacity:0;height:14px;padding:6px 0 0;text-align:center}
  /* сворачиваемые группы меню: заголовок кликабелен, состояние живёт в localStorage */
  .grp.clps{display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none;border-radius:7px;
    padding-right:8px;transition:color .12s,background .12s}
  .grp.clps:hover{color:#aab2c6;background:rgba(255,255,255,.05)}
  .grp .arw{font-size:8px;line-height:1;display:inline-block;transition:transform .15s;flex:none}
  .grp.off .arw{transform:rotate(-90deg)}
  .grp .cntg{margin-left:auto;font-size:9.5px;font-weight:800;color:#a7afc2;letter-spacing:0}
  .grp.on .cntg{display:none}
  .grp-body.hid{display:none}
  /* группа второго уровня («Склад» внутри «Отделов»): текст как у пункта меню,
     а не как у заголовка раздела, иначе вложенность читается как новый раздел */
  .grp.clps.sub{text-transform:none;font-size:13.5px;letter-spacing:0;color:#aab2c6;
    padding:9px 12px;margin-bottom:1px}
  .grp.clps.sub:hover{color:#fff}
  .grp-body.sub a{padding-left:22px;gap:8px;font-size:13px}
  /* узкое меню: заголовков не видно — прячем и сворачивание, иконки показываем все */
  html.sbc .grp.clps{pointer-events:none}
  /* в узком меню подзаголовок «Склад» тоже прячем, а отступ у пунктов снимаем —
     иначе иконки съезжают с центральной оси */
  html.sbc .grp.clps.sub{opacity:0;height:14px;padding:6px 0 0;font-size:10px}
  html.sbc .grp-body.sub a{padding-left:0}
  html.sbc .grp .arw,html.sbc .grp .cntg{display:none}
  html.sbc .grp-body.hid{display:block}
  .sb-nav a{display:flex;align-items:center;gap:11px;padding:9px 12px;border-radius:9px;color:#aab2c6;
    font-weight:600;font-size:13.5px;white-space:nowrap;margin-bottom:1px}
  .sb-nav a:hover{background:rgba(255,255,255,.06);color:#fff}
  .sb-nav a.on{background:rgba(232,132,60,.16);color:#fff;box-shadow:inset 3px 0 0 var(--brand)}
  .sb-nav a.on .ic{color:var(--brand)}
  .ic{width:20px;text-align:center;font-size:15px;flex:none;color:#cfd6e6}
  .ic .sq{display:inline-block;width:10px;height:10px;border-radius:3px;vertical-align:middle}
  .sq.wb{background:var(--wb)}.sq.oz{background:var(--oz)}.sq.skl{background:var(--skl)}
  .lb{flex:1;overflow:hidden;text-overflow:ellipsis}
  .sb-nav a .cnt{font-size:11px;font-weight:800;color:#fff;background:rgba(232,132,60,.3);border-radius:20px;padding:1px 7px}
  html.sbc .lb,html.sbc .sb-nav a .cnt{display:none}
  html.sbc .sb-nav a{justify-content:center;padding:9px 0}
  .sb-bottom{border-top:1px solid var(--side-line);padding:11px 12px;display:flex;align-items:center;gap:10px}
  .sb-bottom .who{line-height:1.15;overflow:hidden;flex:1}
  .who b{font-size:13px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#e7eaf2}
  .who span{font-size:11px;color:var(--side-mut)}
  html.sbc .sb-bottom{justify-content:center;padding:11px 0}
  html.sbc .sb-bottom .who{display:none}
  .tgl{width:32px;height:32px;border:1px solid #2b3346;background:#1b2130;color:#cfd6e6;border-radius:9px;cursor:pointer;
    font-size:15px;display:grid;place-items:center;font-family:inherit;flex:none}
  .tgl:hover{border-color:#3a445c;color:#fff}
  /* п.26 канона: иконка никогда не стоит одна — у выхода есть слово.
     В свёрнутом сайдбаре кнопка скрыта целиком (правило ниже), так что
     обрезать слово многоточием не приходится. */
  .logout{height:32px;padding:0 10px;border:1px solid #2b3346;background:#1b2130;color:#cfd6e6;border-radius:9px;cursor:pointer;
    font-size:13px;display:flex;align-items:center;gap:6px;text-decoration:none;flex:none}
  .logout .ic{font-size:15px;line-height:1}
  .logout .lb{flex:none;font-weight:600}
  .logout:hover{border-color:var(--brand);color:var(--brand)}
  html.sbc .logout{display:none}

  /* ===== Контент ===== */
  .main{flex:1;min-width:0}
  /* Ширина — резиновая от разрешения: на ноутбуке заполняет, на широком мониторе тянется до 2600px (без узкого островка), на 4К не растягивается в нечитаемую строку */
  .wrap{width:100%;max-width:clamp(1120px, 95vw, 2600px);margin:0 auto;padding:0 clamp(18px,2.2vw,40px) 40px}
  body.embed{display:block}
  body.embed .wrap{max-width:none;padding:12px 14px 24px}
  body.embed .head{padding-top:6px}
  .head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:20px 0 10px}
  .head h1{margin:0;font-size:22px;letter-spacing:-.02em}
  .head p{margin:3px 0 0;color:var(--muted);font-size:13px}
  .fresh{display:flex;gap:8px;flex-wrap:wrap}
  .fchip{display:flex;align-items:center;gap:7px;background:var(--panel);border:1px solid var(--line);
    border-radius:999px;padding:6px 11px;font-size:12px;box-shadow:var(--shadow)}
  .fdot{width:8px;height:8px;border-radius:50%}.fdot.g{background:var(--pos)}.fdot.o{background:var(--warn)}.fdot.r{background:var(--neg)}
  .fchip b{font-weight:700}.fchip span{color:var(--muted)}
  .sect{font-size:11px;text-transform:uppercase;letter-spacing:.09em;color:var(--muted);font-weight:700;margin:22px 2px 12px}
  .banner{background:var(--chip);border:1px solid var(--line);border-radius:12px;padding:12px 14px;font-size:13px;color:var(--muted);margin:8px 0}
  .foot{color:var(--muted);font-size:11.5px;text-align:center;padding:26px 0 30px;line-height:1.6}

  /* ===== Сводка задач (статусный блок) ===== */
  .tstats{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  .tst{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--panel);box-shadow:var(--shadow)}
  a.tst{text-decoration:none;color:inherit;cursor:pointer;transition:transform .1s,box-shadow .1s;display:block}
  a.tst:hover{transform:translateY(-2px);box-shadow:0 6px 20px rgba(20,25,40,.12)}
  a.tst .h::after{content:'→';margin-left:auto;opacity:.6;font-weight:700}
  .tst .h{font-size:12px;font-weight:700;color:#fff;padding:8px 12px;display:flex;align-items:center;gap:7px}   /* 09.09.2026: пара к цветной заливке — в тёмной теме текст тёмный */
  .tst .v{font-size:26px;font-weight:800;text-align:center;padding:12px}
  .tst .v.na{font-size:18px;color:var(--ink);opacity:.7;font-weight:700}
  .tst.blue .h{background:#1f5bd0}.tst.amber .h{background:#8a5f0b}.tst.green .h{background:#146c39}   /* 09.09.2026: фон затемнён — белый текст на прежних давал 2,9-3,5 */
  .tst.red .h{background:#b3232a}.tst.dark .h{background:#2b3242;color:#fff}   /* тёмная плашка: текст остаётся белым в обеих темах */
  .tst.blue .v{color:var(--info-d);background:rgba(47,111,237,.07)}
  .tst.amber .v{color:var(--warn-d);background:rgba(201,138,18,.08)}
  .tst.green .v{color:var(--pos-d);background:rgba(31,157,85,.08)}
  .tst.red .v{color:var(--neg-d);background:rgba(229,72,77,.07)}
  .tst.dark .v{color:var(--ink);background:var(--panel2)}
  .ontime{margin-top:10px;background:rgba(31,157,85,.1);border:1px solid rgba(31,157,85,.3);border-radius:10px;
    padding:10px 12px;font-size:13px;font-weight:700;color:var(--pos-d);text-align:center}
  .st-sel{font-size:12px;padding:4px 6px;border:1px solid var(--line);border-radius:8px;background:var(--panel2);color:var(--ink);font-family:inherit;cursor:pointer}
  .st-sel.progress{border-color:#2f6fed}.st-sel.check{border-color:#c98a12}.st-sel.rework{border-color:#e5484d;background:rgba(229,72,77,.08)}
  .st-sel.approved{border-color:#1f9d55;background:rgba(31,157,85,.12)}.st-sel.paused{border-color:var(--muted)}.st-sel.cancelled{border-color:var(--muted);color:var(--muted)}
  .q-in{width:52px;font-size:12px;padding:4px 6px;border:1px solid var(--line);border-radius:8px;background:var(--panel2);color:var(--ink);font-family:inherit;text-align:center}
  input,select{font-size:13px;padding:8px 10px;border:1px solid var(--line);border-radius:9px;background:var(--panel2);color:var(--ink);font-family:inherit}
  button.primary{border:1px solid var(--accent);background:var(--accent);color:var(--on-accent);border-radius:10px;height:40px;padding:0 18px;cursor:pointer;font-size:14px;font-weight:700;font-family:inherit}
  button.primary:hover{background:var(--accent-d);border-color:var(--accent-d)}
  .iconbtn{display:inline-flex;align-items:center;border:1px solid var(--line);background:var(--panel);color:var(--ink);border-radius:10px;height:38px;padding:0 13px;cursor:pointer;font-size:13px;font-family:inherit}
  .iconbtn:hover{background:var(--panel2)}
  .msg{color:var(--pos-d);background:rgba(31,157,85,.08);border:1px solid rgba(31,157,85,.3);border-radius:10px;padding:10px 12px;font-size:13px;white-space:pre-wrap;margin-top:12px}

  /* ===== KPI ===== */
  .kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
  .kpi{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:15px 18px;box-shadow:var(--shadow);position:relative;display:block}
  .kpi:hover{transform:translateY(-1px);border-color:var(--muted)}
  /* Ссылка «провалиться →» лежит абсолютом в правом верхнем углу плитки, поэтому
     титул обязан оставить под неё место: без этого длинный титул (первая плитка,
     «…WB + Ozon») стыкуется с ней вплотную и читается как «WB + Ozonпровалиться →».
     Найдено консультацией по блоку 1 30.08.2026.
     Именно margin, а не padding: при box-sizing:border-box padding не двигает правое
     ребро блока, текст всё равно доезжает до ссылки. */
  .kpi .lab{font-size:12px;color:var(--muted);font-weight:600;margin-right:88px;min-height:16px}
  .kpi .val{font-size:28px;font-weight:800;letter-spacing:-.02em;margin:5px 0 3px}
  .kpi .val small{font-size:14px;font-weight:700;color:var(--muted)}
  .kpi .sub{font-size:12px;color:var(--muted)}
  .kpi .drill{position:absolute;right:14px;top:13px;font-size:11px;color:var(--muted);opacity:.7}

  /* ===== Карточки отделов (Обзор) ===== */
  .grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
  .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px 16px 12px;box-shadow:var(--shadow);
    display:flex;flex-direction:column;gap:11px;transition:.15s;position:relative;overflow:hidden}
  .card::before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;background:var(--muted)}
  .card.wb::before{background:var(--wb)}.card.oz::before{background:var(--oz)}.card.fin::before{background:var(--fin)}
  .card.skl::before{background:var(--skl)}.card.log::before{background:var(--log)}.card.pur::before{background:var(--pur)}
  .card:hover{border-color:var(--muted);transform:translateY(-1px)}
  .c-top{display:flex;align-items:center;gap:10px}
  .c-title{font-weight:800;font-size:14.5px;letter-spacing:-.01em;flex:1;text-transform:uppercase}
  .c-title em{font-style:normal;font-size:10.5px;color:var(--muted);font-weight:600;display:block;text-transform:none;letter-spacing:0;margin-top:1px}
  .ava{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;font-size:12px;font-weight:800;color:#fff;flex:none}
  .ava.a{background:#6b57d6}.ava.e{background:#0a6f5c}.ava.t{background:#a85a0f}.ava.q{background:var(--muted)}   /* 09.09.2026: зелёный и оранжевый затемнены — белая буква давала 4,29 */
  .rows{display:flex;flex-direction:column;gap:9px}
  .r{display:grid;grid-template-columns:1fr auto;gap:2px 10px;align-items:baseline}
  .r-name{font-size:12.5px;color:var(--muted);font-weight:600}
  .r-val{font-size:13px;font-weight:700;text-align:right}
  .rr{grid-column:1/3;display:flex;align-items:center;gap:8px;margin-top:1px}
  .bar{flex:1;height:6px;background:var(--track);border-radius:99px;overflow:hidden}
  .bar i{display:block;height:100%;border-radius:99px}
  .bar i.pos{background:var(--pos)}.bar i.warn{background:var(--warn)}.bar i.neg{background:var(--neg)}.bar i.mut{background:var(--muted)}
  .rrp{font-size:11px;font-weight:800;min-width:34px;text-align:right}
  .rrp.pos{color:var(--pos-d)}.rrp.warn{color:var(--warn-d)}.rrp.neg{color:var(--neg-d)}.rrp.mut{color:var(--muted)}
  .limit{display:flex;gap:7px;align-items:flex-start;font-size:12px;background:var(--chip);border-radius:10px;padding:8px 10px;line-height:1.35}
  .limit b{font-weight:700}
  .c-foot{display:flex;align-items:center;justify-content:space-between;margin-top:auto;padding-top:2px}
  .c-foot .st{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted)}
  .go{font-size:12px;font-weight:700;color:var(--accent-d)}html.dark .go{color:var(--accent)}.go:hover{text-decoration:underline}

  /* ===== Таблица (Операционные) ===== */
  .dept{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);margin-bottom:14px;overflow:hidden;position:relative}
  .dept::before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;z-index:1}
  .dept.wb::before{background:var(--wb)}.dept.oz::before{background:var(--oz)}.dept.fin::before{background:var(--fin)}
  .dept.skl::before{background:var(--skl)}.dept.log::before{background:var(--log)}.dept.pur::before{background:var(--pur)}
  .dhead{display:flex;align-items:center;gap:12px;padding:13px 16px 13px 18px;cursor:pointer}
  .dhead:hover{background:var(--panel2)}
  .dtitle{font-weight:800;font-size:15px;letter-spacing:-.01em}
  .dtitle em{font-style:normal;font-size:11px;color:var(--muted);font-weight:600;margin-left:8px}
  .dmeta{margin-left:auto;display:flex;align-items:center;gap:14px}.dmeta .per{font-size:11.5px;color:var(--muted)}
  .dlimit{font-size:12px;color:var(--muted);padding:0 16px 10px 18px;display:flex;gap:6px;align-items:flex-start}
  .dlimit b{color:var(--ink);font-weight:700}
  .tblwrap{overflow-x:auto}
  table.rtab{width:100%;border-collapse:collapse;font-size:13px}
  table.rtab th{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-weight:700;text-align:right;padding:7px 12px;border-top:1px solid var(--line);background:var(--panel2)}
  table.rtab th.m{text-align:left}
  table.rtab td{padding:6px 12px;border-top:1px solid var(--line);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
  table.rtab td.m{text-align:left;color:var(--muted);white-space:normal}
  table.rtab tr.bold td{font-weight:800}table.rtab tr.bold td.m{color:var(--ink)}
  table.rtab tr:hover td{background:var(--panel2)}
  table.rtab th.day,table.rtab td.day{color:var(--muted);font-size:11.5px;font-weight:600}
  table.rtab th:nth-child(5),table.rtab td:nth-child(5){border-right:2px solid var(--line)}
  .grpr td{cursor:pointer;font-weight:800;color:var(--ink);background:var(--panel2);text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.05em}
  .fact{font-weight:700}.seg{color:var(--muted)}
  .planin{width:92px;padding:5px 7px;border:1px solid var(--line);border-radius:7px;background:var(--panel);color:var(--ink);font-family:inherit;font-size:12.5px;text-align:right}
  .planin:focus{border-color:var(--oz);outline:none}
  .planin:disabled{background:transparent;border-color:transparent;color:var(--muted)}
  .rrv{font-weight:800}
  .rrv.pos{color:var(--pos-d)}.rrv.warn{color:var(--warn-d)}.rrv.neg{color:var(--neg-d)}.rrv.mut{color:var(--muted)}

  /* ===== Действия ===== */
  .acts{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);overflow:hidden}
  .act{display:grid;grid-template-columns:auto 1fr auto auto;gap:14px;align-items:center;padding:12px 16px;border-top:1px solid var(--line)}
  .act:first-child{border-top:none}.act:hover{background:var(--chip)}.act.done{opacity:.6}
  .act .arm{font-size:14px;width:16px;text-align:center}
  /* п.48 — светофор статуса точкой, цвет только через токены. Эмодзи убраны 30.08.2026 (блок 3).
     Точка не бывает одна: рядом всегда текст задачи и плашка срока (п.26). */
  .dh-dot{display:inline-block;width:9px;height:9px;border-radius:50%;vertical-align:middle;
          background:var(--muted);box-shadow:0 0 0 3px color-mix(in srgb,var(--muted) 14%,transparent)}
  .dh-dot-ok{background:var(--pos);box-shadow:0 0 0 3px color-mix(in srgb,var(--pos) 16%,transparent)}
  .dh-dot-over{background:var(--neg);box-shadow:0 0 0 3px color-mix(in srgb,var(--neg) 16%,transparent)}
  .dh-dot-check{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb,var(--warn) 16%,transparent)}
  .dh-dot-rework{background:var(--neg);box-shadow:0 0 0 3px color-mix(in srgb,var(--neg) 16%,transparent)}
  .dh-dot-work{background:var(--info);box-shadow:0 0 0 3px color-mix(in srgb,var(--info) 16%,transparent)}
  .dh-dot-paused,.dh-dot-cancelled{background:var(--muted);box-shadow:none}
  /* Расширение 30.08.2026 (блок 4). Модификаторы выше названы по статусам ЗАДАЧ; на складских
     и закупочных экранах статусы другие («срочно довезти», «избыток»), а светофор тот же.
     Цветовые псевдонимы дают п.48 без выдумывания статусных имён под каждый раздел. */
  .dh-dot-pos{background:var(--pos);box-shadow:0 0 0 3px color-mix(in srgb,var(--pos) 16%,transparent)}
  .dh-dot-warn{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb,var(--warn) 16%,transparent)}
  .dh-dot-neg{background:var(--neg);box-shadow:0 0 0 3px color-mix(in srgb,var(--neg) 16%,transparent)}
  .dh-dot-mut{background:var(--muted);box-shadow:0 0 0 3px color-mix(in srgb,var(--muted) 14%,transparent)}
  .amain .task{font-weight:700;font-size:13.5px}.amain .task s{color:var(--muted)}
  .amain .from{font-size:11.5px;color:var(--muted);display:flex;align-items:center;gap:6px;margin-top:2px;flex-wrap:wrap}
  .src-tag{font-weight:700;color:var(--ink)}
  .assignee{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:600;white-space:nowrap}
  .adue{font-size:11.5px;font-weight:700;white-space:nowrap;padding:3px 9px;border-radius:99px;background:var(--chip)}
  .adue.today{color:var(--warn-d);background:rgba(229,138,0,.12)}.adue.over{color:var(--neg-d);background:rgba(229,72,77,.12)}
  .adue.ok{color:var(--pos-d);background:rgba(31,157,85,.12)}.adue.plan{color:var(--muted)}
  .batch{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;color:var(--ink);background:var(--chip);border:1px solid var(--line);border-radius:99px;padding:2px 8px}
  .batch .mini{width:52px;height:5px;border-radius:99px;background:var(--track);overflow:hidden;display:inline-block}
  .batch .mini i{display:block;height:100%;background:var(--warn);border-radius:99px}
  .empty{padding:16px;color:var(--muted);font-size:13px}

  /* ===== Люди / Команда ===== */
  .people{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
  .pc{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;box-shadow:var(--shadow);display:flex;align-items:center;gap:13px}
  .pc:hover{border-color:var(--muted)}.pc .ava{width:38px;height:38px;font-size:15px}
  .pc .pn{font-weight:800;font-size:14px}.pc .pm{font-size:12px;color:var(--muted)}
  .pc .cnt{margin-left:auto;text-align:right}.pc .cnt b{font-size:22px;font-weight:800;display:block;line-height:1}
  .pc .cnt span{font-size:11px;color:var(--muted)}.over-tag{color:var(--neg-d);font-weight:700}
  .tgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px;margin-top:8px}
  .pcard{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);overflow:hidden;display:flex;flex-direction:column}
  .ptop{display:flex;align-items:center;gap:12px;padding:15px 16px;border-bottom:1px solid var(--line)}
  .ptop .ava{width:40px;height:40px;font-size:16px}
  .pcnt{margin-left:auto;text-align:right}.pcnt b{font-size:20px;font-weight:800;display:block;line-height:1}.pcnt span{font-size:11px;color:var(--muted)}
  .sprintlab{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-weight:700;padding:11px 16px 4px}
  .pact{display:grid;grid-template-columns:auto 1fr auto;gap:12px;align-items:center;padding:10px 16px;border-top:1px solid var(--line)}
  .pact:hover{background:var(--chip)}.pact.done{opacity:.55}
  .pact .task{font-weight:700;font-size:13px}.pact .task s{color:var(--muted)}
  .meta{font-size:11px;color:var(--muted);margin-top:2px;display:flex;gap:7px;flex-wrap:wrap}
  .mtag{background:var(--chip);border:1px solid var(--line);border-radius:99px;padding:1px 7px;font-weight:600}

  /* ===== Формы (Планы) ===== */
  .fcard{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);padding:18px;margin-top:14px}
  .fcard h3{margin:0 0 4px;font-size:14px;font-weight:800}
  .uhint{font-size:12px;color:var(--muted);margin:0 0 12px;line-height:1.5}
  .fld{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:11px 0;padding-bottom:11px;border-bottom:1px solid var(--line)}
  .fld:last-of-type{border-bottom:none}
  .fld .l{font-size:13px;font-weight:700}
  .dotc{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:7px}
  .dotc.fin{background:var(--fin)}.dotc.wb{background:var(--wb)}.dotc.oz{background:var(--oz)}.dotc.skl{background:var(--skl)}.dotc.log{background:var(--log)}.dotc.pur{background:var(--pur)}
  .toprow{margin-bottom:16px}.toprow label{font-size:12px;color:var(--muted);display:block;margin-bottom:4px;font-weight:600}
  .save{margin-top:18px;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
  .note{color:var(--muted);font-size:12px}
  .hint{background:var(--chip);border:1px solid var(--line);border-radius:12px;padding:12px 14px;font-size:13px;color:var(--muted);margin-top:16px;line-height:1.5}
  /* Ссылка в подсказке красилась var(--oz) — цветом площадки Ozon (п.32: цвет отдела/
     площадки нельзя тратить на обычную навигацию). Правка блока 3, 30.08.2026;
     затрагивает 10 использований .hint, все — в сторону канона. */
  .hint a{color:var(--accent-d);font-weight:700}

  /* ===== Данные (загрузка) ===== */
  .card h3{margin:0 0 4px;font-size:14px;font-weight:800}
  .card .hint{margin:0 0 12px}
  .frow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:10px 0}
  input[type=file]{width:100%;padding:9px 10px;border-style:dashed}
  input[type=checkbox]{width:16px;height:16px;padding:0;accent-color:var(--accent);cursor:pointer}
  label{font-size:13px;display:inline-flex;align-items:center;gap:7px}
  .upd{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:12px 0 0}
  small{font-size:12px;color:var(--muted)}
  table.up{width:100%;border-collapse:collapse;font-size:12.5px;white-space:nowrap}
  table.up th,table.up td{text-align:left;padding:6px 10px;border-bottom:1px solid var(--line)}
  table.up th{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.3px;font-weight:700}
  table.up tbody tr:nth-child(even) td{background:var(--panel2)}

  /* ===== Задачи ===== */
  .tkpanel{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;margin:4px 0 14px}
  .chips{display:flex;gap:6px;flex-wrap:wrap;flex:1;min-width:0}
  a.chip{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--ink);border:1px solid var(--line);background:var(--panel);border-radius:20px;padding:5px 11px;white-space:nowrap}
  a.chip:hover{background:var(--panel2)}a.chip .n{color:var(--muted);font-weight:400;font-variant-numeric:tabular-nums}
  a.chip.active{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}a.chip.active .n{color:inherit;opacity:.85}
  .viewsw{display:inline-flex;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--panel);flex:0 0 auto}
  a.vbtn{padding:6px 13px;font-size:12.5px;font-weight:600;color:var(--muted);white-space:nowrap}
  a.vbtn:hover{background:var(--panel2)}a.vbtn.active{background:var(--accent);color:var(--on-accent)}a.vbtn+a.vbtn{border-left:1px solid var(--line)}
  .addbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow);padding:10px 12px;margin-bottom:16px}
  .addbar input[type=text]{flex:1;min-width:180px}
  .addbar button.plus{border:1px solid var(--accent);background:var(--accent);color:var(--on-accent);border-radius:9px;height:36px;padding:0 16px;cursor:pointer;font-size:16px;font-weight:800;font-family:inherit;line-height:1}
  .addbar button.plus:hover{background:var(--accent-d);border-color:var(--accent-d)}
  .tgrp{font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:var(--muted);font-weight:700;margin:18px 0 7px;cursor:pointer;user-select:none;display:flex;align-items:center;gap:6px}
  .tgrp:hover{color:var(--ink)}
  .tgrp .count{color:var(--muted);font-weight:400;margin-left:4px}
  ul.tasks{list-style:none;margin:0;padding:0}
  li.task{position:relative;display:flex;align-items:center;gap:10px;padding:9px 12px 9px 14px;border:1px solid var(--line);border-radius:10px;margin-bottom:6px;background:var(--panel);box-shadow:var(--shadow);font-size:13.5px}
  li.task::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;border-radius:10px 0 0 10px;background:transparent}
  li.task.pri-high::before{background:var(--warn)}
  li.task.overdue::before{background:var(--neg)}
  li.task.overdue:not(.done){border-color:rgba(229,72,77,.35)}
  li.task.done{opacity:.6}li.task.done .text{color:var(--muted)}
  .tmain{display:flex;align-items:center;gap:10px;flex:1 1 340px;min-width:0}
  .tside{display:flex;align-items:center;gap:9px;min-width:0;flex:0 1 auto}
  /* статус-токен (чтение за 0.1с) */
  .stbadge{font-size:11px;font-weight:800;border-radius:7px;padding:3px 9px;white-space:nowrap;flex:0 0 auto}
  .stbadge.st-progress{background:rgba(47,111,237,.13);color:#2f6fed}
  .stbadge.st-check{background:rgba(201,138,18,.17);color:#c8890f}
  .stbadge.st-rework{background:rgba(184,104,31,.17);color:#b8681f}
  .stbadge.st-approved{background:rgba(31,157,85,.15);color:var(--pos-d)}
  .stbadge.st-paused,.stbadge.st-cancelled{background:var(--chip);color:var(--muted)}
  /* кнопки действия под роль */
  .tact{border:1px solid var(--line);background:var(--panel2);color:var(--ink);border-radius:8px;padding:6px 12px;font-size:12.5px;font-weight:700;cursor:pointer;font-family:inherit;white-space:nowrap}
  .tact:hover{border-color:var(--muted)}
  .tact.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.tact.primary:hover{background:var(--accent-d)}
  .tact.good{background:var(--pos);border-color:var(--pos);color:var(--on-fill)}.tact.good:hover{filter:brightness(1.06)}
  .tact.warn{border-color:var(--warn);color:var(--warn-d);background:transparent}.tact.warn:hover{background:rgba(217,154,22,.1)}
  .tmuted{font-size:12px;color:var(--muted);white-space:nowrap}
  .badge{font-size:10px;font-weight:800;letter-spacing:.4px;padding:2px 7px;border-radius:6px;color:#fff;white-space:nowrap;flex:0 0 auto}
  .badge-wb{background:var(--wb)}.badge-oz{background:var(--oz)}.badge-ozon{background:var(--oz)}
  .art{font-family:ui-monospace,Consolas,monospace;font-size:12px;font-weight:700;white-space:nowrap;flex:0 0 auto;color:var(--muted)}
  .text{flex:1;min-width:0;font-weight:600;font-size:14px;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  select.tassignee{font-size:12px;padding:4px 6px;border:1px solid var(--line);border-radius:8px;background:var(--panel2);color:var(--ink);font-family:inherit;max-width:140px;cursor:pointer}
  .ava{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;color:#fff;font-size:10.5px;font-weight:800;flex:0 0 auto;letter-spacing:.3px;user-select:none}
  .ava.pick{cursor:pointer}.ava.pick:hover{outline:2px solid var(--accent);outline-offset:1px}
  .ava.empty{background:var(--panel2)!important;color:var(--muted);border:1px dashed var(--line);font-weight:700}
  .menuact.cur{border-color:var(--accent);color:var(--accent);font-weight:800}
  .date{color:var(--muted);font-size:12px;white-space:nowrap;font-variant-numeric:tabular-nums}
  .date.over{color:var(--neg-d);font-weight:700}
  .by{color:var(--muted);opacity:.75;font-size:12px;white-space:nowrap}
  button.del{border:none;background:none;color:var(--muted);font-size:15px;line-height:1;cursor:pointer;padding:2px 5px;border-radius:6px;font-family:inherit;flex:0 0 auto}
  button.del:hover{color:var(--neg-d);background:rgba(229,72,77,.1)}
  .pflag{width:10px;height:10px;border-radius:50%;flex:0 0 auto;cursor:pointer;border:2px solid transparent}
  .pflag.high{background:#e5484d}.pflag.med{background:#e58a00}.pflag.low{background:#c2c8d2}
  .pflag:hover{border-color:var(--line)}
  .tg{font-size:10.5px;font-weight:700;color:#5a6270;background:var(--chip);border:1px solid var(--line);border-radius:20px;padding:1px 8px;white-space:nowrap}
  .tgedit{cursor:pointer;color:var(--muted);font-size:12px;border:1px dashed var(--line);border-radius:20px;padding:1px 7px}
  .tgedit:hover{color:var(--ink);border-color:var(--muted)}
  .lnk{text-decoration:none;font-size:13px;flex:0 0 auto}
  .ic-edit{cursor:pointer;font-size:12px;color:var(--muted);flex:0 0 auto;opacity:.6}
  .ic-edit:hover{opacity:1}.ic-edit.has{opacity:1;color:var(--accent)}
  .rev-sel{font-size:11px;padding:3px 5px;border:1px solid var(--line);border-radius:8px;background:var(--panel2);color:var(--muted);font-family:inherit;max-width:110px;cursor:pointer}
  .factedit{cursor:pointer;color:var(--muted);font-size:12px;flex:0 0 auto}.factedit:hover{color:var(--accent)}
  .dpre{display:inline-flex;gap:3px}
  .dpre button{padding:4px 8px;font-size:11px;border-radius:7px}
  .datefact{color:var(--oz);font-size:12px;font-weight:600;white-space:nowrap}
  .agebadge{font-size:11px;font-weight:700;color:var(--muted);white-space:nowrap}
  .agebadge.stale{color:var(--neg-d)}
  .evrow{font-size:12.5px;padding:7px 0;border-top:1px solid var(--line);line-height:1.4}
  .evrow:first-of-type{border-top:none}
  .evt{color:var(--muted);font-variant-numeric:tabular-nums;margin-right:8px}
  .evu{color:var(--muted)}
  /* ── Отдел-чип (цвет по серверному deptCls) ── */
  .dchip{font-size:11px;font-weight:700;padding:2px 9px;border-radius:6px;color:#fff;white-space:nowrap;flex:0 0 auto}
  .dchip-fin{background:var(--fin)}.dchip-wb{background:var(--wb)}.dchip-oz{background:var(--oz)}
  .dchip-skl{background:var(--skl)}.dchip-log{background:var(--log)}.dchip-pur{background:var(--pur)}
  .dchip-gen{background:var(--muted)}
  .dchip.edit{cursor:pointer}.dchip.edit:hover{filter:brightness(1.12)}
  /* ── Авто-дата завершения ── */
  .donedate{color:var(--pos-d);font-size:12px;font-weight:700;white-space:nowrap;font-variant-numeric:tabular-nums}
  /* ── Quick-add ── */
  .addrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;width:100%}
  .addbar .addtext{flex:1 1 260px;min-width:200px;font-size:14px;font-weight:600}
  .addbar .as-primary{min-width:150px;font-weight:600}
  .addbtn{border:1px solid var(--accent);background:var(--accent);color:var(--on-accent);border-radius:9px;height:38px;padding:0 18px;
    cursor:pointer;font-size:14px;font-weight:800;font-family:inherit;white-space:nowrap;line-height:1}
  .addbtn:hover{background:var(--accent-d);border-color:var(--accent-d)}
  .linkbtn{border:1px solid var(--line);background:var(--panel2);color:var(--muted);border-radius:9px;height:38px;
    padding:0 12px;cursor:pointer;font-size:12.5px;font-weight:600;font-family:inherit;white-space:nowrap}
  .linkbtn:hover{color:var(--ink);border-color:var(--muted)}
  .addmore{display:flex;align-items:center;gap:8px;flex-wrap:wrap;width:100%;margin-top:9px;padding-top:9px;border-top:1px dashed var(--line)}
  .addmore[hidden]{display:none}
  .addmore .fl{font-size:11px;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.04em}
  /* ── Кнопка «ещё» в строке + меню ── */
  .moreic{cursor:pointer;color:var(--muted);font-size:17px;line-height:1;flex:0 0 auto;padding:0 5px;border-radius:6px;font-weight:700}
  .moreic:hover{color:var(--ink);background:var(--chip)}
  .menucol{display:flex;flex-direction:column;gap:7px;margin-top:6px}
  .menuact{width:100%;text-align:left;border:1px solid var(--line);background:var(--panel);color:var(--ink);
    border-radius:9px;padding:9px 12px;cursor:pointer;font-size:13.5px;font-weight:600;font-family:inherit}
  .menuact:hover{background:var(--panel2);border-color:var(--muted)}
  .deptpick{display:flex;flex-wrap:wrap;gap:7px;margin:4px 0 12px}
  .deptpick .pick{border:2px solid transparent;font-family:inherit;font-size:12px;padding:4px 11px;cursor:pointer}
  .deptpick .pick.cur{box-shadow:0 0 0 2px var(--ink) inset}
  /* ── Сворачивание групп ── */
  .tgrp .arw{font-size:10px;color:var(--muted);display:inline-block;transition:transform .12s;margin-right:2px}
  section.collapsed .tgrp .arw{transform:rotate(-90deg)}
  section.collapsed ul.tasks{display:none}
  /* ── Календарь задач ── */
  .cal{background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);padding:14px;margin-bottom:16px}
  .cal-bar{display:flex;align-items:center;gap:10px;margin-bottom:12px}
  .cal-title{font-size:16px;font-weight:800;letter-spacing:-.01em;min-width:150px;text-align:center}
  .cal-nav{width:34px;height:34px;border:1px solid var(--line);background:var(--panel2);color:var(--ink);border-radius:9px;
    cursor:pointer;font-size:18px;line-height:1;font-family:inherit;display:grid;place-items:center}
  .cal-nav:hover{border-color:var(--muted)}
  .cal-today{margin-left:6px;border:1px solid var(--line);background:var(--panel2);color:var(--ink);border-radius:9px;height:34px;
    padding:0 12px;cursor:pointer;font-size:12.5px;font-weight:600;font-family:inherit}
  .cal-today:hover{border-color:var(--accent);color:var(--accent-d)}
  .cal-nodate{margin-left:auto;font-size:12px;color:var(--muted)}
  .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
  .cal-dow{margin-bottom:6px}
  .cal-dow>div{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-weight:700;text-align:center;padding:2px 0}
  .cell{min-height:96px;border:1px solid var(--line);border-radius:10px;background:var(--panel2);padding:5px 6px 6px;
    display:flex;flex-direction:column;gap:3px;cursor:pointer;overflow:hidden;transition:.12s}
  .cell:hover{border-color:var(--muted)}
  .cell.out{opacity:.4}
  .cell.past{background:var(--chip)}
  .cell.pastover{background:rgba(216,69,58,.08);border-color:rgba(216,69,58,.28)}
  .cd{display:flex;align-items:center;justify-content:space-between;line-height:1}
  .dn{font-size:12.5px;font-weight:700;color:var(--ink);width:22px;height:22px;display:grid;place-items:center}
  .cell.today .dn{background:var(--accent);color:var(--on-accent);border-radius:50%}
  .cn{font-size:10.5px;font-weight:800;color:var(--muted);background:var(--track);border-radius:20px;padding:0 6px;min-width:18px;text-align:center}
  .cn.over{color:var(--on-fill);background:var(--neg)}
  .cch{font-size:11px;line-height:1.3;padding:1px 6px 1px 8px;border-radius:5px;background:var(--panel);border-left:3px solid var(--muted);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ink)}
  .cch.pri-high{border-left-color:#e5484d}.cch.pri-med{border-left-color:#e58a00}.cch.pri-low{border-left-color:#c2c8d2}
  .cch.over{color:var(--neg-d)}
  .cmore{font-size:10.5px;color:var(--muted);font-weight:600;padding-left:8px}
  .cal-legend{display:flex;gap:14px;flex-wrap:wrap;margin-top:12px;font-size:11.5px;color:var(--muted)}
  .cal-legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px;vertical-align:middle}
  .dprow{display:flex;align-items:center;gap:8px;padding:8px 0;border-top:1px solid var(--line);font-size:13px}
  .dprow:first-of-type{border-top:none}
  .dpp{width:9px;height:9px;border-radius:50%;flex:0 0 auto;background:var(--muted)}
  .dprow.pri-high .dpp{background:#e5484d}.dprow.pri-med .dpp{background:#e58a00}.dprow.pri-low .dpp{background:#c2c8d2}
  .dpt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .dprow.over .dpt{color:var(--neg-d);font-weight:600}
  .dpa{font-size:11.5px;color:var(--muted);white-space:nowrap}
  .dps{font-size:10.5px;color:var(--muted);white-space:nowrap}
  .dpl{flex:0 0 auto;font-size:14px;text-decoration:none}
  @media(max-width:680px){
    .cal-grid{gap:3px}
    .cell{min-height:58px;padding:3px}
    .cch{font-size:0;padding:0;height:6px;border-left:0;border-radius:2px;background:var(--muted)}
    .cch.pri-high{background:#e5484d}.cch.pri-med{background:#e58a00}.cch.pri-low{background:#c2c8d2}
    .cmore,.cal-legend span:last-child{display:none}
    .dn{font-size:11px;width:18px;height:18px}
  }
  .ffilter{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 12px}
  .ffilter select{font-size:12px;padding:5px 8px}
  .ffilter .fl{font-size:11px;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.04em}
  .qchip{font-size:12px;font-weight:600;color:var(--ink);border:1px solid var(--line);background:var(--panel);border-radius:20px;padding:5px 11px;white-space:nowrap}
  .qchip:hover{background:var(--panel2)}.qchip.on{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
  .qchip .n{color:var(--muted)}.qchip.on .n{color:rgba(255,255,255,.85)}

  @media(max-width:900px){.kpis,.grid,.people{grid-template-columns:1fr 1fr}.kpi .val{font-size:25px}}

  /* ===== ТЕЛЕФОН ≤760: off-canvas drawer ===== */
  .mtop{display:none}.sbscrim{display:none}
  @media(max-width:760px){
    body{display:block}
    .main{width:100%}
    .wrap{padding:0 13px calc(30px + env(safe-area-inset-bottom))}

    /* мобильный топ-бар с гамбургером (бургер сайдбара уезжает вместе с ним) */
    .mtop{display:flex;align-items:center;gap:10px;position:sticky;top:0;z-index:50;background:var(--sidebar);color:#fff;
      height:calc(52px + env(safe-area-inset-top));padding:env(safe-area-inset-top) 12px 0}
    .mtop .mbtn,.mtop .mtheme{width:40px;height:40px;flex:none;border:1px solid #2b3346;background:#1b2130;color:#e7eaf2;
      border-radius:10px;font-size:19px;display:grid;place-items:center;cursor:pointer;font-family:inherit}
    .mtop .mtheme{margin-left:auto}
    .mtop .mbrand{display:flex;align-items:center;gap:9px;font-weight:800;font-size:16px;color:#fff}
    .mtop .mbrand .mk{width:26px;height:26px;border-radius:7px;display:grid;place-items:center;font-size:14px;
      background:linear-gradient(135deg,var(--brand),#f0a060)}

    /* сайдбар → выезжающая панель */
    .sb{position:fixed;top:0;left:0;height:100vh;height:100dvh;width:262px;max-width:84vw;flex-basis:auto;
      transform:translateX(-100%);transition:transform .24s ease;z-index:1000;box-shadow:0 0 46px rgba(0,0,0,.5);
      padding-top:env(safe-area-inset-top)}
    html.navopen .sb{transform:none}
    html.sbc .sb{width:262px;flex-basis:auto}            /* страховка от collapse на мобиле */
    .burger{display:none}
    .sbscrim{display:none;position:fixed;inset:0;background:rgba(10,13,22,.5);z-index:900}
    html.navopen .sbscrim{display:block}
    html.navopen{overflow:hidden}

    /* сетки в одну колонку */
    .kpis,.grid,.people,.tgrid,.tstats,.secgrid{grid-template-columns:1fr}
    .head{padding:14px 0 8px}.head h1{font-size:19px}

    /* «Операционные»: липкая первая колонка (её не было) */
    .tblwrap{-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain}
    table.rtab th.m,table.rtab td.m{position:sticky;left:0;z-index:2;background:var(--panel);min-width:148px}
    table.rtab tr:hover td.m{background:var(--panel2)}
    table.rtab tr.grpr td.m{position:static;min-width:0;background:var(--panel2)}
    table.rtab th,table.rtab td{padding:6px 9px}

    /* задачи: в столбик */
    li.task{flex-wrap:wrap}
    .tmain{flex:1 1 100%}
    .tside{flex:1 1 100%;justify-content:flex-start;flex-wrap:wrap;margin-top:6px}
    select.tassignee{max-width:none}
    .addbar,.addrow,.addmore,.tkpanel{flex-direction:column;align-items:stretch}
    .addbar .addtext,.addbar input[type=text]{min-width:0;width:100%}
    .viewsw{width:100%}.viewsw a.vbtn{flex:1;text-align:center}
    .chips{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:4px}

    /* анти-зум iOS + тач-цели */
    input,select,textarea{font-size:16px!important}
    button.primary,.iconbtn,.addbtn,.linkbtn,.menuact,.addbar button.plus,.cal-nav,.cal-today{min-height:44px}
    input[type=checkbox]{width:22px;height:22px}
    .sb-nav a{padding:12px}
    a.chip,.qchip,a.vbtn{padding:9px 13px}
    .tact{padding:8px 12px}

    /* модалки не выше экрана */
    .dhbox{width:min(96vw,440px);max-height:88dvh;overflow:auto}
    #dhtoast{bottom:calc(22px + env(safe-area-inset-bottom))}
  }

  @media(max-width:620px){
    .act{grid-template-columns:auto 1fr}.assignee,.adue{grid-column:2}
    .text{white-space:normal}
  }

  /* ===== Тост + модалка (единый стиль вместо системных alert/prompt) ===== */
  #dhtoast{position:fixed;bottom:22px;left:50%;transform:translateX(-50%) translateY(20px);z-index:200;
    display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
  .dht{background:#1f2430;color:#fff;padding:11px 18px;border-radius:11px;font-size:13.5px;font-weight:600;
    box-shadow:0 8px 30px rgba(0,0,0,.28);opacity:0;transform:translateY(12px);transition:.22s;max-width:min(92vw,460px);
    display:flex;align-items:center;gap:9px}
  .dht.show{opacity:1;transform:translateY(0)}
  .dht.err{background:#d8453a}.dht.ok{background:#1f9d55}
  /* п.48 (31.08.2026, блок 15): значок тоста — точка, а не эмодзи ⚠️/✅/ℹ️.
     Цвет плашки уже отличает ошибку от успеха, знак только отмечает начало строки. */
  .dht .i{width:8px;height:8px;border-radius:50%;background:currentColor;flex:none;opacity:.85}
  .dhmask{position:fixed;inset:0;background:var(--mask);backdrop-filter:blur(2px);z-index:210;
    display:none;align-items:center;justify-content:center}
  .dhmask.show{display:flex}
  .dhbox{background:var(--panel);color:var(--ink);border-radius:14px;box-shadow:0 20px 60px rgba(0,0,0,.35);
    width:min(94vw,440px);padding:18px 18px 16px;border:1px solid var(--line)}
  .dhbox h4{margin:0 0 10px;font-size:15px}
  .dhbox input,.dhbox textarea{width:100%;border:1px solid var(--line);background:var(--panel2);color:var(--ink);
    border-radius:9px;padding:9px 11px;font-size:14px;font-family:inherit;outline:none}
  .dhbox input:focus,.dhbox textarea:focus{border-color:var(--accent)}
  .dhbox textarea{min-height:72px;resize:vertical}
  .dhbox .msg{color:var(--muted);font-size:13px;line-height:1.45;margin:2px 0 4px;
              white-space:pre-line;  /* блок 6, 30.08.2026: текст ставится через textContent,
                 без pre-line абзацы \n\n схлопывались в одну простыню */
              background:none;border:none;padding:0;border-radius:0}
  /* Гашение фона — блок 12, 31.08.2026. Глобальный .msg (строка 151) — зелёная плашка
     «успешно», и askConfirm брал её себе: текст ЛЮБОГО подтверждения, включая удаление
     сотрудника, показывался на зелёном фоне «всё хорошо». Специфичность .dhbox .msg
     перебивала только color, фон/рамка/отступы протекали. Задевает все экраны
     с askConfirm — правка вне блока по решению №5, поведение только исправлено. */
  .dhbtns{display:flex;justify-content:flex-end;gap:9px;margin-top:14px}
  .dhbtns button{border:1px solid var(--line);background:var(--panel);color:var(--ink);border-radius:9px;padding:8px 15px;
    cursor:pointer;font-size:13.5px;font-weight:600;font-family:inherit}
  .dhbtns button.pri{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
  .dhbtns button.pri:hover{background:var(--accent-d)}
  .dhbtns button.danger{background:var(--neg);border-color:var(--neg);color:var(--on-fill)}

/* ——— сведено 29.08.2026, этап 2: селекторы, повторявшиеся по файлам без расхождений ——— */
/* .sub НЕ сведён: в финансах это строка P&L, в складе — подпись. Коллизия имён. */
table.zt th.l,table.zt td.l{text-align:left}   /* было в 10 шаблонах */
.btn.gh{background:var(--panel2);color:var(--ink);border:1px solid var(--line)}   /* было в 10 шаблонах */
table.zt tbody tr:hover{background:var(--panel2)}   /* было в 9 шаблонах */
.st-cancelled{background:var(--chip);color:var(--muted);text-decoration:line-through}   /* было в 6 шаблонах */
.kpi.crit .val{color:var(--neg-d)}   /* было в 6 шаблонах */
.kpi.need .val{color:var(--warn-d)}   /* было в 6 шаблонах */
.frm input,.frm select{font-size:13px;padding:7px 10px;border:1px solid var(--line);border-radius:9px; background:var(--panel2);color:var(--ink);font-family:inherit}   /* было в 5 шаблонах */
.btn.grn{background:var(--pos,#1f9d55)}   /* было в 4 шаблонах */
details.lines-d summary{cursor:pointer;color:var(--accent);font-weight:700;font-size:12px}   /* было в 3 шаблонах */
.obar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:12px}   /* было в 3 шаблонах */
.chipf.on{background:var(--accent);color:var(--on-accent);border-color:var(--accent);font-weight:700}   /* 09.09.2026: активный чип везде одинаковый — как .dh-chip-active */
#shown b{color:var(--fg)}   /* было в 3 шаблонах */
.pwrap{max-width:100%;width:100%}   /* было в 3 шаблонах */
.st.ok{background:rgba(120,130,150,.14);color:var(--muted)}   /* было в 3 шаблонах */
.muted{color:var(--muted);font-size:12px}   /* было в 3 шаблонах */

/* ——— этап 6: доминирующие варианты (≥70% файлов, без коллизий между разделами) ——— */
table.zt{width:100%;border-collapse:collapse;font-size:13px}   /* доминировал в 9 шаблонах */
table.zt th,table.zt td{padding:7px 9px;border-bottom:1px solid var(--line);text-align:right;white-space:nowrap}   /* доминировал в 8 шаблонах */
table.zt th{background:var(--panel2);font-size:11px;color:var(--muted)}   /* доминировал в 8 шаблонах */
.mut{color:var(--muted)}   /* доминировал в 6 шаблонах */
.chipf{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:700;padding:5px 11px;border-radius:999px;background:var(--panel);color:var(--ink);border:1px solid var(--line);cursor:pointer;user-select:none;white-space:nowrap}   /* 09.09.2026: форма канонического чипа */
.chipf:hover{background:var(--panel2)}
.foot{color:var(--muted);font-size:12px;margin-top:11px;line-height:1.55}   /* доминировал в 3 шаблонах */
table.pt{width:100%;border-collapse:collapse;font-size:13px}   /* доминировал в 3 шаблонах */

/* ===== Dashhub UI Library API (утверждено 30.08.2026, 54 блока) =====
   Новые экраны собираются на dh-* классах. Старые .btn/.kpi/table.zt остаются
   для совместимости и переводятся на dh-* только при касании экрана. */
:root{
  --dh-radius-xs:4px;
  --dh-radius-sm:6px;
  --dh-radius-md:8px;
  --dh-radius-lg:12px;
  --dh-space-1:4px;
  --dh-space-2:8px;
  --dh-space-3:12px;
  --dh-space-4:16px;
  --dh-space-5:20px;
  --dh-space-6:24px;
  --dh-z-base:1;
  --dh-z-sticky:20;
  --dh-z-sidebar:30;
  --dh-z-overlay:210;
  --dh-z-toast:220;
  --dh-font-xs:11px;
  --dh-font-sm:12px;
  --dh-font-md:13px;
  --dh-font-base:14px;
  --dh-font-lg:18px;
  --dh-font-xl:22px;
}
.dh-page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--dh-space-4);flex-wrap:wrap;padding:20px 0 10px;border-bottom:1px solid transparent}
.dh-page-title{margin:0;font-size:var(--dh-font-xl);font-weight:800;letter-spacing:0;line-height:1.2}
/* Подзаголовок шапки. Был только у легаси-`.head`; без него у экранов, переведённых
   на `.dh-page-head`, пояснение под заголовком теряло приглушённый цвет и размер
   и читалось как основной текст. Добавлено 30.08.2026, блок 4, шаг 3.6. */
.dh-page-head p{margin:3px 0 0;color:var(--muted);font-size:var(--dh-font-md)}
body.embed .dh-page-head{padding-top:6px}
.dh-page-fresh{display:flex;align-items:center;gap:var(--dh-space-2);flex-wrap:wrap;color:var(--muted);font-size:var(--dh-font-sm)}
.dh-actions{display:flex;align-items:center;gap:var(--dh-space-2);flex-wrap:wrap}
.dh-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:36px;border-radius:var(--dh-radius-md);padding:7px 13px;border:1px solid transparent;font-family:inherit;font-size:var(--dh-font-md);font-weight:700;line-height:1.2;cursor:pointer;text-decoration:none;white-space:nowrap}
.dh-btn-primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.dh-btn-primary:hover{background:var(--accent-d);border-color:var(--accent-d)}
.dh-btn-secondary{background:var(--panel);border-color:var(--line);color:var(--ink)}
.dh-btn-secondary:hover{background:var(--panel2);border-color:var(--muted)}
.dh-btn-danger{background:var(--neg);border-color:var(--neg);color:var(--on-fill)}
.dh-btn-ghost{background:transparent;border-color:transparent;color:var(--accent-d)}
.dh-btn[disabled],.dh-btn.dh-disabled{background:var(--chip);border-color:var(--line);color:var(--muted);cursor:not-allowed}
.dh-table-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--dh-radius-lg);background:var(--panel);box-shadow:var(--shadow)}
table.dh-table{width:100%;border-collapse:collapse;font-size:var(--dh-font-md);white-space:nowrap}
table.dh-table th,table.dh-table td{padding:7px 9px;border-bottom:1px solid var(--line);text-align:right;font-variant-numeric:tabular-nums}
table.dh-table th{position:sticky;top:0;z-index:var(--dh-z-sticky);background:var(--panel2);color:var(--muted);font-size:var(--dh-font-xs);text-transform:uppercase;letter-spacing:0;font-weight:800}
table.dh-table .dh-left{text-align:left;white-space:normal;font-variant-numeric:normal}
table.dh-table.dh-zebra tbody tr:nth-child(even) td{background:var(--panel2)}
table.dh-table tbody tr:hover td{background:var(--panel2)}
table.dh-table .dh-total-row td{position:sticky;bottom:0;background:var(--panel);font-weight:800;border-top:2px solid var(--line)}
.dh-num{text-align:right;font-variant-numeric:tabular-nums}
.dh-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--dh-space-3)}
.dh-kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--dh-radius-lg);padding:14px 16px;box-shadow:var(--shadow)}
.dh-kpi-label{color:var(--muted);font-size:var(--dh-font-sm);font-weight:700;min-height:32px}
.dh-kpi-value{font-size:26px;font-weight:800;letter-spacing:0;margin:4px 0 2px;font-variant-numeric:tabular-nums}
.dh-kpi-note{color:var(--muted);font-size:var(--dh-font-sm)}
.dh-kpi-ok{border-left:3px solid var(--pos)}.dh-kpi-ok .dh-kpi-value{color:var(--pos-d)}
.dh-kpi-warn{border-left:3px solid var(--warn)}.dh-kpi-warn .dh-kpi-value{color:var(--warn-d)}
.dh-kpi-danger{border-left:3px solid var(--neg)}.dh-kpi-danger .dh-kpi-value{color:var(--neg-d)}
.dh-filterbar{display:flex;align-items:center;gap:var(--dh-space-2);flex-wrap:wrap;margin:10px 0 14px}
.dh-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--panel);color:var(--ink);border-radius:999px;padding:5px 11px;font-size:var(--dh-font-sm);font-weight:700;cursor:pointer;white-space:nowrap}
.dh-chip:hover{background:var(--panel2)}.dh-chip-active{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.dh-chip .dh-count{color:var(--muted);font-weight:600}.dh-chip-active .dh-count{color:inherit;opacity:.85}
.dh-filter-panel{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:var(--dh-space-3);background:var(--panel);border:1px solid var(--line);border-radius:var(--dh-radius-lg);padding:var(--dh-space-4);box-shadow:var(--shadow)}
.dh-status,.dh-source{display:inline-flex;align-items:center;gap:6px;border-radius:999px;padding:2px 8px;font-size:var(--dh-font-xs);font-weight:800;white-space:nowrap}
.dh-status-ok{background:rgba(31,157,85,.13);color:var(--pos-d)}.dh-status-warn{background:rgba(217,154,22,.15);color:var(--warn-d)}
.dh-status-danger{background:rgba(216,69,58,.12);color:var(--neg-d)}   /* 09.09.2026: --neg рассчитан на заливку, как текст в тёмной теме давал 3,9 */.dh-status-muted{background:var(--chip);color:var(--muted)}
.dh-status-dot::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}
.dh-source-wb{background:rgba(203,17,171,.12);color:var(--wb)}.dh-source-ozon{background:rgba(0,91,255,.12);color:var(--oz)}
.dh-source-1c{background:rgba(91,100,114,.14);color:var(--skl)}.dh-source-total{background:var(--chip);color:var(--ink)}
.dh-field{display:flex;flex-direction:column;gap:5px;min-width:0}
.dh-label{font-size:var(--dh-font-sm);font-weight:800;color:var(--muted)}
.dh-help{font-size:var(--dh-font-sm);color:var(--muted);line-height:1.45}.dh-error{font-size:var(--dh-font-sm);color:var(--neg-d);font-weight:700}
.dh-unit{position:relative}.dh-unit>input{padding-right:42px}.dh-unit::after{content:attr(data-unit);position:absolute;right:12px;top:50%;transform:translateY(-50%);color:var(--muted);font-size:var(--dh-font-sm);font-weight:700;pointer-events:none}
.dh-empty{text-align:center;padding:28px 18px;border:1px dashed var(--line);border-radius:var(--dh-radius-lg);background:var(--panel);color:var(--muted)}
.dh-empty b{display:block;color:var(--ink);font-size:var(--dh-font-base);margin-bottom:4px}
.dh-alert{border:1px solid var(--line);border-left:4px solid var(--warn);background:var(--panel);border-radius:var(--dh-radius-lg);padding:12px 14px;color:var(--ink);font-size:var(--dh-font-md)}
/* Подпись формата рядом с кнопкой «Скачать» (п.6 канона: имя кнопки — действие,
   формат — подписью). Добавлено 30.08.2026, блок 4; используется на /sklad,
   /sklad/fbs, /sklad/svodka. */
.fmt{font-weight:400;opacity:.7;font-size:11px;margin-left:4px}
.dh-alert-danger{border-left-color:var(--neg);background:rgba(216,69,58,.07)}
.dh-skeleton{position:relative;overflow:hidden;background:var(--chip);border-radius:var(--dh-radius-md);min-height:18px}
.dh-skeleton::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,rgba(255,255,255,.25),transparent);animation:dh-shimmer 1.2s infinite}
@keyframes dh-shimmer{100%{transform:translateX(100%)}}
.dh-progress{display:flex;align-items:center;gap:var(--dh-space-3);color:var(--muted);font-size:var(--dh-font-sm)}
.dh-selection-bar,.dh-unsaved-bar{position:sticky;bottom:0;z-index:var(--dh-z-sticky);display:flex;align-items:center;gap:var(--dh-space-3);flex-wrap:wrap;background:var(--sidebar);color:#fff;border-radius:var(--dh-radius-lg);padding:10px 12px;box-shadow:0 -6px 24px rgba(0,0,0,.18)}
.dh-dirty{background:rgba(232,132,60,.12)!important;box-shadow:inset 0 0 0 1px rgba(232,132,60,.35)}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
@media(max-width:768px){
  .dh-page-head{align-items:flex-start}
  .dh-page-title{font-size:var(--dh-font-lg)}
  .dh-actions{width:100%}
  .dh-actions .dh-btn{flex:1 1 auto}
  .dh-table-wrap{border-radius:var(--dh-radius-md)}
  table.dh-table .dh-sticky-first{position:sticky;left:0;z-index:var(--dh-z-base);background:var(--panel)}
}

/* ===== Блок 1 миграции (30.08.2026): замена инлайн-стилей в panel.html / ops.html ===== */
.fresh select{font-weight:600}
.ava.sm{width:22px;height:22px;font-size:11px}
.dh-muted{color:var(--muted)}
.dh-ok-tag{color:var(--pos-d)}
.dh-inv-hint{color:var(--muted);font-size:10px;font-weight:400;white-space:nowrap}

  /* Ссылка-переход в подзаголовке экрана (блок 2, 30.08.2026). Общая: /tasks, /taskstats, /rules */
  .dh-link{color:var(--accent-d);font-weight:600}
  .dh-link:hover{text-decoration:underline}

  /* ===== Блок 4, шаг 3.6 (30.08.2026): общие партиалы склада и закупок =====
     Оба набора правил жили в <style> ВНУТРИ партиалов, то есть уезжали в <body>
     каждого экрана, который их подключает, и дублировались при повторном include.
     Здесь им место по решению №6: переиспользуются несколькими экранами. */

  /* Панель KPI-плиток `_kpi_panel.html` — 6 экранов: /sklad, /sklad/ostatki,
     /sklad/kontur, /sklad/assembly, /zakupki/orders, /maket/zakupki.
     Hex → токены (п.32). Светофор — `.dh-dot` вместо эмодзи (п.48).
     Плитка «в норме» нейтральна, цвет только при выходе за норму (п.3):
     модификатор `.lg` намеренно не красит ни рамку, ни цифру. */
  .kkpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:var(--dh-space-3);margin-bottom:var(--dh-space-4)}
  .kkpi{background:var(--panel);border:1px solid var(--line);border-radius:14px;
        box-shadow:var(--shadow);padding:12px 14px;display:block;text-decoration:none;color:inherit;
        border-left:4px solid var(--line)}
  .kkpi.ly{border-left-color:var(--warn)}
  .kkpi.lr{border-left-color:var(--neg)}
  .kkpi .klab{font-size:11.5px;color:var(--muted);font-weight:700;margin-bottom:3px}
  .kkpi .kval{font-size:22px;font-weight:800;line-height:1.15;font-variant-numeric:tabular-nums}
  .kkpi.ly .kval{color:var(--warn-d)}
  .kkpi.lr .kval{color:var(--neg-d)}
  .kkpi .kval small{font-size:12px;font-weight:600;color:var(--muted);font-variant-numeric:normal}
  .kkpi .kval .dh-dot{margin-right:7px;vertical-align:.14em}
  .kkpi .ksub{font-size:11px;color:var(--muted);margin-top:4px;line-height:1.45}
  .kkpi .knorm{font-size:10px;color:var(--muted);margin-top:5px;opacity:.75}
  a.kkpi:hover{border-color:var(--accent)}

  /* Подшапка раздела «Склад» `_sklad_nav.html` — 4 экрана: /sklad/ostatki,
     /sklad/komplekty, /sklad/problemy, /sklad/svodka. Подчёркнутые вкладки = разделы (п.14).
     Было: `#2563eb` хексом (запрет п.32) и `var(--fg)` — несуществующий токен,
     из-за чего наведение на неактивную вкладку не меняло цвет вообще. */
  .sknav{display:flex;gap:2px;margin:-4px 0 var(--dh-space-4);border-bottom:1px solid var(--line);flex-wrap:wrap}
  .sknav a{padding:9px 15px;font-size:13.5px;color:var(--muted);text-decoration:none;
           border-bottom:2px solid transparent;white-space:nowrap}
  .sknav a:hover{color:var(--ink)}
  .sknav a.on{color:var(--info-d);border-bottom-color:var(--info);font-weight:600}
  .sknav a .cnt{display:inline-block;margin-left:6px;color:var(--neg-d);
                background:color-mix(in srgb,var(--neg) 12%,transparent);
                border-radius:9px;padding:1px 7px;font-size:10.5px;font-weight:700;vertical-align:1px}

  /* Свежесть данных (п.9) — строка «на дату» с чипами источников.
     Была экранным правилом /sklad/ostatki; 31.08.2026 её подключили ещё три экрана
     блока 6, поэтому по решению 6 правило живёт в общем файле. */
  .asof{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 14px;padding:9px 12px;
        background:var(--panel);border:1px solid var(--line);border-radius:12px;font-size:12.5px}
  .asof .lbl{font-weight:700;color:var(--ink)}
  .asof .src{color:var(--muted);background:var(--chip);border-radius:999px;padding:3px 10px;white-space:nowrap}
  .asof .src b{color:var(--ink);font-weight:600}
  

  /* ===== Решение №55 прототипа склада v3 (04.09.2026): меню колонок — общий компонент =====
     Скрипт static/dh_columns.js. Первое применение — /sklad/ostatki. Кандидат в блок 55 библиотеки:
     клик по заголовку → сортировка ↑/↓ + фильтр по колонке; кнопка «Колонки» → показать/скрыть.
     Цвета только токенами; в тёмной теме переключаются сами. */
  .dh-th{cursor:pointer;user-select:none;position:relative}
  .dh-th:hover{color:var(--ink)}
  .dh-th i.dh-srt{font-style:normal;opacity:.35;margin-left:2px;font-size:10px}
  .dh-th.dh-th-s{color:var(--info-d)}
  .dh-th.dh-th-s i.dh-srt{opacity:1}
  .dh-th.dh-th-f::after{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:5px;vertical-align:middle}
  .dh-colmenu{position:absolute;left:0;top:100%;width:250px;background:var(--panel);border:1px solid var(--line);border-radius:9px;padding:8px;
    box-shadow:var(--shadow);z-index:var(--dh-z-overlay);text-transform:none;letter-spacing:0;font-weight:400;font-size:12.5px;text-align:left;color:var(--ink);cursor:default;white-space:normal}
  .dh-colmenu.right{left:auto;right:0}
  .dh-colmenu .cm-title,.dh-dropdown .cm-title{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;padding:2px 8px 6px;font-weight:700}
  .dh-colmenu .cm-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer}
  .dh-colmenu .cm-item:hover{background:var(--panel2)}
  .dh-colmenu .cm-item.on{background:color-mix(in srgb,var(--accent) 12%,var(--panel));font-weight:600}
  .dh-colmenu .k,.dh-columns .k{margin-left:auto;font-size:11px;color:var(--muted);font-weight:400}
  .dh-colmenu .cm-sep{height:1px;background:var(--line);margin:6px 2px}
  .dh-colmenu .cm-search,.dh-colmenu .cm-range input{width:100%;box-sizing:border-box;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:6px 8px;font:inherit;font-size:12px;color:var(--ink)}
  .dh-colmenu .cm-search{margin:4px 0 6px}
  .dh-colmenu .cm-opt,.dh-columns .cm-opt{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:6px;cursor:pointer;font-size:12px}
  .dh-colmenu .cm-opt{font-family:ui-monospace,Menlo,Consolas,monospace}
  .dh-colmenu .cm-opt:hover,.dh-columns .cm-opt:hover{background:var(--panel2)}
  .dh-colmenu .cm-all{font-family:inherit;font-weight:600;border-bottom:1px solid var(--line);border-radius:0;margin-bottom:4px}
  .dh-colmenu .cm-list{max-height:168px;overflow:auto}
  .dh-colmenu .chk,.dh-columns .chk{display:inline-block;width:14px;height:14px;border:1.5px solid var(--muted);border-radius:4px;flex:none;background:var(--panel)}
  .dh-colmenu .chk.on,.dh-columns .chk.on{background:var(--accent);border-color:var(--accent)}
  .dh-colmenu .cm-range{display:flex;align-items:center;gap:6px;margin:4px 0}
  .dh-colmenu .cm-range span{color:var(--muted)}
  .dh-colmenu .cm-cnt{font-size:11.5px;color:var(--muted);padding:4px 8px}
  .dh-colmenu .cm-foot,.dh-columns .cm-foot{display:flex;align-items:center;gap:6px;margin-top:8px;padding-top:8px;border-top:1px solid var(--line)}
  .dh-colmenu .cm-foot .dh-btn,.dh-columns .cm-foot .dh-btn{min-height:30px;padding:4px 10px;font-size:12px}
  .dh-colmenu .cm-foot .dh-btn:last-child,.dh-columns .cm-foot .dh-btn:last-child{margin-left:auto}
  .dh-colhost{position:relative}
  .dh-dropdown{position:absolute;right:0;top:calc(100% + 4px);min-width:200px;background:var(--panel);border:1px solid var(--line);border-radius:9px;padding:6px;
    box-shadow:var(--shadow);z-index:var(--dh-z-overlay);text-align:left;font-weight:400;color:var(--ink)}
  .dh-columns{min-width:260px;max-height:420px;overflow:auto;text-transform:none;letter-spacing:0;font-size:12.5px}
  .dh-columns .cm-opt.cm-fixed{color:var(--muted);cursor:default}
  .dh-chip.dh-cm-state{background:var(--panel2);cursor:default}
  .dh-chip.dh-cm-state u{color:var(--accent-d);cursor:pointer;text-decoration:none;font-weight:700}
  /* Свежесть (п.19): источник старше порога — чип краснеет, порог в title. Добавлено 04.09.2026, экран остатков v3. */
  .asof .src.stale{background:color-mix(in srgb,var(--neg) 12%,transparent);color:var(--neg-d)}
  .asof .src.stale b{color:var(--neg-d)}

/* ===== Решение №56 библиотеки (04.09.2026): поле «выбор из справочника» — общий компонент =====
     Скрипт static/dh_pick.js (п.43 канона: автодополнение из справочника, поиск по коду и названию,
     «завести новый» из того же поля). Первое применение — карточка товара /sklad/v3/tovar (возвращено 05.09.2026 после отката 04.09).
     Ручной ввод в поле закрыт: значение только из списка или «＋ завести». Цвета — токенами. */
  .dh-pick{position:relative;display:flex;align-items:center;width:100%;min-height:36px;text-align:left;padding:7px 28px 7px 11px;
    border:1px solid var(--line);border-radius:var(--dh-radius-md);background:var(--panel2);color:var(--ink);font-family:inherit;
    font-size:var(--dh-font-md);cursor:pointer;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .dh-pick::after{content:"▾";position:absolute;right:10px;top:50%;transform:translateY(-50%);color:var(--muted);font-size:12px;pointer-events:none}
  .dh-pick.dh-pick-empty{color:var(--muted);font-weight:400}
  .dh-pick.open{outline:2px solid var(--accent);outline-offset:1px;background:var(--panel)}
  .dh-pick[disabled],.dh-pick[aria-disabled=true]{cursor:not-allowed;color:var(--muted);background:var(--chip)}
  .dh-pick-pop{position:absolute;z-index:var(--dh-z-overlay);background:var(--panel);border:1px solid var(--line);border-radius:10px;
    box-shadow:var(--shadow);min-width:230px;max-width:min(440px,calc(100vw - 24px));padding:6px;font-size:var(--dh-font-md);color:var(--ink);box-sizing:border-box}
  .dh-pick-pop input.dh-pick-q{width:100%;box-sizing:border-box;margin:0 0 6px;font-size:var(--dh-font-md);padding:6px 9px;border:1px solid var(--line);
    border-radius:8px;background:var(--panel2);color:var(--ink);font-family:inherit}
  .dh-pick-pop .dh-pick-list{max-height:248px;overflow:auto}
  .dh-pick-pop .dh-pick-opt{padding:6px 9px;border-radius:7px;cursor:pointer;display:flex;gap:8px;align-items:baseline;min-width:0}
  .dh-pick-pop .dh-pick-opt>span{flex:none}
  .dh-pick-pop .dh-pick-opt small{color:var(--muted);font-size:var(--dh-font-xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
  .dh-pick-pop .dh-pick-opt:hover,.dh-pick-pop .dh-pick-opt.hl{background:var(--panel2)}
  .dh-pick-pop .dh-pick-opt.cur{font-weight:700}
  .dh-pick-pop .dh-pick-new{color:var(--accent-d);border-top:1px solid var(--line);border-radius:0;margin-top:4px;padding-top:9px;font-weight:600}
  .dh-pick-pop .dh-pick-none{padding:6px 9px;color:var(--muted)}
  @media(max-width:760px){ .dh-pick{min-height:44px;font-size:16px} .dh-pick-pop .dh-pick-opt{min-height:40px;align-items:center} }

/* Переключатель числа строк на странице — общий компонент больших таблиц (08.09.2026).
   Разметка `_page_size.html`. Стили жили только в слое версии 2 (`sklad_v2_live.css`),
   из-за чего на старых экранах подписи слипались в «2550100300все». Подняты в общий
   слой, чтобы компонент выглядел одинаково на любом экране. Цвета — только токенами. */
.sz { display: inline-flex; align-items: center; gap: 5px; color: var(--muted); font-size: 11.5px; }
.sz a { text-decoration: none; }
.sz b { background: color-mix(in srgb, var(--accent) 12%, var(--panel));
  border: 1px solid var(--accent); color: var(--ink); border-radius: 6px; padding: 3px 9px; font-weight: 600; }
.sz span { background: var(--panel); border: 1px solid var(--line);
  color: var(--muted); border-radius: 6px; padding: 3px 9px; }
.sz a:hover span { border-color: var(--accent); color: var(--ink); }

/* Номера страниц — общий компонент `_paging.html` (08.09.2026, решение №64).
   Стили подняты в общий файл, чтобы компонент работал на любом экране Dashhub,
   а не только в версии 2 — та же история, что со стилями выбора числа строк. */
.pgs{display:inline-flex;align-items:center;gap:2px;margin-left:12px}
.pgs a,.pgs b,.pgs .pgs-gap{padding:3px 8px;border-radius:6px;font:600 12px/1 inherit;text-decoration:none}
.pgs a{color:var(--muted);border:1px solid transparent}
.pgs a:hover{color:var(--ink);border-color:var(--line);background:var(--panel)}
.pgs b{color:var(--ink);background:var(--panel);border:1px solid var(--line)}
.pgs .pgs-gap{color:var(--muted);opacity:.6;padding:0 2px}

/* Заголовок-ссылка сортировки — общий компонент `sorting.py` (08.09.2026, решение №65).
   Заголовок остаётся заголовком: цвет и вес не меняем, подчёркивание только при наведении,
   стрелка направления — рядом с названием. */
th a.sh{color:inherit;text-decoration:none;display:inline-block}
th a.sh:hover{text-decoration:underline;text-underline-offset:3px}
th a.sh .srt{margin-left:3px;opacity:.85}

/* Описание экрана не должно выталкивать действие на вторую строку: кнопка остаётся
   справа от заголовка (единое расположение, решение Алексея 08.09.2026). */
.dh-page-head>div:first-child{max-width:min(1000px,72%)}

/* Клиентские страницы (dh_pager.js, 08.09.2026): своё скрытие — классом,
   чтобы не путаться со скрытием строк фильтром экрана (тот ставит style). */
.dh-pg-off{display:none !important}
.dh-pager{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:11px 14px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}
.dh-pager .mk-cnt b{color:var(--ink)}

/* 09.09.2026: браузер даёт формам свой шрифт (Arial), из-за чего кнопки на главной,
   в задачнике, «Проблемах», «Комплектах» и закупках выпадали из общего вида. */
button,input,select,textarea{font-family:inherit}
