/* =====================================================================
   AGRO OS — DESIGN V3
   Источник правды: «AGRO OS Design V3.dc.html» (борды 2a…6i) и
   AGRO_OS_DESIGN_V3_CLAUDE_CODE_HANDOFF.md. Новых значений здесь нет:
   числа, которого нет на борде, нет и в этом файле.

   Файл грузится ПОСЛЕ app.css и делает две вещи:
     1) переводит 92 токена версии 1.0 на значения V3 — поэтому все
        существующие экраны получают новый визуальный слой, а их
        разметку никто не переписывал;
     2) добавляет каркас V3 и компоненты C-01…C-56, которых в 1.0 не
        было вовсе.
   Порядок существенный: перекрашивать компоненты поштучно вместо
   токенов означало бы завести второй источник правды о цвете.
   ===================================================================== */

/* --- Шрифты V3 -------------------------------------------------------
   Onest — заголовки и крупные числа, Manrope — интерфейс, таблицы,
   метаданные (§04.2). Оба лежат в проекте, SIL OFL 1.1:
   fonts/LICENSE-Onest.txt, fonts/LICENSE-Manrope.txt. Внешних CDN нет:
   правило проекта — интерфейс обязан открываться без связи с внешним
   миром, и Design V3 его не отменяет.
   -------------------------------------------------------------------- */
