:root{
  --bg:#0d1117; --bg2:#0f141b; --panel:#161c26; --panel2:#1b2230; --panel3:#202a3a;
  --line:#262f3d; --line2:#303c4d; --text:#e6edf3; --muted:#93a1b3; --faint:#5d6b7c;
  --accent:#3b82f6; --accent2:#2e75b6; --accent-soft:rgba(59,130,246,.14); --accent-bd:rgba(59,130,246,.45);
  --ok:#2ea043; --ok-soft:rgba(46,160,67,.14); --ok-bd:rgba(46,160,67,.4);
  --warn:#d29922; --warn-soft:rgba(210,153,34,.13);
  --err:#e5534b; --err-soft:rgba(229,83,75,.10);   /* ★ 24.08: в палитре были ok и warn, ошибки не было */
  --radius:14px; --radius-sm:10px;
  color-scheme:dark;   /* ★ 02.09: без этого браузер сам перекрашивает поля ввода под тёмный режим ОС */
  --shadow:0 8px 30px rgba(0,0,0,.35);
}

/* ★ 02.09 (IISMETA_UI, задача Отабека): СВЕТЛАЯ ТЕМА — тумблер «☀/☾» в шапке.
   Механика без переписывания правил: жёстко зашитые цвета вынесены в токены --h-<hex>.
   В тёмной теме каждый токен равен своему исходному значению — рендер не изменился
   (проверено обратной подстановкой: файл побайтно совпал с прежним).
   В светлой — токены перекрыты ниже в :root[data-theme="light"].
   ПРАВИЛО: новый цвет в коде — либо семантический токен (--text/--muted/--ok/…),
   либо пара «тёмное значение здесь + светлое в блоке светлой темы». Голый #hex
   в правиле означает, что он одинаково читается на обеих темах (белый на кнопке,
   подсветка mark, светофорные плашки .vg-ok/.vg-mid/.vg-low). */
:root{
  /* синие: текст/рамки акцента */
  --h-cfe0ff:#cfe0ff; --h-9ec5ff:#9ec5ff; --h-9fd0ff:#9fd0ff; --h-cfe6ff:#cfe6ff;
  --h-bcdcff:#bcdcff; --h-dbe8ff:#dbe8ff; --h-bcd6ff:#bcd6ff; --h-6cb6ff:#6cb6ff;
  --h-7fb3ff:#7fb3ff; --h-8fc0ff:#8fc0ff; --h-8fc1f2:#8fc1f2; --h-8fb6ec:#8fb6ec;
  --h-7fb0e0:#7fb0e0; --h-5fa8e8:#5fa8e8; --h-dbe9ff:#dbe9ff; --h-bcd3f0:#bcd3f0;
  --h-9db4d8:#9db4d8; --h-d5deea:#d5deea; --h-c4d0de:#c4d0de; --h-aeb9c8:#aeb9c8;
  --h-8b98a9:#8b98a9; --h-9aa7bd:#9aa7bd; --h-c8ccd4:#c8ccd4; --h-e6edf3:#e6edf3;
  --h-e8eef7:#e8eef7;
  /* янтарные: предупреждения и допущения */
  --h-e0b86a:#e0b86a; --h-eccf86:#eccf86; --h-e8c06a:#e8c06a; --h-e8c878:#e8c878;
  --h-f3d68a:#f3d68a; --h-f4c430:#f4c430; --h-ffce6b:#ffce6b; --h-e0b341:#e0b341;
  --h-ffd98a:#ffd98a; --h-ffcf4d:#ffcf4d; --h-ffcf7a:#ffcf7a; --h-d8c08a:#d8c08a;
  --h-ecd089:#ecd089; --h-f0c568:#f0c568; --h-c9a15a:#c9a15a; --h-d29922:#d29922;
  /* зелёные: успех/готово */
  --h-7ee0a3:#7ee0a3; --h-7ee2a8:#7ee2a8; --h-8fd6a8:#8fd6a8; --h-7fdcb0:#7fdcb0;
  --h-8fd19e:#8fd19e; --h-7fd0a0:#7fd0a0; --h-74d99f:#74d99f; --h-a6e7bd:#a6e7bd;
  --h-7ee2a0:#7ee2a0; --h-b9f6cf:#b9f6cf; --h-5fd4a8:#5fd4a8; --h-7fd6a2:#7fd6a2;
  --h-5fb35f:#5fb35f; --h-c8f0d6:#c8f0d6; --h-5fbf7f:#5fbf7f; --h-3fb950:#3fb950;
  /* красные: ошибки и удаление */
  --h-f08a8a:#f08a8a; --h-e08a8a:#e08a8a; --h-f0a8a7:#f0a8a7; --h-f0a0a0:#f0a0a0;
  --h-e0a0a0:#e0a0a0; --h-f87171:#f87171; --h-f3b7b7:#f3b7b7; --h-f29a9a:#f29a9a;
  --h-e5534b:#e5534b; --h-7a2f2f:#7a2f2f;
  /* фиолетовые: труд/поправки */
  --h-bca8ee:#bca8ee; --h-b18cff:#b18cff; --h-b9a6f0:#b9a6f0;
  --h-f5b342:#f5b342;                                   /* янтарный: заменить расценку (п.5) */
  /* подложки и рамки */
  --h-16314f:#16314f; --h-0f1a30:#0f1a30; --h-232d3d:#232d3d; --h-2a3547:#2a3547;
  --h-2b3647:#2b3647; --h-2a3550:#2a3550; --h-13192a:#13192a; --h-16273a:#16273a;
  --h-2a3340:#2a3340; --h-39455a:#39455a; --h-1b2a44:#1b2a44; --h-3a2f16:#3a2f16;
  --h-3a2f14:#3a2f14; --h-6b5320:#6b5320; --h-5a4a1e:#5a4a1e; --h-3a1f22:#3a1f22;
  --h-241a3d:#241a3d; --h-15203033:#15203033;
  --row-hover:rgba(255,255,255,.045); --chip-soft:rgba(255,255,255,.07);
  --float-bg:rgba(20,26,36,.92); --tip-bg:rgba(18,24,34,.97);
  /* текст поверх ПОЛУПРОЗРАЧНОЙ акцентной подложки: на тёмной подложке белый,
     на кремовой такой же полупрозрачный слой становится светло-голубым и белое пропадает */
  --on-tint:#fff;
}

/* ── СВЕТЛАЯ ТЕМА (кремовая, не белоснежная) ─────────────────────────────────
   Ставится атрибутом data-theme="light" на <html> из шапки; выбор живёт в
   localStorage('smetaai-theme') и передаётся во вложенные визарды (iframe). */
:root[data-theme="light"]{
  --bg:#f6f1e6; --bg2:#fbf7ee; --panel:#fffdf7; --panel2:#f8f3e9; --panel3:#efe9dc;
  --line:#e5ddcb; --line2:#d5cbb5; --text:#1f2a3a; --muted:#556070; --faint:#848d9b;
  --accent:#2e75b6; --accent2:#1f3864; --accent-soft:rgba(46,117,182,.12); --accent-bd:rgba(46,117,182,.42);
  --ok:#1e7a46; --ok-soft:rgba(30,122,70,.12); --ok-bd:rgba(30,122,70,.38);
  --warn:#8a6100; --warn-soft:rgba(214,155,34,.18);
  --err:#b3261e; --err-soft:rgba(179,38,30,.09);
  --shadow:0 8px 24px rgba(31,42,58,.12);
  --row-hover:rgba(31,42,58,.05); --chip-soft:rgba(31,42,58,.07);
  --float-bg:rgba(255,252,244,.94); --tip-bg:rgba(255,252,244,.98);
  --on-tint:#14355c;
  color-scheme:light;
  /* синие: текст/рамки акцента */
  --h-cfe0ff:#1b3e6f; --h-9ec5ff:#1f5490; --h-9fd0ff:#17568c; --h-cfe6ff:#123e6e;
  --h-bcdcff:#17456f; --h-dbe8ff:#1b3e6f; --h-bcd6ff:#24507e; --h-6cb6ff:#1668b8;
  --h-7fb3ff:#2059ad; --h-8fc0ff:#1f5fb0; --h-8fc1f2:#1d5fa8; --h-8fb6ec:#2a5fa8;
  --h-7fb0e0:#2a6394; --h-5fa8e8:#1a5fa0; --h-dbe9ff:#1d3f63; --h-bcd3f0:#4a5a72;
  --h-9db4d8:#4a5f80; --h-d5deea:#3a4655; --h-c4d0de:#4a5665; --h-aeb9c8:#5a6675;
  --h-8b98a9:#5f6a79; --h-9aa7bd:#5c6675; --h-c8ccd4:#4c5361; --h-e6edf3:#1f2a3a;
  --h-e8eef7:#2c3648;
  /* янтарные: предупреждения и допущения */
  --h-e0b86a:#8a5a00; --h-eccf86:#7a5b00; --h-e8c06a:#8a6100; --h-e8c878:#8a6100;
  --h-f3d68a:#7a5b00; --h-f4c430:#8a6100; --h-ffce6b:#8a5a00; --h-e0b341:#8a6100;
  --h-ffd98a:#8a6100; --h-ffcf4d:#8a6100; --h-ffcf7a:#8a5a00; --h-d8c08a:#6e5a22;
  --h-ecd089:#7a5b00; --h-f0c568:#8a5a00; --h-c9a15a:#8a6100; --h-d29922:#8a6100;
  /* зелёные: успех/готово */
  --h-7ee0a3:#12673a; --h-7ee2a8:#12673a; --h-8fd6a8:#176b3f; --h-7fdcb0:#0e6642;
  --h-8fd19e:#176b3f; --h-7fd0a0:#116b42; --h-74d99f:#116b42; --h-a6e7bd:#116b42;
  --h-7ee2a0:#12673a; --h-b9f6cf:#0f6b3c; --h-5fd4a8:#0e6642; --h-7fd6a2:#116b42;
  --h-5fb35f:#1a6f3f; --h-c8f0d6:#12673a; --h-5fbf7f:#1a6f3f; --h-3fb950:#1a6f3f;
  /* красные: ошибки и удаление */
  --h-f08a8a:#b3261e; --h-e08a8a:#b3261e; --h-f0a8a7:#b3261e; --h-f0a0a0:#b3261e;
  --h-e0a0a0:#a8443e; --h-f87171:#c0392b; --h-f3b7b7:#b3261e; --h-f29a9a:#b3261e;
  --h-e5534b:#b3261e; --h-7a2f2f:#e4b4b0;
  /* фиолетовые: труд/поправки */
  --h-bca8ee:#5b3fbf; --h-b18cff:#6b4fd8; --h-b9a6f0:#5b3fbf;
  --h-f5b342:#9a6400;
  /* подложки и рамки */
  --h-16314f:#e8eff8; --h-0f1a30:#edf2fa; --h-232d3d:#f0ece2; --h-2a3547:#e9e5da;
  --h-2b3647:#ddd6c7; --h-2a3550:#dfd8c8; --h-13192a:#fffcf5; --h-16273a:#e8eff8;
  --h-2a3340:#cfc7b5; --h-39455a:#b8ae99; --h-1b2a44:#ece4d3; --h-3a2f16:#f5ecd6;
  --h-3a2f14:#f7eedb; --h-6b5320:#d9c48a; --h-5a4a1e:#c9ae63; --h-3a1f22:#fbe9e7;
  --h-241a3d:#efeafb; --h-15203033:#e8dcc133;
}
*{box-sizing:border-box;}
html,body{margin:0;height:100%;}
body{background:radial-gradient(1200px 600px at 80% -10%, var(--h-15203033), transparent), var(--bg);
  color:var(--text); font-family:'Inter',system-ui,Arial,sans-serif; font-size:14px; line-height:1.5;
  -webkit-font-smoothing:antialiased;}
.hidden{display:none !important;}
.muted{color:var(--muted);}
.muted.err{color:var(--h-f0a8a7);}   /* отказ поиска (401/429/5xx) — не путать с «ничего не найдено» */

/* ── buttons ── */
.btn{font:inherit; font-weight:500; border:1px solid var(--line2); background:var(--panel2); color:var(--text);
  padding:9px 16px; border-radius:var(--radius-sm); cursor:pointer; transition:.15s; display:inline-flex;
  align-items:center; justify-content:center; gap:8px;}