@font-face{font-family:'Onest';font-style:normal;font-weight:400;font-display:swap;
  src:url('/static/fonts/onest-cyrillic-400-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Onest';font-style:normal;font-weight:400;font-display:swap;
  src:url('/static/fonts/onest-latin-400-normal.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:'Onest';font-style:normal;font-weight:500;font-display:swap;
  src:url('/static/fonts/onest-cyrillic-500-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Onest';font-style:normal;font-weight:500;font-display:swap;
  src:url('/static/fonts/onest-latin-500-normal.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:'Onest';font-style:normal;font-weight:600;font-display:swap;
  src:url('/static/fonts/onest-cyrillic-600-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Onest';font-style:normal;font-weight:600;font-display:swap;
  src:url('/static/fonts/onest-latin-600-normal.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:'Onest';font-style:normal;font-weight:700;font-display:swap;
  src:url('/static/fonts/onest-cyrillic-700-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Onest';font-style:normal;font-weight:700;font-display:swap;
  src:url('/static/fonts/onest-latin-700-normal.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:'Onest';font-style:normal;font-weight:800;font-display:swap;
  src:url('/static/fonts/onest-cyrillic-800-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Onest';font-style:normal;font-weight:800;font-display:swap;
  src:url('/static/fonts/onest-latin-800-normal.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:'Manrope';font-style:normal;font-weight:400;font-display:swap;
  src:url('/static/fonts/manrope-cyrillic-400-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Manrope';font-style:normal;font-weight:400;font-display:swap;
  src:url('/static/fonts/manrope-latin-400-normal.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:'Manrope';font-style:normal;font-weight:500;font-display:swap;
  src:url('/static/fonts/manrope-cyrillic-500-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Manrope';font-style:normal;font-weight:500;font-display:swap;
  src:url('/static/fonts/manrope-latin-500-normal.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:'Manrope';font-style:normal;font-weight:600;font-display:swap;
  src:url('/static/fonts/manrope-cyrillic-600-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Manrope';font-style:normal;font-weight:600;font-display:swap;
  src:url('/static/fonts/manrope-latin-600-normal.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:'Manrope';font-style:normal;font-weight:700;font-display:swap;
  src:url('/static/fonts/manrope-cyrillic-700-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Manrope';font-style:normal;font-weight:700;font-display:swap;
  src:url('/static/fonts/manrope-latin-700-normal.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:'Manrope';font-style:normal;font-weight:800;font-display:swap;
  src:url('/static/fonts/manrope-cyrillic-800-normal.woff2') format('woff2');
  unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}
@font-face{font-family:'Manrope';font-style:normal;font-weight:800;font-display:swap;
  src:url('/static/fonts/manrope-latin-800-normal.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}

/* =====================================================================
   §04 ТОКЕНЫ V3
   Значения сняты с борда [2a] «Дизайн-система V3» — он объявлен
   источником правды для дизайна. Там, где §04 хендофа и борд
   расходятся, побеждает борд, а расхождение записано в
   docs/design-v3/CONTRADICTIONS.md.
   ===================================================================== */
:root{
  /* --- V3: цвет ---------------------------------------------------- */
  --v3-forest:#0B3D26;   --v3-brand:#10693F;    --v3-signal:#1F9D61;
  --v3-mint:#8FD9B0;     --v3-chart:#CFE6DA;    --v3-tint:#E9F5EE;
  --v3-tint-soft:#F3FAF6;
  --v3-ink:#0F1A14;      --v3-body:#55635B;     --v3-meta:#5C6B62;
  --v3-label:#64726B;    --v3-faint:#9AA8A0;
  --v3-surface:#FFFFFF;  --v3-surface-50:#FBFDFB;
  --v3-canvas:#F5F8F6;   --v3-board:#EEF2EF;
  --v3-line-100:#F0F3F1; --v3-line-200:#EDF1EE;
  --v3-line-300:#E2E9E4; --v3-line-400:#D5DED8;
  --v3-good:#15794C;
  --v3-bad:#C2382C;      --v3-bad-dot:#D8483B;  --v3-bad-line:#F7DCD8;
  --v3-bad-chip:#FEF1EF; --v3-bad-card:#FEF7F6; --v3-bad-panel:#FEFAF9;
  --v3-warn:#8A5E0F;     --v3-warn-dot:#D79A24; --v3-warn-line:#F6E6C8;
  --v3-warn-chip:#FEF6E7;--v3-warn-card:#FFFAF0;--v3-warn-panel:#FFFCF5;
  --v3-info:#2360BE;     --v3-info-dot:#3B7BD6; --v3-info-chip:#EDF3FD;
  --v3-info-panel:#FAFCFF;
  --v3-scrim:linear-gradient(95deg,rgba(6,25,16,.85),rgba(6,25,16,.15));

  /* --- V3: геометрия ------------------------------------------------ */
  --v3-sidebar:236px;    --v3-sidebar-collapsed:64px;
  --v3-topbar:64px;      --v3-page-pad:28px;    --v3-gutter:18px;
  --v3-drawer:336px;     --v3-drawer-overlay:420px;
  --v3-r-chip:999px;     --v3-r-control:11px;   --v3-r-card:14px;
  --v3-r-sheet:18px;     --v3-r-image:12px;
  --v3-shadow-card:0 1px 2px rgba(15,26,20,.04),0 14px 30px -18px rgba(15,26,20,.18);
  --v3-shadow-raised:0 1px 2px rgba(15,26,20,.04),0 18px 36px -24px rgba(15,26,20,.14);
  --v3-shadow-primary:0 10px 20px -12px rgba(16,105,63,.85);
  --v3-font-display:'Onest','Manrope',system-ui,sans-serif;
  --v3-font-text:'Manrope',system-ui,sans-serif;

  /* --- Перевод токенов 1.0 на V3 ------------------------------------
     Ни один экран не переписан: они читают эти же имена. */
  --color-brand:#10693F;            --color-brand-hover:#0B3D26;
  --color-brand-tint:#E9F5EE;       --color-brand-soft:#F3FAF6;
  --color-brand-border:#CFE6DA;
  --color-text:#0F1A14;             --color-text-body:#0F1A14;
  --color-text-secondary:#55635B;   --color-text-muted:#5C6B62;
  --color-border:#EDF1EE;           --color-border-strong:#E2E9E4;
  --color-divider:#F0F3F1;
  --color-bg:#F5F8F6;               --color-bg-alt:#FBFDFB;
  --color-surface:#FFFFFF;          --color-surface-instrument:#0F1A14;
  --color-success:#15794C;
  --color-attention:#8A5E0F;        --color-attention-surface:#FEF6E7;
  --color-attention-border:#F6E6C8; --color-warning:#D79A24;
  --color-critical:#C2382C;         --color-critical-surface:#FEF1EF;
  --color-critical-border:#F7DCD8;  --color-critical-accent:#D8483B;
  --color-disabled-surface:#F0F3F1; --color-disabled-text:#64726B;
  --font-family:'Manrope',system-ui,sans-serif;
  --font-mono:'IBM Plex Mono',ui-monospace,monospace;
  --font-size-display:32px; --font-size-h1:24px; --font-size-h2:20px;
  --font-size-h3:16px;      --font-size-body:13px; --font-size-small:12px;
  --font-size-caption:10.5px; --font-size-table:12.5px;
  --font-size-button:13px;  --font-size-numeric:30px;
  --line-height-tight:1.15; --line-height-heading:1.2; --line-height-body:1.6;
  --radius-sm:8px; --radius-md:11px; --radius-lg:14px; --radius-pill:999px;
  --shadow-overlay:var(--v3-shadow-card);
  --shadow-modal:0 24px 60px -24px rgba(15,26,20,.34);
  --focus-ring:2px solid #10693F;
  --control-height-sm:32px; --control-height-md:36px; --control-height-lg:44px;
  --table-row-desktop:40px; --table-row-tablet:48px;
  --table-header:38px; --table-footer:52px;
  --sidebar-expanded:236px; --sidebar-collapsed:64px; --topbar-height:64px;
}

/* --- База V3 ---------------------------------------------------------- */
body{background:var(--v3-canvas);font-family:var(--v3-font-text);
     letter-spacing:-.005em}
h1,h2,h3,h4{font-family:var(--v3-font-display);color:var(--v3-ink);
     text-wrap:balance}
h1{font:800 32px/1.12 var(--v3-font-display);letter-spacing:-.03em}
h2{font:800 24px/1.15 var(--v3-font-display);letter-spacing:-.03em}
h3{font:700 16px/1.2 var(--v3-font-display);letter-spacing:-.02em}
h4{font:700 13.5px/1.2 var(--v3-font-display);letter-spacing:-.01em;margin:0}
:focus-visible{outline:2px solid var(--v3-brand);outline-offset:2px}

/* Все деньги, массы, площади и даты — табличными цифрами (§04.2 `data`). */
.num,.v,.v3-kpi__v,.v3-num,td.num,th.num,.v3-money{font-variant-numeric:tabular-nums}

/* =====================================================================
   §03 КАРКАС V3
   Светлый сайдбар 236 (борд [2b]), верхняя панель 64, рабочая зона
   1204 при 1440, правый ящик 336.
   ===================================================================== */
.sidebar{width:var(--v3-sidebar);background:var(--v3-surface);
  border-right:1px solid var(--v3-line-200);padding:20px 14px 18px;gap:0}
.sidebar__brand{height:auto;border:0;padding:0 8px 22px;gap:11px;align-items:center;
  min-width:0;flex:none}
.sidebar__brand > div:last-child{min-width:0}
.sidebar__mark{width:34px;height:34px;border-radius:11px;
  background:linear-gradient(140deg,#15794C,#0B3D26);
  box-shadow:0 8px 16px -8px rgba(11,61,38,.8);
  display:flex;align-items:center;justify-content:center;color:transparent;font-size:0}
.sidebar__mark::after{content:"";width:13px;height:13px;
  border-radius:60% 10% 60% 10%;background:var(--v3-mint)}
.sidebar__name{font:800 16px/1 var(--v3-font-display);letter-spacing:-.02em;
  color:var(--v3-ink)}
.sidebar__name::after{content:"Аграрна операційна система";display:block;
  font:600 10px/1.35 var(--v3-font-text);color:var(--v3-body);
  letter-spacing:.06em;text-transform:uppercase;margin-top:4px;
  white-space:normal;overflow-wrap:anywhere}
/* `flex:none` у детей — не вкус, а измерение. Меню это флексовая
   колонка со своей прокруткой; когда пунктов стало больше, чем помещается
   (а с двухуровневым меню это норма), браузер начал ИХ СЖИМАТЬ: пункт
   40 px стал 36, подпункт 34 px — 13, и подписи налезли друг на друга.
   Правильное поведение переполнения здесь — прокрутка, а не сжатие. */
.sidebar__nav{padding:0;display:flex;flex-direction:column;gap:3px;overflow-y:auto;
  min-height:0;flex:1 1 auto}
.sidebar__nav > *{flex:none}
.navgroup{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.09em;
  text-transform:uppercase;color:var(--v3-label);margin:18px 0 7px;padding:0 12px}
.sidebar__nav > .navgroup:first-child{margin-top:0}
/* `justify-content:flex-start` объявлен ЯВНО: у <button> собственное
   правило браузера центрует содержимое, и подпункт без значка (только
   подпись) уезжал к середине — заметно это только на снимке экрана,
   потому что у пунктов со значком и шевроном центрирование не видно. */
/* Ссылка ВНУТРИ текста подчёркивается. Отличать её только цветом
   нельзя: человек, не различающий зелёный, не увидит её вовсе
   (WCAG 2.1 AA, правило `link-in-text-block`). Ссылку, которая сама по
   себе целый блок (кнопка-ссылка, пункт меню), это не касается. */
main a[href]:not(.v3-btn):not(.navitem):not(.navsub){
  color:var(--v3-brand);text-decoration:underline;text-underline-offset:2px}
main a[href]:not(.v3-btn):not(.navitem):not(.navsub):hover{color:var(--v3-forest)}

.navitem,.navsub{justify-content:flex-start;text-align:left}
.navitem{display:flex;align-items:center;gap:11px;padding:10px 12px;height:40px;
  border-radius:10px;border:0;background:transparent;width:100%;
  font:600 13px/1 var(--v3-font-text);color:var(--v3-body);cursor:pointer;
  text-align:left}
.navitem svg{width:16px;height:16px;flex:none;stroke-width:1.75;opacity:.4}
.navitem:hover{background:var(--v3-canvas)}
.navitem.on{background:var(--v3-tint);color:var(--v3-brand);font-weight:700}
.navitem.on svg{opacity:.75}
.navitem .v3-nav-badge{margin-left:auto;font:700 10.5px/1 var(--v3-font-text);
  padding:3px 7px;border-radius:6px;background:var(--v3-bad-chip);color:var(--v3-bad)}
.navsub{display:flex;align-items:center;height:34px;padding:0 12px 0 39px;
  border:0;background:transparent;width:100%;border-radius:10px;
  font:600 12.5px/1 var(--v3-font-text);color:var(--v3-body);cursor:pointer;text-align:left}
.navsub:hover{background:var(--v3-canvas)}
.navsub.on{background:var(--v3-tint);color:var(--v3-brand);font-weight:700}
.sidebar__foot{border:0;padding:0;margin-top:auto}
/* Контекстная карточка подвала меню (§03.1 footer slot). */
.v3-sidefoot{border-radius:var(--v3-r-card);background:var(--v3-canvas);
  border:1px solid var(--v3-line-200);padding:13px 14px;
  font:600 11.5px/1.45 var(--v3-font-text);color:var(--v3-body)}
.v3-sidefoot b{display:block;font:700 12.5px/1.2 var(--v3-font-display);
  color:var(--v3-ink);margin-bottom:4px}

.topbar{height:var(--v3-topbar);background:var(--v3-surface);
  border-bottom:1px solid var(--v3-line-200);padding:0 var(--v3-page-pad);gap:12px}
.topbar__title{font:700 13px/1.2 var(--v3-font-display);color:var(--v3-ink)}
/* Хлебные крошки: раздел · экран (§03.2). */
.v3-crumb{display:flex;align-items:center;gap:7px;font:600 12px/1 var(--v3-font-text);
  color:var(--v3-meta);min-width:0}
.v3-crumb b{font-weight:700;color:var(--v3-ink)}
.v3-crumb span{color:var(--v3-faint)}
.topbar__sep{background:var(--v3-line-200)}
/* Блок человека в шапке НЕ РАСТЯГИВАЕТ шапку.
   Найдено измерением 22.09.2026: у хозяина `alex` двенадцать ролей, их
   перечень занимал 827 px, шапка становилась шире окна и на пяти
   экранах появлялась ГОРИЗОНТАЛЬНАЯ ПРОКРУТКА — ровно то, что §20
   запрещает. Перечень обязан сжиматься, а не двигать окно. */
.topbar__who{display:flex;align-items:center;gap:10px;min-width:0;
  flex:0 1 auto;overflow:hidden}
.topbar__who > span:last-child{display:flex;flex-direction:column;gap:3px;
  min-width:0;max-width:260px}
.topbar__who b{font:700 12.5px/1.2 var(--v3-font-text);color:var(--v3-ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.topbar__who span{font:600 10.5px/1.2 var(--v3-font-text);color:var(--v3-meta);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.v3-avatar{width:32px;height:32px;border-radius:50%;flex:none;
  background:linear-gradient(140deg,var(--v3-mint),var(--v3-signal))}
/* Счётчик очереди не должен налезать на соседа: у колокольчика своё
   место в ряду, а число сидит в его правом верхнем углу. */
#notifSlot{display:inline-flex;margin-right:6px}
main{padding:var(--v3-page-pad)}
#view{max-width:1440px}
/* Подвал рабочей области: роль и напоминание об аудите — ровно то, что
   стоит на бордах [2b] [2c] [3b]. Реклама сюда не ставится. */
.v3-footline{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  max-width:1440px;margin-top:22px;padding-top:16px;
  border-top:1px solid var(--v3-line-200);
  font:600 11.5px/1.5 var(--v3-font-text);color:var(--v3-meta)}
.v3-footline__links{margin-left:auto;display:flex;gap:4px;flex-wrap:wrap}

/* Правый контекстный ящик (§03.4). */
.v3-drawer{position:fixed;top:0;right:0;bottom:0;width:var(--v3-drawer-overlay);
  max-width:100%;background:var(--v3-surface);border-left:1px solid var(--v3-line-200);
  box-shadow:-24px 0 60px -30px rgba(15,26,20,.3);z-index:41;
  display:flex;flex-direction:column}
.v3-drawer__head{flex:none;height:56px;display:flex;align-items:center;gap:12px;
  padding:0 22px;border-bottom:1px solid var(--v3-line-200)}
.v3-drawer__head h3{flex:1;min-width:0}
.v3-drawer__body{flex:1;overflow:auto;padding:18px 22px}
.v3-drawer__foot{flex:none;min-height:64px;display:flex;align-items:center;gap:9px;
  padding:0 22px;border-top:1px solid var(--v3-line-200);background:var(--v3-surface-50)}
@media(min-width:1440px){.v3-drawer{width:var(--v3-drawer)}}

/* =====================================================================
   §05 КОМПОНЕНТЫ C-01…C-56
   ===================================================================== */

/* C-05 Button --------------------------------------------------------- */
button,.btn,:where(button){font-family:var(--v3-font-text);border-radius:var(--v3-r-control)}
.btn,button:not(.ghost):not(.navitem):not(.navsub):not(.collapse):not(.v3-plain){
  font-weight:700}
button:not(.ghost):not(.navitem):not(.navsub):not(.collapse):not(.v3-plain):not(:disabled),
.btn{box-shadow:none}
.v3-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  height:40px;padding:0 17px;border-radius:var(--v3-r-control);border:1px solid transparent;
  font:700 13px/1 var(--v3-font-text);cursor:pointer;white-space:nowrap}
.v3-btn--primary{background:var(--v3-brand);color:#fff;box-shadow:var(--v3-shadow-primary)}
.v3-btn--primary:hover:not(:disabled){background:var(--v3-forest)}
.v3-btn--secondary{background:var(--v3-surface);border-color:var(--v3-line-300);
  color:var(--v3-body)}
.v3-btn--secondary:hover:not(:disabled){background:var(--v3-canvas);color:var(--v3-ink)}
.v3-btn--soft{background:var(--v3-tint);color:var(--v3-brand);border-color:transparent}
.v3-btn--ghost{background:transparent;color:var(--v3-brand);border-color:transparent}
.v3-btn--danger{background:var(--v3-surface);color:var(--v3-bad);border-color:var(--v3-bad-line)}
.v3-btn--danger:hover:not(:disabled){background:var(--v3-bad-chip)}
.v3-btn--sm{height:36px;padding:0 13px;font-size:12.5px}
.v3-btn:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}
.v3-btn svg{width:16px;height:16px;flex:none;stroke:currentColor;fill:none;stroke-width:1.75}

/* C-06 Icon Button ---------------------------------------------------- */
.v3-iconbtn{width:36px;height:36px;display:inline-flex;align-items:center;
  justify-content:center;border-radius:var(--v3-r-control);
  border:1px solid var(--v3-line-300);background:var(--v3-surface);
  color:var(--v3-body);cursor:pointer;position:relative}
.v3-iconbtn:hover{background:var(--v3-canvas)}
.v3-iconbtn__count{position:absolute;top:-6px;right:-6px;min-width:18px;height:18px;
  padding:0 5px;border-radius:999px;background:var(--v3-bad);color:#fff;
  font:700 10.5px/18px var(--v3-font-text);text-align:center}

/* C-07/08/09 Input, Select, Date -------------------------------------- */
input,select,textarea{font-family:var(--v3-font-text);border-radius:var(--v3-r-control);
  border-color:var(--v3-line-300)}
.v3-field{display:flex;flex-direction:column;gap:6px}
.v3-field > label{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.08em;
  text-transform:uppercase;color:var(--v3-label)}
.v3-input,.v3-select{height:40px;padding:0 13px;border:1px solid var(--v3-line-300);
  border-radius:var(--v3-r-control);background:var(--v3-surface);
  font:500 13px/1 var(--v3-font-text);color:var(--v3-ink);width:100%}
.v3-input:focus,.v3-select:focus{outline:2px solid var(--v3-brand);outline-offset:1px;
  border-color:var(--v3-brand)}
.v3-input--error{border-color:var(--v3-bad-line);background:var(--v3-bad-panel)}
.v3-field__err{font:600 12px/1.4 var(--v3-font-text);color:var(--v3-bad)}

/* C-03/04 Global Search + Command Palette ----------------------------- */
.v3-searchtrigger{display:flex;align-items:center;gap:10px;height:40px;flex:1;
  min-width:0;max-width:520px;padding:0 14px;border-radius:var(--v3-r-control);
  border:1px solid var(--v3-line-300);background:var(--v3-surface);
  color:var(--v3-meta);font:500 12.5px/1 var(--v3-font-text);cursor:pointer}
.v3-searchtrigger:hover{border-color:var(--v3-line-400)}
.v3-searchtrigger__kbd{margin-left:auto;font:700 10.5px/1 var(--v3-font-text);
  color:var(--v3-meta);border:1px solid var(--v3-line-200);border-radius:6px;padding:4px 6px}
.v3-searchdot{width:13px;height:13px;border-radius:50%;flex:none;
  border:1.75px solid var(--v3-faint)}
/* Единая точка входа события (A2). Постоянный житель шапки; на узком
   экране сжимается до «+», но НЕ исчезает — возможность обязана
   остаться на 320 px, и это проверяется прогоном на четырёх ширинах. */
#addEventBtn{display:inline-flex;align-items:center;gap:0;height:40px;flex:none;
  padding:0 14px;border-radius:var(--v3-r-control);border:1px solid transparent;
  background:var(--v3-brand);color:#fff;font:700 12.5px/1 var(--v3-font-text);
  box-shadow:var(--v3-shadow-primary);cursor:pointer;white-space:nowrap}
#addEventBtn:hover{background:var(--v3-forest)}
@media(max-width:1023px){ #addEventBtn{padding:0 12px} #addEventBtn .only-medium{display:none} }
.v3-palette{position:fixed;inset:0;z-index:50;background:rgba(15,26,20,.32);
  display:flex;justify-content:center;padding-top:96px}
.v3-palette__box{width:720px;max-width:calc(100% - 32px);height:max-content;
  max-height:70vh;display:flex;flex-direction:column;background:var(--v3-surface);
  border-radius:var(--v3-r-sheet);box-shadow:0 40px 80px -30px rgba(15,26,20,.45);
  overflow:hidden}
.v3-palette__in{height:58px;border:0;border-bottom:1px solid var(--v3-line-200);
  padding:0 20px;font:500 15px/1 var(--v3-font-text);border-radius:0}
.v3-palette__in:focus{outline:0}
.v3-palette__list{overflow:auto;padding:8px}
.v3-palette__grp{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.09em;
  text-transform:uppercase;color:var(--v3-label);padding:12px 12px 7px}
.v3-palette__row{display:flex;align-items:center;gap:11px;width:100%;padding:9px 12px;
  border:0;background:transparent;border-radius:10px;cursor:pointer;text-align:left;
  font:600 13px/1.3 var(--v3-font-text);color:var(--v3-ink)}
.v3-palette__row:hover,.v3-palette__row.on{background:var(--v3-tint);color:var(--v3-brand)}
.v3-palette__row small{margin-left:auto;font:600 11px/1 var(--v3-font-text);
  color:var(--v3-meta)}
.v3-palette__foot{border-top:1px solid var(--v3-line-200);padding:10px 20px;
  font:600 11px/1.4 var(--v3-font-text);color:var(--v3-meta);background:var(--v3-surface-50)}

/* C-10 Tabs ----------------------------------------------------------- */
.v3-tabs{display:flex;gap:6px;flex-wrap:wrap}
.v3-tab{height:34px;padding:0 14px;border-radius:var(--v3-r-control);border:0;
  background:transparent;font:700 12.5px/1 var(--v3-font-text);color:var(--v3-body);
  cursor:pointer}
.v3-tab:hover{background:var(--v3-canvas)}
.v3-tab[aria-selected="true"]{background:var(--v3-ink);color:#fff}

/* C-11 Filter Chip ---------------------------------------------------- */
.v3-filters{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.v3-fchip{height:30px;padding:0 13px;border-radius:999px;
  border:1px solid var(--v3-line-200);background:var(--v3-surface);
  font:700 12px/1 var(--v3-font-text);color:var(--v3-body);cursor:pointer}
.v3-fchip:hover{border-color:var(--v3-line-400)}
.v3-fchip[aria-pressed="true"]{background:var(--v3-brand);border-color:var(--v3-brand);
  color:#fff}

/* C-12 Status Chip — ВСЕГДА текст, а не только цвет (§21) -------------- */
.v3-chip{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 9px;
  border-radius:999px;font:700 10.5px/1.3 var(--v3-font-text);white-space:nowrap}
.v3-chip::before{content:"";width:6px;height:6px;border-radius:50%;
  background:currentColor;flex:none}
.v3-chip--plain::before{display:none}
.v3-chip--good{background:var(--v3-tint);color:var(--v3-good)}
.v3-chip--warn{background:var(--v3-warn-chip);color:var(--v3-warn)}
.v3-chip--bad{background:var(--v3-bad-chip);color:var(--v3-bad)}
.v3-chip--info{background:var(--v3-info-chip);color:var(--v3-info)}
.v3-chip--neutral{background:var(--v3-line-100);color:var(--v3-body)}

/* C-13 KPI Card ------------------------------------------------------- */
.v3-kpirow{display:grid;gap:var(--v3-gutter);margin-bottom:var(--v3-gutter);
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr));align-items:stretch}
/* `height:100%` не украшение: <button> в гриде не растягивается сам, и
   ряд показателей получал одну карточку ниже остальных — измерено
   снимком галереи. */
/* `white-space:normal` — НЕ украшение, а отмена стандарта браузера.
   Карточка показателя бывает <div> (просто число) и <button> (число, у
   которого есть пояснение). У <button> браузер сам ставит `nowrap`, и
   автор его нигде не снимал: одна и та же карточка переносила строку
   или не переносила В ЗАВИСИМОСТИ ОТ ТОГО, кликабельна ли она.
   Измерено 23.09.2026 на живом agro-os.com: «Гроші на рахунках»
   (кнопка) сжимала причину «рахунок 31 не має оборотів за період» в
   нечитаемую полосу, а «Нам винні» (div) рядом рисовалась нормально. */
.v3-kpi{min-height:86px;height:100%;background:var(--v3-surface);
  border:1px solid var(--v3-line-200);
  border-radius:var(--v3-r-card);padding:16px 18px;box-shadow:var(--v3-shadow-card);
  display:flex;flex-direction:column;gap:9px;text-align:left;cursor:default;width:100%;
  white-space:normal}
button.v3-kpi{cursor:pointer}
button.v3-kpi:hover{border-color:var(--v3-line-400)}
.v3-kpi__top{display:flex;align-items:center;gap:10px}
.v3-kpi__ico{width:22px;height:22px;flex:none;border-radius:7px;
  border:2px solid var(--v3-signal);opacity:.9}
.v3-kpi__ico--warn{border-color:var(--v3-warn-dot)}
.v3-kpi__ico--bad{border-color:var(--v3-bad-dot)}
.v3-kpi__ico--info{border-color:var(--v3-info-dot)}
.v3-kpi__ico--neutral{border-color:var(--v3-faint)}
.v3-kpi__ico--round{border-radius:50%}
.v3-kpi__l{font:700 11.5px/1.3 var(--v3-font-text);color:var(--v3-body)}
.v3-kpi__v{font:700 30px/1 var(--v3-font-display);letter-spacing:-.03em;
  color:var(--v3-ink);font-variant-numeric:tabular-nums}
.v3-kpi__foot{display:flex;align-items:center;gap:8px;
  font:600 11.5px/1.3 var(--v3-font-text);color:var(--v3-meta)}
/* Состояние словами не имеет права занимать место числа: «Не
   розраховано» кеглем 30 ломает ряд, и ряд перестаёт читаться как ряд.
   Цифра остаётся крупной, слово становится словом. */
.v3-kpi__v .v3-notcalc,.v3-kpi__v .v3-blockedval,.v3-kpi__v .v3-nodata{
  font:700 17px/1.25 var(--v3-font-display);letter-spacing:-.01em;display:inline-block}
/* `letter-spacing:normal` обязателен ЗДЕСЬ, а не только в общем
   `.v3-why`: этот селектор точнее, и общий до него не дошёл бы.

   ПОЧЕМУ ВООБЩЕ НУЖЕН. `.v3-kpi__v` — крупное число, и плотность у него
   задана в `em`: -.03em при кегле 30 браузер считает ОДИН раз и
   наследует потомкам АБСОЛЮТНЫМИ -0.9px. Для текста в 11px это -8%:
   буквы наезжают друг на друга, пробелы съедаются. Измерено на живом
   сайте 23.09.2026 — строка «рахунок 31 не має оборотів за період»
   читалась как одно слово. Соседний `.v3-nodata` свою плотность
   переопределял и потому выглядел нормально; этот — нет. */
.v3-kpi__v .v3-why{font:500 11px/1.4 var(--v3-font-text);margin-top:5px;
  letter-spacing:normal;white-space:normal}

/* C-14 Attention Card ------------------------------------------------- */
.v3-att{display:flex;gap:14px;padding:16px 18px;border-left:3px solid var(--v3-faint);
  border-bottom:1px solid var(--v3-line-100);background:var(--v3-surface)}
.v3-att:last-child{border-bottom:0}
.v3-att--bad{border-left-color:var(--v3-bad-dot);background:var(--v3-bad-panel)}
.v3-att--warn{border-left-color:var(--v3-warn-dot);background:var(--v3-warn-panel)}
.v3-att--info{border-left-color:var(--v3-info-dot);background:var(--v3-info-panel)}
/* Рядок, який РОЗРІЗНЯЄ два однакові на вигляд пункти: документ і його
   дата. Стоїть одразу під заголовком, бо саме тут людина шукає
   відповідь на питання «а це те саме чи інше». Токени ті самі, що в
   решти допоміжного тексту: свого кольору цей рядок не вигадує. */
.v3-att__about{font:600 11.5px/1.35 var(--v3-font-text);color:var(--v3-body);
  margin-top:2px;letter-spacing:normal;white-space:normal}
/* Технічні подробиці — закриті за замовчуванням. Внутрішній код
   дозволений ТІЛЬКИ тут (`tests/ui_plain_language.py` перевіряє це на
   кожному екрані), і сюди по нього приходять свідомо. */
.v3-tech{margin-top:8px}
.v3-tech > summary{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.08em;
  text-transform:uppercase;color:var(--v3-meta);cursor:pointer;
  padding:4px 0;list-style:none}
.v3-tech > summary::-webkit-details-marker{display:none}
.v3-tech > summary::before{content:"▸ ";color:var(--v3-faint)}
.v3-tech[open] > summary::before{content:"▾ "}
.v3-tech > summary:focus-visible{outline:2px solid var(--v3-brand);outline-offset:2px}
.v3-tech__body{font:500 11.5px/1.5 var(--v3-font-mono,ui-monospace);
  color:var(--v3-meta);letter-spacing:normal;white-space:pre-wrap;
  word-break:break-word;margin-top:4px;padding:8px 10px;
  border-radius:var(--v3-r-control);background:var(--v3-surface-50)}
.v3-att__sq{width:22px;height:22px;flex:none;border-radius:7px;margin-top:2px}
.v3-att--bad .v3-att__sq{background:var(--v3-bad-chip);border:2px solid var(--v3-bad-dot)}
.v3-att--warn .v3-att__sq{background:var(--v3-warn-chip);border:2px solid var(--v3-warn-dot)}
.v3-att--info .v3-att__sq{background:var(--v3-info-chip);border:2px solid var(--v3-info-dot)}
.v3-att__main{flex:1;min-width:0}
.v3-att__t{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:6px}
.v3-att__t h4{font:700 14px/1.25 var(--v3-font-display)}
.v3-att__txt{font:400 12.5px/1.55 var(--v3-font-text);color:var(--v3-body)}
.v3-att__txt b{color:var(--v3-ink);font-weight:700}
.v3-att__side{flex:none;text-align:right;display:flex;flex-direction:column;
  align-items:flex-end;gap:9px;min-width:150px}
.v3-att__due{font:700 11.5px/1.3 var(--v3-font-text)}
.v3-att--bad .v3-att__due{color:var(--v3-bad)}
.v3-att--warn .v3-att__due{color:var(--v3-warn)}
.v3-att--info .v3-att__due{color:var(--v3-info)}
.v3-att__who{font:600 11px/1.3 var(--v3-font-text);color:var(--v3-meta)}

/* C-15 Operational Card / общая карточка ------------------------------ */
.v3-card{background:var(--v3-surface);border:1px solid var(--v3-line-200);
  border-radius:var(--v3-r-card);box-shadow:var(--v3-shadow-card);
  margin-bottom:var(--v3-gutter);overflow:hidden}
.v3-card--flush{padding:0}
.v3-card__head{display:flex;align-items:center;gap:12px;padding:18px 20px 14px;
  flex-wrap:wrap}
.v3-card__head h3{flex:1;min-width:0}
.v3-card__head .v3-count{font:700 11.5px/1 var(--v3-font-text);color:var(--v3-meta);
  background:var(--v3-line-100);border-radius:999px;padding:5px 9px}
.v3-card__body{padding:0 20px 20px}
.v3-card__foot{padding:13px 20px;border-top:1px solid var(--v3-line-100);
  background:var(--v3-surface-50);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.v3-panel{background:var(--v3-surface-50);border:1px solid var(--v3-line-200);
  border-radius:10px;padding:13px 14px}
.v3-grid{display:grid;gap:var(--v3-gutter)}
.v3-grid--2{grid-template-columns:2fr 1fr}
.v3-grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}
.v3-grid--auto{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
.v3-label{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.09em;
  text-transform:uppercase;color:var(--v3-label)}
.v3-facts{display:grid;gap:2px}
.v3-fact{display:flex;align-items:baseline;gap:12px;padding:7px 0;
  border-bottom:1px solid var(--v3-line-100);font:400 12.5px/1.5 var(--v3-font-text)}
.v3-fact:last-child{border-bottom:0}
.v3-fact__k{color:var(--v3-body);flex:1;min-width:0}
.v3-fact__v{font-weight:700;color:var(--v3-ink);text-align:right;
  font-variant-numeric:tabular-nums}

/* C-56 Hero Block ----------------------------------------------------- */
/* Герой БЕЗ фотографии.
   Борды V3 ставят в героя фотографию поля. Управляемых изображений в
   этой установке ещё нет (GAP-MEDIA-01), и подставить чужую картинку
   из интернета нельзя: внешних ссылок в интерфейсе нет по правилу
   проекта, а «похожее фото» — это оформление, выданное за бренд
   хозяйства. Поэтому подложка НАРИСОВАНА: полосы поля под углом,
   собранные из градиентов. Это честная графика, а не имитация снимка,
   и она заменяется настоящим фото в ту минуту, когда владелец его
   загрузит. */
.v3-hero{position:relative;min-height:220px;border-radius:var(--v3-r-sheet);
  overflow:hidden;display:flex;align-items:center;
  padding:30px 34px;gap:22px;margin-bottom:var(--v3-gutter);
  background:
    repeating-linear-gradient(104deg,
      rgba(31,157,97,.16) 0 34px, rgba(11,61,38,0) 34px 74px),
    repeating-linear-gradient(104deg,
      rgba(143,217,176,.10) 0 13px, rgba(11,61,38,0) 13px 52px),
    radial-gradient(120% 150% at 88% 12%, #17553A 0%, #0B3D26 52%, #08301E 100%)}
.v3-hero__bg{position:absolute;inset:0;background-size:cover;background-position:center;
  opacity:.65}
.v3-hero::after{content:"";position:absolute;inset:0;background:var(--v3-scrim)}
/* Опубликованное фото владельца (§14). Оно показывается ЦЕЛИКОМ, без
   постоянной полупрозрачности: кадр и фокус человек выбирал на полном
   изображении, и приглушать его вдвое значило бы показать не то, что
   он видел в редакторе. Затемнение задаётся отдельной плёнкой, силу
   которой он назвал сам, а постоянная плёнка уступает ей место. */
.v3-hero__bg--photo{opacity:1}
.v3-hero--photo::after{display:none}
.v3-hero__scrim{position:absolute;inset:0;background:#0B3D26}

/* Оформление страницы входа (§14, место `login`). Две плёнки под
   карточкой, а не фон у `body`: сила затемнения приходит числом от
   человека, и её надо уметь менять, не трогая остальное. Карточка
   входа остаётся ровно такой, какой была, — оформление не влияет ни на
   одно поле формы. */
.login-cover,.login-cover__scrim{position:fixed;inset:0;z-index:0}
.login-cover{background-repeat:no-repeat}
.login-cover__scrim{background:#0B3D26}
body.login-page--photo .login{position:relative;z-index:1}
.v3-hero__in{position:relative;z-index:1;flex:1;min-width:0;color:#fff}
.v3-hero__eyebrow{display:inline-block;font:700 10.5px/1 var(--v3-font-text);
  letter-spacing:.11em;text-transform:uppercase;color:#fff;
  background:rgba(255,255,255,.14);border-radius:999px;padding:8px 13px;margin-bottom:16px}
.v3-hero h1{color:#fff;margin:0 0 10px}
.v3-hero p{margin:0;max-width:52ch;font:400 13px/1.6 var(--v3-font-text);
  color:rgba(255,255,255,.82)}
.v3-hero__side{position:relative;z-index:1;display:flex;gap:14px;flex:none}
/* Контраст на плитках героя считается по §21: подпись обязана давать
   4.5:1 на своём фоне. Прежние 75 % белого на тёмно-зелёном давали
   меньше, и подпись читалась хуже числа, которое она называет.

   ЦВЕТ ПОДПИСИ ВЗЯТ ИЗ ДИЗАЙНА, А НЕ ПРИДУМАН. Первая редакция ввела
   свой #D7E9DE, которого на бордах нет НИ РАЗУ, — визуальная регрессия
   (PART 3) нашла его сличением с замороженным пакетом. Мята борда
   #8FD9B0 (`--v3-mint`, 28 употреблений) даёт на этом фоне 7.5:1, то
   есть требование §21 выполняется БЕЗ изобретения цвета. Придуманный
   цвет решал задачу, которой не было. */
.v3-hero__tile{background:rgba(6,25,16,.42);border:1px solid rgba(255,255,255,.16);
  border-radius:var(--v3-r-card);padding:15px 18px;min-width:168px;color:#fff;
  backdrop-filter:blur(4px)}
.v3-hero__tile .v3-label{color:var(--v3-mint);opacity:1}
.v3-hero__tile--light{background:rgba(255,255,255,.93);border-color:transparent;
  color:var(--v3-ink)}
@media(min-width:1440px){.v3-hero{min-height:280px}}

/* C-16/C-34 Charts ---------------------------------------------------- */
.v3-bars{display:flex;align-items:flex-end;gap:10px;height:150px;padding-top:8px;
  max-width:560px}
.v3-bars + .v3-bars{height:auto;align-items:flex-start}
.v3-bars__col{flex:1;display:flex;flex-direction:column;justify-content:flex-end;
  gap:6px;min-width:0}
.v3-bars__bar{border-radius:6px 6px 0 0;background:var(--v3-signal);min-height:3px}
.v3-bars__bar--soft{background:var(--v3-chart)}
.v3-bars__bar--bad{background:var(--v3-bad-line)}
.v3-bars__bar--forecast{background:repeating-linear-gradient(135deg,
  var(--v3-info-chip),var(--v3-info-chip) 5px,#DCE8FA 5px,#DCE8FA 10px);
  border:1px dashed var(--v3-info-dot)}
.v3-bars__x{font:600 10.5px/1 var(--v3-font-text);color:var(--v3-meta);
  text-align:center;padding-top:8px}
.v3-meter{height:6px;border-radius:999px;background:var(--v3-line-100);overflow:hidden}
.v3-meter__in{height:100%;border-radius:999px;background:var(--v3-signal)}
.v3-meter__in--warn{background:var(--v3-warn-dot)}
.v3-meter__in--bad{background:var(--v3-bad-dot)}
/* Табличная замена графика — обязательна для доступности (C-34 a11y). */
.v3-charttable{width:100%;font:600 11.5px/1.5 var(--v3-font-text)}

/* C-20/C-21 Таблицы ---------------------------------------------------- */
.v3-table{width:100%;border-collapse:collapse;font:500 12.5px/1.4 var(--v3-font-text)}
.v3-table th{height:38px;padding:0 14px;text-align:left;
  font:700 10.5px/1 var(--v3-font-text);letter-spacing:.08em;text-transform:uppercase;
  color:var(--v3-label);border-bottom:1px solid var(--v3-line-200);white-space:nowrap;
  background:var(--v3-surface)}
.v3-table td{height:40px;padding:0 14px;border-bottom:1px solid var(--v3-line-100);
  color:var(--v3-ink);vertical-align:middle}
.v3-table--comfortable td{height:48px}
.v3-table tbody tr:hover{background:var(--v3-surface-50)}
.v3-table tbody tr.on{background:var(--v3-tint)}
.v3-table td.num,.v3-table th.num{text-align:right;font-variant-numeric:tabular-nums;
  font-weight:700}
.v3-table__wrap{overflow-x:auto}

/* C-22 Drawer, C-23 Modal — см. каркас выше и .modal из 1.0 ------------ */
.modal{border-radius:var(--v3-r-sheet);box-shadow:var(--shadow-modal)}

/* C-24/C-25 Wizard + Stepper ------------------------------------------ */
.v3-wizard{max-width:720px;margin:0 auto}
.v3-steps{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-bottom:var(--v3-gutter)}
.v3-step{display:flex;align-items:center;gap:9px;height:36px;padding:0 15px;
  border-radius:999px;background:var(--v3-surface);border:1px solid var(--v3-line-200);
  font:700 12.5px/1 var(--v3-font-text);color:var(--v3-meta)}
.v3-step__n{width:20px;height:20px;border-radius:50%;background:var(--v3-line-100);
  color:var(--v3-body);display:flex;align-items:center;justify-content:center;
  font:700 10.5px/1 var(--v3-font-text)}
.v3-step--done{color:var(--v3-brand);border-color:var(--v3-chart);background:var(--v3-tint)}
.v3-step--done .v3-step__n{background:var(--v3-signal);color:#fff}
.v3-step--now{background:var(--v3-ink);border-color:var(--v3-ink);color:#fff}
.v3-step--now .v3-step__n{background:var(--v3-signal);color:#fff}
.v3-step--blocked{border-color:var(--v3-bad-line);color:var(--v3-bad);
  background:var(--v3-bad-panel)}
.v3-steps__arrow{width:26px;height:1px;background:var(--v3-line-300);flex:none}

/* C-26 Timeline ------------------------------------------------------- */
.v3-timeline{list-style:none;margin:0;padding:0}
.v3-timeline li{position:relative;padding:0 0 18px 26px;
  border-left:1px solid var(--v3-line-200);margin-left:5px}
.v3-timeline li:last-child{border-left-color:transparent;padding-bottom:0}
.v3-timeline li::before{content:"";position:absolute;left:-5px;top:4px;width:9px;
  height:9px;border-radius:50%;background:var(--v3-signal);
  box-shadow:0 0 0 3px var(--v3-tint)}
.v3-timeline__when{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.06em;
  text-transform:uppercase;color:var(--v3-label);margin-bottom:5px}
.v3-timeline__what{font:600 12.5px/1.45 var(--v3-font-text);color:var(--v3-ink)}
.v3-timeline__who{font:500 11.5px/1.4 var(--v3-font-text);color:var(--v3-meta);margin-top:3px}

/* C-27 Alert ---------------------------------------------------------- */
.v3-alert{display:flex;gap:12px;padding:14px 16px;border-radius:var(--v3-r-card);
  border:1px solid var(--v3-line-200);background:var(--v3-surface-50);
  font:400 12.5px/1.55 var(--v3-font-text);color:var(--v3-body);
  margin-bottom:var(--v3-gutter)}
.v3-alert b{color:var(--v3-ink)}
.v3-alert--bad{background:var(--v3-bad-card);border-color:var(--v3-bad-line);color:var(--v3-bad)}
.v3-alert--warn{background:var(--v3-warn-card);border-color:var(--v3-warn-line);color:var(--v3-warn)}
.v3-alert--info{background:var(--v3-info-chip);border-color:#D8E6FA;color:var(--v3-info)}
.v3-alert--good{background:var(--v3-tint-soft);border-color:var(--v3-chart);color:var(--v3-good)}

/* C-28 Toast ---------------------------------------------------------- */
.v3-toasts{position:fixed;right:24px;bottom:24px;z-index:60;display:flex;
  flex-direction:column;gap:10px}
.v3-toast{width:380px;max-width:calc(100vw - 48px);background:var(--v3-ink);color:#fff;
  border-radius:var(--v3-r-card);padding:14px 16px;
  font:600 12.5px/1.5 var(--v3-font-text);box-shadow:0 20px 40px -20px rgba(15,26,20,.6)}
.v3-toast--bad{background:var(--v3-bad)}

/* C-29 Skeleton ------------------------------------------------------- */
.v3-sk{border-radius:10px;background:linear-gradient(90deg,#EFF3F0,#F7FAF8,#EFF3F0);
  background-size:200% 100%;animation:v3sk 1.3s linear infinite}
@keyframes v3sk{to{background-position:-200% 0}}
.v3-sk--kpi{height:86px;border-radius:var(--v3-r-card)}
.v3-sk--row{height:40px;border-radius:0;margin-bottom:1px}
.v3-sk--hero{height:220px;border-radius:var(--v3-r-sheet)}
.v3-sk--map{height:420px;border-radius:var(--v3-r-card)}
.v3-sk--line{height:12px}
@media(prefers-reduced-motion:reduce){.v3-sk{animation:none}}

/* C-30/31/32/33 Состояния экрана -------------------------------------- */
.v3-state{padding:36px 30px;text-align:center;max-width:560px;margin:0 auto}
.v3-state h3{margin-bottom:8px}
.v3-state p{margin:0;font:400 12.5px/1.6 var(--v3-font-text);color:var(--v3-body)}
.v3-state__acts{margin-top:18px;display:flex;gap:9px;justify-content:center;flex-wrap:wrap}
.v3-blocked{border:1px solid var(--v3-bad-line);background:var(--v3-bad-panel);
  border-radius:var(--v3-r-card);padding:15px 17px}
.v3-blocked__t{font:700 13px/1.2 var(--v3-font-display);color:var(--v3-bad);
  margin-bottom:6px}
.v3-readonly{display:flex;align-items:center;gap:10px;padding:12px 16px;
  border-radius:var(--v3-r-card);background:var(--v3-line-100);
  border:1px solid var(--v3-line-200);font:700 12.5px/1.4 var(--v3-font-text);
  color:var(--v3-body);margin-bottom:var(--v3-gutter)}
.v3-offline{display:flex;align-items:center;gap:10px;padding:11px 16px;
  background:var(--v3-warn-chip);border-bottom:1px solid var(--v3-warn-line);
  font:700 12.5px/1.3 var(--v3-font-text);color:var(--v3-warn)}

/* §12 ШЕСТЬ СОСТОЯНИЙ ДАННЫХ — ноль и «данных нет» рисуются по-разному -- */
.v3-val{font-variant-numeric:tabular-nums;font-weight:700;color:var(--v3-ink)}
.v3-zero{font-variant-numeric:tabular-nums;font-weight:700;color:var(--v3-ink)}
.v3-nodata{font-weight:700;color:var(--v3-warn);cursor:help;
  border-bottom:1px dashed var(--v3-warn-line)}
.v3-partial{font-variant-numeric:tabular-nums;font-weight:700;color:var(--v3-warn)}
.v3-partial sup{font-size:.8em}
.v3-blockedval{font-weight:700;color:var(--v3-bad)}
.v3-notcalc{font-weight:700;color:var(--v3-body)}
.v3-statecell--nodata,.v3-statecell--partial{background:var(--v3-warn-panel)}
.v3-statecell--blocked{background:var(--v3-bad-panel)}
.v3-statecell--notcalc{background:var(--v3-surface-50)}
/* Мелкий текст НИКОГДА не наследует плотность крупного: см. разбор у
   `.v3-kpi__v .v3-why`. Здесь то же самое для всех остальных мест, где
   причина состояния стоит внутри крупного числа (плитки героя, ряды
   фактов, витрина показателей). */
.v3-why{display:block;font:500 11px/1.4 var(--v3-font-text);color:var(--v3-meta);
  margin-top:3px;font-variant-numeric:normal;letter-spacing:normal;white-space:normal}

/* C-19 Explainability ------------------------------------------------- */
.v3-explainbtn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 12px;
  border-radius:999px;border:1px dashed var(--v3-chart);background:var(--v3-tint-soft);
  color:var(--v3-good);font:700 11.5px/1 var(--v3-font-text);cursor:pointer}
.v3-explainbtn:hover{background:var(--v3-tint)}
.v3-whybtn{border-color:#D8E6FA;background:var(--v3-info-panel);color:var(--v3-info)}
/* Правило P-7: подсказка модели не имеет права выглядеть законом. */
.v3-ai{border:1px dashed var(--v3-line-400);background:var(--v3-surface-50);
  border-radius:var(--v3-r-card);padding:13px 15px}
.v3-ai__tag{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.08em;
  text-transform:uppercase;color:var(--v3-label);margin-bottom:6px;display:block}

/* C-47 GUARDIAN Alert — четыре обязательных блока (§16) ---------------- */
.v3-grd{border-radius:var(--v3-r-card);border:1px solid var(--v3-line-200);
  background:var(--v3-surface);padding:16px 18px;margin-bottom:12px}
.v3-grd--bad{border-color:var(--v3-bad-line);background:var(--v3-bad-card)}
.v3-grd--warn{border-color:var(--v3-warn-line);background:var(--v3-warn-card)}
.v3-grd--good{border-color:var(--v3-chart);background:var(--v3-tint-soft)}
.v3-grd__h{display:flex;align-items:center;gap:10px;margin-bottom:11px;flex-wrap:wrap}
.v3-grd__h h4{flex:1;min-width:0;font-size:14px}
.v3-grd__b{font:400 12.5px/1.55 var(--v3-font-text);color:var(--v3-body);margin-bottom:5px}
.v3-grd__b b{color:var(--v3-ink)}
.v3-grd__acts{margin-top:12px;display:flex;gap:9px;flex-wrap:wrap}

/* C-48 LAW Rule Card — реестр норм, а не лента новостей (§17) ---------- */
.v3-law{border:1px solid var(--v3-line-200);border-radius:var(--v3-r-card);
  background:var(--v3-surface);padding:16px 18px;margin-bottom:12px}
.v3-law__id{font:700 11px/1 var(--v3-font-mono,ui-monospace);letter-spacing:.04em;
  color:var(--v3-info);background:var(--v3-info-chip);border-radius:6px;padding:5px 8px;
  display:inline-block}
.v3-law__h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.v3-law__meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:10px;margin-top:11px}

/* C-49 Audit Event ---------------------------------------------------- */
.v3-audit{display:grid;grid-template-columns:132px 1fr;gap:14px;padding:11px 0;
  border-bottom:1px solid var(--v3-line-100);font:500 12.5px/1.5 var(--v3-font-text)}
.v3-audit__when{font:700 11.5px/1.4 var(--v3-font-text);color:var(--v3-meta);
  font-variant-numeric:tabular-nums}

/* C-41…C-46 GIS ------------------------------------------------------- */
.v3-map{position:relative;border-radius:var(--v3-r-card);overflow:hidden;
  min-height:420px;background:var(--v3-line-100);border:1px solid var(--v3-line-200)}
.v3-map__canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.v3-map__float{position:absolute;z-index:2;background:rgba(255,255,255,.95);
  border-radius:var(--v3-r-card);box-shadow:var(--v3-shadow-card);padding:13px 15px;
  backdrop-filter:blur(6px)}
.v3-map__layers{top:14px;left:14px;width:196px}
.v3-map__legend{bottom:14px;left:14px}
.v3-map__scale{bottom:14px;left:230px;font:600 11px/1.5 var(--v3-font-text);
  color:var(--v3-body)}
.v3-map__modes{position:absolute;top:14px;right:14px;z-index:2;display:flex;gap:7px}
.v3-map__zoom{position:absolute;bottom:14px;right:14px;z-index:2;display:flex;
  flex-direction:column;gap:7px}
.v3-layer{display:flex;align-items:center;gap:9px;padding:5px 0;
  font:600 12px/1.3 var(--v3-font-text);color:var(--v3-ink);cursor:pointer}
.v3-layer input{margin:0;width:15px;height:15px;accent-color:var(--v3-brand)}
.v3-layer--off{color:var(--v3-faint);cursor:not-allowed}
.v3-layer__na{margin-left:auto;font:700 9.5px/1 var(--v3-font-text);
  text-transform:uppercase;letter-spacing:.06em;color:var(--v3-warn)}
.v3-legend__row{display:flex;align-items:center;gap:9px;padding:3px 0;
  font:600 11.5px/1.3 var(--v3-font-text);color:var(--v3-ink)}
.v3-legend__swatch{width:18px;height:11px;border-radius:3px;flex:none}
/* Кадастровая делянка и производственное поле — РАЗНЫЕ объекты (§13). */
.v3-geo-parcel{fill:rgba(59,123,214,.34);stroke:#2360BE;stroke-width:2;
  stroke-dasharray:6 4}
.v3-geo-parcel--sel{fill:rgba(59,123,214,.55);stroke-width:3;stroke-dasharray:none}
.v3-geo-field{fill:rgba(31,157,97,.3);stroke:#10693F;stroke-width:2}
.v3-geo-field--sel{fill:rgba(31,157,97,.5);stroke-width:3}
.v3-geo-conflict{fill:rgba(216,72,59,.32);stroke:#C2382C;stroke-width:2.5}
.v3-geo-none{fill:rgba(154,168,160,.25);stroke:#9AA8A0;stroke-width:2;
  stroke-dasharray:3 3}
.v3-map__nogeo{position:absolute;inset:0;display:flex;align-items:center;
  justify-content:center;text-align:center;padding:30px;
  background:repeating-linear-gradient(135deg,#F5F8F6,#F5F8F6 10px,#EEF2EF 10px,#EEF2EF 20px)}

/* C-37 Document Preview ------------------------------------------------ */
.v3-doc{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);
  gap:var(--v3-gutter)}
.v3-doc__scan{background:var(--v3-line-100);border-radius:var(--v3-r-card);
  min-height:420px;display:flex;align-items:center;justify-content:center;
  overflow:hidden;position:relative}
.v3-doc__scan img{max-width:100%;max-height:640px;display:block}
.v3-doc__hl{outline:2px solid var(--v3-warn-dot);outline-offset:2px;border-radius:4px}

/* C-38/39/40 Media picker, cropper, focal point ------------------------ */
.v3-media{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));
  gap:13px}
.v3-media__it{border-radius:var(--v3-r-image);overflow:hidden;border:2px solid transparent;
  cursor:pointer;background:var(--v3-line-100);position:relative}
.v3-media__it.on{border-color:var(--v3-brand)}
.v3-media__it img{width:100%;height:96px;object-fit:cover;display:block}
.v3-media__cap{padding:8px 10px;font:600 11.5px/1.3 var(--v3-font-text);
  color:var(--v3-ink);background:var(--v3-surface)}
.v3-crop{position:relative;border-radius:var(--v3-r-image);overflow:hidden;
  background:var(--v3-ink)}
.v3-crop img{width:100%;display:block}
.v3-focal{position:absolute;width:34px;height:34px;margin:-17px 0 0 -17px;
  border-radius:50%;border:3px solid #fff;box-shadow:0 0 0 2px rgba(15,26,20,.4);
  cursor:grab;background:rgba(255,255,255,.25)}
.v3-focal:focus-visible{outline:2px solid var(--v3-mint);outline-offset:3px}
.v3-preview{display:grid;grid-template-columns:repeat(3,1fr);gap:13px}
.v3-preview__fr{border:1px solid var(--v3-line-200);border-radius:10px;overflow:hidden}
.v3-preview__cap{font:700 10.5px/1 var(--v3-font-text);letter-spacing:.08em;
  text-transform:uppercase;color:var(--v3-label);padding:9px 11px;
  background:var(--v3-surface-50)}

/* C-50…C-54 Платформа --------------------------------------------------- */
.v3-pmod{background:var(--v3-surface);border:1px solid var(--v3-line-200);
  border-radius:var(--v3-r-card);box-shadow:var(--v3-shadow-card);overflow:hidden}
.v3-pmod__h{display:flex;align-items:center;gap:10px;padding:14px 18px;
  border-bottom:1px solid var(--v3-line-100)}
.v3-pmod__id{font:700 10.5px/1 var(--v3-font-mono,ui-monospace);color:#fff;
  background:var(--v3-ink);border-radius:5px;padding:5px 8px}
.v3-pmod__h h4{flex:1;min-width:0;font-size:14px}
.v3-pmod__fam{font:700 10.5px/1 var(--v3-font-text);color:var(--v3-meta)}
.v3-pmod__b{padding:16px 18px}

/* Мобильные экраны ------------------------------------------------------ */
.v3-phone{width:320px;border-radius:var(--v3-r-sheet);overflow:hidden;
  border:1px solid var(--v3-line-200);background:var(--v3-surface);
  box-shadow:var(--v3-shadow-card)}
.v3-phone__bar{height:30px;display:flex;align-items:center;justify-content:space-between;
  padding:0 14px;background:var(--v3-forest);color:#fff;
  font:700 10.5px/1 var(--v3-font-text)}

/* =====================================================================
   §20 АДАПТИВНОСТЬ
   ===================================================================== */
@media(max-width:1439px){
  .v3-grid--2{grid-template-columns:1fr}
  .v3-kpirow{grid-template-columns:repeat(3,minmax(0,1fr))}
  .v3-doc{grid-template-columns:1fr}
}
@media(max-width:1023px){
  .v3-kpirow{grid-template-columns:repeat(2,minmax(0,1fr))}
  .v3-grid--3{grid-template-columns:1fr}
  .v3-hero{min-height:220px;flex-direction:column;align-items:flex-start}
  .v3-hero__side{width:100%}
  .v3-att{flex-wrap:wrap}
  .v3-att__side{min-width:0;width:100%;flex-direction:row;align-items:center;
    justify-content:space-between}
  .v3-preview{grid-template-columns:1fr}
}
@media(max-width:767px){
  main{padding:16px}
  .v3-kpirow{grid-template-columns:1fr}
  .v3-hero{min-height:160px;padding:20px}
  h1{font-size:24px}
  .v3-drawer{width:100%}
  /* Первичное действие уезжает вниз и становится ≥44 px (§19, §20). */
  .v3-primary-fixed{position:fixed;left:16px;right:16px;bottom:16px;z-index:30;
    height:52px;width:auto;justify-content:center}
  .v3-table th,.v3-table td{padding:0 10px}
  body{padding-bottom:84px}
}
/* Все цели касания на телефоне не меньше 44×44 (§21). */
@media(max-width:767px){
  .v3-btn,.v3-iconbtn,.v3-fchip,.v3-tab,button{min-height:44px}
  .v3-chip{min-height:24px}
}

/* =====================================================================
   §22 ПЕЧАТЬ A4 — от программы на листе не остаётся ничего
   ===================================================================== */
@media print{
  @page{size:A4 portrait;margin:15mm}
  .sidebar,.topbar,.v3-drawer,.v3-toasts,.v3-palette,.overlay,.drawer,
  .v3-filters,.v3-btn,.v3-iconbtn,.v3-fchip,.v3-tabs,.btn-row,button,
  .pager,.v3-card__foot,.v3-explainbtn,.v3-whybtn,.v3-map__zoom,
  .v3-map__modes,#err,.demo-bar,.v3-footline{display:none !important}
  html,body{background:#fff !important;color:#000 !important}
  main{padding:0 !important;margin:0 !important}
  #app{display:block !important}
  /* Карточка НЕ объявлена неразрывной, и это измерение, а не вкус.
     С `break-inside:avoid` реестр на 61 строку — карточка выше листа —
     заставлял браузер уносить её целиком на следующую страницу, и
     первый лист уходил в печать почти пустым. Реестр обязан течь по
     страницам; неразрывными объявлены только те блоки, которые
     физически помещаются на лист. */
  .v3-card,.card{box-shadow:none !important;border:1px solid #999 !important;
    margin-bottom:6mm}
  .v3-card__head{break-after:avoid}
  .v3-table,table{font-size:10pt}
  .v3-table thead,thead{display:table-header-group}
  .v3-table tr,table tr,.v3-att,.v3-grd,.v3-law,.v3-kpi,.v3-facts,
  .v3-alert,.v3-step{break-inside:avoid}
  .v3-table td,.v3-table th,table td,table th{border-color:#999 !important;
    background:#fff !important;color:#000 !important}
  .v3-chip{border:1px solid #666 !important;background:#fff !important;
    color:#000 !important}
  .v3-chip::before{display:none}
  .v3-hero{background:#fff !important;color:#000 !important;min-height:0;
    padding:0 0 6mm}
  .v3-hero__bg,.v3-hero::after,.v3-hero__scrim{display:none}
  .v3-hero h1,.v3-hero p{color:#000 !important}
  /* Шапка листа: слева чьи данные и какой экран, справа сезон, время
     печати и кто напечатал. На каждом листе её не повторить средствами
     CSS — `position:running()` браузеры не поддерживают, — поэтому она
     стоит один раз сверху, а не обещается на каждой странице. */
  .v3-print-head{display:flex !important;justify-content:space-between;
    align-items:flex-start;gap:10mm;padding:0 0 4mm;margin:0 0 5mm;
    border-bottom:1px solid #999;font-size:9.5pt;color:#000}
  .v3-print-head__l b{display:block;font-size:12pt;font-weight:700}
  .v3-print-head__l span{display:block;color:#333}
  .v3-print-head__r{text-align:right;color:#333}
  .v3-print-head__r span{display:block}
  .v3-print-cont::after{content:"продовження";display:block;
    font-size:9pt;color:#444;padding-top:2mm}
}
.v3-print-head{display:none}
.v3-print-only{display:none}
@media print{.v3-print-only{display:block}}

/* =====================================================================
   МОСТ К ЭКРАНАМ ВЕРСИИ 1.0
   Двадцать пять существующих экранов написаны на классах версии 1.0 и
   НЕ переписаны: правило владельца — не трогать работающее ради нового
   вида. Токены выше уже перевели их на палитру и шрифты V3; здесь
   доводится ГЕОМЕТРИЯ — то, что токеном не задаётся: высота строки
   таблицы, вид заголовка колонки, глубина карточки, форма чипа.

   Почему не переписать разметку каждого экрана: 10 212 строк и 1955
   опытов, которые их проверяют. Переписать разметку означало бы
   переписать и опыты, то есть потерять доказательство ради внешнего
   вида. Мост даёт тот же результат и ничего не ломает.
   ===================================================================== */

/* Карточка: у 1.0 она была без глубины, у V3 глубина — часть языка. */
.card{background:var(--v3-surface);border:1px solid var(--v3-line-200) !important;
  border-radius:var(--v3-r-card);box-shadow:var(--v3-shadow-card) !important;
  margin-bottom:var(--v3-gutter);overflow:hidden}
.card--flush{padding:0}
.card > h2,.card > h3{font-family:var(--v3-font-display)}

/* Таблица: 40 px строка и заголовок-метка (§04.3, C-20). */
table th{height:38px;font:700 10.5px/1 var(--v3-font-text);letter-spacing:.08em;
  text-transform:uppercase;color:var(--v3-label);
  border-bottom:1px solid var(--v3-line-200);background:var(--v3-surface);
  white-space:nowrap}
table td{height:40px;border-bottom:1px solid var(--v3-line-100);
  color:var(--v3-ink);font:500 12.5px/1.4 var(--v3-font-text)}
table tbody tr:hover{background:var(--v3-surface-50)}
thead{display:table-header-group}

/* Показатель: число крупное, подпись под ним, глубина карточки. */
.kpi{background:var(--v3-surface);border:1px solid var(--v3-line-200);
  border-radius:var(--v3-r-card);box-shadow:var(--v3-shadow-card);
  padding:16px 18px;min-height:86px}
.kpi .v{font:700 30px/1 var(--v3-font-display) !important;letter-spacing:-.03em;
  color:var(--v3-ink)}
.kpi .l{font:600 11.5px/1.35 var(--v3-font-text);color:var(--v3-body)}
.kpi--nodata .v{font:700 17px/1.25 var(--v3-font-display) !important;
  color:var(--v3-warn) !important}
.grid,.grid--kpi{gap:var(--v3-gutter) !important;margin-bottom:var(--v3-gutter) !important}

/* Чип 1.0 (28 px, с рамкой) приводится к форме V3. */
.chip{height:22px;padding:0 9px;border:0 !important;border-radius:999px;
  font:700 10.5px/1.3 var(--v3-font-text);background:var(--v3-line-100);
  color:var(--v3-body)}
.chip.ok,.chip.v{background:var(--v3-tint);color:var(--v3-good)}
.chip.warn{background:var(--v3-warn-chip);color:var(--v3-warn)}
.chip.bad,.chip.error{background:var(--v3-bad-chip);color:var(--v3-bad)}
.tag{font:700 10.5px/1.3 var(--v3-font-text);border-radius:999px;
  background:var(--v3-line-100);color:var(--v3-body);padding:4px 9px}

/* Вкладки раздела: подчёркивание 1.0 → пилюля V3. */
.tabs{gap:6px}
.tabs button{border-radius:var(--v3-r-control) !important;border:0 !important;
  font:700 12.5px/1 var(--v3-font-text);height:34px}
.tabs button.on{background:var(--v3-ink) !important;color:#fff !important}

/* Органы управления: высота 40, радиус 11, рамка V3. */
button,.btn{border-radius:var(--v3-r-control)}
/* Один селектор вместо перечня: всё, что несёт класс `v3-`, уже
   одето компонентом. Перечислять исключения поимённо значило бы
   держать второй список компонентов, который разойдётся с первым —
   и он уже разошёлся: строка поиска в шапке позеленела как кнопка
   проведения. Найдено снимком экрана «Облік». */
button:not(.ghost):not(.navitem):not(.navsub):not(.collapse):not([class*="v3-"]){
  background:var(--v3-brand);color:#fff;border:1px solid transparent;
  box-shadow:var(--v3-shadow-primary);font-weight:700}
button:not(.ghost):not(.navitem):not(.navsub):not(.collapse):not([class*="v3-"]):hover:not(:disabled){
  background:var(--v3-forest)}
button.ghost,.btn--secondary{background:var(--v3-surface) !important;
  color:var(--v3-body) !important;border:1px solid var(--v3-line-300) !important;
  box-shadow:none !important;font-weight:700}
button.ghost:hover,.btn--secondary:hover{background:var(--v3-canvas) !important}
button:disabled{opacity:.5;box-shadow:none !important}
input,select,textarea{height:40px;border-radius:var(--v3-r-control);
  border:1px solid var(--v3-line-300);font:500 13px/1 var(--v3-font-text);
  color:var(--v3-ink)}
textarea{height:auto;padding:11px 13px;line-height:1.5}
.search input{height:40px}

/* Состояния и скелетоны 1.0 — той же формы, что C-29…C-31. */
.sk{background:linear-gradient(90deg,#EFF3F0,#F7FAF8,#EFF3F0);background-size:200% 100%;
  animation:v3sk 1.3s linear infinite;border-radius:10px}
.sk--kpi{height:86px;border-radius:var(--v3-r-card)}
.sk--row{height:40px;border-radius:0}
.state h3,.state h2{font-family:var(--v3-font-display)}

/* Пейджер и панель фильтров. */
.pager{border-top:1px solid var(--v3-line-100);background:var(--v3-surface-50)}
.pager__pages button{min-width:34px;height:34px;box-shadow:none !important;
  background:var(--v3-surface) !important;color:var(--v3-body) !important;
  border:1px solid var(--v3-line-300) !important}
.pager__pages button.on{background:var(--v3-tint) !important;
  color:var(--v3-brand) !important;border-color:var(--v3-chart) !important}
.filters{gap:9px}

/* Панель «Звідки ця цифра?» версии 1.0 — её содержимое не трогается,
   но оболочка становится ящиком V3. */
.drawer{border-radius:0;box-shadow:-24px 0 60px -30px rgba(15,26,20,.3)}
.drawer__head{min-height:56px;border-bottom:1px solid var(--v3-line-200)}
.explain-act,.lifecycle-act{border-radius:999px}

/* Полоса ошибки над экраном. */
.err{border-radius:var(--v3-r-card);border:1px solid var(--v3-bad-line);
  background:var(--v3-bad-card);color:var(--v3-bad);padding:13px 16px;
  font:500 12.5px/1.5 var(--v3-font-text);margin-bottom:var(--v3-gutter);
  display:flex;gap:11px;align-items:flex-start}
.err b{display:block;font:700 13px/1.3 var(--v3-font-display);margin-bottom:3px}

/* Полоса показа. */
.demo-bar{background:var(--v3-warn-chip);color:var(--v3-warn);
  font:700 11.5px/1 var(--v3-font-text);padding:9px 16px;text-align:center;
  letter-spacing:.06em;text-transform:uppercase}

/* Кнопки, которые кнопкой НЕ выглядят.
   Общее правило выше красит любой <button> в первичное действие — и
   это верно ровно до тех пор, пока в разметке 1.0 кнопкой не сделано
   что-то другое: вкладка раздела, карточка показателя, страница
   пейджера, крестик на чипе. Найдено снимками «Облік» и «Розрахунки»:
   три вкладки подряд выглядели как три первичных действия, а §03.2
   разрешает одно. Перечень закрыт и стоит ПОСЛЕ общего правила. */
.tabs button,.kpi,button.kpi,.pager__pages button,.chip button,
.explain-act,.lifecycle-act,.brd__chips button,.btn--tertiary,
.filters button,.card__head button.ghost{
  background:transparent !important;color:var(--v3-body) !important;
  box-shadow:none !important;border:0 !important}
.tabs button{background:transparent !important}
.tabs button:hover{background:var(--v3-canvas) !important;color:var(--v3-ink) !important}
.tabs button.on{background:var(--v3-ink) !important;color:#fff !important}
.kpi,button.kpi{background:var(--v3-surface) !important;
  border:1px solid var(--v3-line-200) !important;
  box-shadow:var(--v3-shadow-card) !important;color:var(--v3-ink) !important}
.kpi--active,.kpi:hover{border-color:var(--v3-line-400) !important}
.pager__pages button{background:var(--v3-surface) !important;
  border:1px solid var(--v3-line-300) !important}
.pager__pages button.on{background:var(--v3-tint) !important;
  color:var(--v3-brand) !important;border-color:var(--v3-chart) !important}
.explain-act,.lifecycle-act{background:var(--v3-tint-soft) !important;
  color:var(--v3-good) !important;border:1px dashed var(--v3-chart) !important;
  border-radius:999px !important;font:700 11.5px/1 var(--v3-font-text)}
.btn--danger{background:var(--v3-surface) !important;color:var(--v3-bad) !important;
  border:1px solid var(--v3-bad-line) !important;box-shadow:none !important}
/* Пилюля «ещё N проблем» — счётчик, а не действие. */
.ptag{font:700 10.5px/1.3 var(--v3-font-text);border-radius:999px;
  background:var(--v3-warn-chip);color:var(--v3-warn);padding:4px 9px;border:0}
.ptag--more{background:var(--v3-line-100) !important;color:var(--v3-body) !important}
/* Число внутри плитки героя.
   Отрисовщики §12 задают цвет текста сами (`.v3-val` — чернила), и
   внутренний span перебивал белый цвет, унаследованный от тёмной
   плитки: подпись читалась, число — нет. Цвет объявлен ЗДЕСЬ, у
   контейнера, а не правкой отрисовщика: у состояний один смысл на всю
   систему, и менять его ради одного места нельзя. */
.v3-hero__tile .v3-val,.v3-hero__tile .v3-zero,.v3-hero__tile .v3-partial,
.v3-hero__tile .v3-notcalc,.v3-hero__tile .v3-blockedval{color:#fff}
.v3-hero__tile .v3-nodata{color:#FFD9A8;border-bottom-color:rgba(255,217,168,.5)}
.v3-hero__tile .v3-why{color:rgba(255,255,255,.72)}
.v3-hero__tile--light .v3-val,.v3-hero__tile--light .v3-zero{color:var(--v3-ink)}
.v3-hero__tile--light .v3-why{color:var(--v3-meta)}

/* =====================================================================
   §20 ТЕЛЕФОН: МЕНЮ УХОДИТ ВНИЗ
   До 768 бокового меню нет вовсе — вместо него нижняя полоса. Оставить
   сайдбар на 390 значило бы отдать ему две трети экрана; свернуть в
   иконки — оставить человека без подписей. Полоса горизонтально
   прокручивается: разделов больше четырёх, и прятать их за «ещё»
   означало бы спрятать половину системы.
   ===================================================================== */
@media(max-width:767px){
  .sidebar{position:fixed;left:0;right:0;bottom:0;top:auto;width:auto;height:auto;
    flex-direction:row;padding:0;border-right:0;border-top:1px solid var(--v3-line-200);
    z-index:30;overflow-x:auto;overflow-y:hidden;
    padding-bottom:env(safe-area-inset-bottom,0px)}
  .sidebar__brand,.sidebar__foot,.navgroup{display:none}
  .sidebar__nav{flex-direction:row;gap:0;overflow:visible;padding:0}
  .sidebar__nav > div{display:none}          /* разделители не нужны в полосе */
  .navitem{flex-direction:column;gap:5px;min-width:78px;height:60px;border-radius:0;
    font:700 10.5px/1.2 var(--v3-font-text);text-align:center;justify-content:center;
    padding:6px 8px}
  .navitem span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:72px}
  .navitem > span[style]{display:none}       /* шеврон группы в полосе не нужен */
  .navitem .v3-nav-badge{position:absolute;margin:-34px 0 0 26px}
  .navsub{min-width:96px;height:60px;border-radius:0;padding:0 10px;
    font:700 10.5px/1.2 var(--v3-font-text);justify-content:center;text-align:center}
  main{margin-left:0 !important;padding-bottom:90px}
  .topbar{margin-left:0 !important;padding:0 14px;gap:8px}
  /* В шапке телефона остаются заголовок и ОДНО действие (§20). */
  .topbar__sep,#entity,#season,.v3-searchtrigger span:not(.v3-searchdot),
  .topbar__who > span:last-child{display:none}
  .v3-searchtrigger{flex:none;width:44px;justify-content:center;padding:0}
  #app{padding-bottom:0}
}
@media(min-width:768px){ main,.topbar{margin-left:var(--v3-sidebar)} }
@media(min-width:768px) and (max-width:1023px){
  .sidebar{width:var(--v3-sidebar-collapsed);padding:16px 8px}
  .sidebar__name,.sidebar__foot,.navgroup,.navitem span,.navsub{display:none}
  .navitem{justify-content:center;padding:10px}
  .navitem .v3-nav-badge{display:none}
  main,.topbar{margin-left:var(--v3-sidebar-collapsed)}
}
/* Подписи в нижней полосе телефона обязаны быть видны: правила 1.0
   прячут их у «свёрнутого» меню, а телефон — не свёрнутое меню. */
@media(max-width:767px){
  body.phone .navitem span:not([style]),
  body.phone .navsub{display:block !important}
  body.phone .navitem span:not([style]){max-width:74px;font-size:10px}
  /* В шапке телефона остаётся заголовок и одно действие. */
  body.phone .topbar__who,body.phone .topbar .ghost{display:none}
}
/* Карта на телефоне: панели перестают плавать над картой и становятся
   листом под ней (§20). Плавающая панель 196 px поверх экрана 390 px
   закрывает половину карты и выталкивает страницу вбок — измерено:
   109 px горизонтальной прокрутки. Горизонтальной прокрутки у страницы
   быть не должно нигде. */
@media(max-width:767px){
  .v3-map{min-height:300px}
  .v3-map__float{position:static;width:auto;box-shadow:none;background:var(--v3-surface);
    border:1px solid var(--v3-line-200);margin-top:10px;backdrop-filter:none}
  .v3-map__modes,.v3-map__zoom{position:static;margin-top:10px;flex-direction:row}
  .v3-map__canvas{position:relative;height:300px}
  .v3-map{display:flex;flex-direction:column;padding:0 0 12px;background:transparent;border:0}
  .v3-map__canvas,.v3-map__nogeo{border:1px solid var(--v3-line-200);
    border-radius:var(--v3-r-card);background:var(--v3-line-100);position:relative;inset:auto}
}
/* «Ще» есть только на телефоне: на большом экране всё меню и так видно. */
.navitem--more{display:none}
@media(max-width:767px){
  .navitem--more{display:flex}
  .navitem--more span{max-width:none !important}
  .navitem--more::before{content:"";width:16px;height:16px;border-radius:5px;
    border:1.75px dashed currentColor;opacity:.5}
  /* Полоса строится отдельно (см. `buildPhoneNav`): прятать лишнее
     стилем нельзя — разметка пунктов и подпунктов одинаковая. */
  body.phone .sidebar{overflow:hidden}
  body.phone .sidebar__nav{width:100%;display:grid;
    grid-template-columns:repeat(5,minmax(0,1fr))}
  body.phone .navitem{min-width:0}
  body.phone .navitem span:not([style]){max-width:100%}
}
/* Элемент сетки по умолчанию не уже своего содержимого (`min-width:auto`),
   поэтому один широкий потомок раздвигает колонку и всю страницу. Карта
   при viewBox 820 держала колонку в 483 px на экране 390 — отсюда
   109 px горизонтальной прокрутки. Правило общее: колонка сетки имеет
   право быть уже содержимого, а содержимое обязано ужиматься. */
.v3-grid > *,.v3-kpirow > *,.v3-doc > *{min-width:0}
.v3-map__canvas{max-width:100%}
@media(max-width:767px){
  .v3-map__canvas{width:100%;height:auto;aspect-ratio:820/470}
}

/* =====================================================================
   P-26 «ВІЗУАЛЬНЕ ОФОРМЛЕННЯ» — редактор кадра (§14, борд [3e])
   Токенов не изобретаем: всё берётся из тех же 92, что и остальное.
   ===================================================================== */
/* Видно диктору, не видно глазу. Тот же приём и с тем же именем, что в
   полевом приложении: убрать подпись совсем значило бы оставить поле
   немым, а показать — повторить то, что и так написано рядом. */
.sronly{position:absolute;width:1px;height:1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap}

.v3m-top{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:4px}
.v3m-top h1{margin:0}

/* Рамка кадрирования. Оригинал показывается ЦЕЛИКОМ: человек выбирает
   часть из целого, и спрятать от него остальное значило бы выбирать за
   него. Вне рамки изображение приглушено, внутри — как есть. */
.v3m-frame{position:relative;border-radius:var(--v3-r-card);overflow:hidden;
  background:#0B3D26;user-select:none;touch-action:none}
.v3m-img{display:block;width:100%;height:auto}
.v3m-crop{position:absolute;box-shadow:0 0 0 9999px rgba(6,25,16,.55);
  outline:2px solid #fff;cursor:move;touch-action:none}
/* Уголок растяжения стоит ВНУТРИ рамки, а не свисает наружу.
   Найдено исполнением: у рамки `overflow:hidden` (им обрезается тень,
   затемняющая всё вокруг кадра), и свисающий уголок у свежего кадра
   «во всё изображение» оказывался обрезан — нажатие приходило не на
   него, а на саму рамку, то есть кадр не растягивался вовсе. */
.v3m-handle{position:absolute;right:3px;bottom:3px;width:20px;height:20px;
  border-radius:50%;background:#fff;border:2px solid var(--v3-brand,#10693F);
  cursor:nwse-resize;touch-action:none;box-shadow:0 1px 6px rgba(0,0,0,.45)}
.v3m-focal{position:absolute;width:26px;height:26px;margin:-13px 0 0 -13px;padding:0;
  border-radius:50%;border:3px solid #fff;background:rgba(31,157,97,.85);
  cursor:grab;touch-action:none;box-shadow:0 2px 8px rgba(0,0,0,.45)}
.v3m-focal:focus-visible{outline:3px solid #FFD9A8;outline-offset:3px}

/* Превью трёх ширин. Ширина каждой коробки пропорциональна настоящей:
   1440 / 834 / 390 — и пропорция берётся у самого места оформления. */
.v3m-prev{position:relative;border-radius:var(--v3-r-card);overflow:hidden;
  background-color:#0B3D26;max-width:100%}
.v3m-prev__scrim{position:absolute;inset:0;background:#0B3D26}
.v3m-prev__txt{position:absolute;left:12px;bottom:10px;color:#fff;
  font:700 13px/1.2 var(--v3-font-display,inherit);letter-spacing:-.02em}

/* Медиатека */
.v3m-lib{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));
  gap:14px;padding:var(--v3-gutter)}
.v3m-libitem{margin:0;border:1px solid var(--v3-line);border-radius:var(--v3-r-card);
  overflow:hidden;background:var(--v3-surface,#fff)}
.v3m-libimg{height:118px;background-size:cover;background-position:center;
  background-color:#0B3D26}
.v3m-libitem figcaption{padding:11px 13px;font:600 12.5px/1.4 var(--v3-font-text);
  display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.v3m-libitem figcaption .v3-why{font-weight:500}
@media(max-width:833px){
  .v3m-prev{width:100% !important;height:auto !important;aspect-ratio:16/9}
}

/* =====================================================================
   ПІЛОТ · ДОСТУП: разовий пароль на екрані
   Показується РІВНО ОДИН раз і більше ніде не існує, тому набирається
   моноширинним: людина переписує його з екрана або диктує голосом, і
   «l» від «1» відрізнити має бути можливо. Набір символів пароля вже
   очищений від схожих знаків на сервері; шрифт — друга половина тієї
   самої турботи.
   ===================================================================== */
.v3-pass{display:inline-block;margin-top:4px;padding:6px 10px;
  border:1px solid var(--v3-line);border-radius:var(--v3-r-ctl,8px);
  background:var(--v3-surface,#fff);
  font:700 16px/1.3 var(--v3-font-mono,ui-monospace,monospace);
  letter-spacing:.06em;user-select:all}

/* Хрестик «зняти роль» усередині фішки. Кнопка, а не значок: її треба
   натискати і до неї треба доходити з клавіатури. */
.v3-chip__x{border:0;background:transparent;cursor:pointer;padding:0 0 0 4px;
  margin:0;font:700 13px/1 inherit;color:inherit;opacity:.65}
.v3-chip__x:hover{opacity:1}
.v3-chip__x:focus-visible{outline:2px solid var(--v3-focus,#0B6E4F);outline-offset:2px}