.btn:hover{border-color:var(--accent-bd); background:var(--panel3);}
.btn:active{transform:scale(.985);}
.btn:disabled{opacity:.45; cursor:not-allowed;}
.btn-primary{background:linear-gradient(180deg,#3b82f6,#2e6fd6); border-color:#3b82f6; color:#fff;
  box-shadow:0 4px 14px rgba(59,130,246,.3);}
.btn-primary:hover{filter:brightness(1.08); background:linear-gradient(180deg,#4a8cf7,#2e6fd6);}
/* ★ 10.09: кнопка необратимого действия. Раньше удаление подтверждалось системным окном
   браузера, где обе кнопки выглядят одинаково; здесь опасная отличается от безопасной. */
.btn-danger{background:var(--err); border-color:var(--err); color:#fff;}
.btn-danger:hover{filter:brightness(1.08);}
.btn-ghost{background:transparent;}
.btn-block{width:100%;}
.btn-icon{padding:7px 11px; background:transparent; border-color:transparent; font-size:16px;}
.btn-icon:hover{background:var(--panel3); border-color:var(--line2);}

/* ── login ── */
.login-screen{position:fixed; inset:0; display:flex; align-items:center; justify-content:center;
  background:radial-gradient(900px 500px at 50% 0%, var(--h-1b2a44), var(--bg));}
.login-card{width:360px; background:var(--panel); border:1px solid var(--line); border-radius:var(--radius);
  padding:30px 28px; box-shadow:var(--shadow);}
.login-card h1{font-size:20px; margin:18px 0 4px;}
.login-card input{margin:16px 0 10px;}
.login-err{color:var(--h-f87171); font-size:13px; min-height:18px; margin-top:8px;}
/* ★ 19.08: демо-вход для жюри — второстепенное действие, не спорит с основным «Войти» */
.login-guest{margin-top:14px; padding-top:14px; border-top:1px solid var(--line);
  display:flex; flex-direction:column; gap:6px; align-items:center;
  font-size:12.5px; color:var(--muted); text-align:center;}
.login-guest-btn{background:none; border:none; padding:0; cursor:pointer;
  color:var(--accent); font-size:13px; font-weight:500; font-family:inherit;}
.login-guest-btn:hover{text-decoration:underline;}
/* ★ 02.09 (IISMETA_UI): тумблер темы на логине — шапки с кнопками тут ещё нет. */
.theme-btn-fab{position:absolute; top:16px; right:18px; z-index:2;}
/* плашка «демо» в шапке — чтобы жюри понимало, что видит изолированный стенд */
body.is-guest .brand-sub::after{content:" · ДЕМО"; color:var(--h-e8c878); font-weight:600;}

/* ── brand ── */
.brand{display:flex; align-items:center; gap:11px;}
.brand-logo{width:34px; height:34px; border-radius:9px; background:linear-gradient(135deg,#3b82f6,#1e58b0);
  display:flex; align-items:center; justify-content:center; font-size:18px; color:#fff;}
.brand-name{font-weight:700; font-size:16px; letter-spacing:.2px;}
.brand-sub{font-size:11px; color:var(--faint);}

/* ── inputs ── */
input,select{width:100%; font:inherit; color:var(--text); background:var(--panel2);
  border:1px solid var(--line2); border-radius:var(--radius-sm); padding:9px 12px; outline:none; transition:.15s;}
input:focus,select:focus{border-color:var(--accent-bd); box-shadow:0 0 0 3px var(--accent-soft);}
input::placeholder{color:var(--faint);}
select{appearance:none; background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%2393a1b3'><path d='M2 4l4 4 4-4z'/></svg>");
  background-repeat:no-repeat; background-position:right 12px center; padding-right:30px;}

/* ── topbar ── */
.app{display:flex; flex-direction:column; height:100vh;}
.topbar{display:flex; align-items:center; gap:18px; padding:12px 20px; border-bottom:1px solid var(--line);
  background:var(--bg2);}
.tabs{display:flex; gap:6px; margin-left:8px; flex-wrap:wrap;}
.tab{font:inherit; font-size:13px; padding:7px 14px; border-radius:9px; border:1px solid transparent;
  background:transparent; color:var(--faint); cursor:pointer;}
.tab:not(.active):hover{color:var(--h-cfe0ff); background:rgba(120,160,255,.08);}
.tab.active{background:var(--accent-soft); color:var(--h-cfe0ff); border-color:var(--accent-bd); font-weight:600; cursor:default;}
.topbar-right{margin-left:auto; display:flex; align-items:center; gap:12px;}
.pill{font-size:12px; color:var(--h-bcd3f0); background:var(--accent-soft); border:1px solid var(--accent-bd);
  padding:5px 12px; border-radius:999px;}
.operator{font-size:13px; color:var(--muted); display:flex; align-items:center; gap:6px;}
.operator::before{content:""; width:7px; height:7px; border-radius:50%; background:var(--ok); box-shadow:0 0 6px var(--ok);}

/* ── toasts ── */
.toasts{position:fixed; right:18px; bottom:18px; display:flex; flex-direction:column; gap:8px; z-index:80;}
.toast{background:var(--panel2); border:1px solid var(--ok-bd); color:var(--h-c8f0d6); padding:11px 16px;
  border-radius:var(--radius-sm); box-shadow:var(--shadow); font-size:13px; display:flex; align-items:center; gap:9px;
  animation:slideIn .22s ease; max-width:340px;}
.toast.err{border-color:var(--h-7a2f2f); color:var(--h-f3b7b7);}
@keyframes slideIn{from{transform:translateY(8px); opacity:0;} to{transform:translateY(0); opacity:1;}}

/* ── layout ── */
.layout{flex:1; min-height:0; display:grid; grid-template-columns:minmax(0,44fr) minmax(0,56fr); gap:14px;
  padding:14px 20px 18px; overflow:hidden;}
.layout-3{grid-template-columns:minmax(300px,1fr) 420px 640px;}         /* дерево(гибк.) | подбор(стац.) | смета(фикс — не растянута) */
/* ── ВСПЛЫВАШКА НАБРАННЫХ РАБОТ (плавает, перетаскивается) ── */
.nakedpop{position:fixed; right:36px; top:100px; width:400px; height:calc(100vh - 130px); max-height:720px; z-index:60;
  display:flex; flex-direction:column; background:var(--panel); border:1px solid var(--line2);
  border-radius:var(--radius); box-shadow:0 18px 54px rgba(0,0,0,.55); overflow:hidden;}
.nakedpop.hidden{display:none !important;}
.float-head{display:flex; align-items:center; gap:8px; padding:9px 12px; background:var(--bg2);
  border-bottom:1px solid var(--line); font-size:13px; font-weight:600; color:var(--h-cfe0ff); cursor:move; user-select:none; flex:0 0 auto;}
.float-head .ic{color:var(--accent); font-style:normal;}
.float-head .float-sub{font-weight:400; color:var(--faint); font-size:11px;}
.float-x{margin-left:auto; background:transparent; border:0; color:var(--faint); font-size:15px; cursor:pointer; padding:2px 7px; border-radius:6px; line-height:1;}
.float-x:hover{background:var(--panel3); color:var(--text);}
.nakedpop .naked-col{flex:1 1 auto; height:auto; min-height:0; border:0; border-radius:0; box-shadow:none;}
.univer-panel{min-height:0; height:100%;}
.univer-host{flex:1 1 auto; min-height:0; overflow:hidden; background:#fff; border-radius:0 0 var(--radius) var(--radius);}
#openNaked{font-size:12px;}
@media(max-width:1280px){.layout-3{grid-template-columns:minmax(260px,1fr) 380px 560px;}}
.right-col{display:flex; flex-direction:column; gap:10px; min-width:0; min-height:0; height:100%; overflow:hidden;}
/* колонка 2: работы */
.work-panel{min-height:0; height:100%;}
.work-panel .param-body{flex:1 1 auto; overflow:auto; min-height:0;}
.work-foot{flex:0 0 auto; padding:10px 14px; border-top:1px solid var(--line); display:flex; flex-direction:column; gap:8px;}
.work-foot .hidden{display:none;}
/* колонка 3: накопитель */
.naked-col{min-height:0; height:100%;}
.naked-tools{flex:0 0 auto; padding:10px 12px 0;}
.naked-col .naked{flex:1 1 auto;}
.naked-col .naked-actions{flex:0 0 auto; padding:10px 12px; border-top:1px solid var(--line);}

/* ── panel ── */
.panel{background:var(--panel); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:0 2px 14px rgba(0,0,0,.18); display:flex; flex-direction:column; overflow:hidden; min-height:0;}
.panel-head{display:flex; align-items:center; gap:8px; padding:13px 16px; border-bottom:1px solid var(--line);
  font-weight:600; font-size:14px; color:var(--h-cfe0ff);}
.panel-head .ic{color:var(--accent); font-style:normal;}
.panel-sub{font-weight:400; color:var(--faint); font-size:12px; margin-left:2px;}
.tree-panel{min-height:0; height:100%;}
.search{padding:10px 14px;}
.tree{flex:1; overflow:auto; padding:4px 8px 14px;}

/* ── tree ── */
.tnode{user-select:none;}
.trow{display:flex; align-items:flex-start; gap:7px; padding:6px 8px; border-radius:8px; cursor:pointer;
  transition:.12s;}
.trow:hover{background:var(--panel2);}
.trow.lvl1{font-weight:600; color:var(--h-e6edf3);}
.trow.lvl2{color:var(--h-c4d0de);}
.trow.lvl3{color:var(--muted); font-size:13px;}
.trow.lvl4{color:var(--muted); font-size:12.5px;}
.trow.lvl4 .tcode{opacity:.95;}
.tcaret-w{cursor:pointer;} .tcaret-w:hover{color:var(--h-9fd0ff);}
.trow.sel{background:var(--accent-soft); color:var(--h-dbe8ff); box-shadow:inset 0 0 0 1px var(--accent-bd);}
/* п.3: сильная подсветка выбранной расценки нижнего уровня */
.trow.selrasc{background:rgba(46,117,182,.34); color:var(--on-tint); box-shadow:inset 0 0 0 2px var(--accent); font-weight:600;}
.trow.selrasc .tcode{color:var(--h-bcdcff);}
.tcaret{width:14px; flex:none; color:var(--faint); transition:.15s; margin-top:2px;}
.tcaret.open{transform:rotate(90deg);}
.tlabel{flex:1; min-width:0;}
.children{margin-left:14px; border-left:1px solid var(--line2); padding-left:6px;}
.tcode{color:var(--accent); font-weight:600; margin-right:6px; font-variant-numeric:tabular-nums;}

/* ── param window ── */
.param-panel{flex:1 1 auto; min-height:240px;}
.param-body{flex:1; overflow:auto; padding:16px; min-height:0;}
.empty-state{height:100%; display:flex; flex-direction:column; align-items:center; justify-content:center;
  text-align:center; color:var(--faint); gap:14px;}
.empty-ic{font-size:46px; opacity:.35;}
.work-head{display:flex; justify-content:space-between; align-items:flex-start; gap:10px;}
.work-title{font-weight:600; font-size:15px; line-height:1.4;}
.work-meta{color:var(--faint); font-size:12px; margin-top:3px;}
.params-grid{display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:10px; margin:14px 0;}
.field label{display:block; font-size:12px; color:var(--muted); margin-bottom:5px;}
.rate-banner{background:var(--ok-soft); border:1px solid var(--ok-bd); color:var(--h-7ee2a0); border-radius:var(--radius-sm);
  padding:10px 13px; font-size:13.5px; margin:6px 0 12px;}
.rate-banner b{color:var(--h-b9f6cf);}
.dobor-line{color:var(--muted); font-size:12.5px; margin:-6px 0 12px;}
.warn-banner{background:var(--warn-soft); border:1px solid var(--h-5a4a1e); color:var(--h-e8c878); border-radius:var(--radius-sm);
  padding:10px 13px; font-size:13px;}
.hint{background:var(--panel2); border:1px dashed var(--line2); color:var(--muted); border-radius:var(--radius-sm);
  padding:14px 16px; font-size:13.5px; text-align:center;}

/* ── tabs характеристик расценки ── */
.abc-tabs{display:flex; gap:4px; border-bottom:1px solid var(--line); margin-bottom:10px;}
.abc-tab{font:inherit; font-size:13px; padding:8px 13px; border:none; background:transparent; color:var(--muted);
  cursor:pointer; border-bottom:2px solid transparent; margin-bottom:-1px;}
.abc-tab:hover{color:var(--text);}
.abc-tab.active{color:var(--h-cfe0ff); border-bottom-color:var(--accent); font-weight:600;}
.abc-pane{display:none;}
.abc-pane.active{display:block;}

/* ── полный список расценок (ручной выбор) ── */
.allrasc{margin:10px 0 4px;}
.btn-link{background:none; border:none; color:var(--h-9fd0ff); cursor:pointer; font-size:13px; padding:4px 0; font-weight:600;}
.btn-link:hover{color:var(--h-cfe6ff);}
.manual-tag{margin-left:10px; font-size:12px; color:var(--h-f4c430);}
.manual-tag a{color:var(--h-9fd0ff); cursor:pointer; text-decoration:underline;}
.rasc-list{margin-top:6px; max-height:280px; overflow:auto; border:1px solid var(--line); border-radius:8px;}
.rasc-item{display:flex; gap:10px; padding:7px 10px; border-bottom:1px solid var(--line); cursor:pointer; font-size:12.5px; align-items:baseline;}
.rasc-item:hover{background:var(--panel2);}
.rasc-item.sel{background:rgba(159,208,255,.14);}
.rasc-code{color:var(--h-9fd0ff); font-weight:600; white-space:nowrap; flex:0 0 auto;}
.rasc-name{color:var(--text); overflow-wrap:break-word;}

/* ── подсветка найденного в поиске ── */
.hlq{background:#ffd84d; color:#1a1400; font-weight:700; border-radius:3px; padding:0 2px;
  box-shadow:0 0 0 1px rgba(255,216,77,.5);}
.trow .tcode .hlq{background:#ffd84d; color:#1a1400;}

/* ── table ── */
table.res{width:100%; border-collapse:collapse; font-size:13px;}
table.res th{background:var(--panel3); color:var(--h-bcd3f0); text-align:left; padding:8px 10px; font-weight:600;
  border-bottom:1px solid var(--line); position:sticky; top:0;}
table.res td{padding:7px 10px; border-bottom:1px solid var(--line); color:var(--text);
  white-space:normal; overflow-wrap:break-word; word-break:normal;}   /* №5: полный перенос имён */
table.res td.num,table.res th.num{text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap;}
table.res td:nth-child(2){min-width:200px;}                              /* колонка наименования — шире */
table.res td:nth-child(3),table.res th:nth-child(3){white-space:nowrap; width:1%;}  /* Ед. — не переносить «маш.-ч/чел.-ч» */
table.res tr:hover td{background:var(--panel2);}
table.res tr.dob-sep td{background:var(--panel3); color:var(--h-9fd0ff); font-size:12px; font-weight:600;}
.smeta-work .swh{white-space:normal; overflow-wrap:break-word;}            /* №5: заголовок работы не режется */
.popr-i{font-style:italic; color:var(--h-9aa7bd); font-weight:400;}             /* поправка в смете — курсивом */
.sostav{padding:8px 6px; font-size:13px; line-height:1.5; color:var(--text);}
.sostav-item{padding:6px 8px; border-bottom:1px solid var(--line); overflow-wrap:break-word;}
.sostav-item:last-child{border-bottom:none;}

/* ── popravki ── */
.pop{display:flex; gap:9px; align-items:flex-start; padding:8px 6px; border-bottom:1px solid var(--line);
  cursor:pointer; font-size:12.5px; line-height:1.4;}
.pop:hover{background:var(--panel2);}
.pop input{width:16px; height:16px; flex:none; margin-top:1px; accent-color:var(--accent);}
.pop .pt{color:var(--accent); font-weight:600; margin-right:5px;}
.pop .pk{color:var(--h-e8c878);}
.pop-tch-block{margin-top:6px; padding-top:6px; border-top:1px dashed var(--line);}
.pop-tch{padding:6px; font-size:12px; line-height:1.4; color:var(--ink2, var(--h-c8ccd4));}
.pop-tch b{color:var(--accent); margin-right:5px;}
.har-row{display:flex; justify-content:space-between; gap:12px; padding:7px 4px; border-bottom:1px solid var(--line);
  font-size:13px;}
.har-row .hk{color:var(--muted);} .har-row .hv{text-align:right; color:var(--text); overflow-wrap:break-word;}
.har-row.har-sost-head{margin-top:10px; border-bottom:2px solid var(--line);}
.har-row.har-sost-head .hk{color:var(--text); font-weight:600;}
.har-wip{margin:2px 0 10px; padding:8px 10px; border-radius:8px; font-size:12.5px;
  background:rgba(255,176,32,.12); border:1px solid rgba(255,176,32,.35); color:var(--h-ffd98a);}
/* иконки узлов дерева + индикатор загрузки */
.ticon{margin-right:5px; font-size:12px; opacity:.9; flex:none;}
.tree-loading{padding:18px 10px; color:var(--muted); font-size:13px; line-height:1.7; text-align:center;}
.tree-loading .muted{font-size:11.5px;}
/* кружки в ячейке шифра ресурса: 🔴 исключить · 🟢 заменить */
.rdots{display:inline-flex; gap:4px; vertical-align:middle; margin-right:6px;}
.rdot{width:11px; height:11px; border-radius:50%; cursor:pointer; display:inline-block; opacity:.85;}
.rdot:hover{opacity:1; transform:scale(1.15);}
.rdrop{background:#e24b4a;} .rswap{background:#1d9e75;}
/* #102/#103: кнопка «Вернуть» вместо кружка — жёлтая (исключённый) / голубая (заменённый) */
.rbtn{font-size:10.5px; font-weight:600; line-height:1; padding:2px 6px; border-radius:9px; border:0; cursor:pointer; white-space:nowrap;}
.rrestore{background:#e6a700; color:#1b1b1b;}
.rrestore:hover{background:#f4b81a;}
.rrevert{background:#2E75B6; color:#fff;}
.rrevert:hover{background:#3d87cb;}
/* #102: исключённый ресурс остаётся в списке — затемнённая (серая) строка */
table.res tr.r-excluded td{color:var(--muted); opacity:.55; text-decoration:line-through;}
table.res tr.r-excluded td:first-child{text-decoration:none;}
/* #108–110: модалка «Ресурс вне расценки / Данные пользователя» */
.rp-card{max-width:760px;}
/* C1: модалка «Методология ценообразования РУз» */
.metod-card{width:min(980px,96vw);}
.metod-search{display:flex;align-items:center;gap:10px;margin-bottom:10px;position:sticky;top:0;background:var(--panel);z-index:2;padding-bottom:2px;}
.metod-search .bsearch{flex:1;}
.metod-count{white-space:nowrap;font-size:12px;}
.metod-tbl{width:100%;border-collapse:collapse;font-size:12.5px;}
.metod-tbl th{position:sticky;top:0;background:var(--panel2);color:var(--muted);font-weight:600;text-align:left;padding:6px 8px;border-bottom:1px solid var(--line2);z-index:1;}
.metod-tbl th:nth-child(1),.metod-tbl th:nth-child(3),.metod-tbl th:nth-child(4){text-align:center;width:52px;}
.metod-tbl td{padding:6px 8px;border-bottom:1px solid var(--line);vertical-align:top;}
.metod-tbl td.c{text-align:center;white-space:nowrap;}
.metod-tbl tr:hover td{background:var(--row-hover);}
.metod-tbl tr.mrow-empty td{opacity:.55;}
a.mlink{color:var(--accent,#2E75B6);cursor:pointer;font-weight:600;text-decoration:underline;text-underline-offset:2px;}
a.mlink:hover{color:var(--h-5fa8e8);}
.mlink.off{color:var(--muted);opacity:.5;cursor:default;}
/* C2: модалка «Условия производства работ» */
.uslov-card{width:min(920px,96vw);}
.uslov-note{padding:8px 10px;margin-bottom:8px;border-radius:6px;background:rgba(230,167,0,.12);border-left:3px solid #e6a700;color:var(--h-f3d68a);font-size:13px;}
.uslov-sec{margin-bottom:8px;border:1px solid var(--line2);border-radius:8px;overflow:hidden;}
.uslov-sec-h{padding:10px 12px;cursor:pointer;background:var(--panel2);display:flex;align-items:center;gap:8px;user-select:none;}
.uslov-sec-h:hover{background:var(--panel3);}
.uslov-sec-h.open{background:var(--accent-soft);color:var(--h-cfe0ff);}
.uslov-caret{color:var(--muted);font-size:11px;width:12px;}
.uslov-tbl{width:100%;border-collapse:collapse;font-size:12.5px;}
.uslov-tbl th{position:sticky;top:0;background:var(--panel2);color:var(--muted);font-weight:600;text-align:left;padding:6px 8px;border-bottom:1px solid var(--line2);}
.uslov-tbl th:nth-child(1),.uslov-tbl th:nth-child(3),.uslov-tbl th:nth-child(4){text-align:center;}
.uslov-tbl td{padding:6px 8px;border-bottom:1px solid var(--line);vertical-align:top;}
.uslov-tbl td.c{text-align:center;white-space:nowrap;}
.uslov-tbl td.num{font-variant-numeric:tabular-nums;font-weight:600;color:var(--h-f3d68a);}
.uslov-row{cursor:pointer;}
.uslov-row:hover td{background:rgba(230,167,0,.14);}
.smeta-sec.cond{background:rgba(230,167,0,.12);border-left-color:#e6a700;color:var(--h-f3d68a);}
.rp-cats{display:flex; flex-direction:column; gap:12px; padding:12px 4px;}
.rp-cat{display:flex; flex-direction:column; gap:3px; text-align:left; padding:16px 18px; border:1px solid var(--line,var(--h-2a3550)); border-radius:12px; background:rgba(46,117,182,.06); cursor:pointer; color:inherit;}
.rp-cat:hover{background:rgba(46,117,182,.14);}
.rp-cat b{font-size:15px;} .rp-cat span{font-size:12px; color:var(--muted);}
.rp-nav{margin:2px 0 8px;} .rp-back{cursor:pointer; color:var(--h-9fd0ff); font-size:12.5px;} .rp-back:hover{text-decoration:underline;}
.rp-list{max-height:340px; overflow:auto; margin-top:8px;}
.rp-tbl{width:100%; border-collapse:collapse; font-size:12.5px;}
.rp-tbl th{ text-align:left; color:var(--muted); font-weight:600; padding:5px 8px; border-bottom:1px solid var(--line,var(--h-2a3550));}
.rp-tbl td{padding:5px 8px; border-bottom:1px solid rgba(120,140,170,.12);}
.rp-tbl td.num{text-align:right;}
.btn-mini{font-size:11.5px; padding:3px 10px;}
.rp-add{margin-top:14px; padding:12px; border:1px dashed var(--line,var(--h-2a3550)); border-radius:10px;}
.rp-add-h{font-weight:600; font-size:13px; margin-bottom:8px;}
.rp-add-row{display:flex; gap:8px; flex-wrap:wrap; align-items:center;}
.rp-add-row select, .rp-add-row input{padding:6px 8px; border-radius:8px; border:1px solid var(--line,var(--h-2a3550)); background:var(--bg2,var(--h-13192a)); color:inherit; font-size:12.5px;}
.rp-add-row #rpName{flex:1; min-width:180px;}
.rp-add-row .rp-unit{width:90px;} .rp-add-row .rp-cost{width:110px;}
.res-excluded{margin:6px 2px 0; font-size:11.5px; color:var(--muted);}
.res-excluded a{color:var(--h-8fc1f2); cursor:pointer; margin-left:6px;}

/* ── naked accumulator ── */
.naked-panel{flex:0 0 auto; height:170px;}
.naked{flex:1; overflow:auto; padding:6px 10px; min-height:0;}
.nrow{display:flex; align-items:center; gap:8px; padding:8px 6px; border-bottom:1px solid var(--line);}
.nrow:last-child{border-bottom:none;}
.nrow .nmain{flex:1; min-width:0;}
.nrow .ncode{font-weight:600; color:var(--h-e6edf3);}
.nrow .ndesc{font-size:12px; color:var(--faint); margin-top:2px; overflow:hidden; text-overflow:ellipsis;}
.nrow .npop{color:var(--h-e8c878);}
/* перетаскивание + объём-в-строке + разделы */
.grip{flex:none; color:var(--faint); font-size:15px; cursor:grab; user-select:none; line-height:1;}
.nrow.dragging,.secrow.dragging{opacity:.45;}
.nrow.dragover,.secrow.dragover{box-shadow:inset 0 2px 0 var(--accent);}
.nvol{flex:none; display:flex; align-items:center; gap:4px;}
.volin{width:60px; height:26px; padding:0 6px; text-align:right; border:1px solid var(--accent); border-radius:6px;
  background:var(--panel2,var(--h-0f1a30)); color:var(--h-cfe0ff); font-size:12px;}
.volu{font-size:10px; color:var(--faint); min-width:24px;}
.nrowtools{flex:none; display:flex; gap:2px;}
.ninsert,.ndup{background:transparent; border:none; color:var(--faint); cursor:pointer; font-size:14px; padding:2px 5px; border-radius:6px;}
.ninsert:hover,.ndup:hover{background:var(--accentbg,var(--h-16314f)); color:var(--h-bcdcff);}
.secrow{display:flex; align-items:center; gap:7px; padding:7px 8px; margin:2px 0;
  background:var(--accentbg,var(--h-16314f)); border-radius:7px; color:var(--h-bcdcff); font-weight:600; font-size:12.5px;}
.secrow .seclbl{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.secrow.sub{margin-left:18px; opacity:.92;}   /* #65: подраздел — с отступом внутри раздела */
.trow.techpart .tlabel{color:var(--h-bcd3f0); font-style:italic;}   /* #70: «Техническая часть» в дереве */
.techpart-view{padding:6px 2px;}
.techpart-text{margin-top:10px; padding:14px 16px; background:var(--accentbg,var(--h-16314f)); border-radius:8px;
  color:var(--h-dbe9ff); line-height:1.55; font-size:13.5px; white-space:normal;}
.ndel{flex:none; background:transparent; border:none; color:var(--faint); cursor:pointer; font-size:15px;
  padding:2px 6px; border-radius:7px;}
.ndel:hover{background:var(--h-3a1f22); color:var(--h-f87171);}
.naked .empty{color:var(--faint); padding:18px 6px; text-align:center;}
.naked-filter{flex:0 0 auto; display:flex; align-items:center; gap:8px; padding:8px 12px 4px;}
.naked-filter input{flex:1; min-width:0; height:30px; padding:0 10px; font-size:12.5px; border-radius:8px;}
.naked-count{flex:none; font-size:11px; color:var(--faint); white-space:nowrap;}
.naked-badge{display:inline-flex; align-items:center; justify-content:center; min-width:18px; height:18px; padding:0 5px; margin-left:7px; border-radius:9px; background:var(--accent); color:#fff; font-size:11px; font-weight:700; line-height:1; animation:badgeGlow 2.4s ease-in-out infinite;}
@keyframes badgeGlow{0%,100%{box-shadow:0 0 0 0 rgba(59,130,246,0);}50%{box-shadow:0 0 0 4px rgba(59,130,246,.22);}}
.naked-badge.bump{animation:badgeBump .5s ease-out;}   /* one-shot при росте счётчика */
@keyframes badgeBump{0%{transform:scale(.7);box-shadow:0 0 0 0 rgba(59,130,246,.65);}45%{transform:scale(1.32);box-shadow:0 0 0 9px rgba(59,130,246,0);}100%{transform:scale(1);box-shadow:0 0 0 0 rgba(59,130,246,0);}}
@media (prefers-reduced-motion: reduce){.naked-badge,.naked-badge.bump{animation:none;}}
.grid-filter{height:28px; width:160px; margin-left:10px; padding:0 9px; font-size:12px; border-radius:7px;}   /* фильтр в шапке 3-го окна */
.panel-head #gridCount{margin-left:2px;}
.naked-actions{display:flex; gap:8px; align-items:center;}
.naked-actions .btn{flex:1;}
.naked-actions #undoBtn,.naked-actions #clearBtn{flex:1; font-size:12.5px; padding:8px 8px;}
/* компактная красивая кнопка формирования сметы */
.naked-actions #formBtn{
  flex:1.7; font-size:13px; font-weight:600; padding:8px 12px; border:none; border-radius:9px;
  background:linear-gradient(135deg,var(--accent),var(--accent2));
  box-shadow:0 3px 12px rgba(59,130,246,.32); transition:box-shadow .16s, filter .16s, transform .08s;
}
.naked-actions #formBtn:hover:not(:disabled){box-shadow:0 5px 18px rgba(59,130,246,.5); filter:brightness(1.07);}
.naked-actions #formBtn:active:not(:disabled){transform:translateY(1px);}
.naked-actions #formBtn:disabled{opacity:.45; box-shadow:none; filter:grayscale(.3);}

/* ── modal ── */
.modal{position:fixed; inset:0; background:rgba(5,8,12,.7); backdrop-filter:blur(3px); display:flex;
  align-items:center; justify-content:center; z-index:50; padding:30px;}
.modal-card{width:min(1100px,96vw); max-height:90vh; background:var(--panel); border:1px solid var(--line);
  border-radius:var(--radius); box-shadow:var(--shadow); display:flex; flex-direction:column; overflow:hidden;}
.modal-head{display:flex; justify-content:space-between; align-items:center; padding:16px 20px;
  border-bottom:1px solid var(--line);}
.modal-head h2{margin:0; font-size:18px;}
.modal-actions{display:flex; gap:8px; align-items:center;}
.modal-body{overflow:auto; padding:18px 20px;}
/* тех.часть сборника — полный документ АВС в iframe («как в АВС», 13.07) */
.tchdoc-card{width:min(1200px,97vw); height:92vh; display:flex; flex-direction:column;}
.tchdoc-body{flex:1; padding:0; overflow:hidden; background:#fff; border-radius:0 0 12px 12px;}
.tchdoc-frame{width:100%; height:100%; border:0; background:#fff;}
.smeta-work{margin-bottom:16px;}
.smeta-work .swh{font-weight:600; color:var(--h-cfe0ff); margin-bottom:6px; font-size:13.5px;}
.svod-title{font-weight:600; color:var(--h-bcd3f0); margin:16px 0 6px; font-size:13px;}
.smeta-sec{font-weight:700; color:var(--h-dbe9ff); background:var(--accentbg,var(--h-16314f)); border-left:3px solid var(--accent,#2E75B6);
  border-radius:6px; padding:7px 10px; margin:14px 0 8px; font-size:13px;}   /* #107: раздел в форме Минстроя */
.smeta-sec.sub{font-weight:600; font-size:12.5px; margin-left:16px; opacity:.92;}   /* подраздел — с отступом */

::-webkit-scrollbar{width:10px; height:10px;}
::-webkit-scrollbar-thumb{background:var(--h-2a3340); border-radius:8px; border:2px solid var(--panel);}
::-webkit-scrollbar-thumb:hover{background:var(--h-39455a);}

/* ── Замена марки бетона ── */
table.res tr.r-beton td{background:rgba(210,153,34,.06);}             /* generic-бетон чуть подсвечен */
.blink{margin-left:8px; font-size:11.5px; font-weight:600; color:var(--h-9fd0ff); cursor:pointer; white-space:nowrap;}
.blink:hover{color:var(--h-cfe6ff); text-decoration:underline;}
.blink.breset{color:var(--warn);}
.bmark{margin-left:8px; font-size:11px; color:var(--warn); font-weight:600;}
.beton-panel{margin-top:12px; border:1px solid var(--accent-bd); background:var(--panel2);
  border-radius:var(--radius-sm); padding:12px 13px;}
.bph{font-size:13px; color:var(--text); display:flex; align-items:center; gap:8px;}
.bph b{color:var(--h-cfe6ff);}
.bph .bx{margin-left:auto; color:var(--muted); cursor:pointer; font-size:14px; padding:2px 6px;}
.bph .bx:hover{color:var(--text);}
.bsub{font-size:11.5px; color:var(--muted); margin:10px 0 6px;}
.bchips{display:flex; flex-wrap:wrap; gap:6px;}
.bchip{font:inherit; font-size:12px; font-weight:600; color:var(--text); background:var(--panel3);
  border:1px solid var(--line2); border-radius:8px; padding:5px 10px; cursor:pointer;}
.bchip:hover{border-color:var(--accent-bd);}
.bchip.on{background:var(--accent-soft); border-color:var(--accent-bd); color:var(--h-cfe6ff);}
.bsearch{margin-top:10px;}
.blist{margin-top:8px; max-height:240px; overflow-y:auto; border:1px solid var(--line); border-radius:var(--radius-sm);}
.brow2{display:flex; gap:10px; align-items:baseline; padding:7px 10px; cursor:pointer; border-bottom:1px solid var(--line);}
.brow2:last-child{border-bottom:none;}
.brow2:hover{background:var(--accent-soft);}
.brow2 .bcode{color:var(--h-9fd0ff); font-weight:600; font-size:12px; min-width:62px; font-variant-numeric:tabular-nums;}
.brow2 .bnm{color:var(--text); font-size:12.5px; flex:1; min-width:0;}
.brow2 .bun{flex:none; color:var(--muted); font-size:11.5px; white-space:nowrap; min-width:48px; text-align:right;}
.bnone{padding:10px;}
.bmore{font-size:11px; margin-top:6px;}
.nbeton{color:var(--warn);}
/* ввод расхода «по проекту» (нулевая норма — задаёт проект) */
.qin{width:84px; padding:4px 7px; text-align:right; font:inherit; font-variant-numeric:tabular-nums;
  border:1px solid var(--warn); background:rgba(210,153,34,.08); border-radius:6px; color:var(--text);}
.qin::placeholder{color:var(--warn); font-size:11px;}
.qin:focus{border-color:var(--accent-bd); box-shadow:0 0 0 3px var(--accent-soft); outline:none;}
.qin.set{border-color:var(--ok-bd); background:rgba(46,160,67,.08);}
/* role-П (АВС): бейдж «по проекту» — марку/расход задаёт проект (светофор 🟡) */
.pprotag{margin-left:6px; font-size:10px; font-weight:700; letter-spacing:.4px; white-space:nowrap;
  color:#7a5b00; background:#FFE699; border:1px solid rgba(210,153,34,.55); border-radius:6px;
  padding:1px 6px; vertical-align:1px; text-transform:uppercase; cursor:help;}
/* ★ P-040: «по проекту» — только у нерешённого (красный); подсветка «количество из файла» (правило 2); «Удалён» (В8) */
.pprotag.pp-open{color:#fff; background:var(--err); border-color:var(--err);}
.pprotag.pp-file{color:var(--text); background:var(--ok-soft); border-color:var(--ok-bd); text-transform:none;}
.rdel-tag{font-size:10px; font-weight:700; color:var(--err); margin-right:4px; text-decoration:none; white-space:nowrap;}
/* P-043: «вместо: код и имя из норматива» под именем заменённого ресурса; приписка, когда имени нет и в файле */
.r-vmesto{margin-top:2px; font-size:11px; color:var(--muted);}
.r-imya-net{font-size:11px; color:var(--muted); font-style:italic;}
/* ★ P-040, правило 1: полоса нерешённых над сеткой сметы и окно перед выгрузкой */
.ppbar{margin:6px 6px 10px; padding:8px 12px; border-radius:var(--radius-sm); font-size:12.5px; line-height:1.45;}
.ppbar.zapret{background:var(--err-soft); border:1px solid var(--err);}
.ppbar.pred{background:var(--warn-soft); border:1px solid var(--warn);}
.ppbar-h{font-weight:700; margin-bottom:4px;}
.ppbar .pprow{cursor:pointer; padding:2px 4px; border-radius:6px;}
.ppbar .pprow:hover{background:var(--row-hover); text-decoration:underline;}
table.lrvg tr.itg-no td{color:var(--err); font-weight:700;}
.itg-pp{font-weight:400; color:var(--warn); margin-left:6px;}
.ppmodal{position:fixed; inset:0; z-index:9999; background:rgba(5,8,12,.6); display:flex; align-items:center; justify-content:center; padding:16px;}
.ppmodal-box{background:var(--panel); color:var(--text); border-radius:var(--radius); box-shadow:var(--shadow);
  max-width:860px; width:100%; max-height:84vh; display:flex; flex-direction:column; padding:16px 18px; border-top:4px solid var(--err);}
.ppmodal-box.pred{border-top-color:var(--warn);}
.ppmodal-h{font-size:16px; font-weight:700; margin-bottom:4px;}
.ppmodal-sub{color:var(--muted); font-size:13px; margin-bottom:10px;}
.ppmodal-list{overflow:auto; border:1px solid var(--line); border-radius:var(--radius-sm);}
.ppmodal-list table{width:100%; border-collapse:collapse; font-size:12.5px;}
.ppmodal-list th,.ppmodal-list td{padding:5px 8px; border-bottom:1px solid var(--line); text-align:left; vertical-align:top;}
.ppmodal-list td.c{text-align:center;}
.ppmodal-list tr.ppgo{cursor:pointer;}
.ppmodal-list tr.ppgo:hover td{background:var(--row-hover);}
.ppmodal-btns{display:flex; gap:8px; justify-content:flex-end; margin-top:12px;}

/* ═══ ВКЛАДКА «НОРМА»: читалка нормативной базы ═══ */
.norma-layout{grid-template-columns:minmax(0,38fr) minmax(0,62fr);}
.norma-layout .tree-panel .tree{padding:4px 8px 14px;}
.tload{padding:14px 10px; color:var(--faint); font-size:13px;}
.tload.terr{color:var(--h-f3b7b7);}
/* бейдж со счётчиком документов на группе дерева */
.tbadge{flex:none; align-self:center; margin-left:8px; font-size:11px; font-variant-numeric:tabular-nums;
  color:var(--h-9fd0ff); background:var(--accent-soft); border:1px solid var(--accent-bd); border-radius:999px;
  padding:1px 8px; min-width:22px; text-align:center;}
.norma-layout .trow.lvl1{font-size:13.5px;}
.norma-layout .trow.lvl2{font-size:13px;}
.norma-layout .trow.lvl3{font-size:12.5px; color:var(--h-aeb9c8);}

/* читалка */
.reader-panel{min-height:0; height:100%;}
.reader-head{gap:8px;}
#normaReaderTitle{overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.reader-body{flex:1; overflow:auto; padding:0; min-height:0;}
.reader-note{padding:18px 22px; color:var(--muted); font-size:13.5px;}

/* документ — светлый «лист» для читаемости длинных НПА */
.norma-doc{background:#f7f9fc; color:#16202c; margin:0; padding:30px 38px 60px;
  font-family:'PT Serif',Georgia,'Times New Roman',serif; font-size:15px; line-height:1.65;
  min-height:100%;}
.norma-doc h1{font-size:20px; line-height:1.35; margin:0 0 16px; color:#0d1b2e; font-family:'Inter',sans-serif;}
.norma-doc h2,.norma-doc h3{font-family:'Inter',sans-serif; color:#13243a;}
.norma-doc p{margin:.5em 0;}
.norma-doc table{border-collapse:collapse; width:100%; margin:14px 0; font-size:13.5px; background:#fff;}
.norma-doc td,.norma-doc th{border:1px solid #c3cedd; padding:6px 9px; vertical-align:top; text-align:left;
  overflow-wrap:break-word;}
.norma-doc th{background:#e8eef7; font-weight:600;}
.norma-doc tr:nth-child(even) td{background:#fbfcfe;}
.norma-doc a{color:#1d5fb0;}
.norma-doc img{max-width:100%;}

/* вкладка «Инфо» — карточка позиции справочника (ресурсы) */
.info-doc .info-meta{font-family:'Inter',sans-serif; font-size:12.5px; color:#43566b; margin:2px 0 16px;
  padding:9px 13px; background:#eef3f9; border-radius:7px; border-left:3px solid #2E75B6;}
.info-doc h3{font-size:14px; margin:2px 0 10px; color:#2E75B6; font-weight:600;}
.info-doc .info-res .rc{font-family:'JetBrains Mono','SF Mono',monospace; font-size:12px; white-space:nowrap; color:#0d3a6b;}
.info-doc .info-res .ru{white-space:nowrap; color:#54637a;}
.info-doc .info-res .rt{text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; font-weight:600;}
.info-doc .info-note{color:#6a7686; font-style:italic;}

/* список документов раздела */
.doclist{list-style:none; margin:0; padding:8px 14px 20px;}
.doclist-item{display:flex; gap:10px; align-items:baseline; padding:10px 12px; border:1px solid var(--line);
  border-radius:var(--radius-sm); margin-bottom:8px; cursor:pointer; background:var(--panel2); transition:.12s;}
.doclist-item:hover{border-color:var(--accent-bd); background:var(--panel3);}
.dtag{flex:none; font-size:10.5px; color:var(--h-9fd0ff); background:var(--accent-soft); border:1px solid var(--accent-bd);
  border-radius:6px; padding:1px 6px;}

/* результаты поиска */
.searchlist{list-style:none; margin:0; padding:10px 14px 20px;}
.srow{padding:11px 13px; border:1px solid var(--line); border-radius:var(--radius-sm); margin-bottom:9px;
  cursor:pointer; background:var(--panel2); transition:.12s;}
.srow:hover{border-color:var(--accent-bd); background:var(--panel3);}
.srow .stitle{font-weight:600; color:var(--h-cfe0ff); font-size:13.5px; margin-bottom:4px;}
.srow .ssnip{color:var(--muted); font-size:12.5px; line-height:1.5;}
.srow .ssnip mark{background:#ffd84d; color:#1a1400; border-radius:3px; padding:0 2px;}

/* ── СОБСТВЕННЫЙ СМЕТНЫЙ ГРИД (прототип, ЛРВ форма Н5) ── */
.view-toggle{display:inline-flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}
.vt-btn{background:transparent;border:0;color:var(--faint);font:inherit;font-size:12px;padding:3px 10px;cursor:pointer}
.vt-btn.active{background:var(--accent,#2E75B6);color:#fff}
/* ── СМЕТНЫЙ ГРИД — современное тёмное оформление под основной сайт ── */
/* ★ P-030: отступ сверху — у обёртки .lrvg-page, не у окна: иначе липкая шапка колонок встаёт на 16px ниже
   верха окна, и в этой полосе видны проезжающие строки */
.lrvg-host{overflow:auto;background:var(--bg2);color:var(--text);height:100%;padding:0 18px 28px;scroll-behavior:auto}
.lrvg-page{padding-top:16px}
.lrvg-host>.empty-state:first-child{margin-top:16px}
.lrvg-host .empty-state{color:var(--faint)}
.lrvg-titul{font-family:'Inter',system-ui,sans-serif;color:var(--text);text-align:center;position:relative;padding-top:4px;max-width:700px;margin:0 auto 6px}
.lrvg-big{font-size:16px;font-weight:600;margin:6px 0;color:var(--h-cfe0ff);letter-spacing:.2px}
.lrvg-cap{font-size:11px;color:var(--faint);margin:0 0 3px}
.lrvg-und{border-bottom:1px solid var(--line2);min-height:22px;margin:6px 48px 0;padding-bottom:3px}
.lrvg-undl{border-bottom:1px solid var(--line2);text-align:left;min-height:22px;margin-top:8px;padding-bottom:3px}
table.lrvg{border-collapse:separate;border-spacing:0;font-family:'Inter',system-ui,sans-serif;color:var(--text);font-size:12px;table-layout:fixed;margin:12px auto 0;background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden;overflow:clip}
/* ★ P-030: clip, а не hidden — hidden делает таблицу прокручиваемым блоком, и липкая thead липнет к таблице, а не
   к окну (уезжала). Углы clip скругляет так же; браузер без clip берёт hidden — как было */
/* ★ 09.09 (Зульфия, #516168): высота строки тела = высота содержимого. Было по 5px сверху и снизу —
   10px пустоты на 15,6px текста. Горизонтальные 8px не трогаем: от них зависит перенос шифра. */
table.lrvg th,table.lrvg td{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:2px 8px;vertical-align:top;word-wrap:break-word;overflow-wrap:break-word;line-height:1.3}
table.lrvg th:last-child,table.lrvg td:last-child{border-right:0}
/* ★ 09.09 (Зульфия, #516168): графы 2 и 4 стали уже, и заголовки формы («Шифр номера нормативов
   и коды ресурсов», «Единица измерения») перестают влезать словом. Без переноса по слогам браузер
   рубит слово где придётся — «норматив/ов», «Единиц/а/измере/ния». Переносим по-русски. */
table.lrvg thead th{background:var(--panel3);color:var(--h-bcd3f0);text-align:center;vertical-align:middle;font-weight:500;border-bottom:1px solid var(--line2);-webkit-hyphens:auto;hyphens:auto}
table.lrvg tr.hdrn th{font-weight:600;background:var(--panel2);color:var(--muted)}
table.lrvg td.c{text-align:center}
table.lrvg td.l{text-align:left}
table.lrvg td.r{text-align:right;font-variant-numeric:tabular-nums}
table.lrvg tr.work td{font-weight:600;background:rgba(59,130,246,.10);color:var(--h-e8eef7)}
table.lrvg tr.sec td,table.lrvg tr.itg td,table.lrvg tr.svh td{background:var(--accent-soft);font-weight:600;text-align:left;color:var(--h-cfe0ff)}
table.lrvg tr.sost td{font-style:italic;color:var(--muted)}
table.lrvg tr.res.trud td{color:var(--h-bca8ee)}
table.lrvg tr.res.mash td{color:var(--h-5fd4a8)}
table.lrvg tr.res.mat td{color:var(--h-8fb6ec)}
/* заглушка «расценка не найдена в базе» (устаревшая сохранённая смета) — красная, видимая */
table.lrvg tr.errrow td{background:rgba(226,75,74,.12);border-left:3px solid #e24b4a;text-align:left;color:var(--h-f0a8a7);font-weight:600}
table.lrvg tr.errrow:hover td{background:rgba(226,75,74,.18)}
.smeta-sec.err{background:rgba(226,75,74,.12);border-left-color:#e24b4a;color:var(--h-f0a8a7);}
/* C2: строка-коэффициент условий производства работ (янтарь — отличать от синих разделов) */
table.lrvg tr.cond td{background:rgba(230,167,0,.12);border-left:3px solid #e6a700;text-align:left;color:var(--h-f3d68a);font-weight:600}
table.lrvg tr.cond:hover td{background:rgba(230,167,0,.18)}
table.lrvg tr.cond .cond-tag{white-space:nowrap;margin-right:10px}
table.lrvg tr.cond .cond-tag em{font-style:normal;color:#e6a700}
table.lrvg tr.cond .cond-desc{color:var(--muted);font-weight:400;font-size:11.5px}
/* валидатор совмещения условий: >1 основного (MAIN) на общих позициях — жёлтое предупреждение (не блок) */
table.lrvg tr.cond-conflict td{background:rgba(230,167,0,.22);border-left-color:#ffb300}
table.lrvg .cond-warn{color:var(--h-ffcf4d);font-weight:600;margin-left:10px;white-space:nowrap}
/* залипающая шапка + hover + выделение */
table.lrvg thead{position:sticky;top:0;z-index:4}   /* ★ P-030: выше кнопок строк .wktools/.rctl (z-index 3) — они не лезут поверх шапки */
table.lrvg tbody tr:not(.sec):not(.itg):not(.svh):hover td{background:var(--row-hover)}
table.lrvg tbody tr.sel td{background:rgba(59,130,246,.17) !important}
/* инлайн-правка объёма */
table.lrvg td.qty-edit{cursor:pointer}
table.lrvg td.qty-edit:hover{outline:1.5px solid var(--accent-bd);outline-offset:-2px;background:rgba(59,130,246,.10)}
table.lrvg td.qty-edit input.qtyin{width:72px;font:inherit;text-align:center;border:1px solid var(--accent-bd);border-radius:5px;padding:2px 4px;color:var(--text);background:var(--panel2)}
/* исключить/заменить ресурс */
/* действия над ресурсом — плавающая капсула на самой позиции (графа 3, наименование), как тулбар работы */
table.lrvg td.resname{position:relative;}
table.lrvg tr.work>td:first-child, table.lrvg tr.res>td:first-child{white-space:nowrap;}   /* № не переносим */
/* тумблеры группировки +/− (левый = ресурсы, правый = состав) в ячейке № + глобальный в шапке */
table.lrvg tr.work>td.c{padding:3px 2px;}
table.lrvg tr.work>td.c .numn{display:block; line-height:1.1;}
table.lrvg .grp2{display:flex; gap:3px; justify-content:center; margin-top:3px;}
table.lrvg .grp{width:15px; height:15px; padding:0; line-height:1; font-size:12px; font-weight:700;
  display:inline-flex; align-items:center; justify-content:center; border:1px solid var(--line2);
  border-radius:4px; background:var(--panel3); color:var(--muted); cursor:pointer;}
table.lrvg .grp:hover{border-color:var(--accent-bd); color:var(--on-tint); background:var(--accent-soft);}
table.lrvg .grp-res{color:var(--h-6cb6ff);}        /* левый — ресурсы */
table.lrvg .grp-sost{color:var(--h-e8c878);}       /* правый — состав работ */
table.lrvg .hdr .grp-all{margin-left:5px; vertical-align:middle; color:var(--h-6cb6ff);}
table.lrvg .rctl{
  display:none; position:absolute; top:6px; right:6px;
  gap:3px; z-index:3; padding:2px 3px; border-radius:8px;
  background:var(--float-bg); border:1px solid var(--line2);
  box-shadow:0 4px 12px rgba(0,0,0,.4); -webkit-backdrop-filter:blur(4px); backdrop-filter:blur(4px);
}
table.lrvg tr.res:hover .rctl{display:inline-flex; animation:wktoolsIn .15s ease-out;}
table.lrvg .rctl button{
  --pulse:rgba(120,170,255,.5);
  display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:22px; padding:0; font-size:11px; line-height:1; cursor:pointer;
  border:1px solid transparent; border-radius:6px; background:transparent; color:var(--muted);
  transition:background .14s, color .14s, border-color .14s;
}
table.lrvg .rctl button:hover{color:var(--on-tint); animation:wkpulse 1.2s ease-out infinite;}
table.lrvg .rctl .rx{--pulse:rgba(224,75,74,.55); color:var(--h-f08a8a);}
table.lrvg .rctl .rx:hover{background:rgba(224,75,74,.2); border-color:var(--h-7a2f2f);}
table.lrvg .rctl .rsw{--pulse:rgba(59,130,246,.55); color:var(--h-6cb6ff);}
table.lrvg .rctl .rsw:hover{background:rgba(59,130,246,.22); border-color:var(--accent-bd);}
table.lrvg .rctl .rrev{--pulse:rgba(59,130,246,.55); color:var(--h-7fb3ff); font-weight:700;}
table.lrvg .rctl .rrev:hover{background:rgba(59,130,246,.22); border-color:var(--accent-bd);}
table.lrvg tr.editline td{background:var(--warn-soft);font-size:11px;color:var(--h-d8c08a);font-style:italic;padding:2px 8px}
table.lrvg tr.editline a.undoedit{color:var(--h-7fb3ff);cursor:pointer;text-decoration:underline;font-style:normal}
/* структура: перенос/вставка/удаление */
table.lrvg td.wkname{position:relative}
/* лёгкая подсветка активной строки — видно, какую работу правишь */
table.lrvg tr.work:hover > td{background:rgba(59,130,246,.07);}
table.lrvg tr.work:hover > td.l.wkname{box-shadow:inset 3px 0 0 var(--accent);}
/* плавающая капсула тулбара: появляется на hover строки, blur+тень, чтобы читалась поверх текста */
table.lrvg .wktools{
  display:none; position:absolute; top:6px; right:6px;
  gap:3px; z-index:3; padding:3px 4px; border-radius:10px;
  background:var(--float-bg); border:1px solid var(--line2);
  box-shadow:0 6px 18px rgba(0,0,0,.45); -webkit-backdrop-filter:blur(5px); backdrop-filter:blur(5px);
}
table.lrvg tr.work:hover .wktools,table.lrvg tr.sec:hover .wktools,table.lrvg tr.cond:hover .wktools{display:inline-flex; animation:wktoolsIn .16s ease-out;}
@keyframes wktoolsIn{from{opacity:0;transform:translateX(7px);}to{opacity:1;transform:translateX(0);}}
/* кнопки крупнее и читаемее; цвет пульса задаётся на каждую через --pulse */
table.lrvg .wktools button{
  --pulse:rgba(120,170,255,.5);
  display:inline-flex; align-items:center; justify-content:center;
  width:26px; height:26px; padding:0; font-size:13px; line-height:1; cursor:pointer;
  border:1px solid transparent; border-radius:8px; background:transparent; color:var(--muted);
  transition:background .14s, color .14s, border-color .14s;
}
table.lrvg .wktools button:hover{color:var(--on-tint); animation:wkpulse 1.2s ease-out infinite;}
/* мягкое расходящееся свечение в цвет кнопки */
@keyframes wkpulse{0%{box-shadow:0 0 0 0 var(--pulse);}70%{box-shadow:0 0 0 7px transparent;}100%{box-shadow:0 0 0 0 transparent;}}
/* цветовое кодирование по функции */
table.lrvg .wktools .wkdup{--pulse:rgba(59,130,246,.55); color:var(--h-6cb6ff);}
table.lrvg .wktools .wkdup:hover{background:rgba(59,130,246,.22); border-color:var(--accent-bd);}
table.lrvg .wktools .wkpopr{--pulse:rgba(150,120,235,.55); color:var(--h-bca8ee); font-weight:600;}
table.lrvg .wktools .wkpopr:hover{background:rgba(150,120,235,.22); border-color:#6f5bd0;}
table.lrvg .wktools .wkswap{--pulse:rgba(245,158,11,.5); color:var(--h-f5b342);}   /* ★ 02.09 п.5: заменить расценку */
table.lrvg .wktools .wkswap:hover{background:rgba(245,158,11,.2); border-color:#b7791f;}
.replace-banner{margin-bottom:8px;}
.replace-banner a{color:inherit; text-decoration:underline; margin-left:6px;}
table.lrvg .wktools .wkup:hover,table.lrvg .wktools .wkdn:hover{background:var(--panel2); border-color:var(--accent-bd);}
table.lrvg .wktools .wkins{--pulse:rgba(46,160,67,.5); color:var(--h-74d99f);}
table.lrvg .wktools .wkins:hover{background:rgba(46,160,67,.2); border-color:var(--ok-bd);}
table.lrvg .wktools .wkdel{--pulse:rgba(224,75,74,.55); color:var(--h-f08a8a);}
table.lrvg .wktools .wkdel:hover{background:rgba(224,75,74,.2); border-color:var(--h-7a2f2f);}
@media (prefers-reduced-motion: reduce){
  table.lrvg .wktools{animation:none !important;}
  table.lrvg .wktools button:hover{animation:none;}
}
/* поправки техчасти (поп-ап) */
.popr-list{display:flex;flex-direction:column;gap:6px;max-height:52vh;overflow:auto}
.popr-list .pop{display:flex;gap:9px;align-items:flex-start;padding:8px 10px;border:1px solid var(--line2);border-radius:8px;cursor:pointer;font-size:13px}
.popr-list .pop:hover{border-color:var(--accent-bd);background:var(--panel2)}
.popr-list .pop input{width:auto;margin-top:2px}
.popr-list .pop b{color:var(--h-cfe0ff)}
/* ── модалка поправок техчасти: карточки с пульс-глоу, явное отмечено/нет ── */
.modal-card.popr-card{width:min(620px,96vw);}
#poprBody{padding:16px 18px;}
.popr-grid{display:flex;flex-direction:column;gap:10px;max-height:60vh;overflow:auto;padding:2px;}
.popr-card-item{
  --pulse:rgba(59,130,246,.5);
  display:flex;gap:13px;align-items:flex-start;padding:12px 14px;cursor:pointer;
  border:1px solid var(--line2);border-radius:12px;background:var(--panel2);outline:none;
  transition:border-color .15s,background .15s,transform .07s;
}
.popr-card-item:hover{border-color:var(--accent-bd);background:var(--panel3);animation:wkpulse 1.3s ease-out infinite;}
.popr-card-item:focus-visible{border-color:var(--accent-bd);}
.popr-card-item:active{transform:scale(.994);}
.popr-card-item.on{border-color:var(--accent-bd);background:rgba(59,130,246,.1);animation:poprBreath 2.6s ease-in-out infinite;}
@keyframes poprBreath{0%,100%{box-shadow:0 0 0 1px var(--accent-bd),0 0 10px -3px var(--accent-soft);}50%{box-shadow:0 0 0 1px var(--accent-bd),0 0 16px 0 rgba(59,130,246,.3);}}
.popr-toggle{
  flex:none;width:24px;height:24px;margin-top:1px;border-radius:7px;border:1.5px solid var(--line2);
  display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:800;color:transparent;
  transition:background .15s,border-color .15s,color .15s,box-shadow .15s;
}
.popr-card-item.on .popr-toggle{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:0 0 12px rgba(59,130,246,.55);}
.popr-main{flex:1;min-width:0;}
.popr-h{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;}
.popr-pt{flex:none;color:var(--accent);font-weight:700;font-size:13px;}
.popr-usl{font-size:13px;line-height:1.45;color:var(--text);}
.popr-card-item:not(.on) .popr-usl{color:var(--muted);}
.popr-chips{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;}
.popr-chips .chip{font-size:11px;padding:2px 8px;border-radius:6px;border:1px solid var(--line2);background:var(--panel);color:var(--muted);white-space:nowrap;}
.popr-chips .chip-trud{color:var(--h-e8c878);border-color:rgba(232,200,120,.32);}
.popr-chips .chip-mash{color:var(--h-7fb3ff);border-color:rgba(59,130,246,.32);}
.popr-chips .chip-ex{color:var(--h-f08a8a);border-color:rgba(224,75,74,.32);}
.popr-chips .chip-pt{color:var(--h-6cb6ff);border-color:var(--accent-bd);}
.popr-foot{display:flex;justify-content:space-between;align-items:center;margin-top:14px;padding-top:12px;border-top:1px solid var(--line);}
.popr-applied{font-size:13px;color:var(--muted);}
.popr-applied b{color:var(--accent);font-size:15px;}
.popr-empty{padding:34px 20px;text-align:center;color:var(--muted);font-size:14px;line-height:1.5;}
@media (prefers-reduced-motion: reduce){
  .popr-card-item:hover,.popr-card-item.on{animation:none;}
}
/* ── тулбар окна «Смета»: пульсирующие кнопки с цветными иконками ── */
.smeta-tools{ display:flex; align-items:center; gap:7px; }
.smeta-tools .btn{
  --pulse:rgba(59,130,246,.5);
  position:relative; width:34px; height:32px; padding:0; font-size:15px; border-radius:9px;
  display:inline-flex; align-items:center; justify-content:center;
  border:1px solid var(--line2); background:var(--panel2); color:var(--text);
  transition:border-color .14s, background .14s, transform .08s, filter .14s;
}
.smeta-tools .btn:hover:not(:disabled){ animation:wkpulse 1.15s ease-out infinite; border-color:currentColor; background:var(--panel3); }
.smeta-tools .btn:active:not(:disabled){ transform:translateY(1px); }
.smeta-tools .btn:disabled{ opacity:.4; }
.smeta-tools .grid-filter{ flex:1 1 auto; min-width:110px; }   /* тянется от кнопок до правой группы */
/* красивая подсказка-наименование при наведении */
.smeta-tools .btn::after{
  content:attr(data-tip); position:absolute; top:calc(100% + 9px); left:50%;
  transform:translateX(-50%) translateY(-5px) scale(.96); transform-origin:top center;
  background:var(--tip-bg); color:var(--h-e6edf3); border:1px solid var(--line2);
  padding:5px 10px; border-radius:8px; font-size:11.5px; font-weight:600; white-space:nowrap;
  box-shadow:0 8px 20px rgba(0,0,0,.45); opacity:0; pointer-events:none; z-index:30;
  transition:opacity .16s ease, transform .16s ease;
}
.smeta-tools .btn::before{
  content:""; position:absolute; top:calc(100% + 4px); left:50%; transform:translateX(-50%);
  border:5px solid transparent; border-bottom-color:var(--line2);
  opacity:0; pointer-events:none; z-index:30; transition:opacity .16s ease;
}
.smeta-tools .btn:hover::after{ opacity:1; transform:translateX(-50%) translateY(0) scale(1); }
.smeta-tools .btn:hover::before{ opacity:1; }
/* цвет по функции: иконка · цвет пульса/рамки · подсказка */
.smeta-tools .tb-sec{ --pulse:rgba(108,182,255,.5); color:var(--h-bcd6ff); }
.smeta-tools .tb-save{ --pulse:rgba(46,160,67,.55); color:var(--h-7ee0a3); }
.smeta-tools .tb-open{ --pulse:rgba(120,170,255,.5); color:var(--h-9ec5ff); }
.smeta-tools .tb-undo{ --pulse:rgba(232,200,120,.5); color:var(--h-eccf86); }
.smeta-tools .tb-clear{ --pulse:rgba(224,75,74,.55); color:var(--h-f29a9a); }
.smeta-tools .tb-dl{ --pulse:rgba(46,160,67,.6); color:#fff; background:linear-gradient(135deg,#2ea043,#2e8b57); border-color:#2ea043; }
/* заглушки-слоты под будущие функции */
.smeta-tools .tb-stub{ --pulse:rgba(147,161,179,.4); color:var(--faint); border-style:dashed; font-size:12px; font-weight:700; background:transparent; }
.smeta-tools .tb-stub:hover:not(:disabled){ color:var(--muted); }
/* крайние кнопки: подсказка всплывает ВНУТРЬ панели, чтобы не обрезалась о край */
.smeta-tools .tb-sec::after{ left:0; right:auto; transform:translateX(0) translateY(-5px) scale(.96); transform-origin:top left; }
.smeta-tools .tb-sec:hover::after{ transform:translateX(0) translateY(0) scale(1); }
.smeta-tools .tb-sec::before{ left:11px; }
.smeta-tools .tb-dl::after,.smeta-tools .tb-save::after,.smeta-tools .tb-open::after{ left:auto; right:0; transform:translateX(0) translateY(-5px) scale(.96); transform-origin:top right; }
.smeta-tools .tb-dl:hover::after,.smeta-tools .tb-save:hover::after,.smeta-tools .tb-open:hover::after{ transform:translateX(0) translateY(0) scale(1); }
.smeta-tools .tb-dl::before,.smeta-tools .tb-save::before,.smeta-tools .tb-open::before{ left:auto; right:11px; }
/* ── окно «Мои сметы»: карточки сохранённых ── */
.smeta-list{display:flex; flex-direction:column; gap:10px; max-height:58vh; overflow:auto; margin-top:12px; padding:2px;}
.smeta-card{display:flex; align-items:center; gap:12px; padding:12px 14px; border:1px solid var(--line2); border-radius:12px; background:var(--panel2); transition:border-color .14s, background .14s;}
.smeta-card:hover{border-color:var(--accent-bd); background:var(--panel3);}
.smeta-card .sc-main{flex:1; min-width:0;}
.smeta-card .sc-h{font-size:14px; color:var(--text); display:flex; gap:8px; align-items:baseline; flex-wrap:wrap;}
.smeta-card .sc-n{color:var(--accent); font-weight:700; flex:none;}
.smeta-card .sc-meta{font-size:12px; color:var(--muted); margin-top:5px;}
.smeta-card .sc-tools{flex:none; display:flex; gap:8px; align-items:center;}
.smeta-card .sc-del{background:transparent; border:1px solid transparent; color:var(--h-f08a8a); cursor:pointer; font-size:15px; border-radius:7px; padding:4px 8px;}
.smeta-card .sc-del:hover{background:rgba(224,75,74,.18); border-color:var(--h-7a2f2f);}
/* редактируемые поля титула */
.lrvg-titul .te{display:inline-block;min-width:140px;outline:none;cursor:text;color:var(--h-cfe0ff);font-weight:500;padding:1px 6px;border-radius:6px}
.lrvg-titul .te:hover{background:var(--accent-soft)}
.lrvg-titul .te:focus{background:var(--accent-soft);box-shadow:inset 0 -1.5px 0 var(--accent)}
.lrvg-titul .te:empty::before{content:attr(data-ph);color:var(--faint);font-weight:400;font-style:italic}
.lrvg-titul .te[data-f="номер"]{min-width:56px;text-align:left}
/* применённая поправка техчасти под наименованием работы */
table.lrvg .wpopr{font-size:10.5px;font-style:italic;color:var(--h-bca8ee);margin-top:4px;font-weight:400;line-height:1.35}
table.lrvg .wpopr .ic{color:var(--h-bca8ee);font-weight:600;margin-right:3px;font-style:normal}

/* ════════════ ПАЙПЛАЙН: вкладки «Проект» и «ВОР» ════════════ */

/* ── Проект: лендинг пайплайна ── */
.project-layout{grid-template-columns:minmax(0,1fr);}
.project-panel .project-body{padding:26px; overflow:auto;}
.proj-card{max-width:760px; margin:0 auto; background:var(--panel2); border:1px solid var(--line);
  border-radius:var(--radius); padding:22px 24px;}
.proj-card-head{display:flex; align-items:center; gap:12px; margin-bottom:6px;}
.proj-name{flex:1; background:var(--bg2); border:1px solid var(--line2); border-radius:var(--radius-sm);
  color:var(--text); font:inherit; font-size:16px; font-weight:600; padding:9px 12px;}
.proj-name::placeholder{color:var(--faint); font-weight:400;}
.proj-status{font-size:11px; color:var(--muted); background:var(--panel3); border:1px solid var(--line);
  padding:4px 10px; border-radius:20px; white-space:nowrap;}
.proj-hint{color:var(--muted); font-size:13px; line-height:1.5; margin:10px 0 20px;}
.pipeline-steps{display:flex; align-items:stretch; gap:8px; flex-wrap:wrap;}
.pstep{flex:1; min-width:160px; text-align:left; background:var(--bg2); border:1px solid var(--line2);
  border-radius:var(--radius-sm); padding:14px; cursor:pointer; transition:.15s; display:flex;
  flex-direction:column; gap:4px; color:var(--text);}
.pstep:hover{border-color:var(--accent-bd); background:var(--accent-soft);}
.pstep-n{width:24px; height:24px; border-radius:50%; background:var(--accent); color:#fff; font-size:12px;
  font-weight:700; display:flex; align-items:center; justify-content:center;}
.pstep-t{font-weight:600; font-size:14px;}
.pstep-d{color:var(--muted); font-size:11.5px; line-height:1.35;}
.pstep-arrow{align-self:center; color:var(--faint); font-size:18px;}
.proj-cta{margin-top:22px;}

/* ── ВОР: загрузка + результат ── */
/* 26.07: левая панель загрузки снята — вкладка ВОР стала одноколоночной, таблица получила
   назад ~400px, из-за которых столбец «Примечания» уходил за правый край на этапе 3. */
.vor-layout{grid-template-columns:minmax(0,1fr);}
.vor-ctx{display:inline-flex; gap:14px; align-items:center; margin-left:14px; flex-wrap:wrap;}
.vd-inl{display:inline-flex; gap:6px; align-items:baseline; font-size:12px;}
.vd-l{color:var(--muted);}
.vd-inl .ce{min-width:52px; display:inline-block; border-bottom:1px dashed var(--line); padding:0 2px;}
.vd-inl .ce:empty::before{content:"—"; color:var(--muted);}
.vor-back{margin-left:auto; font-size:12px; white-space:nowrap; flex-shrink:0; align-self:center;}
/* необязательная ось карточки: спокойный вид, без ⚠ — пустое значение здесь законно */
.obj-chip-opt{opacity:.55; border-style:dashed;}
.vor-state-inline{margin-left:12px; font-size:12px;}
/* Индикатор состояния ИИ в шапке ВОР-панели (пункт 1, 26.07): НЕ выключатель — только статус.
   ИИ работает на этапе 1 (очистка) и 2 (дисциплина); подбор расценки детерминирован всегда. */
.vor-ai-state{display:inline-flex; align-items:center; gap:5px; font-size:12px; padding:2px 9px;
  border-radius:11px; white-space:nowrap; cursor:default; border:1px solid transparent;}
.vor-ai-state.ai-on{color:var(--h-5fb35f); background:rgba(95,179,95,.10); border-color:rgba(95,179,95,.32);}
.vor-ai-state.ai-off{color:var(--h-c9a15a); background:rgba(201,161,90,.10); border-color:rgba(201,161,90,.30);}
.vor-ai-state.ai-wait{color:var(--muted); border-color:var(--line);}
.vor-up-panel .vor-up-body{padding:18px; display:flex; flex-direction:column; gap:14px; overflow:auto;}
.vor-drop{display:flex; flex-direction:column; align-items:center; justify-content:center; gap:6px;
  border:1.5px dashed var(--line2); border-radius:var(--radius); padding:34px 18px; cursor:pointer;
  text-align:center; transition:.15s; background:var(--bg2);}
.vor-drop:hover,.vor-drop.drag{border-color:var(--accent-bd); background:var(--accent-soft);}
.vor-drop-ic{font-size:30px; color:var(--accent);}
.vor-drop-t{font-weight:600; font-size:14px;}
.vor-drop-d{color:var(--muted); font-size:12px;}
.vor-meta{display:flex; align-items:center; gap:8px; background:var(--panel2); border:1px solid var(--line);
  border-radius:var(--radius-sm); padding:10px 12px; font-size:13px;}
.vor-meta .vm-ic{color:var(--accent);} .vor-meta .vm-name{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.vor-meta .vm-size{color:var(--muted); font-size:11.5px; white-space:nowrap;}
.vor-state{font-size:12.5px; color:var(--muted); min-height:18px;}
.vor-state .vor-err{color:var(--h-f08a8a);}
.vor-spin{display:inline-block; width:12px; height:12px; border:2px solid var(--line2);
  border-top-color:var(--accent); border-radius:50%; animation:vspin .7s linear infinite; vertical-align:middle; margin-right:6px;}
@keyframes vspin{to{transform:rotate(360deg);}}

/* ★ 27.07 (замечание Отабека): пока идёт ИИ-операция, оператор не понимал, идёт ли она — прогноз
   времени висел мелкой строкой у соседней кнопки. Люди жали повторно и ЖГЛИ ТОКЕНЫ. Теперь —
   модалка с затемнением: видно, что процесс идёт, и повторно нажать физически нельзя. */
.busy-veil{position:fixed; inset:0; z-index:2000; background:rgba(4,8,16,.72);
  display:flex; align-items:center; justify-content:center; backdrop-filter:blur(2px);}
.busy-card{background:var(--panel); border:1px solid var(--line2); border-radius:14px;
  padding:26px 30px; min-width:330px; max-width:min(90vw,460px); text-align:center;
  box-shadow:0 24px 64px rgba(0,0,0,.6);}
.busy-ic{font-size:30px; line-height:1; margin-bottom:12px;}
.busy-t{font-size:14.5px; font-weight:600; color:var(--fg); margin-bottom:6px;}
.busy-s{font-size:12.5px; color:var(--muted); margin-bottom:16px; line-height:1.45;}
.busy-bar{height:6px; border-radius:4px; background:var(--line2); overflow:hidden;}
.busy-bar i{display:block; height:100%; width:36%; border-radius:4px; background:var(--accent);
  animation:busyslide 1.25s ease-in-out infinite;}
@keyframes busyslide{0%{margin-left:-36%}100%{margin-left:100%}}
.busy-note{margin-top:12px; font-size:11.5px; color:var(--muted);}

.vor-res-panel .vor-result{padding:0; overflow:auto; height:100%;}
.vor-doc{padding:14px 16px; border-bottom:1px solid var(--line); display:flex; flex-direction:column; gap:6px;}
.vd-row{display:flex; gap:10px; font-size:12.5px; line-height:1.4;}
.vd-row span{color:var(--muted); min-width:64px; flex-shrink:0;}
.vd-row b{color:var(--text); font-weight:500;}
.vor-flags{display:flex; gap:8px; padding:10px 16px; border-bottom:1px solid var(--line); flex-wrap:wrap;}
.vf{font-size:11.5px; padding:3px 9px; border-radius:20px; border:1px solid var(--line2); color:var(--muted);}
.vf-red{color:var(--h-f08a8a); border-color:rgba(224,75,74,.4); background:rgba(224,75,74,.1);}
.vf-yel{color:var(--h-eccf86); border-color:rgba(210,153,34,.4); background:var(--warn-soft);}
.vf-eng{color:var(--h-9ec5ff); border-color:var(--accent-bd); background:var(--accent-soft);}
.vor-table-wrap{overflow:auto;}
table.vor-table{width:100%; border-collapse:collapse; font-size:12.5px;}
table.vor-table th{position:sticky; top:0; background:var(--panel2); color:var(--muted); font-weight:600;
  text-align:left; padding:8px 10px; border-bottom:1px solid var(--line2); white-space:nowrap;}
table.vor-table td{padding:8px 10px; border-bottom:1px solid var(--line); vertical-align:top;}
table.vor-table tr:hover td{background:var(--panel2);}
.vc-n,.vc-pos{color:var(--faint); text-align:center; white-space:nowrap;}
.vc-name{line-height:1.4;}
.vc-unit{text-align:center; color:var(--muted); white-space:nowrap;}
.vc-qty{text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap;}
.vq-miss{color:var(--h-eccf86);}
tr.vr-warn td{background:var(--warn-soft);}
.vor-empty{text-align:center; color:var(--faint); padding:24px;}
.vor-foot{display:flex; align-items:center; gap:12px; padding:14px 16px; border-top:1px solid var(--line);}
.vor-foot-note{color:var(--faint); font-size:11.5px;}

/* ── Редактируемый грид ВОР ── */
.vor-doc .ce, .vor-grid .ce{outline:none; border-radius:4px; padding:1px 3px;}
.vor-doc .ce:focus, .vor-grid .ce:focus{background:var(--accent-soft); box-shadow:0 0 0 1px var(--accent-bd);}
.vorg-tools{display:flex; align-items:center; gap:8px; padding:9px 14px; border-bottom:1px solid var(--line);
  flex-wrap:wrap; background:var(--panel2);}
.vorg-tools .btn{font-size:12px; padding:5px 10px;}
.vorg-flex{flex:1;}
.vorg-disc{font-size:12px; color:var(--muted); display:flex; align-items:center; gap:6px;}
.vorg-disc select, .vor-grid .vg-type{background:var(--panel); color:var(--text); border:1px solid var(--line2);
  border-radius:6px; padding:3px 6px; font-size:12px; font-family:inherit;}
.vor-grid .vg-type{width:100%;}
.vorg-wrap{overflow:auto;}
.vor-grid td{vertical-align:middle;}
.vor-grid .vc-type{width:96px;} .vor-grid .vc-act{width:74px; white-space:nowrap; text-align:center;}
.vor-grid .vc-map{min-width:240px;}
.vor-grid tr.vg-row:hover td{background:var(--panel2);}
.vor-grid tr.vg-drag{opacity:.45;}
.vor-grid .vg-up,.vor-grid .vg-dn,.vor-grid .vg-x{background:none; border:0; color:var(--faint); cursor:pointer;
  font-size:12px; padding:2px 4px; border-radius:4px;}
.vor-grid .vg-up:hover,.vor-grid .vg-dn:hover{color:var(--text); background:var(--line);}
.vor-grid .vg-x:hover{color:var(--h-f08a8a); background:rgba(224,75,74,.12);}
/* раздел */
.vor-grid tr.vg-sec td{background:var(--accent-soft); border-top:1px solid var(--accent-bd);}
.vor-grid .vc-sec{font-weight:600; color:var(--h-9ec5ff);}
/* сворачиваемая группировка по разделам/подразделам */
.vor-grid tr.vg-sec.vg-sec-l1 td{background:rgba(158,197,255,.06);}      /* подраздел — фон бледнее */
.vor-grid tr.vg-sec.vg-sec-l1 .vc-sec{font-weight:500; padding-left:20px; color:var(--h-bcd6ff);}
.vg-tog{background:none; border:none; color:var(--h-9ec5ff); cursor:pointer; font-size:12px; line-height:1; padding:2px 4px; border-radius:4px;}
.vg-tog:hover{background:rgba(158,197,255,.16);}
.vg-cnt{margin-left:9px; font-size:11px; font-weight:500; color:var(--faint); background:var(--chip-soft); border-radius:9px; padding:1px 8px;}
.vor-grid tr.vg-sec.vg-collapsed .vc-sec{opacity:.85;}
/* мэппинг */
.vg-map-none{color:var(--faint);}
.vg-map-gap{color:var(--h-eccf86); font-size:11.5px;}
.vg-mapbtn{display:flex; align-items:center; gap:6px; width:100%; background:none; border:1px solid transparent;
  border-radius:6px; padding:3px 6px; cursor:pointer; color:var(--text); text-align:left; font:inherit; font-size:11.5px;}
.vg-mapbtn:hover{border-color:var(--line2); background:var(--panel2);}
.vg-dot{width:8px; height:8px; border-radius:50%; flex-shrink:0;}
.vg-ok{background:#5fbf7f;} .vg-mid{background:#eccf86;} .vg-low{background:#f08a8a;}
.vg-map-sb{color:var(--muted); white-space:nowrap;}
.vg-map-vid{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.vg-map-shifr{color:var(--h-9ec5ff); font-variant-numeric:tabular-nums; white-space:nowrap;}
.vg-map-car{color:var(--faint);}
/* ★ №6 (28.07): строка без расценки — не тупик, а кнопка подбора только для неё */
.vg-matchone{background:none; border:1px dashed var(--line2); border-radius:6px; padding:2px 8px;
  cursor:pointer; color:var(--muted); font:inherit; font-size:11.5px; white-space:nowrap;}
.vg-matchone:hover{border-style:solid; border-color:var(--h-9ec5ff); color:var(--h-9ec5ff);}
/* выбор оператора — общий прогон такие строки не трогает */
.vg-mapop{border-color:var(--h-5fbf7f);}
.vg-opmark{font-size:10px; flex-shrink:0;}
/* ★ №7 (28.07): дерево ШНК прямо из карточки позиции — когда верной нормы нет в списке */
.pm-tree-row{display:flex; align-items:center; gap:10px; margin-top:8px; flex-wrap:wrap;}
.pm-tree-btn{white-space:nowrap;}
.pm-op{color:var(--h-5fbf7f);}
.pm-warn{color:var(--h-eccf86);}
.tw-card{max-width:900px; width:92vw; max-height:86vh; display:flex; flex-direction:column;}
.tw-for{margin:0 0 8px 0;}
.tw-q{width:100%; margin-bottom:8px;}
.tw-list{overflow:auto; flex:1; min-height:220px; border:1px solid var(--line2); border-radius:8px; padding:6px;}
.tw-h{cursor:pointer; padding:4px 6px; border-radius:6px; font-size:12.5px; color:var(--text);}
.tw-h:hover{background:var(--panel2);}
.tw-h.on{color:var(--h-9ec5ff);}
.tw-car{display:inline-block; width:14px; color:var(--faint);}
.tw-ch{margin-left:14px; border-left:1px solid var(--line2); padding-left:8px;}
.tw-leaf,.tw-pos{display:flex; gap:8px; align-items:baseline; cursor:pointer; padding:4px 6px; border-radius:6px; font-size:12px;}
.tw-leaf:hover,.tw-pos:hover{background:var(--panel2);}
.tw-code{color:var(--h-9ec5ff); font-variant-numeric:tabular-nums; white-space:nowrap; flex-shrink:0;}
.tw-nm{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.tw-izm{color:var(--muted); white-space:nowrap; flex-shrink:0;}
.tw-back{cursor:pointer; color:var(--h-9ec5ff); font-size:12.5px; margin-bottom:6px;}
/* ★ №11 ч.2 (28.07): видимое состояние автосохранения — работа уже на сервере или ещё нет */
.vor-auto{margin-left:10px; font-size:11.5px; color:var(--muted);}
.vor-auto.ok{color:var(--h-5fbf7f);}
.vor-auto.err{color:var(--h-f08a8a);}
.tw-tbl{font-size:12.5px; margin-bottom:8px; color:var(--text);}
/* раскрытые кандидаты */
/* .vg-candrow — мёртвое правило после перевода списка кандидатов во всплывашку (29.07) */
.vg-cand{display:flex; align-items:center; gap:8px; padding:4px 6px; border-radius:6px; cursor:pointer; font-size:11.5px;}
.vg-cand:hover{background:var(--line);}
.vg-cand.sel{background:var(--accent-soft);}
.vg-cand-pick{color:var(--accent); width:12px;}
.vg-cand-sb{color:var(--muted); white-space:nowrap;}
/* ★ 26.07: кандидат — две строки. Первая: шифр + ПОЛНОЕ имя варианта (не обрезаем и не
   прячем в многоточие — различитель часто в самом хвосте, «…толщиной 20 мм» против «…30 мм»).
   Вторая: сборник и вид работ мельче — они у всех вариантов одной таблицы одинаковые и как
   различитель бесполезны, но как контекст нужны. */
.vg-cand{align-items:flex-start;}
.vg-cand-body{flex:1; min-width:0;}
.vg-cand-l1{display:flex; gap:8px; align-items:baseline; flex-wrap:wrap;}
.vg-cand-nm{white-space:normal; overflow-wrap:break-word; line-height:1.35;}
.vg-cand-l2{color:var(--muted); font-size:10.5px; margin-top:2px;}
.vg-cand-nocode{color:var(--h-e0b86a); white-space:nowrap;}
.vg-cand-noname{color:var(--faint);}
.vg-cand-vid{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.vg-cand-shifr{color:var(--h-9ec5ff); font-variant-numeric:tabular-nums;}
.vg-cand-sc{color:var(--faint); font-variant-numeric:tabular-nums;}
/* ★ 29.07 (Отабек: «мизерная невзрачная кнопка в дерево»). Это единственный выход к остальным
   нормам таблицы — она не должна выглядеть служебной подписью. */
.vg-cand-tree{background:var(--accent-soft); border:1px solid var(--accent-bd); color:var(--h-9ec5ff);
  border-radius:6px; padding:5px 10px; font-size:11.5px; font-weight:600; cursor:pointer;
  white-space:nowrap; align-self:center;}
.vg-cand-tree:hover{background:rgba(59,130,246,.3); color:var(--on-tint); border-color:var(--accent);}
/* текущая норма в списке таблицы — видно, что именно меняешь */
.tw-pos.tw-cur{background:var(--accent-soft); border-left:2px solid var(--accent);}
.tw-curtag{margin-left:8px; font-size:10px; font-weight:700; letter-spacing:.3px;
  color:var(--h-9ec5ff); background:rgba(59,130,246,.2); border-radius:5px; padding:1px 6px; white-space:nowrap;}
.vor-grid .vc-norm{min-width:160px; max-width:240px;}
.vg-norm{color:var(--h-8fd19e); font-size:11.5px; line-height:1.35;}
.vg-disc{display:inline-block; font-size:10px; color:var(--h-9ec5ff); background:var(--accent-soft);
  border:1px solid var(--accent-bd); border-radius:4px; padding:0 5px; vertical-align:middle;}
/* светофор уверенности строки (§8): полоса слева */
.vor-grid tr.vg-l-red td.vc-n{box-shadow:inset 3px 0 0 #e04b4a;}
.vor-grid tr.vg-l-yel td.vc-n{box-shadow:inset 3px 0 0 #d29922;}
.vor-grid tr.vg-l-grn td.vc-n{box-shadow:inset 3px 0 0 #3fb950;}
.vg-pg{display:block; font-size:9.5px; color:var(--faint); font-weight:400; margin-top:1px;}
/* иерархия: отступ под-строк (детали/материалы под работой) */
.vor-grid td.vg-sub{padding-left:22px;} .vor-grid td.vg-sub .ce{color:var(--muted);}
.vg-note{font-size:10.5px; color:var(--h-eccf86); margin-top:2px; line-height:1.3;}   /* примечание (формула ×N) */
/* §8: центрирование служебных колонок; ширина грида с гориз-скроллом */
.vor-grid th.vc-type,.vor-grid td.vc-type,.vor-grid th.vc-qty,.vor-grid td.vc-qty,
.vor-grid th.vc-unit,.vor-grid td.vc-unit,.vor-grid th.vc-pos,.vor-grid td.vc-pos{text-align:center;}

/* ★★ 29.07 (Отабек). Три правки шапки и колонок грида.
   1) Наименования столбцов были кто по левому краю, кто по центру — шапка выглядела рваной.
      Центрируем ВСЕ по обеим осям (то же правило, что §8 чеклиста держит для выгрузки).
   2) «Ед. ВОР», «Объём ВОР», «Тип» — это колонки-зеркало документа (класс vc-mus). Их данные
      тоже по центру. Расчётные колонки («Объём сметы») остаются по правому краю: числа,
      которые сметчик сравнивает между строками, читаются столбиком по разряду.
   3) «Таблица ШНК» была 147 px и рвала названия норм на 3–4 строки. */
/* `thead th` — а не просто `th`: у грида есть и класс .vor-table с правилом text-align:left
   той же силы, и по порядку выигрывало то оно, то моё. Поднимаем вес явно. */
.vor-grid thead th{text-align:center; vertical-align:middle;}
/* Решение Отабека: по центру ВСЁ, включая «Объём сметы» и числа в составе нормы.
   Исключений не осталось — кроме двух текстовых колонок, «Наименование» и «Примечания»,
   где текст многострочный и центр рвал бы чтение. */
.vor-grid td.hi{text-align:center;}
/* Вертикаль. `.vor-grid td{vertical-align:middle}` существовало, но НЕ РАБОТАЛО: у
   `table.vor-table td` (0,0,1,2) вес выше, чем у `.vor-grid td` (0,0,1,1), и побеждал его
   `vertical-align:top`. Поэтому в строке с наименованием на 3 строки короткие ячейки
   («м2», «Р», «Сб.8») прижимались к верху. Поднимаем вес явно — та же ловушка, что с шапкой. */
table.vor-grid tbody td{vertical-align:middle;}
.vor-grid th.vc-tbl,.vor-grid td.vc-tbl{min-width:230px;}

/* ★★ 29.07 (Отабек: «иконки выделяются, смотрятся стрёмно»). У ▾ (варианты расценки) и ⋮
   (меню строки) НЕ БЫЛО СТИЛЕЙ ВООБЩЕ — браузер рисовал их системной кнопкой: серая заливка
   #efefef, рамка 2px outset, чёрный текст. На тёмном гриде это два светлых пятна.
   Приводим к тому же языку, что остальные управляющие элементы таблицы. */
.vor-grid .vg-mapbtn2, .vor-grid .vg-menu{
  background:transparent; border:1px solid var(--line2); border-radius:6px;
  color:var(--muted); font-size:11px; line-height:1; cursor:pointer;
  padding:3px 6px; margin-left:4px; vertical-align:middle;
  transition:background .12s, border-color .12s, color .12s;}
.vor-grid .vg-mapbtn2:hover, .vor-grid .vg-menu:hover{
  background:var(--accent-soft); border-color:var(--accent-bd); color:var(--h-9ec5ff);}
.vor-grid .vg-menu{padding:3px 5px; margin-left:0;}
/* в заголовке раздела ⋮ на цветной подложке — рамка приглушённее, чтобы не спорить с фоном */
.vor-grid tr.vg-sec .vg-menu{border-color:transparent; color:var(--faint);}
.vor-grid tr.vg-sec .vg-menu:hover{border-color:var(--accent-bd); color:var(--h-9ec5ff);}
table.vor-grid{min-width:1000px;}

/* ── ВОР-степпер: 4 этапа кластеров ── */
.vst{display:flex; align-items:stretch; margin:0 0 6px;}
.vst-step{flex:1; display:flex; flex-direction:column; gap:3px; padding:9px 11px; background:var(--bg2);
  border:1px solid var(--line); border-left:none; cursor:pointer;}
.vst-step:first-child{border-left:1px solid var(--line); border-radius:10px 0 0 10px;}
.vst-step:last-child{border-radius:0 10px 10px 0;}
.vst-step.active{background:var(--accent-soft); border-color:var(--accent-bd);}
.vst-hd{display:flex; align-items:center; gap:8px;}
.vst-num{width:23px; height:23px; border-radius:50%; border:1px solid var(--line2); color:var(--faint);
  display:flex; align-items:center; justify-content:center; font-size:12px; flex:none;}
.vst-step.active .vst-num{background:var(--accent); color:#fff; border-color:var(--accent);}
.vst-step.done .vst-num{background:#2ea043; color:#fff; border-color:#2ea043;}
.vst-lbl{font-weight:500; font-size:13px; color:var(--muted);}
.vst-step.active .vst-lbl{color:var(--text);}
.vst-sub{font-size:11px; color:var(--faint); padding-left:31px;}
.vst-step.done .vst-sub{color:var(--h-7fdcb0);}
.vst-step.active .vst-sub{color:var(--h-e0b86a);}
.vst-cap{font-size:11px; color:var(--faint); margin:0 2px 12px;}

/* тулбар этапа + кнопки */
.vgt{display:flex; flex-wrap:wrap; gap:7px; align-items:center; margin-bottom:11px;}
.vgt .vsp{flex:1;}
.vg-act{font:inherit; font-size:12px; font-weight:500; background:var(--panel2); border:1px solid var(--line2);
  color:var(--text); border-radius:8px; padding:7px 11px; cursor:pointer; display:inline-flex; align-items:center; gap:6px;}
.vg-act:hover{background:var(--panel3);} .vg-act:disabled{opacity:.5; cursor:default;}
.vg-act.ghost{background:transparent; color:var(--muted);}
.vg-act.a1{background:rgba(45,160,120,.12); border-color:rgba(45,160,120,.5); color:var(--h-7fdcb0);}
.vg-act.a2{background:var(--accent-soft); border-color:var(--accent-bd); color:var(--h-9fd0ff);}
.vg-act.prim{background:linear-gradient(180deg,#3b82f6,#2e6fd6); border-color:#3b82f6; color:#fff;}

/* зоны в шапке таблицы */
.vor-grid th.zn{text-align:center; font-weight:500; padding:5px;}
.vor-grid th.zn-raw{background:var(--panel2); color:var(--muted);}
.vor-grid th.zn-a{background:rgba(45,160,120,.16); color:var(--h-7fdcb0);}
.vor-grid th.zn-b{background:var(--accent-soft); color:var(--h-9fd0ff);}
.vor-grid td.vc-norm2{background:rgba(45,160,120,.09);}
.vor-grid td.vc-name, .vor-grid td.vc-norm2{padding-left:6px;}   /* текст прижат к краю — зелёная заливка не читается «абзацем» */
.vor-grid td.vc-mus{color:var(--muted);}
.vor-grid th.hi,.vor-grid td.hi{background:rgba(59,130,246,.06);}

/* дисциплина-чип */
.vg-chip{display:inline-block; background:var(--panel2); border:1px solid var(--line2); border-radius:20px;
  padding:2px 10px; font-size:11px; color:var(--h-9fd0ff); cursor:pointer;}
.vg-chip:hover{border-color:var(--accent-bd);}
.vg-chip.pick{background:none; border:1px dashed var(--h-d29922); color:var(--h-e0b86a);}
/* Кластер B: уверенность авто-дисциплины (high — чистый чип; medium — точечная рамка «сверьте»; low — пунктир + «?» «проверьте») */
.vg-chip.cf-med{border:1px dotted var(--h-d29922);}
.vg-chip.cf-low{border:1px dashed var(--h-d29922); color:var(--h-e0b86a);}
/* Кластер B: канон по найденной таблице — ⚠ сборник вне дисциплины пред-фильтра + стадия техпоследовательности */
.vg-canon-warn{color:var(--h-d29922); cursor:help;}
.vg-cand-stage{font-size:10px; color:var(--h-8b98a9); background:var(--panel2); border:1px solid var(--line2);
  border-radius:8px; padding:1px 7px; white-space:nowrap;}
.vg-mono{font-family:var(--font-mono,ui-monospace,monospace); font-size:11px; color:var(--h-9ec5ff); font-variant-numeric:tabular-nums;}
/* ★ 13.08 (план фиксов, фаза 1): короткое имя нормы рядом с шифром — оператор видит, ЧТО
   подобрано, не открывая карточку на каждую строку. Полное имя — в title (наведение). */
.vg-normname{display:inline-block; max-width:150px; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; vertical-align:middle; font-size:11px; color:var(--h-8b98a9);}
.vg-param{display:inline-block; margin-left:6px; font-size:10px; color:var(--h-9fd0ff); background:var(--panel2);
  border:1px solid var(--line2); border-radius:8px; padding:1px 7px; cursor:pointer; vertical-align:middle; white-space:nowrap;}
.vg-param:hover{border-color:var(--accent-bd);}
.vg-fb{display:inline-block; margin-left:5px; font-size:11px; color:var(--h-e0b86a); cursor:help; vertical-align:middle;}
.vg-prop{display:inline-block; margin-left:5px; font-size:11px; cursor:help; vertical-align:middle;}
.vg-nomatch{color:var(--faint); font-style:italic;}
/* решение движка «своей расценки нет — учтено в норме соседней работы» (крепёж, прокат,
   клей, шлифовка). Не ошибка: было видно как «не найдено» и читалось как поломка. */
.vg-absorb{color:var(--h-7fd6a2); font-size:11px; white-space:nowrap;}
.vg-cand-fork{color:var(--h-ffce6b); font-size:10px; margin-left:6px; white-space:nowrap;}
/* развилка-близнец: две таблицы одного предмета, признака выбора в строке ВОР нет */
.vg-fork{display:inline-block; margin-left:6px; padding:0 6px; border-radius:9px; font-size:10px;
  color:var(--h-ffce6b); background:var(--h-3a2f14); border:1px solid var(--h-6b5320); cursor:help; white-space:nowrap;}
/* Companion-работы (07-10): одна строка ВОР = >1 ШНК-позиция (напр. бетон+армирование) */
.vg-companion{display:inline-block; margin-left:6px; font-size:10px; color:var(--h-9fd0ff); background:var(--panel2);
  border:1px solid var(--line2); border-radius:8px; padding:1px 7px; cursor:help; vertical-align:middle; white-space:nowrap;}
.vg-companion-flag{color:var(--h-e0b86a); border-color:var(--h-d29922);}
/* спутник без выбранного варианта → кликабельный вопрос оператору (этап подбора, до ядра) */
.vg-compvar{display:inline-block; margin-left:6px; font-size:10px; color:var(--h-e0b86a); background:var(--panel2);
  border:1px solid var(--h-d29922); border-radius:8px; padding:1px 7px; cursor:pointer; vertical-align:middle;
  white-space:nowrap; font-family:inherit; line-height:inherit;}
.vg-compvar:hover{background:var(--h-3a2f16);}
.vg-pirog{display:inline-block; margin-left:6px; font-size:10px; color:var(--h-e0b86a); background:var(--panel2);
  border:1px solid var(--h-d29922); border-radius:8px; padding:1px 6px; cursor:pointer; white-space:nowrap;}
.vg-pirog:hover{background:var(--h-3a2f16);}
.vg-split{display:inline-block; margin-left:6px; font-size:10px; color:var(--h-9fd0ff); background:var(--panel2);
  border:1px solid var(--line2); border-radius:8px; padding:1px 6px; cursor:pointer; white-space:nowrap;}
.vg-split:hover{background:var(--h-16273a);}
.vg-chain{display:inline-block; margin-left:6px; font-size:10px; color:var(--h-b18cff); background:var(--panel2);
  border:1px solid #6b4fd8; border-radius:8px; padding:1px 6px; cursor:pointer; white-space:nowrap;}
.vg-sputnik { display:inline-block; padding:0 6px; border-radius:9px; background:#e8f2ea; color:#1d6b34; border:1px solid #bfe0c8; font-size:11px; cursor:pointer; }
.vg-chain:hover{background:var(--h-241a3d);}

/* floating-поповер (fixed на уровне body — не режется скролл-контейнером) */
/* ★ 27.07 (замечание Отабека «в выпадающем списке не прокручиваются варианты»): высота была
   фиксированные 320px — у нижних строк грида попап открывался вверх и упирался в край экрана,
   часть вариантов оставалась недосягаемой. Теперь потолок считается от высоты окна, полоса
   прокрутки видна всегда, а колесо не «проваливается» на грид под попапом. */
.vfloat{position:fixed; z-index:1000; background:var(--panel); border:1px solid var(--line2); border-radius:8px;
  box-shadow:0 12px 32px rgba(0,0,0,.6); overflow-y:auto; overflow-x:hidden; min-width:190px;
  max-height:min(60vh, 460px); overscroll-behavior:contain; scrollbar-width:thin;}
/* заголовок списка не уезжает при прокрутке — видно, что именно выбираешь */
.vfloat .vpop-h{position:sticky; top:0; z-index:1; background:var(--panel);}
/* всплывашки-поповеры (вставка/дисциплина/кандидаты) */
.vpop{position:absolute; z-index:20; background:var(--panel); border:1px solid var(--line2); border-radius:8px;
  box-shadow:0 10px 28px rgba(0,0,0,.55); overflow:hidden; min-width:190px;}
.vpop-h{padding:6px 10px; font-size:11px; color:var(--faint); border-bottom:1px solid var(--line);}
.vpop-i{display:flex; align-items:center; gap:9px; padding:8px 11px; font-size:12.5px; color:var(--text);
  cursor:pointer; border-bottom:1px solid var(--line);}
.vpop-i:last-child{border-bottom:none;}
.vpop-i:hover,.vpop-i.on{background:var(--panel2);}
.vpop-i .ic{color:var(--h-9fd0ff);} .vpop-i.on{color:var(--h-9fd0ff);}
.vpop-i .vg-mono{margin-right:2px;}

/* вставка раздела/подраздела между строк */
.vor-grid tr.vg-insrow td{padding:0; height:8px; position:relative; background:var(--bg); border:none;}
.vg-ins{position:absolute; left:12px; top:-9px; width:18px; height:18px; border-radius:50%; background:var(--accent);
  color:#fff; display:flex; align-items:center; justify-content:center; font-size:12px; border:2px solid var(--bg); cursor:pointer; z-index:6;}
.vg-ins:hover{background:#4a8cf7;}

/* тултип на наведении */
.vg-tipwrap{position:relative;}
.vtip{position:absolute; left:6px; top:calc(100% + 2px); z-index:25; background:var(--panel3); border:1px solid var(--line2);
  border-radius:8px; padding:8px 10px; font-size:11px; color:var(--h-cfe0ff); width:250px; box-shadow:0 8px 24px rgba(0,0,0,.5);
  line-height:1.4; display:none;}
.vg-tipwrap:hover .vtip{display:block;}

/* ресурсы (этап 4) */
/* ★ 30.07 (Отабек): «заливку строк ресурсов сделай посветлее, чтобы визуально было видно, что
   это выпадающие списки — а то сейчас всё одинаково». Состав нормы теперь читается как вложенный
   блок: заметно светлее строки-работы (панель ↑ на два шага), синяя направляющая слева и отступ
   у названия. Работа-родитель — на тёмном фоне грида, её состав — на светлой подложке. */
.vor-grid tr.vg-res td{padding:6px 8px; color:var(--h-d5deea); background:var(--h-232d3d);
  border-top:1px solid var(--h-2b3647);}
.vor-grid tr.vg-res:hover td{background:var(--h-2a3547);}
.vor-grid tr.vg-res td.rlab{padding-left:28px; box-shadow:inset 3px 0 0 var(--accent,#2E75B6);}
.vor-grid tr.vg-res td.vc-n{box-shadow:inset 3px 0 0 var(--accent,#2E75B6);}
/* строка-работа сразу после состава — жирнее сверху, чтобы отделить один узел от другого */
.vor-grid tr.vg-res + tr.vg-row td{border-top:1px solid var(--line2);}
.vg-res-tr{color:var(--h-7fb0e0);} .vg-res-mc{color:var(--h-e0b86a);} .vg-res-mt{color:var(--h-7fdcb0);}
/* ★★ 29.07: правка ресурса прямо на этапе расценок — исключение, расход, замена.
   Исключённый ресурс НЕ исчезает: гаснет и остаётся возвращаемым (правило #102 ядра). */
.vor-grid tr.vg-res-ex td{color:var(--muted); opacity:.55; text-decoration:line-through;}
.vor-grid tr.vg-res-ex td.vc-act, .vor-grid tr.vg-res-ex td.vc-note{text-decoration:none; opacity:1;}
.vor-grid tr.vg-res .vg-rnorm .ce{border-bottom:1px dashed var(--line2); padding:0 3px; min-width:34px; display:inline-block;}
.vor-grid tr.vg-res .vg-rnorm .ce:focus{background:var(--panel2); border-bottom-color:var(--accent-bd); outline:none;}
.vg-rctl{white-space:nowrap; text-align:right;}
.vg-rctl button{background:transparent; border:1px solid transparent; border-radius:6px; cursor:pointer;
  color:var(--muted); font-size:12px; line-height:1; padding:3px 5px; margin-left:2px;}
.vor-grid tr.vg-res:hover .vg-rctl button{border-color:var(--line2);}
.vg-rctl .vg-rx:hover{background:rgba(224,75,74,.2); border-color:var(--h-7a2f2f); color:var(--h-f08a8a);}
.vg-rctl .vg-rsw:hover, .vg-rctl .vg-rrev:hover, .vg-rctl .vg-rrest:hover{
  background:rgba(59,130,246,.22); border-color:var(--accent-bd); color:var(--h-7fb3ff);}
.vg-rtag{display:inline-block; margin-left:4px; padding:1px 6px; border-radius:6px;
  font-size:10px; font-weight:700; letter-spacing:.3px; white-space:nowrap;}
.vg-rtag.rt-ex{background:rgba(224,75,74,.16); color:var(--h-f0a0a0);}
.vg-rtag.rt-sw{background:rgba(59,130,246,.18); color:var(--h-8fc0ff);}
.vg-rtag.rt-pp{background:rgba(224,184,106,.16); color:var(--h-e0b86a);}
.vg-rtag.rt-need{background:rgba(224,184,106,.16); color:var(--h-e0b86a);}
.vor-grid td.vc-cost{color:var(--faint); text-align:right;}
.vor-grid td.vc-num{text-align:center; font-variant-numeric:tabular-nums;}   /* ★ 29.07: было right */
.vg-costbadge{background:var(--panel2); border:1px solid var(--line2); border-radius:8px; padding:3px 10px; color:var(--h-e0b86a); font-size:11px;}
/* компактный тип Р/М */
.vor-grid select.vg-type{width:40px; min-width:40px; padding:2px 4px; text-align:center; font-weight:500; color:var(--h-8fd19e);
  background:var(--panel2); border:1px solid var(--line2); border-radius:6px; cursor:pointer;}
.vor-grid select.vg-type.tm{color:var(--h-9fd0ff);}
.vor-grid td.vc-type{width:52px;}
.vor-grid td.vc-note{min-width:120px;} .vor-grid td.vc-note .ce{color:var(--h-eccf86); font-size:11.5px;}

/* ── Проект: контейнер (список ↔ деталь) ── */
.panel-head .proj-new{margin-left:auto; font-size:12.5px;}
.proj-loading{padding:30px; color:var(--muted); text-align:center;}
.proj-empty{height:100%; display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:12px; text-align:center; color:var(--muted); padding:30px;}
.proj-empty .empty-ic{font-size:40px; opacity:.5;}
.proj-empty p{line-height:1.5; font-size:13.5px;}

.proj-list{padding:16px; display:flex; flex-direction:column; gap:10px; overflow:auto;}
.proj-li{display:flex; align-items:center; gap:14px; background:var(--panel2); border:1px solid var(--line);
  border-radius:var(--radius-sm); padding:14px 16px; cursor:pointer; transition:.15s;}
.proj-li:hover{border-color:var(--accent-bd); background:var(--panel3);}
.proj-li-main{flex:1; min-width:0;}
.proj-li-name{font-weight:600; font-size:14.5px; margin-bottom:3px;}
/* ★ QA 14.08: имя проекта — настоящая кнопка (главное действие карточки), чтобы проект
   открывался с клавиатуры. Визуально остаётся текстом: all:unset снимает вид кнопки,
   шрифт и цвет наследуются от .proj-li-name. Фокус ОБЯЗАН быть видимым — раньше у карточки
   был только :hover, и клавиатурный пользователь не понимал, где находится. */
.proj-li-open{all:unset; display:block; width:100%; cursor:pointer;}
.proj-li-open:focus-visible{outline:2px solid var(--accent-bd); outline-offset:3px; border-radius:4px;}
.proj-li-sub{color:var(--muted); font-size:12.5px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.proj-li-meta{display:flex; align-items:center; gap:10px; flex-shrink:0;}
.proj-li-badge{font-size:12px; color:var(--muted); background:var(--bg2); border:1px solid var(--line);
  padding:3px 9px; border-radius:20px; white-space:nowrap;}
.proj-li-ts{font-size:11px; color:var(--faint); white-space:nowrap;}
.proj-del{background:transparent; border:1px solid var(--line2); color:var(--faint); border-radius:8px;
  padding:5px 9px; cursor:pointer; font-size:13px; transition:.15s; flex-shrink:0;}
.proj-del:hover{border-color:rgba(224,75,74,.5); color:var(--h-f08a8a);}
.proj-del.armed{border-color:rgba(224,75,74,.6); color:var(--h-f08a8a); background:rgba(224,75,74,.12); font-size:12px;}

.proj-detail{padding:22px 24px; overflow:auto; height:100%;}
.proj-back{background:transparent; border:none; color:var(--muted); font:inherit; font-size:13px; cursor:pointer;
  padding:0 0 14px; transition:.15s;}
.proj-back:hover{color:var(--text);}
.proj-detail .proj-card{max-width:760px; background:var(--panel2); border:1px solid var(--line);
  border-radius:var(--radius); padding:22px 24px; margin:0;}
.proj-object{width:100%; margin:10px 0 18px; background:var(--bg2); border:1px solid var(--line2);
  border-radius:var(--radius-sm); color:var(--text); font:inherit; font-size:13.5px; padding:9px 12px;}
.proj-object::placeholder{color:var(--faint);}
.proj-sec{max-width:760px; margin-top:22px;}
.proj-sec-h{display:flex; align-items:center; gap:8px; font-weight:600; font-size:13.5px; color:var(--text);
  margin-bottom:10px;}
.proj-sec-c{font-size:11.5px; color:var(--muted); background:var(--panel3); border:1px solid var(--line);
  padding:2px 9px; border-radius:20px;}
.proj-vors{display:flex; flex-direction:column; gap:8px;}
.proj-vors-empty{color:var(--faint); font-size:12.5px; line-height:1.5; padding:14px; border:1px dashed var(--line2);
  border-radius:var(--radius-sm);}
.proj-vor-row{display:flex; align-items:center; gap:12px; background:var(--panel2); border:1px solid var(--line);
  border-radius:var(--radius-sm); padding:11px 14px;}
.pv-ic{color:var(--accent);}
.pv-main{flex:1; min-width:0;}
.pv-title{font-size:13px; font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.pv-sub{color:var(--muted); font-size:11.5px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.pv-rows{font-size:11.5px; color:var(--muted); background:var(--bg2); border:1px solid var(--line);
  padding:3px 9px; border-radius:20px; white-space:nowrap; flex-shrink:0;}

/* ── Проект: интейк архива + triage ── */
.proj-sec-sub{font-size:11.5px; color:var(--faint); font-weight:400;}
.intake-drop{display:flex; flex-direction:column; align-items:center; justify-content:center; gap:5px;
  border:1.5px dashed var(--line2); border-radius:var(--radius); padding:26px 18px; cursor:pointer;
  text-align:center; transition:.15s; background:var(--bg2); max-width:760px;}
.intake-drop:hover,.intake-drop.drag{border-color:var(--accent-bd); background:var(--accent-soft);}
.intake-ic{font-size:26px;}
.intake-t{font-weight:600; font-size:14px;}
.intake-d{color:var(--muted); font-size:11.5px;}
.intake-actions{display:flex; align-items:center; gap:12px; margin-top:14px; max-width:760px;}

.triage{margin-top:14px; max-width:760px; display:flex; flex-direction:column; gap:14px;}
.tg-group{background:var(--panel2); border:1px solid var(--line); border-radius:var(--radius-sm); overflow:hidden;}
.tg-head{display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px solid var(--line);
  font-weight:600; font-size:13px; background:var(--panel3);}
.tg-n{font-size:11px; color:var(--muted); background:var(--bg2); border:1px solid var(--line);
  padding:1px 8px; border-radius:20px;}
.tg-row{display:flex; align-items:center; gap:8px; padding:8px 14px; border-bottom:1px solid var(--line);
  font-size:12.5px;}
.tg-row:last-child{border-bottom:none;}
.tg-name{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-family:ui-monospace,Menlo,monospace; font-size:11.5px;}
.tg-disc{color:var(--h-9ec5ff); font-size:11px; background:var(--accent-soft); border:1px solid var(--accent-bd);
  padding:2px 8px; border-radius:20px; white-space:nowrap;}
.tg-obj{color:var(--muted); font-size:11px; max-width:180px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.tg-conf{color:var(--faint); font-size:11px; white-space:nowrap;}
.tg-ok{color:var(--h-7ee0a3); font-size:11px; white-space:nowrap;}
.tg-wait{color:var(--h-eccf86); font-size:11px; white-space:nowrap;}

/* ── Паспорт проекта: сворачиваемые секции + сетка полей ── */
.proj-passport-h{max-width:760px; margin:24px auto 8px; font-weight:600; font-size:14px; display:flex;
  align-items:baseline; gap:10px; flex-wrap:wrap;}
.psecs{max-width:760px; margin:0 auto; display:flex; flex-direction:column; gap:10px;}
.psec{background:var(--panel2); border:1px solid var(--line); border-radius:var(--radius-sm); overflow:hidden;}
.psec-h{width:100%; display:flex; align-items:center; gap:10px; padding:12px 14px; background:transparent;
  border:none; color:var(--text); font:inherit; font-size:13.5px; font-weight:600; cursor:pointer; text-align:left;}
.psec-h:hover{background:var(--panel3);}
.psec-ic{font-size:15px;}
.psec-t{flex:1;}
.ps-badge{font-size:11px; font-weight:500; color:var(--muted); background:var(--bg2); border:1px solid var(--line);
  padding:2px 9px; border-radius:20px;}
.psec-car{color:var(--faint); transition:transform .15s; font-size:11px;}
.psec.open .psec-car{transform:rotate(180deg);}
.psec-body{display:none; padding:4px 14px 16px;}
.psec.open .psec-body{display:block;}
.pf-grid{display:grid; grid-template-columns:1fr 1fr; gap:10px 14px;}
.pf{display:flex; flex-direction:column; gap:5px;}
.pf-wide{grid-column:1 / -1;}
.pf-l{font-size:11.5px; color:var(--muted);}
.pf-in{background:var(--bg2); border:1px solid var(--line2); border-radius:var(--radius-sm); color:var(--text);
  font:inherit; font-size:12.5px; padding:8px 10px; width:100%;}
.pf-in:focus{outline:none; border-color:var(--accent-bd); background:var(--bg);}
.pf-in::placeholder{color:var(--faint);}
select.pf-in{appearance:none; cursor:pointer;}
.pf-ta{resize:vertical; min-height:38px; line-height:1.4;}
/* интейк внутри секции «Объёмы» */
.scope-intake{margin-top:4px;}
.scope-vors-h{margin-top:18px;}
@media(max-width:760px){.pf-grid{grid-template-columns:1fr;}}
/* P-079 (Ц-5): правила паспорта — подпись под полем, подсветка отказа, неактивные Пз в оферте, флажок.
   Только новые классы pf-calc-* и селекторы под .psec-body: таблица Портфеля (table.pf) не задета. */
.pf-calc-note{font-size:11px; color:var(--faint);}
.pf.pf-calc-err .pf-in{border-color:rgba(224,138,138,.75); background:rgba(224,138,138,.08);}
.pf.pf-calc-err .pf-calc-note{color:var(--h-e0a0a0);}
.psec-body .pf-in:disabled{opacity:.55; cursor:not-allowed;}
.psec-body .pf-in[readonly]{color:var(--muted); background:transparent;}
.pf-calc-check{flex-direction:row; align-items:center; gap:8px; cursor:pointer; align-self:end; padding:8px 0;}
.pf-calc-check .pf-l{font-size:12.5px; color:var(--text);}
.pf-calc-cb{width:16px; height:16px; margin:0; accent-color:var(--accent, currentColor);}

/* ── Объекты проекта: карточки + инлайн-форма критериев ── */
/* ═══ Иерархия проекта 29.07: Проект → Объект → Подобъект → Дисциплина → ВОР ═══ */
.lvl{max-width:860px; margin:0 auto 22px;}
.lvl-h{display:flex; align-items:baseline; gap:11px; margin-bottom:10px; flex-wrap:wrap;}
.lvl-n{font-size:10.5px; font-weight:700; letter-spacing:.09em; color:var(--faint);
  border:1px solid var(--line2); padding:2px 8px; border-radius:20px;}
.lvl-t{font-weight:600; font-size:15px;}
.lvl-s{font-size:12px; color:var(--muted);}
/* плюсик сворачивания слева от названия уровня (правка Зульфии) */
.tg{width:20px; height:20px; flex:0 0 20px; display:inline-flex; align-items:center; justify-content:center;
  border:1px solid var(--line2); border-radius:5px; background:var(--bg2); color:var(--muted);
  font:inherit; font-size:13px; font-weight:600; line-height:1; cursor:pointer; padding:0; transition:.15s;}
.tg:hover{border-color:var(--accent-bd); color:var(--h-cfe0ff); background:var(--accent-soft);}
.pcard{background:var(--panel); border:1px solid var(--line); border-radius:var(--radius); padding:14px 16px;}
.pcard .phead{display:flex; align-items:center; gap:10px; flex-wrap:wrap;}
.pcard .funnel{margin-top:12px;}
.pcard .pbody{border-top:1px solid var(--line); margin-top:13px; padding-top:12px;}
.pcard .psecs{max-width:none;}
.btn-s{background:transparent; border:1px solid var(--line2); color:var(--muted); font:inherit; font-size:12px;
  padding:5px 11px; border-radius:var(--radius-sm); cursor:pointer; white-space:nowrap; transition:.15s;}
.btn-s:hover{border-color:var(--accent-bd); color:var(--h-cfe0ff); background:var(--accent-soft);}
.btn-s.acc{border-color:var(--accent-bd); color:var(--h-cfe0ff); background:var(--accent-soft); margin-left:auto;}
/* уровень 2 — объект */
.obj{background:var(--panel); border:1px solid var(--line); border-radius:var(--radius);
  margin-bottom:12px; overflow:hidden;}
.obj-h{display:flex; align-items:center; gap:10px; padding:12px 15px; background:var(--panel2); flex-wrap:wrap;}
.obj-h .ic{font-size:16px;}
.obj-h .nm{font-weight:600; font-size:15px;}
.obj-h .cnt{font-size:11.5px; color:var(--muted); margin-left:auto;}
.obj-body{padding:11px 12px 12px;}
/* уровень 3 — подобъект */
.sub{background:var(--panel2); border:1px solid var(--line2); border-radius:var(--radius-sm);
  margin-bottom:9px; overflow:hidden;}
.sub.act{border-color:var(--accent-bd);}
.sub-h{display:flex; align-items:center; gap:9px; padding:11px 13px; flex-wrap:wrap;}
.sub-h .nm{font-weight:600; font-size:14px;}
.sub-h .st{font-size:11px; padding:2px 9px; border-radius:20px; white-space:nowrap;}
.sub-h .st-ok{background:var(--ok-soft); border:1px solid var(--ok-bd); color:var(--h-7ee0a3);}
.sub-h .st-need{background:var(--warn-soft); border:1px solid var(--warn-bd); color:var(--h-f0c568);}
.sub-h .tail{margin-left:auto; font-size:11.5px; color:var(--faint);}
.sub .chips{display:flex; gap:5px; flex-wrap:wrap; padding:0 13px 10px 42px;}
.sub-body{border-top:1px solid var(--line); padding:12px 13px;}
/* секции внутри подобъекта (вместо трёх кнопок-вкладок) */
.s2{border:1px solid var(--line); border-radius:var(--radius-sm); background:var(--bg2); margin-bottom:10px; overflow:hidden;}
.s2-h{display:flex; align-items:center; gap:9px; padding:9px 12px; flex-wrap:wrap;}
.s2-h .t{font-weight:600; font-size:13px;}
.s2-h .s{font-size:11px; color:var(--faint);}
.s2-h .tail{margin-left:auto; font-size:11.5px; color:var(--muted);}
.s2-b{border-top:1px solid var(--line); padding:12px;}
.sf-in{width:100%;}
.sf-in.sf-need{border-color:var(--warn-bd);}
.sf-req{color:var(--warn); font-size:10px;}
.sf-inh{font-size:10px; color:var(--faint); border:1px solid var(--line2); border-radius:20px; padding:0 6px;}
.sf-inherit{font-size:11px; color:var(--faint); margin-top:10px;}
/* строка ВОРа: дисциплина главным атрибутом слева, номер справа (правка Зульфии) */
.discblk{margin-bottom:10px;}
.discgrp{font-size:12px; font-weight:600; color:var(--h-cfe0ff); background:var(--accent-soft);
  border:1px solid var(--accent-bd); border-radius:20px; padding:2px 11px; display:inline-block; margin-bottom:7px;}
.vorline{display:flex; align-items:center; gap:11px; padding:9px 12px; background:var(--panel2);
  border:1px solid var(--line); border-radius:var(--radius-sm); margin-bottom:6px; flex-wrap:wrap;}
.vorline .disc{font-weight:600; font-size:13px; min-width:180px; flex:1;}
.vorline .disc small{display:block; font-weight:400; font-size:10.5px; color:var(--faint);
  font-family:ui-monospace,Menlo,monospace; word-break:break-all;}
.vorline .no{font-family:ui-monospace,Menlo,monospace; font-size:11.5px; color:var(--muted);
  border:1px solid var(--line2); border-radius:6px; padding:2px 9px; white-space:nowrap;}
.vorline .rows{font-size:11.5px; color:var(--h-7ee0a3); white-space:nowrap;}
.vor-move{background:var(--bg2); border:1px solid var(--line2); color:var(--muted); font:inherit;
  font-size:11px; border-radius:var(--radius-sm); padding:3px 6px; max-width:150px; cursor:pointer;}
.sub-drop{margin-top:8px;}
.sub .govor-block{margin-top:12px;}

/* Строка, добавленная оператором (30.07): значок ✚ в П/Н, чтобы пустые ячейки читались
   как «дозаполните свою строку», а не как потеря распознавания */
.vor-grid tr.vg-added td.vc-n{box-shadow:inset 3px 0 0 #3fb950;}
.vor-grid tr.vg-added td.vc-n::after{content:"✚"; color:var(--h-3fb950); font-size:10px; margin-left:3px; opacity:.8;}

/* Формула в примечании → объём считается сам (30.07, Зульфия) */
.vor-grid td.vg-formula .ce{color:var(--h-7fd0a0); font-family:ui-monospace,Menlo,monospace; font-size:11.5px;}
.vor-grid td.vg-formula::before{content:"ƒ "; color:var(--h-7fd0a0); opacity:.7;}
.vor-grid td.vg-formula-bad .ce{color:var(--h-f0a0a0);}
.vor-grid td.vg-formula-bad{box-shadow:inset 0 0 0 1px rgba(224,75,74,.4);}

/* Частично заполненная нормализованная строка (30.07, Зульфия): пустых быть не должно —
   если хоть одна из трёх ячеек с данными, пустые горят. Все три пустые — не горят. */
.vor-grid td.vg-need{background:rgba(224,75,74,.16); box-shadow:inset 0 0 0 1px rgba(224,75,74,.45);}
.vor-grid td.vg-need .ce:empty::before{content:"впишите"; color:var(--h-f0a0a0); font-style:italic; opacity:.6; pointer-events:none;}

/* Объём после правки отличается от документа (30.07): наглядно «что на что» */
.vor-grid td.vg-qtychg{background:rgba(210,153,34,.14);}
.vor-grid td.vg-qtychg .ce{color:var(--h-e0b86a); font-weight:600;}

/* Поиск по таблице ВОР с подсветкой (30.07) */
.vgt-find{display:inline-flex; align-items:center; gap:6px;}
.vg-find{background:var(--bg2); border:1px solid var(--line2); color:var(--text); font:inherit;
  font-size:12px; border-radius:var(--radius-sm); padding:5px 9px; width:190px; outline:none;}
.vg-find:focus{border-color:var(--accent,#2E75B6); box-shadow:0 0 0 2px rgba(46,117,182,.22);}
.vg-find-n{font-size:11px; color:var(--faint); white-space:nowrap;}
.vg-find-x{background:none; border:none; color:var(--faint); cursor:pointer; font-size:12px; padding:2px 4px;}
.vg-find-x:hover{color:var(--text);}
mark.vg-hit{background:#d29922; color:#101418; border-radius:2px; padding:0 1px;}
tr.vg-hidden{display:none;}

/* Раздел без распознанного имени: подсказка вместо пустоты (30.07) */
.vg-sec-empty:empty::before{content:attr(data-ph); color:var(--faint); font-weight:400; font-style:italic;}
.vg-sec-empty:focus::before{content:none;}

/* Ручка перетаскивания строки ВОР (29.07): draggable на всей строке блокировал выделение текста */
.vg-grip{display:inline-block; cursor:grab; color:var(--faint); font-size:11px; margin-right:5px;
  user-select:none; vertical-align:middle; opacity:.45;}
.vg-grip:hover{opacity:1; color:var(--muted);}
.vg-grip:active{cursor:grabbing;}
.vg-row td, .vg-sec td{user-select:text;}          /* текст ВОРа должен выделяться и копироваться */

/* Этап 2 (29.07): в строке только данные; обоснование — в шапке карточки позиции */
.vg-why{font-size:10.5px; color:var(--muted); margin-top:4px; line-height:1.35; white-space:normal;}
.vg-why-warn{color:var(--h-ffcf7a);}
.pm-head-why{margin-top:6px; max-width:760px;}
.pm-why{font-size:11.5px; color:var(--muted); line-height:1.4;}
/* сборник и таблица правятся оператором — ячейка кликабельна */
.vg-pick-cell{cursor:pointer;}
.vg-pick-cell:hover{background:var(--bg2); box-shadow:inset 0 -1px 0 var(--line2);}
.vg-more{color:var(--h-9fd0ff); cursor:pointer; font-size:10px; vertical-align:middle; opacity:.75;}
.vg-more:hover{opacity:1;}

/* Ведомости и сметы одной таблицей (29.07): смета считается на каждую ведомость */
.govor-note{font-size:11.5px; color:var(--muted); margin:6px 0 2px;}
.sm-cell{font-size:11.5px; white-space:nowrap; border-radius:6px; padding:3px 9px;
  border:1px solid transparent; background:none; font-family:inherit;}
.sm-has{color:var(--h-7ee0a3); border-color:var(--line2); background:var(--bg2); cursor:pointer;}
.sm-has:hover{border-color:var(--h-7ee0a3);}
.sm-no{color:var(--faint);}
.sm-wait{color:var(--faint);}
.vor-pick{width:15px; height:15px; accent-color:var(--accent,#2E75B6); cursor:pointer; flex:none;}
.cb-gap{width:15px; flex:none;}
.vor-none .disc{color:var(--muted);}
.vor-go{white-space:nowrap;}
.vor-merge{display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin:8px 0 2px;
  padding:8px 12px; background:var(--bg2); border:1px dashed var(--line2); border-radius:var(--radius-sm);}
.vor-merge .vm-t{font-size:11.5px; color:var(--muted); flex:1; min-width:200px;}

/* Зимнее удорожание и ВЗиС: две необязательные кнопки + таблица ШНК */
.lim-block{margin-top:12px; padding-top:11px; border-top:1px solid var(--line);}
.lim-h{font-size:12px; font-weight:600; margin-bottom:8px;}
.lim-h .s{font-weight:400; color:var(--faint); font-size:11px; margin-left:8px;}
.lim-row{display:flex; align-items:center; gap:10px; margin-bottom:6px; flex-wrap:wrap;}
.lim-btn{white-space:nowrap;}
.lim-v{font-size:12px; color:var(--text);}
.lim-v.lim-none{color:var(--faint);}
.lim-top{display:flex; gap:12px; align-items:center; margin-bottom:10px; flex-wrap:wrap;}
.lim-top #limSearch{flex:1; min-width:220px;}
.lim-zone{font-size:11.5px; color:var(--muted); display:flex; align-items:center; gap:7px;}
.lim-zone select{background:var(--bg2); border:1px solid var(--line2); color:var(--text);
  border-radius:8px; padding:6px 9px; font:inherit; font-size:12.5px;}
.lim-note{font-size:11.5px; color:var(--muted); background:var(--bg2); border:1px solid var(--line);
  border-radius:var(--radius-sm); padding:9px 12px; margin-bottom:10px;}
.lim-list{max-height:52vh; overflow:auto;}
.lim-grp{font-size:11.5px; font-weight:600; color:var(--muted); padding:9px 4px 5px;
  position:sticky; top:0; background:var(--panel);}
.lim-item{display:flex; align-items:center; gap:12px; padding:7px 10px; border-radius:7px; cursor:pointer;}
.lim-item:hover{background:var(--bg2);}
.lim-item .nm{flex:1; font-size:12.5px;}
.lim-item .nm i{color:var(--faint); font-style:normal; font-family:ui-monospace,Menlo,monospace; font-size:11px;}
.lim-item .pct{font-weight:600; font-size:12.5px; white-space:nowrap;}

.obj-list{display:flex; flex-direction:column; gap:8px; margin-bottom:10px;}
.obj-empty{color:var(--muted); font-size:12.5px; padding:14px; background:var(--panel2); border:1px solid var(--line);
  border-radius:var(--radius-sm);}
.obj-card{background:var(--panel2); border:1px solid var(--line); border-radius:var(--radius-sm);}
.obj-card-h{display:flex; align-items:center; gap:10px; padding:10px 12px; flex-wrap:wrap;}
.obj-name{font-weight:600; font-size:13px; margin-right:auto;}
.obj-chips{display:flex; gap:6px; flex-wrap:wrap;}
.obj-chip{font-size:10.5px; color:var(--muted); background:var(--bg2); border:1px solid var(--line);
  padding:2px 8px; border-radius:20px; white-space:nowrap;}
.obj-chip-miss{color:var(--h-e0a0a0); background:rgba(224,138,138,.10); border-color:rgba(224,138,138,.4);}
.obj-warn{font-size:10.5px; color:var(--h-eccf86); background:rgba(236,207,134,.12); border:1px solid rgba(236,207,134,.35);
  padding:2px 8px; border-radius:20px; white-space:nowrap;}
/* #2 пошаговый гид + кнопка AI на карточке объекта */
.obj-card-todo{border-color:rgba(224,138,138,.35);}
.obj-step{padding:7px 12px; font-size:12px; border-top:1px solid var(--line); display:flex; align-items:center; gap:8px; flex-wrap:wrap;}
.obj-step-ok{color:var(--h-7ee0a3);}
.obj-step-todo{color:var(--muted);}
.obj-ai-btn{background:var(--accent-soft); border:1px solid var(--accent-bd); color:var(--h-cfe0ff); font:inherit; font-size:12px;
  padding:4px 11px; border-radius:var(--radius-sm); cursor:pointer; transition:.15s; white-space:nowrap;}
.obj-ai-btn:hover{background:var(--accent-bd); color:var(--on-tint);}
.obj-ai-btn.busy{opacity:.6; pointer-events:none;}
/* Тип проекта: карточки выбора удалены 29.07 (бэклог «Проект» п.2) — тип выводится из сценария
   объекта, второго ручного ввода больше нет. Стили .ptype-card/.ptype-row снесены как мёртвые. */
/* группы списка проектов по типу */
.proj-groups{display:flex; flex-direction:column; gap:16px;}
.proj-grp-h{font-size:13px; font-weight:600; color:var(--muted); padding:0 2px 6px; display:flex; align-items:center; gap:8px;}
.proj-grp-n{font-size:11px; color:var(--faint); background:var(--bg2); border:1px solid var(--line); padding:1px 8px; border-radius:20px;}
.proj-li-type{font-size:11px; color:var(--h-9ec5ff); margin-bottom:2px;}
.proj-li-type-none{color:var(--h-e0a0a0);}
/* #3: замок вкладки ВОР + блок «Перейти к ВОР» */
.tab.tab-locked{opacity:.4; cursor:not-allowed;}
.tab.tab-locked::after{content:" 🔒"; font-size:11px;}
.govor-block{display:flex; align-items:center; gap:14px; flex-wrap:wrap;}
/* ★ 29.07 (бэклог «Проект» п.3): вместо зелёного бокса — дышащая подсветка на кнопке.
   Бокс кричал сам по себе и не говорил, КУДА жать; подсветка ведёт глаз к действию. */
.govor-todo .govor-txt{color:var(--muted);}
.govor-ok .govor-txt{color:var(--muted);}
.govor-txt{flex:1; min-width:200px; font-size:13px;}
.govor-btn{white-space:nowrap;}
/* базовую тень .btn-primary держим в обоих кадрах — иначе анимация её затирает и кнопка
   на полсекунды теряет объём; дышит ореол в том же синем, а не чужой зелёный. */
@keyframes govorBreathe{
  0%,100%{box-shadow:0 4px 14px rgba(59,130,246,.30);}
  50%    {box-shadow:0 4px 14px rgba(59,130,246,.30), 0 0 0 5px rgba(59,130,246,.14), 0 0 22px rgba(59,130,246,.38);}
}
.govor-ok .govor-btn{animation:govorBreathe 2.8s ease-in-out infinite;}
@media (prefers-reduced-motion:reduce){.govor-ok .govor-btn{animation:none;}}
.obj-edit,.obj-del{background:transparent; border:1px solid var(--line2); color:var(--muted); font-size:12px;
  padding:4px 8px; border-radius:var(--radius-sm); cursor:pointer; transition:.15s;}
.obj-edit:hover{border-color:var(--accent-bd); color:var(--h-cfe0ff);}
.obj-del:hover{border-color:var(--h-e08a8a); color:var(--h-e08a8a);}
.obj-form{background:var(--panel2); border:1px solid var(--line); border-radius:var(--radius-sm); padding:14px; margin-top:6px;}
.obj-form-act{display:flex; gap:8px; margin-top:12px;}
.pt-chips{margin-left:6px;}
/* дерево объекта (универсальный WBS-инстанциатор) */
.obj-tree-btn{background:transparent; border:1px solid var(--line2); color:var(--muted); font-size:11.5px;
  padding:4px 9px; border-radius:var(--radius-sm); cursor:pointer; transition:.15s; white-space:nowrap;}
.obj-tree-btn:hover,.obj-tree-btn.on{border-color:var(--accent-bd); color:var(--h-cfe0ff); background:var(--accent-soft);}
/* стили дерева-эталона (.obj-wbs/.wbs-*) удалены 29.07 вместе с секцией «Дерево работ»:
   инстанциатор канона остался внутренней механикой «Полноты по стадиям», на экране его нет. */
/* полнота по стадиям (эталон vs факт) */
.cmpl-empty,.cmpl-gate{color:var(--muted); font-size:12.5px; padding:12px 2px;}
.cmpl-gate{background:var(--panel2); border:1px dashed var(--line2); border-radius:var(--radius-sm); padding:12px 14px;}
.cmpl-sum{font-size:12.5px; color:var(--muted); margin-bottom:10px;}
.cmpl-sum b.cmpl-miss-n{color:var(--h-eccf86);}   /* 27.07: «ждут ВОР» — ожидание (янтарный), не ошибка (красный) */
.cmpl-warn{margin-left:8px; color:var(--h-eccf86); font-size:11.5px;}
.cmpl-list{display:flex; flex-direction:column; gap:3px;}
.cmpl-row{display:flex; align-items:center; gap:10px; padding:5px 10px; border-radius:var(--radius-sm); font-size:12.5px; background:var(--panel2);}
.cmpl-row.cmpl-missing{background:rgba(236,207,134,.09); border:1px solid rgba(236,207,134,.24);}
.cmpl-row.cmpl-covered{background:rgba(126,224,163,.08);}
.cmpl-row.cmpl-extra{opacity:.65;}
.cmpl-ic{width:16px; text-align:center;}
.cmpl-ord{color:var(--faint); font-size:11px; width:16px; text-align:right;}
.cmpl-t{flex:1;}
.cmpl-tag{font-size:10.5px; color:var(--faint); white-space:nowrap;}
.cmpl-n{font-size:11px; color:var(--muted); white-space:nowrap; min-width:44px; text-align:right;}
.cmpl-note{font-size:11px; color:var(--faint); margin-top:10px; line-height:1.5;}
/* обязательные поля Титула (#4) + кнопки файлов (#5/#1) */
.pf-req{color:var(--h-e08a8a); font-weight:700;}
.pf.pf-empty-req .pf-in{border-color:rgba(224,138,138,.55); background:rgba(224,138,138,.06);}
.pf.pf-empty-req .pf-l{color:var(--h-e0a0a0);}
/* бейдж источника поля карточки (после распознавания): 🟢 штамп · ⚪ дефолт · 🟡 проверьте */
.pf-src{font-size:9px; cursor:help; vertical-align:middle; opacity:.85;}
.pt-file{display:flex; align-items:center; gap:8px;}
.pt-del{margin-left:6px; background:transparent; border:1px solid var(--line2); color:var(--faint); font-size:11px;
  padding:2px 7px; border-radius:var(--radius-sm); cursor:pointer; transition:.15s; white-space:nowrap;}
.pt-del:hover,.pt-del.armed{border-color:var(--h-e08a8a); color:var(--h-e08a8a);}
.pt-reclass{background:transparent; border:1px solid var(--line2); color:var(--muted); font-size:11px;
  padding:2px 8px; border-radius:var(--radius-sm); cursor:pointer; transition:.15s; white-space:nowrap;}
.pt-reclass:hover{border-color:var(--accent-bd); color:var(--h-cfe0ff); background:var(--accent-soft);}

/* ════ Проект v2: воронка + дерево ════ */
.proj-hero{max-width:860px; margin:0 auto 18px; background:var(--panel2); border:1px solid var(--line);
  border-radius:var(--radius); padding:18px 20px;}
.ph-top{display:flex; align-items:center; gap:12px; margin-bottom:10px;}
.proj-hero .proj-name{flex:1; background:var(--bg2); border:1px solid var(--line2); border-radius:var(--radius-sm);
  color:var(--text); font:inherit; font-size:17px; font-weight:600; padding:9px 12px;}
.proj-hero .proj-object{width:100%; margin-bottom:16px; background:var(--bg2); border:1px solid var(--line2);
  border-radius:var(--radius-sm); color:var(--text); font:inherit; font-size:13px; padding:8px 12px;}
.proj-hero .proj-name::placeholder,.proj-hero .proj-object::placeholder{color:var(--faint); font-weight:400;}
/* воронка */
.funnel{display:flex; align-items:stretch; gap:6px; flex-wrap:nowrap; overflow-x:auto;}
.fn-node{flex:1; min-width:84px; background:var(--bg2); border:1px solid var(--line); border-radius:var(--radius-sm);
  padding:10px 8px; text-align:center;}
.fn-v{font-size:18px; font-weight:700; color:var(--text); line-height:1.1;}
.fn-t{font-size:10.5px; color:var(--muted); margin-top:3px; white-space:nowrap;}
.fn-node.fn-sum{background:var(--accent-soft); border-color:var(--accent-bd);}
.fn-node.fn-sum .fn-v{color:var(--h-9ec5ff);}
.fn-arr{align-self:center; color:var(--faint); font-size:13px; flex-shrink:0;}

.proj-block{max-width:860px; margin:0 auto 16px;}
.pb-h{display:flex; align-items:baseline; gap:10px; margin-bottom:10px;}
.pb-t{font-weight:600; font-size:14px;}
.pb-act{margin-left:auto; background:transparent; border:1px solid var(--line2); color:var(--muted);
  font:inherit; font-size:12px; padding:5px 11px; border-radius:var(--radius-sm); cursor:pointer; transition:.15s;}
.pb-act:hover{border-color:var(--accent-bd); color:var(--h-cfe0ff); background:var(--accent-soft);}
.psecs{max-width:none; margin:0;}
/* мини-дропзона когда уже есть файлы */
.intake-drop.intake-mini{padding:12px 16px; flex-direction:row; gap:10px; max-width:none;}
.intake-drop.intake-mini .intake-ic{font-size:18px;}
.intake-drop.intake-mini .intake-d{display:none;}
.intake-drop:not(.intake-mini){max-width:none;}

/* дерево проекта */
.ptree{display:flex; flex-direction:column; gap:10px; margin-top:12px;}
.pt-obj{background:var(--panel2); border:1px solid var(--line); border-radius:var(--radius-sm); overflow:hidden;}
.pt-obj-h{display:flex; align-items:center; gap:8px; padding:11px 14px; background:var(--panel3);
  border-bottom:1px solid var(--line); font-weight:600; font-size:13px;}
.pt-oic{font-size:14px;}
.pt-disc{border-bottom:1px solid var(--line);}
.pt-disc:last-child{border-bottom:none;}
.pt-disc-h{display:flex; align-items:center; gap:10px; padding:9px 14px; background:var(--bg2);}
.pt-dn{flex:1; font-size:12.5px; font-weight:500; color:var(--h-cfe0ff);}
.pt-nrsp{font-size:11px; color:var(--faint); white-space:nowrap;}
.pt-cnt{font-size:11px; color:var(--muted); background:var(--panel); border:1px solid var(--line);
  padding:2px 9px; border-radius:20px; white-space:nowrap;}
.pt-files{padding:4px 14px 8px;}
.pt-file{display:flex; align-items:center; gap:10px; padding:6px 0; border-bottom:1px solid var(--line);}
.pt-file:last-child{border-bottom:none;}
.pt-fn{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  font-family:ui-monospace,Menlo,monospace; font-size:11px; color:var(--muted);}
.pt-other-h{margin-top:18px; font-weight:600; font-size:13px; color:var(--muted);}

/* ── прод-мерж 01.07 (кнопки Создать/Проекты, попап «Работы», раскладка 2eng) — deploy 05.07 ── */
.layout-2eng{grid-template-columns:minmax(380px,480px) minmax(0,1fr);}  /* дерево (расширено по Зульфии) | широкая смета (окно «Работы» — всплывашка) */
.tree-extra{margin:0 14px 8px; font-size:13px;}
.workpop{position:fixed; left:360px; top:84px; width:480px; max-width:92vw; height:calc(100vh - 140px); max-height:760px; z-index:60;
  display:flex; flex-direction:column; background:var(--panel); border:1px solid var(--line2);
  border-radius:var(--radius); box-shadow:0 20px 60px rgba(0,0,0,.6); overflow:hidden;}
.workpop.hidden{display:none !important;}
.workpop .work-panel{flex:1 1 auto; height:auto; min-height:0; border:0; border-radius:0; box-shadow:none;}
/* привязка ручной сметы к подобъекту (29.07) — над сеткой полей, она их и заполняет */
.cr-bind{display:flex;flex-direction:column;gap:4px;margin-bottom:14px;padding-bottom:13px;
  border-bottom:1px solid var(--line)}
.cr-bind>span{font-size:11.5px;color:var(--muted)}
.cr-bind>span small{display:block;font-size:10.5px;color:var(--faint);margin-top:2px}
.cr-bind select{background:var(--bg2);border:1px solid var(--line2);border-radius:8px;
  color:var(--text);padding:7px 9px;font-size:13px;font-family:inherit;outline:none;width:100%}
.create-grid{display:grid;grid-template-columns:1.7fr 1fr;gap:11px 14px;margin-bottom:14px}
.create-grid label{display:flex;flex-direction:column;gap:4px;min-width:0}
.create-grid label span{font-size:11.5px;color:var(--muted)}
.create-grid input{background:var(--bg2);border:1px solid var(--line2);border-radius:8px;
  color:var(--text);padding:7px 9px;font-size:13px;font-family:inherit;outline:none;width:100%}
.create-grid input:focus{border-color:var(--accent,#2E75B6);box-shadow:0 0 0 2px rgba(46,117,182,.25)}
.create-grid .cr-s input{font-family:'Inter',system-ui,monospace}
.create-foot{display:flex;align-items:center;justify-content:space-between;gap:14px;
  border-top:1px solid var(--line);padding-top:12px}
.create-foot .muted{font-size:12px}
.proj-tree{display:flex;flex-direction:column;gap:1px}
.pj-grp{display:flex;align-items:center;gap:7px;padding:5px 8px;border-radius:7px;cursor:default;
  font-size:13px;color:var(--text);font-weight:600}
.pj-grp .pj-ic{opacity:.85}
.pj-grp .pj-code{font-size:11px;color:var(--faint);font-weight:500}
.pj-smeta{display:flex;align-items:center;gap:8px;padding:6px 9px;border-radius:7px;cursor:pointer;
  font-size:13px;color:var(--muted);border:1px solid transparent;transition:background .12s,border-color .12s}
.pj-smeta:hover{background:var(--panel2);border-color:var(--line2);color:var(--text)}
.pj-smeta .pj-n{font-size:11px;color:var(--h-9ec5ff);font-weight:600;flex:0 0 auto}
.pj-smeta .pj-nm{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pj-smeta .pj-meta{font-size:10.5px;color:var(--faint);flex:0 0 auto}
.pj-empty{color:var(--faint);text-align:center;padding:24px}
.pj-unassigned{margin-top:12px;padding-top:10px;border-top:1px dashed var(--line2)}
.pj-unassigned .pj-h{font-size:11.5px;color:var(--faint);text-transform:uppercase;letter-spacing:.4px;margin:0 0 6px 2px}
.smeta-tools .tb-create{ --pulse:rgba(120,200,140,.55); color:var(--h-a6e7bd); }   /* создать смету/проект */
.smeta-tools .tb-proj{ --pulse:rgba(232,200,120,.5); color:var(--h-ecd089); }      /* проекты */

textarea{width:100%; font:inherit; color:var(--text); background:var(--panel2); border:1px solid var(--line2);
  border-radius:var(--radius-sm); padding:9px 12px; outline:none; transition:.15s; resize:vertical;}
textarea:focus{border-color:var(--accent-bd); box-shadow:0 0 0 3px var(--accent-soft);}
textarea::placeholder{color:var(--faint);}

/* вопросник элемента (A22): плашка + модал */
.qz-card{max-width:860px;}
.qz-body{display:flex; flex-direction:column; gap:10px;}
.qz-q{background:var(--panel2); border-radius:9px; padding:9px 12px;}
.qz-qt{font-size:12.5px; font-weight:600; color:var(--h-cfe0ff); margin-bottom:6px;}
.qz-src{font-weight:400; font-size:10.5px; color:var(--h-7ee2a8);}
.qz-answers{display:flex; flex-wrap:wrap; gap:6px;}
.qz-a{font-size:11.5px; padding:4px 10px; border-radius:8px; background:var(--panel);
  border:1px solid var(--line2); color:var(--muted); cursor:pointer; user-select:none;}
.qz-a:hover{border-color:var(--accent-bd);}
.qz-a.on{background:var(--ok-soft); border-color:var(--ok-bd); color:var(--h-7ee2a8);}
.qz-def{border-style:dashed; color:var(--h-9db4d8);}
.qz-skip{color:var(--faint);}
.qz-skip.on{background:var(--warn-soft); border-color:#d2992266; color:var(--h-e8c06a);}
.qz-leaf{font-size:12px; padding:2px 12px 8px; color:var(--text);}
.qz-leaf-none{color:var(--faint);}
.qz-leaf-open{color:var(--h-e8c06a);}
.qz-leaf-list{color:var(--h-9db4d8);}
.qz-foot{padding:8px 14px 12px; font-size:10.5px; border-top:1px solid var(--line);}

/* ── МОДАЛКА «ПОЗИЦИЯ» (блок 2, 26.07): один вход для правки всей цепочки строки ── */
.pm-card{width:min(880px,96vw);}
.pm-sec{border-top:1px solid var(--line); padding:14px 0;}
.pm-sec:first-child{border-top:0; padding-top:0;}
.pm-h{font-weight:600; font-size:13px; margin-bottom:10px;}
.pm-sub{font-weight:400; color:var(--muted); font-size:11px; margin-left:8px;}
.pm-g{display:grid; grid-template-columns:110px 1fr 110px 110px; gap:10px;}
.pm-f{display:flex; flex-direction:column; gap:4px;}
.pm-f>span{font-size:11px; color:var(--muted);}
.pm-wide{grid-column:span 1;}
.pm-in{background:var(--panel2); border:1px solid var(--line2); border-radius:6px;
       padding:7px 9px; color:var(--fg); font-size:13px; width:100%;}
.pm-in:focus{outline:none; border-color:var(--accent-bd);}
.pm-note{font-size:11px; color:var(--muted); margin-top:8px;}
.pm-raw{font-style:italic; opacity:.75;}
.pm-eng{color:var(--h-e0b86a);}
.pm-hc{color:#7a5b00; background:#FFE699; border:1px solid rgba(210,153,34,.55); border-radius:6px; padding:5px 8px; margin-bottom:8px; font-size:11.5px; cursor:help;}
.pm-pars{display:flex; flex-direction:column; gap:6px;}
.pm-par{display:grid; grid-template-columns:180px 1fr 28px; gap:8px; align-items:center;}
.pm-pdel{background:none; border:0; color:var(--muted); cursor:pointer; font-size:13px;}
.pm-pdel:hover{color:var(--h-e5534b);}
.pm-padd{margin-top:8px; background:none; border:1px dashed var(--line2); border-radius:6px;
         color:var(--muted); padding:5px 10px; cursor:pointer; font-size:12px;}
.pm-comp{margin-top:10px; padding:9px 11px; background:var(--panel2); border-radius:7px;
         border-left:2px solid var(--h-d29922);}
.pm-comp-h{font-size:11px; color:var(--muted); margin-bottom:6px;}

/* номер раздела/подраздела в гриде ВОР — вне редактируемого имени, чтобы правка имени
   не ломала нумерацию (в смете номера считались всегда, в гриде их не было) */
.vg-secnum{color:var(--muted); font-weight:500; margin-right:8px; font-size:11px;
  border:1px solid var(--line2); border-radius:4px; padding:1px 6px; white-space:nowrap;}
/* ★ №5 (28.07): размерность строки ВОР не сходится с измерителем нормы */
.vg-dimbad{color:var(--h-eccf86);}
/* ★ №3 (28.07): объём, который реально уйдёт в смету, прямо в карточке позиции */
.pm-vol{margin-top:6px;}
/* ★ №8 (28.07): разбор составных — родитель остаётся строкой документа, части идут под ним */
.vg-cmpkid{color:var(--h-9ec5ff);}
.vg-cmppar{opacity:.75;}
tr.vg-row td.vg-cmpkid{border-left:2px solid var(--h-9ec5ff);}
/* ★ №10 шаг 2 (28.07): состав нормы прямо в карточке — выбор расценки становится зрячим */
.pm-resbox{margin-top:8px;}
.pm-resgrp{margin:6px 0;}
.pm-resgrp>b{font-size:11.5px; color:var(--muted); text-transform:lowercase;}
.pm-resrow{display:flex; gap:8px; align-items:baseline; font-size:11.5px; padding:2px 0; border-bottom:1px solid var(--line2);}
.pm-resrow.pm-resx{color:var(--muted); opacity:.55; text-decoration:line-through;}   /* исключён оператором */
.pm-resnm{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
.pm-resu{color:var(--muted); white-space:nowrap;}
.pm-resn{color:var(--faint); font-variant-numeric:tabular-nums; min-width:52px; text-align:right;}
.pm-resk{color:var(--h-9ec5ff); font-variant-numeric:tabular-nums; min-width:62px; text-align:right;}

/* ★ 29.07 (Отабек): «Цикл: …» и «Отменить цикл» — одна пара, значит один размер и одна форма.
   Было: pill разъезжался в три строки (66px высоты), кнопка 26px, скругления 999px против 10px. */
#cycleInd, #cycleCancelBtn{
  height:28px; box-sizing:border-box; display:inline-flex; align-items:center; justify-content:center;
  padding:0 12px; font-size:12px; line-height:1; border-radius:999px;
  white-space:nowrap; flex-shrink:0; align-self:center;
}

/* ★ 29.07 (Отабек): «ИИ включён» и «← в Проект» — пара в одной строке, значит один размер.
   Было 24 px против 38 px и скругления 11px против 10px. Тот же приём, что для пары в шапке. */
#vorAiState, #vorBackProj{
  height:30px; box-sizing:border-box; display:inline-flex; align-items:center; justify-content:center;
  padding:0 12px; font-size:12px; line-height:1; border-radius:999px;
  white-space:nowrap; flex-shrink:0; align-self:center;
}

/* ═══ ОБЩЕЕ ПРАВИЛО (★ 29.07, Отабек): НИГДЕ НЕ ОБРЕЗАТЬ ТЕКСТ ═══════════════════════════════
   Сметчик отличает нормы и ресурсы по ХВОСТУ названия: «…толщиной 32-40 мм iv сорта»,
   «…по камню и бетону потолков», «100 м² окрашиваемой поверхности». Многоточие срезало ровно
   тот признак, по которому принимается решение, — и оператор был вынужден лезть в подсказку.
   Поэтому: имена, описания и любые смысловые подписи ПЕРЕНОСЯТСЯ, а не усекаются.
   Исключения оставлены осознанно и перечислены ниже — там перенос вредит: числа, коды, единицы,
   ярлыки вкладок и кнопки, где разрыв строки ломает вёрстку. */
.nrow .ndesc, .secrow .seclbl, #normaReaderTitle, .vor-meta .vm-name, .vg-map-vid, .tw-nm,
.vg-cand-vid, .proj-li-sub, .pv-title, .pv-sub, .tg-name, .tg-obj, .pt-fn,
.pj-smeta .pj-nm, .val-log-nm, .pm-resnm, .vg-cand-nm, .tw-leaf .tw-nm, .tw-pos .tw-nm{
  overflow:visible; text-overflow:clip; white-space:normal; overflow-wrap:break-word; word-break:normal; hyphens:none;
}
/* ячейки таблицы ВОР: наименование, вид работ, примечание — только перенос, без усечения */
td.vc-name, td.hi, td.vc-note, .rlab, .vpop-i, .pm-note, .vg-cand-l1, .vg-cand-l2{
  white-space:normal; overflow-wrap:break-word; word-break:normal; hyphens:none; text-overflow:clip;
}
/* исключения: перенос вредит — числа, коды, единицы, ярлыки */
.vc-num, .vc-unit, .vg-mono, .tw-code, .tw-izm, .vg-cand-shifr, .vc-n, .vc-type,
.tab, .btn, .vg-act, .pill, #cycleInd, #cycleCancelBtn, #vorAiState, #vorBackProj{
  white-space:nowrap;
}

/* ★ 29.07 (Отабек: «нажимаешь расценку, список уходит влево»).
   Список кандидатов занимал всю ширину таблицы (шире экрана), и при горизонтальной прокрутке
   его левый край уезжал за пределы видимой области — названия норм читались с середины слова.
   Держим содержимое в видимой области: липкий блок слева, ширина по окну прокрутки. */
/* ★★ 29.07, четвёртая итерация (Отабек): выбор расценки — ОКНО ПО ЦЕНТРУ, фон блюрится,
   решение фиксируется кнопкой «Применить». Прежние правила (.vg-candstick / .vg-candcell /
   .vg-candrow / .vg-candpop) не используются: ни строки в гриде, ни поповера у края больше нет.
   Выбор расценки — не мимолётное действие: оператор читает пять длинных наименований и
   сравнивает их, поэтому окно крупное и не закрывается от случайного клика мимо. */
.cand-modal{backdrop-filter:blur(7px); -webkit-backdrop-filter:blur(7px); background:rgba(5,8,12,.62);}
.cand-card{width:min(860px, 94vw); max-height:84vh;}
.cand-ttl{min-width:0;}
.cand-ttl h2{font-size:16px;}
.cand-sub{color:var(--muted); font-size:12.5px; line-height:1.35; margin-top:3px;}
.cand-cnt{color:var(--faint); font-size:11px; margin-top:3px;}
.cand-body{padding:10px 12px;}
.cand-body .vg-cand{padding:11px 12px; border-radius:9px; margin-bottom:6px; font-size:12.5px;
  border:1px solid var(--line); background:var(--panel2);
  transition:background .12s, border-color .12s;}
.cand-body .vg-cand:last-child{margin-bottom:0;}
.cand-body .vg-cand:hover{border-color:var(--line2); background:var(--line);}
.cand-body .vg-cand.sel{background:var(--accent-soft); border-color:var(--accent-bd);}
.cand-body .vg-cand-pick{font-size:14px; line-height:1.3; color:var(--accent);}
.cand-body .vg-cand-nm{font-weight:500; font-size:13px;}
.cand-body .vg-cand-l2{font-size:11px; margin-top:3px;}
.cand-body .vg-cand-sc{align-self:center; font-size:11.5px;}
.cand-body .vg-cand-tree{margin-top:9px; display:inline-flex; align-items:center;}

/* ═══ ШАПКА И ПАНЕЛИ: не разъезжаться на узком экране (★ 29.07, обход интерфейса) ═══════════
   На 980 px вкладки уходили в 2 строки, правая группа в 2, шапка панели ВОР — в 5 строк.
   Шапка обязана оставаться одной строкой: она — точка отсчёта для оператора, а прыгающая
   высота сдвигает всю таблицу под ней. */
.topbar{gap:12px; flex-wrap:nowrap;}
.tabs{flex-wrap:nowrap; margin-left:4px; gap:4px;}
.tabs .tab{padding:6px 10px; font-size:12.5px;}
.topbar-right{flex-wrap:nowrap; gap:8px; min-width:0;}
.brand{flex-shrink:0;}
@media (max-width:1200px){ .brand-sub{display:none;} }          /* подпись бренда — первой под нож */
@media (max-width:1080px){ .brand-name{font-size:14px;} .tabs .tab{padding:5px 8px; font-size:12px;} }

/* шапка панели ВОР: реквизиты в одну ленту, переносятся только при реальной нехватке */
.vor-res-panel .panel-head{flex-wrap:nowrap; align-items:center; gap:10px; min-width:0;}
.vor-ctx{flex:1 1 auto; min-width:0; flex-wrap:wrap; row-gap:2px;}
.vor-res-panel .panel-sub{white-space:normal;}
/* правая группа шапки: имя оператора сжимается, кнопки — нет */
.topbar-right .operator{overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:160px;}
@media (max-width:1100px){ .topbar-right .operator{max-width:96px;} }
/* вертикальное выравнивание в шапках: элементы стояли вразнобой (разброс до 10 px) */
.topbar-right > *{align-self:center;}
.panel-head{align-items:center;}
.panel-head > *{align-self:center;}

/* ── ИНСТРУКЦИЯ ВКЛАДКИ (сворачиваемая) ★ 21.08 ──────────────────────────────────
   Единый паттерн: <div class="tab-help" data-help="ключ"> в любой вкладке. Развёрнута
   по умолчанию (новый пользователь / комиссия видит), свёрнутость запоминается в
   localStorage по ключу — опытному оператору не мешает. */
.tab-help{margin:0 0 14px; border:1px solid var(--accent-bd); border-left:3px solid var(--accent);
  border-radius:var(--radius-sm); background:var(--accent-soft); overflow:hidden;}
.tab-help-toggle{display:flex; align-items:center; gap:9px; width:100%; text-align:left;
  background:none; border:none; color:var(--text); font:inherit; font-weight:600; font-size:13.5px;
  padding:10px 13px; cursor:pointer;}
.tab-help-toggle:hover{background:rgba(59,130,246,.06);}
.tab-help-ic{display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px;
  border-radius:50%; background:var(--accent); color:#fff; font-size:12px; font-weight:700; flex:none;}
.tab-help-title{flex:1;}
.tab-help-chev{color:var(--muted); font-size:12px; transition:transform .18s;}
.tab-help[data-collapsed="1"] .tab-help-chev{transform:rotate(-90deg);}
.tab-help[data-collapsed="1"] .tab-help-body{display:none;}
.tab-help-body{padding:2px 15px 13px 40px;}
.tab-help-what{margin:0 0 9px; color:var(--muted); font-size:12.8px; line-height:1.55;}
.tab-help-steps{margin:0; padding-left:18px; display:flex; flex-direction:column; gap:5px;}
.tab-help-steps li{font-size:12.8px; line-height:1.5; color:var(--text);}
.tab-help-steps li b{color:var(--text); font-weight:600;}
.tab-help-steps li::marker{color:var(--accent); font-weight:700;}

/* растяжка инструкции на всю ширину в многоколоночных вкладках (Ядро/Инфо — грид .layout);
   одноколоночные (Проект/ВОР) держат плашку внутри своей секции, их это правило не касается */
.layout > .tab-help{grid-column:1 / -1; align-self:start;}
/* грид .layout по умолчанию растягивает строки поровну — плашка заняла бы пол-экрана.
   Где плашка прямой ребёнок грида: её строка по контенту, панели — весь остаток. */
.layout:has(> .tab-help){grid-template-rows:auto minmax(0,1fr);}
/* Визарды: вкладка = iframe; ставим инструкцию стопкой над ним (переопределяем грид .layout) */
#wizardView{display:flex; flex-direction:column; gap:14px;}
#wizardView > iframe{flex:1; min-height:0;}

/* ★ 24.08: селектор «чьи данные показывать» — виден только надзору (Отабек, Зульфия).
   Приглушён намеренно: это переключатель контекста, а не действие, и он не должен
   конкурировать за внимание с рабочими кнопками шапки. */
.scope-sel{
  background:var(--panel2); color:var(--muted); border:1px solid var(--line2);
  border-radius:6px; padding:4px 8px; font:inherit; font-size:12px;
  max-width:170px; cursor:pointer;
  /* ужимается сам, а не за счёт соседей: имя оператора в шапке важнее и резаться не должно */
  flex:0 1 auto; min-width:0;
}
.topbar-right .operator{flex-shrink:0;}
.scope-sel:hover{ border-color:var(--accent-bd); color:var(--text); }
.scope-sel:focus-visible{ outline:2px solid var(--accent); outline-offset:1px; }

/* ★ 24.08: поле числа с нечитаемым вводом. Раньше такой ввод исчезал молча — теперь виден. */
input.bad, input.qtyin.bad, input.qin.bad{ border-color:var(--err); background:var(--err-soft); }

/* ── ЗАГРУЗКА БАЗЫ СМЕТ: один вопрос про совпавшие номера + список сводок (★ 01.09) ── */
.dup-list{display:flex; flex-wrap:wrap; gap:6px; margin:4px 0 16px}
.dup-num{font-size:12px; padding:3px 9px; border-radius:4px; background:var(--panel3);
  border:1px solid var(--line2); color:var(--muted); font-variant-numeric:tabular-nums}
.dup-acts{display:flex; flex-direction:column; gap:8px}
.dup-acts .btn{justify-content:flex-start; text-align:left; padding:10px 14px}
.dup-acts .btn:first-child{border-color:var(--accent-bd)}
/* ★ 01.10 (P-042): окна совпадений и итога загрузки — таблица на 40+ строк: список прокручивается, кнопки на виду */
.modal-card.dup-card{width:min(980px,96vw)}
.dup-body{display:flex; flex-direction:column; gap:12px; overflow:hidden}
.dup-scroll{max-height:50vh; overflow:auto}
table.dup-tbl{margin-bottom:0}
table.dup-tbl td{overflow-wrap:anywhere}
table.dup-tbl td:first-child{white-space:nowrap}
.dup-sub{color:var(--faint); font-size:11.5px}
.dup-warn{color:var(--h-f08a8a,#f08a8a); font-size:11.5px}
.dup-left{margin:0 0 10px; padding:8px 12px; border:1px solid var(--accent-bd); border-radius:8px}
.dup-hint{margin-top:10px; font-size:12px}

.rep-tbl{width:100%; border-collapse:collapse; font-size:13px}
.rep-tbl th{text-align:left; font-weight:600; color:var(--muted); font-size:11px;
  text-transform:uppercase; letter-spacing:.03em; padding:6px 10px; border-bottom:1px solid var(--line)}
.rep-tbl td{padding:7px 10px; border-bottom:1px solid var(--line); vertical-align:middle}
.rep-tbl td.c{text-align:center; font-variant-numeric:tabular-nums}
.rep-tbl tr.rep-warn td:nth-child(4){color:var(--h-e0b341); font-weight:600}
.rep-tbl .btn{padding:4px 9px; font-size:12px}

/* ★ 01.09 — подстановка действующего шифра. Тон жёлтый по светофору движка: это не ошибка
   и не блокировка, а авто-обработка, которую оператор должен видеть и при желании сверить. */
.wsubst{font-size:11px; line-height:1.35; color:var(--h-e0b341); margin-top:3px; font-weight:400;
  text-transform:none; letter-spacing:0}
.wsubst b{color:var(--text); font-weight:600}

/* разделитель двух составляющих шапки: «наименование работ, наименование объекта» */
.lrvg-sep{color:var(--muted)}

/* ★ 03.09 (Зульфия, #515877): ресурс вне расценки без типа — шифр подсвечен, выбор ПО / ПМ прямо в ячейке */
table.lrvg td.typeask{background:rgba(245,179,66,.28);outline:1.5px solid rgba(224,167,43,.9);outline-offset:-2px;white-space:nowrap}
table.lrvg td.typeask .typepick{display:inline-flex;gap:3px;margin-left:8px;vertical-align:middle}
table.lrvg td.typeask .tpick{font:inherit;font-size:10.5px;font-weight:600;height:18px;padding:0 7px;border-radius:5px;border:1px solid var(--line2);background:var(--panel2);color:var(--text);cursor:pointer}
table.lrvg td.typeask .tpick:hover{border-color:var(--accent-bd);background:var(--accent-soft)}
/* ★ P-051 (В4-а): пометка «ПО» у строки ручного набора — тот же вид, что выбор типа; ячейку не подсвечиваем */
table.lrvg td .po-mark{display:inline-flex;gap:3px;margin-left:8px;vertical-align:middle}
table.lrvg td .po-mark .tpo{font:inherit;font-size:10.5px;font-weight:600;height:18px;padding:0 7px;border-radius:5px;border:1px solid var(--line2);background:var(--panel2);color:var(--text);cursor:pointer}
table.lrvg td .po-mark .tpo:hover{border-color:var(--accent-bd);background:var(--accent-soft)}

/* ══ ПОРТФЕЛЬ ПРОЕКТОВ — вкладка «Проект» (03.09, макет рев. 2.6). Цвета — токенами темы, без литералов. ══ */
.pf-bar{display:flex;align-items:center;gap:8px;padding:0 0 8px;flex-wrap:wrap}
.pf-bar .grid-filter{width:300px}
.pf-bar .pf-sep{width:1px;height:18px;background:var(--line2);margin:0 4px}
.pf-bar .pf-stats{margin-left:auto;font-size:12px;color:var(--faint);white-space:nowrap}
.pf-bar .pf-del{color:var(--h-f08a8a,#f08a8a)}
.pf-hint{font-size:11.5px;color:var(--faint);padding:0 0 8px}
.pf-wrap{overflow:auto;max-height:calc(100vh - 290px);padding-bottom:8px;width:100%}
.pf-bar,.pf-hint{width:100%}
table.pf{border-collapse:separate;border-spacing:0;font-size:12.5px;table-layout:fixed;width:auto;min-width:0;background:var(--panel);border:1px solid var(--line);border-radius:10px}   /* ★ 04.09: ширина = сумма колонок (см. PF_COLS), не 100% */
table.pf.vv-table{width:100%}
.pf-rz{position:absolute;top:0;right:0;width:7px;height:100%;cursor:col-resize;z-index:3;user-select:none}
.pf-rz:hover,.pf-rz.on{background:var(--accent-bd)}
table.pf th,table.pf td{border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:6px 10px;vertical-align:middle;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3;color:var(--text)}
table.pf th:last-child,table.pf td:last-child{border-right:0}
table.pf thead th{position:sticky;top:0;z-index:2;background:var(--panel3);color:var(--muted);text-align:left;font-weight:500;box-shadow:0 1px 0 var(--line2)}
table.pf tr.lvl0 td{background:var(--accent-soft);font-weight:600}
table.pf tr.smeta:hover td,table.pf tr.loose:hover td{background:var(--panel2)}
table.pf tr.sel td{background:var(--accent-soft)!important;box-shadow:inset 0 0 0 1px var(--accent-bd)}
table.pf tr.new td{color:var(--faint);font-style:italic}
/* ★ 10.09 (Отабек, пилот Адамташ): имена в реестре — КАПСОМ. Одно и то же имя приходит из
   разных файлов разным написанием («ЗДАНИЕ ЧРП-2» · «Здание ЧРП-2» · «ЗДАНИЕ ЧРП №2»): в узел
   Портфеля они склеиваются верно, но в колонке показывалась та запись, что попалась первой, —
   и реестр шёл вразнобой. Делаем ПОКАЗОМ, а не правкой данных: «КИПиА» в базе остаётся
   «КИПиА», выгрузки и документы берут имя как есть. */
table.pf td.nm{text-transform:uppercase}
table.pf td.nm .grp-n{text-transform:none}   /* «1 объект · 57 смет» — счётчик, а не имя */
table.pf td.nm .pf-in{text-transform:none}   /* правка имени показывает истинное значение */
table.pf td.ov{overflow:visible;position:relative}
table.pf td.ov .ovt{position:absolute;left:10px;top:0;bottom:0;display:flex;align-items:center;white-space:nowrap;padding-right:12px;background:var(--panel);z-index:1}
table.pf tr.lvl0 td.ov .ovt,table.pf tr.sel td.ov .ovt{background:transparent}
table.pf .ic{opacity:.85;margin-right:6px}
table.pf .cd{font-variant-numeric:tabular-nums;color:var(--accent);font-weight:600;font-size:11.5px}
table.pf td.code{font-variant-numeric:tabular-nums;color:var(--accent);font-weight:600;font-size:11.5px}
table.pf td.num{font-variant-numeric:tabular-nums;font-weight:600;text-align:center}
table.pf td.num.dup{color:var(--h-f08a8a,#f08a8a);text-decoration:underline wavy}
table.pf td.ts{font-size:11px;color:var(--faint)}
table.pf td.act{color:var(--faint);text-align:right}
table.pf td.act span{margin-left:8px;cursor:pointer}
/* P-034: переименование сметы — ✎ при наведении на название / № сметы и у выделенной строки */
table.pf tr.smeta td.nm,table.pf tr.loose td.nm,table.pf tr.smeta td.num,table.pf tr.loose td.num{position:relative;padding-right:24px}
table.pf .pf-pen{position:absolute;right:6px;top:50%;transform:translateY(-50%);visibility:hidden;cursor:pointer;color:var(--muted);font-weight:400;text-transform:none;text-decoration:none}
table.pf .pf-pen:hover{color:var(--accent)}
table.pf td:hover .pf-pen,table.pf tr.sel .pf-pen{visibility:visible}
table.pf .chev{display:inline-block;width:14px;color:var(--faint);cursor:pointer;margin-right:2px;font-size:11px}
table.pf .grp-n{font-size:10.5px;color:var(--faint);background:var(--panel3);border-radius:999px;padding:0 7px;margin-left:6px;font-weight:500}
table.pf .vorlink{color:var(--accent);font-weight:600;font-size:11.5px;cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}
table.pf td.vorempty{cursor:cell}
table.pf td.ed{outline:2px dashed var(--accent-bd);outline-offset:-3px;background:var(--panel2);padding:2px 6px}
table.pf .pf-in{width:100%;height:24px;font:inherit;font-size:12.5px;padding:0 6px;border:1px solid var(--accent-bd);border-radius:6px;background:var(--panel);color:var(--text)}
table.pf td[contenteditable]{cursor:text;outline:none}
table.pf td[contenteditable]:focus{outline:2px dashed var(--accent-bd);outline-offset:-3px;background:var(--panel2);color:var(--text);font-style:normal}
table.pf td[contenteditable]:empty:before{content:attr(data-ph);color:var(--faint);font-style:italic}
.pf-sec{font-size:11.5px;color:var(--faint);text-transform:uppercase;letter-spacing:.4px;margin:14px 0 8px 2px;padding-top:10px;border-top:1px dashed var(--line2);display:flex;align-items:center;gap:12px}
.pf-sec .pf-place{text-transform:none;letter-spacing:0;color:var(--h-f5b342,#f5b342);border-color:var(--h-f5b342,#f5b342)}
/* ★ 04.09 (Зульфия #515926): шапка Портфеля — интервалы между заголовком, инструкцией, кнопками и таблицей в 4 раза меньше */
.project-panel > .panel-head{padding:4px 16px}
.project-panel > .tab-help{margin:0 0 3px}
.project-panel > .tab-help .tab-help-toggle{padding:3px 13px}
.project-panel > .tab-help .tab-help-body{padding:2px 15px 6px 40px}
.project-panel .project-body:has(.pf-bar){padding:6px 16px 10px}
.pf-bar{padding:0 0 2px}
.pf-hint{padding:0 0 3px}
.pf-wrap{max-height:calc(100vh - 210px)}

/* ── вопрос «заменить / добавить новую» при сохранении из Ядра (03.09) ── */
table.tdiff{border-collapse:separate;border-spacing:0;width:100%;font-size:12.5px;border:1px solid var(--line);border-radius:8px;overflow:hidden;margin-bottom:12px}
table.tdiff th,table.tdiff td{padding:6px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;color:var(--text)}
table.tdiff th{background:var(--panel3);color:var(--muted);font-weight:500;font-size:11.5px}
table.tdiff tr:last-child td{border-bottom:0}
table.tdiff .was{color:var(--faint);text-decoration:line-through}
table.tdiff .now{background:var(--h-f5b342,#f5b342);color:#1f2a3a;border-radius:3px;padding:0 3px}
.tdiff-opts{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:12px}
.tdiff-opt{border:1px solid var(--line2);border-radius:10px;padding:10px 12px;background:var(--panel2);font-size:12.5px;color:var(--muted);line-height:1.5}
.tdiff-opt b{display:block;color:var(--text);margin-bottom:3px}
.tdiff-opt.pri{border-color:var(--accent-bd);background:var(--accent-soft)}
/* Портфель: в .project-body таблицы глобально переведены во flex (карточка проекта) — Портфелю нужна настоящая таблица */
#projectBody table.pf{display:table}
#projectBody table.pf colgroup{display:table-column-group}
#projectBody table.pf col{display:table-column}
#projectBody table.pf thead{display:table-header-group}
#projectBody table.pf tbody{display:table-row-group}
#projectBody table.pf tr{display:table-row}
#projectBody table.pf th,#projectBody table.pf td{display:table-cell;box-sizing:border-box}
.vor-ask-target{margin-top:8px;padding:8px 10px;border:1px solid var(--accent-bd);border-radius:8px;background:var(--panel);font-size:12.5px;color:var(--text)}
.vor-ask-target label{display:flex;align-items:center;gap:6px;margin-top:4px;cursor:pointer}
table.pf td.vorempty .vorhint{color:var(--faint);opacity:.55;font-size:11px}
table.pf tr:hover td.vorempty .vorhint{opacity:1;color:var(--accent)}

/* ══ БЛОК 3: «ВОР + Смета» на этапе расценок (макет «Смета по ВОР» рев. 2, принят 03.09). Один грид, одна прокрутка. ══ */
.vsg-wrap{overflow:auto;max-height:calc(100vh - 330px);border:1px solid var(--line);border-radius:10px;background:var(--panel)}
.vsg{display:grid;grid-template-columns:46px minmax(0,1fr) 62px 88px 220px 3px 46px 150px minmax(0,1fr) 78px 124px;font-size:12.5px;min-width:1180px}
.vsg > div{padding:6px 10px;border-bottom:1px solid var(--line);line-height:1.35;min-width:0;overflow-wrap:break-word;color:var(--text)}
.vsg > .cap{position:sticky;top:0;z-index:3;background:var(--panel2);padding:8px 14px 5px;border-bottom:0;display:flex;align-items:center;gap:10px;font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden}
.vsg > .cap .ttl{color:var(--text)}
.vsg-tg{font:inherit;font-size:11.5px;font-weight:500;padding:2px 10px;border-radius:999px;border:1px solid var(--line2);background:var(--panel);color:var(--muted);cursor:pointer;line-height:1.5}
.vsg-tg.on{color:var(--h-bcd3f0);background:var(--accent-soft);border-color:var(--accent-bd)}
.vsg-tg:hover{border-color:var(--accent-bd)}
.vsg > .cap.l{grid-column:1 / span 5} .vsg > .cap.rt{grid-column:7 / span 5}
.vsg > .cap .sub{font-weight:400;color:var(--muted);font-size:12px;white-space:nowrap;background:none;border:0;border-radius:0;margin:0;padding:0;overflow:visible}   /* общий .sub — плашка с рамкой; здесь просто текст */
.vsg > .cap .right{margin-left:auto;display:flex;align-items:center;gap:8px;font-weight:400;font-size:12px;color:var(--muted);white-space:nowrap}
.vsg > .th{position:sticky;top:36px;z-index:2;background:var(--panel2);color:var(--muted);font-weight:600;font-size:11.5px;padding:4px 10px 7px}
.vsg > .gut{padding:0;border-bottom:0;background:var(--line)}
.vsg > .gut.hi{background:var(--h-f5b342,#f5b342)!important}
.vsg > .gut.cap,.vsg > .gut.th{background:var(--panel2)}
.vsg .c{text-align:center} .vsg .r{text-align:right;font-variant-numeric:tabular-nums}
.vsg > .sec{grid-column:1 / -1;background:var(--accent-soft);font-weight:600;padding:6px 14px}
.vsg > .row{cursor:pointer}
.vsg > .row.hov,.vsg > .res.hov,.vsg > .ghost.hov{background:rgba(245,179,66,.14)!important}   /* ★ 03.09 (Отабек): трасса пары оранжевая — panel2 на тёмном не читалась */
.vsg > .gut.hov{background:var(--h-f5b342,#f5b342)}
.vsg > .hi{background:rgba(245,179,66,.26)!important}
.vsg > .hi.first{box-shadow:inset 3px 0 0 var(--h-f5b342,#f5b342)}
.vsg > .res{color:var(--muted);font-size:11.5px;padding:3px 10px;background:var(--panel3)}
.vsg > .res .norm{color:var(--faint);margin-right:6px;font-size:11px}
.vsg > .ghost{color:var(--faint);border-bottom:1px dashed var(--line2);background:repeating-linear-gradient(135deg,transparent 0 6px,rgba(127,127,127,.06) 6px 12px)}
.vsg > .dim{opacity:.35}
.vsg > .note{color:var(--muted);font-size:11.5px;cursor:text}
.vsg > .note:hover{box-shadow:inset 0 0 0 1px var(--accent-bd)}
.vsg .vin{width:100%;height:22px;padding:0 6px;border:1px solid var(--accent-bd);border-radius:6px;background:var(--panel);color:var(--text);font:inherit;font-size:11.5px}
.vsg .vin.r{text-align:right;font-variant-numeric:tabular-nums;font-size:12.5px}
.vsg .shifr{font-weight:600;color:var(--accent)}
.vsg .nf{color:var(--h-f08a8a,#f08a8a);font-weight:500}
.vsg mark{background:rgba(245,179,66,.55);color:inherit;border-radius:3px;padding:0 1px}
.vsg .wktools{display:inline-flex;gap:3px;margin-left:8px;vertical-align:middle;opacity:0;transition:.12s}
.vsg > .hov .wktools,.vsg > .hi .wktools{opacity:1}
.vsg .wktools button,.vsg .rtools button{font:inherit;font-size:11px;width:22px;height:22px;border-radius:6px;border:1px solid var(--line2);background:var(--panel2);color:var(--muted);cursor:pointer}
.vsg .wktools button:hover,.vsg .rtools button:hover{color:var(--text);border-color:var(--accent-bd)}
.vsg .rtools{display:inline-flex;gap:3px;margin-left:6px;vertical-align:middle;opacity:0}
.vsg > .res.hov .rtools,.vsg > .res.hi .rtools{opacity:1}
.vsg .qty{cursor:text;border-radius:6px}
.vsg .qty:hover{box-shadow:inset 0 0 0 1px var(--accent-bd)}
.vsg .pill{font-size:12px;color:var(--muted);background:var(--accent-soft);border:1px solid var(--accent-bd);padding:1px 9px;border-radius:999px;font-weight:500}
.vsg .pill.ok{color:var(--ok);border-color:var(--ok)}
.ps-opts label{display:flex;align-items:flex-start;gap:8px;padding:4px 0;font-size:12.5px;color:var(--text);cursor:pointer}
.ps-opts label input{margin-top:3px}
.ps-opts small{display:block;color:var(--faint);font-size:11.5px}
.vg-act.a3{background:var(--accent-soft);border-color:var(--accent-bd)}
.vg-pop-menu{display:flex;flex-direction:column;min-width:280px;background:var(--panel);border:1px solid var(--line2);border-radius:10px;box-shadow:var(--shadow,0 8px 24px rgba(0,0,0,.3));overflow:hidden}
.vg-pop-it{font:inherit;font-size:13px;text-align:left;padding:9px 14px;border:0;border-bottom:1px solid var(--line);background:none;color:var(--text);cursor:pointer}
.vg-pop-it:last-child{border-bottom:0} .vg-pop-it:hover{background:var(--panel2)}
.vg-link{font:inherit;font-size:11.5px;background:none;border:0;padding:0;color:var(--accent);cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}
.vv-ver{display:flex;gap:8px;margin-bottom:10px}
.vv-ver > div{flex:1;border:1px solid var(--line2);border-radius:10px;padding:8px 12px;font-size:12px;color:var(--muted);background:var(--panel2)}
.vv-ver > div.on{border-color:var(--accent-bd);background:var(--accent-soft)}
.vv-ver b{display:block;color:var(--text);font-size:12.5px}
#projectBody table.pf.vv-table,.modal table.pf.vv-table{display:table}
table.pf.vv-table th,table.pf.vv-table td{white-space:normal;overflow:visible;text-overflow:clip;vertical-align:top;font-size:12px}
table.pf.vv-table tr.sec td{background:var(--accent-soft);font-weight:600}
.vsg .ph{color:var(--faint);font-style:italic;font-size:11.5px}
.vsg .ph .vg-link{font-style:normal}

/* ★ 03.09 (учётка Зульфии): общее input{width:100%} растягивало радиокнопки в окнах ВОР/сохранения на всю ширину;
   таблица вида ВОР наследовала min-width Портфеля и резалась слева. */
.vor-ask-target input,.ps-opts label input{width:auto;flex:0 0 auto}
table.pf.vv-table{min-width:0}

/* ★ 04.09: «запомнить вход» на экране входа; input{width:100%} общий — галочке width:auto */
.login-remember{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--muted);margin:2px 0 12px;cursor:pointer;user-select:none}
.login-remember input{width:auto;margin:0}

/* ★ 04.09: метка и панель лога импорта (вариант 1 Отабека) */
.smeta-tools .tb-log{font-size:11px;padding:0 10px;height:24px;width:auto;min-width:0;border-radius:999px;color:var(--muted);border-color:var(--line2);white-space:nowrap;flex:none}
.smeta-tools .tb-log.hot{color:var(--h-f5b342,#f5b342);border-color:var(--h-f5b342,#f5b342)}
.ilog-head{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12.5px;color:var(--text);margin-bottom:10px}
.ilog-head b{color:var(--muted);font-weight:500;margin-right:6px}
table.ilog tr.go{cursor:pointer} table.ilog tr.go:hover td{background:var(--panel2)}
table.ilog tr.hot td:first-child{box-shadow:inset 3px 0 0 var(--h-f5b342,#f5b342)}
table.ilog td.code{font-variant-numeric:tabular-nums;color:var(--accent);white-space:nowrap}
.ilog-preds{margin-top:10px;font-size:12px;color:var(--muted)} .ilog-preds ul{margin:4px 0 0 16px;padding:0}
#lrvgHost tr.hl-log td{background:rgba(245,179,66,.28)!important;transition:background .6s}

.pf-bar .pf-paste{color:var(--h-f5b342,#f5b342);border-color:var(--h-f5b342,#f5b342)}

/* ═══ ★ 04.09 (Отабек, макет «Фокус ВОР+Смета» 1б): ШАПКА ВОР В ОДНУ СТРОКУ 40 px ══════════════════════
   Слева действия этапа и поиск, в середине реквизиты на всё свободное место, справа сегмент «Проект | ВОР |
   Расценки», ИИ, «?», «⛶» и одна главная кнопка. Все контролы 28 px, радиус 8, кегль 12.5. Степпер (.vst),
   синий блок подсказки и подпись этапа сняты. */
.vor-res-panel .panel-head.vor-bar{padding:5px 10px 5px 12px; gap:6px 8px; min-height:40px; flex-wrap:wrap; overflow:visible;}   /* на широком экране — одна строка; на узком переносится, а не режется */
.vor-bar .vor-ttl{display:inline-flex; align-items:center; gap:6px; font-weight:600; font-size:13px; flex:0 0 auto; cursor:help;}
.vor-bar .vor-tools{display:inline-flex; align-items:center; flex:0 0 auto; min-width:0;}
.vor-bar .vgt{display:inline-flex; flex-wrap:nowrap; gap:6px; align-items:center; margin:0;}
.vor-bar .vg-act{font-size:12.5px; padding:0 9px; height:28px; border-radius:8px; line-height:1;}
.vor-bar .vg-act.ic{width:28px; padding:0; justify-content:center; font-size:13px;}
.vor-bar .vgt-find{gap:4px;}
.vor-bar .vg-find{height:28px; width:150px; padding:0 9px; border-radius:8px; font-size:12.5px; box-sizing:border-box;}
.vor-bar .vg-find:focus{width:260px;}
.vor-bar .vor-auto{margin-left:4px; font-size:11px; white-space:nowrap;}
.vor-bar .vor-foot-note{white-space:nowrap; font-size:11px;}
.vor-bar .vor-state-inline{margin-left:0; flex:0 0 auto;}
.vor-bar .vor-state-inline:empty{display:none;}
/* реквизиты: одна лента с разделителями, забирают всё свободное место; при нехватке — многоточие, сначала у шифра */
.vor-bar .vor-ctx{flex:1 1 120px; min-width:120px; margin:0; display:flex; flex-wrap:nowrap; gap:0 12px; align-items:center;
  padding:0 8px; height:24px; border-left:1px solid var(--line2); border-right:1px solid var(--line2); overflow:hidden;}
.vor-bar .vor-ctx:empty{border:0; padding:0;}
.vor-bar .vd-inl{min-width:0; flex:0 1 auto; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; align-items:center; font-size:12.5px;}
.vor-bar .vd-inl:nth-child(1){flex-shrink:.4;} .vor-bar .vd-inl:nth-child(3){flex-shrink:1.6;}
.vor-bar .vd-l{font-size:10.5px; text-transform:uppercase; letter-spacing:.04em; color:var(--faint);}
.vor-bar .vd-inl .ce{overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:100%; border-bottom-color:var(--line2);}
/* сегмент-контрол «Проект | ✓ ВОР | 2 Расценки» */
.vor-nav{flex:0 0 auto; display:inline-flex;}
.vseg-wrap{display:inline-flex; height:28px; padding:2px; border-radius:8px; background:var(--bg2); border:1px solid var(--line);}
.vseg{font:inherit; font-size:12.5px; font-weight:500; display:inline-flex; align-items:center; gap:6px; padding:0 10px; border:0; border-radius:6px;
  background:transparent; color:var(--muted); cursor:pointer; white-space:nowrap; line-height:1;}
.vseg:hover{color:var(--text);}
.vseg.active{background:var(--panel3); color:var(--text); box-shadow:0 1px 2px rgba(0,0,0,.35); cursor:default;}
.vseg-n{width:16px; height:16px; border-radius:50%; display:inline-flex; align-items:center; justify-content:center; font-size:10.5px; font-weight:600;
  border:1px solid var(--line2); color:var(--faint); font-style:normal;}
.vseg.active .vseg-n{background:var(--accent); border-color:var(--accent); color:#fff;}
.vseg.done .vseg-n{background:var(--ok); border-color:var(--ok); color:#fff;}
.vor-bar .vor-ai-state{height:28px; padding:0 9px; border-radius:8px; flex:0 0 auto; white-space:nowrap;}
.vor-bar .vor-ib{width:28px; height:28px; padding:0; font-size:13px; border:1px solid var(--line2); border-radius:8px; background:var(--panel2); color:var(--text); flex:0 0 auto;
  display:inline-flex; align-items:center; justify-content:center;}
.vor-bar .vor-ib:hover{background:var(--panel3);}
.vor-bar .vor-prim{flex:0 0 auto; display:inline-flex;}
.help-btn{font-weight:600;}
.vor-hot{display:none;}
/* без степпера и подсказки таблице отдана вся высота */
.vor-res-panel .vsg-wrap{max-height:calc(100vh - 152px); border:0; border-radius:0;}
.vor-res-panel .vorg-wrap{max-height:calc(100vh - 152px);}
@media (max-width:1180px){ .vor-bar .vor-ai-state{display:none;} .vor-bar .vg-find{width:130px;} }

/* ═══ ФОКУС-РЕЖИМ: ведомость и смета на весь экран (#app.vor-focus) ══════════════════════════════════════
   Верхняя панель прячется, строка шапки ВОР становится плавающим «островом» внизу по центру, реквизиты
   выезжают полоской, когда курсор у верхнего края. Выход — Esc, F или кнопка на острове. */
#app.vor-focus .topbar{display:none;}
#app.vor-focus .vor-layout{padding:0; gap:0;}
#app.vor-focus .vor-res-panel{border:0; border-radius:0; box-shadow:none;}
#app.vor-focus .vor-res-panel .panel-head.vor-bar{position:fixed; left:16px; right:16px; bottom:14px; margin:0 auto; z-index:70; width:max-content;
  max-width:calc(100vw - 32px); border:1px solid var(--line2); border-radius:14px; background:var(--float-bg); box-shadow:0 12px 40px rgba(0,0,0,.55); padding:6px 8px; min-height:44px; overflow:visible;}   /* без backdrop-filter/transform: они делают остров containing block для fixed-полоски реквизитов */
#app.vor-focus .vor-bar .vor-ttl{display:none;}
#app.vor-focus .vor-bar .vor-ctx{position:fixed; top:0; left:0; right:0; height:30px; z-index:69; border:0; border-bottom:1px solid var(--line);
  background:var(--panel); padding:0 16px; transform:translateY(-100%); transition:transform .18s ease; justify-content:flex-start;}
#app.vor-focus .vor-hot{display:block; position:fixed; top:0; left:0; right:0; height:10px; z-index:68;}
#app.vor-focus:has(.vor-hot:hover) .vor-bar .vor-ctx, #app.vor-focus .vor-bar .vor-ctx:hover, #app.vor-focus .vor-bar .vor-ctx:focus-within{transform:none;}
#app.vor-focus .vor-res-panel .vsg-wrap, #app.vor-focus .vor-res-panel .vorg-wrap{max-height:100vh; height:100vh;}
#app.vor-focus .vsg{padding-bottom:72px;}
#app.vor-focus .vor-grid{margin-bottom:72px;}

/* ═══ РУКОВОДСТВО: правая панель 400 px вместо синих блоков на вкладках (★ 04.09) ═══════════════════════ */
.manual{position:fixed; top:0; right:0; bottom:0; width:400px; max-width:92vw; z-index:75; display:flex; flex-direction:column;
  background:var(--panel); border-left:1px solid var(--line2); box-shadow:-20px 0 60px rgba(0,0,0,.45);}
.manual.hidden{display:none;}
.manual-hd{display:flex; align-items:center; gap:10px; padding:0 10px 0 16px; height:48px; border-bottom:1px solid var(--line); font-weight:600; color:var(--h-cfe0ff);}
.manual-hd .btn-icon{margin-left:auto;}
.manual-toc{display:flex; flex-wrap:wrap; gap:4px; padding:10px 14px; border-bottom:1px solid var(--line);}
.manual-tab{font:inherit; font-size:12px; padding:4px 10px; border-radius:7px; border:1px solid var(--line); background:var(--bg2); color:var(--muted); cursor:pointer;}
.manual-tab:hover{color:var(--text);}
.manual-tab.on{color:var(--text); background:var(--panel3); border-color:var(--line2); cursor:default;}
.manual-body{flex:1; overflow:auto; padding:14px 16px 20px; font-size:13px; color:var(--muted);}
.manual-body .manual-h{margin:0 0 10px; font-size:13.5px; font-weight:600; color:var(--text); line-height:1.4;}
.manual-body .tab-help-what{margin:0 0 10px;}
.manual-body .tab-help-steps{gap:6px;}
.manual-keys{display:grid; grid-template-columns:auto 1fr; gap:6px 12px; margin:0; font-size:12.5px;}
.manual-keys dt{font:inherit; font-size:11.5px; border:1px solid var(--line2); border-radius:4px; padding:0 7px; line-height:20px; color:var(--text); background:var(--bg2); justify-self:start; white-space:nowrap;}
.manual-keys dd{margin:0; color:var(--muted); line-height:20px;}
.manual-foot{padding:9px 16px; border-top:1px solid var(--line); font-size:11.5px; color:var(--faint);}
