/* styles.css — единый стиль [YT]|Proj.
   Вынесено из ui/app.html (Slice 2 атомизации). Все правила глобальны —
   работают независимо от того, когда экран инъектирован в DOM. */


/* ==================================================================
   Глобальные токены и компоненты (было в <head>)
   ================================================================== */
/* ═══════════════════════════════════════════════════════
   TOKENS
═══════════════════════════════════════════════════════ */
/* Единственный источник цвета приложения. Новые цвета — ТОЛЬКО из этого пула
   (нужен оттенок с прозрачностью → rgba(var(--X-rgb),.NN), новый цвет → сначала токен сюда).
   2026-07-13: --red/--cyan переименованы в --accent (имена врали: это блюрпл, не красный/бирюза);
   бирюзовый вынесен в --teal; login.html автономен и держит свою копию палитры. */
:root{
  /* Поверхности */
  --void:#040405;--plate:#0b0c0f;--plate-2:#101216;--plate-hi:#171a20;--plate-pop:#0d0f12;
  /* Линии и белёсая вуаль (wash) */
  --hair:rgba(200,222,235,.07);--hair-b:rgba(200,222,235,.11);--hair-hi:rgba(80,89,184,.45);
  --wash-rgb:200,222,235;
  /* Акцент — фирменный блюрпл */
  --accent:#535baa;--accent-2:#888dc2;--accent-deep:#222967;--accent-dim:#161a41;--accent-rgb:83,91,170;
  /* Ошибка — настоящий красный (failed, danger) */
  --err:#a8454d;--err-2:#bd5e66;--err-rgb:168,69,77;--err-2-rgb:189,94,102;
  /* Успех */
  --green:#488a5e;--green-2:#5ea877;--green-dim:#0a3320;--green-rgb:72,138,94;
  /* Ожидание / предупреждение */
  --amber:#9b7848;--amber-2:#c48f3c;--amber-dim:#3a2808;--amber-rgb:155,120,72;
  /* Бирюзовый — пилот/актуальность рендера */
  --teal:#38808a;--teal-rgb:56,128,138;
  /* Жёлтый «в разработке» (wip) */
  --gold:#b39c49;--gold-rgb:179,156,73;
  /* Фиолетовый — «предпросмотр без рендера»: соседний блюрплу, но заметно теплее его, чтобы
     единственная кнопка-действие в ряду не сливалась с акцентными рамками вокруг */
  --vio:#7d4fc4;--vio-2:#ab86e8;--vio-rgb:125,79,196;
  /* Текст */
  --bone:#eef2f5;--ash:#828d96;--ash-2:#49525a;
  --ui:'Archivo',sans-serif;--mono:'JetBrains Mono',monospace;
  --cut:9px;--sidebar:280px;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;overflow:hidden}
body{background:var(--void);color:var(--bone);font-family:var(--ui);-webkit-font-smoothing:antialiased;font-size:19.5px}
input[type=checkbox],input[type=radio]{accent-color:var(--accent)}

/* ── Видимый фокус для клавиатуры (2026-07-13): all:unset у кнопок убирал outline без замены —
   Tab-обход был полностью невидим. :focus-visible срабатывает ТОЛЬКО при клавиатурной навигации:
   кликам мышью рамка НЕ показывается.
   ВАЖНО: :is() (не :where!) + !important — в проекте ~40 компонентов с all:unset, объявленных
   ПОЗЖЕ этого правила (и ещё стили из JS-модулей): при равной специфичности all:unset стирал
   outline обратно. !important не убирать — фокус-рамка снова исчезнет. ── */
:is(button,[role=button],a,[tabindex]):focus-visible{outline:2px solid var(--accent-2) !important;outline-offset:2px}
/* В скролл-контейнере сайдбара (overflow-x:hidden) внешняя рамка клипуется по бокам — рисуем внутрь */
.nav-item:focus-visible,.nav-folder:focus-visible{outline-offset:-2px}

/* ── Fail-closed ролевой гейт (2026-07-13): [data-admin] скрыт ПО УМОЛЧАНИЮ, пока /auth/me не
   подтвердил роль (раньше — наоборот: видим и прятался после ответа → вспышка админки у оператора,
   а при сбое /auth/me админка оставалась видимой). Класс .is-admin на <body> ставит core.js.
   Исключения .can-pfiles здесь больше нет: право «preset_prompt_files» и сама ручная загрузка
   файлов промптов сняты 15.08.2026. ── */
body:not(.is-admin) [data-admin]{display:none}
/* ── «Мои каналы» доступны всем (2026-07-24, отдельного права «channels» больше нет). core.js
   ставит body.can-channels ВСЕМ не-админам. Nav-пункт «Мои каналы» (data-perm="channels") — всем
   не-админам (у админа свой пункт «Каналы» в «Администрации»). Блок «Привязка к каналу» в «Новом
   запуске» (data-channels-feat) — админ ИЛИ любой не-админ (можно привязать к видимому каналу). ── */
body:not(.can-channels) [data-perm="channels"]{display:none}
body:not(.is-admin):not(.can-channels) [data-channels-feat]{display:none}
/* ── «Режим YT Studio» (data-perm="ytstudio"): fail-closed, как channels. core.js ставит
   body.can-ytstudio админу и оператору с правом ytstudio. ── */
body:not(.can-ytstudio) [data-perm="ytstudio"]{display:none}
/* ── Правил `[data-perm="presets"]` и `[data-perm="kitgen"]` здесь БОЛЬШЕ НЕТ (16.08.2026):
   оба экрана открыты всем, гейтить нечего. От прав пресета осталось только одно — ПОЛНОТА ФОРМЫ
   ниже (can-manage-presets), и это разные вопросы: «пускать ли на экран» и «что на нём показать».
   ── Полнота редактора пресета. `data-pa-full` — блоки только для manage_presets (промты,
   машинный контракт, имя/описание, сохранение, создание); `data-pa-lite` — их замена в урезанном
   режиме. ⚠ ВЫБОР ДВИЖКА, КОПИЯ И ФОРМАТЫ ТЕМ ИЗ ЭТОГО СПИСКА ВЫШЛИ (19.08.2026): первое
   оставляло урезанного без кнопки «Поправить», второе — без своей ветки пресета, третье
   противоречило экрану «Идеи», который за форматом отправляет ровно сюда. Прячем ОТ ОТСУТСТВИЯ класса (fail-closed): пока /auth/me не
   ответил, полная форма не показывается. Настоящая защита — на бэкенде: урезанному пользователю
   промты не отдаются вовсе (routers/presets.py, `_lite`), CSS отвечает только за вид.
   ⚠ Селекторы прибиты к #screen-presets / #screen-preset-editor НЕ для красоты: сетка бенто
   объявлена через `#screen-preset-editor .nrg-bento{display:grid}` — правило с ID, и `display:none`
   без ID проигрывает ему по весу, то есть не скрывает ничего (проверено в браузере). ── */
body:not(.can-manage-presets) #screen-preset-editor [data-pa-full],
body:not(.can-manage-presets) #screen-presets [data-pa-full]{display:none}
#screen-preset-editor [data-pa-lite]{display:none}
/* `revert`, а не `block`: подменные подписи бывают и <div>, и <span> внутри заголовка —
   жёсткий block уронил бы span на свою строку. */
body:not(.can-manage-presets) #screen-preset-editor [data-pa-lite]{display:revert}
/* Плитка «Чем править» с 19.08.2026 видна ВСЕМ (без неё у урезанного не было кнопки запуска),
   поэтому растягивать `#pa-ai-tile` на всю ширину больше не нужно — правило снято.
   Осталась та же беда у «Тем роликов»: в урезанном режиме из двух плиток видна одна («Форматы
   тем»), и половина ряда пустует. Уже, чем 1081px, сетка сама сжимается до двух колонок и c2
   занимает всю ширину — там не трогаем, иначе span 4 в двухколоночной сетке наплодит
   implicit-колонок и уедет вбок. */
@media(min-width:1081px){
  body:not(.can-manage-presets) #screen-preset-editor #pa-fmt-tile{grid-column:span 4}
}
/* ⚠ Найдено при этой правке (11.08.2026), баг НЕ новый: общее правило `[data-admin]` весит
   меньше, чем `#screen-preset-editor .nrg-bento{display:grid}`, и блок «Доступ операторов»
   (с 20.08.2026 на его месте «Владелец», плюс кнопка «Удалить пресет») показывался non-admin
   оператору с manage_presets — с красной ошибкой 403 внутри, потому что ручка под админом.
   Чиним тем же приёмом — весом с ID, локально для этого экрана. ── */
body:not(.is-admin) #screen-preset-editor [data-admin]{display:none}

/* ── НОМЕР ПРОГОНА ЗАВОДА (.idchip, 16.08.2026) ─────────────────────────────────
   Один чип на все экраны: разбор канала, сборка пресета, темы, отдельная тема, бриф, правка
   пресета агентом, идея кабинета. Номер — это то, что человек переносит с экрана в карточку
   бага, и выглядеть он обязан везде одинаково: свои «покажем id» на каждом экране разъехались
   бы и по виду, и по поведению.
   Это КНОПКА, а не подпись: клик копирует (`fxRunChip` в core.js). Отсюда курсор и отклик на
   наведение — номер, который выделяют мышью по кускам, попадает в карточку с опечаткой.
   Глобально, БЕЗ префикса экрана: чип живёт и в оверлеях, которые висят прямо в <body>. ── */
.idchip{
  font-family:var(--mono);font-size:11px;letter-spacing:.02em;line-height:1.5;
  color:var(--ash-2);background:var(--void);border:1px solid var(--hair);border-radius:4px;
  padding:1px 6px;white-space:nowrap;font-variant-numeric:tabular-nums;
  cursor:pointer;transition:.14s;vertical-align:baseline;max-width:100%;overflow:hidden;
  text-overflow:ellipsis}
.idchip:hover{color:var(--bone);border-color:var(--hair-hi);background:var(--plate)}
.idchip:active{transform:translateY(1px)}
/* Вход в журнал («↺ прошлые») — намеренно ССЫЛКОЙ, а не кнопкой: рядом с номером стоит действие
   («скопировать»), и вторая кнопка того же веса спорила бы с ним за клик. Глобально по той же
   причине, что `.idchip`: ссылка живёт и на экране, и в оверлее, висящем прямо в <body>. */
.it-hist{font-family:var(--mono);font-size:11px;letter-spacing:.02em;color:var(--ash-2);
  background:none;border:0;padding:0;cursor:pointer;white-space:nowrap;text-decoration:underline;
  text-decoration-color:var(--hair-b);text-underline-offset:3px;transition:.14s}
.it-hist:hover{color:var(--bone);text-decoration-color:var(--hair-hi)}

/* ── Скроллбары: единый тонкий серо-полупрозрачный (WebKit + Firefox). Thumb «плавает» —
   прозрачная 3px-рамка + background-clip:padding-box. Наследуется на все прокручиваемые области.
   Скрыть у элемента → `scrollbar-width:none` + `<sel>::-webkit-scrollbar{display:none}`
   (как .nav-scroll / .chat-msgs / .worker-body). Тюнить локально — более специфичным селектором. ── */
:root{scrollbar-width:thin;scrollbar-color:var(--hair-b) transparent}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background-color:var(--hair-b);border:3px solid transparent;border-radius:8px;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background-color:rgba(var(--wash-rgb),.22)}
::-webkit-scrollbar-corner{background:transparent}

/* ═══════════════════════════════════════════════════════
   ATMOSPHERE
═══════════════════════════════════════════════════════ */
.atm{position:fixed;inset:0;pointer-events:none;z-index:0}
.atm.glow{background:
  radial-gradient(45% 28% at 50% -4%, rgba(var(--accent-rgb),.15), transparent 60%),
  radial-gradient(35% 25% at 14% 110%, rgba(var(--accent-rgb),.05), transparent 55%)}
.atm.vig{background:radial-gradient(140% 130% at 50% 20%, transparent 35%, rgba(0,0,0,.70) 100%)}
.atm.grain{opacity:.04;mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}

/* ═══════════════════════════════════════════════════════
   LAYOUT SHELL
═══════════════════════════════════════════════════════ */
.shell{position:relative;z-index:1;height:100%;display:grid;grid-template-rows:48px 1fr} /* нижний статусбар удалён — статус живёт в шапке (.hdr-sys) */
.body{display:grid;grid-template-columns:var(--sidebar) 1fr;min-height:0}

/* ═══════════════════════════════════════════════════════
   HEADER
═══════════════════════════════════════════════════════ */
.hdr{display:flex;align-items:center;border-bottom:1px solid var(--hair-b);background:linear-gradient(180deg,rgba(16,18,22,.9),rgba(11,12,15,.9));padding:0 16px;gap:14px}
.hdr-brand{display:flex;align-items:center;gap:9px;font-family:var(--mono);font-size:14.25px;letter-spacing:.1em;color:var(--bone);flex:none;width:calc(var(--sidebar) - 16px);white-space:nowrap;overflow:hidden}
.hdr-brand svg{animation:pulse 3s ease-in-out infinite;flex:none}
@keyframes pulse{0%,100%{filter:drop-shadow(0 0 5px rgba(var(--accent-rgb),.5))}50%{filter:drop-shadow(0 0 12px rgba(var(--accent-rgb),.9))}}
.hdr-brand b{color:var(--ash);font-weight:400;letter-spacing:.06em;font-size:11.25px}
/* Логотип [YT] из логина, уменьшенный под шапку */
.hdr-brand .yt-logo{position:relative;display:inline-flex;align-items:center;font-family:var(--mono);font-weight:700;font-size:20px;letter-spacing:.1em;line-height:1;color:var(--accent-2);user-select:none}
.hdr-brand .yt-logo .brk{color:var(--accent);opacity:.7}
.breadcrumb{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:15px;letter-spacing:.05em;color:var(--ash-2);flex:1;min-width:0}
.breadcrumb .bc-sep{color:var(--ash-2);opacity:.4}
.breadcrumb .bc-cur{color:var(--ash)}
.breadcrumb .bc-lnk{color:var(--ash-2);cursor:pointer;transition:.12s}
.breadcrumb .bc-lnk:hover{color:var(--bone)}

.hdr-right{display:flex;align-items:center;gap:10px;flex:none}
.user-chip{display:flex;align-items:center;gap:8px;padding:5px 11px;border:1px solid var(--hair-b);font-family:var(--mono);font-size:14.25px;letter-spacing:.08em;cursor:pointer;transition:.12s}
.user-chip:hover{border-color:var(--hair-hi)}
.user-chip .ua{width:20px;height:20px;border-radius:50%;background:linear-gradient(135deg,var(--accent-deep),var(--accent-dim));display:grid;place-items:center;font-size:13.5px;font-weight:700;color:var(--accent-2)}
.hdr-ico{all:unset;cursor:pointer;width:28px;height:28px;display:grid;place-items:center;border:1px solid var(--hair);color:var(--ash);font-size:19.5px;transition:.12s}
.hdr-ico:hover{border-color:var(--hair-hi);color:var(--accent-2)}

/* ═══════════════════════════════════════════════════════
   SIDEBAR NAV
═══════════════════════════════════════════════════════ */
.sidebar{border-right:1px solid var(--hair-b);display:flex;flex-direction:column;background:linear-gradient(180deg,rgba(10,11,14,.95),rgba(7,8,10,.95));overflow:hidden;padding:14px 10px}
.nav-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding-right:8px;scrollbar-width:none;-ms-overflow-style:none}
.nav-scroll::-webkit-scrollbar{display:none}
.nav-footer{flex:none;padding-top:2px;padding-right:8px}
.sidebar::-webkit-scrollbar{display:none}
.nav-sect{font-family:var(--mono);font-size:12px;letter-spacing:.2em;color:var(--ash-2);padding:10px 10px 6px;text-transform:uppercase;margin-top:4px}
.nav-sect:first-child{margin-top:0}
.nav-item{all:unset;cursor:pointer;display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:0;border:1px solid transparent;font-size:15px;letter-spacing:.04em;font-weight:600;color:var(--ash);width:100%;transition:.12s;position:relative;text-transform:uppercase;white-space:nowrap;overflow:hidden}
.nav-item .ni{font-family:var(--mono);font-size:18px;width:16px;text-align:center;flex:none;color:var(--ash-2);transition:.12s}
.nav-item:hover{color:var(--bone);background:rgba(var(--accent-rgb),.04);border-color:var(--hair)}
.nav-item:hover .ni{color:var(--accent-2)}
.nav-item.active{color:var(--bone);border-color:var(--hair-b);background:linear-gradient(90deg,rgba(var(--accent-rgb),.12),transparent)}
.nav-item.active::before{content:'';position:absolute;left:0;top:7px;bottom:7px;width:2px;background:var(--accent);box-shadow:0 0 8px var(--accent)}
.nav-item.active .ni{color:var(--accent-2)}
.nav-item .n-badge{margin-left:auto;flex:none;position:relative;z-index:1;font-family:var(--mono);font-size:12.75px;padding:2px 7px;background:var(--accent-dim);color:var(--accent-2);border:1px solid rgba(var(--accent-rgb),.2)}
/* ── Сворачиваемый сайдбар (иконочный режим): один рычаг --sidebar (280→64), класс .nav-collapsed
      на :root восстанавливается синхронным скриптом в <head> (без вспышки). Подписи и заголовки
      секций гаснут через font-size:0 (метки — голые текст-ноды, отдельного элемента под display:none
      нет), иконки центрируются, бейдж числа сжимается в точку. Тумблер живёт в шапке (.nav-toggle). ── */
.body{transition:grid-template-columns .18s ease}
.hdr-brand{transition:width .18s ease}
.nav-toggle{all:unset;cursor:pointer;width:28px;height:28px;display:grid;place-items:center;border:1px solid var(--hair);color:var(--ash);font-size:16px;transition:.12s;flex:none}
.nav-toggle:hover{border-color:var(--hair-hi);color:var(--accent-2)}
:root.nav-collapsed{--sidebar:64px}
:root.nav-collapsed .hdr-brand .yt-logo{display:none}
:root.nav-collapsed .sidebar{padding:14px 8px}
:root.nav-collapsed .nav-scroll{padding-right:0}
:root.nav-collapsed .nav-footer{padding-right:0}
:root.nav-collapsed .nav-item{font-size:0;gap:0;padding:9px 0;justify-content:center}
:root.nav-collapsed .nav-item .ni{font-size:18px}
:root.nav-collapsed .nav-sect{font-size:0;padding:8px 0 4px}
:root.nav-collapsed .nav-item .n-badge{position:absolute;top:3px;right:5px;margin:0;min-width:8px;width:8px;height:8px;padding:0;font-size:0;border-radius:50%;line-height:0;overflow:hidden}
/* ── оверлей «В разработке» поверх контент-области ── */
.wip-overlay{position:absolute;inset:0;z-index:60;background:rgba(4,4,5,.84);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px}
.wip-emoji{font-size:62px;line-height:1;animation:wipFloat 3s ease-in-out infinite;filter:drop-shadow(0 0 18px rgba(var(--gold-rgb),.4))}
.wip-text{font-size:clamp(34px,5vw,56px);font-weight:800;letter-spacing:.04em;color:var(--gold);text-transform:uppercase;text-align:center;text-shadow:0 0 30px rgba(var(--gold-rgb),.5);animation:wipPulse 2.2s ease-in-out infinite;margin:0}
.wip-text .wip-dots::after{content:'';animation:wipDots 1.6s steps(1) infinite}
.wip-sub{font-family:var(--mono);font-size:16.5px;letter-spacing:.16em;color:var(--ash-2);text-transform:uppercase}
@keyframes wipPulse{0%,100%{transform:scale(1);text-shadow:0 0 20px rgba(var(--gold-rgb),.38);opacity:.9}50%{transform:scale(1.05);text-shadow:0 0 50px rgba(var(--gold-rgb),.95);opacity:1}}
@keyframes wipFloat{0%,100%{transform:translateY(0) rotate(-5deg)}50%{transform:translateY(-14px) rotate(5deg)}}
@keyframes wipDots{0%{content:''}25%{content:'.'}50%{content:'..'}75%{content:'...'}}
.nav-sep{height:1px;background:var(--hair-b);margin:8px 0}
.nav-grow{flex:1}
.nav-item.danger{color:var(--ash-2)}
.nav-item.danger:hover{color:#8388bf;border-color:rgba(99,106,179,.2)}
.pa-code{font-family:var(--mono);font-size:12.75px;line-height:1.45;min-height:150px;resize:vertical;white-space:pre;overflow:auto;tab-size:2}
#pa-orchestrator{min-height:320px}
.pa-prow{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--hair-b);background:rgba(7,8,10,.5);font-size:14px}
.pa-card{padding:14px 16px;border:1px solid var(--hair-b);background:rgba(7,8,10,.4);margin-bottom:10px;display:flex;align-items:center;gap:14px;cursor:pointer;transition:.12s}
.pa-card:hover{border-color:var(--hair);background:rgba(var(--accent-rgb),.05)}
/* Чипы готовых значений (стиль карточек персонажей) — тот же язык, что .chip, но кликабельные */
.pa-chips{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:9px}
.pa-chip{padding:4px 11px;border:1px solid var(--hair-b);background:rgba(7,8,10,.5);color:var(--ash-1);font-size:12.5px;cursor:pointer;transition:.12s;white-space:nowrap}
.pa-chip:hover{border-color:var(--hair);color:var(--bone)}
.pa-chip.on{border-color:rgba(var(--accent-rgb),.5);background:rgba(var(--accent-rgb),.09);color:var(--bone)}
.pa-warn{margin-top:9px;padding:8px 11px;border:1px solid rgba(var(--accent-rgb),.3);background:rgba(var(--accent-rgb),.06);color:var(--bone);font-size:12.75px;line-height:1.5}
/* `.pa-langs` снят 15.08.2026 вместе с плиткой «Языки упаковки» в редакторе пресета: языки
   спрашивает карточка упаковки, и ряд селектов живёт там под своим `.lib-three`. */

/* ═══════════════════════════════════════════════════════
   MAIN CONTENT
═══════════════════════════════════════════════════════ */
.main{min-height:0;overflow:hidden;display:flex;flex-direction:column;position:relative}
/* Хост для лениво-инъектируемых экранов: display:contents — инъектированные .screen
   участвуют в flex-раскладке .main как прямые дети (роутинг/атомизация экранов). */
#screen-host{display:contents}
.screen{display:none;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}
.screen.active{display:flex;flex-direction:column}
.scr-pad{padding:20px 22px;flex:1}

/* ═══════════════════════════════════════════════════════
   SYSTEM STATUS (чип в шапке; заменил нижний статусбар)
═══════════════════════════════════════════════════════ */
.hdr-sys{position:relative;flex:none}
.hdr-status{all:unset;cursor:pointer;display:flex;align-items:center;gap:7px;padding:5px 10px;border:1px solid var(--hair);font-family:var(--mono);font-size:12.75px;letter-spacing:.06em;color:var(--ash);transition:.12s;white-space:nowrap}
.hdr-status:hover{border-color:var(--hair-hi);color:var(--bone)}
.hdr-status b{color:var(--ash);font-weight:700}
.hdr-status:hover b{color:var(--bone)}
.hdr-status .hs-cap{color:var(--ash-2)}
.hdr-status .led,.sys-pop .led{width:7px;height:7px;border-radius:50%;flex:none;background:var(--ash-2)}
.hdr-status .led.ok,.sys-pop .led.ok{background:var(--green);box-shadow:0 0 5px rgba(var(--green-rgb),.5)}
.hdr-status .led.warn,.sys-pop .led.warn{background:var(--amber);box-shadow:0 0 5px rgba(var(--amber-rgb),.5)}
.hdr-status .led.err,.sys-pop .led.err{background:var(--err-2);box-shadow:0 0 5px rgba(var(--err-rgb),.6)}
.sys-pop .led.run{background:var(--accent-2);box-shadow:0 0 5px rgba(var(--accent-rgb),.6)}
.hdr-status .led.off,.sys-pop .led.off{background:var(--ash-2);box-shadow:none}
.sys-pop{position:absolute;right:0;top:calc(100% + 8px);z-index:300;width:320px;background:var(--plate-pop);border:1px solid var(--hair-b);border-radius:8px;padding:12px 14px;box-shadow:0 12px 32px rgba(0,0,0,.55)}
.sys-pop .sp-hd{display:flex;align-items:baseline;gap:8px;font-size:15px;font-weight:700;color:var(--bone);margin-bottom:8px}
.sys-pop .sp-hd .ago{margin-left:auto;font-family:var(--mono);font-size:11.5px;font-weight:400;color:var(--ash-2)}
.sys-pop .sp-row{display:flex;align-items:center;gap:9px;padding:6px 0;font-size:14px;color:var(--ash);border-top:1px solid var(--hair)}
.sys-pop .sp-row b{color:var(--bone);font-weight:600}
.sys-pop .sp-row .st{margin-left:auto;font-family:var(--mono);font-size:11.5px;color:var(--ash-2)}
.sys-pop .sp-note{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);line-height:1.55;padding-top:6px;border-top:1px solid var(--hair)}

/* ═══════════════════════════════════════════════════════
   COMMON COMPONENTS
═══════════════════════════════════════════════════════ */

/* Section header */
.sect{margin-bottom:20px}
.sect-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.sect-hd h2{font-size:15px;letter-spacing:.2em;text-transform:uppercase;font-weight:800;color:var(--bone);display:flex;align-items:center;gap:9px}
.sect-hd h2::before{content:'';width:5px;height:5px;background:var(--accent);box-shadow:0 0 6px var(--accent);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);flex:none}
.sect-hd .sh-r{font-family:var(--mono);font-size:13.5px;letter-spacing:.06em;color:var(--ash-2)}
/* То же для «Настроек»: шеврон вплотную к заголовку (кнопка «↺ Обновить» остаётся справа) */
#screen-apikeys .sect-hd{cursor:pointer;user-select:none}
#screen-apikeys .sect-hd h2::after{content:'▾';font-family:var(--mono);font-size:12px;color:var(--ash-2);transition:transform .18s;flex:none;margin-left:2px}
#screen-apikeys .sect-hd.sect-collapsed h2::after{transform:rotate(-90deg)}
.sect-hidden{display:none !important}

/* Page title */
.page-title{font-size:24px;font-weight:800;letter-spacing:.04em;color:var(--bone);margin-bottom:4px}
.page-sub{font-family:var(--mono);font-size:14.25px;letter-spacing:.06em;color:var(--ash-2);margin-bottom:20px}

/* Status chips */
.chip{display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);font-size:12px;letter-spacing:.1em;padding:3px 9px;text-transform:uppercase;white-space:nowrap;font-weight:700}
.chip.run{color:var(--accent-2);border:1px solid rgba(var(--accent-rgb),.3);background:rgba(var(--accent-rgb),.06)}
.chip.ok{color:var(--accent-2);border:1px solid rgba(var(--accent-rgb),.25);background:rgba(var(--accent-rgb),.04)}
.chip.grn{color:var(--green);border:1px solid rgba(var(--green-rgb),.4);background:rgba(var(--green-rgb),.07)}
.chip.wait{color:var(--ash);border:1px solid var(--hair-b)}
.chip.err{color:var(--err-2);border:1px solid rgba(var(--err-rgb),.25);background:rgba(var(--err-rgb),.05)}
.chip.amber{color:var(--amber);border:1px solid rgba(var(--amber-rgb),.3);background:rgba(var(--amber-rgb),.05)}
.chip .chip-dot{width:5px;height:5px;border-radius:50%;flex:none}
.chip.run .chip-dot{background:var(--accent);box-shadow:0 0 5px var(--accent);animation:blink 1.4s steps(2,end) infinite}
.chip.ok .chip-dot{background:var(--accent)}
.chip.grn .chip-dot{background:var(--green)}
.chip.wait .chip-dot{background:var(--ash-2)}
.chip.err .chip-dot{background:var(--err-2)}
.chip.amber .chip-dot{background:var(--amber)}
@keyframes blink{50%{opacity:.2}}

/* Progress bar */
.pbar{height:3px;background:var(--plate-hi);border-radius:0;overflow:hidden}
.pbar .pb{height:100%;background:linear-gradient(90deg,var(--accent),var(--accent-2));box-shadow:0 0 6px rgba(var(--accent-rgb),.5);transition:width .4s}
.pbar.cyan .pb{background:linear-gradient(90deg,var(--accent-deep),var(--accent));box-shadow:0 0 6px rgba(var(--accent-rgb),.4)}
.pbar.green .pb{background:linear-gradient(90deg,var(--green-dim),var(--green));box-shadow:0 0 6px rgba(var(--green-rgb),.4)}

/* Buttons
   `all:unset` сбрасывает и белый-пробел, и нешринкуемость нативной кнопки: в тесном flex-ряду
   .btn ужимался (flex-shrink по умолчанию 1) и подпись ломалась пополам — «＋ ДОБАВИТЬ /
   ПОЛЬЗОВАТЕЛЯ» в две строки. Чинили это точечно инлайном (screens/settings.html), теперь
   правило одно на класс: подпись кнопки НЕ переносится, ширину кнопке даёт её текст.
   Кому нужна тянущаяся кнопка (`style="flex:1"` в pipeline) — инлайн перебивает это. */
.btn{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:7px;padding:9px 18px;border:1px solid var(--hair-b);font-size:15.75px;letter-spacing:.1em;text-transform:uppercase;font-weight:700;color:var(--ash);transition:.14s;white-space:nowrap;flex:none}
.btn:hover{border-color:var(--hair-hi);color:var(--bone);background:rgba(var(--accent-rgb),.04)}
.btn.primary{background:linear-gradient(180deg,var(--accent-2),var(--accent-deep));border-color:var(--accent);color:#fff;box-shadow:0 0 12px rgba(var(--accent-rgb),.35);padding:10px 22px}
.btn.primary:hover{box-shadow:0 0 22px rgba(var(--accent-rgb),.6);background:linear-gradient(180deg,#6a71c2,#101da5)}
.btn.sm{padding:6px 12px;font-size:13.5px}
.btn.ghost{border-color:transparent;color:var(--ash-2)}
.btn.ghost:hover{border-color:var(--hair-b);color:var(--ash)}
.btn.cyan{border-color:var(--accent-deep);color:var(--accent-2);background:rgba(var(--accent-rgb),.04)}
.btn.cyan:hover{background:rgba(var(--accent-rgb),.08);box-shadow:0 0 10px rgba(var(--accent-rgb),.2)}
/* Семантические варианты (2026-07-13): вместо инлайн-перекрасок кнопок */
.btn.success{background:var(--green);border-color:var(--green);color:#07140f;font-weight:800}
.btn.success:hover{background:var(--green-2);border-color:var(--green-2)}
.btn.danger{color:var(--err-2);border-color:rgba(var(--err-2-rgb),.5);background:rgba(var(--err-rgb),.06)}
.btn.danger:hover{background:rgba(var(--err-rgb),.16);border-color:var(--err-2);color:var(--bone)}
.btn.warn{color:var(--amber-2);border-color:rgba(var(--amber-rgb),.35)}
.btn.warn:hover{background:rgba(var(--amber-rgb),.12);border-color:var(--amber-2)}
.btn .bi{font-size:21px}

/* Input */
.inp-wrap{margin-bottom:14px}
.inp-lbl{font-family:var(--mono);font-size:12.75px;letter-spacing:.14em;color:var(--ash-2);text-transform:uppercase;margin-bottom:6px;display:flex;justify-content:space-between}
.inp-lbl span{color:var(--ash)}
.inp{width:100%;background:var(--plate-2);border:1px solid var(--hair-b);color:var(--bone);font-family:var(--mono);font-size:16.5px;letter-spacing:.04em;padding:10px 13px;outline:none;transition:.14s;appearance:none}
.inp:focus{border-color:var(--accent);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.04)}
/* Поле с ошибкой валидации (.bad вешает JS до первого ввода); .csel-btn — видимый суррогат скрытого select */
.inp.bad,#screen-new-run .csel-btn.bad,#screen-ideas .csel-btn.bad{border-color:var(--err-2);box-shadow:inset 0 0 12px rgba(var(--err-rgb),.06)}
/* Тёмные числовые поля (цепочки моделей / настройки рана) — под стиль приложения */
input.chn-num{background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;color:var(--bone);font-family:var(--mono);font-size:15px;padding:3px 5px;text-align:center;outline:none;appearance:textfield}
input.chn-num:focus{border-color:var(--accent-2)}
.inp::placeholder{color:var(--ash-2)}
select.inp{cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23828d96'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center;padding-right:32px}

/* ══ .csel — КАСТОМНЫЙ ДРОПДАУН, база на всё приложение (§7 дизайн-системы) ══════════════════
   Нативный <select> не поддаётся стилю там, где он и виден: сам выпадающий список рисует ОС —
   белая панель, системный шрифт, чужие отступы. Поэтому список у нас всегда свой: настоящий
   <select> прячется (логика читает .value/.options и слушает `change`), а показываются
   .csel-btn + .csel-panel. Обёртку вешает сквозной проход `_cselSweep` в core.js — руками
   ничего звать не нужно.
   Этот блок — ОБЩИЙ. Поэкранные копии ниже (#screen-new-run, #screen-ideas,
   #screen-kitgen, #screen-runs/admin/presets, #screen-niche-finder, #set-wrap) появились раньше
   него и остаются как размерные варианты: они выигрывают специфичностью, поэтому вид тех экранов
   не меняется. Новые экраны своих копий заводить НЕ должны — только переопределять размеры. */
/* Ширина по умолчанию — по месту (список в строке инструментов не должен занимать всю строку).
   `.inp-wrap` — канонический контейнер поля формы, там дропдаун во всю ширину, как обычное поле. */
.csel{position:relative;display:inline-block;vertical-align:middle;width:auto;min-width:150px;max-width:100%}
.inp-wrap > .csel{width:100%}
.csel > select{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;margin:0;padding:0}
.csel-btn{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;
  background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;color:var(--bone);
  font-family:var(--mono);font-size:14px;letter-spacing:.04em;padding:8px 12px;cursor:pointer;
  transition:.14s;min-width:0}
.csel-btn:hover{border-color:var(--hair-hi)}
.csel-btn:focus-visible{border-color:var(--accent);outline:none}
.csel.open .csel-btn{border-color:var(--accent);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.06)}
.csel-btn.bad{border-color:var(--err-2);box-shadow:inset 0 0 12px rgba(var(--err-rgb),.06)}
.csel-btn.dis{opacity:.5;cursor:default}
.csel-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.csel-arrow{color:var(--ash-2);font-size:12px;flex:none;transition:transform .15s}
.csel.open .csel-arrow{transform:rotate(180deg);color:var(--accent-2)}
.csel-panel{position:absolute;z-index:60;top:calc(100% + 6px);left:0;min-width:100%;width:max-content;
  max-width:min(420px,90vw);background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;
  box-shadow:0 22px 50px -18px rgba(0,0,0,.85);padding:5px;max-height:300px;overflow-y:auto;display:none}
.csel.open .csel-panel{display:block}
.csel-opt{padding:8px 11px;border-radius:5px;font-family:var(--mono);font-size:13.5px;color:var(--ash);
  cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.1s}
.csel-opt:hover{background:rgba(var(--accent-rgb),.16);color:var(--bone)}
.csel-opt.sel{color:var(--accent-2)}
/* Недоступный пункт (движка нет в системе и т.п.) — виден, но не выбирается, как в нативном списке */
.csel-opt.dis{opacity:.4;cursor:default}
.csel-opt.dis:hover{background:none;color:var(--ash)}
/* Поиск по списку (`<select data-search>`, см. new-run.js). Липнет к верху панели: панель сама
   прокручиваемая (max-height 300px), и обычное поле уехало бы вверх вместе с пунктами — то есть
   пропало бы ровно тогда, когда список длинный и поиск нужен. */
.csel-search{position:sticky;top:-5px;z-index:1;display:block;width:100%;box-sizing:border-box;
  margin:-5px 0 5px;padding:8px 11px;background:var(--plate-2);border:0;border-bottom:1px solid var(--hair);
  border-radius:6px 6px 0 0;color:var(--bone);font-family:var(--mono);font-size:13.5px;outline:none}
.csel-search::placeholder{color:var(--ash-2)}
.csel-search:focus{background:var(--plate-hi);border-bottom-color:var(--accent)}

/* Slider */
.sl-wrap{margin-bottom:14px}
.sl-lbl{display:flex;justify-content:space-between;font-family:var(--mono);font-size:12.75px;letter-spacing:.08em;color:var(--ash);margin-bottom:8px}
.sl-lbl b{color:var(--accent-2)}
.sl-num{width:48px;padding:2px 4px;font-family:var(--mono);font-size:12.75px;text-align:center;color:var(--accent-2);background:rgba(0,0,0,.25);border:1px solid var(--plate-hi);border-radius:3px;outline:none}
.sl-num:focus{border-color:var(--accent)}
/* Gemini-запуск: иконка выбора файла (акцент), сворачивание, приглушённые имена моделей, удвоенные отступы */
.nrg-filebtn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid var(--accent);border-radius:6px;color:var(--accent);cursor:pointer;transition:.12s;flex:none}
.nrg-filebtn:hover{background:rgba(var(--accent-rgb),.14);border-color:var(--accent-2);color:var(--accent-2)}
.nrg-filebtn svg{display:block}
.nrg-filebtn.loaded{border-color:var(--green);color:var(--green)}
.nrg-filebtn.loaded:hover{border-color:var(--green);color:var(--green);background:rgba(var(--green-rgb),.14)}
.nrg-perf-row{display:flex;align-items:center;gap:12px;margin-bottom:8px}
.nrg-perf-row:last-child{margin-bottom:0}
.nrg-perf-lbl{flex:0 0 168px;font-family:var(--mono);font-size:13px;letter-spacing:.06em;text-transform:uppercase;color:var(--ash-2)}
.nrg-perf-row .sl-num{flex:0 0 52px;width:52px}
.nrg-perf-row .sl{flex:1 1 auto}
.nrg-fn{font-family:var(--mono);font-size:12.75px;color:var(--ash-2)}
.nrg-fn:not(:empty){display:flex;align-items:center;justify-content:center;gap:6px;margin-top:6px}
.nrg-fn-name{color:var(--green);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.nrg-fn-x{flex:none;cursor:pointer;color:var(--ash-2);font-weight:700;line-height:1;padding:0 2px}
.nrg-fn-x:hover{color:var(--accent-2)}
.nrg-files{display:flex;gap:14px;flex-wrap:wrap;align-items:flex-start;margin:2px 0 4px}
.nrg-file{flex:1 1 0;min-width:140px;text-align:center}
.nrg-file .nrg-file-name{font-size:13.5px;color:var(--ash);font-weight:600}
.nrg-file .nrg-file-name.nrg-folder-name{color:#a0a9b1}
.nrg-file .nrg-filebtn{margin:8px auto 0}
.nrg-file .nrg-fn{margin-top:6px;min-height:0;word-break:break-all}
/* Цепочка моделей: перетаскивание строк за «ручку» */
.chain-grip{display:inline-flex;align-items:center;cursor:grab;color:var(--ash-2);flex:none;padding:0 1px;transition:color .12s}
.chain-grip:hover{color:var(--ash)}
.chain-grip:active{cursor:grabbing}
.chain-row.chain-dragging{opacity:.4!important}
.chain-row.chain-dragover{box-shadow:inset 0 0 0 1px var(--accent-2)}
/* Чекбоксы «Остановиться после этапа» — тёмные (не белые системные квадраты), светлая обводка (видны на тёмном фоне), галка — блюрпл.
   ⚠ Тот же блок держит квадратики АНКЕТЫ КОНСТРУКТОРА (`.kg-chk`): правило одно на два экрана намеренно — копия разъехалась бы с оригиналом на первой правке. Круглые переключатели «да/нет» — ниже, у них своя метка. */
.nrg-stop input[type=checkbox],#screen-kitgen .kg-chk input[type=checkbox]{appearance:none;-webkit-appearance:none;width:16px;height:16px;flex:none;margin:0;cursor:pointer;border:1px solid rgba(var(--wash-rgb),.5);border-radius:4px;background:rgba(0,0,0,.35);position:relative;transition:.12s}
.nrg-stop input[type=checkbox]:hover,#screen-kitgen .kg-chk input[type=checkbox]:hover{border-color:var(--accent-2)}
.nrg-stop input[type=checkbox]:checked,#screen-kitgen .kg-chk input[type=checkbox]:checked{background:var(--accent);border-color:var(--accent)}
.nrg-stop input[type=checkbox]:checked::after,#screen-kitgen .kg-chk input[type=checkbox]:checked::after{content:'';position:absolute;left:4px;top:1px;width:5px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
/* Круглый переключатель «да/нет» анкеты — та же тёмная заливка и светлая обводка, метка — точка, а не галка: круг с галкой читался бы как испорченный чекбокс. */
#screen-kitgen .kg-yn-o input[type=radio]{appearance:none;-webkit-appearance:none;width:16px;height:16px;flex:none;margin:0;cursor:pointer;border:1px solid rgba(var(--wash-rgb),.5);border-radius:50%;background:rgba(0,0,0,.35);position:relative;transition:.12s}
#screen-kitgen .kg-yn-o:hover input[type=radio]{border-color:var(--accent-2)}
#screen-kitgen .kg-yn-o input[type=radio]:checked{background:var(--accent);border-color:var(--accent)}
#screen-kitgen .kg-yn-o input[type=radio]:checked::after{content:'';position:absolute;left:4px;top:4px;width:6px;height:6px;border-radius:50%;background:#fff}
.nrg-req{font-size:11px;color:var(--accent-2);font-weight:400}
.nrg-opt{font-size:11px;color:var(--ash-2);font-weight:400}
.nrb-head{cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:10px;user-select:none}
.nrb-head .nrb-chev{font-family:var(--mono);font-size:12px;color:var(--ash-2);transition:transform .15s;flex:none}
.nr-block.nrb-collapsed>:not(.nrb-head){display:none!important}
.nr-block.nrb-collapsed .nrb-chev{transform:rotate(-90deg)}
#nrg-ichain b,#nrg-vchain b{color:var(--ash)}
#screen-new-run .nr-scroll>.nr-block{margin-top:39px!important;padding-top:39px;border-top:1px solid var(--hair-b)}
#screen-new-run .nr-scroll>.nr-block:first-child{margin-top:0!important;padding-top:0;border-top:0}
/* ── Бенто-раскладка «Нового запуска» (стиль 03) ── */
#screen-new-run .nrg-grp-hd{font-family:var(--mono);font-size:12.75px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash-2);margin:28px 0 12px;display:flex;align-items:center;gap:12px}
#screen-new-run .nrg-grp-hd:first-child{margin-top:0}
#screen-new-run .nrg-grp-hd::after{content:'';flex:1;height:1px;background:var(--hair-b)}
#screen-new-run .nrg-bento{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
#screen-new-run #nrg-ichain input[type=number],#screen-new-run #nrg-vchain input[type=number]{background:rgba(0,0,0,.25);border:1px solid var(--plate-hi);color:var(--accent-2);border-radius:4px;outline:none;font-family:var(--mono)}
#screen-new-run #nrg-ichain input[type=number]:focus,#screen-new-run #nrg-vchain input[type=number]:focus{border-color:var(--accent)}
/* скругления текстовых полей/селектов на экране — как в макете */
#screen-new-run .inp{border-radius:6px}
/* нативный выпадающий список селектов — в тёмной теме */
#screen-new-run select.inp{color-scheme:dark}
/* Кастомный дропдаун (нативный список не скруглить/не убрать белую рамку) */
#screen-new-run .csel{position:relative;width:100%}
#screen-new-run .csel > select.inp{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;margin:0;padding:0}
#screen-new-run .csel-btn{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;color:var(--bone);font-family:var(--mono);font-size:16.5px;letter-spacing:.04em;padding:10px 13px;cursor:pointer;transition:.14s;min-width:0}
#screen-new-run .csel-btn:hover{border-color:var(--hair-hi)}
#screen-new-run .csel.open .csel-btn{border-color:var(--accent);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.06)}
#screen-new-run .csel-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#screen-new-run .csel-arrow{color:var(--ash-2);font-size:12px;flex:none;transition:transform .15s}
#screen-new-run .csel.open .csel-arrow{transform:rotate(180deg);color:var(--accent-2)}
#screen-new-run .csel-panel{position:absolute;z-index:60;top:calc(100% + 6px);left:0;right:0;background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;box-shadow:0 22px 50px -18px rgba(0,0,0,.85);padding:5px;max-height:280px;overflow-y:auto;display:none}
#screen-new-run .csel.open .csel-panel{display:block}
#screen-new-run .csel-opt{padding:9px 11px;border-radius:5px;font-family:var(--mono);font-size:15px;color:var(--ash);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.1s}
#screen-new-run .csel-opt:hover{background:rgba(var(--accent-rgb),.16);color:var(--bone)}
#screen-new-run .csel-opt.sel{color:var(--accent-2)}
/* мягче чистый bone на этом экране — «супер-белый», особенно жирный, бил по глазам */
#screen-new-run{--bone:#cbd2d7}
#screen-new-run b{font-weight:600}
/* единый спокойный тон подписей блока параметров */
#screen-new-run .nrg-opts b{color:#a8b0b6}
#screen-new-run #nrg-voice-id[readonly]{opacity:.6;cursor:not-allowed}
#screen-new-run .nrg-tile{background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:0 15px 15px;min-width:0}
#screen-new-run .nrg-tile.hl{border-color:var(--hair-hi);background:linear-gradient(160deg,rgba(var(--accent-rgb),.07),var(--plate-2))}
/* шапка плитки — как «шапка» дашборда (.db-ph h4): моно-капс 12.5/700, тонкая линия снизу
   во всю ширину (отриц. поля гасят гориз. padding плитки → бордюр full-bleed) */
#screen-new-run .nrg-t-hd{font-family:var(--mono);font-size:12.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--bone);margin:0 -15px 15px;padding:11px 15px;border-bottom:1px solid var(--hair);display:flex;align-items:center;gap:9px;flex-wrap:wrap}
/* var(--bone) = дашбордовый --bone (экран приглушает --bone до #cbd2d7, но заголовки держим яркими как на дашборде) */
#screen-new-run .nrg-t-hd .r{margin-left:auto;text-transform:none;letter-spacing:.03em;color:var(--ash-2);font-size:11px;font-weight:400}
/* геометрическая иконка-глиф с акцентом — как .db-ic на дашборде (--acc-2 = --red-2) */
#screen-new-run .nrg-t-hd .nrg-ic{color:var(--accent-2);font-size:14px;flex:none;line-height:1}
#screen-new-run .nrg-c1{grid-column:span 1}
#screen-new-run .nrg-c2{grid-column:span 2}
#screen-new-run .nrg-c3{grid-column:span 3}
#screen-new-run .nrg-c4{grid-column:span 4}
#screen-new-run .nrg-divhr{height:1px;background:var(--hair);margin:15px -15px}
/* крупнее шрифты внутри плиток — как в макете */
#screen-new-run .nrg-tile .inp-lbl{font-size:14px}
#screen-new-run .nrg-tile .sl-num{font-size:14.5px}
/* Формат кадра: превью забирает ВСЮ свободную высоту плитки (раньше сидело в коробке 98px, и под
   ним зиял пустой низ), но само высоту НЕ создаёт: `container-type:size` изолирует размер коробки
   от содержимого, поэтому ряд по-прежнему меряется соседом — «Источником сценария», а не этой
   плиткой (иначе пустой низ просто переезжал к соседу).
   Рамка вписывается в коробку по МЕНЬШЕЙ стороне: `min(100cqh, 56.25cqw)` — высота либо вся
   свободная, либо та, при которой 16:9 ещё влезает в ширину колонки. Отсюда и поведение:
   горизонтальная до краёв по ширине не доходит, зато 9:16 остаётся ровно той же высоты —
   переключение формата размер плитки не меняет.
   `max(98px, …)` — обязателен: на раскладках, где высоту плитки задаёт её же контент, а не ряд
   (≤1080px, плитка уезжает в свою строку), высота коробки перестаёт быть определённой и Chrome
   считает cq-единицы НУЛЁМ — без пола рамка схлопывалась в 4×2px. 98px — прежний фикс-размер. */
#screen-new-run #nrg-panel-aspect{display:flex;flex-direction:column}
#screen-new-run .nrg-fmt-wrap{flex:1;min-height:98px;container-type:size;position:relative;margin-top:12px}
#screen-new-run .nrg-frame{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);height:max(98px,min(100cqh,56.25cqw));width:auto;border:1px solid var(--hair-hi);border-radius:6px;background:linear-gradient(135deg,#171a2e,#0c0d16);display:grid;place-items:center;color:var(--ash);font-family:var(--mono);font-size:13px;overflow:hidden;transition:.2s}
#screen-new-run .nrg-frame::after{content:'';position:absolute;inset:0;background:radial-gradient(60% 50% at 50% 30%,rgba(var(--accent-rgb),.22),transparent 70%)}
#screen-new-run .nrg-frame span{position:relative;z-index:1}
#screen-new-run .nrg-f169{aspect-ratio:16/9}
#screen-new-run .nrg-f916{aspect-ratio:9/16}
/* ── Источник сценария: сегментный переключатель (Gemini · Claude) ── */
#screen-new-run .nrg-src-seg{display:grid;grid-template-columns:1fr 1fr;gap:8px}
#screen-new-run .nrg-src-opt{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px 10px;font-family:var(--mono);font-size:13.5px;font-weight:600;letter-spacing:.02em;color:var(--ash);background:var(--plate);border:1px solid var(--hair-b);border-radius:7px;cursor:pointer;transition:.14s}
#screen-new-run .nrg-src-opt:hover{color:var(--bone);border-color:var(--hair-hi)}
#screen-new-run .nrg-src-opt .nrg-sic{color:var(--ash-2);font-size:13px}
#screen-new-run .nrg-src-opt.active{color:var(--bone);background:var(--accent-dim);border-color:var(--accent)}
#screen-new-run .nrg-src-opt.active .nrg-sic{color:var(--accent-2)}
#screen-new-run .nrg-clrow{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:9px 0;border-bottom:1px solid var(--hair)}
#screen-new-run .nrg-clrow:last-of-type{border-bottom:0}
#screen-new-run .nrg-clk{font-family:var(--mono);font-size:11.5px;letter-spacing:.07em;text-transform:uppercase;color:var(--ash)}
#screen-new-run .nrg-clk-col{display:flex;flex-direction:column;gap:3px;min-width:0}
#screen-new-run .nrg-clsub{font-family:var(--mono);font-size:10.5px;letter-spacing:.01em;text-transform:none;color:var(--ash-2);font-weight:400;line-height:1.4;max-width:360px}
#screen-new-run .nrg-clv{font-family:var(--mono);font-size:13.5px;letter-spacing:.03em;color:#cbd2d7}
#screen-new-run .inp.nrg-mini{width:auto;min-width:240px;font-size:13.5px;padding:7px 30px 7px 11px}
/* «раздумья» — второй, узкий селект в строке шага (модель слева, раздумья справа) */
#screen-new-run .inp.nrg-mini.nrg-mini-th{min-width:186px}
/* .csel (кастомный дропдаун) в компактных строках Claude — не на всю ширину, как nrg-mini (авто-ширина справа) */
#screen-new-run .nrg-clrow .csel{width:auto;min-width:240px;max-width:100%}
#screen-new-run .nrg-clrow .csel.csel-th{min-width:186px}
#screen-new-run .nrg-clrow .csel-btn{font-size:13.5px;padding:7px 11px}
/* ── Строки-шаги (сценарист/раскадровщик/промтер): ЖЁСТКАЯ сетка «подпись | модель | раздумья».
   Ширины колонок фиксированы, иначе каждый дропдаун меряется по своей самой длинной опции
   (`.csel{width:auto}`), а `space-between` разносит их по-разному в каждой строке — колонки
   разъезжаются. nth-child, а не классы: работает и до обёртки в .csel, и после неё. ── */
#screen-new-run .nrg-strow{gap:12px}
#screen-new-run .nrg-strow > .nrg-clk{flex:1 1 auto;min-width:0}
#screen-new-run .nrg-strow > *:nth-child(2){flex:0 0 240px;width:240px;min-width:240px;max-width:240px}
#screen-new-run .nrg-strow > *:nth-child(3){flex:0 0 186px;width:186px;min-width:186px;max-width:186px}
@media(max-width:760px){
  /* узкая колонка: пускаем селекты на свою строку под подписью, но по-прежнему одинаковой сеткой */
  #screen-new-run .nrg-strow{flex-wrap:wrap}
  #screen-new-run .nrg-strow > .nrg-clk{flex:1 1 100%}
  #screen-new-run .nrg-strow > *:nth-child(2),
  #screen-new-run .nrg-strow > *:nth-child(3){flex:1 1 0;width:auto;min-width:0;max-width:none}
}
/* три строки-шага (сценарист/раскадровщик/промтер) идут стопкой, каждая со своей парой селектов */
#screen-new-run #nrg-src-opts{display:block}
#screen-new-run #nrg-src-opts > div{min-width:0}
/* ── Пресет: одна строка «Из идеи» + подпись, что поедет в ран (файлы промптов, батчи и квота
   сняты 15.08.2026; стоп-этапы живут в отдельной плите «Пауза») ── */
#screen-new-run .nrg-mrow{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--hair);font-family:var(--mono);font-size:12.5px;color:var(--ash);cursor:default}
#screen-new-run label.nrg-mrow{cursor:pointer}
#screen-new-run .nrg-mrow.last{border-bottom:0}
/* ── `.nrg-meta-hint` — БАЗОВОЕ правило, без экрана (20.08.2026) ──
   Подпись мелким моношрифтом под полем. Копии ниже (#screen-new-run, #screen-preset-editor)
   появились раньше и остаются: они выигрывают специфичностью, вид тех экранов не меняется.
   Базовое нужно потому, что МОДАЛКИ живут в <body>, ВНЕ `#screen-*`, — и подпись в диалоге
   («Скопировать пресет пользователю», пикеры библиотеки) оставалась вообще без стиля, то есть
   выходила крупнее заголовка. Класс общий, а не «ещё одна копия под .lib-pick»: следующий
   диалог за пределами экрана иначе принесёт этот же баг третий раз.
   ⚠ 12.5px, а НЕ 11px как в поэкранных копиях, и это не рассинхрон: 11px — размер подписи под
   полем ФОРМЫ, которую читают краем глаза, а в модалке эта же подсказка объясняет последствия
   выбора, и её читают целиком. Экраны своё не потеряли — их правила специфичнее. */
.nrg-meta-hint{font-family:var(--mono);font-size:12.5px;color:var(--ash-2);margin-top:9px;line-height:1.6}
#screen-new-run .nrg-meta-hint{font-family:var(--mono);font-size:11px;color:var(--ash-2);margin-top:7px;line-height:1.5}
/* `.nrg-genpause` (flex-строка «Пресет» 2/3 + «Пауза» 1/3) снята 16.08.2026: «Пресет» переехал
   наверх, к «Привязке к каналу», и обе плитки стали обычными ячейками сетки (`nrg-c2`). Пара была
   вынужденной — «Пресет» оказывался под второстепенными «Форматом кадра» и «Источником сценария»,
   хотя это главный вход рана. Выравнивания по высоте больше не нужно: `.nrg-bento` — grid, ячейки
   одной строки и так одной высоты. */
@media(max-width:1080px){#screen-new-run .nrg-bento{grid-template-columns:repeat(2,1fr)}#screen-new-run .nrg-c3,#screen-new-run .nrg-c4{grid-column:span 2}}
@media(max-width:680px){#screen-new-run .nrg-bento{grid-template-columns:1fr}#screen-new-run .nrg-c1,#screen-new-run .nrg-c2,#screen-new-run .nrg-c3,#screen-new-run .nrg-c4{grid-column:span 1}}
/* ══ ПРЕСЕТЫ: та же бенто-раскладка, что «Новый запуск» (в проекте .nrg-* заскоуплены
   пер-экран — как .csel; редактор пресетов их переиспользует, поэтому дублируем под свой scope) ══ */
/* Карточки пресетов — тот же бенто-язык, что плитки на «Каналах» (.tile в #ch-root):
   шапка с глифом и именем, тело с описанием, чипами и полосой действий. */
#screen-presets .pa-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:14px}
#screen-presets .pa-tile{background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);position:relative;overflow:hidden;display:flex;flex-direction:column;cursor:pointer;transition:transform .16s ease,border-color .16s,box-shadow .16s}
#screen-presets .pa-tile:hover{border-color:var(--hair-hi);transform:translateY(-2px);box-shadow:0 0 0 1px rgba(var(--accent-rgb),.22),0 20px 42px -24px rgba(0,0,0,.85)}
#screen-presets .pa-ph{display:flex;align-items:center;gap:9px;padding:13px 15px 11px;border-bottom:1px solid var(--hair-b);background:rgba(var(--accent-rgb),.05)}
#screen-presets .pa-glyph{width:7px;height:7px;flex:none;background:var(--accent-2);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);box-shadow:0 0 6px rgba(var(--accent-rgb),.6)}
#screen-presets .pa-glyph.off{background:var(--ash-2);box-shadow:none}
#screen-presets .pa-nm{font-size:17.5px;font-weight:700;color:var(--bone);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#screen-presets .pa-body{padding:12px 15px 14px;display:flex;flex-direction:column;gap:10px;flex:1}
#screen-presets .pa-desc{font-size:14px;color:var(--ash);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
#screen-presets .pa-chiprow{display:flex;align-items:center;flex-wrap:wrap;gap:6px}
#screen-presets .pa-chiplbl{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);flex:none;margin-right:2px}
#screen-presets .pa-none{font-size:13px;color:var(--ash-2);font-style:italic}
#screen-presets .pa-acts{display:flex;align-items:center;gap:8px;padding-top:9px;margin-top:auto;border-top:1px solid var(--hair)}
/* `.pa-open` («ОТКРЫТЬ ›» в углу плитки) снята 20.08.2026: плитка открывается кликом по себе —
   об этом говорят и курсор, и `title`, — а подпись повторяла это словами в каждой карточке. */
#screen-presets .pa-tile.add{border-style:dashed;align-items:center;justify-content:center;min-height:190px;color:var(--ash-2)}
#screen-presets .pa-tile.add:hover{border-color:var(--accent);color:var(--accent-2);background:rgba(var(--accent-rgb),.03);transform:none;box-shadow:none}
#screen-presets .pa-tile.add .plus{font-size:32px;font-weight:300;margin-bottom:6px;text-align:center}
#screen-presets .pa-tile.add .t{font-family:var(--mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase}
/* Подпись под «＋ Новый пресет»: куда именно ведёт плитка (конструктор, а не пустая форма).
   Без неё клик уводил на другой экран без предупреждения — это читается как промах, а не переход. */
#screen-presets .pa-tile.add .s{margin-top:5px;font-size:12px;color:var(--ash-2);text-align:center}
#screen-presets .pa-tile.add:hover .s{color:var(--ash)}
#screen-preset-editor .nrg-grp-hd{font-family:var(--mono);font-size:12.75px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash-2);margin:28px 0 12px;display:flex;align-items:center;gap:12px}
#screen-preset-editor .nrg-grp-hd:first-child{margin-top:0}
#screen-preset-editor .nrg-grp-hd::after{content:'';flex:1;height:1px;background:var(--hair-b)}
#screen-preset-editor .nrg-bento{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
#screen-preset-editor .nrg-tile{background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:0 15px 15px;min-width:0}
#screen-preset-editor .nrg-t-hd{font-family:var(--mono);font-size:12.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--bone);margin:0 -15px 15px;padding:11px 15px;border-bottom:1px solid var(--hair);display:flex;align-items:center;gap:9px;flex-wrap:wrap}
#screen-preset-editor .nrg-t-hd .nrg-ic{color:var(--accent-2);font-size:14px;flex:none;line-height:1}
#screen-preset-editor .nrg-t-hd .r{margin-left:auto;text-transform:none;letter-spacing:.03em;color:var(--ash-2);font-size:11px;font-weight:400}
#screen-preset-editor .nrg-c1{grid-column:span 1}
#screen-preset-editor .nrg-c2{grid-column:span 2}
#screen-preset-editor .nrg-c3{grid-column:span 3}
#screen-preset-editor .nrg-c4{grid-column:span 4}
#screen-preset-editor .inp.nrg-mini{width:auto;min-width:180px;font-size:13.5px;padding:7px 11px}
#screen-preset-editor .nrg-mrow{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--hair);font-family:var(--mono);font-size:12.5px;color:var(--ash);cursor:default}
#screen-preset-editor label.nrg-mrow{cursor:pointer}
#screen-preset-editor .nrg-mrow.last{border-bottom:0}
#screen-preset-editor .nrg-meta-hint{font-family:var(--mono);font-size:11px;color:var(--ash-2);margin-top:7px;line-height:1.5}
#screen-preset-editor .pa-code{min-height:120px}
/* «Файл» — здесь это ТЕКСТ, а не иконка (в new-run .nrg-filebtn — квадрат 34×34 под SVG):
   меняем ТОЛЬКО геометрию (авто-ширина + паддинг), блёрпл-цвет/обводку/hover наследуем от базового */
#screen-preset-editor .nrg-filebtn{width:auto;height:auto;padding:4px 11px;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase}
/* Подсветка плитки промпта при перетаскивании файла (drag-and-drop → загрузка в поле) */
#screen-preset-editor .nrg-tile.pa-drop-active{border-color:var(--accent)!important;background:linear-gradient(160deg,rgba(var(--accent-rgb),.16),var(--plate-2));box-shadow:inset 0 0 0 1px var(--accent)}
#screen-preset-editor .nrg-tile.pa-drop-active *{pointer-events:none}
@media(max-width:1080px){#screen-preset-editor .nrg-bento{grid-template-columns:repeat(2,1fr)}#screen-preset-editor .nrg-c3,#screen-preset-editor .nrg-c4{grid-column:span 2}}
@media(max-width:680px){#screen-preset-editor .nrg-bento{grid-template-columns:1fr}#screen-preset-editor .nrg-c1,#screen-preset-editor .nrg-c2,#screen-preset-editor .nrg-c3,#screen-preset-editor .nrg-c4{grid-column:span 1}}

/* ── Версии пресета: бейдж на карточке списка + история в редакторе + правка запросом ──
   Свой контейнер .pa-hv, но чипы/кнопки/цвета — общие из дизайн-системы (.chip, .btn, --accent). */
#screen-presets .pa-ver{flex:none;font-family:var(--mono);font-size:11.5px;letter-spacing:.06em;color:var(--accent-2);background:rgba(var(--accent-rgb),.1);border:1px solid rgba(var(--accent-rgb),.3);border-radius:4px;padding:2px 7px}
#screen-preset-editor .pa-hv{border:1px solid var(--hair-b);border-radius:var(--cut);padding:11px 13px;margin-bottom:9px;background:var(--plate)}
#screen-preset-editor .pa-hv.cur{border-color:rgba(var(--accent-rgb),.45);background:rgba(var(--accent-rgb),.05)}
#screen-preset-editor .pa-hv-head{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:14px;color:var(--bone)}
#screen-preset-editor .pa-hv-from{font-family:var(--mono);font-size:12.5px;color:var(--ash-2)}
#screen-preset-editor .pa-hv-ico{font-size:13px}
#screen-preset-editor .pa-hv-who,#screen-preset-editor .pa-hv-when{font-family:var(--mono);font-size:11.5px;color:var(--ash-2)}
#screen-preset-editor .pa-hv-comment{margin-top:6px;font-size:13.5px;color:var(--ash);line-height:1.5;white-space:pre-wrap}
#screen-preset-editor .pa-hv-fields,#screen-preset-editor .pa-hv-eng{margin-top:5px;font-family:var(--mono);font-size:11.5px;color:var(--ash-2)}
#screen-preset-editor .pa-hv-report{margin-top:6px;padding:8px 10px;border-left:2px solid rgba(var(--accent-rgb),.4);background:var(--plate-2);font-size:13px;color:var(--ash);line-height:1.55;white-space:pre-wrap}
#screen-preset-editor .pa-ai-run,#screen-preset-editor .pa-ai-ok,#screen-preset-editor .pa-ai-fail{font-size:13.5px;line-height:1.55;padding:9px 11px;border-radius:var(--cut);border:1px solid var(--hair-b);background:var(--plate)}
/* Строка с номером прогона правки — НАД состоянием, отдельным рядом: она не про исход этой
   правки, а про то, как её назвать в жалобе, и втиснутая в плашку исхода читалась бы частью
   отчёта агента. */
#screen-preset-editor .pa-ai-run-line{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-bottom:9px}
#screen-preset-editor .pa-ai-run{color:var(--ash);display:flex;align-items:center;gap:9px;flex-wrap:wrap}
#screen-preset-editor .pa-ai-ok{color:var(--bone);border-color:rgba(78,156,108,.45);background:rgba(78,156,108,.07)}
#screen-preset-editor .pa-ai-fail{color:var(--err-2);border-color:rgba(var(--err-rgb),.45);background:rgba(var(--err-rgb),.06)}
#screen-preset-editor .pa-ai-mut{color:var(--ash-2);font-size:12.5px}
/* План фазы 1: какие промты правим и что в каждом (показывается, пока идёт фаза 2) */
#screen-preset-editor .pa-ai-plan{margin-top:10px;border:1px solid var(--hair-b);border-radius:var(--cut);background:var(--plate);padding:10px 12px}
#screen-preset-editor .pa-ai-plan-hd{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);margin-bottom:8px}
#screen-preset-editor .pa-ai-plan ul{list-style:none;margin:0;padding:0}
#screen-preset-editor .pa-ai-plan li{padding:7px 0;border-top:1px solid var(--hair);font-size:14px;color:var(--bone)}
#screen-preset-editor .pa-ai-plan li:first-child{border-top:0;padding-top:0}
#screen-preset-editor .pa-ai-task{margin-top:3px;font-size:13px;color:var(--ash);line-height:1.5;white-space:pre-wrap}
/* Состояние отдельного промта плана: часть переписана, часть упала (partial) */
#screen-preset-editor .pa-ai-part{font-size:13.5px;line-height:1.55;padding:9px 11px;border-radius:var(--cut);color:var(--bone);border:1px solid rgba(var(--amber-rgb),.45);background:rgba(var(--amber-rgb),.07)}
#screen-preset-editor .pa-ai-i{margin-left:8px;font-size:13px}
#screen-preset-editor .pa-ai-i.ok{color:var(--green-2)}
#screen-preset-editor .pa-ai-i.fail{color:var(--err-2)}
#screen-preset-editor .pa-ai-i.mut{color:var(--ash-2)}
#screen-preset-editor .pa-ai-note{margin-top:3px;font-size:12.5px;color:var(--ash-2);line-height:1.5}
#screen-preset-editor .pa-ai-err{margin-top:3px;font-size:12.5px;color:var(--err-2);line-height:1.5}
#screen-preset-editor .pa-spin{width:13px;height:13px;flex:none;border:2px solid rgba(var(--accent-rgb),.25);border-top-color:var(--accent-2);border-radius:50%;animation:pa-spin .8s linear infinite}
/* Кнопка во всю ширину плитки. `box-sizing` — обязательно: у `.btn` стоит `all:unset`, который
   сбрасывает и глобальный `*{box-sizing:border-box}`, поэтому голый width:100% + паддинг вылезал
   за границу плитки. */
#screen-preset-editor .btn.pa-wide{box-sizing:border-box;width:100%;justify-content:center;margin-top:10px}
/* `all:unset` у .btn снимает и системный вид disabled — без этого кнопка во время правки выглядит
   нажимаемой, хотя клики уже игнорируются. */
#screen-preset-editor .btn:disabled{opacity:.45;cursor:default;box-shadow:none;filter:grayscale(.5)}
@keyframes pa-spin{to{transform:rotate(360deg)}}

/* ── ТЕСТ ПРЕСЕТА ОДНИМ КАДРОМ (18.08.2026) ──
   Кадр показываем крупно и целиком (`contain`): предмет теста — композиция и стиль, а обрезанный
   по краям кадр отвечает не на тот вопрос. Тексты промтов — той же моно-плитой `.pa-code`, что
   промты пресета, но БЕЗ `min-height` и с переносом: IMG-промт это один длинный абзац, и полоса
   горизонтальной прокрутки на нём читалась бы хуже, чем четыре строки. */
#screen-preset-editor .pa-test-img{display:flex;align-items:center;justify-content:center;
  min-height:120px;padding:8px;border:1px solid var(--hair-b);border-radius:var(--cut);
  background:var(--plate-2);color:var(--ash-2);font-size:13px}
#screen-preset-editor .pa-test-img img{max-width:100%;max-height:62vh;object-fit:contain;display:block}
#screen-preset-editor .pa-test-pre{min-height:0;white-space:pre-wrap;max-height:260px;
  margin:4px 0 0;padding:9px 11px;border:1px solid var(--hair-b);border-radius:var(--cut);
  background:var(--plate);color:var(--ash);overflow:auto}

/* ── СВОРАЧИВАЕМЫЕ ГРУППЫ редактора пресета (12.08.2026): «Промпты» и «Машинный контракт» ──
   ⚠ Скрываем ПРАВИЛОМ С ID и двумя классами: сетка бенто объявлена как
   `#screen-preset-editor .nrg-bento{display:grid}` — правило с ID, и класс без ID проиграл бы ему
   по весу, то есть не скрыл бы ничего (та же ловушка, что у `[data-pa-full]`, см. §выше).
   Класс только ДОБАВЛЯЕТ скрытие и никогда не раскрывает, поэтому урезанный режим он не ломает:
   развернуть — это снять `.pa-folded`, а правило `body:not(.can-manage-presets)` останется. */
#screen-preset-editor .nrg-bento.pa-folded{display:none}
#screen-preset-editor .nrg-grp-hd.pa-foldhd{cursor:pointer;user-select:none}
#screen-preset-editor .nrg-grp-hd.pa-foldhd:hover{color:var(--bone)}
#screen-preset-editor .pa-fold-ic{display:inline-block;width:14px;flex:none;color:var(--ash-2);
  transform:rotate(90deg);transition:transform .15s}
#screen-preset-editor .nrg-grp-hd.pa-closed .pa-fold-ic{transform:rotate(0deg)}


/* ══ ИДЕИ (оператор) — Кабинет оркестратора. Изолированный скоуп, акцент → --acc (§дизайн-система) ══ */
#screen-ideas{--acc:var(--accent);--acc-2:var(--accent-2);--acc-deep:var(--accent-deep);--track:rgba(200,222,235,.06)}
/* Заголовок группы: ромб-глиф + волосяная линия (сигнатурная идиома §8.1) */
#screen-ideas .ideas-grp-hd{font-family:var(--mono);font-size:12.75px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash-2);margin:26px 0 14px;display:flex;align-items:center;gap:13px}
#screen-ideas .ideas-grp-hd:first-child{margin-top:2px}
#screen-ideas .ideas-grp-hd::before{content:'';width:6px;height:6px;flex:none;background:var(--acc);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);box-shadow:0 0 7px var(--acc)}
#screen-ideas .ideas-grp-hd::after{content:'';flex:1;height:1px;background:var(--hair-b)}
/* `.ideas-grp-hd .sub` снят 16.08.2026 вместе со своим единственным носителем — подзаголовком
   «выбери пресет, опиши бриф…» в шапке «Новой идеи». Второй заголовок («Мои идеи») его никогда
   не использовал; вернётся подзаголовок — вернётся и правило. */
#screen-ideas .ideas-grp-hd .cnt{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--acc-2);background:rgba(var(--accent-rgb),.12);border:1px solid rgba(var(--accent-rgb),.28);border-radius:9px;padding:1px 9px;font-weight:700}
#screen-ideas .ideas-grp-hd .cnt:empty{display:none}
/* Композер: бенто 2 плитки */
#screen-ideas .ideas-bento{display:grid;grid-template-columns:1fr 2fr;gap:12px;align-items:stretch}
#screen-ideas .ib-left{display:flex;flex-direction:column;gap:12px;min-width:0}
#screen-ideas .ib-brief{display:flex;flex-direction:column}
#screen-ideas .ib-brief #idea-brief{flex:1;min-height:120px}
/* Канон канала под полем брифа. Плита ПОДЧЁРКНУТО тише самого брифа (без рамки-плитки, мельче
   кегль): бриф — то, что оператор пишет, а это — справка о том, что и так уедет. Своей плиткой
   она конкурировала бы с полем ввода за внимание. */
#screen-ideas .idea-canon{margin-top:12px;padding-top:11px;border-top:1px solid var(--hair)}
#screen-ideas .ic-hd{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ash);margin-bottom:9px}
/* Кнопка вставки живёт В ЗАГОЛОВКЕ полосы: она про весь список, а не про отдельного героя.
   Кегль подрезан, чтобы строка заголовка не выросла вдвое от одной кнопки. */
#screen-ideas .ic-hd .btn{padding:3px 10px;font-size:11.5px;letter-spacing:.06em}
#screen-ideas .ic-pol{margin-left:auto;font-family:var(--ui);font-size:11.5px;font-weight:400;letter-spacing:.02em;text-transform:none;color:var(--ash-2);text-align:right}
#screen-ideas .ic-chips{display:flex;flex-wrap:wrap;gap:6px}
#screen-ideas .ic-chip{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;padding:4px 10px;font-size:13px;color:var(--ash);background:var(--plate);border:1px solid var(--hair-b);border-radius:999px;transition:.12s}
#screen-ideas .ic-chip:hover{color:var(--bone);border-color:var(--acc);background:var(--accent-dim)}
#screen-ideas .ic-chip .ic-n{font-style:normal;font-family:var(--mono);font-size:10.5px;color:var(--ash-2);border-left:1px solid var(--hair-b);padding-left:6px}
#screen-ideas .ic-pins{margin-top:9px;font-size:12.5px;line-height:1.9;color:var(--ash-2)}
#screen-ideas .ic-pins-lbl{font-family:var(--mono);font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--ash-2)}
#screen-ideas .ic-pin{display:inline-block;padding:2px 8px;margin-right:4px;border-radius:5px;font-family:var(--mono);font-size:12px}
/* Три состояния тега РАЗНЫМ цветом, а не одним «есть/нет»: «формы такой нет» — это НЕ ошибка
   ввода и НЕ норма. Завод при промахе формы молча берёт первую, то есть в кадр приедет другой
   человек, — такой случай обязан выглядеть иначе и от зелёного, и от серого. */
#screen-ideas .ic-pin.ok{color:var(--green);background:rgba(var(--green-rgb),.1);border:1px solid rgba(var(--green-rgb),.35)}
#screen-ideas .ic-pin.warn{color:var(--amber-2);background:rgba(var(--amber-rgb),.1);border:1px solid rgba(var(--amber-rgb),.35)}
#screen-ideas .ic-pin.off{color:var(--ash-2);background:var(--plate);border:1px solid var(--hair)}
#screen-ideas .ic-none{font-size:12.5px;color:var(--ash-2);line-height:1.6}
#screen-ideas .ideas-src-seg{display:grid;grid-template-columns:1fr 1fr;gap:8px}
#screen-ideas .ideas-src-opt{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px 10px;font-family:var(--mono);font-size:14px;font-weight:600;letter-spacing:.02em;color:var(--ash);background:var(--plate);border:1px solid var(--hair-b);border-radius:7px;cursor:pointer;transition:.14s}
#screen-ideas .ideas-src-opt:hover{color:var(--bone);border-color:var(--hair-hi)}
#screen-ideas .ideas-src-opt .ideas-sic{color:var(--ash-2);font-size:13px}
#screen-ideas .ideas-src-opt.active{color:var(--bone);background:var(--accent-dim);border-color:var(--acc);box-shadow:inset 0 0 0 1px var(--accent-deep)}
#screen-ideas .ideas-src-opt.active .ideas-sic{color:var(--acc-2)}
/* Источник сценария временно недоступен (сейчас — упавшая подписка Claude; ставит claudeApplyGate).
   Один класс на оба экрана: кнопка не нажимается и явно светится красным, а не просто гаснет. */
.nrg-src-opt.src-down,.ideas-src-opt.src-down{
  color:var(--err-2)!important;border-color:var(--err-2)!important;background:rgba(var(--err-rgb),.07)!important;
  box-shadow:none!important;cursor:not-allowed;opacity:.75}
.nrg-src-opt.src-down .nrg-sic,.ideas-src-opt.src-down .ideas-sic{color:var(--err-2)!important}
#screen-ideas .ideas-tile{background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:0 16px 16px;min-width:0}
#screen-ideas .ideas-t-hd{font-family:var(--mono);font-size:12.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--bone);margin:0 -16px 14px;padding:12px 16px;border-bottom:1px solid var(--hair);display:flex;align-items:center;gap:9px}
#screen-ideas .ideas-t-hd .ideas-ic{color:var(--acc-2);font-size:14px;flex:none;line-height:1}
#screen-ideas .ideas-t-hd .r{margin-left:auto;text-transform:none;letter-spacing:.03em;color:var(--ash-2);font-size:11px;font-weight:400}
/* ПУСТОЕ СОСТОЯНИЕ ЭКРАНА «ИДЕИ»: пресетов нет — раздел «Новая идея» не показывается вовсе, на
   его месте эта плита. Форма плиты, а не строчки-предупреждения: она ЗАМЕЩАЕТ раздел, и по весу
   должна читаться раз­делом, иначе экран выглядит недогруженным. Ширину не растягиваем на всю
   страницу — длинная строка на 1440 не читается. */
#screen-ideas .ideas-none{max-width:620px;margin:22px 0 8px;padding:26px 28px;
  background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut)}
#screen-ideas .ideas-none-t{font-family:var(--mono);font-size:13px;font-weight:700;
  letter-spacing:.09em;text-transform:uppercase;color:var(--bone);margin-bottom:11px}
#screen-ideas .ideas-none-s{font-size:14px;color:var(--ash);line-height:1.65;margin-bottom:18px}
#screen-ideas .inp{border-radius:6px}
#screen-ideas #idea-brief{width:100%;min-height:150px;resize:vertical;font-family:var(--mono);font-size:13.5px;line-height:1.5}
#screen-ideas .idea-actionrow{display:flex;align-items:center;gap:16px;margin:16px 0 4px}
#screen-ideas #idea-err{font-size:14px;color:var(--err-2);font-weight:600;opacity:0;transition:opacity .2s}
#screen-ideas #idea-quota{font-family:var(--mono);font-size:12px;letter-spacing:.04em;color:var(--ash-2);font-variant-numeric:tabular-nums}
/* Кастомный дропдаун .csel — обязателен вместо голого <select> (§7 дизайн-системы) */
#screen-ideas .csel{position:relative;width:100%}
#screen-ideas .csel > select.inp{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;margin:0;padding:0}
#screen-ideas .csel-btn{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;color:var(--bone);font-family:var(--mono);font-size:16px;letter-spacing:.04em;padding:10px 13px;cursor:pointer;transition:.14s;min-width:0}
#screen-ideas .csel-btn:hover{border-color:var(--hair-hi)}
#screen-ideas .csel.open .csel-btn{border-color:var(--acc);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.06)}
#screen-ideas .csel-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#screen-ideas .csel-arrow{color:var(--ash-2);font-size:12px;flex:none;transition:transform .15s}
#screen-ideas .csel.open .csel-arrow{transform:rotate(180deg);color:var(--acc-2)}
#screen-ideas .csel-panel{position:absolute;z-index:60;top:calc(100% + 6px);left:0;right:0;background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;box-shadow:0 22px 50px -18px rgba(0,0,0,.85);padding:5px;max-height:280px;overflow-y:auto;display:none}
#screen-ideas .csel.open .csel-panel{display:block}
#screen-ideas .csel-opt{padding:9px 11px;border-radius:5px;font-family:var(--mono);font-size:15px;color:var(--ash);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.1s}
#screen-ideas .csel-opt:hover{background:rgba(var(--accent-rgb),.16);color:var(--bone)}
#screen-ideas .csel-opt.sel{color:var(--acc-2)}
/* ── ТЕМЫ ПО ПРЕСЕТУ: кнопка у выбора пресета + список внутри общего оверлея .kg-ov ──
   Оверлей, а не полоса на экране: тем десяток с разбором по фазам, и вклиненные между формой и
   «Моими идеями» они отодвигали бы главное действие экрана вниз на пол-экрана. Оболочка — та же
   `.kg-ov`, что у правки поля во весь экран: второй модалки в продукте не заводим. */
#screen-ideas .it-call{width:100%;margin-top:10px;display:flex;align-items:center;gap:9px;padding:9px 11px;
  background:var(--plate);border:1px solid var(--hair-b);border-radius:7px;cursor:pointer;
  font-family:var(--ui);font-size:13.5px;text-align:left;color:var(--ash);transition:.14s}
#screen-ideas .it-call:hover{color:var(--bone);border-color:var(--acc);background:var(--accent-dim)}
#screen-ideas .it-call:disabled{opacity:.5;cursor:default;color:var(--ash-2);
  border-color:var(--hair-b);background:var(--plate)}
#screen-ideas .it-call .it-ic{color:var(--acc-2);flex:none}
#screen-ideas .it-call .it-n{margin-left:auto;font-family:var(--mono);font-size:11px;
  letter-spacing:.06em;color:var(--acc-2);background:rgba(var(--accent-rgb),.12);
  border:1px solid rgba(var(--accent-rgb),.28);border-radius:9px;padding:1px 8px;font-weight:700}
#screen-ideas .it-call .it-n:empty{display:none}
/* Форма, только что заполненная темой: подсветка вместо перехода на другой экран — «В работу»
   заполняет поля ВЫШЕ, и без отметки это выглядело бы как «кнопка ничего не сделала». */
#screen-ideas .ideas-bento.it-lit .ib-brief,#screen-ideas .ideas-bento.it-lit .ib-name,
#screen-ideas .ideas-bento.it-lit .ib-preset{border-color:var(--acc);
  box-shadow:0 0 0 1px var(--accent-deep),0 0 26px -8px var(--acc);transition:box-shadow .5s,border-color .5s}
/* ⚠ Псевдонимы цветов объявлены НА ЭКРАНАХ (`#screen-kitgen{--ok-2:…}`), а оверлей живёт в
   <body> — вне любого из них. Без этой строки `var(--ok-2)`/`var(--warn)`/`var(--bad)` внутри
   `.kg-ov` не разрешаются ни во что: отметка «держит» рисовалась бы цветом текста. Найдено при
   переносе тем (13.08.2026) — те же имена уже звал `.kg-ov .kg-src.on` из конструктора. */
.kg-ov{--acc:var(--accent);--acc-2:var(--accent-2);--acc-deep:var(--accent-deep);
  --acc-rgb:var(--accent-rgb);--ok:var(--green);--ok-2:var(--green-2);--bad:var(--err-2);
  --warn:var(--amber-2)}
/* ── ОКНО ТЕМ ДЕРЖИТ ПОЛНУЮ ВЫСОТУ, А НЕ РАСТЁТ ПО СОДЕРЖИМОМУ (16.08.2026) ──
   Короб оверлея по умолчанию высотой по содержимому (`max-height:100%` потолок задаёт, а не
   высоту). На пустом списке он выходил ~240px — и открытый дропдаун «Раздумья» (панель `.csel`
   — обычный абсолютный узел ВНУТРИ прокручиваемого тела, а не системное окно) торчал из него на
   две сотни пикселей, добавляя телу полосу прокрутки. Скролл появлялся ровно от того, что список
   выбора не помещался в окно.
   Поэтому окно тем — фиксированной высоты: тело всегда выше любой панели выбора, и открытие
   дропдауна больше ничего не двигает. Заодно список тем получает всю доступную высоту, ради
   которой окно и открывают.
   Высота — 80% экрана: по десятой доле сверху и снизу (решение оператора 16.08.2026). Окно во
   весь экран перестаёт читаться как окно — не видно, что за ним, и нечего задеть мышью, чтобы
   закрыть; полосы фона по краям возвращают и то и другое, а панели выбора 80% хватает с запасом
   вплоть до экрана в 600px высотой.
   Правка точечная (`#it-ov`), прочие оверлеи не трогает: у них внутри одно поле или картинка. */
#it-ov{padding:10vh 14px}
#it-ov .kg-ov-bx{height:100%}
#it-ov .kg-ov-bd{flex:1;min-height:0}
/* Панель выбора в строке заказа не должна прокручиваться сама: восемь ступеней шкалы раздумий
   занимают ~275px, и общий потолок в 280 задевал их вплотную — на другом рендере шрифта это
   вторая полоса прокрутки внутри первой. Список форматов (их бывает до двадцати) по-прежнему
   упирается в потолок и прокручивается — так и надо. */
#it-ov .it-bar .csel-panel{max-height:320px}
/* ⚠ СТРОКА ЗАКАЗА ОБЯЗАНА ЖИТЬ В ОДИН РЯД (16.08.2026). Она стоит НАД списком тем, и каждый её
   перенос — это минус ряд карточек в окне: селектор «Раздумья» с шириной по умолчанию сложил
   строку в три ряда. Поэтому короб тем расширен до общего потолка `.kg-ov-bx` (1180px, задаётся
   в `ideas.js`), а числовые поля ужаты до ширины своих двух цифр.
   ⚠ ШИРИНУ СПИСКА ЗАДАЁТ `.csel`, А НЕ `.inp`: сквозной проход `_cselSweep` (core.js) прячет
   настоящий <select> в 1×1 и рисует поверх свою кнопку — правило на `.inp` до видимой ширины не
   доходит. Поэтому ширины у списков парные. «Раздумьям» дано 214px: их кнопка шириной по ТЕКУЩЕЙ
   подписи (`.csel{width:auto}`), а самая длинная в шкале — «Очень глубоко — 24K», 211px. Без
   фиксации поле прыгало бы на 60px при каждом выборе, двигая соседей. Шкала общая на весь продукт,
   и укорачивать её здесь значило бы развести подписи одной настройки по экранам.
   Держится в один ряд до 1280px ширины окна. Меняешь ширины — перемерь НА ОБЁРНУТЫХ списках:
   измерение на голом <select> покажет другую раскладку, чем видит оператор. */
.kg-ov .it-bar{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap;padding-bottom:14px;
  border-bottom:1px solid var(--hair)}
.kg-ov .it-f{display:flex;flex-direction:column;gap:5px}
.kg-ov .it-f .inp-lbl{font-family:var(--mono);font-size:11px;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ash-2)}
.kg-ov .it-f .inp{width:120px}
.kg-ov .it-f.num .inp{width:96px}       /* «10», «20», «6» — больше туда не вводят */
.kg-ov .it-f.think .inp,.kg-ov .it-f.think .csel{width:214px}   /* по самой длинной подписи шкалы */
.kg-ov .it-f.model .inp{width:186px}    /* «OpenRouter · google/gemini-2.5-pro» — самая длинная */
/* Раздумья при не-Claude движке: селектор гаснет вместе с подписью — у Gemini и OpenRouter
   бюджета нет вовсе, и рабочий на вид селектор молча ничего бы не менял. */
.kg-ov .it-f.off{opacity:.45}
.kg-ov .it-f.off .inp{cursor:not-allowed}
.kg-ov .it-f.wide{flex:1;min-width:160px}
.kg-ov .it-f.wide .inp{width:100%}
.kg-ov .it-bar .it-go{flex:none}
.kg-ov .it-note{border:1px solid var(--hair-b);border-radius:6px;background:var(--plate);
  padding:11px 13px;margin-top:14px;font-size:13.5px;line-height:1.6;color:var(--ash)}
.kg-ov .it-note b{color:var(--bone)}
.kg-ov .it-note.bad{box-shadow:inset 3px 0 0 var(--bad)}
.kg-ov .it-note.warn{box-shadow:inset 3px 0 0 var(--warn)}
.kg-ov .it-sect{display:flex;align-items:center;gap:9px;margin:20px 0 10px;font-family:var(--mono);
  font-size:11.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--bone)}
.kg-ov .it-sect .it-r{margin-left:auto;font-weight:400;font-size:11.5px;letter-spacing:.03em;
  text-transform:none;font-family:var(--ui);color:var(--ash-2)}
.kg-ov .it-list{display:flex;flex-direction:column;gap:10px}
.kg-ov .it-card{display:grid;grid-template-columns:22px minmax(0,1fr) auto;gap:0 10px;
  align-items:start;background:var(--plate);border:1px solid var(--hair-b);border-radius:6px;
  padding:12px 14px;transition:.14s}
.kg-ov .it-card:hover{border-color:var(--hair-hi)}
.kg-ov .it-card.ok{box-shadow:inset 3px 0 0 var(--ok-2)}
.kg-ov .it-card.warn{box-shadow:inset 3px 0 0 var(--warn)}
.kg-ov .it-card.bad{box-shadow:inset 3px 0 0 var(--bad);opacity:.85}
.kg-ov .it-card.none{box-shadow:inset 3px 0 0 var(--ash-2);opacity:.85}
.kg-ov .it-mark{font-family:var(--mono);font-size:15px;color:var(--ash-2);line-height:1.5}
.kg-ov .it-card.ok .it-mark{color:var(--ok-2)}
.kg-ov .it-card.warn .it-mark{color:var(--warn)}
.kg-ov .it-card.bad .it-mark{color:var(--bad)}
/* ОТРАБОТАННАЯ ТЕМА — ГАСНЕТ, А НЕ ПРЯЧЕТСЯ (20.08.2026). Оператор помечает взятые темы, чтобы
   не перечитывать их в следующем прогоне; убери мы её из списка — сломался бы счётчик секции
   («Проверено — 10» и девять карточек) и пропала бы возможность снять галочку. Гасим цветом и
   снимаем полосу вердикта: карточка остаётся на месте и читается, просто уходит на второй план.
   Кнопка «В работу» гаснет вместе с ней, но НЕ отключается: тему берут повторно (сериями). */
.kg-ov .it-card.done{opacity:.42;box-shadow:inset 3px 0 0 var(--ash-2)}
.kg-ov .it-card.done .it-t{color:var(--ash);text-decoration:line-through;
  text-decoration-color:var(--ash-2)}
.kg-ov .it-card.done:hover{opacity:.72}
.kg-ov .it-act{display:flex;flex-direction:column;align-items:flex-end;gap:7px}
.kg-ov .it-done{display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ash-2);white-space:nowrap}
.kg-ov .it-done:hover{color:var(--bone)}
/* Галочка — ТЁМНАЯ, как везде в продукте (та же лепка, что у `.nrg-stop` / `.kg-chk`): нативный
   чекбокс рисуется белым квадратом и на тёмной карточке светится ярче самой темы. `accent-color`
   красит только ОТМЕЧЕННОЕ состояние, фон пустого остаётся системным — поэтому `appearance:none`
   и своя коробка. Отмеченная — зелёная, в цвет «держит» и подписи «отработана». */
.kg-ov .it-done input{appearance:none;-webkit-appearance:none;width:15px;height:15px;flex:none;
  margin:0;cursor:pointer;border:1px solid rgba(var(--wash-rgb),.5);border-radius:4px;
  background:rgba(0,0,0,.35);position:relative;transition:.12s}
.kg-ov .it-done:hover input{border-color:var(--ok-2)}
.kg-ov .it-done input:checked{background:var(--ok-2);border-color:var(--ok-2)}
.kg-ov .it-done input:checked::after{content:'';position:absolute;left:4px;top:1px;width:4px;
  height:8px;border:solid var(--plate);border-width:0 2px 2px 0;transform:rotate(45deg)}
.kg-ov .it-card.done .it-done{color:var(--ok-2)}
.kg-ov .it-t{font-size:16px;font-weight:700;color:var(--bone);line-height:1.35}
.kg-ov .it-g{font-size:14px;color:var(--ash);line-height:1.55;margin-top:5px}
.kg-ov .it-more{margin-top:7px;font-size:12.5px;color:var(--ash-2);line-height:1.6}
.kg-ov .it-more b{color:var(--ash);font-weight:600}
.kg-ov .it-v{font-family:var(--mono);font-size:12px;color:var(--ok-2);margin-top:6px}
.kg-ov .it-card.warn .it-v,.kg-ov .it-card.bad .it-v{color:var(--warn)}
/* «Сверх заказа» — свёрнутая секция под списком: темы проверены и держат, но в заказ не вошли.
   Заголовок свёртки собран из тех же .it-sect/.it-r, что и обычные секции: это такая же секция,
   просто закрытая по умолчанию. */
.kg-ov .it-over>summary{display:flex;align-items:center;gap:9px;margin:20px 0 10px;cursor:pointer;
  font-family:var(--mono);font-size:11.5px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash);list-style:none}
.kg-ov .it-over>summary::-webkit-details-marker{display:none}
.kg-ov .it-over>summary::before{content:'▸';font-size:12px;color:var(--ash-2)}
.kg-ov .it-over[open]>summary::before{content:'▾'}
.kg-ov .it-over>summary:hover{color:var(--bone)}
.kg-ov .it-over>summary .it-r{margin-left:auto;font-weight:400;font-size:11.5px;letter-spacing:.03em;
  text-transform:none;font-family:var(--ui);color:var(--ash-2)}
.kg-ov .it-rej{margin:0;padding:0;list-style:none;font-size:13px;color:var(--ash-2)}
.kg-ov .it-rej li{display:flex;gap:8px;align-items:baseline;padding:6px 0;
  border-top:1px solid var(--hair)}
.kg-ov .it-rej .it-mark{color:var(--bad);font-size:13px}
/* Лента «Мои идеи» */
#screen-ideas .ideas-list{display:flex;flex-direction:column;gap:10px}
#screen-ideas .idea-card{position:relative;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:15px 17px 15px 19px;overflow:hidden;transition:border-color .15s}
#screen-ideas .idea-card:hover{border-color:var(--hair-hi)}
#screen-ideas .idea-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--ash-2)}
#screen-ideas .idea-card.is-generating::before{background:var(--amber-2);box-shadow:0 0 8px rgba(196,143,60,.5)}
#screen-ideas .idea-card.is-ready::before{background:var(--green);box-shadow:0 0 8px rgba(var(--green-rgb),.5)}
#screen-ideas .idea-card.is-implemented::before{background:var(--acc);box-shadow:0 0 8px var(--acc)}
#screen-ideas .idea-card.is-queued::before{background:var(--ash-2)}
#screen-ideas .ic-queue{margin-top:11px;font-family:var(--mono);font-size:13px;letter-spacing:.02em;color:var(--ash);display:flex;align-items:center;gap:8px}
#screen-ideas .ic-queue b{color:var(--acc-2);font-variant-numeric:tabular-nums;font-weight:700}
#screen-ideas .idea-card.is-failed::before{background:var(--err-2);box-shadow:0 0 8px rgba(var(--err-2-rgb),.4)}
#screen-ideas .idea-card.is-archived{opacity:.66}
#screen-ideas .idea-card.is-archived::before{background:var(--ash-2)}
#screen-ideas #idea-name{width:100%;font-family:var(--mono);font-size:14px}
#screen-ideas .ic-id{font-family:var(--mono);font-size:11px;letter-spacing:.02em;color:var(--ash-2);background:var(--void);border:1px solid var(--hair);border-radius:4px;padding:1px 6px;white-space:nowrap;font-variant-numeric:tabular-nums}
#screen-ideas .ic-runlink{margin-top:11px;font-family:var(--mono);font-size:12.5px;color:var(--acc-2);display:inline-flex;align-items:center;gap:7px;padding:8px 12px;border:1px solid var(--hair-b);border-left:2px solid var(--acc);border-radius:6px;background:rgba(var(--accent-rgb),.06);cursor:pointer;transition:.14s;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#screen-ideas .ic-runlink:hover{border-color:var(--hair-hi);background:rgba(var(--accent-rgb),.12);color:var(--bone)}
#screen-ideas .ideas-arch{margin-top:22px;border-top:1px solid var(--hair-b);padding-top:6px}
#screen-ideas .ideas-arch-hd{display:flex;align-items:center;gap:11px;font-family:var(--mono);font-size:12.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--ash-2);cursor:pointer;padding:12px 2px;user-select:none;transition:color .14s}
#screen-ideas .ideas-arch-hd:hover{color:var(--ash)}
#screen-ideas .ideas-arch-hd .ar-caret{color:var(--acc-2);font-size:11px;transition:transform .16s}
#screen-ideas .ideas-arch.open .ideas-arch-hd .ar-caret{transform:rotate(90deg)}
#screen-ideas .ideas-arch-hd .ar-cnt{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--acc-2);background:rgba(var(--accent-rgb),.12);border:1px solid rgba(var(--accent-rgb),.28);border-radius:9px;padding:1px 9px;font-weight:700}
#screen-ideas .ideas-arch-body{display:none;flex-direction:column;gap:10px;margin-top:6px}
#screen-ideas .ideas-arch.open .ideas-arch-body{display:flex}
#screen-ideas .ic-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
#screen-ideas .ic-title{font-family:var(--ui);font-size:17px;font-weight:700;color:var(--bone);min-width:0}
#screen-ideas .ic-preset{font-family:var(--mono);font-size:11.5px;letter-spacing:.03em;color:var(--ash-2);display:inline-flex;align-items:center;gap:5px}
#screen-ideas .ic-spacer{flex:1}
#screen-ideas .ic-date{font-family:var(--mono);font-size:11px;letter-spacing:.03em;color:var(--ash-2);font-variant-numeric:tabular-nums;white-space:nowrap}
#screen-ideas .ic-src{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:var(--ash);background:var(--plate-hi);border:1px solid var(--hair-b);border-radius:4px;padding:2px 7px;display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
#screen-ideas .ic-src .sic{font-size:10px;color:var(--acc-2)}
#screen-ideas .ic-brief{margin-top:11px;border:1px solid var(--hair);border-left:2px solid rgba(var(--accent-rgb),.4);border-radius:6px;background:rgba(11,12,15,.5);padding:9px 12px}
#screen-ideas .ic-brief .lbl{font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ash-2);display:block;margin-bottom:5px}
/* Шапка плитки брифа: подпись слева, «⧉ Копировать» прижата вправо. Кнопка приглушена до
   наведения — она есть у КАЖДОЙ карточки, и в полный контраст ряд карточек читался бы как ряд
   кнопок. Высота шапки задаётся подписью: кнопка компактнее обычной .btn.sm, чтобы плитка брифа
   не подросла ради неё. */
#screen-ideas .ic-brief-hd{display:flex;align-items:center;gap:10px;margin-bottom:5px}
#screen-ideas .ic-brief-hd .lbl{margin-bottom:0}
#screen-ideas .ic-brief .ic-copy{margin-left:auto;flex:none;padding:2px 8px;font-size:11px;line-height:1.6;color:var(--ash-2);border-color:var(--hair)}
#screen-ideas .ic-brief .ic-copy:hover{color:var(--accent-2);border-color:var(--accent)}
#screen-ideas .ic-brief .txt{font-family:var(--mono);font-size:12.5px;line-height:1.5;color:var(--ash);white-space:pre-wrap;max-height:88px;overflow:auto}
#screen-ideas .chip.gen{color:var(--amber-2);border:1px solid rgba(var(--amber-rgb),.35);background:rgba(var(--amber-rgb),.06)}
#screen-ideas .chip.gen .chip-dot{background:var(--amber-2);box-shadow:0 0 5px var(--amber);animation:blink 1.4s steps(2,end) infinite}
#screen-ideas .ic-body{margin-top:11px}
#screen-ideas .ic-working{font-family:var(--mono);font-size:13px;color:var(--amber-2);display:flex;align-items:center;gap:9px}
#screen-ideas .ic-scan{flex:1;max-width:220px;height:3px;border-radius:5px;background:var(--track);overflow:hidden;position:relative}
#screen-ideas .ic-scan::after{content:'';position:absolute;top:0;bottom:0;width:40%;left:-40%;border-radius:5px;background:linear-gradient(90deg,transparent,var(--amber-2),transparent);animation:ideaScan 1.25s ease-in-out infinite}
@keyframes ideaScan{0%{left:-40%}100%{left:100%}}
#screen-ideas .idea-summary{white-space:pre-wrap;font-family:var(--ui);font-size:14px;line-height:1.6;color:var(--ash);max-height:260px;overflow:auto;padding:13px 15px;border:1px solid var(--hair);border-radius:6px;background:var(--void)}
#screen-ideas .idea-summary::-webkit-scrollbar{width:9px}
#screen-ideas .idea-summary::-webkit-scrollbar-thumb{background:var(--plate-hi);border-radius:5px}
#screen-ideas .ic-error{padding:11px 14px;border:1px solid rgba(var(--err-rgb),.25);border-left:2px solid var(--err-2);border-radius:6px;background:rgba(var(--err-rgb),.05);color:var(--err-2);font-size:13.5px;line-height:1.5}
#screen-ideas .ic-flag-why{padding:10px 13px;margin-bottom:9px;border:1px solid rgba(var(--err-rgb),.25);border-left:2px solid var(--err-2);border-radius:6px;background:rgba(var(--err-rgb),.05);color:var(--err-2);font-size:12.75px;line-height:1.5;white-space:pre-wrap;font-family:var(--mono)}
#screen-ideas .ic-flag-scen{margin-top:9px}
#screen-ideas .ic-flag-scen>summary{cursor:pointer;font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash-2);padding:5px 0;user-select:none}
#screen-ideas .ic-flag-scen[open]>summary{color:var(--ash);margin-bottom:6px}
#screen-ideas .ic-acts{display:flex;gap:8px;margin-top:13px;flex-wrap:wrap}
#screen-ideas .idea-empty{display:flex;flex-direction:column;align-items:center;gap:11px;padding:46px 20px;border:1px dashed var(--hair-b);border-radius:var(--cut);background:rgba(11,12,15,.4);text-align:center}
#screen-ideas .idea-empty .glyph{font-size:30px;color:var(--acc-2);opacity:.75;line-height:1}
#screen-ideas .idea-empty .t{font-family:var(--ui);font-size:15px;color:var(--ash);font-weight:600}
#screen-ideas .idea-empty .s{font-family:var(--mono);font-size:12px;letter-spacing:.03em;color:var(--ash-2);max-width:380px;line-height:1.6}
@media(max-width:820px){#screen-ideas .ideas-bento{grid-template-columns:1fr}}

/* ══ ПОИСК НИШ (Niche Finder, админ) — по «Дизайн-система.md», эталон «В генерации».
   Жил в <style> внутри screens/niche-finder.html — но роутер инъектирует ТОЛЬКО узел
   #screen-<name> (router.js), а <style> был его соседом и молча терялся: экран ехал.
   Скоуп-CSS экранов держим здесь, как у всех остальных партиалов. ══ */
#screen-niche-finder{--acc:var(--accent);--acc-2:var(--accent-2);--acc-deep:var(--accent-deep);--acc-rgb:var(--accent-rgb);--ok:var(--green);--bad:var(--err-2);--warn:var(--amber-2);--track:rgba(200,222,235,.06)}

/* сегмент-вкладки (блёрпл-градиент активного, как .rb-seg) */
#screen-niche-finder .nf-seg{display:inline-flex;background:var(--plate);border:1px solid var(--hair-b);border-radius:6px;padding:3px;gap:2px;margin-bottom:20px;flex-wrap:wrap}
#screen-niche-finder .nf-seg-btn{font-family:var(--mono);font-size:12.5px;letter-spacing:.09em;text-transform:uppercase;font-weight:700;color:var(--ash-2);background:transparent;border:1px solid transparent;border-radius:5px;padding:7px 15px;cursor:pointer;transition:.14s}
#screen-niche-finder .nf-seg-btn:hover{color:var(--bone)}
#screen-niche-finder .nf-seg-btn.active{color:#fff;background:linear-gradient(180deg,var(--acc-2),var(--acc-deep));border-color:var(--acc);box-shadow:inset 0 0 0 1px var(--acc-deep),0 0 10px rgba(var(--acc-rgb),.3)}

/* квота-readout */
#screen-niche-finder .nf-quota{display:flex;align-items:center;gap:10px;font-family:var(--mono);font-size:12px;color:var(--ash-2);letter-spacing:.03em;margin-bottom:16px;flex-wrap:wrap;min-height:16px;font-variant-numeric:tabular-nums}
#screen-niche-finder .nf-quota .bar{width:150px;height:7px;border-radius:5px;background:var(--track);border:1px solid var(--hair);overflow:hidden}
#screen-niche-finder .nf-quota .bar i{display:block;height:100%}
#screen-niche-finder .nf-quota b{color:var(--bone)}

/* форма — плиты как .ml-panel */
#screen-niche-finder .nf-form{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
#screen-niche-finder .nf-panel{background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:0 13px 13px;min-width:0}
#screen-niche-finder .nf-wide{grid-column:span 2}
#screen-niche-finder .nf-ph{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:12px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--bone);margin:0 -13px 13px;padding:11px 13px;border-bottom:1px solid var(--hair)}
#screen-niche-finder .nf-ph .ic{color:var(--acc-2);font-size:13px;flex:none;line-height:1}
#screen-niche-finder .nf-two{display:grid;grid-template-columns:1fr 1fr;gap:10px}
#screen-niche-finder .nf-filters{display:grid;grid-template-columns:repeat(3,1fr);gap:11px;align-items:end}
#screen-niche-finder .nf-check{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--ash);cursor:pointer;padding-bottom:9px}
@media(max-width:1080px){#screen-niche-finder .nf-form{grid-template-columns:1fr}#screen-niche-finder .nf-wide{grid-column:span 1}}
@media(max-width:640px){#screen-niche-finder .nf-filters{grid-template-columns:1fr 1fr}}

/* поля/лейблы — .inp-lbl канон (mono caps .14em ash-2), поля 6px */
#screen-niche-finder .inp-lbl{font-family:var(--mono);font-size:12.75px;letter-spacing:.14em;text-transform:uppercase;color:var(--ash-2);margin-bottom:6px}
#screen-niche-finder .inp{border-radius:6px}
#screen-niche-finder select.inp{color-scheme:dark}

/* .csel — кастомный дропдаун (канон: нативный <select> запрещён). Скоуп-копия. */
#screen-niche-finder .csel{position:relative;width:100%}
#screen-niche-finder .csel > select.inp{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;margin:0;padding:0}
#screen-niche-finder .csel-btn{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;color:var(--bone);font-family:var(--mono);font-size:16.5px;letter-spacing:.04em;padding:10px 13px;cursor:pointer;transition:.14s;min-width:0}
#screen-niche-finder .csel-btn:hover{border-color:var(--hair-hi)}
#screen-niche-finder .csel.open .csel-btn{border-color:var(--acc);box-shadow:inset 0 0 16px rgba(var(--acc-rgb),.06)}
#screen-niche-finder .csel-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#screen-niche-finder .csel-arrow{color:var(--ash-2);font-size:12px;flex:none;transition:transform .15s}
#screen-niche-finder .csel.open .csel-arrow{transform:rotate(180deg);color:var(--acc-2)}
#screen-niche-finder .csel-panel{position:absolute;z-index:60;top:calc(100% + 6px);left:0;right:0;background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;box-shadow:0 22px 50px -18px rgba(0,0,0,.85);padding:5px;max-height:280px;overflow-y:auto;display:none}
#screen-niche-finder .csel.open .csel-panel{display:block}
#screen-niche-finder .csel-opt{padding:9px 11px;border-radius:5px;font-family:var(--mono);font-size:15px;color:var(--ash);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.1s}
#screen-niche-finder .csel-opt:hover{background:rgba(var(--acc-rgb),.16);color:var(--bone)}
#screen-niche-finder .csel-opt.sel{color:var(--acc-2)}

/* действия */
#screen-niche-finder .nf-actions{display:flex;gap:10px;align-items:center;margin:16px 0 4px;flex-wrap:wrap}

/* статус + лог */
#screen-niche-finder .sect-hd .sh-r{font-family:var(--mono);font-size:12.5px;letter-spacing:.04em;color:var(--ash-2)}
#screen-niche-finder .sect-hd .sh-r.ok{color:var(--ok)}
#screen-niche-finder .sect-hd .sh-r.bad{color:var(--bad)}
#screen-niche-finder .nf-log{max-height:150px;overflow-y:auto;background:var(--plate);border:1px solid var(--hair-b);border-radius:var(--cut);padding:9px 11px;margin-bottom:14px;font-family:var(--mono);font-size:11px;line-height:1.6;color:var(--ash-2)}
#screen-niche-finder .nf-log div{white-space:pre-wrap}
#screen-niche-finder .nf-log .e{color:var(--bad)}

/* карточки результатов — плиты .ml-card + score-метрика */
#screen-niche-finder .nf-results{display:flex;flex-direction:column;gap:10px}
#screen-niche-finder .nf-card{display:flex;gap:14px;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:12px;align-items:flex-start;transition:.14s}
#screen-niche-finder .nf-card:hover{border-color:var(--hair-hi)}
#screen-niche-finder .nf-score{flex:none;width:54px;text-align:center;padding-top:2px}
#screen-niche-finder .nf-score .n{font-family:var(--mono);font-weight:700;font-size:26px;line-height:1;color:var(--acc-2);font-variant-numeric:tabular-nums}
#screen-niche-finder .nf-score .n.hi{color:var(--ok)}
#screen-niche-finder .nf-score .n.lo{color:var(--ash-2)}
#screen-niche-finder .nf-score .l{font-family:var(--mono);font-size:9px;letter-spacing:.14em;text-transform:uppercase;color:var(--ash-2);margin-top:3px}
#screen-niche-finder .nf-thumb{flex:none;width:150px;height:84px;border-radius:6px;object-fit:cover;background:var(--plate)}
#screen-niche-finder .nf-body{flex:1;min-width:0}
#screen-niche-finder .nf-ttl{font-family:var(--ui);font-size:15px;font-weight:700;color:var(--bone);line-height:1.3;margin-bottom:7px}
#screen-niche-finder .nf-ttl a{color:inherit;text-decoration:none}
#screen-niche-finder .nf-ttl a:hover{color:var(--acc-2)}
#screen-niche-finder .nf-meta{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);display:flex;flex-wrap:wrap;gap:4px 14px;margin-bottom:10px;font-variant-numeric:tabular-nums}
#screen-niche-finder .nf-meta b{color:var(--bone);font-weight:600}
#screen-niche-finder .nf-acts{display:flex;gap:7px;flex-wrap:wrap}

/* сохранённое / папки / история */
#screen-niche-finder .nf-smark.active{background:linear-gradient(180deg,var(--acc-2),var(--acc-deep));border-color:var(--acc);color:#fff;box-shadow:inset 0 0 0 1px var(--acc-deep)}
#screen-niche-finder .nf-folder-row{display:flex;align-items:center;gap:12px;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:12px 14px;margin-bottom:8px}
#screen-niche-finder .nf-folder-row b{color:var(--bone)}
#screen-niche-finder .nf-folder-row .c{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);font-variant-numeric:tabular-nums}
#screen-niche-finder .nf-hist-row{display:flex;gap:18px;padding:10px 2px;border-bottom:1px solid var(--hair);font-family:var(--mono);font-size:12px;color:var(--ash-2);flex-wrap:wrap;font-variant-numeric:tabular-nums}
#screen-niche-finder .nf-hist-row b{color:var(--bone);font-weight:600}
#screen-niche-finder .nf-empty{font-family:var(--mono);font-size:12.5px;color:var(--ash-2);padding:14px 2px}

.sl-num::-webkit-inner-spin-button,.sl-num::-webkit-outer-spin-button{height:14px}
.sl{-webkit-appearance:none;appearance:none;width:100%;height:20px;background:transparent;cursor:pointer;outline:none;padding:0;margin:0;display:block}
.sl::-webkit-slider-runnable-track{height:3px;background:linear-gradient(90deg,var(--accent) 0 var(--p,0%),var(--plate-hi) var(--p,0%) 100%)}
.sl::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:20px;margin-top:-8.5px;background:linear-gradient(180deg,#101224,#04050a);box-shadow:0 0 8px rgba(var(--accent-rgb),.5);cursor:pointer;clip-path:polygon(3px 0,100% 0,100% calc(100% - 3px),calc(100% - 3px) 100%,0 100%,0 3px)}
.sl::-moz-range-track{height:3px;background:linear-gradient(90deg,var(--accent) 0 var(--p,0%),var(--plate-hi) var(--p,0%) 100%)}
.sl::-moz-range-thumb{width:12px;height:20px;border:none;background:linear-gradient(180deg,#101224,#04050a);box-shadow:0 0 8px rgba(var(--accent-rgb),.5);border-radius:0;cursor:pointer}

/* Segmented control */
.seg{display:inline-flex;gap:0;background:var(--plate-2);border:1px solid var(--hair-b)}
.seg button{all:unset;cursor:pointer;padding:7px 14px;font-family:var(--mono);font-size:13.5px;letter-spacing:.08em;color:var(--ash);transition:.12s;border-right:1px solid var(--hair-b)}
.seg button:last-child{border-right:0}
.seg button:hover{color:var(--bone);background:rgba(var(--accent-rgb),.05)}
.seg button.on{color:#fff;background:linear-gradient(180deg,var(--accent-2),var(--accent-deep));font-weight:700}

/* Toggle */
.tgl{all:unset;cursor:pointer;width:38px;height:19px;position:relative;background:var(--plate-hi);border:1px solid var(--hair-b);transition:.18s;flex:none}
.tgl::after{content:'';position:absolute;top:3px;left:3px;width:11px;height:11px;background:var(--ash-2);transition:transform .18s,background .18s}
.tgl[aria-pressed=true]{background:linear-gradient(180deg,var(--accent-2),var(--accent-deep));border-color:var(--accent);box-shadow:0 0 10px rgba(var(--accent-rgb),.4)}
.tgl[aria-pressed=true]::after{transform:translateX(19px);background:#fff}

/* Table */
.tbl{width:100%;border-collapse:collapse}
.tbl th{font-family:var(--mono);font-size:12px;letter-spacing:.14em;color:var(--ash-2);text-align:left;padding:8px 14px;border-bottom:1px solid var(--hair-b);text-transform:uppercase;white-space:nowrap;font-weight:500}
.tbl th.th-sort{cursor:pointer;user-select:none}
.tbl th.th-sort:hover{color:var(--bone)}
.tbl td{padding:11px 14px;border-bottom:1px solid var(--hair);color:var(--bone);font-size:18px;vertical-align:middle}
.tbl tr:hover td{background:rgba(var(--accent-rgb),.025)}
.tbl td.mono{font-family:var(--mono);font-size:16.5px}
.tbl .tbl-act{display:flex;gap:6px;justify-content:flex-end}

/* Card */
.card{background:var(--plate-2);border:1px solid var(--hair-b);padding:18px;position:relative;overflow:hidden;transition:border-color .14s}
.card::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(255,255,255,.015),transparent 50%);pointer-events:none}
.card:hover{border-color:var(--hair-hi)}

/* Divider */
.hr{height:1px;background:var(--hair-b);margin:20px 0}

/* Metric cards row */
.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:22px}
.metric{background:var(--plate-2);border:1px solid var(--hair-b);padding:16px 18px;position:relative;overflow:hidden}
.metric::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--hair-b)}
.metric.red::after{background:var(--accent);box-shadow:0 0 8px var(--accent)}
.metric.cyan::after{background:var(--accent);box-shadow:0 0 8px rgba(var(--accent-rgb),.5)}
.metric.green::after{background:var(--green);box-shadow:0 0 8px rgba(var(--green-rgb),.5)}
.metric.amber::after{background:var(--amber);box-shadow:0 0 8px rgba(var(--amber-rgb),.5)}
.metric .mv{font-family:var(--mono);font-size:28px;font-weight:700;color:var(--bone);line-height:1;margin-bottom:6px;letter-spacing:-.01em}
.metric .ml{font-size:15px;letter-spacing:.14em;text-transform:uppercase;color:var(--ash-2);font-weight:600}
.metric .md{font-family:var(--mono);font-size:15px;color:var(--ash-2);margin-top:6px;display:flex;align-items:center;gap:5px}
.metric .md .up{color:var(--green)}
.metric .md .dn{color:var(--accent-2)}

/* ── ПРОГОНЫ: тулбар + секции по статусу ── */
.rb-toolbar{display:flex;align-items:center;gap:11px;flex-wrap:wrap;margin-bottom:14px}
.rb-lbl{font-family:var(--mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash-2)}
.rb-sel{font-family:var(--mono);font-size:14px;color:#b3bac1;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;padding:9px 30px 9px 12px;outline:none;appearance:none;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23828d96'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 11px center}
.rb-sel:focus{border-color:var(--accent)}
.rb-seg{display:inline-flex;border:1px solid var(--hair-b);border-radius:6px;overflow:hidden}
.rb-seg button{all:unset;cursor:pointer;font-family:var(--mono);font-size:13.5px;letter-spacing:.04em;padding:9px 16px;color:var(--ash)}
.rb-seg button.on{background:linear-gradient(180deg,rgba(var(--accent-rgb),.18),rgba(var(--accent-rgb),.06));color:var(--accent-2);box-shadow:inset 0 0 0 1px var(--accent-deep)}
.rb-seg button+button{border-left:1px solid var(--hair)}
.rb-search{margin-left:auto;width:400px;max-width:100%;display:inline-flex;align-items:center;gap:9px;border:1px solid var(--hair-b);background:var(--plate-2);padding:9px 12px;border-radius:6px;color:var(--ash-2);font-size:15px}
.rb-search .rb-si{flex:none;opacity:.9}
.rb-search input{all:unset;flex:1;color:#b3bac1;font-size:15px;font-family:var(--ui)}
.rb-search input::placeholder{color:var(--ash-2)}
.rb-empty{padding:28px;text-align:center;color:var(--ash-2)}
/* Кастомный дропдаун .csel (тот же, что на «Новом запуске») в тулбарах «Мои запуски»/«Прогоны»/
   «Пресеты». Компактный — под размер прежних .rb-sel; авто-ширина, чтобы не ломать flex-строку. */
#screen-runs .csel,#screen-admin .csel,#screen-presets .csel{position:relative;width:auto;min-width:150px}
#screen-runs .csel > select,#screen-admin .csel > select,#screen-presets .csel > select{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;margin:0;padding:0}
#screen-runs .csel-btn,#screen-admin .csel-btn,#screen-presets .csel-btn{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;color:#b3bac1;font-family:var(--mono);font-size:14px;letter-spacing:.04em;padding:9px 12px;cursor:pointer;transition:.14s;min-width:0}
#screen-runs .csel-btn:hover,#screen-admin .csel-btn:hover,#screen-presets .csel-btn:hover{border-color:var(--hair-hi)}
#screen-runs .csel.open .csel-btn,#screen-admin .csel.open .csel-btn,#screen-presets .csel.open .csel-btn{border-color:var(--accent);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.06)}
#screen-runs .csel-lbl,#screen-admin .csel-lbl,#screen-presets .csel-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#screen-runs .csel-arrow,#screen-admin .csel-arrow,#screen-presets .csel-arrow{color:var(--ash-2);font-size:12px;flex:none;transition:transform .15s}
#screen-runs .csel.open .csel-arrow,#screen-admin .csel.open .csel-arrow,#screen-presets .csel.open .csel-arrow{transform:rotate(180deg);color:var(--accent-2)}
#screen-runs .csel-panel,#screen-admin .csel-panel,#screen-presets .csel-panel{position:absolute;z-index:60;top:calc(100% + 6px);left:0;min-width:100%;width:max-content;max-width:340px;background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;box-shadow:0 22px 50px -18px rgba(0,0,0,.85);padding:5px;max-height:300px;overflow-y:auto;display:none}
#screen-runs .csel.open .csel-panel,#screen-admin .csel.open .csel-panel,#screen-presets .csel.open .csel-panel{display:block}
#screen-runs .csel-opt,#screen-admin .csel-opt,#screen-presets .csel-opt{padding:8px 11px;border-radius:5px;font-family:var(--mono);font-size:13.5px;color:var(--ash);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.1s}
#screen-runs .csel-opt:hover,#screen-admin .csel-opt:hover,#screen-presets .csel-opt:hover{background:rgba(var(--accent-rgb),.16);color:var(--bone)}
#screen-runs .csel-opt.sel,#screen-admin .csel-opt.sel,#screen-presets .csel-opt.sel{color:var(--accent-2)}
.rb-board{width:100%;table-layout:fixed}
.rb-board td{overflow-wrap:break-word}
.rb-board td .tbl-act{flex-wrap:wrap}
.rb-hrow td{padding:16px 0 7px;border:none;background:none;overflow:visible}
.rb-hrow:first-child td{padding-top:2px}
.tbl.rb-board tr.rb-hrow:hover td{background:none}
.rb-sect-hd{display:flex;align-items:center;gap:11px;padding:11px 14px;background:var(--plate-2);border:1px solid var(--hair);border-radius:6px}
.rb-sect-hd.clk{cursor:pointer}
.rb-sect-hd .ar{color:var(--ash-2);font-size:14px;width:11px;flex:none}
.rb-sect-hd h4{font-size:16px;font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase}
.rb-sect-hd .cnt{font-family:var(--mono);font-size:14px;border-radius:9px;padding:2px 10px}
.rb-sect-hd.run{box-shadow:inset 3px 0 0 var(--accent)} .rb-sect-hd.run h4{color:var(--accent-2)} .rb-sect-hd.run .cnt{color:var(--accent-2);background:rgba(var(--accent-rgb),.14)}
.rb-sect-hd.err{box-shadow:inset 3px 0 0 var(--err-2);background:rgba(var(--err-rgb),.05);border-color:rgba(var(--err-rgb),.2)} .rb-sect-hd.err h4{color:var(--err-2)} .rb-sect-hd.err .cnt{color:var(--err-2);background:rgba(var(--err-rgb),.12)}
.rb-sect-hd.wait{box-shadow:inset 3px 0 0 var(--amber-2)} .rb-sect-hd.wait h4{color:var(--amber-2)} .rb-sect-hd.wait .cnt{color:var(--amber-2);background:rgba(196,143,60,.15)}
.rb-sect-hd.done h4{color:var(--ash)} .rb-sect-hd.done .cnt{color:var(--ash);background:var(--plate-hi)}
.rb-sect-hd.gray{box-shadow:inset 3px 0 0 var(--ash)} .rb-sect-hd.gray h4{color:var(--ash)} .rb-sect-hd.gray .cnt{color:var(--ash);background:var(--plate-hi)}
/* Счётчик-лоадер: терминальные группы видны сразу при заходе, спиннер вместо числа пока фоновая
   загрузка (страницы kind=terminal) не доехала. Крутилка — общий keyframes edspin (редактор). */
.rb-sect-hd .cnt.ld{display:inline-flex;align-items:center;min-height:19px}
.rb-sect-hd .ld-spin{display:inline-block;width:11px;height:11px;border-radius:50%;border:2px solid rgba(255,255,255,.14);border-top-color:currentColor;animation:edspin .8s linear infinite}
.rb-sect-body{padding:0 2px}
.rb-errtxt{color:var(--err-2);font-size:12.75px;font-family:var(--mono)}
.rb-oav{width:22px;height:22px;border-radius:50%;background:var(--void);border:1px solid var(--hair);display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;color:var(--accent-2);flex:none;vertical-align:middle;margin-right:7px}
/* Владелец прогона — компактный чип (как «Доступ операторов» в деталях канала): аватар + имя в пилюле */
.rb-ochip{display:inline-flex;align-items:center;gap:7px;max-width:100%;padding:3px 10px 3px 3px;border:1px solid var(--hair-b);border-radius:20px;background:var(--plate-hi)}
.rb-ochip .av{width:20px;height:20px;border-radius:50%;background:linear-gradient(135deg,var(--accent-deep),var(--accent-dim));display:grid;place-items:center;font-family:var(--mono);font-size:10px;font-weight:700;color:var(--accent-2);flex:none}
.rb-ochip .nm{font-size:13px;color:var(--bone);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}

/* Log stream */
.logbox{background:var(--plate);border:1px solid var(--hair-b);padding:12px;font-family:var(--mono);font-size:15px;letter-spacing:.03em;line-height:1.9;color:var(--ash);overflow-y:auto}
.logbox .ll{display:flex;gap:8px}
.logbox .lk{color:var(--accent-2);flex:none}
.logbox .lk.cyan{color:var(--accent-2)}
.logbox .lk.green{color:var(--green)}
.logbox .lt{color:var(--ash-2)}

/* Empty state */
.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;gap:12px}
.empty-ico{font-size:32px;opacity:.2}
.empty-t{font-size:19.5px;font-weight:700;color:var(--ash);letter-spacing:.06em}
.empty-s{font-family:var(--mono);font-size:13.5px;color:var(--ash-2);letter-spacing:.06em}

/* Armor divider with label */
.arm-div{display:flex;align-items:center;gap:12px;margin:20px 0}
.arm-div::before,.arm-div::after{content:'';flex:1;height:1px;background:var(--hair-b)}
.arm-div span{font-family:var(--mono);font-size:12.75px;letter-spacing:.14em;color:var(--ash-2);white-space:nowrap;text-transform:uppercase}

/* ═══════════════════════════════════════════════════════
   PIPELINE SCREEN
═══════════════════════════════════════════════════════ */
.pip-topbar{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;border-bottom:1px solid var(--hair-b);background:rgba(10,11,14,.85);flex:none;gap:14px;flex-wrap:wrap}
.pip-run-meta{display:flex;align-items:center;gap:10px;min-width:0}
.pip-run-name{font-size:19.5px;font-weight:800;color:var(--bone);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pip-run-id{font-family:var(--mono);font-size:14.25px;color:var(--ash-2);flex:none}
.pip-chapters{display:flex;gap:3px;flex:none}
.ch-tab{all:unset;cursor:pointer;font-family:var(--mono);font-size:13.5px;letter-spacing:.08em;padding:5px 13px;border:1px solid var(--hair-b);color:var(--ash-2);transition:.12s;white-space:nowrap}
.ch-tab:hover{border-color:var(--hair-hi);color:var(--bone)}
.ch-tab.ch-active{border-color:var(--accent);color:var(--accent-2);background:rgba(var(--accent-rgb),.08)}
.ch-tab.ch-done{border-color:rgba(var(--accent-rgb),.25);color:var(--accent-2)}
.pip-flow{display:flex;align-items:stretch;border-bottom:1px solid var(--hair-b);background:rgba(7,8,10,.9);overflow-x:auto;flex:none;height:54px}
.pf-step{all:unset;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0 8px;min-width:70px;gap:4px;border-right:1px solid var(--hair);position:relative;transition:.12s;flex:1}
.pf-step:last-child{border-right:0}
.pf-step:hover{background:rgba(var(--accent-rgb),.04)}
.pf-nwrap{display:inline-flex;align-items:center;gap:4px}
.pf-n{font-family:var(--mono);font-size:12px;padding:1px 5px;border:1px solid var(--hair-b);color:var(--ash-2)}
.pf-ok{font-size:12px;line-height:1;font-weight:700;color:var(--green)}
.pf-l{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--ash-2);white-space:nowrap;font-weight:600}
.pf-step.pf-done .pf-n{border-color:rgba(var(--accent-rgb),.3);color:var(--accent-2)}
.pf-step.pf-done .pf-l{color:var(--accent)}
.pf-step.pf-skip{opacity:.5}
.pf-step.pf-skip .pf-n{border-color:var(--hair);color:var(--ash-2)}
.pf-step.pf-skip .pf-l{color:var(--ash-2);text-decoration:line-through;text-decoration-color:rgba(var(--wash-rgb),.35)}
.pf-step.pf-active{background:rgba(var(--accent-rgb),.06)}
.pf-step.pf-active .pf-n{border-color:var(--accent);color:var(--accent-2);background:rgba(var(--accent-rgb),.1)}
.pf-step.pf-active .pf-l{color:var(--bone);font-weight:800}
.pf-step.pf-active::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--accent);box-shadow:0 0 8px var(--accent)}
/* pf-sel — текущий выбранный шаг редактора (клик по иконке шага); отдельно от pf-active (=выполняется) */
.pf-step.pf-sel{background:rgba(var(--accent-rgb),.12)}
.pf-step.pf-sel .pf-n{border-color:var(--accent-2);color:var(--accent-2)}
.pf-step.pf-sel .pf-l{color:var(--bone);font-weight:800}
.pf-step.pf-sel::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--accent-2)}
.pf-warn{position:absolute;top:3px;right:4px;font-size:11px;line-height:1;color:var(--amber)}
.pip-body{display:grid;grid-template-columns:1fr 266px;flex:1;min-height:0;overflow:hidden}
.pip-content{display:flex;flex-direction:column;overflow:hidden;min-height:0}
.pip-sidebar{border-left:1px solid var(--hair-b);display:flex;flex-direction:column;overflow:hidden;background:rgba(7,8,10,.7);min-height:0}
.pip-sb-sect{border-bottom:1px solid var(--hair-b);padding:12px 13px;flex:none}
.pip-sb-log{flex:1;overflow:hidden;display:flex;flex-direction:column;padding:10px 13px;min-height:0}
.pip-sb-lbl{font-family:var(--mono);font-size:11.25px;letter-spacing:.2em;color:var(--ash-2);text-transform:uppercase;margin-bottom:8px}
.pip-info-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}
.pir-k{font-size:15px;color:var(--ash-2)}
.pir-v{font-family:var(--mono);font-size:15px;color:var(--bone)}
.pip-step-view{display:none}.pip-step-view.pv-active{display:flex;flex-direction:column;flex:1;overflow:hidden;min-height:0}
.psv-scroll{overflow-y:auto;flex:1;min-height:0;padding:14px 20px}
/* ═══════════════════════════════════════════════════════
   PIPELINE DETAIL PANEL (steps 5 / 6 / 7)
═══════════════════════════════════════════════════════ */
.pip-detail-panel{flex:none;height:222px;border-top:2px solid rgba(var(--accent-rgb),.35);background:var(--plate-2);display:none;flex-direction:column;overflow:hidden}
.pip-detail-panel.pdp-open{display:flex}
.pdp-hdr{display:flex;align-items:center;justify-content:space-between;padding:7px 14px;border-bottom:1px solid var(--hair-b);flex:none;background:rgba(4,4,5,.5)}
.pdp-hdr-left{display:flex;align-items:center;gap:10px}
.pdp-beat-num{font-family:var(--mono);font-size:15px;font-weight:700;letter-spacing:.14em;color:var(--bone)}
.pdp-beat-sub{font-family:var(--mono);font-size:12px;color:var(--ash-2)}
.pdp-hdr-right{display:flex;align-items:center;gap:6px}
.pdp-close{all:unset;cursor:pointer;font-family:var(--mono);font-size:16.5px;color:var(--ash-2);width:22px;height:22px;display:grid;place-items:center;transition:.1s;border:1px solid var(--hair)}
.pdp-close:hover{color:var(--accent-2);border-color:rgba(var(--accent-rgb),.3)}
.pdp-body{display:flex;flex:1;min-height:0;overflow:hidden}
.pdp-thumb{flex:none;overflow:hidden;position:relative;border-right:1px solid var(--hair-b)}
.pdp-thumb .bc-bg{position:absolute;inset:0;background-size:cover}
.pdp-thumb-act{position:absolute;bottom:0;left:0;right:0;padding:6px 8px;background:linear-gradient(transparent,rgba(4,4,5,.95));display:flex;gap:4px;flex-direction:column}
.pdp-controls{flex:1;min-width:0;padding:9px 13px;overflow-y:auto;display:flex;flex-direction:column;gap:7px}
.pdp-field{display:flex;flex-direction:column;gap:3px}
.pdp-lbl{font-family:var(--mono);font-size:11.25px;letter-spacing:.1em;color:var(--ash-2);text-transform:uppercase}
.pdp-ta{background:var(--plate-hi);border:1px solid var(--hair-b);color:var(--bone);font-family:var(--mono);font-size:14.25px;padding:6px 8px;resize:none;line-height:1.45;height:56px;outline:none;width:100%}
.pdp-ta:focus{border-color:rgba(var(--accent-rgb),.5)}
.pdp-settings{display:flex;gap:6px}
.pdp-settings .pdp-field{flex:1}
.pdp-settings .inp{padding:5px 8px;font-size:14.25px;height:26px}
.pdp-settings select.inp{height:26px}
.pdp-actions{display:flex;gap:5px;flex-wrap:wrap}
/* Beat cell selection */
.beat-cell.bc-selected{border-color:var(--accent)!important;box-shadow:0 0 0 1px var(--accent),0 0 10px rgba(var(--accent-rgb),.25)!important}
/* Audio beat cells */
.bc-audio-bars{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:2px;padding:8px 5px 22px;pointer-events:none}
.bc-abar{width:2px;border-radius:1px;background:var(--accent);opacity:.35}
.beat-cell.bc-done .bc-abar,.beat-cell.bc-audio-done .bc-abar{opacity:.7}
.bc-dur-lbl{position:absolute;bottom:3px;left:0;right:0;text-align:center;font-family:var(--mono);font-size:10.5px;color:var(--accent-2);letter-spacing:.04em;pointer-events:none}
/* Video beat cell */
.bc-play-ico{position:absolute;top:50%;left:50%;transform:translate(-50%,-60%);font-size:24px;opacity:.45;pointer-events:none;text-shadow:0 0 6px rgba(0,0,0,.9)}
.beat-cell:hover .bc-play-ico{opacity:.9}
/* Waveform in audio detail panel */
.pdp-waveform{flex:none;width:116px;border-right:1px solid var(--hair-b);display:flex;align-items:flex-end;justify-content:center;gap:2px;padding:20px 10px 28px;background:rgba(4,4,5,.5);position:relative}
.pdp-wfbar{width:3px;border-radius:2px;background:var(--accent);opacity:.75}
.pdp-wf-ctrl{position:absolute;bottom:6px;left:0;right:0;display:flex;justify-content:center;gap:5px}
/* Video detail thumb */
.pdp-video-thumb{flex:none;width:202px;border-right:1px solid var(--hair-b);position:relative;display:flex;align-items:center;justify-content:center;background:var(--plate);overflow:hidden}
.pdp-video-bg{position:absolute;inset:0;background-size:cover}
.pdp-video-play{font-size:30px;opacity:.7;cursor:pointer;transition:.15s;text-shadow:0 2px 12px rgba(0,0,0,.9);position:relative;z-index:1}
.pdp-video-play:hover{opacity:1;transform:scale(1.08)}
.pdp-video-dur{position:absolute;bottom:5px;right:8px;font-family:var(--mono);font-size:12px;color:var(--bone);background:rgba(4,4,5,.75);padding:1px 5px;z-index:1}
.beat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:7px}
.beat-cell{position:relative;aspect-ratio:16/9;border:1px solid var(--hair-b);overflow:hidden;cursor:pointer;transition:.12s}
.beat-cell:hover{border-color:var(--hair-hi);transform:scale(1.02)}
.beat-cell.bc-done{border-color:rgba(var(--accent-rgb),.18)}
.beat-cell.bc-gen{border-color:var(--accent);box-shadow:0 0 6px rgba(var(--accent-rgb),.3);animation:redpulse 1.4s ease-in-out infinite}
@keyframes redpulse{0%,100%{box-shadow:0 0 4px rgba(var(--accent-rgb),.2)}50%{box-shadow:0 0 14px rgba(var(--accent-rgb),.6)}}
.bc-bg{width:100%;height:100%}
.bc-badge{position:absolute;top:3px;right:3px;font-family:var(--mono);font-size:10.5px;padding:2px 5px;background:rgba(0,0,0,.78);letter-spacing:.06em}
.bc-badge.bk-ok{color:var(--accent-2)}
.bc-badge.bk-gen{color:var(--accent-2)}
.bc-num{position:absolute;bottom:3px;left:4px;font-family:var(--mono);font-size:10.5px;color:rgba(255,255,255,.35)}
.pip-desc-card{background:var(--plate-2);border:1px solid var(--hair-b);padding:20px;display:flex;align-items:flex-start;gap:16px}
.pdc-icon{font-size:28px;opacity:.5;flex:none;margin-top:2px}
.pdc-title{font-size:21px;font-weight:800;color:var(--bone);margin-bottom:6px}
.pdc-sub{font-family:var(--mono);font-size:14.25px;color:var(--ash-2);line-height:1.7;letter-spacing:.04em}
.pdc-meta{display:flex;gap:12px;margin-top:12px;flex-wrap:wrap}
.pdc-kv{font-family:var(--mono);font-size:13.5px;color:var(--ash-2)}
.pdc-kv b{color:var(--bone)}

/* ═══════════════════════════════════════════════════════
   WIZARD (NEW RUN)
═══════════════════════════════════════════════════════ */
.wiz-bar{display:flex;align-items:center;padding:14px 22px;border-bottom:1px solid var(--hair-b);background:rgba(10,11,14,.8);flex:none;gap:0}
.wiz-step{display:flex;align-items:center;gap:8px}
.wsn{width:22px;height:22px;display:grid;place-items:center;font-family:var(--mono);font-size:13.5px;font-weight:700;border:1px solid var(--hair-b);color:var(--ash-2);flex:none}
.wiz-step.ws-done .wsn{border-color:rgba(var(--accent-rgb),.3);color:var(--accent-2)}
.wiz-step.ws-active .wsn{border-color:var(--accent);color:var(--accent-2);background:rgba(var(--accent-rgb),.08)}
.wsl{font-size:15px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);white-space:nowrap}
.wiz-step.ws-active .wsl{color:var(--bone)}
.wiz-step.ws-done .wsl{color:var(--ash)}
.wsep{flex:1;height:1px;background:var(--hair-b);margin:0 12px;max-width:50px}
.wsep.we-done{background:rgba(var(--accent-rgb),.3)}
.wiz-page{display:none;flex:1;min-height:0;overflow-y:auto;padding:20px 22px}.wiz-page.wp-active{display:block}
.wiz-footer{border-top:1px solid var(--hair-b);padding:12px 22px;display:flex;justify-content:space-between;align-items:center;flex:none;background:rgba(10,11,14,.75)}
.wiz-row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.nr-scroll{flex:1;min-height:0;overflow-y:auto;padding:20px 22px}
.nr-block{margin-bottom:22px}
.soon{display:inline-block;font-size:12.75px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:#0a0b0e;background:var(--amber);border-radius:4px;padding:2px 6px;margin-left:8px;vertical-align:middle}
.nr-soon-card{opacity:.5;pointer-events:none;filter:grayscale(.4)}
.wiz-summary{background:var(--plate-2);border:1px solid var(--hair-b);padding:16px;margin-top:16px}
.ws-row{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--hair);font-size:16.5px}
.ws-row:last-child{border-bottom:0}
.ws-row .wsk{color:var(--ash-2);font-size:15px}
.ws-row .wsv{font-family:var(--mono);font-size:15.75px;color:var(--bone)}
.voice-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:8px}
.voice-opt{all:unset;cursor:pointer;border:1px solid var(--hair-b);padding:11px 10px;text-align:center;transition:.12s}
.voice-opt:hover{border-color:var(--hair-hi)}
.voice-opt.vo-on{border-color:var(--accent);background:rgba(var(--accent-rgb),.05)}
.tpl-preview{font-family:var(--mono);font-size:13.5px;color:var(--ash);background:rgba(4,4,5,.6);border:1px solid var(--hair-b);padding:10px 12px;border-radius:4px;white-space:pre-wrap;line-height:1.7;max-height:130px;overflow-y:auto;margin-top:4px}
.vo-name{font-size:16.5px;font-weight:700;color:var(--bone)}
.vo-desc{font-family:var(--mono);font-size:12px;color:var(--ash-2);margin-top:3px;letter-spacing:.04em}
/* ══════════════════════════════════════════════════════════════════════════════
   БИБЛИОТЕКА → ВКЛАДКА «ГОЛОСА» (ui/voices.js)
   ─────────────────────────────────────────────────────────────────────────────
   Переехало из экрана «Голоса» 15.08.2026 вместе с самой областью: голос живёт
   дольше одного ролика, как каст и упаковка, и его место — в библиотеке.
   Скоуп сменился с `#screen-voices` на `#screen-library .vo-pane`, а НЕ на весь
   экран библиотеки: блок переопределяет `.inp`/`.inp-lbl`, и общий скоуп
   перекрасил бы поля канона и упаковки заодно.
   Родословная стилей (редизайн 09.08.2026 по дизайн-системе ОБЕЛИСК): плита
   --plate-2/--cut, вложенное на --plate/6px, mono-капс подписи, каретка
   треугольником, все селекты — через общий .csel (своей копии тут больше нет).
   ══════════════════════════════════════════════════════════════════════════════ */
#screen-library .vo-pane{--track:rgba(var(--wash-rgb),.06)}

/* ── Плита верхнего уровня: --plate-2, --cut, диагональный блик (§7 «Карточка») ── */
#screen-library .vo-pane .vc-panel{position:relative;background:var(--plate-2);border:1px solid var(--hair-b);
  border-radius:var(--cut);padding:15px 17px 16px;margin-bottom:14px}
#screen-library .vo-pane .vc-panel::before{content:'';position:absolute;inset:0;border-radius:inherit;
  background:linear-gradient(135deg,rgba(255,255,255,.015),transparent 50%);pointer-events:none}
/* Шапка плиты: ромб-глиф + mono-капс 12.5/.09em/700 + тусклая мета справа (§7 «Шапка панели») */
#screen-library .vo-pane .vc-ph{display:flex;align-items:center;gap:9px;padding-bottom:10px;margin-bottom:13px;
  border-bottom:1px solid var(--hair)}
#screen-library .vo-pane .vc-ph h4{margin:0;font-family:var(--mono);font-size:12.5px;letter-spacing:.09em;
  text-transform:uppercase;font-weight:700;color:var(--bone)}
#screen-library .vo-pane .vc-ph h4::before{content:'';display:inline-block;width:5px;height:5px;margin-right:9px;
  background:var(--acc);box-shadow:0 0 6px var(--acc);
  clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);vertical-align:middle}
#screen-library .vo-pane .vc-ph-r{margin-left:auto;font-family:var(--mono);font-size:11px;letter-spacing:.06em;
  color:var(--ash-2);text-align:right}

/* ── Сетка полей и ряд кнопок ── */
/* align-items:start — у полей разной высоты (с подсказкой под инпутом и без) ряд иначе
   растягивается по самому высокому и поля «плавают» по вертикали. */
#screen-library .vo-pane .vc-grid-f{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
  gap:11px;align-items:start}
#screen-library .vo-pane .vc-row{display:flex;gap:9px;flex-wrap:wrap;align-items:center;margin-top:14px}
/* Поле внутри плиты — на --plate (утоплено) и 6px (§4 «правило трёх уровней») */
#screen-library .vo-pane .inp{background:var(--plate);border-radius:6px;font-size:15px;padding:9px 12px}
#screen-library .vo-pane .inp:focus{border-color:var(--acc);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.06)}
#screen-library .vo-pane input[type=number].inp{font-variant-numeric:tabular-nums}
/* Подпись поля — строго В ОДНУ строку: перенос сдвигал инпут вниз и ломал ряд (полная
   формулировка остаётся в title). */
#screen-library .vo-pane .inp-lbl{font-size:11.5px;letter-spacing:.13em;margin-bottom:5px;display:block;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#screen-library .vo-pane .vc-lim{font-family:var(--mono);letter-spacing:.04em;color:var(--ash-2);opacity:.75;
  text-transform:none;margin-left:5px}
#screen-library .vo-pane .vc-hint{font-family:var(--mono);font-size:11px;letter-spacing:.03em;color:var(--ash-2);
  line-height:1.5;margin-top:7px}
#screen-library .vo-pane .vc-checks{display:flex;flex-wrap:wrap;gap:14px 22px;margin-top:13px}
#screen-library .vo-pane .vc-chk{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;color:var(--ash);
  cursor:pointer}
#screen-library .vo-pane .vc-chk input{width:15px;height:15px;accent-color:var(--acc);border-radius:4px}

/* ── Свёртываемый блок формы (паузы, выход): та же плита, но с кареткой ── */
#screen-library .vo-pane .vc-bh{font-family:var(--mono);font-size:11.25px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--ash-2);display:flex;align-items:center;gap:9px;margin-bottom:11px}
#screen-library .vo-pane .vc-bh-r{margin-left:auto;letter-spacing:.04em;text-transform:none;font-size:11px}
#screen-library .vo-pane .vc-bh.clk{cursor:pointer;user-select:none;margin-bottom:0}
#screen-library .vo-pane .vc-block:not(.col) .vc-bh.clk{margin-bottom:11px}
#screen-library .vo-pane .vc-bh.clk:hover{color:var(--acc-2)}
/* Каретка — треугольник на бордюрах, не глиф ▾ (§7): на 11px глиф вырождается в чёрточку */
#screen-library .vo-pane .vc-ar{flex:none;width:0;height:0;border-left:5px solid transparent;
  border-right:5px solid transparent;border-top:6px solid var(--ash-2);transition:transform .18s;
  margin-left:2px}
#screen-library .vo-pane .vc-bh.clk:hover .vc-ar{border-top-color:var(--acc-2)}
#screen-library .vo-pane .vc-block.col .vc-ar{transform:rotate(-90deg)}
#screen-library .vo-pane .vc-block.col .vc-bbody{display:none}
#screen-library .vo-pane .vc-block .vc-bbody>.vc-grid-f{margin-top:11px}
#screen-library .vo-pane .vc-bbody>*:first-child{margin-top:0}
#screen-library .vo-pane .vc-block input:disabled,#screen-library .vo-pane .vc-block select:disabled,
#screen-library .vo-pane .vc-block .csel.dis .csel-btn{opacity:.42;cursor:not-allowed}

/* Капсульные бейджи параметров (§7 «.ml-badge»): pill 20px, mono 10px, тинт своего тона */
#screen-library .vo-pane .vc-tags{display:flex;flex-wrap:wrap;gap:5px}
#screen-library .vo-pane .vc-tag{font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;
  padding:2px 9px;border-radius:20px;background:var(--track);border:1px solid var(--hair);
  color:var(--ash);white-space:nowrap;font-variant-numeric:tabular-nums}
#screen-library .vo-pane .vc-tag.acc{background:rgba(var(--accent-rgb),.12);border-color:rgba(var(--accent-rgb),.3);
  color:var(--acc-2)}
#screen-library .vo-pane .vc-tag.warn{background:rgba(var(--amber-rgb),.1);border-color:rgba(var(--amber-rgb),.32);
  color:var(--amber-2)}

/* ── ВИТРИНА: плитки ОДНОГО размера ─────────────────────────────────────────────
   В отличие от канона (`.lib-tile.wide` растёт под число референсов) плитка голоса
   не растягивается никогда: голоса сравнивают на слух, а не по длине описания, и
   разновеликие карточки читались бы как «этот важнее». Отсюда фиксированный низ
   (ряд прослушки прибит `margin-top:auto`) и обрезка бейджей до трёх в JS. ── */
#screen-library .vo-bar{display:flex;align-items:center;gap:10px;margin-bottom:12px}
#screen-library .vo-bar-t{margin-right:auto;font-family:var(--mono);font-size:11.5px;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ash-2)}
#screen-library .vo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(252px,1fr));
  gap:12px;align-items:start}
/* Высота ФИКСИРОВАНА, а не min-height: у пресета бейджей две строки, у обычного голоса ни одной,
   и при min-height ряд тянулся по самой высокой плитке — «одного размера» ломалось ровно там, где
   в ряду оказывался пресет. Внутренние блоки под это подрезаны: имя в две строки, бейджи в две
   (`.vo-tags`), ряд прослушки прибит к низу через `margin-top:auto`. */
#screen-library .vo-tile{position:relative;display:flex;flex-direction:column;gap:9px;height:190px;
  background:var(--plate-2);border:1px solid var(--hair-b);border-radius:12px;padding:13px 14px 12px;
  transition:.14s}
#screen-library .vo-tile:hover{border-color:var(--hair-hi);background:linear-gradient(160deg,rgba(var(--accent-rgb),.03),var(--plate-2))}
/* Пресет — блёрпл-полоса слева (§ «статусы полосой»): «этот голос несёт настройки» */
#screen-library .vo-tile.preset{box-shadow:inset 3px 0 0 var(--acc)}
#screen-library .vo-t-top{display:flex;align-items:flex-start;gap:8px}
#screen-library .vo-t-hd{flex:1;min-width:0;cursor:pointer}
#screen-library .vo-t-hd:hover .vo-nm{color:var(--acc-2)}
/* Имя — максимум две строки: третья съедала бы ряд бейджей и ломала общий размер плитки */
#screen-library .vo-nm{font-size:15px;font-weight:700;color:var(--bone);line-height:1.32;
  overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
#screen-library .vo-id{font-family:var(--mono);font-size:11px;letter-spacing:.04em;color:var(--ash-2);
  margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Действия проявляются по наведению: на витрине из тридцати плиток постоянные ⚙/✕ дают
   частокол, в котором не видно имён. `:focus-within` — чтобы они были доступны с клавиатуры. */
#screen-library .vo-t-act{display:flex;gap:4px;flex:none;opacity:0;transition:opacity .14s}
#screen-library .vo-tile:hover .vo-t-act,#screen-library .vo-t-act:focus-within{opacity:1}
#screen-library .vo-mini{padding:4px 8px}
#screen-library .vo-tags{height:48px;overflow:hidden;align-content:flex-start}
#screen-library .vo-t-ft{margin-top:auto;display:flex;align-items:center;gap:6px;padding-top:10px;
  border-top:1px solid var(--hair)}
#screen-library .vo-listen{flex:1}
#screen-library .vo-listen-row{display:flex;align-items:center;gap:8px}
/* `color-scheme:dark` — единственный способ получить тёмный НАТИВНЫЙ плеер: своего аудио-компонента
   в дизайн-системе нет, а рисовать его ради прослушки в две секунды незачем. */
#screen-library .vo-au{flex:1;min-width:0;height:32px;color-scheme:dark}

/* ── Демо провайдера (🎧) ─────────────────────────────────────────────────────
   Кнопка, а не второй плеер: демо бесплатное и его щёлкают подряд по десятку голосов, а десяток
   нативных плееров в витрине — частокол. Играющая подсвечивается: проигрыватель один на вкладку,
   и без метки не видно, чей голос сейчас звучит. `flex:none` — чтобы 🎧 не тянулся вслед за
   «▶ Послушать» и ряд прослушки не прыгал по ширине между плитками. */
#screen-library .vo-demo{flex:none;font-size:13px;line-height:1}
#screen-library .vo-demo.on{color:var(--accent);border-color:var(--accent)}
#screen-library .vo-remote .vo-demo{padding:4px 9px}
/* Голос без образца: место под кнопку сохраняем прочерком — иначе «＋ Импортировать» у соседних
   строк стояли бы на разной вертикали и список читался бы рваным. */
#screen-library .vo-nodemo{flex:none;width:31px;text-align:center;color:var(--ash-2);
  font-family:var(--mono);font-size:12px}

/* ── Провайдер озвучки ───────────────────────────────────────────────────────
   Значок стоит у КАЖДОГО голоса, включая Lumean: в смешанном списке «нет значка» читается
   как «забыли проставить», а не как «этот — Lumean». ── */
#screen-library .vo-prov-b{font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;
  padding:1px 6px;border-radius:20px;border:1px solid var(--hair);background:var(--track);
  color:var(--ash-2);margin-right:7px;white-space:nowrap;text-transform:none}
#screen-library .vo-prov-b.fish{border-color:rgba(var(--accent-rgb),.35);
  background:rgba(var(--accent-rgb),.1);color:var(--acc-2)}
/* Радиовыбор провайдера — сегментами, а не голыми радиокнопками: выбор делается один раз и
   навсегда (id принадлежит провайдеру), поэтому он должен читаться как развилка, а не как галка. */
#screen-library .vo-prov-row{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:13px}
#screen-library .vo-prov{display:flex;flex-direction:column;gap:3px;padding:11px 13px;cursor:pointer;
  background:var(--plate);border:1px solid var(--hair-b);border-radius:7px;transition:.14s}
#screen-library .vo-prov:hover{border-color:var(--hair-hi)}
#screen-library .vo-prov.on{border-color:var(--acc);background:var(--accent-dim)}
#screen-library .vo-prov input{position:absolute;opacity:0;pointer-events:none}
#screen-library .vo-prov b{font-size:14px;color:var(--bone);font-weight:700}
#screen-library .vo-prov i{font-family:var(--mono);font-size:10.5px;letter-spacing:.02em;
  color:var(--ash-2);font-style:normal;line-height:1.45}
/* У заведённого голоса провайдер не меняется — вместо выбора объяснение, почему его тут нет */
#screen-library .vo-prov-fixed{display:flex;align-items:center;gap:8px;margin-bottom:13px;
  font-family:var(--mono);font-size:11px;letter-spacing:.02em;color:var(--ash-2);line-height:1.5}

/* ── Импорт из каталога провайдера: строки-кандидаты утоплены и пунктиром ── */
#screen-library .vo-remote{display:flex;align-items:center;gap:12px;padding:9px 12px;
  border:1px dashed var(--hair-b);border-radius:6px;margin-bottom:7px;background:var(--plate)}
#screen-library .vo-remote .vo-nm{font-size:14px;font-weight:600;-webkit-line-clamp:1}
#screen-library .vo-remote .vo-id{margin-top:2px}
#screen-library .vo-inlib{font-family:var(--mono);font-size:11px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--green-2);flex:none}

@media(max-width:680px){
  #screen-library .vo-pane .vc-grid-f{grid-template-columns:1fr}
  #screen-library .vo-grid{grid-template-columns:1fr}
  #screen-library .vo-t-act{opacity:1}   /* на тач-экране наведения нет — держим видимыми */
}

/* ═══════════════════════════════════════════════════════
   FILTER BAR / TABS
═══════════════════════════════════════════════════════ */
.filter-bar{display:flex;align-items:center;gap:10px;padding:11px 20px;border-bottom:1px solid var(--hair-b);flex:none;background:rgba(7,8,10,.7)}
.ftabs{display:flex;gap:0;border:1px solid var(--hair-b)}
.ftab{all:unset;cursor:pointer;padding:6px 13px;font-family:var(--mono);font-size:12.75px;letter-spacing:.1em;color:var(--ash-2);border-right:1px solid var(--hair-b);transition:.12s;text-transform:uppercase}
.ftab:last-child{border-right:0}
.ftab:hover{color:var(--bone);background:rgba(var(--accent-rgb),.04)}
.ftab.ft-on{color:var(--accent-2);background:rgba(var(--accent-rgb),.07)}
.fb-right{margin-left:auto;display:flex;align-items:center;gap:8px}

/* ═══════════════════════════════════════════════════════
   CHANNEL ANALYTICS
═══════════════════════════════════════════════════════ */
.chan-nav{display:flex;align-items:stretch;border-bottom:1px solid var(--hair-b);background:rgba(7,8,10,.95);flex:none}
.chan-ntab{all:unset;cursor:pointer;display:flex;align-items:center;gap:8px;padding:0 20px;height:44px;font-family:var(--mono);font-size:14.25px;letter-spacing:.08em;color:var(--ash-2);border-bottom:2px solid transparent;transition:.12s;white-space:nowrap;border-right:1px solid var(--hair)}
.chan-ntab:hover{color:var(--bone);background:rgba(var(--accent-rgb),.03)}
.chan-ntab.cn-on{color:var(--bone);border-bottom-color:var(--accent)}
.cn-dot{width:6px;height:6px;border-radius:50%;background:var(--green);box-shadow:0 0 5px rgba(var(--green-rgb),.5);flex:none}
.chan-nav-add{all:unset;cursor:pointer;display:flex;align-items:center;gap:6px;padding:0 16px;font-family:var(--mono);font-size:14.25px;color:var(--ash-2);margin-left:auto;border-left:1px solid var(--hair);transition:.12s}
.chan-nav-add:hover{color:var(--accent-2)}
.chan-body{flex:1;min-height:0;overflow-y:auto}
.chan-hdr{background:linear-gradient(180deg,var(--plate-hi),var(--plate-2));border-bottom:1px solid var(--hair-b);padding:14px 22px;display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.chan-av-lg{width:52px;height:52px;border-radius:50%;display:grid;place-items:center;font-size:31.5px;flex:none;border:2px solid var(--hair-b)}
.chan-hdr-meta{flex:1;min-width:180px}
.chan-hdr-name{font-size:22.5px;font-weight:800;color:var(--bone);margin-bottom:2px}
.chan-hdr-handle{font-family:var(--mono);font-size:12.75px;color:var(--ash-2);letter-spacing:.05em;margin-bottom:8px}
.chan-hdr-kpis{display:flex;gap:18px;flex-wrap:wrap}
.chk-v{font-family:var(--mono);font-size:19.5px;font-weight:700;color:var(--bone)}
.chk-l{font-size:11.25px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);margin-top:2px}
.chan-hdr-rev{display:flex;gap:16px;background:rgba(var(--accent-rgb),.06);border:1px solid rgba(var(--accent-rgb),.18);padding:10px 16px;flex:none}
.chr-v{font-family:var(--mono);font-size:25.5px;font-weight:700;color:var(--accent-2)}
.chr-l{font-size:11.25px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);margin-top:2px}
.chan-hdr-acts{display:flex;flex-direction:column;gap:5px;flex:none}
.chan-an{padding:14px 22px}
.an-2col{display:grid;grid-template-columns:1fr 280px;gap:12px;margin-bottom:16px;align-items:start}
.an-charts{display:flex;flex-direction:column;gap:10px}
.an-aside{display:flex;flex-direction:column;gap:10px}
.an-card{background:var(--plate-2);border:1px solid var(--hair-b);padding:13px}
.an-card-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}
.an-card-hd h4{font-size:12.75px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--bone)}
.an-cv{font-family:var(--mono);font-size:16.5px;font-weight:700}
.an-cv.red{color:var(--accent-2)}.an-cv.cyan{color:var(--accent-2)}.an-cv.green{color:var(--green)}.an-cv.amber{color:var(--amber)}
.an-card-sub{font-family:var(--mono);font-size:12px;color:var(--ash-2);margin-bottom:8px;display:flex;align-items:center;gap:6px}
.an-card-sub .tup{color:var(--green)}.an-card-sub .tdn{color:var(--accent-2)}
.an-ctrl{display:flex;gap:0;background:var(--plate);border:1px solid var(--hair)}
.ac-btn{all:unset;cursor:pointer;padding:3px 9px;font-family:var(--mono);font-size:12px;letter-spacing:.06em;color:var(--ash-2);transition:.1s;border-right:1px solid var(--hair)}
.ac-btn:last-child{border-right:0}
.ac-btn:hover{color:var(--bone)}
.ac-btn.aco{color:var(--accent-2);background:rgba(var(--accent-rgb),.08)}
.stat-item{display:flex;align-items:center;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--hair)}
.stat-item:last-child{border-bottom:0}
.si-left{display:flex;align-items:center;gap:7px}
.si-ico{font-size:19.5px;opacity:.55;flex:none;width:18px;text-align:center}
.si-label{font-size:16.5px;color:var(--ash)}
.si-right{text-align:right}
.si-val{font-family:var(--mono);font-size:18px;font-weight:700;color:var(--bone)}
.si-sub{font-family:var(--mono);font-size:12px;color:var(--ash-2);margin-top:1px}
.traffic-bar{height:3px;background:var(--plate-hi);overflow:hidden;margin-top:3px}
.traffic-bar .pb{height:100%}
.vid-cell{display:flex;align-items:center;gap:10px}
.vid-thumb-box{width:68px;height:38px;flex:none;overflow:hidden;border:1px solid var(--hair)}
.vid-title-txt{font-size:16.5px;font-weight:700;color:var(--bone);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.vid-pub-date{font-family:var(--mono);font-size:12px;color:var(--ash-2);margin-top:2px}
.ret-cell{display:flex;align-items:center;gap:5px;min-width:110px}
.ret-pct{font-family:var(--mono);font-size:16.5px;font-weight:700;flex:none;width:34px;text-align:right}
.ret-bar{height:4px;background:var(--plate-hi);flex:1;overflow:hidden;min-width:36px}
.ret-bar .pb{height:100%;background:var(--amber)}
.ret-bar .pb.green{background:var(--green)}
.tbl td.tr{text-align:right}
.num-big{font-family:var(--mono);font-size:16.5px;font-weight:700}
.num-cyan{color:var(--accent-2)}.num-green{color:var(--green)}.num-amber{color:var(--amber)}.num-red{color:var(--accent-2)}
.uq-item{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--hair)}
.uq-item:last-child{border-bottom:0}
.uq-t{font-size:16.5px;font-weight:700;color:var(--bone);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.uq-s{font-family:var(--mono);font-size:12px;color:var(--ash-2);margin-top:2px}
/* Legacy compat */
.ch-card{background:var(--plate-2);border:1px solid var(--hair-b);padding:14px;transition:.14s}
.cc-s{text-align:center;background:var(--plate-hi);padding:6px 4px;border:1px solid var(--hair)}
.cc-sv{font-family:var(--mono);font-size:16.5px;font-weight:700;color:var(--bone)}
.cc-sk{font-size:11.25px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);margin-top:2px}

/* ═══════════════════════════════════════════════════════
   ADMIN / WORKERS
═══════════════════════════════════════════════════════ */
.worker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:10px;margin-bottom:20px}
.worker-card{background:var(--plate-2);border:1px solid var(--hair-b);padding:14px;transition:.14s}
.worker-card:hover{border-color:var(--hair-hi)}
.wc-top{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.wc-av{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:700;font-size:16.5px;flex:none;border:1px solid var(--hair-b)}
.wc-name{font-size:18px;font-weight:700;color:var(--bone)}
.wc-role{font-family:var(--mono);font-size:12px;color:var(--ash-2);letter-spacing:.06em;text-transform:uppercase}
.wc-run-title{font-size:16.5px;color:var(--bone);margin-bottom:3px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wc-run-meta{font-family:var(--mono);font-size:12px;color:var(--ash-2);display:flex;gap:10px;margin-bottom:6px}
/* ═══════════════════════════════════════════════════════
   ДИСПЕТЧЕРСКАЯ — worker dispatch rows
═══════════════════════════════════════════════════════ */
.dispatch-list{display:flex;flex-direction:column;border:1px solid var(--hair-b);margin-bottom:20px}
.dispatch-row{border-bottom:1px solid var(--hair-b)}
.dispatch-row:last-child{border-bottom:0}
.dr-head{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;transition:.12s;user-select:none}
.dr-head:hover{background:rgba(var(--accent-rgb),.03)}
.dispatch-row.dr-open .dr-head{background:rgba(var(--accent-rgb),.045);border-bottom:1px solid var(--hair-b)}
.dr-av{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;font-size:24px;font-weight:800;flex:none;border:2px solid var(--hair-b)}
.dr-main{flex:1;min-width:0}
.dr-name-row{display:flex;align-items:center;gap:8px;margin-bottom:3px}
.dr-name{font-size:22.5px;font-weight:800;color:var(--bone)}
.dr-role{font-family:var(--mono);font-size:12px;letter-spacing:.06em;color:var(--ash-2);text-transform:uppercase}
.dr-task-row{display:flex;align-items:center;gap:10px;margin-bottom:5px;flex-wrap:wrap}
.dr-task-name{font-size:18px;color:var(--bone);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:340px}
.dr-task-ids{font-family:var(--mono);font-size:14.25px;color:var(--ash-2)}
.dr-stats-row{display:flex;align-items:center;gap:16px;font-family:var(--mono);font-size:14.25px;color:var(--ash-2)}
.dr-stat{display:flex;align-items:center;gap:4px}
.dr-stat b{color:var(--bone);font-weight:700}
.dr-pbar-inline{width:90px;height:3px;background:var(--plate-hi);overflow:hidden;flex:none}
.dr-pbar-fill{height:100%}
.dr-status-col{flex:none;display:flex;flex-direction:column;align-items:flex-end;gap:6px}
.dr-arrow{font-family:var(--mono);font-size:15px;color:var(--ash-2);transition:transform .18s;flex:none;width:18px;text-align:center}
.dispatch-row.dr-open .dr-arrow{transform:rotate(180deg)}
.dr-offline{opacity:.45}
/* Expanded body */
.dr-body{display:none;padding:12px 16px 14px 68px;background:rgba(4,4,5,.4)}
.dispatch-row.dr-open .dr-body{display:block}
.dr-session-bar{display:flex;gap:0;border:1px solid var(--hair-b);margin-bottom:14px;overflow:hidden}
.dr-sess-stat{flex:1;padding:10px 14px;border-right:1px solid var(--hair-b);background:var(--plate-hi)}
.dr-sess-stat:last-child{border-right:0}
.dss-lbl{font-family:var(--mono);font-size:12px;letter-spacing:.09em;color:var(--ash-2);text-transform:uppercase;margin-bottom:3px}
.dss-val{font-family:var(--mono);font-size:21px;font-weight:700;color:var(--bone)}
.dss-sub{font-family:var(--mono);font-size:12.75px;color:var(--ash-2);margin-top:1px}
.dr-sect-hd{font-family:var(--mono);font-size:11.25px;letter-spacing:.18em;color:var(--ash-2);text-transform:uppercase;padding:5px 0;border-bottom:1px solid var(--hair);margin-bottom:6px;display:flex;align-items:center;gap:8px}
.dr-sect-badge{background:var(--plate-hi);border:1px solid var(--hair-b);padding:1px 7px;font-size:11.25px;font-family:var(--mono)}
.dr-run-row{display:flex;align-items:center;gap:10px;padding:9px 11px;background:var(--plate-2);border:1px solid var(--hair-b);margin-bottom:4px;cursor:pointer;transition:.1s}
.dr-run-row:hover{border-color:var(--hair-hi)}
.dr-rr-title{font-size:18px;font-weight:600;color:var(--bone);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dr-rr-detail{font-family:var(--mono);font-size:13.5px;color:var(--ash-2);flex:none}
.dr-rr-pbar{flex:none;width:70px;height:4px;background:var(--plate-hi);overflow:hidden}
.dr-rr-pbar-f{height:100%;background:var(--accent)}
.dr-rr-spend{font-family:var(--mono);font-size:15px;color:var(--accent-2);flex:none}
.dr-rr-date{font-family:var(--mono);font-size:13.5px;color:var(--ash-2);flex:none}
.dr-empty-hint{font-family:var(--mono);font-size:12.75px;color:var(--ash-2);padding:5px 0;opacity:.6}
.dr-sect{margin-bottom:12px}

/* ═══════════════════════════════════════════════════════
   API / ПРОВАЙДЕРЫ
═══════════════════════════════════════════════════════ */
.api-list{display:flex;flex-direction:column;border:1px solid var(--hair-b);margin-bottom:20px}
.api-row{border-bottom:1px solid var(--hair-b)}
.api-row:last-child{border-bottom:0}
.api-head{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;transition:.1s;user-select:none}
.api-head:hover{background:rgba(255,255,255,.015)}
.api-row.api-open .api-head{background:rgba(var(--accent-rgb),.025);border-bottom:1px solid var(--hair-b)}
.api-status-dot{width:9px;height:9px;border-radius:50%;flex:none}
.api-status-dot.ok{background:var(--green);box-shadow:0 0 6px rgba(var(--green-rgb),.5)}
.api-status-dot.warn{background:var(--amber);box-shadow:0 0 6px rgba(var(--amber-rgb),.5)}
.api-status-dot.err{background:var(--err);box-shadow:0 0 6px rgba(var(--err-rgb),.5)}
.api-status-dot.off{background:var(--ash-2);box-shadow:none;opacity:.5}
.api-head-main{flex:1;min-width:0}
.api-name-row{display:flex;align-items:center;gap:10px;margin-bottom:3px}
.api-name{font-size:21px;font-weight:700;color:var(--bone)}
.api-model-tag{font-family:var(--mono);font-size:12.75px;letter-spacing:.04em;color:var(--ash-2);padding:2px 7px;border:1px solid var(--hair-b);background:var(--plate-hi)}
.api-status-label{font-family:var(--mono);font-size:13.5px}
.api-status-label.ok{color:var(--green)}
.api-status-label.warn{color:var(--amber)}
.api-status-label.err{color:var(--err-2)}
.api-ping{font-family:var(--mono);font-size:13.5px;color:var(--ash-2)}
.api-stats-row{display:flex;align-items:center;gap:16px;font-family:var(--mono);font-size:15px;color:var(--ash-2)}
.api-stat b{color:var(--bone);font-weight:700}
.api-spend-bar-wrap{width:100px;height:4px;background:var(--plate-hi);overflow:hidden;flex:none}
.api-spend-bar-f{height:100%}
.api-arrow{font-family:var(--mono);font-size:15px;color:var(--ash-2);transition:transform .18s;flex:none;width:18px;text-align:center}
.api-row.api-open .api-arrow{transform:rotate(180deg)}
.api-body{display:none;border-top:0;background:rgba(4,4,5,.4)}
.api-row.api-open .api-body{display:block}
.api-body-inner{padding:12px 16px 14px 16px;display:grid;grid-template-columns:1fr 1fr;gap:12px}
.api-detail-col{display:flex;flex-direction:column;gap:8px}
.api-detail-block{background:var(--plate-hi);border:1px solid var(--hair-b);padding:9px 12px}
.adb-label{font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);margin-bottom:4px}
.adb-val{font-family:var(--mono);font-size:19.5px;font-weight:700;color:var(--bone)}
.adb-sub{font-family:var(--mono);font-size:12.75px;color:var(--ash-2);margin-top:2px}
.api-log-row{display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--hair);font-family:var(--mono);font-size:13.5px}
.api-log-row:last-child{border-bottom:0}
.alog-time{color:var(--ash-2);flex:none;width:58px}
.alog-status{flex:none;width:24px;text-align:center}
.alog-ok{color:var(--green)}
.alog-err{color:var(--err-2)}
.alog-msg{color:var(--ash);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.alog-cost{color:var(--accent-2);flex:none}
.api-key-row{display:flex;align-items:center;gap:8px;padding:7px 0;border-bottom:1px solid var(--hair)}
.api-key-lbl{font-family:var(--mono);font-size:11.25px;color:var(--ash-2);flex:none;width:100px}
.api-key-val{font-family:var(--mono);font-size:13.5px;color:var(--ash);flex:1;overflow:hidden;text-overflow:ellipsis}

/* Heatmap */
.heatmap-wrap{overflow:hidden;width:auto}
.hm-months{display:flex;gap:3px;margin-bottom:4px}
.hm-month-lbl{font-family:var(--mono);font-size:11.25px;color:var(--ash-2);letter-spacing:.06em;flex:none;width:61px}
.heatmap{display:flex;flex-direction:column;gap:3px;width:auto}
.hm-row{display:flex;align-items:center;gap:3px;width:auto}
.hm-day-lbl{font-family:var(--mono);font-size:11.25px;color:var(--ash-2);width:20px;text-align:right;flex:none;padding-right:3px}
.hm-cell{flex:none;width:13px;height:13px;border-radius:2px;cursor:pointer;transition:.1s}
.hm-0{background:var(--plate-hi)}
.hm-1{background:#0c2818}
.hm-2{background:#165530}
.hm-3{background:#22884e}
.hm-4{background:var(--green)}
.hm-cell:hover{box-shadow:0 0 0 1.5px rgba(var(--green-rgb),.7)}
.hm-legend{display:flex;align-items:center;gap:5px;font-family:var(--mono);font-size:11.25px;color:var(--ash-2)}
/* Chart HTML date axis */
.chart-axis{display:flex;justify-content:space-between;padding:4px 0 0;font-family:var(--mono);font-size:10.5px}
.cad{color:rgba(var(--wash-rgb),.16)}.ca5{color:rgba(var(--wash-rgb),.28)}.cam{color:rgba(var(--wash-rgb),.44)}.cae{color:rgba(var(--wash-rgb),.35)}
.chart-months{display:flex;padding:3px 0 0;font-family:var(--mono);font-size:9px;color:rgba(var(--wash-rgb),.22);justify-content:space-between}
/* Skill performance bars */
.skill-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--hair)}
.skill-row:last-child{border-bottom:0}
.skill-label{font-size:15px;color:var(--ash);flex:none;width:82px}
.skill-bar-wrap{flex:1;height:5px;background:var(--plate-hi);overflow:hidden}
.skill-bar-fill{height:100%;transition:width .3s}
.skill-val{font-family:var(--mono);font-size:15px;font-weight:700;color:var(--bone);flex:none;width:28px;text-align:right}
.skill-grade{font-family:var(--mono);font-size:11.25px;flex:none;width:14px;text-align:center;font-weight:700}
/* Time-of-day heatmap */
.toh-wrap{overflow:hidden;width:100%}
.toh-labels-x{display:flex;padding-left:26px;margin-bottom:3px;gap:3px}
.toh-lx{font-family:var(--mono);font-size:9.75px;color:var(--ash-2);flex:1;text-align:center;min-width:0}
.toh-row{display:flex;align-items:center;gap:3px;margin-bottom:3px;width:100%}
.toh-lbl{font-family:var(--mono);font-size:10.5px;color:var(--ash-2);width:22px;text-align:right;flex:none;padding-right:2px}
.toh-cell{flex:1;min-width:0;height:18px;border-radius:1px}
.toh-0{background:var(--plate-hi)}
.toh-1{background:rgba(var(--accent-rgb),.12)}
.toh-2{background:rgba(var(--accent-rgb),.30)}
.toh-3{background:rgba(var(--accent-rgb),.55)}
.toh-4{background:rgba(var(--accent-rgb),.82)}
/* Provider bars */
.prov-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--hair)}
.prov-row:last-child{border-bottom:0}
.prov-name-cell{font-size:15px;color:var(--ash);flex:none;width:90px}
.prov-bar-wrap{flex:1;height:5px;background:var(--plate-hi);overflow:hidden}
.prov-bar-fill{height:100%}
.prov-val-cell{font-family:var(--mono);font-size:15px;font-weight:700;color:var(--bone);flex:none;width:44px;text-align:right}

/* ═══════════════════════════════════════════════════════
   COSTS
═══════════════════════════════════════════════════════ */
.chart-wrap{background:var(--plate-2);border:1px solid var(--hair-b);padding:16px;margin-bottom:14px}
.chart-hd{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.chart-hd h3{font-size:15px;font-weight:700;letter-spacing:.15em;text-transform:uppercase;color:var(--bone)}
.chart-hd span{font-family:var(--mono);font-size:13.5px;color:var(--ash-2)}
.provider-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(175px,1fr));gap:8px;margin-bottom:18px}
.prov-card{background:var(--plate-2);border:1px solid var(--hair-b);padding:13px}
.prov-name{font-size:13.5px;font-weight:700;letter-spacing:.1em;color:var(--ash);margin-bottom:4px;text-transform:uppercase}
.prov-val{font-family:var(--mono);font-size:25.5px;font-weight:700;color:var(--bone);margin-bottom:6px}
.prov-sub{font-family:var(--mono);font-size:12px;color:var(--ash-2)}
.prov-bar{height:2px;background:var(--plate-hi);margin-bottom:6px;overflow:hidden}
.prov-bar .pb{height:100%}

/* ═══════════════════════════════════════════════════════
   SETTINGS
═══════════════════════════════════════════════════════ */
.settings-cols{display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:start}
/* ── Сегмент-контрол вкладки «⚙ Настройки» в деталях рана (Медиа/Тайминг/Звук/Текст/О ране) ── */
.set-seg{display:flex;border:1px solid var(--hair-b);border-radius:9px;overflow:hidden;margin-bottom:18px}
.set-seg-t{all:unset;cursor:pointer;flex:1;text-align:center;padding:10px 8px;font-size:14px;font-weight:700;letter-spacing:.03em;color:var(--ash);border-right:1px solid var(--hair);transition:.12s;display:flex;align-items:center;justify-content:center;gap:7px;white-space:nowrap}
.set-seg-t:last-child{border-right:0}
.set-seg-t .si{font-size:15px}
.set-seg-t:hover{background:rgba(var(--accent-rgb),.05);color:var(--bone)}
.set-seg-t.on{background:linear-gradient(180deg,rgba(var(--accent-rgb),.16),rgba(var(--accent-rgb),.06));color:var(--bone);font-weight:800}
.set-seg-panel{display:none}
.set-seg-panel.on{display:block;animation:setSegFade .2s ease}
@keyframes setSegFade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
/* ── Кастом-дропдаун голоса на вкладке «⚙ Настройки» (как в «Новом запуске» Gemini) ── */
#set-wrap .csel{position:relative;width:100%}
#set-wrap .csel > select.inp{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;margin:0;padding:0}
#set-wrap .csel-btn{width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:6px;color:var(--bone);font-family:var(--mono);font-size:16.5px;letter-spacing:.04em;padding:10px 13px;cursor:pointer;transition:.14s;min-width:0}
#set-wrap .csel-btn:hover{border-color:var(--hair-hi)}
#set-wrap .csel.open .csel-btn{border-color:var(--accent);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.06)}
#set-wrap .csel-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#set-wrap .csel-arrow{color:var(--ash-2);font-size:12px;flex:none;transition:transform .15s}
#set-wrap .csel.open .csel-arrow{transform:rotate(180deg);color:var(--accent-2)}
#set-wrap .csel-panel{position:absolute;z-index:60;top:calc(100% + 6px);left:0;right:0;background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;box-shadow:0 22px 50px -18px rgba(0,0,0,.85);padding:5px;max-height:280px;overflow-y:auto;display:none}
#set-wrap .csel.open .csel-panel{display:block}
#set-wrap .csel-opt{padding:9px 11px;border-radius:5px;font-family:var(--mono);font-size:15px;color:var(--ash);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:.1s}
#set-wrap .csel-opt:hover{background:rgba(var(--accent-rgb),.16);color:var(--bone)}
#set-wrap .csel-opt.sel{color:var(--accent-2)}
#set-wrap #set-voice-id[readonly]{opacity:.6;cursor:not-allowed}
.key-row{display:flex;align-items:center;gap:6px;margin-bottom:8px}
.key-row .inp{flex:1;font-size:15px;font-family:var(--mono)}
.key-eye{all:unset;cursor:pointer;font-size:19.5px;color:var(--ash-2);padding:0 6px;transition:.12s;flex:none}
.key-eye:hover{color:var(--bone)}
.notif-row{display:flex;align-items:center;justify-content:space-between;padding:10px 0;border-bottom:1px solid var(--hair);gap:12px}
.notif-row:last-child{border-bottom:0}
.nt{font-size:16.5px;font-weight:600;color:var(--bone)}
.ns{font-family:var(--mono);font-size:12.75px;color:var(--ash-2);margin-top:2px}
.avatar-big{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,var(--accent-deep),var(--accent-dim));display:grid;place-items:center;font-size:36px;font-weight:800;color:var(--accent-2);border:2px solid var(--accent-dim);margin-bottom:12px}

/* ═══════════════════════════════════════════════════════
   SCREEN: РАБОЧИЙ СТОЛ
═══════════════════════════════════════════════════════ */
.home-greeting{display:flex;align-items:center;justify-content:space-between;margin-bottom:22px}
.home-greeting .hg-left h1{font-size:27px;font-weight:800;color:var(--bone);letter-spacing:.02em}
.home-greeting .hg-left .hg-sub{font-family:var(--mono);font-size:14.25px;color:var(--ash-2);letter-spacing:.06em;margin-top:3px}
.home-greeting .hg-right{display:flex;gap:8px}

/* Run cards */
.run-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;margin-bottom:24px}
.run-card{background:var(--plate-2);border:1px solid var(--hair-b);padding:16px 18px;cursor:pointer;transition:.14s;position:relative;overflow:hidden}
.run-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--hair-b);transition:.14s}
.run-card.run::before{background:var(--accent);box-shadow:0 0 8px var(--accent)}
.run-card.wait::before{background:var(--amber);box-shadow:0 0 6px rgba(var(--amber-rgb),.5)}
.run-card.done::before{background:var(--green);box-shadow:0 0 6px rgba(var(--green-rgb),.4)}
.run-card:hover{border-color:var(--hair-hi)}
.rc-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.rc-worker{font-family:var(--mono);font-size:12.75px;letter-spacing:.1em;color:var(--ash-2);text-transform:uppercase}
.rc-title{font-size:19.5px;font-weight:700;color:var(--bone);margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rc-meta{font-family:var(--mono);font-size:12.75px;color:var(--ash-2);letter-spacing:.04em;display:flex;gap:12px;margin-top:10px;flex-wrap:wrap}
.rc-meta span{display:flex;align-items:center;gap:4px}
.rc-step{font-size:15px;color:var(--ash);letter-spacing:.04em;margin-bottom:10px;display:flex;align-items:center;gap:8px}
.rc-step .rs-num{font-family:var(--mono);font-size:12px;padding:2px 7px;background:var(--plate-hi);border:1px solid var(--hair-b);color:var(--ash-2);white-space:nowrap}
.rc-pbar{margin-top:0}
.rc-pct{font-family:var(--mono);font-size:12px;color:var(--accent-2);text-align:right;margin-top:4px;letter-spacing:.04em}

/* Quick actions */
.quick-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:22px}
.qa-item{all:unset;cursor:pointer;display:flex;align-items:center;gap:12px;padding:14px 16px;border:1px solid var(--hair-b);background:var(--plate-2);transition:.14s}
.qa-item:hover{border-color:var(--hair-hi);background:rgba(var(--accent-rgb),.03)}
.qa-item .qa-ico{font-size:30px;flex:none;opacity:.6}
.qa-item .qa-text .qt{font-size:16.5px;font-weight:700;letter-spacing:.06em;color:var(--bone)}
.qa-item .qa-text .qs{font-family:var(--mono);font-size:12.75px;color:var(--ash-2);letter-spacing:.04em;margin-top:2px}

/* Блок «#vc-adv …» снят при редизайне «Голосов» 09.08.2026: его правила (.vc-adv-grid,
   .vc-sect-h, .vc-more, .vc-chk) описывали прежнюю форму на <details> и остались без единого
   пользователя. Действующие правила экрана — в секции «ЭКРАН „ГОЛОСА“» выше. */

/* ==================================================================
   Production editor / run-detail (было inline перед screen-run-detail)
   ================================================================== */
      /* ===== Production editor (Фаза 2) ===== */
      /* run-detail: видимость через .screen.active (не форсим display по id) */
      .ed-wrap{display:flex;flex-direction:column;flex:1;min-height:0}
      /* Загрузка рана: DOM экрана один на все прогоны, поэтому до приезда манифеста прячем ВСЁ
         содержимое (фазы, баннер, редактор) и показываем заставку — иначе виден предыдущий ран.
         Шапку не трогаем: «← Назад» обязан работать и пока грузится, а на медленном канале это
         единственный выход с экрана. Крутилка — общий keyframes edspin. */
      .rd-loading{display:none;flex:1;min-height:0;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px 20px}
      .rd-loading .spin{width:26px;height:26px;flex:none;border-radius:50%;border:2.5px solid rgba(255,255,255,.14);border-top-color:var(--accent);animation:edspin .8s linear infinite}
      .rd-loading .lt{font-family:var(--mono);font-size:13.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ash-2);text-align:center}
      .rd-loading.err .spin{display:none}
      .rd-loading.err .lt{color:var(--err-2);text-transform:none;letter-spacing:.02em;font-size:15px}
      #screen-run-detail.rd-busy #rd-loading{display:flex}
      /* !important — потому что перебиваем ИНЛАЙН-display, который проставил рендер ПРОШЛОГО рана
         (баннер «не хватает…», кнопки «Стоп»/«Продолжить», ряд действий). Без него именно они и
         оставались бы на экране от чужого прогона — то есть ровно то, что заставка чинит. */
      #screen-run-detail.rd-busy #rd-phases,
      #screen-run-detail.rd-busy #ed-banner,
      #screen-run-detail.rd-busy #rd-actions,
      #screen-run-detail.rd-busy .ed-wrap{display:none !important}
      .ed-banner{padding:6px 14px;background:rgba(160,127,65,.1);border-bottom:1px solid rgba(160,127,65,.22);color:var(--amber);font-size:15px;font-family:var(--mono);flex:none;text-align:center}
      /* Плашка «много завершённых прогонов» на «Мои запуски» (по мотивам .ed-banner, но карточкой с CTA+✕) */
      .mr-banner{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:9px 14px;margin:0 0 12px;background:rgba(160,127,65,.1);border:1px solid rgba(160,127,65,.28);border-radius:10px;color:var(--amber);font-size:14px;font-family:var(--mono)}
      .mr-banner .mrb-txt{flex:1;min-width:220px;line-height:1.4}
      .mr-banner .mrb-cta{flex:none;padding:5px 12px;border:1px solid rgba(160,127,65,.5);border-radius:8px;background:rgba(160,127,65,.14);color:var(--amber);font-family:var(--mono);font-size:13px;cursor:pointer;transition:.15s}
      .mr-banner .mrb-cta:hover{background:rgba(160,127,65,.26)}
      .mr-banner .mrb-x{flex:none;width:26px;height:26px;border:none;border-radius:6px;background:transparent;color:var(--amber);opacity:.7;font-size:15px;cursor:pointer;transition:.15s}
      .mr-banner .mrb-x:hover{opacity:1;background:rgba(160,127,65,.18)}
      .ed-nav{display:flex;align-items:center;gap:14px;padding:8px 14px;border-bottom:1px solid var(--hair-b);background:rgba(7,8,10,.6);flex:none;flex-wrap:wrap}
      .ed-navgrp{display:flex;align-items:center;gap:6px;min-width:0}
      .ed-navlbl{font-family:var(--mono);font-size:11.25px;letter-spacing:.2em;color:var(--ash-2);text-transform:uppercase;flex:none}
      .ed-chip{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border:1px solid var(--hair-b);border-radius:14px;background:rgba(255,255,255,.02);color:var(--ash);font-size:16.5px;cursor:pointer;transition:.15s;white-space:nowrap}
      .ed-chip:hover{border-color:rgba(255,255,255,.22);color:var(--bone)}
      .ed-chip.active{background:var(--accent-2);color:#04181c;border-color:var(--accent-2);font-weight:600}
      .ed-chip .gl{font-family:var(--mono);font-size:15px}
      .ed-chip-final{border-color:rgba(var(--gold-rgb),.4);color:var(--gold);margin-left:6px}
      .ed-chip-final.active{background:var(--gold);color:#1a1400;border-color:var(--gold)}
      /* «Все главы» — сквозная лента по всему ролику (см. ED_ALL_STEPS в core.js) */
      .ed-chip-all{border-color:rgba(var(--accent-rgb),.45);color:var(--accent-2);margin-right:6px}
      .ed-chip-all.active{background:var(--accent-deep);color:#fff;border-color:var(--accent-2)}
      .ed-tab{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-bottom:2px solid transparent;color:var(--ash-2);font-size:16.5px;cursor:pointer;transition:.15s;white-space:nowrap}
      .ed-tab:hover{color:var(--bone)}
      .ed-tab.active{color:var(--bone);border-bottom-color:var(--accent-2)}
      .ed-tab .tn{font-family:var(--mono);font-size:13.5px;opacity:.6}
      .ed-tab.done .tn{color:var(--accent-2);opacity:1}
      /* Admin-вкладка «История» прогона — таймлайн изменений (кто и во сколько) */
      .hist-wrap{padding:20px 24px;max-width:1060px}
      .hist-hd{display:flex;align-items:baseline;gap:13px;flex-wrap:wrap;margin-bottom:15px;padding-bottom:13px;border-bottom:1px solid var(--hair)}
      .hist-hd b{font-size:19px;font-weight:700;color:var(--bone);letter-spacing:.01em}
      .hist-hd .rd{font-family:var(--mono);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--ash-2)}
      .hist-flt{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:16px}
      .hist-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 13px;border:1px solid var(--hair-b);border-radius:8px;background:var(--plate-2);font-family:var(--mono);font-size:12.5px;letter-spacing:.04em;color:var(--ash-2);cursor:pointer;user-select:none;transition:.15s}
      .hist-chip:hover{color:var(--bone);border-color:var(--hair-hi)}
      .hist-chip.on{color:var(--bone);border-color:rgba(80,89,184,.45);background:rgba(var(--accent-rgb),.14)}
      .hist-chip b{color:var(--accent-2);font-weight:700;font-variant-numeric:tabular-nums}
      .hist-chip.on b{color:var(--bone)}
      .hist-list{display:flex;flex-direction:column}
      .hist-row{--hc:var(--ash-2);position:relative;display:grid;grid-template-columns:118px 20px 1fr;align-items:start;gap:13px;padding:10px 10px 10px 4px;border-radius:8px}
      .hist-row:hover{background:rgba(255,255,255,.025)}
      .hist-time{font-family:var(--mono);font-size:12.5px;line-height:1.5;color:var(--ash-2);text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums;padding-top:2px}
      .hist-rail{position:relative;align-self:stretch}
      .hist-rail::before{content:'';position:absolute;left:50%;top:0;bottom:0;width:1px;background:var(--hair);transform:translateX(-.5px)}
      .hist-row:first-child .hist-rail::before{top:11px}
      .hist-row:last-child .hist-rail::before{bottom:auto;height:11px}
      .hist-dot{position:relative;z-index:1;display:block;width:11px;height:11px;margin:5px auto 0;border-radius:50%;background:var(--hc);border:2px solid var(--plate);box-shadow:0 0 8px -1px var(--hc)}
      .hist-body{min-width:0;display:flex;flex-direction:column;gap:3px}
      .hist-meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:9px}
      .hist-who{font-weight:700;font-size:14px;color:var(--accent-2)}
      .hist-sys{font-family:var(--mono);font-size:12px;letter-spacing:.04em;color:var(--ash-2);opacity:.8}
      .hist-cat{font-family:var(--mono);font-size:10px;letter-spacing:.11em;text-transform:uppercase;color:var(--hc);opacity:.9}
      .hist-txt{font-size:15px;line-height:1.55;color:var(--bone);word-break:break-word}
      .hist-action{--hc:#888dc2}
      .hist-status{--hc:#7a828b}
      .hist-render{--hc:#4e8f86}
      .hist-gen{--hc:#5ea877}
      .hist-err{--hc:var(--err-2)}
      .hist-err .hist-txt{color:var(--err-2)}
      .ed-toolbar{display:flex;align-items:center;gap:10px;padding:7px 14px;border-bottom:1px solid var(--hair);flex:none;flex-wrap:wrap}
      .ed-counter{font-family:var(--mono);font-size:15px;color:var(--ash-2)}
      .ed-filter{display:flex;gap:4px}
      .ed-fbtn{padding:3px 9px;border:1px solid var(--hair-b);border-radius:10px;background:none;color:var(--ash-2);font-size:13.5px;cursor:pointer;font-family:var(--mono)}
      .ed-fbtn.active{background:rgba(255,255,255,.06);color:var(--bone);border-color:rgba(255,255,255,.22)}
      /* счётчик битов под фильтром в ТЕКУЩЕЙ главе: пустой фильтр видно до клика (в подсказке — по всему ролику) */
      .ed-fbtn .fc{margin-left:6px;font-size:12px;color:var(--ash-2);opacity:.85}
      .ed-fbtn.active .fc{color:var(--bone)}
      .ed-fbtn.zero{opacity:.45}
      .ed-fbtn.zero.active{opacity:.75}
      .ed-main{flex:1;min-height:0;display:flex;overflow:hidden}
      .ed-gallery{flex:1;min-height:0;overflow-y:auto;padding:14px;display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px;align-content:start}
      .ed-gallery.as-block{display:block;padding:0}  /* вкладка Персонажи: блочный поток, карточки видно целиком */
      /* Вкладка, которая обязана влезать в экран целиком («Таймлайн»): скролла у контейнера нет
         вовсе, прокручивается только то, что внутри и знает свои границы. */
      .ed-gallery.as-fit{overflow:hidden}
      /* шаги с плитками (Изображения/Голос/Видео): плитки фиксированного размера, лишнее — в скролл.
         Явная height у .ed-tile обязательна: у grid-элементов с одним aspect-ratio (без своей высоты)
         авто-дорожка схлопывается и пустые плитки наезжают друг на друга (баг Chromium). */
      .ed-gallery.as-tiles{grid-template-columns:repeat(auto-fill,208px);justify-content:start}
      .ed-tile{position:relative;border:1px solid var(--hair-b);border-radius:8px;overflow:hidden;background:#0a0b0d;cursor:pointer;transition:.15s;height:117px}
      .ed-tile:hover{border-color:rgba(var(--teal-rgb),.4);transform:translateY(-1px)}
      .ed-tile.sel{border-color:var(--accent-2);box-shadow:0 0 0 1px var(--accent-2)}
      .ed-tile img{width:100%;height:100%;object-fit:cover;display:block}
      .ed-tile .ph{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--ash-2);font-size:13.5px;font-family:var(--mono);text-align:center;padding:6px;background:repeating-linear-gradient(45deg,#0a0b0d,#0a0b0d 8px,var(--plate-pop) 8px,var(--plate-pop) 16px)}
      .ed-tile .bnum{position:absolute;top:5px;left:6px;font-family:var(--mono);font-size:12.75px;letter-spacing:.08em;color:#fff;background:rgba(0,0,0,.62);padding:2px 6px;border-radius:8px}
      .ed-tile .badge{position:absolute;top:5px;right:6px;font-size:12px;font-family:var(--mono);padding:2px 6px;border-radius:8px;text-transform:uppercase;letter-spacing:.04em}
      .ed-tile .badge.done{background:rgba(10,51,32,.8);color:#fff}
      .ed-tile .badge.missing{background:rgba(0,0,0,.62);color:#fff}
      .ed-tile .badge.none{background:rgba(0,0,0,.55);color:#fff}
      .ed-tile .badge.gen{background:rgba(var(--accent-rgb),.22);color:var(--accent-2);animation:blink 1.1s ease-in-out infinite}
      .ed-tile .badge.queued{background:rgba(var(--teal-rgb),.16);color:var(--accent-2)}
      .ed-tile .badge.regen{background:rgba(160,127,65,.18);color:var(--amber)}
      .ed-tile .badge.stale{background:rgba(160,127,65,.2);color:var(--amber)}
      .ed-tile .badge.err{background:rgba(var(--err-rgb),.18);color:var(--err-2)}
      .ed-tile .badge.cancelled{background:rgba(120,120,128,.22);color:var(--ash)}
      /* z-index 4 — СТРОГО выше .ed-loader (z 3): при равных z анимация спиннера выносит оверлей
         в свой композитный слой, порядок отрисовки «пляшет» → кнопка мерцала при наведении. */
      .ed-tile .ed-cancelbtn{position:absolute;bottom:5px;right:6px;z-index:4;width:22px;height:22px;border-radius:6px;border:1px solid rgba(var(--err-rgb),.5);background:rgba(0,0,0,.6);color:var(--err-2);font-size:12px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}
      .ed-tile .ed-cancelbtn:hover{background:rgba(var(--err-rgb),.35)}
      .ed-tile.stale{border-color:var(--amber);box-shadow:0 0 0 1px var(--amber)}
      .ed-tile .aud{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--ash);background:linear-gradient(135deg,#0c0e11,#10131a)}
      .ed-tile .aud .wv{font-size:33px;opacity:.8}
      .ed-tile .aud .du{font-family:var(--mono);font-size:13.5px;color:var(--ash-2)}
      .ed-stalebanner{display:inline-block;margin-left:8px;font-family:var(--mono);font-size:13.5px;color:var(--amber);background:rgba(160,127,65,.14);border:1px solid rgba(160,127,65,.3);padding:1px 7px;border-radius:8px}
      .ed-tile .vico{position:absolute;bottom:5px;right:6px;font-size:19.5px;color:#fff;text-shadow:0 1px 4px #000}
      .ed-tile .dot{position:absolute;bottom:6px;left:7px;width:7px;height:7px;border-radius:50%;background:var(--amber);box-shadow:0 0 0 2px rgba(0,0,0,.55)}
      .ed-tile .lk{position:absolute;bottom:5px;left:6px;font-size:15px;filter:drop-shadow(0 1px 2px #000)}
      /* Метка «сохранено вариантов» — кольцо версий бита (кадры/клипы) */
      .ed-tile .ed-tks{position:absolute;bottom:5px;right:6px;font-size:11px;padding:0 4px;border-radius:4px;background:rgba(10,11,13,.72);color:var(--bone);border:1px solid var(--hair-b)}
      .ed-tile .vico+.ed-tks{right:28px}
      /* Вырезанный бит в ленте кадров/клипов: кадр цел и открывается, но помечен ножницами и
         пригашен — иначе его перегенерировали бы, не заметив, что сцены в ролике уже нет. */
      .ed-tile.cut{opacity:.5;border-style:dashed}
      .ed-tile.cut:hover{opacity:.85}
      .ed-cutmark{position:absolute;top:5px;left:6px;font-size:12px;line-height:1;padding:1px 4px;border-radius:4px;
        background:rgba(var(--err-rgb),.22);border:1px solid rgba(var(--err-rgb),.5);color:var(--err-2)}
      @keyframes edpulse{0%,100%{opacity:.55}50%{opacity:1}}
      .ed-tile.regen{animation:edpulse 1.2s infinite}
      .ed-tile.queued{opacity:.82}
      .ed-prev-wrap{position:relative;border-radius:6px;overflow:hidden}
      .ed-loader{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:rgba(10,11,13,.55);z-index:3;pointer-events:none}
      .ed-loader .spin{width:26px;height:26px;border-radius:50%;border:2.5px solid rgba(255,255,255,.14);border-top-color:var(--accent);animation:edspin .8s linear infinite}
      .ed-loader .lt{font-family:var(--mono);font-size:11.25px;letter-spacing:.04em;color:var(--bone);text-transform:uppercase}
      .ed-loader.sm{gap:0;background:rgba(10,11,13,.45)}
      .ed-loader.sm .spin{width:20px;height:20px;border-width:2px}
      @keyframes edspin{to{transform:rotate(360deg)}}
      /* ── НОВЫЙ кино-вид «Изображения/Видео»: большой кадр + горизонтальная лента ── */
      /* overflow-y:auto (не hidden) + min-height у .edc-wrap: когда высоты хватает — кадр растягивается
         на всё (grow), когда мало (короткое окно / перенос глав в .ed-nav / баннер «не хватает…») —
         кино-вид не обрезается снизу (лента + ◀▶ + «Весь экран»), а прокручивается. */
      .ed-gallery.as-cinema{display:flex;flex-direction:column;padding:0;overflow-y:auto;overflow-x:hidden}
      .edc-wrap{flex:1;min-height:340px;display:flex;flex-direction:column}
      .edc-stagewrap{flex:1;min-height:0;display:flex;flex-direction:column;padding:14px 16px 8px}
      .edc-stage{flex:1;min-height:0;position:relative;background:#050607;border:1px solid var(--hair-b);border-radius:10px;overflow:hidden;display:flex;align-items:center;justify-content:center}
      /* width/height:100% + object-fit:contain, а НЕ max-width/max-height: элемент должен занимать
         сцену независимо от intrinsic-размера. С max-* видео БЕЗ метаданных бралo размер от своего
         постера (320×180) и плеер выходил размером с иконку, пока не нажмёшь ▶. Визуально contain
         даёт ровно то же вписывание, что и max-*, но размер бокса больше не зависит от содержимого.
         Заглушка кадра (миниатюра из ленты) едет ФОНОМ этого же элемента и вписывается тем же
         contain → полный кадр ложится точно на неё; отдельным слоем её класть нельзя — он
         позиционированный и рисовался бы ПОВЕРХ приехавшего оригинала. Снимает фон _edStageAfter. */
      .edc-stage img,.edc-stage video{width:100%;height:100%;object-fit:contain;background-size:contain;background-position:center;background-repeat:no-repeat}
      /* Идёт ЗАКАЧКА ассета (не генерация — та рисует .ed-loader). Спиннер поверх заглушки:
         иначе на медленном канале непонятно, «грузится» или «сломалось». */
      .edc-stage.loading::after,.edc-lb-stage.loading::after{content:'';position:absolute;left:50%;top:50%;width:26px;height:26px;margin:-13px 0 0 -13px;border-radius:50%;border:2.5px solid rgba(255,255,255,.16);border-top-color:var(--accent);animation:edspin .8s linear infinite;z-index:4;pointer-events:none}
      .edc-ph.big{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--ash-2);font-family:var(--mono);font-size:15px;background:repeating-linear-gradient(45deg,#0a0b0d,#0a0b0d 10px,var(--plate-pop) 10px,var(--plate-pop) 20px)}
      .edc-stage-empty{color:var(--ash-2);font-family:var(--mono);font-size:14px}
      .edc-substage{flex:none;display:flex;align-items:center;justify-content:center;gap:16px;padding:8px 0 2px;font-family:var(--mono);font-size:13px;color:var(--ash-2)}
      .edc-substage b{color:var(--bone)}
      .edc-arrow{all:unset;cursor:pointer;width:30px;height:30px;display:grid;place-items:center;border:1px solid var(--hair-b);border-radius:8px;color:var(--ash);font-size:13px;transition:.12s}
      .edc-arrow:hover{border-color:var(--accent);color:var(--accent-2)}
      /* Голос ЭТОГО бита (10.08.2026): плеер сегмента + реплика. Живёт в КАРТОЧКЕ бита — инспектор
         «Изображений»/«Видео» (.insp) и карточка таймлайна (.tl-card-vo). Плеер — нативный
         <audio controls> с медиа-фрагментом #t=start,end (как в инспекторе озвучки): нарезка на
         сервере не нужна, файл главы уже в кэше. */
      .edc-vo{flex:none;display:flex;align-items:center;gap:12px;padding:6px 0 2px;min-width:0}
      /* В инспекторе колонка узкая (260px плеера + текст в одну строку не влезают) — реплика
         переносится под плеер и показывается целиком, без многоточия. */
      .edc-vo.insp{flex-wrap:wrap;gap:8px 12px;padding:0}
      /* order: реплика уходит НА ВТОРУЮ строку целиком, поэтому 🎙 подтягиваем к плееру — иначе
         кнопка оставалась одна на третьей строке */
      .edc-vo.insp .edc-vo-tx{order:2;flex:1 1 100%;white-space:normal;overflow:visible;text-overflow:clip;font-size:16.5px;line-height:1.6}
      .edc-vo.insp .edc-vo-go{order:1}
      .edc-vo.insp .edc-vo-au{flex:1 1 180px;max-width:none}
      .edc-vo-au{height:32px;flex:0 0 260px;max-width:260px;filter:invert(.92) hue-rotate(180deg) saturate(.35)}
      .edc-vo-meta{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);flex:none;white-space:nowrap}
      .edc-vo-none{font-family:var(--mono);font-size:12px;color:var(--ash-2);flex:0 0 260px}
      .edc-vo-tx{flex:1 1 auto;min-width:0;font-size:14.25px;line-height:1.45;color:var(--ash);
        white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
      .edc-vo-tx.novo{color:var(--ash-2);font-style:italic}
      .edc-vo-go{flex:none}
      @media (max-width:900px){ .edc-vo-au,.edc-vo-none{flex-basis:190px} }
      .edc-reel{flex:none;height:98px;display:flex;gap:8px;overflow-x:auto;overflow-y:hidden;padding:8px 16px 12px;border-top:1px solid var(--hair);scrollbar-width:thin}
      .edc-thumb{flex:0 0 132px;height:74px;align-self:center;position:relative;border:1px solid var(--hair-b);border-radius:7px;overflow:hidden;background:#0a0b0d;cursor:pointer;transition:.12s}
      .edc-thumb:hover{border-color:var(--hair-hi)}
      .edc-thumb.sel{border-color:var(--accent-2);box-shadow:0 0 0 1px var(--accent-2)}
      /* Вырезанная сцена в ленте кино-вида — гасим и метим ножницами (кадр цел, но в ролик не идёт) */
      .edc-thumb.cut{opacity:.45;border-style:dashed}
      .edc-thumb.cut:hover{opacity:.9}
      .edc-thumb .ed-cutmark{top:4px;left:5px;font-size:11px}
      .edc-thumb img{width:100%;height:100%;object-fit:cover;display:block}
      .edc-ph{width:100%;height:100%;background:repeating-linear-gradient(45deg,#0a0b0d,#0a0b0d 7px,var(--plate-pop) 7px,var(--plate-pop) 14px)}
      /* Плейсхолдер ПОД ползущей сеткой (.edc-gen): свой узор снимаем — период у обоих 14px, и две
         одинаковые сетки друг на друге дают биение на такте анимации вместо ровного хода. */
      .edc-ph.flat{background:#0a0b0d}
      /* Бит В РАБОТЕ — поверх превью полупрозрачная ползущая косая сетка. Кладётся и на готовый кадр
         (шаг «Анимации»: картинка есть, клип ещё летит в FastGen — иначе превью выглядит законченным),
         и на пустой плейсхолдер (иначе «пусто» и «генерится» различались лишь 3px-полоской .edc-lb). */
      /* без z-index намеренно: в DOM сетка идёт ПОСЛЕ картинки, но ДО меток (.edc-lb/.edc-tn/…) —
         порядок отрисовки позиционированных элементов и оставляет номер бита и полоску статуса сверху */
      .edc-gen{position:absolute;inset:0;overflow:hidden;pointer-events:none;background:rgba(8,9,12,.5)}
      .edc-gen::before{content:'';position:absolute;inset:-24px;
        background:repeating-linear-gradient(45deg,transparent 0 7px,rgba(var(--accent-rgb),.38) 7px 14px);
        animation:edcHatch .85s linear infinite}
      /* сдвиг ровно на период узора вдоль X: полоса 14px под 45° → 14·√2 ≈ 19.8px, стык не виден */
      @keyframes edcHatch{to{transform:translateX(19.8px)}}
      .edc-gen.q::before{animation-duration:2.6s;opacity:.55}   /* в очереди — ещё ничего не крутится */
      .edc-lb{position:absolute;left:0;top:0;bottom:0;width:3px}
      .edc-lb.done{background:var(--green)}.edc-lb.stale{background:var(--amber)}.edc-lb.busy{background:var(--accent-2)}.edc-lb.err{background:var(--err-2)}.edc-lb.none{background:var(--ash-2)}
      .edc-tn{position:absolute;top:4px;left:5px;font-family:var(--mono);font-size:11px;color:#fff;background:rgba(0,0,0,.6);padding:1px 6px;border-radius:7px}
      /* Разделитель глав в сквозной ленте «Все главы»: вертикальная метка «Гл.N» между группами */
      .edc-chsep{flex:0 0 auto;align-self:stretch;display:flex;align-items:center;justify-content:center;
                 padding:0 3px;margin-left:4px;border-left:1px solid var(--hair-hi)}
      .edc-chsep span{writing-mode:vertical-rl;transform:rotate(180deg);font-family:var(--mono);font-size:10.5px;
                      letter-spacing:.06em;color:var(--ash-2)}
      .edc-reel .edc-chsep:first-child{border-left:0;margin-left:0}
      .edc-vico{position:absolute;bottom:4px;right:5px;font-size:13px;color:#fff;text-shadow:0 1px 3px #000}
      /* Сколько вариантов бита сохранено в кольце версий (кадры/клипы) */
      .edc-tks{position:absolute;top:4px;right:5px;font-family:var(--mono);font-size:10px;color:var(--bone);background:rgba(0,0,0,.6);padding:1px 4px;border-radius:7px}
      /* «На весь экран» + фуллскрин-лайтбокс (навигация кнопками ◀ ▶ ✕) */
      .edc-substage{position:relative}
      /* Предпросмотр «без рендера» — одна кнопка на трёх вкладках (Изображения/Видео/Таймлайн):
         играет озвучка, биты листаются сами. Цвет — фиолетовый (--vio), а не общий блёрпл: вокруг
         блёрпл уже носят рамки/подсветки выбранного кадра, и кнопка в нём терялась. */
      .ed-prevbtn{all:unset;cursor:pointer;flex:none;font-family:var(--mono);font-size:11.5px;letter-spacing:.06em;
        text-transform:uppercase;color:var(--vio-2);border:1px solid rgba(var(--vio-rgb),.6);
        background:rgba(var(--vio-rgb),.16);border-radius:7px;
        padding:6px 13px;transition:.12s;white-space:nowrap}
      .ed-prevbtn:hover{border-color:var(--vio);color:#fff;background:rgba(var(--vio-rgb),.3)}
      /* Под кадром группа стоит на ПОСТОЯННОМ месте — слева, зеркально «⛶ Весь экран» справа:
         в центральной группе (◀ позиция ▶) кнопка терялась среди одинаковых мелких кнопок.
         Позиционируем ОБЁРТКУ, а не саму кнопку: рядом с ней живёт селектор дорожки, и на
         `position:absolute` у кнопки он лёг бы поверх стрелок навигации. */
      .ed-prevgrp{display:flex;align-items:center;gap:7px}
      .edc-substage .ed-prevgrp{position:absolute;left:0;top:50%;transform:translateY(-50%)}
      /* Селектор аудиодорожки предпросмотра. Нейтральный, а не фиолетовый: кнопка рядом — это
         ДЕЙСТВИЕ, а это СОСТОЯНИЕ. Подсвечиваем, только когда играет не оригинал. */
      .ed-prevlangbtn{all:unset;cursor:pointer;flex:none;font-family:var(--mono);font-size:11.5px;
        letter-spacing:.04em;color:var(--ash);border:1px solid var(--hair-b);
        background:rgba(var(--wash-rgb),.04);border-radius:7px;padding:6px 11px;transition:.12s;
        white-space:nowrap}
      .ed-prevlangbtn:hover{border-color:var(--accent);color:var(--accent-2)}
      .ed-prevlangbtn.on{color:var(--vio-2);border-color:rgba(var(--vio-rgb),.6);
        background:rgba(var(--vio-rgb),.12)}
      .ed-prevbtn.on{background:linear-gradient(180deg,rgba(var(--vio-rgb),.5),rgba(var(--vio-rgb),.2));
        border-color:var(--vio);color:#fff;box-shadow:0 0 12px rgba(var(--vio-rgb),.45);animation:blink 1.6s infinite}
      .edc-fsbtn{all:unset;cursor:pointer;position:absolute;right:0;top:50%;transform:translateY(-50%);font-family:var(--mono);font-size:11.5px;letter-spacing:.04em;color:var(--ash);border:1px solid var(--hair-b);border-radius:7px;padding:5px 10px;transition:.12s}
      .edc-fsbtn:hover{border-color:var(--accent);color:var(--accent-2)}
      .edc-lightbox{position:fixed;inset:0;z-index:120;background:rgba(4,5,7,.9);backdrop-filter:blur(3px);display:none;align-items:center;justify-content:center;padding:48px;outline:none}
      .edc-lightbox.on{display:flex}
      .edc-lb-stage{position:relative;max-width:min(1400px,94vw);max-height:88vh;width:100%;aspect-ratio:16/9;display:flex;align-items:center;justify-content:center;background:#050607;border:1px solid var(--hair-hi);border-radius:12px;overflow:hidden}
      .edc-lb-stage img,.edc-lb-stage video{width:100%;height:100%;object-fit:contain;background-size:contain;background-position:center;background-repeat:no-repeat}
      .edc-lb-meta{position:absolute;left:0;right:0;bottom:0;padding:12px 18px;font-family:var(--mono);font-size:12.5px;color:var(--bone);background:linear-gradient(0deg,rgba(4,5,7,.92),transparent)}
      .edc-lb-nav{all:unset;cursor:pointer;position:fixed;top:50%;transform:translateY(-50%);width:52px;height:52px;display:grid;place-items:center;border-radius:50%;background:rgba(16,18,22,.85);border:1px solid var(--hair-b);color:var(--bone);font-size:22px;transition:.12s}
      .edc-lb-nav:hover{border-color:var(--accent);color:var(--accent-2)}
      .edc-lb-prev{left:22px}.edc-lb-next{right:22px}
      .edc-lb-close{all:unset;cursor:pointer;position:fixed;top:18px;right:24px;color:var(--ash);font-size:24px;z-index:2}
      .edc-lb-close:hover{color:var(--bone)}
      .ed-empty{grid-column:1/-1;text-align:center;color:var(--ash-2);font-size:18px;padding:46px 20px;line-height:1.7}
      .ed-cardbig{grid-column:1/-1;border:1px solid var(--hair-b);border-radius:10px;padding:18px;background:rgba(255,255,255,.02)}
      .ed-beatrow{display:flex;align-items:flex-start;gap:10px;padding:7px 0;border-bottom:1px solid var(--hair);cursor:pointer}
      .ed-beatrow:hover{background:rgba(255,255,255,.02)}
      .ed-beatrow .bk{font-family:var(--mono);font-size:13.5px;color:var(--ash-2);flex:none;width:62px}
      .ed-beatrow .bt{font-size:16.5px;color:var(--ash);line-height:1.55;flex:1}
      .ed-beatrow .vo-tag{flex:none;align-self:center;font-size:12.75px;letter-spacing:.04em;text-transform:uppercase;color:#af9a67;border:1px solid rgba(175,154,103,.4);border-radius:3px;padding:1px 5px;white-space:nowrap}
      .char-grid{grid-column:1/-1;display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;padding:14px}
      .char-card{border:1px solid var(--hair);border-radius:8px;padding:12px;background:rgba(255,255,255,.015)}
      .char-bar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:14px 14px 0}
      .char-edit{all:unset;cursor:pointer;margin-left:auto;color:var(--ash-2);font-size:16.5px;padding:0 4px}
      .char-edit:hover{color:var(--accent-2)}
      .char-nocard{font-size:12.75px;color:var(--ash-2);padding:10px;border:1px dashed var(--hair);border-radius:6px}
      .char-form{margin:12px 14px;padding:14px;border:1px solid var(--hair-b);border-radius:8px;background:rgba(255,255,255,.02);display:flex;flex-direction:column;gap:9px;max-width:760px}
      .char-form-hd{font-size:16.5px;font-weight:700;color:var(--bone)}
      .char-form input,.char-form textarea{background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:5px;color:var(--bone);padding:8px 10px;font-size:13.5px;box-sizing:border-box;width:100%}
      .char-form input:focus,.char-form textarea:focus{outline:none;border-color:var(--accent-deep)}
      .char-form textarea{min-height:100px;resize:vertical;line-height:1.55}
      .char-form-act{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
      .char-hd{display:flex;align-items:center;gap:8px;margin-bottom:10px;font-size:19.5px;color:var(--bone)}
      .char-role{font-size:13.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ash-2);border:1px solid var(--hair);border-radius:3px;padding:1px 6px;white-space:nowrap}
      .char-role.hero{color:#af9a67;border-color:rgba(175,154,103,.45)}
      .char-refs{display:flex;gap:8px;flex-wrap:wrap}
      .char-ref{margin:0;flex:1;min-width:90px;max-width:170px;position:relative}
      .char-ref img{width:100%;border-radius:6px;display:block;background:#1a1a1a;aspect-ratio:16/9;object-fit:cover;transition:box-shadow .12s}
      .char-ref figcaption{font-size:13.5px;color:var(--ash-2);text-align:center;margin-top:3px;text-transform:uppercase;letter-spacing:.04em}
      .char-ref.clk{cursor:pointer}
      .char-ref.clk:hover img{box-shadow:0 0 0 2px var(--accent-2)}
      .char-ref.clk:hover figcaption{color:var(--accent-2)}
      .char-ref.busy img{opacity:.4;filter:saturate(.55)}
      .char-refov{position:absolute;top:6px;left:4px;right:4px;text-align:center;font-size:11.25px;color:#1a1206;font-weight:800;background:#a28853;border-radius:5px;padding:3px 4px;z-index:2;animation:charpulse 1.4s ease-in-out infinite}
      .char-name.clk{cursor:pointer;border-bottom:1px dashed transparent}
      .char-name.clk:hover{color:var(--accent-2);border-bottom-color:var(--accent-2)}
      /* ── НОВЫЙ вид «Персонажи»: ростер слева + панель персонажа (один персонаж на экран) ── */
      .chr-root{height:100%;display:flex;flex-direction:column;overflow:hidden}
      .chr-root.has-form{overflow-y:auto}                          /* открыта форма персонажа/этапа — даём прокрутку, чтобы кнопки не ушли под кромку */
      .chr-root.has-form .chr-wrap{flex:none;min-height:60vh}      /* панель под формой держит рабочую высоту, вся связка скроллится целиком */
      .chr-wrap{flex:1;min-height:0;display:grid;grid-template-columns:268px 1fr;grid-template-rows:minmax(0,1fr);overflow:hidden;border-top:1px solid var(--hair)}
      .chr-roster{border-right:1px solid var(--hair-b);overflow:auto;min-height:0}
      .chr-roster-h{padding:12px 14px 8px;position:sticky;top:0;background:var(--void);border-bottom:1px solid var(--hair);z-index:1}
      .chr-list{padding:8px}
      .chr-card{all:unset;box-sizing:border-box;cursor:pointer;display:flex;align-items:center;gap:10px;width:100%;padding:8px 9px;border:1px solid transparent;border-radius:8px;margin-bottom:5px;position:relative}
      .chr-card:hover{background:rgba(var(--accent-rgb),.06);border-color:var(--hair)}
      .chr-card.sel{background:rgba(var(--accent-rgb),.12);border-color:var(--hair-hi)}
      .chr-card.sel::before{content:'';position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:3px;background:var(--accent)}
      .chr-av{width:38px;height:38px;border-radius:9px;flex:none;border:1px solid var(--hair-b);position:relative;overflow:hidden;background:#141414}
      .chr-av-i{position:absolute;inset:0;background-size:cover;background-position:center}
      .chr-av-g{position:absolute;inset:0;display:grid;place-items:center;font-weight:800;font-size:15px;color:rgba(255,255,255,.9)}
      .chr-ct{min-width:0;flex:1}
      .chr-nm{display:block;font-weight:700;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--bone)}
      .chr-rl{display:block;font-size:11.5px;color:var(--ash);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
      .chr-tag{font-family:var(--mono);font-size:9px;text-transform:uppercase;padding:2px 5px;border-radius:5px;border:1px solid var(--hair-b);color:var(--ash-2);flex:none}
      .chr-tag.hero{color:var(--accent-2);border-color:rgba(var(--accent-rgb),.35);background:rgba(var(--accent-rgb),.1)}
      .chr-panel{overflow:hidden;min-height:0;padding:16px 20px;display:flex;flex-direction:column;gap:14px}
      .chr-hero{display:flex;gap:15px;align-items:center;flex:none}
      .chr-hero-av{width:84px;height:84px;border-radius:13px;flex:none;border:1px solid var(--hair-hi);position:relative;overflow:hidden;background:#141414}
      .chr-hero-meta{min-width:0;flex:1}
      .chr-hero-nm{font-size:22px;font-weight:800;line-height:1.1;color:var(--bone)}
      .chr-hero-nm.clk{cursor:pointer;border-bottom:1px dashed transparent;display:inline-block}
      .chr-hero-nm.clk:hover{color:var(--accent-2);border-bottom-color:var(--accent-2)}
      .chr-hero-sub{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:5px 0}
      .chr-hero-sub>span:first-child{font-size:13.5px;color:var(--bone)}
      .chr-formtag{font-family:var(--mono);font-size:11px;text-transform:uppercase;padding:3px 10px;border-radius:20px;border:1px solid var(--hair-b);color:var(--ash)}
      .chr-formtag.hero{color:var(--accent-2);border-color:rgba(var(--accent-rgb),.4);background:rgba(var(--accent-rgb),.12)}
      .chr-desc{font-size:13px;color:var(--ash);line-height:1.5;max-width:640px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
      .chr-body{flex:1;min-height:0;display:flex;flex-direction:column;gap:14px}
      .chr-sec{min-height:0;display:flex;flex-direction:column}
      .chr-sec-st{flex:none}
      .chr-sec-ap{flex:1;min-height:0}
      .chr-sec-h{display:flex;align-items:baseline;gap:10px;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--hair)}
      .chr-sec-h h3{margin:0;font-size:13.5px;font-weight:700;color:var(--bone)}
      .chr-sec-h .chr-sub{font-size:11px;color:var(--ash-2)}
      .chr-stages{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,188px));gap:14px;justify-content:start}
      .chr-stage{border:1px solid var(--hair-b);border-radius:var(--cut);overflow:hidden;background:rgba(255,255,255,.015);position:relative}
      .chr-stage.clk{cursor:pointer}
      .chr-stage.clk:hover{border-color:var(--hair-hi)}
      .chr-st-ref{position:relative;aspect-ratio:1/1;border-bottom:1px solid var(--hair-b);background:#141414}
      .chr-st-ref img{width:100%;height:100%;object-fit:cover;display:block}
      .chr-st-ref .chr-stnum{position:absolute;top:6px;right:6px;font-family:var(--mono);font-size:11px;color:#fff;background:rgba(var(--accent-rgb),.72);padding:2px 8px;border-radius:6px}
      .chr-stov{position:absolute;top:6px;left:6px;right:6px;text-align:center;font-size:11px;color:#1a1206;font-weight:800;background:#a28853;border-radius:5px;padding:3px;z-index:2;animation:charpulse 1.4s ease-in-out infinite}
      .chr-st-b{padding:9px 11px}
      .chr-st-l{font-weight:700;font-size:14px;margin-bottom:2px;color:var(--bone)}
      .chr-st-c{font-family:var(--mono);font-size:11px;color:var(--ash)}
      .chr-nostage{color:var(--ash-2);font-size:13px;padding:10px 0}
      .chr-chips{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:6px;flex:none}
      .chr-chch{all:unset;cursor:pointer;font-family:var(--mono);font-size:11.5px;padding:4px 10px;border:1px solid var(--hair-b);border-radius:20px;color:var(--ash)}
      .chr-chch:hover{border-color:var(--accent);color:var(--bone);background:rgba(var(--accent-rgb),.1)}
      .chr-chch.off{opacity:.4;cursor:default;pointer-events:none}
      .chr-chch b{color:var(--accent-2)}
      .chr-beatstrip{display:grid;grid-template-columns:repeat(auto-fill,128px);grid-auto-rows:72px;gap:9px;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;align-content:start;justify-content:start;padding-right:4px}
      .chr-tile{width:128px;height:72px;border:1px solid var(--hair-b);border-radius:6px;overflow:hidden;cursor:pointer;background:#0a0b0d}
      .chr-tile:hover{border-color:var(--hair-hi)}
      .chr-tile img{width:100%;height:100%;object-fit:cover;display:block}
      .chr-empty{color:var(--ash-2);font-size:13px;padding:16px 2px}
      @media(max-width:820px){.chr-wrap{grid-template-columns:1fr;grid-template-rows:auto minmax(0,1fr)}.chr-roster{border-right:0;border-bottom:1px solid var(--hair-b);max-height:32vh}}
      .scn-raw{margin:4px 0 12px;border:1px solid var(--hair);border-radius:6px;overflow:hidden}
      .scn-raw summary{cursor:pointer;padding:7px 10px;font-size:15px;text-transform:uppercase;letter-spacing:.05em;color:var(--ash-2);background:rgba(255,255,255,.02);user-select:none}
      .scn-raw pre{margin:0;padding:10px;font-family:var(--mono);font-size:15px;line-height:1.5;color:var(--ash);white-space:pre-wrap;max-height:340px;overflow:auto;border-top:1px solid var(--hair)}
      .scn-prog{grid-column:1/-1;display:flex;flex-direction:column;gap:10px;padding:14px}
      .scn-stage{font-size:16.5px;color:var(--bone);display:flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid var(--hair);border-radius:6px;background:rgba(var(--teal-rgb),.04)}
      .ss-dot{font-weight:700}.ss-dot.ok{color:#4f6f60}
      .scn-chap{border:1px solid var(--hair);border-radius:7px;overflow:hidden;background:rgba(255,255,255,.012)}
      .scn-chap>summary{cursor:pointer;list-style:none;padding:9px 12px;display:flex;align-items:center;gap:10px;font-size:18px;color:var(--bone);user-select:none}
      .scn-chap>summary::-webkit-details-marker{display:none}
      .scn-chips{margin-left:auto;display:flex;gap:5px;flex-wrap:wrap}
      .ss-chip{font-size:12.75px;text-transform:uppercase;letter-spacing:.03em;border-radius:3px;padding:1px 6px;white-space:nowrap;border:1px solid var(--hair);color:var(--ash-2)}
      .ss-chip.ok{color:#4f6f60;border-color:rgba(79,111,96,.4)}
      .ss-chip.wip{color:#af9a67;border-color:rgba(175,154,103,.4)}
      .ss-chip.prog{color:var(--accent-2);border-color:rgba(var(--accent-rgb),.4)}
      .scn-wait{padding:8px 14px;font-size:15px;color:#af9a67}
      .scn-beats{padding:4px 12px 10px}
      .scn-beat{display:flex;gap:9px;padding:4px 0;border-top:1px solid rgba(255,255,255,.04);font-size:16.5px;color:var(--ash);line-height:1.5}
      .scn-beat .bk{flex:none;width:22px;text-align:right;color:var(--ash-2);font-family:var(--mono);font-size:13.5px;padding-top:2px}
      .scn-rawline{padding:6px 12px 10px;font-size:15px}
      .scn-rawline a{color:var(--ash-2);text-decoration:none;border-bottom:1px dotted var(--ash-2)}
      /* ══ ВКЛАДКА «ТАЙМЛАЙН» (10.08.2026) ═══════════════════════════════════════════════════
         Ролик как монтажная лента: 4 дорожки, ширина блока = длительности бита. Прокрутка ТОЛЬКО
         внутри .tl-scroll (страница вправо не едет), подпись дорожки липнет слева. */
      .tl-wrap{grid-column:1/-1;display:flex;flex-direction:column;gap:10px;padding:12px 14px;min-width:0}
      .tl-top{flex:none;display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:14px;color:var(--ash)}
      .tl-total b{font-family:var(--mono);color:var(--bone)}
      .tl-meta{font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2)}
      .tl-zoom{display:flex;border:1px solid var(--hair-b);border-radius:6px;overflow:hidden}
      .tl-zoom button{all:unset;cursor:pointer;padding:5px 12px;font-family:var(--mono);font-size:12px;color:var(--ash-2)}
      .tl-zoom button:hover{color:var(--bone);background:rgba(var(--accent-rgb),.06)}
      .tl-zoom button.on{background:linear-gradient(180deg,rgba(var(--accent-rgb),.35),rgba(var(--accent-rgb),.14));
        color:#fff;box-shadow:inset 0 0 0 1px var(--accent-deep)}
      .tl-warn{flex:none;font-size:13.5px;color:var(--amber-2);border:1px solid rgba(var(--amber-rgb),.35);
        background:rgba(var(--amber-rgb),.07);border-radius:6px;padding:8px 12px}
      .tl-scroll{overflow-x:auto;overflow-y:hidden;padding-bottom:6px}
      .tl-inner{display:inline-block;min-width:100%}
      .tl-ruler{position:relative;height:20px;margin-left:74px;border-bottom:1px solid var(--hair)}
      .tl-ruler span{position:absolute;top:1px;font-family:var(--mono);font-size:10px;color:var(--ash-2);
        letter-spacing:.06em;padding-left:4px;border-left:1px solid var(--hair-b)}
      .tl-band{display:flex;gap:2px;margin:6px 0 6px 74px}
      .tl-ch{flex:none;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;
        color:var(--accent-2);background:rgba(var(--accent-rgb),.12);border:1px solid rgba(var(--accent-rgb),.35);
        border-radius:4px;padding:3px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
      /* Бегунок предпросмотра: едет по дорожкам, пока играет озвучка (см. _prevPlayhead). */
      .tl-inner{position:relative}
      .tl-ph{position:absolute;top:20px;bottom:0;width:2px;background:var(--accent-2);
        box-shadow:0 0 10px var(--accent);z-index:7;pointer-events:none;display:none}
      .tl-ph::before{content:'';position:absolute;top:-4px;left:-4px;width:10px;height:10px;border-radius:50%;
        background:var(--accent-2);box-shadow:0 0 8px var(--accent)}
      .tl-track{display:flex;align-items:stretch;margin-bottom:4px}
      .tl-name{position:sticky;left:0;z-index:4;flex:0 0 74px;width:74px;display:flex;align-items:center;
        font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ash-2);
        background:var(--void);padding-right:6px}
      .tl-row{display:flex;gap:2px}
      .tl-blk{position:relative;flex:none;border:1px solid var(--hair-b);border-radius:4px;overflow:hidden;
        cursor:pointer;min-width:0;background:var(--plate-2)}
      .tl-blk:hover{border-color:var(--hair-hi)}
      .tl-blk.sel{border-color:var(--accent);box-shadow:0 0 10px rgba(var(--accent-rgb),.35)}
      /* Вырезанный бит: место в ленте держит (его длительность ещё в озвучке, пока её не
         перегенерировали), но гасится и перечёркнут — сразу видно, что в ролик он не идёт. */
      .tl-blk.cut{opacity:.52;border-style:dashed;border-color:rgba(var(--err-rgb),.5)}
      /* Перечёркивание — 2px и по яркому тону: на пригашенном блоке однопиксельная линия
         в ленте попросту не читается (проверено на стенде). */
      .tl-blk.cut::after{content:'';position:absolute;inset:calc(50% - 1px) 0 auto 0;height:2px;
        background:var(--err-2);opacity:.95;pointer-events:none}
      .tl-cutn{color:var(--err-2)}
      .tl-img .tl-blk{height:62px}
      .tl-th{width:100%;height:100%;background-size:cover;background-position:center;display:grid;place-items:center}
      .tl-th.none{background:repeating-linear-gradient(45deg,#0a0b0d,#0a0b0d 8px,var(--plate-pop) 8px,var(--plate-pop) 16px)}
      .tl-th.stale{outline:2px solid rgba(var(--amber-rgb),.55);outline-offset:-2px}
      .tl-x{font-family:var(--mono);font-size:12px;color:var(--ash-2)}
      .tl-busy{width:16px;height:16px;border-radius:50%;border:2px solid rgba(255,255,255,.14);
        border-top-color:var(--accent);animation:edspin .8s linear infinite}
      .tl-bn{position:absolute;top:2px;left:4px;font-family:var(--mono);font-size:10px;color:#fff;text-shadow:0 1px 3px #000}
      .tl-vid .tl-blk{height:26px}
      .tl-vv{display:flex;width:100%;height:100%;align-items:center;justify-content:center;
        font-family:var(--mono);font-size:10px;letter-spacing:.06em;color:var(--ash-2);overflow:hidden;white-space:nowrap}
      .tl-vv.has{background:linear-gradient(180deg,rgba(var(--accent-rgb),.3),rgba(var(--accent-rgb),.1));color:var(--accent-2)}
      .tl-vv.stale{background:linear-gradient(180deg,rgba(var(--amber-rgb),.3),rgba(var(--amber-rgb),.1));color:var(--amber-2)}
      .tl-vv.off{opacity:.45}
      .tl-aud .tl-blk{height:38px}
      .tl-wave{display:flex;align-items:center;gap:1px;width:100%;height:100%;padding:0 2px}
      .tl-wave i{flex:1;min-width:1px;border-radius:1px;background:rgba(var(--green-rgb),.6)}
      .tl-wave.off i{background:rgba(var(--wash-rgb),.12)}
      .tl-wave.stale i{background:rgba(var(--amber-rgb),.7)}
      .tl-txt .tl-blk{height:42px;background:var(--plate)}
      .tl-tx{display:block;padding:4px 6px;font-size:11.5px;line-height:1.35;color:var(--ash);
        overflow:hidden;max-height:100%}
      /* Карточка выбранного бита — НАД лентой (11.08.2026): правят кадр и текст, лента под ними
         работает навигацией. Кадр — главный элемент: карточка забирает всю свободную высоту
         вкладки (`flex:1` в колоночном `.tl-wrap`), картинка вписывается целиком (`contain`,
         а не `cover`: кадр смотрят, а не подрезают). Лента внизу — своей высоты (`flex:none`).
         Вкладка помещается в экран целиком (16.08.2026): высота — РОВНО высота галереи
         (`height:100%`, а не `min-height:100%`), карточка берёт остаток (`flex:1 1 0` — базис
         НОЛЬ, иначе её раздувало содержимым), прокручивается только внутри колонок. Раньше
         длинный промт растил карточку, и лента уезжала за нижний край экрана. */
      .tl-wrap{height:100%;min-height:0;overflow:hidden}
      .tl-scroll{flex:none}
      .tl-card{display:flex;border:1px solid var(--hair-b);border-radius:var(--cut);
        background:var(--plate-2);padding:12px;flex:1 1 0;min-height:0}
      /* `grid-template-rows:minmax(0,1fr)` обязателен: авто-строка меряется содержимым (превью,
         поля) и растянула бы карточку сверх отведённой ей высоты.
         Колонки ДВЕ (16.08.2026): превью + поля. Третья (промты) уехала в попап, и освободившееся
         место отдано превью — на «Таймлайне» смотрят ролик, а не читают четыре простыни разом. */
      .tl-card-in{flex:1 1 auto;min-width:0;min-height:0;display:grid;gap:14px;
        grid-template-rows:minmax(0,1fr);
        grid-template-columns:minmax(320px,54%) minmax(0,1fr)}
      .tl-card-in.dirty{box-shadow:inset 3px 0 0 var(--amber-2);border-radius:6px}
      .tl-card-in:not(.dirty) .scn2-save{opacity:.45}
      .tl-card-in.cut .tl-card-hd b{text-decoration:line-through}
      .tl-card-in.cut .tl-prev-m{opacity:.5}
      .tl-card-in.cut .scn2-ta,.tl-card-in.cut .csel-lbl{text-decoration:line-through;color:var(--ash-2)}
      /* Превью: медиа тянется на всю свободную высоту, под ним — строка переключателя своей высоты. */
      .tl-card-th{min-width:0;min-height:0;display:flex;flex-direction:column;gap:7px}
      .tl-prev{flex:1 1 auto;min-height:0;display:flex}
      .tl-prev-m{width:100%;height:100%;min-height:0;object-fit:contain;background:#000;
        border:1px solid var(--hair-b);border-radius:6px;display:block}
      /* min-height:0 — заглушка вписывается в строку карточки, а не задаёт ей высоту снизу. */
      .tl-card-none{width:100%;height:100%;min-height:0;display:grid;place-items:center;border:1px solid var(--hair-b);
        border-radius:6px;background:var(--plate);font-family:var(--mono);font-size:11px;color:var(--ash-2)}
      .tl-prev-seg{flex:none;display:flex;align-self:flex-start;border:1px solid var(--hair-b);
        border-radius:6px;overflow:hidden}
      .tl-prev-seg button{all:unset;cursor:pointer;padding:4px 14px;font-family:var(--mono);font-size:11.5px;
        letter-spacing:.08em;text-transform:uppercase;color:var(--ash-2)}
      .tl-prev-seg button:hover{color:var(--bone);background:rgba(var(--accent-rgb),.06)}
      .tl-prev-seg button.on{background:linear-gradient(180deg,rgba(var(--accent-rgb),.35),rgba(var(--accent-rgb),.14));
        color:#fff;box-shadow:inset 0 0 0 1px var(--accent-deep)}
      .tl-prev-seg button:disabled{opacity:.35;cursor:default}
      /* Почему вместо клипа стоит кадр — говорим прямо: иначе «по умолчанию видео» читается как поломка. */
      .tl-prev-note{flex:none;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;
        text-transform:uppercase;color:var(--ash-2)}
      /* Колонка полей прокручивается сама: карточка фиксирована по высоте вкладки, а реплика
         бывает любой длины. Поля НЕ растут под текст (авто-рост `_voGrow` тут не зовётся) —
         «Озвучка» делит остаток высоты и прокручивается внутри себя. */
      .tl-card-mid{display:flex;flex-direction:column;gap:9px;min-width:0;min-height:0;overflow:auto}
      .tl-card-pr{display:none}        /* поля промтов живут в DOM ради черновика и PATCH, см. _tlCardHTML */
      /* `>*{flex:none}` — не украшение, а защита от НАЛОЖЕНИЯ: по умолчанию flex-элемент ужимается
         ниже своего содержимого, и на невысоком окне ряды колонки (шапка, плеер, «Тип визуала»,
         кнопка промтов, действия) налезали друг на друга. Сжимается ровно одно — поле «Озвучка»,
         остальное держит свою высоту, а лишнее уходит в скролл колонки. */
      .tl-card-mid>*{flex:none}
      .tl-card-mid .scn2-f{display:flex;flex-direction:column;min-height:0}
      .tl-card-mid label.scn2-f{flex:1 1 auto;min-height:76px}
      .tl-card-mid .scn2-ta{flex:1 1 auto;min-height:52px;overflow:auto}
      /* Промты — ОДНОЙ кнопкой (текст в попапе). Есть пустые поля — кнопка янтарная со счётчиком
         (тот же тон, что «нет промпта» в ленте): иначе «промты собраны» и «их нет» неотличимы.
         Модификатор зовётся `tl-prb-empty`, а НЕ `empty`: `.empty` в проекте уже занят пустым
         состоянием списка (L1151 — `flex-direction:column` + `padding:60px 20px`), и кнопка с ним
         раздувалась в колонку на пол-экрана, наезжая на соседние ряды. */
      .tl-prb{display:flex}
      .tl-prb-b.tl-prb-empty{border-color:rgba(155,120,72,.5);color:var(--amber-2);background:rgba(155,120,72,.12)}
      .tl-prb-b .tl-prb-e{font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;opacity:.85}
      .tl-prb-b .tl-prb-e:not(:empty){margin-left:7px}
      /* Тело попапа промтов: четыре поля цепочкой, прокрутка — здесь, не у страницы. */
      .tl-pr-body{flex:1 1 auto;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:11px;
        padding-right:4px}
      .tl-pr-sep{display:flex;align-items:center;gap:9px;font-family:var(--mono);font-size:10.5px;
        letter-spacing:.18em;text-transform:uppercase;color:var(--ash-2);margin-top:2px}
      .tl-pr-sep::before,.tl-pr-sep::after{content:'';flex:1;height:1px;background:var(--hair)}
      /* Полоса прохода по биту (промпт → кадр → анимация). Стоит НА МЕСТЕ кнопки запуска: пока
         идёт работа, кнопки быть не должно вовсе — иначе её жмут второй раз. */
      .beat-job{display:inline-flex;align-items:center;gap:8px;padding:3px 8px 3px 10px;border:1px solid rgba(83,91,170,.45);
        border-radius:16px;background:rgba(83,91,170,.10);font-size:12.75px;color:var(--bone);position:relative;overflow:hidden}
      .beat-job.stop{border-color:rgba(155,120,72,.5);background:rgba(155,120,72,.12)}
      .beat-job .bj-bar{position:absolute;inset:auto 0 0 0;height:2px;background:rgba(255,255,255,.06)}
      .beat-job .bj-bar i{display:block;height:100%;background:var(--accent-2);transition:width .5s ease}
      .beat-job.stop .bj-bar i{background:var(--amber-2)}
      .beat-job .bj-txt{white-space:nowrap}
      .beat-job .bj-txt b{font-family:var(--mono);color:var(--accent-2);font-weight:400}
      .beat-job.stop .bj-txt b{color:var(--amber-2)}
      .beat-job .bj-stop{padding:1px 7px;line-height:1.3;border-color:rgba(var(--err-rgb),.45);color:var(--err-2)}
      /* «Нет промпта»: бит в ролике, а рисовать его нечем. Не то же, что «нет кадра». */
      .scn2-np{font-size:11.5px;color:var(--amber-2);border:1px solid rgba(155,120,72,.45);
        background:rgba(155,120,72,.12);border-radius:4px;padding:1px 7px;white-space:nowrap}
      .ed-tile.noprompt{border-color:rgba(155,120,72,.45)}
      .ed-tile .ed-npmark{position:absolute;left:6px;bottom:6px;font-size:10.5px;letter-spacing:.04em;
        color:#1a1206;background:var(--amber-2);border-radius:4px;padding:1px 6px;font-weight:700}
      .btn.sm.warn{border-color:rgba(155,120,72,.5);color:var(--amber-2);background:rgba(155,120,72,.12)}
      .tl-card-hd{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-family:var(--mono);font-size:11.5px;color:var(--ash-2)}
      .tl-card-hd b{font-size:14px;color:var(--bone)}
      /* Плеер сегмента в карточке: реплики рядом с ним нет (она ниже, полем) — строка короткая. */
      .tl-card-vo .edc-vo{padding:0;flex-wrap:wrap}
      .tl-card-acts{display:flex;gap:7px;flex-wrap:wrap;margin-top:auto;padding-top:4px}
      /* Узко — колонки встают друг под друга. Строки задаём ОБЕ: неявная auto-строка меряется
         содержимым и вылезла бы за карточку (у которой overflow скрыт вкладкой). */
      @media (max-width:900px){ .tl-card-in{grid-template-columns:1fr;
        grid-template-rows:minmax(120px,1fr) minmax(0,1fr)} }
      /* ── «Сценарий» → вид СЦЕНЫ (10.08.2026): бит = карточка с четырьмя полями сценариста ──
         Правится прямо здесь (Озвучка / Тип визуала / Кадр / Анимация), поэтому у карточки есть
         состояние «есть несохранённое» (.dirty — левая полоса-акцент, как у всех статусов проекта:
         inset-тень поверх ОДНОГО и того же отступа, чтобы блок не дёргался при смене состояния). */
      .scn2-switch{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
      .scn2-seg{display:flex;border:1px solid var(--hair-b);border-radius:6px;overflow:hidden;flex:none}
      .scn2-seg button{all:unset;cursor:pointer;padding:7px 14px;font-family:var(--mono);font-size:12.5px;
        letter-spacing:.08em;text-transform:uppercase;color:var(--ash-2);display:flex;align-items:center;gap:7px}
      .scn2-seg button:hover{color:var(--bone);background:rgba(var(--accent-rgb),.06)}
      .scn2-seg button.on{background:linear-gradient(180deg,rgba(var(--accent-rgb),.35),rgba(var(--accent-rgb),.14));
        color:#fff;box-shadow:inset 0 0 0 1px var(--accent-deep)}
      .scn2-seg .cnt{font-size:11px;padding:1px 6px;border-radius:9px;background:rgba(var(--accent-rgb),.18);color:var(--accent-2)}
      .scn2-seg button.on .cnt{background:rgba(0,0,0,.28);color:#fff}
      .scn2-hint{font-size:12.5px;color:var(--ash-2);flex:1 1 260px;min-width:0}
      .scn2-ro{font-size:13.5px;color:var(--amber-2);border:1px solid rgba(var(--amber-rgb),.35);
        background:rgba(var(--amber-rgb),.07);border-radius:6px;padding:8px 12px}
      /* Оглавление + аккордеон глав: тело главы строится лениво, свёрнутая глава отчитывается
         счётчиками (сцен / кадров / правленых / требующих внимания). */
      .scn2-toc{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:var(--ash-2)}
      .scn2-toc span{flex:1 1 240px;min-width:0}
      .scn2-ch{display:flex;align-items:center;gap:10px;margin-top:10px;padding:9px 12px;border-radius:6px;
        background:var(--plate-2);box-shadow:inset 3px 0 0 var(--accent);position:sticky;top:0;z-index:6;
        border:1px solid var(--hair-b)}
      .scn2-ch.clk{cursor:pointer;user-select:none}
      .scn2-ch.clk:hover{border-color:var(--hair-hi)}
      .scn2-ch.open{border-bottom-left-radius:0;border-bottom-right-radius:0}
      .scn2-ch b{font-size:15px}
      .scn2-ch .t{color:var(--ash);font-size:14.25px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
      .scn2-ch .n{margin-left:auto;font-family:var(--mono);font-size:11.5px;letter-spacing:.12em;
        text-transform:uppercase;color:var(--ash-2);white-space:nowrap}
      .scn2-ch .n b.warn{color:var(--amber-2);font-weight:700}
      /* Каретка — треугольник на бордюрах (глиф ▾ на 11px в моношрифте вырождается в чёрточку) */
      .scn2-ar{flex:none;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;
        border-top:6px solid var(--ash-2);transition:transform .12s}
      .scn2-ch.open .scn2-ar{transform:rotate(180deg);border-top-color:var(--accent-2)}
      .scn2-chbody{display:none}
      .scn2-chbody.on{display:flex;flex-direction:column;gap:10px;padding-top:10px}
      /* Без `overflow:hidden` намеренно (ловушка §7 дизайн-системы): панель дропдауна «Тип
         визуала» выходит за нижний край карточки и срезалась бы целиком. Скругление своего фона
         карточка держит и так — прятать переполнение ей не за чем. */
      .scn2-card{border:1px solid var(--hair-b);border-radius:var(--cut);background:var(--plate-2)}
      .scn2-card.dirty{box-shadow:inset 3px 0 0 var(--amber-2)}
      .scn2-hd{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 12px;border-bottom:1px solid var(--hair)}
      .scn2-sid{font-family:var(--mono);font-size:13.5px;font-weight:700;color:var(--bone)}
      .scn2-bt,.scn2-dur{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);letter-spacing:.06em}
      .scn2-dots{display:flex;gap:8px;align-items:center}
      .scn2-dot{display:inline-flex;align-items:center;gap:4px;font-family:var(--mono);font-size:10px;
        letter-spacing:.04em;color:var(--ash-2)}
      .scn2-dot i{width:7px;height:7px;border-radius:50%;background:var(--ash-2);opacity:.5;display:block}
      .scn2-dot.ok i{background:var(--green);opacity:1;box-shadow:0 0 6px rgba(var(--green-rgb),.7)}
      .scn2-dot.st i{background:var(--amber-2);opacity:1;box-shadow:0 0 6px rgba(var(--amber-rgb),.7)}
      .scn2-dot.er i{background:var(--err-2);opacity:1;box-shadow:0 0 6px rgba(var(--err-rgb),.7)}
      .scn2-dot.gen i{background:var(--accent-2);opacity:1;box-shadow:0 0 8px var(--accent);animation:blink 1.1s infinite}
      .scn2-saved{font-family:var(--mono);font-size:11.5px;color:var(--green-2);margin-left:auto}
      .scn2-save{flex:none}
      .scn2-card:not(.dirty) .scn2-save{opacity:.45}
      /* Имя файлов бита («002a»): чип моноширинный — это буквально имя на диске, а не подпись.
         Порядок файлов в папке и в CapCut идёт по нему, поэтому он рядом с номером сцены. */
      .scn2-slot{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--ash-2);
        padding:1px 5px;border:1px solid var(--hair-b);border-radius:4px;background:var(--plate)}
      /* Вырезанная сцена: остаётся на месте и читаемой, но зачёркнута — «есть, но не в ролике».
         Скрывать её нельзя (возврат одним кликом), красить в ошибку — тоже: это не сбой. */
      .scn2-cut{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--err-2);
        padding:1px 5px;border:1px solid rgba(var(--err-rgb),.45);border-radius:4px;background:rgba(var(--err-rgb),.1)}
      .scn2-card.cut{opacity:.72;border-style:dashed}
      .scn2-card.cut .scn2-sid,.scn2-card.cut .scn2-bt{text-decoration:line-through}
      .scn2-card.cut .scn2-ta,.scn2-card.cut .csel-lbl{text-decoration:line-through;color:var(--ash-2)}
      /* Вырезанная сцена свёрнута в ОДНУ строку: полей правки и генерации у неё нет, остаётся текст
         реплики — чтобы по «Сценарию» было видно, что именно выкинули. Реплика тянется на всю
         оставшуюся ширину и обрезается многоточием: строка не должна расти в высоту. */
      /* `nowrap` обязателен: шапка сцены переносит содержимое, а длинная реплика при переносе
         занимала бы базовую (огромную) ширину и разворачивала строку в три-четыре. */
      .scn2-card.folded .scn2-hd{border-bottom:none;padding:6px 12px;flex-wrap:nowrap}
      .scn2-card.folded .scn2-hd>:not(.scn2-cuttx){flex:none}
      .scn2-cuttx{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
        font-size:13.5px;color:var(--ash-2);text-decoration:line-through}
      /* Вставка бита между сценами (как в блокнотах): полоса живёт В ЗАЗОРЕ между карточками —
         отрицательные поля гасят её собственную высоту, расстояние между сценами растёт лишь на
         столько, сколько нужно, чтобы в неё можно было попасть мышкой.
         Кнопка видна ВСЕГДА, приглушённой: скрытая полностью, она не существует для того, кто о
         ней не знает, — а узнать неоткуда. Наведение доводит её до акцента и подсвечивает линию,
         показывая, куда именно встанет бит. */
      .scn2-ins{position:relative;height:34px;margin:-11px 0;display:flex;align-items:center;
        justify-content:center;cursor:pointer;z-index:1}
      /* Крайние полосы не втягиваем в чужую территорию: сверху за ними заголовок главы (по нему
         кликают, чтобы свернуть), снизу — следующая глава. */
      .scn2-ins:first-child{margin-top:-2px}
      .scn2-ins:last-child{margin-bottom:-2px}
      .scn2-ins::before{content:'';position:absolute;left:0;right:0;top:50%;height:1px;
        background:var(--accent-2);opacity:0;transition:opacity .12s}
      .scn2-ins-b{position:relative;font-family:var(--mono);font-size:12.5px;letter-spacing:.06em;
        color:var(--ash-2);background:var(--void);border:1px dashed var(--hair-b);border-radius:6px;
        padding:5px 16px;opacity:.6;transition:opacity .12s,color .12s,border-color .12s}
      .scn2-ins:hover::before,.scn2-ins:focus::before{opacity:1}
      .scn2-ins:hover .scn2-ins-b,.scn2-ins:focus .scn2-ins-b{opacity:1;color:var(--accent-2);
        border-color:var(--accent-2);border-style:solid}
      .scn2-ins:focus{outline:none}
      .btn.ed-cut{border-color:rgba(var(--err-rgb),.4);color:var(--err-2)}
      .btn.ed-cut:hover{border-color:rgba(var(--err-rgb),.7);background:rgba(var(--err-rgb),.12)}
      /* Ширину полей решает ШИРИНА КАРТОЧКИ, а не окна: галерея ужимается открытым инспектором
         (390px) и сайдбаром приложения (280px), и на ноутбуке поля превращались в 350-пиксельные
         щели, хотя окно «широкое». @container меряет саму карточку — при узкой карточке превью
         уходит под поля, а не отъедает у них четверть ширины. */
      .scn2-card{container-type:inline-size}
      .scn2-body{display:grid;grid-template-columns:minmax(0,1fr) 210px;gap:14px;padding:11px 12px}
      @container (max-width:760px){
        .scn2-body{grid-template-columns:1fr;gap:10px}
        .scn2-side{max-width:240px}
        .scn2-f-vt .csel,.scn2-f-vt .scn2-sel{max-width:none}
      }
      .scn2-fields{display:flex;flex-direction:column;gap:9px;min-width:0}
      .scn2-f{display:block;min-width:0}
      .scn2-lbl{display:block;font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
        color:var(--ash-2);margin-bottom:4px}
      .scn2-sub{letter-spacing:.06em;color:var(--ash-2);opacity:.7;text-transform:none}
      /* 📚 Вставить тег канона — та же роль, что у .ic-chip на «Идеях», своя копия: там класс
         скопан под #screen-ideas, а карточка сцены живёт на run-detail. */
      .scn2-tagbtn{all:unset;cursor:pointer;margin-left:8px;font-family:var(--mono);font-size:10.5px;
        letter-spacing:.04em;text-transform:none;color:var(--ash-2);border:1px solid var(--hair-b);
        border-radius:4px;padding:1px 7px;white-space:nowrap}
      .scn2-tagbtn:hover{color:var(--bone);border-color:var(--acc);background:var(--accent-dim)}
      .scn2-tagbtn:disabled{opacity:.5;cursor:default}
      /* Пикер тега: плитки форм с КАРТИНКАМИ. Слова у форм короткие и на слух похожие
         («кадет»/«младший»/«окопный»), выбирать по ним — гадание; в лицо форма узнаётся сразу.
         Подпись под плиткой — ТОТ САМЫЙ текст, который уедет в поле, без сюрпризов. */
      .scn-tagpick-ov{position:fixed;inset:0;z-index:10000;background:rgba(4,4,5,.72);
        backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);
        display:flex;align-items:center;justify-content:center;padding:20px}
      .scn-tagpick{position:relative;max-width:760px;width:100%;max-height:86vh;overflow:auto;
        background:var(--void);border:1px solid var(--hair-b);border-radius:10px;padding:20px 22px;
        box-shadow:0 20px 60px rgba(0,0,0,.6)}
      .scn-tagpick-x{position:absolute;top:10px;right:12px;padding:2px 9px;line-height:1.4}
      .scn-tagpick-h{font-size:19px;font-weight:700;color:var(--bone);margin-bottom:6px;padding-right:34px}
      .scn-tagpick-sub{font-size:13.5px;color:var(--ash-2);line-height:1.5;margin-bottom:16px}
      .scn-tagpick-sect{margin-bottom:16px}
      .scn-tagpick-nm{font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;
        color:var(--ash);margin-bottom:8px;display:flex;align-items:baseline;gap:8px}
      .scn-tagpick-en{font-size:11px;letter-spacing:.04em;color:var(--ash-2);opacity:.75;text-transform:none}
      .scn-tagpick-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(116px,1fr));gap:10px}
      .scn-tagpick-t{all:unset;cursor:pointer;display:flex;flex-direction:column;gap:6px;
        border:1px solid var(--hair-b);border-radius:8px;padding:6px;background:var(--plate);
        transition:border-color .12s,background .12s}
      .scn-tagpick-t:hover,.scn-tagpick-t:focus-visible{border-color:var(--accent);background:var(--accent-dim)}
      .scn-tagpick-t img{width:100%;aspect-ratio:3/4;object-fit:cover;border-radius:5px;display:block}
      .scn-tagpick-no{display:flex;align-items:center;justify-content:center;width:100%;aspect-ratio:3/4;
        border-radius:5px;background:var(--void);color:var(--ash-2);font-size:22px}
      .scn-tagpick-cap{font-family:var(--mono);font-size:11px;line-height:1.35;color:var(--bone);
        word-break:break-word}
      .scn-tagpick-hint{font-size:10.5px;color:var(--ash-2);line-height:1.3}
      .scn-tagpick-t.any .scn-tagpick-no{font-size:18px;color:var(--accent-2)}
      .scn2-ta{width:100%;background:var(--plate);border:1px solid var(--hair-b);border-radius:6px;
        color:var(--bone);font-family:var(--mono);font-size:14px;line-height:1.5;padding:8px 11px;outline:none;resize:vertical}
      .scn2-ta:focus{border-color:var(--accent);box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.05)}
      .scn2-ta:disabled{opacity:.6;cursor:default}
      /* Тип визуала — общий `.csel` (обёртку вешает сквозной проход): своего вида у списка нет,
         задаём только место. Фон `--plate` — как у соседних полей карточки, а не `--plate-2`. */
      .scn2-f-vt .csel{width:100%;max-width:320px}
      .scn2-f-vt .csel-btn{background:var(--plate);padding:8px 11px}
      /* Запасной вид на случай, если обёртка не встала (нет JS дропдауна): нативный select
         остаётся видимым и должен выглядеть как поле, а не как системный виджет. */
      .scn2-sel{background-color:var(--plate);border-radius:6px;font-size:14px;line-height:1.5;
        letter-spacing:.04em;padding:8px 32px 8px 11px;max-width:320px;color-scheme:dark;
        text-transform:none}
      .scn2-sel:hover:not(:disabled){border-color:var(--hair-hi)}
      .scn2-sel:disabled{opacity:.6;cursor:default}
      .scn2-side{display:flex;flex-direction:column;gap:6px}
      .scn2-th{width:100%;aspect-ratio:16/9;object-fit:cover;border:1px solid var(--hair-b);border-radius:6px;cursor:pointer;display:block}
      .scn2-th:hover{border-color:var(--hair-hi)}
      .scn2-th.nofile{display:grid;place-items:center;font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;
        text-transform:uppercase;color:var(--ash-2);background:var(--plate)}
      .scn2-bar{position:sticky;bottom:0;z-index:8;display:flex;align-items:center;gap:12px;flex-wrap:wrap;
        margin-top:6px;padding:10px 12px;background:var(--void);border-top:1px solid var(--hair-b);font-size:14px}
      .scn2-bar b{color:var(--amber-2);font-family:var(--mono)}
      @media (max-width:900px){ .scn2-body{grid-template-columns:1fr} .scn2-side{max-width:260px} }
      /* Gemini/Claude: этапы генерации сценария (сцены X/Y) + читалка черновика */
      .gr-plan{font-size:14.25px;color:var(--ash-2);padding:1px 2px}
      .gr-plan b{color:var(--ash)}
      .gr-stages{display:flex;flex-direction:column;gap:11px;max-width:660px}
      .gr-stg{display:flex;align-items:center;gap:12px}
      .gr-stg.pending{opacity:.55}
      .gr-ico{width:30px;height:30px;border-radius:7px;background:rgba(var(--accent-rgb),.1);border:1px solid var(--hair-b);display:grid;place-items:center;font-size:15px;flex:none}
      .gr-body{flex:1;min-width:0}
      .gr-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:5px;font-size:15px}
      .gr-cnt{font-family:var(--mono);font-size:13px;color:var(--ash)}
      /* Бейдж движка ШАГА (смешанный план: сценарист/раскадровщик/промтер на разных движках).
         margin-right:auto — .gr-top идёт space-between, иначе бейдж уехал бы в середину строки. */
      .gr-eng{margin-right:auto;font-family:var(--mono);font-size:11.5px;line-height:1;padding:3px 7px;
        border-radius:999px;border:1px solid var(--hair-b);background:rgba(var(--accent-rgb),.08);color:var(--ash);white-space:nowrap}
      .gr-bar{height:6px;border-radius:4px;background:rgba(255,255,255,.05);overflow:hidden}
      .gr-fill{height:100%;border-radius:4px;transition:width .3s}
      /* двухцветный бар этапа: committed (green) + live (blue, стык встык) */
      .gr-split{display:flex;height:100%}
      .gr-split .gr-fill{border-radius:0}
      .gr-split .gr-fill:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}
      .gr-split .gr-fill:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px}
      .gr-live{animation:grLive 1.5s ease-in-out infinite}   /* «сейчас пишется» — мягкая пульсация */
      .gr-livenum{font-family:var(--mono);color:var(--accent-2)}
      @keyframes grLive{0%,100%{opacity:1}50%{opacity:.5}}
      .gr-legend{margin-top:1px;font-size:12px;color:var(--ash-2);display:flex;align-items:center;gap:5px;padding:1px 2px}
      .gr-legend .lg-g,.gr-legend .lg-b{font-size:9px;line-height:1}
      .gr-legend .lg-g{color:var(--green)}
      .gr-legend .lg-b{color:var(--accent-2)}
      .gr-draft-hd{display:flex;align-items:center;gap:10px;margin:20px 0 8px;padding-top:16px;border-top:1px solid var(--hair)}
      .gr-draft-hd h3{font-size:16.5px;margin:0;font-weight:700;color:var(--bone)}
      .gr-draft-hd .rd{font-family:var(--mono);font-size:13px;color:var(--green)}
      .gr-scripttext{white-space:pre-wrap;font-size:15.75px;line-height:1.72;color:#d7dce4;padding:4px 14px 13px}
      .cov-wrap{grid-column:1/-1;padding:16px;display:flex;flex-direction:column;gap:18px;max-width:1320px}
      .cov-empty{padding:36px;text-align:center;border:1px dashed var(--hair-b);border-radius:12px;background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
      /* Полоса над обложками: действие про КАРТИНКИ, поэтому стоит вплотную к ним, а не в нижнем
         ряду кнопок формы упаковки — там оно читалось как операция над текстом. Пояснение рядом,
         а не в title: кнопка тратит FastGen, и цена такого действия не должна прятаться в подсказку. */
      .cov-topbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:-6px}
      .cov-topnote{font-size:12.5px;color:var(--ash-2);line-height:1.5;flex:1;min-width:220px}
      .cov-row{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
      .cov-card{display:flex;flex-direction:column;gap:9px;border:1px solid var(--hair-b);border-radius:10px;padding:11px;background:linear-gradient(180deg,rgba(255,255,255,.025),rgba(255,255,255,.004));transition:.14s}
      .cov-card:hover{border-color:var(--hair-hi)}
      .cov-img{position:relative;min-height:140px;background:#0e1013;border-radius:7px;overflow:hidden;display:flex;align-items:center;justify-content:center}
      .cov-img img{max-width:100%;max-height:64vh;width:auto;height:auto;object-fit:contain;display:block;cursor:zoom-in}
      .cov-img .ph{font-size:16.5px;color:var(--ash-2);padding:40px 0}
      /* z-index 4 — СТРОГО выше .ed-loader (z 3), как у .ed-cancelbtn: номер обложки должен
         оставаться читаемым поверх скрима прелоадера. Прелоадер у обложки СВОЙ не заводим —
         генерация везде в редакторе выглядит одинаково (.ed-loader). */
      .cov-badge{position:absolute;top:7px;left:7px;z-index:4;font-family:var(--mono);font-size:13.5px;color:var(--bone);background:rgba(0,0,0,.6);border:1px solid var(--hair-b);border-radius:4px;padding:1px 6px}
      /* Полоска «было / стало». Две картинки в ряд внутри трети экрана — мелко намеренно: решение
         принимают по крупному просмотру (клик разворачивает), а здесь важно лишь, ЧТО изменилось. */
      .cov-cmp-host:empty{display:none}
      .cov-cmp{display:flex;flex-direction:column;gap:8px;border:1px solid rgba(136,141,194,.32);border-radius:8px;padding:9px;background:rgba(136,141,194,.06)}
      .cov-cmp-t{font-size:13.5px;color:var(--bone);display:flex;flex-direction:column;gap:3px}
      .cov-cmp-q{font-size:12.5px;color:var(--ash-2);font-family:var(--mono);line-height:1.45;overflow:hidden}
      .cov-cmp-row{display:grid;grid-template-columns:1fr 1fr;gap:8px}
      .cov-cmp-i{margin:0;display:flex;flex-direction:column;gap:3px}
      .cov-cmp-i img{width:100%;height:auto;display:block;border-radius:5px;border:1px solid var(--hair);cursor:zoom-in;opacity:.72;transition:.12s}
      .cov-cmp-i.on img{opacity:1;border-color:rgba(136,141,194,.5)}
      .cov-cmp-i img:hover{opacity:1}
      .cov-cmp-i figcaption{font-size:12px;text-transform:uppercase;letter-spacing:.12em;color:var(--ash-2);text-align:center}
      .cov-cmp-i.on figcaption{color:var(--accent-2)}
      .cov-cmp-acts{display:flex;gap:6px}
      /* Диалог правки обложки: слева — та картинка, которую правим (без неё инструкцию пишут
         по памяти), справа — поле. Ширина под 16:9-превью, на узком экране колонки складываются. */
      .cve-ov{position:fixed;inset:0;z-index:10000;background:rgba(4,4,5,.72);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;padding:20px}
      .cve-card{position:relative;max-width:860px;width:100%;max-height:88vh;overflow:auto;background:var(--void);border:1px solid var(--hair-b);border-radius:10px;padding:20px 22px;box-shadow:0 20px 60px rgba(0,0,0,.6)}
      .cve-x{position:absolute;top:10px;right:12px;padding:2px 9px;line-height:1.4}
      .cve-hd{font-size:19px;font-weight:700;color:var(--bone);margin-bottom:14px;padding-right:34px}
      .cve-body{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px}
      .cve-prev img{width:100%;height:auto;display:block;border-radius:8px;border:1px solid var(--hair)}
      .cve-form{display:flex;flex-direction:column;gap:9px}
      .cve-note{font-size:13.5px;color:var(--ash);line-height:1.5}
      .cve-note.dim{font-size:12.5px;color:var(--ash-2)}
      .cve-ta{width:100%;min-height:118px;resize:vertical;font-size:15px;line-height:1.5;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:6px;color:var(--bone);padding:9px 11px;transition:.12s}
      .cve-ta:focus{outline:none;border-color:var(--accent-deep)}
      .cve-acts{display:flex;gap:10px;align-items:center;justify-content:flex-end;margin-top:18px}
      @media (max-width:720px){ .cve-body{grid-template-columns:1fr} }
      .cov-prompt{width:100%;min-height:92px;resize:vertical;font-size:15px;line-height:1.5;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:6px;color:var(--ash);padding:8px;font-family:var(--mono);transition:.12s}
      .cov-prompt:focus{outline:none;border-color:var(--accent-deep);color:var(--bone)}
      .cov-cardbtns{display:flex;gap:6px}
      .cov-btn{flex:1;text-align:center;font-size:15px;letter-spacing:.03em;padding:7px 8px;border-radius:6px;border:1px solid var(--hair-b);background:rgba(255,255,255,.02);color:var(--ash);cursor:pointer;text-decoration:none;transition:.12s}
      .cov-btn:hover{color:var(--bone);border-color:var(--hair-hi);background:rgba(255,255,255,.05)}
      .cov-btn.primary{color:var(--accent-2);border-color:rgba(136,141,194,.3)}
      .cov-btn[disabled]{opacity:.4;pointer-events:none}
      /* ✨ Правка обложки промптом — третья кнопка ряда, МАЛЕНЬКАЯ квадратная. Значка достаточно:
         надпись отобрала бы ширину у «Перегенерировать» и «Скачать», которыми пользуются чаще.
         ⚠ Правило обязано стоять ПОСЛЕ `.cov-btn` и с более высокой специфичностью: у `.cov-btn`
         `flex:1`, и при равном весе (один класс против одного) побеждал бы он — кнопка растягивалась
         до размера соседей, игнорируя ширину. `align-self:center` — соседи выше её вдвое, когда
         «Перегенерировать» переносится на две строки, и растянутая по их высоте она читалась бы
         не как значок, а как третья равноправная кнопка.
         Значок — ✨, а НЕ «волшебная палочка» 🪄: U+1FA84 из Emoji 13.0, и в Segoe UI Emoji рабочей
         Windows 10 (19045) его нет — на кнопке рисовался пустой квадрат. ✨ (U+2728) в проекте уже
         везде («✨ Поправить», «✨ Сгенерировать упаковку») и есть всюду. */
      .cov-cardbtns .cov-wand{flex:0 0 auto;align-self:center;width:30px;height:26px;padding:0;font-size:12.5px;line-height:1}
      .cov-cardbtns .cov-wand:hover:not([disabled]){color:var(--accent-2);border-color:var(--accent-deep)}
      .cov-form{display:flex;flex-direction:column;gap:7px;max-width:840px;border:1px solid var(--hair-b);border-radius:10px;padding:16px;background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
      .cov-lbl{font-size:13.5px;text-transform:uppercase;letter-spacing:.16em;font-weight:800;color:var(--ash);margin-top:11px}
      .cov-lbl:first-child{margin-top:0}
      .cov-title{width:100%;font-size:19.5px;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:6px;color:var(--bone);padding:9px 11px;transition:.12s}
      .cov-title:focus,.cov-desc:focus,.cov-tags:focus{outline:none;border-color:var(--accent-deep)}
      .cov-desc{width:100%;min-height:84px;resize:vertical;font-size:18px;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:6px;color:var(--ash);padding:9px 11px;line-height:1.55}
      .cov-tags{width:100%;min-height:44px;resize:vertical;font-size:16.5px;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:6px;color:var(--accent-2);padding:9px 11px;font-family:var(--mono)}
      .cov-actions{display:flex;align-items:center;gap:8px;margin-top:14px;flex-wrap:wrap}
      .cov-saved{font-size:15px;color:#4f6f60}
      /* Субтитры: отдельная карточка под формой упаковки — четвёртый ассет ролика, не часть текста */
      .cov-subs{display:flex;flex-direction:column;gap:9px;max-width:840px;border:1px solid var(--hair-b);border-radius:10px;padding:16px;background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
      .cov-subsrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
      .cov-subsn{display:flex;align-items:center;gap:6px;font-size:13.5px;color:var(--ash-2)}
      .cov-subsn input{width:64px;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:6px;color:var(--bone);padding:5px 7px;font-family:var(--mono);font-size:14px}
      .cov-subsn input:focus{outline:none;border-color:var(--accent-deep)}
      .vo-beat{display:flex;gap:10px;align-items:flex-start;padding:7px 0;border-bottom:1px solid var(--hair)}
      .vo-beat .bk{flex:none;width:64px;font-family:var(--mono);font-size:13.5px;color:var(--ash-2);padding-top:6px;display:flex;flex-direction:column;gap:3px;line-height:1.25}
      .vo-beat .bk b{font-weight:700}
      .vo-beat .bk .vo-dur{font-size:12px;opacity:.85}
      /* поле озвучки: не тянется руками (resize:none), высота подгоняется под текст скриптом (_voGrow) → без внутреннего скролла */
      .vo-ta{flex:1;min-height:36px;resize:none;overflow:hidden;font-size:16.5px;line-height:1.5;background:rgba(0,0,0,.25);border:1px solid var(--hair);border-radius:5px;color:var(--bone);padding:6px 8px;transition:border-color .12s}
      .vo-ta:focus{outline:none;border-color:var(--accent-deep)}
      .vo-beat.vo-stale .vo-ta{border-color:rgba(var(--amber-rgb),.65);background:rgba(var(--amber-rgb),.06)}
      .vo-beat.vo-stale .bk{color:var(--amber)}
      /* ▶ слушать главу с этого бита (сик по кумулятивному оффсету) */
      .vo-play{flex:none;width:26px;height:26px;margin-top:2px;border:1px solid var(--hair);border-radius:50%;background:rgba(255,255,255,.03);color:var(--accent-2);font-size:11px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.12s;padding:0}
      .vo-play:hover{background:var(--accent-deep);color:var(--bone);border-color:var(--accent-deep)}
      .vo-play-off{opacity:.3;cursor:default;color:var(--ash-2)}
      /* Плеер главы липнет к верху при скролле списка битов (скролл-контейнер — .ed-gallery).
         top:0 → пиннится к верху видимой области; непрозрачный фон перекрывает биты под собой. */
      .vo-sticky{position:sticky;top:0;z-index:6;background:var(--void);padding:8px 0 10px;margin-bottom:8px;border-bottom:1px solid var(--hair-b)}
      /* ── НОВЫЙ вид «Голос»: кастомный плеер главы (сегмент-бар по длительности) + строки-сегменты ── */
      .vo2-player{position:sticky;top:0;z-index:6;background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);padding:12px 14px;margin-bottom:10px}
      .vo2-prow{display:flex;align-items:center;gap:13px}
      .vo2-play{all:unset;cursor:pointer;flex:none;width:46px;height:46px;border-radius:50%;display:grid;place-items:center;background:var(--accent-deep);border:1px solid var(--accent-2);color:#fff;font-size:16px;transition:.12s}
      .vo2-play:hover{background:var(--accent)}
      .vo2-pmid{flex:1;min-width:0}
      .vo2-ptop{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:7px}
      .vo2-pch{font-size:14px;font-weight:700;color:var(--bone)}
      .vo2-pch b{color:var(--accent-2);font-family:var(--mono);margin-right:6px}
      .vo2-pmeta{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);white-space:nowrap}
      .vo2-pmeta b{color:var(--bone)}
      .vo2-segbar{display:flex;align-items:stretch;gap:2px;height:16px;margin-bottom:7px}
      .vo2-sb{min-width:3px;border-radius:2px;background:rgba(136,141,194,.20);cursor:pointer;outline:1px solid transparent;transition:background .12s,outline-color .12s}
      .vo2-sb:hover{outline-color:var(--hair-hi)}
      .vo2-sb.past{background:var(--green)}
      .vo2-sb.cur{background:var(--accent-2)}
      .vo2-prog{position:relative;height:5px;border-radius:4px;background:rgba(255,255,255,.06);cursor:pointer}
      .vo2-fill{position:absolute;left:0;top:0;bottom:0;border-radius:4px;background:linear-gradient(90deg,var(--accent-deep),var(--accent-2));width:0}
      .vo2-knob{position:absolute;top:50%;width:11px;height:11px;border-radius:50%;background:#fff;border:1px solid var(--accent-2);transform:translate(-50%,-50%);left:0}
      .vo2-time{display:flex;justify-content:space-between;font-family:var(--mono);font-size:10.5px;color:var(--ash-2);margin-top:4px}
      .vo2-vol{flex:none;display:flex;align-items:center;gap:6px;align-self:center}
      .vo2-mute{all:unset;cursor:pointer;color:var(--ash);font-size:15px;line-height:1}
      .vo2-mute:hover{color:var(--bone)}
      .vo2-vslider{width:74px;accent-color:var(--accent);cursor:pointer}
      .vo2-status{padding:14px;border:1px dashed var(--hair-b);border-radius:var(--cut);color:var(--ash);font-size:13.5px;background:rgba(var(--accent-rgb),.05);margin-bottom:10px}
      /* ── «Голос · Все главы»: шапка ролика + липкие шапки глав над их сегментами ── */
      .vo2-allbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 13px;margin-bottom:10px;
                  border:1px solid var(--hair-b);border-radius:var(--cut);background:var(--plate-2)}
      .vo2-allbar .vo2-pmeta{margin-left:auto}
      /* top:0 — шапка главы пиннится к верху скролл-контейнера (.ed-gallery); следующая выталкивает предыдущую */
      .vo2-chhdr{position:sticky;top:0;z-index:6;display:flex;align-items:center;gap:11px;padding:9px 12px;
                 margin:14px 0 8px;border:1px solid var(--hair-b);border-radius:var(--cut);background:var(--plate-2)}
      .vo2-chhdr.stale{border-color:rgba(var(--amber-rgb),.5)}
      .vo2-chmid{flex:1;min-width:0}
      .vo2-chtop{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:6px}
      .vo2-chplay{all:unset;cursor:pointer;flex:none;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;
                  background:var(--accent-deep);border:1px solid var(--accent-2);color:#fff;font-size:13px;transition:.12s}
      .vo2-chplay:hover{background:var(--accent)}
      .vo2-chplay.on{background:var(--accent)}
      .vo2-chplay.off{background:transparent;border-color:var(--hair-b);color:var(--ash-2);cursor:default}
      .vo2-chrev{flex:none}
      .vo2-savebar{position:sticky;bottom:0;z-index:5;display:flex;gap:10px;align-items:center;flex-wrap:wrap;
                   margin-top:12px;padding:10px 0 2px;background:var(--void);border-top:1px solid var(--hair-b)}
      /* 4-я колонка (10.08.2026) — мини-превью КАДРА этого бита: реплику правят, глядя на то,
         что в этот момент на экране. Ширина фиксирована (128px), чтобы строки не «дышали». */
      .vo2-seg{display:grid;grid-template-columns:auto minmax(0,1fr) auto 128px;align-items:start;gap:11px;padding:9px 11px 9px 13px;border:1px solid var(--hair);border-radius:8px;margin-bottom:7px;position:relative;background:rgba(0,0,0,.14)}
      .vo2-scol4{width:128px}
      .vo2-th{width:128px;aspect-ratio:16/9;object-fit:cover;border:1px solid var(--hair-b);border-radius:6px;
        cursor:pointer;display:block;background:var(--plate)}
      .vo2-th:hover{border-color:var(--hair-hi)}
      .vo2-th.nofile{display:grid;place-items:center;font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;
        text-transform:uppercase;color:var(--ash-2)}
      @media (max-width:900px){ .vo2-seg{grid-template-columns:auto minmax(0,1fr) auto} .vo2-scol4{display:none} }
      .vo2-seg.cur{border-color:var(--accent-2)}
      .vo2-seg.stale{border-color:rgba(var(--amber-rgb),.5)}
      /* .sel — ВЫБРАННЫЙ бит (переносится с вкладок Изображения/Видео), не путать с .cur (играет сейчас):
         подсветка фоном+кольцом, чтобы обе метки были видны одновременно и не спорили за border-color */
      .vo2-seg.sel{background:rgba(var(--accent-rgb),.11);box-shadow:inset 0 0 0 1px rgba(var(--accent-rgb),.55)}
      /* Средняя колонка строки-бита: textarea + предупреждение о пустом тексте (скрыто, пока текст есть).
         Пустая реплика — не «тишина», а откат бита к сценарию (см. _voTaMark в core.js), и знать это
         оператор должен ДО сохранения, поэтому предупреждение живёт в самой строке, а не в тосте. */
      .vo2-tacol{min-width:0;display:flex;flex-direction:column;gap:5px}
      .vo2-tacol .vo-ta{width:100%}
      .vo2-taerr{display:none;font-size:11.5px;line-height:1.45;color:var(--amber)}
      .vo2-tacol.empty .vo2-taerr{display:block}
      .vo2-tacol.empty .vo-ta{border-color:rgba(var(--amber-rgb),.7);background:rgba(var(--amber-rgb),.07)}
      .vo2-lb{position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:2px;background:var(--ash-2)}
      .vo2-lb.done{background:var(--green)}.vo2-lb.stale{background:var(--amber)}.vo2-lb.busy{background:var(--accent-2)}.vo2-lb.err{background:var(--err-2)}
      .vo2-scol1{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding-top:2px}
      .vo2-sid{font-family:var(--mono);font-size:13px;font-weight:700;color:var(--bone)}
      .vo2-seg.cur .vo2-sid{color:var(--accent-2)}
      .vo2-splay{all:unset;cursor:pointer;width:26px;height:26px;border-radius:7px;display:grid;place-items:center;border:1px solid var(--hair-b);color:var(--ash);font-size:11px;transition:.12s}
      .vo2-splay:hover{border-color:var(--accent-2);color:var(--accent-2)}
      .vo2-splay.off{opacity:.35;cursor:default}
      .vo2-scol3{display:flex;flex-direction:column;align-items:flex-end;gap:3px;font-family:var(--mono);padding-top:2px;white-space:nowrap}
      .vo2-timing{font-size:11.5px;color:var(--ash)}
      .vo2-timing b{color:var(--bone)}
      .vo2-sstat{font-size:9.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--ash-2)}
      .vo2-sstat.done{color:var(--green)}.vo2-sstat.stale{color:var(--amber)}.vo2-sstat.busy{color:var(--accent-2)}.vo2-sstat.err{color:var(--err-2)}
      /* Сегмент-контрол режима запуска (Авто|Полуавтомат) */
      .mode-seg .mode-opt{flex:1;padding:9px 10px;font-size:16.5px;font-weight:700;color:var(--ash-2);background:rgba(0,0,0,.25);border:1px solid var(--hair-b);cursor:pointer;transition:.12s}
      .mode-seg .mode-opt:first-child{border-radius:6px 0 0 6px}
      .mode-seg .mode-opt:last-child{border-radius:0 6px 6px 0;border-left:0}
      .mode-seg .mode-opt:hover{color:var(--bone);background:rgba(255,255,255,.04)}
      .mode-seg .mode-opt.active{color:var(--bone);background:var(--ash-2);border-color:var(--ash)}
      /* Редактор «Сценарий»: главы → биты, поля озвучки/картинки/анимации */
      .scn-ed-chap{border:1px solid var(--hair-b);border-radius:8px;margin:0 0 10px;overflow:hidden;background:rgba(0,0,0,.18)}
      .scn-ed-chap>summary{list-style:none;cursor:pointer;padding:11px 14px;display:flex;align-items:center;gap:10px;font-size:18px;background:rgba(255,255,255,.03);user-select:none}
      .scn-ed-chap>summary::-webkit-details-marker{display:none}
      .scn-ed-chap>summary:hover{background:rgba(255,255,255,.05)}
      .scn-ed-chap[open]>summary{border-bottom:1px solid var(--hair)}
      .scn-ed-chap .chap-badge{margin-left:auto;font-family:var(--mono);font-size:13.5px;color:var(--ash-2)}
      .scn-ed-body{padding:8px 12px 12px}
      .scn-ed-beat{border:1px solid var(--hair);border-radius:7px;padding:9px 10px;margin:9px 0;background:rgba(8,9,11,.5)}
      .scn-ed-beat.dirty{border-color:rgba(var(--accent-rgb),.5)}
      .scn-ed-beat .beat-hd{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:14.25px;color:var(--accent-2);margin-bottom:7px}
      .scn-ed-beat .beat-hd .thumb{width:34px;height:34px;border-radius:4px;object-fit:cover;border:1px solid var(--hair);flex:none}
      .scn-ed-field{margin:6px 0}
      .scn-ed-field>label{display:block;font-size:15px;letter-spacing:.06em;text-transform:uppercase;color:var(--ash-2);margin:0 0 3px;font-weight:700}
      .scn-ed-field textarea{width:100%;min-height:40px;resize:vertical;font-size:19.5px;line-height:1.55;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:5px;color:var(--bone);padding:7px 9px;transition:.12s;box-sizing:border-box;overflow:hidden}
      .scn-ed-field textarea.big{min-height:120px}
      .scn-ed-field textarea:focus{outline:none;border-color:var(--accent-deep)}
      .scn-ed-field textarea:disabled{opacity:.6;cursor:not-allowed}
      .scn-ed-field.vo textarea{border-left:2px solid rgba(var(--accent-rgb),.5)}
      .scn-ed-field.img textarea{border-left:2px solid rgba(116,140,198,.5)}
      .scn-ed-field.anim textarea{border-left:2px solid rgba(var(--amber-rgb),.5)}
      /* Сворачиваемые промпты картинки/анимации (закрыты по умолчанию) */
      .scn-ed-fold{margin:6px 0;border:1px solid var(--hair);border-radius:6px;overflow:hidden}
      .scn-ed-fold>summary{list-style:none;cursor:pointer;padding:7px 9px;font-size:16.5px;font-weight:700;color:var(--ash);background:rgba(255,255,255,.025);user-select:none}
      .scn-ed-fold>summary::-webkit-details-marker{display:none}
      .scn-ed-fold>summary::before{content:'▸ ';color:var(--accent-2)}
      .scn-ed-fold[open]>summary::before{content:'▾ ';color:var(--accent-2)}
      .scn-ed-fold>summary:hover{background:rgba(255,255,255,.06)}
      .scn-ed-fold .scn-ed-field{margin:0;padding:8px}
      /* Метки устаревания прямо в шапке бита */
      .scn-tag{font-size:13.5px;font-weight:800;padding:1px 7px;border-radius:10px;margin-left:6px;white-space:nowrap}
      .scn-tag.vo{background:rgba(var(--amber-rgb),.16);color:var(--amber)}
      .scn-tag.img{background:rgba(116,140,198,.16);color:#8099cb}
      .scn-ed-bar{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:10px;padding:8px 0;margin-bottom:8px;background:linear-gradient(180deg,var(--ink) 70%,transparent);flex-wrap:wrap}
      .ed-inspector{width:0;flex:none;border-left:1px solid var(--hair-b);background:rgba(8,9,11,.97);overflow:hidden;transition:width .18s;display:flex;flex-direction:column}
      .ed-inspector.open{width:var(--insp-w,390px)}
      .ed-inspector.ed-resizing{transition:none}           /* при перетаскивании — без анимации ширины */
      /* Ручка изменения ширины правой панели (появляется, когда инспектор открыт) */
      .ed-resize{flex:none;width:6px;cursor:ew-resize;position:relative;display:none;z-index:6}
      .ed-resize.on{display:block}
      .ed-resize::after{content:'';position:absolute;top:0;bottom:0;left:2px;width:2px;background:var(--hair-b);transition:background .12s}
      .ed-resize:hover::after,.ed-resize.active::after{background:var(--accent)}
      .ed-insp-head{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid var(--hair);flex:none}
      .ed-insp-body{flex:1;overflow-y:auto;padding:14px}
      .ed-insp-sect{margin-bottom:16px}
      .cast-row{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:7px}
      .cast-chip{display:inline-flex;align-items:center;gap:6px;background:rgba(255,255,255,.05);border:1px solid var(--hair);border-radius:16px;padding:2px 9px 2px 2px;font-size:12.75px;color:var(--bone)}
      .cast-chip img{width:24px;height:24px;border-radius:50%;object-fit:cover;background:#1a1a1a;flex:none}
      .cast-chip a{color:var(--ash-2);text-decoration:none;font-size:11px;margin-left:1px}
      .cast-chip a:hover{color:var(--accent-2)}
      /* Промах тега кадра: имя в [Имя · форма] не нашлось в паспорте прогона. Янтарный, а не
         красный: кадр сгенерируется, просто состав подобран авто-детектом, а не сценаристом. */
      .cast-miss{font-size:11.75px;line-height:1.45;color:var(--amber-2);background:rgba(var(--amber-rgb),.08);
        border:1px solid rgba(var(--amber-rgb),.28);border-radius:5px;padding:4px 8px;margin-bottom:7px}
      /* Форма (облик) персонажа в кадре — выбор прямо в чипе тем же приёмом, что «добавить
         персонажа» (details + .cp-list, а не native select): в списке видно лицо карточки.
         У персонажа с одной карточкой выбора нет вовсе, у нередактируемого рана — подпись. */
      .cast-chip .cast-formlbl{color:var(--ash-2);font-size:11.5px}
      .form-pick{position:relative;display:inline-flex}
      .form-pick>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:4px;max-width:170px;background:rgba(0,0,0,.35);border:1px solid var(--hair);border-radius:11px;color:var(--ash);font-size:11.5px;padding:1px 6px;user-select:none}
      .form-pick>summary::-webkit-details-marker{display:none}
      .form-pick>summary:hover{color:var(--bone);border-color:var(--hair-b)}
      .form-pick[open]>summary{color:var(--accent-2);border-color:rgba(var(--accent-rgb),.5);background:rgba(var(--accent-rgb),.1)}
      .form-pick>summary i{font-style:normal;color:var(--ash-2)}
      .form-pick>summary .fp-cur{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
      .form-pick>summary .fp-car{font-size:9px;color:var(--ash-2);font-weight:400}
      /* .cp-list тянется по ширине родителя (у .cast-pick он во всю колонку) — у чипа родитель
         узкий, поэтому ширину задаём здесь. Выпадает ВВЕРХ, как соседний пикер: секция «Персонажи
         в кадре» — последняя в инспекторе. */
      .fp-list{right:auto;min-width:215px;max-width:300px}
      .cp-item.on{background:rgba(var(--accent-rgb),.14);color:var(--bone)}
      .cp-item.on .cp-nm::after{content:' ✓';color:var(--accent-2)}
      .cast-add{width:100%;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:5px;color:var(--bone);padding:6px 8px;font-size:12.75px;cursor:pointer}
      /* Кастомный «добавить персонажа в кадр» (вместо native select) — выпадает ВВЕРХ */
      .cast-pick{position:relative}
      .cast-pick>summary{list-style:none;cursor:pointer;background:rgba(var(--accent-rgb),.08);border:1px solid rgba(var(--accent-rgb),.3);border-radius:6px;color:var(--accent-2);padding:7px 10px;font-size:12.75px;font-weight:700;user-select:none}
      .cast-pick>summary::-webkit-details-marker{display:none}
      .cast-pick>summary:hover{background:rgba(var(--accent-rgb),.14)}
      .cp-list{position:absolute;bottom:calc(100% + 6px);left:0;right:0;max-height:300px;overflow-y:auto;border:1px solid var(--hair-b);border-radius:7px;background:var(--plate-2);display:flex;flex-direction:column;z-index:60;box-shadow:0 -10px 28px rgba(0,0,0,.55)}
      .cp-item{all:unset;cursor:pointer;display:flex;align-items:center;gap:10px;padding:7px 9px;border-bottom:1px solid var(--hair);color:var(--bone);font-size:12.75px}
      .cp-item:last-child{border-bottom:0}
      .cp-item:hover{background:rgba(var(--accent-rgb),.1)}
      .cp-item img{width:32px;height:32px;border-radius:6px;object-fit:cover;background:#1a1a1a;flex:none}
      .cp-item .cp-noimg{width:32px;height:32px;border-radius:6px;background:#242424;display:flex;align-items:center;justify-content:center;color:var(--ash-2);font-weight:800;flex:none}
      .cp-item .cp-nm em{color:var(--ash-2);font-style:normal;font-size:11.25px;margin-left:4px}
      /* Форма персонажа: поля слева, фото в полный рост справа */
      .char-form-body{display:flex;gap:16px;align-items:stretch}
      .char-form-fields{flex:1;min-width:0;display:flex;flex-direction:column;gap:9px}
      .char-form-fields textarea{flex:1;min-height:140px}
      .char-form-photo{flex:none;width:210px;display:flex;flex-direction:column;gap:8px}
      .cf-photo-prev{width:210px;height:300px;border-radius:8px;border:1px solid var(--hair);background:#141414;overflow:hidden;display:flex;align-items:center;justify-content:center}
      .cf-photo-prev img{width:100%;height:100%;object-fit:cover}
      .cf-photo-prev span{font-size:12px;color:var(--ash-2)}
      .cf-photo-btn{cursor:pointer;background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:5px;color:var(--accent-2);padding:9px 12px;font-size:12.75px;font-weight:700;text-align:center;display:block}
      .cf-photo-btn:hover{border-color:var(--accent-deep)}
      .cf-photo-btn.dis{opacity:.5;pointer-events:none}
      .cf-hint{font-size:11.25px;color:var(--ash-2);line-height:1.45}
      /* Карточка в процессе генерации — жёлтая подсветка */
      .char-card.gen{border-color:#a28853;box-shadow:0 0 0 1px rgba(162,136,83,.3)}
      .char-gentag{font-size:10.5px;font-weight:800;color:#1a1206;background:#a28853;border-radius:4px;padding:1px 7px;margin-left:6px;letter-spacing:.03em}
      .char-genbox{font-size:12.75px;color:#a28853;padding:16px;border:1px dashed rgba(162,136,83,.5);border-radius:6px;background:rgba(162,136,83,.06);text-align:center;animation:charpulse 1.4s ease-in-out infinite}
      @keyframes charpulse{0%,100%{opacity:.55}50%{opacity:1}}
      .ed-insp-lbl{font-family:var(--mono);font-size:11.25px;letter-spacing:.2em;color:var(--ash-2);text-transform:uppercase;margin-bottom:6px}
      .ed-prompt{width:100%;min-height:130px;background:#0a0b0d;border:1px solid var(--hair-b);border-radius:6px;color:var(--ash);font-size:15.75px;line-height:1.6;padding:9px;font-family:var(--mono);resize:vertical;box-sizing:border-box}
      .ed-prompt:read-only{opacity:.85}
      /* Агент-редактор кадра: просьба словами → промпт. Три режима генерации выбираются
         радиокнопками-чипами (не select: у каждого режима своя цена, и все три должны быть
         видны разом), ответ агента ложится в те же .ed-prompt-поля, что и промпт бита. */
      .ai-ta{min-height:74px;font-size:14.5px}
      .ai-modes{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 2px}
      .ai-mode{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border:1px solid var(--hair-b);border-radius:16px;font-size:13px;color:var(--ash-2);cursor:pointer;background:rgba(255,255,255,.03)}
      .ai-mode.on{border-color:var(--accent-2);color:var(--bone);background:rgba(90,110,255,.1)}
      .ai-mode.off{opacity:.4;cursor:not-allowed}
      .ai-mode input{margin:0;flex:none}
      .ai-out{margin-top:10px}
      .ai-out-l{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:11.25px;letter-spacing:.16em;color:var(--ash-2);text-transform:uppercase;margin-bottom:5px}
      .ai-eng{font-family:inherit;letter-spacing:0;text-transform:none;font-size:12px;color:var(--accent-2)}
      .ai-hint{font-family:inherit;letter-spacing:0;width:14px;height:14px;line-height:14px;text-align:center;border-radius:50%;border:1px solid var(--hair-b);font-size:10px;cursor:help;flex:none}
      .ai-acts{display:flex;flex-wrap:wrap;gap:8px;margin-top:9px}
      .ai-err{margin-top:9px;padding:7px 9px;border:1px solid rgba(var(--err-rgb),.4);border-radius:6px;background:rgba(var(--err-rgb),.08);color:var(--err-2);font-size:13.5px;line-height:1.5}
      .ai-note{margin-top:8px;font-size:13px;color:var(--ash-2)}
      .ed-kv{display:flex;justify-content:space-between;gap:8px;padding:4px 0;border-bottom:1px solid var(--hair);font-size:15.75px}
      .ed-kv .k{color:var(--ash-2)}.ed-kv .v{color:var(--bone);font-family:var(--mono)}
      /* Версии ассета бита (кадры/клипы): превью клипа проигрывается по наведению, справа — «вернуть».
         Текущий вариант стоит в том же ряду, подсвечен рамкой акцента и помечен «✓ выбран». */
      .ed-takes-list{display:flex;flex-direction:column;gap:8px;max-height:340px;overflow:auto}
      .ed-take{display:flex;align-items:center;gap:10px;padding:7px;border:1px solid var(--hair-b);border-radius:8px;background:rgba(255,255,255,.03)}
      /* Выбранный вариант больше не стоит первым (порядок — по вечному имени), поэтому его надо
         НАХОДИТЬ глазом в любом месте ленты: рамка + фон + сплошная полоса слева. */
      .ed-take.cur{border-color:var(--accent);background:rgba(90,110,255,.09);box-shadow:inset 3px 0 0 var(--accent)}
      .ed-take.cur .ed-take-meta b{color:var(--accent-2)}
      .ed-take video,.ed-take img{width:104px;height:59px;flex:none;border-radius:5px;object-fit:cover;background:#000}
      .ed-take-meta{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
      .ed-take-meta b{font-size:13.5px;color:var(--bone)}
      .ed-take-meta span{font-size:12px;color:var(--ash-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
      .ed-take-tag{align-self:flex-start;font-size:11px;padding:0 5px;border-radius:4px;border:1px solid var(--hair-b);color:var(--ash-2)}
      .ed-take-tag.ok{color:var(--green);border-color:rgba(77,201,181,.45)}
      .ed-take-cur{flex:none;font-size:12.5px;color:var(--accent-2);white-space:nowrap}
      .ed-take-del{flex:none;background:none;border:1px solid transparent;border-radius:6px;color:var(--ash-2);font-size:14px;line-height:1;padding:5px 6px;cursor:pointer}
      .ed-take-del:hover{color:var(--err-2);border-color:rgba(var(--err-rgb),.45);background:rgba(var(--err-rgb),.08)}
      .ed-take video,.ed-take img{cursor:zoom-in}
      /* Крупный просмотр варианта (edTakeZoom): превью в ленте маленькое — выбирать по нему вслепую
         нельзя, поэтому клик разворачивает вариант во весь экран с теми же действиями. */
      .ed-zoom-ov{position:fixed;inset:0;z-index:10050;background:rgba(4,4,5,.9);display:flex;align-items:center;
                  justify-content:center;gap:10px;padding:26px 60px;outline:none}
      .ed-zoom-box{display:flex;flex-direction:column;gap:10px;max-width:min(1400px,92vw);max-height:92vh}
      .ed-zoom-media{flex:1;min-height:0;display:flex;align-items:center;justify-content:center}
      .ed-zoom-media img,.ed-zoom-media video{max-width:100%;max-height:78vh;border-radius:8px;background:#000;display:block}
      .ed-zoom-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:9px 13px;border:1px solid var(--hair-b);
                   border-radius:8px;background:var(--plate-2);font-size:13.5px;color:var(--ash-2)}
      .ed-zoom-bar b{color:var(--bone);font-size:15px}
      .ed-zoom-pos{margin-left:auto;font-family:var(--mono);font-size:12.5px}
      .ed-zoom-x{position:absolute;top:16px;right:18px;background:none;border:0;color:var(--ash);font-size:20px;cursor:pointer}
      .ed-zoom-x:hover{color:var(--bone)}
      .ed-zoom-nav{flex:none;background:none;border:0;color:var(--ash);font-size:26px;cursor:pointer;padding:8px}
      .ed-zoom-nav:hover:not([disabled]){color:var(--bone)}
      .ed-zoom-nav[disabled]{opacity:.2;cursor:default}
      .ed-take-sep{font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ash-2);margin:4px 0 -2px}
      .ed-takes summary{list-style:none}
      .ed-takes summary::-webkit-details-marker{display:none}
      .ed-act{display:flex;gap:7px;flex-wrap:wrap;margin-top:8px}
      .ed-logdrawer{flex:none;border-top:1px solid var(--hair-b);background:rgba(7,8,10,.85)}
      .ed-logdrawer .hd{display:flex;align-items:center;gap:10px;padding:6px 14px;cursor:pointer;user-select:none}
      .ed-logbox-wrap{height:0;overflow:hidden;transition:height .18s}
      .ed-logdrawer.open .ed-logbox-wrap{height:190px;overflow-y:auto}

/* ═══════════════════════════════════════════════════════════════════════
   ВКЛАДКА «СВОДКА» (_edRenderSvodka) — хиро + карточки. Namespace .sv-*
   (чтобы не конфликтовать с общими .card/.chip/.hero/.btn платформы).
   ═══════════════════════════════════════════════════════════════════════ */
.sv-wrap{max-width:1180px;margin:0 auto;padding:16px 18px 46px;font-size:15px}
.sv-dot{display:inline-block;width:8px;height:8px;border-radius:50%;vertical-align:middle}
.sv-chip{display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);font-size:11.5px;padding:3px 9px;border-radius:20px;white-space:nowrap;border:1px solid var(--hair-b);color:var(--ash)}
.sv-chip.ok{color:var(--green);background:rgba(var(--green-rgb),.14);border-color:rgba(var(--green-rgb),.32)}
.sv-chip.warn{color:var(--amber-2);background:rgba(196,143,60,.13);border-color:rgba(196,143,60,.3)}
.sv-chip.err{color:var(--err-2);background:rgba(var(--err-2-rgb),.13);border-color:rgba(var(--err-2-rgb),.32)}
.sv-chip.mut{color:var(--ash);background:rgba(var(--wash-rgb),.05)}
.sv-chip.accel{color:var(--accent-2);background:rgba(var(--accent-rgb),.10);border-color:rgba(var(--accent-rgb),.32)}
/* ── HERO ── */
.sv-hero{position:relative;border:1px solid var(--hair-b);border-radius:var(--cut);overflow:hidden;padding:22px 22px 20px;
  background:radial-gradient(120% 150% at 8% -20%,rgba(var(--accent-rgb),.16),transparent 55%),linear-gradient(180deg,var(--plate-2),var(--plate))}
.sv-hero-top{display:flex;gap:26px;align-items:center;flex-wrap:wrap}
.sv-ring{position:relative;width:158px;height:158px;flex:none}
.sv-ring svg{width:100%;height:100%;transform:rotate(-90deg)}
.sv-rc{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:2px}
.sv-rc .sv-big{font-size:29px;font-weight:800;font-variant-numeric:tabular-nums;line-height:1;color:var(--bone)}
.sv-rc .sv-big span{color:var(--ash);font-size:17px;font-weight:600}
.sv-rc .sv-cap{font-family:var(--mono);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ash-2)}
.sv-rc .sv-pct{margin-top:3px;font-family:var(--mono);font-size:11px;color:var(--green)}
.sv-hero-head{flex:1;min-width:280px}
.sv-eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--ash-2)}
.sv-title{font-size:25px;font-weight:800;margin:7px 0 2px;line-height:1.14;color:var(--bone)}
.sv-sub{color:var(--ash);font-size:13px}
.sv-hstatus2{display:inline-flex;align-items:center;gap:9px;margin-top:13px;padding:6px 13px;border-radius:22px;background:rgba(var(--wash-rgb),.04);border:1px solid var(--hair-b)}
.sv-hstatus2 b{font-size:13px}
.sv-sep{width:1px;height:14px;background:var(--hair-hi)}
.sv-test{color:var(--accent-2);font-family:var(--mono);font-size:11.5px;letter-spacing:.03em}
.sv-hchips{display:flex;gap:8px;flex-wrap:wrap;margin-top:13px}
/* ── стат-тайлы фаз ── */
.sv-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:11px;margin-top:20px}
.sv-stat{border:1px solid var(--hair-b);border-radius:var(--cut);background:var(--plate);padding:12px 14px}
.sv-stat-l{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--ash-2);display:flex;align-items:center;gap:6px}
.sv-stat-v{font-size:21px;font-weight:800;font-variant-numeric:tabular-nums;margin:7px 0 9px;color:var(--bone)}
.sv-stat-v small{color:var(--ash);font-size:13px;font-weight:600}
.sv-bar{height:6px;border-radius:5px;background:var(--void);overflow:hidden}
.sv-bar>i{display:block;height:100%;border-radius:5px}
/* ── очередь + раздача ── */
.sv-hero-meta{display:flex;gap:12px;flex-wrap:wrap;margin-top:13px}
.sv-mcard{flex:1;min-width:240px;border:1px solid var(--hair);border-radius:var(--cut);background:var(--plate);padding:12px 14px;display:flex;flex-direction:column;gap:8px}
.sv-mtop{display:flex;align-items:center;justify-content:space-between;gap:10px}
.sv-ml{font-family:var(--mono);font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--ash-2)}
.sv-mv{font-size:13px;font-weight:600;color:var(--bone)}
.sv-mv.ok{color:var(--green)}.sv-mv.warn{color:var(--amber-2)}.sv-mv.err{color:var(--err-2)}
.sv-msub{font-size:12px;color:var(--ash)}
/* дропдаун «Привязка к каналу» — в стиле мини-карточки Сводки (не мономашинка .inp 16.5px) */
.sv-ch-sel{margin-top:2px;width:100%;max-width:100%;font-family:var(--ui);font-size:13px;color:var(--bone);background:var(--plate-hi);border:1px solid var(--hair-b);border-radius:6px;padding:6px 9px;outline:none;cursor:pointer;transition:border-color .14s;appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23828d96' stroke-width='1.4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:26px}
.sv-ch-sel:hover{border-color:var(--hair-hi)}
.sv-ch-sel:focus{border-color:var(--accent)}
.sv-mbar{height:6px;border-radius:5px;background:var(--void);overflow:hidden}
.sv-mbar>i{display:block;height:100%;border-radius:5px;background:linear-gradient(90deg,var(--amber),var(--amber-2))}
.sv-link{font-size:12.5px;color:var(--accent-2);text-decoration:none}.sv-link:hover{text-decoration:underline}
/* ── главный CTA ── */
.sv-cta{margin-top:18px;border:1px solid var(--hair-hi);border-radius:var(--cut);padding:16px 20px;display:flex;gap:18px;align-items:center;justify-content:space-between;flex-wrap:wrap;
  background:linear-gradient(180deg,rgba(var(--accent-rgb),.15),rgba(var(--accent-rgb),.04));box-shadow:inset 0 0 44px rgba(var(--accent-rgb),.06)}
.sv-cta-pilot{border-color:rgba(var(--teal-rgb),.6);background:linear-gradient(180deg,rgba(var(--teal-rgb),.11),rgba(var(--teal-rgb),.03));box-shadow:0 0 0 1px rgba(var(--teal-rgb),.18),inset 0 0 40px rgba(var(--teal-rgb),.05)}
.sv-cta-err{border-color:rgba(var(--err-2-rgb),.45);background:linear-gradient(180deg,rgba(var(--err-2-rgb),.12),rgba(var(--err-2-rgb),.03));box-shadow:inset 0 0 44px rgba(var(--err-2-rgb),.05)}
.sv-cta-warn{border-color:rgba(196,143,60,.45);background:linear-gradient(180deg,rgba(196,143,60,.11),rgba(196,143,60,.03));box-shadow:inset 0 0 44px rgba(196,143,60,.05)}
.sv-cta-txt{display:flex;flex-direction:column;gap:5px;min-width:240px}
.sv-cta-h{display:flex;align-items:center;gap:9px;font-size:16px;font-weight:800;color:var(--bone)}
.sv-flask{font-size:18px}
.sv-cta-txt p{margin:0;color:var(--ash);font-size:13px;line-height:1.5;max-width:56ch}
.sv-cta-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
/* ── секции ── */
.sv-sec-head{display:flex;align-items:baseline;gap:12px;margin:28px 2px 13px}
.sv-sec-head h2{font-size:14px;font-weight:800;margin:0;color:var(--bone)}
.sv-sec-head .sv-hint{font-family:var(--mono);font-size:11px;color:var(--ash-2)}
.sv-sec-head .sv-line{flex:1;height:1px;background:var(--hair-b)}
.sv-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(322px,1fr));gap:14px}
.sv-card{position:relative;border:1px solid var(--hair-b);border-radius:var(--cut);background:var(--plate-2);padding:15px 16px 14px;display:flex;flex-direction:column;gap:11px;overflow:hidden}
.sv-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--hair-b)}
/* Открытый дропдаун ВЫЛЕЗАЕТ за плитку. `overflow:hidden` на плите и на хиро нужен ради левой
   полосы `::before` и фонового градиента в скруглённом углу — но он же резал панель списка
   (.csel-panel — абсолютный потомок, до 300px высотой, плитка бенто ниже). Пока список открыт,
   плитка отпускает обрезку и поднимается над соседями: в сетке они идут ПОСЛЕ неё по DOM и без
   z-index накрыли бы панель. */
.sv-card:has(.csel.open),.sv-hero:has(.csel.open){overflow:visible;z-index:5}
.sv-card.err::before{background:var(--err-2)}.sv-card.warn::before{background:var(--amber-2)}.sv-card.bulk::before{background:var(--accent)}
.sv-card.voice::before{background:var(--accent-2)}
.sv-card.wm::before{background:var(--green-2)}
.sv-card.vmodel::before{background:var(--amber-2)}
/* Радио-список моделей в плитке «Модель анимации»: тот же .chain-row, но выбор ОДНОЙ строки */
.sv-vm-list{display:flex;flex-direction:column;gap:6px;max-height:230px;overflow-y:auto}
.sv-vm-list .chain-row{border-radius:6px}
.sv-vm-list .chain-row:hover{border-color:var(--accent-2)}
/* Плитка «Вотермарка Veo»: селект алгоритма в колонку — та же причина, что у «Голоса ролика» */
.sv-wm-pick{display:flex;flex-direction:column;gap:8px}
.sv-wm-pick .inp{font-size:13.5px;letter-spacing:.02em;padding:8px 11px}
/* Поля плитки «Голос ролика»: в колонку — плитка бенто узкая (min 322px), в ряд селект+инпут не влезают */
.sv-voice-pick{display:flex;flex-direction:column;gap:8px}
.sv-voice-pick .inp{font-size:13.5px;letter-spacing:.02em;padding:8px 11px}
/* ── Плитка «Озвучка на других языках» ────────────────────────────────────────────────────────
   Скролла у списка НЕТ намеренно: внутри строк живут .csel-дропдауны выбора голоса, а
   overflow:auto срезал бы их панель (ту же засаду лечит правило .sv-card:has(.csel.open) выше).
   Набор языков берётся из Библиотеки голосов и заведомо короткий — скроллить нечего. */
.sv-card.lang::before{background:var(--vio-2,var(--accent-2))}
.sv-lang-list{display:flex;flex-direction:column;gap:7px}
.sv-lang-row{display:grid;grid-template-columns:1fr auto;gap:6px 9px;align-items:center;
  padding:8px 10px;border:1px solid var(--hair-b);border-radius:7px;
  background:rgba(7,8,10,.5);transition:.12s}
.sv-lang-row:hover{border-color:var(--accent-2)}
.sv-lang-row.on{border-color:var(--accent);background:rgba(var(--accent-rgb),.08)}
.sv-lang-pick{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;
  font-size:13.5px;color:var(--bone)}
.sv-lang-pick .fl{font-size:15px;line-height:1}
.sv-lang-pick i{font-family:var(--mono);font-size:11px;color:var(--ash-2);font-style:normal}
/* Галочка ТЁМНАЯ, своя (та же лепка, что у .nrg-stop/.kg-chk): нативный чекбокс — белый
   квадрат, который ярче всей темы и тянет на себя взгляд сильнее самой плитки. */
.sv-lang-pick input{appearance:none;-webkit-appearance:none;width:15px;height:15px;flex:none;
  margin:0;cursor:pointer;border:1px solid rgba(var(--wash-rgb),.5);border-radius:4px;
  background:rgba(0,0,0,.35);position:relative;transition:.12s}
.sv-lang-pick:hover input{border-color:var(--accent-2)}
.sv-lang-pick input:checked{background:var(--accent);border-color:var(--accent)}
.sv-lang-pick input:checked::after{content:'';position:absolute;left:4px;top:1px;width:4px;height:8px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.sv-lang-pick input:disabled{opacity:.4;cursor:default}
.sv-lang-st{font-family:var(--mono);font-size:11px;color:var(--ash-2);white-space:nowrap}
.sv-lang-st.ok{color:var(--green)}
.sv-lang-st.run{color:var(--accent-2)}
.sv-lang-st.warn{color:var(--amber-2)}
.sv-lang-st.err{color:var(--err-2)}
/* Селект голоса — своей строкой: плитка бенто узкая, в ряд с названием языка он не влезает. */
.sv-lang-row>.sv-lang-voice,.sv-lang-row>.csel{grid-column:1/-1;width:100%}
.sv-lang-row .sv-lang-voice{font-size:13px;padding:6px 9px}
.sv-card-head{display:flex;align-items:center;gap:10px}
.sv-card-ico{font-size:17px;line-height:1}
.sv-card-title{font-weight:700;font-size:14px;color:var(--bone)}
.sv-card-tag{margin-left:auto}
.sv-card p{margin:0;color:var(--ash);font-size:13px;line-height:1.55}
.sv-card p b{color:var(--bone)}
.sv-card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:auto;padding-top:3px}
.sv-card-actions.sv-col{flex-direction:column;align-items:stretch}
.sv-card-actions.sv-col .btn{justify-content:center}
.sv-muted{font-size:12px;color:var(--ash-2)}
/* ── список причин ── */
.sv-reasons{list-style:none;margin:2px 0;padding:0;display:flex;flex-direction:column;gap:6px}
.sv-reasons li{display:flex;align-items:center;gap:10px;font-size:12.5px;color:var(--ash);cursor:pointer;padding:3px 4px;border-radius:6px;transition:.12s}
.sv-reasons li:hover{background:rgba(var(--accent-rgb),.08)}
.sv-reasons li.sv-more{cursor:default;color:var(--ash-2);font-family:var(--mono);font-size:11px}
.sv-reasons li.sv-more:hover{background:none}
.sv-reasons b{color:var(--bone);font-weight:600}
.sv-sid{font-family:var(--mono);font-size:11px;color:var(--err-2);background:rgba(var(--err-2-rgb),.12);border:1px solid rgba(var(--err-2-rgb),.28);padding:2px 7px;border-radius:6px;flex:none}
.sv-scope{margin-left:auto;font-family:var(--mono);font-size:10.5px;color:var(--ash-2)}
/* ── пометка «что делать» у проблемного бита + пояснение ── */
.sv-rside{margin-left:auto;display:inline-flex;align-items:center;gap:7px;flex:none}
.sv-rside .sc{font-family:var(--mono);font-size:10.5px;color:var(--ash-2)}
.sv-rtry{font-family:var(--mono);font-size:10px;color:var(--amber-2);border:1px solid rgba(196,143,60,.35);border-radius:5px;padding:1px 6px;white-space:nowrap}
.sv-fix{font-family:var(--mono);font-size:10px;color:var(--accent-2);border:1px solid rgba(136,141,194,.42);border-radius:5px;padding:1px 6px;white-space:nowrap}
.sv-note{font-size:12px;color:var(--ash);margin:2px 0 0;padding:8px 10px;border-radius:7px;background:rgba(var(--wash-rgb),.04);border:1px solid var(--hair);line-height:1.5}
.sv-note b{color:var(--err-2);font-weight:700}
.sv-note b.ok{color:var(--amber-2)}
/* ── пусто / подвал ── */
.sv-empty{margin-top:18px;border:1px dashed var(--hair-b);border-radius:var(--cut);background:rgba(var(--green-rgb),.05);padding:14px 16px;display:flex;align-items:center;gap:11px;color:var(--ash);font-size:13px}
.sv-empty b{color:var(--green)}
.sv-foot{margin-top:24px;text-align:center;font-family:var(--mono);font-size:11px;color:var(--ash-2)}
@media(max-width:820px){.sv-stats{grid-template-columns:repeat(2,1fr)}}

/* ── YT STUDIO (режим-порт): полноэкранный изолированный iframe-микроапп. Экран — flex-колонка
   (.screen.active), iframe тянется на всю область; overflow отдан внутреннему документу. ── */
#screen-ytstudio{padding:0;overflow:hidden;position:relative}
/* iframe тянем через absolute inset:0 (не flex:1) — надёжнее: не зависит от разрешения
   высоты flex-цепочки, iframe всегда занимает всю область экрана (был баг «узкое окно»). */
#ytstudio-frame{position:absolute;inset:0;width:100%;height:100%;min-height:0;border:0;display:block;background:#0a0a0b}


/* ── Конструктор (#screen-kitgen) ──────────────────────────────────────
   Редизайн 06.08.2026: экран приведён к языку эталонных вкладок (Дашборд / В генерации /
   Прогоны / Niche Finder). Было — простыня плоских секций на голом фоне, острые углы,
   голые нативные <select>. Стало — плиты `--plate-2` с радиусом `--cut`, mono-капс шапки
   с глифом, поля 6px, статус полосой слева, все списки через `.csel`.
   Токены только из :root через локальную карту --acc* — своих HEX не заводим. */
#screen-kitgen{--acc:var(--accent);--acc-2:var(--accent-2);--acc-deep:var(--accent-deep);
  --acc-rgb:var(--accent-rgb);--ok:var(--green);--ok-2:var(--green-2);--bad:var(--err-2);
  --warn:var(--amber-2);--track:rgba(var(--wash-rgb),.06)}

/* ── шапка экрана ── */
#screen-kitgen .kg-bar{display:flex;align-items:center;gap:11px;flex-wrap:wrap;margin-bottom:16px}
#screen-kitgen .kg-bar-l{font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ash-2)}
#screen-kitgen .kg-api{font-family:var(--mono);font-size:12.5px;color:var(--ash-2)}
#screen-kitgen .kg-api.warn{color:var(--warn)}

/* ── НОМЕР И НАЗВАНИЕ ВКЛАДКИ ──
   Кружок с номером и mono-капс подпись. Жили в ленте ПЯТИ ШАГОВ конвейера; ленту сняли
   08.08.2026 (шаги стали вкладками), её собственные правила — `.kg-steps`, `.kg-stepbtn` со
   всеми состояниями, включая галочку «пройдено», — удалены 16.08.2026: разметку с этими
   классами не печатал уже никто. Сами `.kg-stepn`/`.kg-stept` остались живыми, их
   переиспользует лента вкладок ниже, поэтому имена и не переименованы. ── */
#screen-kitgen .kg-stepn{flex:none;width:23px;height:23px;border-radius:50%;display:flex;
  align-items:center;justify-content:center;font-family:var(--mono);font-size:11.5px;
  font-weight:700;color:var(--ash-2);background:var(--plate);border:1px solid var(--hair-b);
  transition:.14s;font-variant-numeric:tabular-nums}
#screen-kitgen .kg-stept{font-family:var(--mono);font-size:12.5px;font-weight:700;
  letter-spacing:.09em;text-transform:uppercase;color:var(--ash);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;transition:.14s}
/* ── ВКЛАДКИ (08.08.2026): та же плита-переключатель, но БЕЗ галочек «пройдено».
   Вкладка не проходится: библиотека разборов копится месяцами. Вместо галочки — размер того,
   что за вкладкой лежит (число разборов, сколько разделов взято). ── */
#screen-kitgen .kg-tabs{display:flex;gap:2px;margin:2px 0 18px;padding:5px;
  background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);flex-wrap:wrap}
#screen-kitgen .kg-tabbtn{flex:1 1 200px;display:flex;align-items:center;gap:10px;min-width:0;
  background:transparent;border:1px solid transparent;border-radius:6px;padding:9px 14px;
  cursor:pointer;transition:.14s;text-align:left}
#screen-kitgen .kg-tabbtn:hover{border-color:var(--hair-hi)}
#screen-kitgen .kg-tabbtn:hover .kg-stept{color:var(--bone)}
#screen-kitgen .kg-tabbtn.on{background:linear-gradient(180deg,rgba(var(--acc-rgb),.18),
  rgba(var(--acc-rgb),.06));border-color:var(--acc)}
#screen-kitgen .kg-tabbtn.on .kg-stept{color:var(--bone)}
#screen-kitgen .kg-tabbtn.on .kg-stepn{color:#fff;background:var(--acc-deep);border-color:var(--acc);
  box-shadow:0 0 10px rgba(var(--acc-rgb),.5)}
#screen-kitgen .kg-tabmeta{margin-left:auto;flex:none;font-family:var(--mono);font-size:11px;
  letter-spacing:.05em;color:var(--ash-2);font-variant-numeric:tabular-nums;white-space:nowrap}
#screen-kitgen .kg-tabbtn.on .kg-tabmeta{color:var(--ash)}

/* ── БИБЛИОТЕКА РАЗБОРОВ: канал × пять разделов.
   Сетка, а не список: единственный вопрос к библиотеке — «у кого что уже разобрано», и селект
   с именами на него не отвечал.
   ⚠ ВЫСОТУ СТРАНИЦЫ ТАБЛИЦА БОЛЬШЕ НЕ ЗАДАЁТ (12.08.2026): разборы копятся месяцами, и на
   четвёртом десятке строк работа с открытым разбором уезжала под сгиб. Отсюда `max-height`
   с прокруткой и липкая шапка — она же держит подписи колонок при скролле. ── */
#screen-kitgen .kg-libtools{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
#screen-kitgen .kg-libtools .rb-search{margin-left:0;width:300px;flex:1 1 220px;padding:7px 11px;
  font-size:14px}
#screen-kitgen .kg-libtools .rb-search input{font-size:14px}
#screen-kitgen .kg-libtools .kg-chips{margin-top:0}
#screen-kitgen .kg-libtools .kg-chip .kg-sub{font-size:11px;opacity:.7;margin-left:2px}
#screen-kitgen .kg-libtools .csel,
#screen-kitgen .kg-libtools select.inp{width:190px;flex:none;margin-left:auto}
#screen-kitgen .kg-lib{border:1px solid var(--hair-b);border-radius:6px;margin-bottom:14px;
  max-height:46vh;overflow:auto}
/* ОДНА КОЛОНКА ГОТОВНОСТИ ВМЕСТО ПЯТИ (13.08.2026): матрица разделов съедала ширину имени и
   требовала вертикальных подписей ради ответа, который в СПИСКЕ не нужен — какой именно раздел
   разобран, смотрят внутри разбора. */
#screen-kitgen .kg-librow{display:grid;
  grid-template-columns:minmax(0,1fr) 66px 54px 108px;
  align-items:center;gap:8px;padding:9px 13px;border-bottom:1px solid var(--hair-b);
  background:var(--plate-2)}
#screen-kitgen .kg-librow:last-child{border-bottom:0}
#screen-kitgen .kg-librow.head{background:var(--plate);padding:7px 13px;
  position:sticky;top:0;z-index:2;border-bottom-color:var(--hair-hi)}
#screen-kitgen .kg-librow.head .kg-libc{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash-2);justify-self:center;opacity:1}
#screen-kitgen .kg-librow.head .kg-libn,
#screen-kitgen .kg-librow.head .kg-libd{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash-2)}
#screen-kitgen .kg-librow.on{box-shadow:inset 3px 0 0 var(--acc)}
/* Строка — это выбор целиком, а не кнопка в её правом углу (см. `libRowHtml`). */
#screen-kitgen .kg-librow.clk{cursor:pointer;transition:background .12s}
#screen-kitgen .kg-librow.clk:hover{background:var(--plate)}
#screen-kitgen .kg-librow.clk:focus-visible{outline:1px solid var(--acc);outline-offset:-1px}
#screen-kitgen .kg-librow.none{grid-template-columns:1fr;color:var(--ash-2);font-size:13.5px}
#screen-kitgen .kg-libn{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:14px;color:var(--ash)}
#screen-kitgen .kg-libn b{color:var(--bone);font-weight:500}
#screen-kitgen .kg-libd{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);
  font-variant-numeric:tabular-nums;white-space:nowrap}
#screen-kitgen .kg-libc{justify-self:center;font-size:13px;color:var(--ash-3,var(--ash-2));
  opacity:.5;font-variant-numeric:tabular-nums}
#screen-kitgen .kg-libc.ok{color:var(--ok-2);opacity:1;font-size:15px}
/* Начатый разбор — «3/5», а не половинчатая галочка: доля читается без легенды. */
#screen-kitgen .kg-libc.part{font-family:var(--mono);font-size:11.5px;opacity:.85}
#screen-kitgen .kg-libact{justify-self:end;white-space:nowrap;display:flex;align-items:center;gap:6px}
/* Крестик приглушён, пока не навёл: удаление в списке на сорок строк не должно кричать. */
#screen-kitgen .kg-libx{background:none;border:1px solid transparent;border-radius:5px;
  color:var(--ash-2);font-size:11px;line-height:1;padding:5px 7px;cursor:pointer;opacity:.35;
  transition:.12s}
#screen-kitgen .kg-librow:hover .kg-libx,#screen-kitgen .kg-libx:focus-visible{opacity:1}
#screen-kitgen .kg-libx:hover{color:var(--err-2);border-color:rgba(var(--err-2-rgb),.5);
  background:rgba(var(--err-rgb),.08)}
:is(#screen-kitgen,#screen-library) .kg-lnk{background:none;border:0;padding:0;font:inherit;color:var(--acc-2);
  cursor:pointer;text-decoration:underline}
@media(max-width:1000px){
  #screen-kitgen .kg-librow{grid-template-columns:minmax(0,1fr) 54px 108px}
  #screen-kitgen .kg-libd{display:none}
}

/* ── ТАБЛИЦА РАЗДЕЛОВ ПРЕСЕТА: у каждого раздела свой источник.
   Взята та же строка-плита, что у доноров, но теперь строки ПЯТЬ ВСЕГДА — включая невзятые:
   прежняя панель показывала только взятое, и «чего ещё не хватает» видно не было. ── */
#screen-kitgen .kg-srcs,.kg-ov .kg-srcs{border:1px solid var(--hair-b);border-radius:6px;
  overflow:hidden;margin:4px 0 12px}
#screen-kitgen .kg-src,.kg-ov .kg-src,#screen-kitgen .kg-srcp,.kg-ov .kg-srcp{
  display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) auto;align-items:center;
  gap:12px;padding:11px 14px;border-bottom:1px solid var(--hair-b);background:var(--plate-2)}
#screen-kitgen .kg-src:last-child,.kg-ov .kg-src:last-child,
#screen-kitgen .kg-srcp:last-child,.kg-ov .kg-srcp:last-child{border-bottom:0}
#screen-kitgen .kg-src.on,.kg-ov .kg-src.on,
#screen-kitgen .kg-srcp.on,.kg-ov .kg-srcp.on{box-shadow:inset 3px 0 0 var(--ok-2)}
#screen-kitgen .kg-src.off,.kg-ov .kg-src.off{opacity:.5}
#screen-kitgen .kg-srcp,.kg-ov .kg-srcp{grid-template-columns:minmax(0,1fr) auto}
/* Строка с полоской кадров — полоска колонкой ПЕРВОЙ: манеру кадра читают раньше названия, ради
   неё диалог и открыли. Ширина колонки фиксированная (четыре кадра встык), чтобы имена каналов
   остались выровнены в столбик у разборов с любым числом кадров. */
#screen-kitgen .kg-srcp.pic,.kg-ov .kg-srcp.pic{grid-template-columns:388px minmax(0,1fr) auto}
/* ЗДЕСЬ КАДР РАЗГЛЯДЫВАЮТ, А НЕ УЗНАЮТ, и потому колонка задана шириной, а не долей: при `1fr`
   плитка сплющивалась тем сильнее, чем больше кадров у разбора, — четыре кадра давали 55×74, то
   есть ПОРТРЕТНЫЙ обрезок шестнадцатидевятого скриншота, по которому стиль не читается вовсе.
   96×54 — те же 16:9, что у кадра ролика, и одни для всех строк.
   Отрицательные поля полоски — приём КАРТОЧКИ витрины (там она распирается на её паддинг);
   в строке источника карточки нет, и вылет за край читался как сломанная вёрстка. */
#screen-kitgen .kg-srcp-pic,.kg-ov .kg-srcp-pic{min-width:0;--dl-w:96px;--dl-h:54px;--dl-m:0}
#screen-kitgen .kg-srcp-pic .dl-strip,.kg-ov .kg-srcp-pic .dl-strip{border-radius:4px;
  overflow:hidden;justify-self:start;width:max-content;max-width:100%}
/* Кадров нет — рамка пунктиром. Через `:is()` с id внутри: иначе правило проигрывает базовому
   `:is(#screen-library,.kg-ov) .dl-strip.none` по той же специфичности, что описана у полоски. */
:is(#screen-kitgen,.kg-ov) .kg-srcp-pic .dl-strip.none{border-bottom:0;
  border:1px dashed var(--hair-b);width:auto}
#screen-kitgen .kg-src-n,.kg-ov .kg-src-n{min-width:0;font-size:14px;color:var(--ash)}
#screen-kitgen .kg-src-n b,.kg-ov .kg-src-n b{color:var(--bone);font-weight:500;display:block}
:is(#screen-kitgen,#screen-library) .kg-src-n .kg-hint,.kg-ov .kg-src-n .kg-hint{display:block;margin-top:2px}
#screen-kitgen .kg-src-f,.kg-ov .kg-src-f{min-width:0;font-size:13.5px;color:var(--ash);
  overflow:hidden;text-overflow:ellipsis}
#screen-kitgen .kg-src-f b,.kg-ov .kg-src-f b{color:var(--bone);font-weight:500}
#screen-kitgen .kg-src-a,.kg-ov .kg-src-a{justify-self:end;white-space:nowrap}
.kg-ov .kg-srcpick{max-height:52vh;overflow-y:auto;border:1px solid var(--hair-b);
  border-radius:6px;margin-bottom:14px}

/* ── ПЛИТА-ПАНЕЛЬ — единственная поверхность экрана.
   Шапка с ромб-глифом уезжает до краёв отрицательными полями (идиома `.db-ph`/`.ml-ph`).
   `overflow` НЕ прячем: внутри панелей живут `.csel-panel`, их бы срезало. ── */
#screen-kitgen .kg-panel{position:relative;background:var(--plate-2);border:1px solid var(--hair-b);
  border-radius:var(--cut);padding:0 16px 16px;margin-bottom:12px}
#screen-kitgen .kg-panel::before{content:'';position:absolute;inset:0;border-radius:inherit;
  background:linear-gradient(135deg,rgba(255,255,255,.015),transparent 50%);pointer-events:none}
#screen-kitgen .kg-ph{display:flex;align-items:center;gap:9px;margin:0 -16px 14px;padding:12px 16px;
  border-bottom:1px solid var(--hair);font-family:var(--mono);font-size:12.5px;font-weight:700;
  letter-spacing:.09em;text-transform:uppercase;color:var(--bone)}
#screen-kitgen .kg-ph::before{content:'';width:5px;height:5px;flex:none;background:var(--acc);
  box-shadow:0 0 6px var(--acc);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%)}
#screen-kitgen .kg-ph-r{margin-left:auto;font-weight:400;font-size:12px;letter-spacing:.04em;
  text-transform:none;color:var(--ash-2);font-variant-numeric:tabular-nums;text-align:right}
/* Действие плиты — в её шапке (13.08.2026): «Разобрать новый канал» под таблицей на сорок строк
   уезжало вниз вместе с ними, а свёрнутую плиту не открывало вовсе. Кнопка гасит всплытие —
   шапка библиотеки это ещё и переключатель сворачивания. */
#screen-kitgen .kg-ph-btn{flex:none;margin:-4px 0 -4px 12px}

/* ── РИТМ ВКЛАДКИ «АНКЕТА И СБОРКА» (16.08.2026) ──
   Вкладка складывалась из одиннадцати плит ОДНОГО веса: «Пресет», шапка анкеты, восемь блоков
   формы, приёмка, ТЗ, лог — одинаковый `--plate-2`, одинаковый радиус, одинаковые 12px между.
   Ничто не говорило, что восемь блоков ПРИНАДЛЕЖАТ шапке анкеты, а не лежат рядом с ней.
   Лечим двумя средствами дизайн-системы, без единого нового приёма:
   1. ОТСТУП НЕСЁТ СМЫСЛ. Между этапами — 22px, внутри анкеты — 6px. Одно значение на всё
      (12px) не выражало ничего: близость и есть группировка.
   2. ОБВОДКА НЕСЁТ РАНГ. У этапов остаётся `--hair-b`, у блоков формы — более тихий `--hair`:
      группа читается как одно поле из восьми секций, а не как восемь самостоятельных плит.
   ⚠ ФОН БЛОКОВ НЕ ТРОГАЕМ. Утопить их на `--plate` напрашивается по палитре, но именно `--plate`
   стоит фоном у `.inp` (поле темнее плиты = «утоплено», см. дизайн-систему): восемьдесят шесть
   полей анкеты слились бы со своим блоком. Уровень поверхности здесь занят, работают отступ и
   обводка.
   ⚠ Вкладывать блоки формы В плиту анкеты (плита в плите) — тоже нельзя: вложенная карточка это
   всегда признак того, что группировку не смогли выразить иначе. */
#screen-kitgen #kg-tab-kit > .kg-panel{margin-bottom:22px}
/* ⚠ Селектор ТРЁХ id намеренно: `#screen-kitgen #kg-tab-kit > .kg-panel` выше строкой весит
   (0,2,1), и короткое `#screen-kitgen #kg-anketa-panel` (0,2,0) ему проиграло бы — шапка анкеты
   уехала бы от своих блоков на те же 22px, то есть ровно в проблему, которую правим. */
#screen-kitgen #kg-tab-kit > #kg-anketa-panel{margin-bottom:6px}
#screen-kitgen #kg-form{margin-bottom:22px}
/* Сдвиг влево — главный носитель подчинённости. Одной обводкой не обошлось: `--hair` против
   `--hair-b` это .07 против .11 альфы, на рендере разница не читается вовсе. Отступ читается. */
#screen-kitgen #kg-form .kg-panel{margin-bottom:6px;margin-left:18px;border-color:var(--hair)}

/* В ШАГЕ ПОЛЯ ИДУТ В СТОЛБИК — по одному вопросу за раз, а не двухколоночной сеткой анкеты:
   «Решения» и «Чего канал не сказал» показывают единицы полей, и раскладывать их в две колонки
   значит заставлять читать зигзагом то, что и так помещается в строку.
   ⚠ Правило ЖИЛО ПОД `#screen-kitgen2` и было стёрто вместе с макетом (16.08.2026) — комментарий
   пережил свою реализацию, и шаги полсуток рисовались сеткой анкеты. Восстановлено на рабочих
   контейнерах шагов. */
#screen-kitgen #kg-dec .kg-fields,
#screen-kitgen #kg-ask .kg-fields{grid-template-columns:1fr}

/* ── ЛИПКАЯ ПОЛОСА АНКЕТЫ: «ГДЕ Я» И «ЧЕМ ЗАКРЫТЬ» В ОДНОЙ СТРОКЕ ──
   Развёрнутая анкета — около восьми тысяч пикселей. Липла только полоска блоков; «Сохранить
   анкету» и «Свернуть поля» стояли отдельной строкой над ней и уезжали вверх вместе с формой,
   то есть требовали прокрутки в самый верх ради жеста, который нужен именно там, где работаешь.
   Обе половины теперь в одном липком контейнере: слева блоки, справа действия, на узком экране
   действия переносятся на вторую строку сами (`flex-wrap`), а не режутся.
   Цифра у блока — сколько в нём ПУСТЫХ полей (галочка, если ни одного): полоска говорит не
   только «какие блоки есть», но и «где работа». */
/* ── ВЫПАДАЮЩЕЕ МЕНЮ У КНОПКИ («⋯ Ещё») ──
   Своей формы не заводим: панель и пункты — та же идиома, что у кастомного дропдауна `.csel`
   (тот же фон `--plate-hi`, радиус, тень, подсветка пункта). Опасный пункт красится только на
   наведении: красный в покое читался бы как предупреждение о состоянии, а это просто действие. */
#screen-kitgen .kg-more{position:relative;display:inline-flex}
#screen-kitgen .kg-menu{position:absolute;z-index:60;top:calc(100% + 6px);left:0;min-width:210px;
  background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;padding:5px;
  box-shadow:0 22px 50px -18px rgba(0,0,0,.85);display:flex;flex-direction:column;gap:1px}
#screen-kitgen .kg-menu-i{text-align:left;background:none;border:0;border-radius:5px;
  padding:8px 10px;font-family:var(--mono);font-size:13.5px;color:var(--ash);cursor:pointer;
  transition:.1s;white-space:nowrap}
#screen-kitgen .kg-menu-i:hover,#screen-kitgen .kg-menu-i:focus-visible{
  background:rgba(var(--accent-rgb),.16);color:var(--bone);outline:none}
#screen-kitgen .kg-menu-i.danger:hover,#screen-kitgen .kg-menu-i.danger:focus-visible{
  background:rgba(var(--err-rgb),.16);color:var(--bad)}

/* ── «УЖЕ СОБРАН» НА ПЛИТЕ «ПРЕСЕТ» ──
   Зелёная полоса слева — идиома состояния дизайн-системы, та же, что у `.kg-block.ok`: это не
   тревога, а факт («пресет выпущен и работает»). Текст рядом — про последствие правки, и он
   намеренно НЕ красный: пересборка не теряет работу, она заводит новую версию.
   `busy` — идёт пересборка: янтарь, потому что тут действие имеет цену прямо сейчас (запуск
   прогона до конца сборки пойдёт по старому пресету). */
#screen-kitgen .kg-built{margin-top:12px;padding:11px 14px;border-radius:6px;
  background:rgba(var(--green-rgb),.05);box-shadow:inset 3px 0 0 rgba(var(--green-rgb),.55)}
#screen-kitgen .kg-built.busy{background:rgba(var(--amber-rgb),.05);
  box-shadow:inset 3px 0 0 rgba(var(--amber-rgb),.55)}
#screen-kitgen .kg-built-h{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
#screen-kitgen .kg-built-ok{font-family:var(--mono);font-size:12.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ok-2);font-weight:700}
#screen-kitgen .kg-built.busy .kg-built-ok{color:var(--warn)}
#screen-kitgen .kg-built-n{font-family:var(--mono);font-size:12px;color:var(--ash)}
#screen-kitgen .kg-built-t{font-size:13.25px;line-height:1.5;color:var(--ash);margin-top:6px}
#screen-kitgen .kg-built-t > div{margin-top:3px}
#screen-kitgen .kg-built-t > div:first-child{margin-top:0}

/* ── ЛИПКАЯ СТРОКА НАД ШАГАМИ ──
   Шаг разворачивается на несколько экранов, а закрыть его можно было только из его же шапки —
   то есть прокрутив к началу. Строка липнет к верху экрана и держит «Свернуть все» под рукой
   из любого места шага; слева — имя открытого шага, ответ на «где я» без прокрутки.
   ВЫСОТА ФИКСИРОВАНА ТОКЕНОМ и тем же токеном отодвинута полоса анкеты ниже (`.kg-abar`): обе
   липнут к нулю, и стой они на одной высоте — верхняя закрыла бы нижнюю. Один источник числа,
   поэтому разъехаться им нечем; содержимое строки (кнопка + подпись) в эту высоту укладывается
   и не переносится. Фон — `--void`: строка живёт МЕЖДУ плитами шагов, на фоне экрана, а не
   внутри плиты. */
#screen-kitgen #kg-anketa-panel{--kg-foldbar:46px}
#screen-kitgen .kg-foldbar{position:sticky;top:0;z-index:5;height:var(--kg-foldbar);
  display:flex;align-items:center;justify-content:flex-end;gap:12px;
  background:var(--void);border-bottom:1px solid var(--hair)}
#screen-kitgen .kg-fold-l{font-family:var(--mono);font-size:11px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash-2);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;min-width:0}
#screen-kitgen .kg-abar{position:sticky;top:var(--kg-foldbar);z-index:4;display:flex;flex-wrap:wrap;
  align-items:center;justify-content:space-between;gap:8px 16px;padding:9px 0 10px;
  margin-bottom:6px;background:var(--plate-2);border-bottom:1px solid var(--hair-b)}
#screen-kitgen .kg-abar .kg2-nav{flex:1 1 420px;min-width:0}
#screen-kitgen .kg-arow{display:flex;align-items:center;gap:8px;flex:none}
#screen-kitgen .kg2-nav{display:flex;flex-wrap:wrap;gap:6px}
#screen-kitgen .kg2-nav-i{display:inline-flex;align-items:center;gap:7px;background:var(--plate);
  border:1px solid var(--hair-b);border-radius:20px;padding:5px 12px;cursor:pointer;
  transition:.14s;font-family:var(--ui);color:var(--ash);font-size:13px}
#screen-kitgen .kg2-nav-i:hover{border-color:var(--hair-hi);color:var(--bone)}
#screen-kitgen .kg2-nav-i.on{border-color:var(--acc);background:var(--accent-dim);color:var(--bone)}
#screen-kitgen .kg2-nav-t{white-space:nowrap}
#screen-kitgen .kg2-nav-n{font-family:var(--mono);font-size:11px;color:var(--ok-2);
  font-variant-numeric:tabular-nums;flex:none}
#screen-kitgen .kg2-nav-n.hole{color:var(--warn)}
/* Блоки анкеты внутри раскрывашки — тот же приём подчинённости, что у формы рабочего экрана. */
#screen-kitgen #kg-st-all .kg-pbody .kg-panel{margin-left:0;margin-bottom:6px;
  border-color:var(--hair)}

/* Сводка анкеты — своя строка капсул под шапкой, а не хвост в правом краю шапки. */
#screen-kitgen .kg-fill{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin-bottom:12px}
#screen-kitgen .kg-fill:empty{display:none}

/* ── СВОРАЧИВАЕМАЯ ПЛИТА (аккордеон) ──
   Анкета это 8 блоков и ~4900px полей: развёрнутая целиком, она не обозрима — оператор не видит
   ни сколько блоков, ни где что лежит. Свёрнутая плита показывает ТОЛЬКО шапку, и вся анкета
   умещается в один экран как оглавление.
   ⚠ Состояние живёт НЕ в DOM (`KG.formOpen` + localStorage): `renderForm` перерисовывает форму
   целиком на каждом переключении gate-поля, и класс на узле не пережил бы перерисовку. */
#screen-kitgen .kg-ph.clk{cursor:pointer;user-select:none;
  border-radius:var(--cut) var(--cut) 0 0;transition:.14s}
#screen-kitgen .kg-panel.col .kg-ph.clk{border-radius:var(--cut)}
#screen-kitgen .kg-ph.clk:hover{background:rgba(var(--acc-rgb),.05)}
#screen-kitgen .kg-ph.clk:hover .kg-ar{border-top-color:var(--acc-2)}
/* Каретка — ТРЕУГОЛЬНИК НА БОРДЮРАХ, а не глиф «▾»: на 11px в моношрифте он вырождается в
   чёрточку и перестаёт читаться как направление. Стоит СПРАВА, у счётчиков: слева уже есть
   ромб-глиф раздела, и два маркера подряд в начале строки спорят друг с другом. */
#screen-kitgen .kg-ar{flex:none;width:0;height:0;margin-left:4px;
  border-left:5px solid transparent;border-right:5px solid transparent;
  border-top:6px solid var(--ash-2);transition:transform .15s,border-top-color .14s}
#screen-kitgen .kg-panel.col .kg-ar{transform:rotate(-90deg)}
#screen-kitgen .kg-panel.col{padding-bottom:0}
#screen-kitgen .kg-panel.col .kg-ph{margin-bottom:0;border-bottom:0}
#screen-kitgen .kg-panel.col .kg-pbody{display:none}
/* Свёрнутый блок обязан ОТЧИТЫВАТЬСЯ, иначе он прячет не только поля, но и проблемы в них. */
#screen-kitgen .kg-cnt{font-family:var(--mono);font-size:11px;letter-spacing:.06em;padding:1px 8px;
  border-radius:20px;border:1px solid var(--hair-b);color:var(--ash-2);white-space:nowrap;
  font-variant-numeric:tabular-nums}
#screen-kitgen .kg-cnt.full{color:var(--ok-2);border-color:rgba(var(--green-rgb),.4);
  background:rgba(var(--green-rgb),.06)}
#screen-kitgen .kg-cnt.guess{color:var(--warn);border-color:rgba(var(--amber-rgb),.5);
  background:rgba(var(--amber-rgb),.07)}

/* ── поля ── */
#screen-kitgen .inp{background:var(--plate);border-radius:6px}
#screen-kitgen .inp:focus{border-color:var(--acc);box-shadow:inset 0 0 16px rgba(var(--acc-rgb),.06)}
#screen-kitgen select.inp{color-scheme:dark}
#screen-kitgen .inp-lbl{font-family:var(--mono);font-size:12.75px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ash-2);margin-bottom:6px}
:is(#screen-kitgen,#screen-library) .kg-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:10px}
#screen-kitgen .kg-2col{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
:is(#screen-kitgen,#screen-library) .kg-hint{font-size:13px;color:var(--ash-2);line-height:1.5}
/* `.kg-sub` объявлен НИЖЕ, одним блоком (см. «капсулы и подписи»): здесь стояло второе
   объявление того же селектора, и жило оно наполовину — размер, трекинг и регистр перебивались
   нижним, а `font-variant-numeric` доживал сюда единственным уцелевшим свойством. Слито туда. */
#screen-kitgen .kg-note{font-size:13.5px;color:var(--ash);line-height:1.6;margin:0 0 14px;
  border-left:2px solid var(--hair-hi);padding-left:11px}

/* ── .csel — кастомный дропдаун (канон: голый нативный <select> запрещён).
   Скоуп-копия ДВОЙНАЯ: экран + `.kg-ov` — оверлей «Выборочно» живёт в <body>, вне #screen-kitgen,
   и без второго селектора получил бы белый системный список. ── */
#screen-kitgen .csel,.kg-ov .csel{position:relative;width:100%}
#screen-kitgen .csel > select.inp,.kg-ov .csel > select.inp{position:absolute;width:1px;height:1px;
  opacity:0;pointer-events:none;margin:0;padding:0}
#screen-kitgen .csel-btn,.kg-ov .csel-btn{width:100%;display:flex;align-items:center;
  justify-content:space-between;gap:10px;background:var(--plate);border:1px solid var(--hair-b);
  border-radius:6px;color:var(--bone);font-family:var(--mono);font-size:15px;letter-spacing:.04em;
  padding:9px 12px;cursor:pointer;transition:.14s;min-width:0}
#screen-kitgen .csel-btn:hover,.kg-ov .csel-btn:hover{border-color:var(--hair-hi)}
#screen-kitgen .csel.open .csel-btn,.kg-ov .csel.open .csel-btn{border-color:var(--accent);
  box-shadow:inset 0 0 16px rgba(var(--accent-rgb),.06)}
#screen-kitgen .csel-lbl,.kg-ov .csel-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  min-width:0}
#screen-kitgen .csel-arrow,.kg-ov .csel-arrow{color:var(--ash-2);font-size:12px;flex:none;
  transition:transform .15s}
#screen-kitgen .csel.open .csel-arrow,.kg-ov .csel.open .csel-arrow{transform:rotate(180deg);
  color:var(--accent-2)}
#screen-kitgen .csel-panel,.kg-ov .csel-panel{position:absolute;z-index:60;top:calc(100% + 6px);
  left:0;right:0;background:var(--plate-hi);border:1px solid var(--hair-hi);border-radius:8px;
  box-shadow:0 22px 50px -18px rgba(0,0,0,.85);padding:5px;max-height:280px;overflow-y:auto;display:none}
#screen-kitgen .csel.open .csel-panel,.kg-ov .csel.open .csel-panel{display:block}
#screen-kitgen .csel-opt,.kg-ov .csel-opt{padding:8px 10px;border-radius:5px;font-family:var(--mono);
  font-size:14px;color:var(--ash);cursor:pointer;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;transition:.1s}
#screen-kitgen .csel-opt:hover,.kg-ov .csel-opt:hover{background:rgba(var(--accent-rgb),.16);
  color:var(--bone)}
#screen-kitgen .csel-opt.sel,.kg-ov .csel-opt.sel{color:var(--accent-2)}
/* Ширины: канал-образец в шапке и селектор разбора в оверлее — не на всю строку.
   680px (вдвое против прежних 340): в пункте лежит имя пресета плюс владелец плюс «· собран»,
   и на 340px всё это обрезалось многоточием ровно там, где имена пресетов расходятся. */
#screen-kitgen .kg-bar .csel{width:680px;flex:none;max-width:100%}
.kg-ov .kg-row .csel{width:320px;flex:none;max-width:100%}
#screen-kitgen .kg-engrow .csel{flex:1;min-width:0}

/* ── артефакты ── */
#screen-kitgen .kg-art{border-top:1px solid var(--hair);padding:14px 0}
#screen-kitgen .kg-art:first-child{border-top:0;padding-top:0}
#screen-kitgen .kg-art-h{font-family:var(--mono);font-size:12.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash);margin-bottom:9px;display:flex;gap:12px;
  align-items:baseline;flex-wrap:wrap;font-variant-numeric:tabular-nums}
:is(#screen-kitgen,#screen-library) .kg-art-h .kg-hint{text-transform:none;letter-spacing:0}
/* `.kg-chips` объявлен НИЖЕ, одним блоком: здесь было второе объявление того же селектора, из
   которого доживал только `margin-bottom` — gap и flex-wrap перебивались нижним. Слито туда. */
:is(#screen-kitgen,#screen-library) .kg-imgs{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:8px}
:is(#screen-kitgen,#screen-library) .kg-img{position:relative;width:132px;height:74px;overflow:hidden;border-radius:6px;
  border:1px solid var(--hair-b);transition:.14s}
:is(#screen-kitgen,#screen-library) .kg-img:hover{border-color:var(--hair-hi)}
:is(#screen-kitgen,#screen-library) .kg-img img{width:100%;height:100%;object-fit:cover;display:block;cursor:zoom-in}
:is(#screen-kitgen,#screen-library) .kg-x{position:absolute;top:3px;right:4px;cursor:pointer;color:var(--bone);
  background:rgba(4,4,5,.7);border-radius:5px;padding:0 5px;font-size:13px;line-height:1.5}
:is(#screen-kitgen,#screen-library) .kg-chips .kg-x{position:static;background:none;padding-left:6px;color:var(--ash-2)}
:is(#screen-kitgen,#screen-library) .kg-x:hover{color:var(--bad)}
:is(#screen-kitgen,#screen-library) .kg-imgerr{position:absolute;inset:0;display:flex;align-items:center;
  justify-content:center;font-size:12px;color:var(--bad);background:var(--plate-2);text-align:center}

/* ── ход разбора: пять строк-статусов, полоса слева по семантике ── */
:is(#screen-kitgen,#screen-library) .kg-prog{margin-top:14px;display:flex;flex-direction:column;gap:6px}
:is(#screen-kitgen,#screen-library) .kg-pstep{display:flex;gap:11px;align-items:center;flex-wrap:wrap;
  background:var(--plate);border:1px solid var(--hair);border-radius:6px;padding:9px 13px 9px 15px;
  font-size:14.5px;color:var(--ash);transition:.14s}
:is(#screen-kitgen,#screen-library) .kg-pname{flex:1 1 auto;min-width:0}
:is(#screen-kitgen,#screen-library) .kg-pdot{width:8px;height:8px;border-radius:50%;background:var(--ash-2);flex:none}
:is(#screen-kitgen,#screen-library) .kg-pstep.ok{color:var(--bone);box-shadow:inset 3px 0 0 var(--ok-2)}
:is(#screen-kitgen,#screen-library) .kg-pstep.ok .kg-pdot{background:var(--ok-2);box-shadow:0 0 7px rgba(var(--green-rgb),.55)}
:is(#screen-kitgen,#screen-library) .kg-pstep.bad{box-shadow:inset 3px 0 0 var(--bad)}
:is(#screen-kitgen,#screen-library) .kg-pstep.bad .kg-pdot{background:var(--bad);box-shadow:0 0 7px rgba(var(--err-rgb),.55)}
:is(#screen-kitgen,#screen-library) .kg-pstep.run{color:var(--bone);box-shadow:inset 3px 0 0 var(--acc)}
:is(#screen-kitgen,#screen-library) .kg-pstep.run .kg-pdot{background:var(--acc-2);box-shadow:0 0 8px var(--acc);
  animation:kgpulse 1.1s infinite}
:is(#screen-kitgen,#screen-library) .kg-pstep.skip{color:var(--ash-2);opacity:.7}
@keyframes kgpulse{0%,100%{opacity:1}50%{opacity:.25}}
:is(#screen-kitgen,#screen-library) .kg-pst{font-family:var(--mono);font-size:11.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash-2)}
#screen-kitgen .kg-pview{padding:2px 9px;font-size:12.5px;line-height:1.6}
:is(#screen-kitgen,#screen-library) .kg-pstep .kg-hint{flex:1 0 100%;margin-left:19px}
/* ── ПОЛОСА ПРОГОНА (разбор канала и сборка пресета — одна идиома на оба) ──
   Столбик шагов отвечает «что с каждым», полоса — «идёт ли, сколько из скольких, сколько уже».
   Тонкая `.pbar` из общей библиотеки, а не своя: второй прогресс-бар в проекте разъехался бы
   с первым на первой же правке акцента. Пока идёт — рамка акцентом, чтобы блок читался как
   живой без единой анимации в фоне. */
#screen-kitgen .kg-runbar{border:1px solid var(--hair-b);border-radius:6px;background:var(--plate);
  padding:11px 14px;margin-bottom:12px;transition:.14s}
#screen-kitgen .kg-runbar.on{border-color:rgba(var(--acc-rgb),.45);background:var(--accent-dim)}
#screen-kitgen .kg-runbar-h{display:flex;gap:12px;align-items:baseline;justify-content:space-between;
  font-size:14px;color:var(--bone);margin-bottom:8px;line-height:1.45}
/* Правая группа шапки полосы: номер прогона + процент. Группой, а не двумя детьми флекса, —
   иначе `space-between` растащил бы номер в середину строки, оторвав его от процента. */
#screen-kitgen .kg-runbar-r{display:flex;gap:10px;align-items:baseline;flex:none}
#screen-kitgen .kg-runbar-hist{font-family:var(--mono);font-size:11px;letter-spacing:.02em;
  color:var(--ash-2);background:none;border:0;padding:0;cursor:pointer;white-space:nowrap;
  text-decoration:underline;text-decoration-color:var(--hair-b);text-underline-offset:3px;
  transition:.14s}
#screen-kitgen .kg-runbar-hist:hover{color:var(--bone);text-decoration-color:var(--hair-hi)}
:is(#screen-kitgen,#screen-library) .kg-runbar .kg-hint{margin-top:8px}
/* ОТМЕТКА СТАРШЕ ПРОГОНА. Шаг с прошлого разбора выглядел «готово» наравне со свежим — по этой
   паре и нельзя было понять, переделалось что-то или висит старое. Тушим и подписываем. */
:is(#screen-kitgen,#screen-library) .kg-pstep.old{opacity:.62}
#screen-kitgen .kg-old{font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;
  padding:1px 7px;border-radius:20px;border:1px solid var(--hair);color:var(--ash-2);
  white-space:nowrap;text-transform:uppercase}

/* ── читалки текста ── */
#screen-kitgen .kg-pre{background:var(--plate);border:1px solid var(--hair);border-radius:6px;
  padding:14px;font-family:var(--mono);font-size:13px;line-height:1.62;white-space:pre-wrap;
  word-break:break-word;max-height:520px;overflow:auto;color:var(--ash)}

/* ── чего ДНК не знает ── */
#screen-kitgen .kg-q{background:var(--plate);border:1px solid rgba(var(--amber-rgb),.28);
  border-radius:6px;box-shadow:inset 3px 0 0 var(--warn);padding:11px 14px 12px 16px;margin-bottom:14px}
#screen-kitgen .kg-q-h{font-family:var(--mono);font-size:12.5px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--warn);margin-bottom:8px;font-variant-numeric:tabular-nums}
:is(#screen-kitgen,#screen-library) .kg-q-h .kg-hint{text-transform:none;letter-spacing:0}
#screen-kitgen .kg-q ol{margin:0;padding-left:20px;font-size:14px;color:var(--ash);line-height:1.6}
#screen-kitgen .kg-q li{margin-bottom:5px}

/* ── анкета ── */
/* Словарь завода над анкетой. Две колонки на широком экране: двадцать три записи в один столбец
   — это простыня, которую пролистывают, не читая. Свёрнут по умолчанию (состояние в
   localStorage): нужен один раз новичку, а не каждому открытию анкеты. */
#screen-kitgen .kg-gloss-list{display:grid;grid-template-columns:1fr 1fr;gap:10px 20px}
#screen-kitgen .kg-gloss-i b{display:block;font-family:var(--mono);font-size:10.5px;
  letter-spacing:.09em;text-transform:uppercase;color:var(--acc-2,var(--accent));font-weight:700}
#screen-kitgen .kg-gloss-i span{display:block;font-size:12.75px;line-height:1.5;color:var(--ash);
  margin-top:2px}
@media (max-width:1100px){#screen-kitgen .kg-gloss-list{grid-template-columns:1fr}}
/* ── ЛЕСТНИЦА ПОЛЕЙ ──
   Поля шли встык через `margin-bottom`, и граница между ними была одним воздухом. Воздуха не
   хватало: подпись поля (моно-капс 12.75px, `--ash-2`) и справка предыдущего (12.5px, `--ash-2`)
   — один и тот же кегль одним и тем же цветом, то есть визуально одна масса. Отсюда «пелена
   текста»: глазу не за что зацепиться, чтобы понять, где кончился один вопрос и начался
   следующий.
   Волосяная линия сверху у каждой ячейки даёт ту самую границу и заодно чинит рваность
   двухколоночной сетки: строки в ней и так выровнены по верху, но при разной высоте ячеек пустота
   снизу читалась как случайная — с линиями она читается как ступень. Отбивка симметричная
   (сверху = снизу), иначе линия липнет к подписи, которую отделяет. */
#screen-kitgen .kg-fields{display:grid;grid-template-columns:1fr 1fr;gap:0 20px}
/* `--hair-b`, а не `--hair`: .07 на плите `--plate-2` глазом не читается — этой же проверкой
   16.08.2026 отвергли различение блоков одной рамкой. .11 — та же линия, что у рамки поля ввода,
   то есть заведомо видимая в этой палитре. */
#screen-kitgen .kg-fields > *{border-top:1px solid var(--hair-b);padding-top:14px;
  padding-bottom:14px;margin-bottom:0}
#screen-kitgen .kg-field{position:relative}
/* ⚠ ЯНТАРНАЯ ПОДПИСЬ У «ОТВЕЧАЕТЕ ВЫ» СНЯТА (16.08.2026, жалоба оператора: «почему названия
   некоторых полей жёлтые, а у некоторых жёлтая линия слева — неинтуитивно и мельтешит»).
   Причина была настоящая: янтарём красились ДВЕ разные вещи. `.man` — СВОЙСТВО поля («по чужому
   каналу этого не измерить, отвечает оператор»), оно вечное и стоит у трети анкеты; `.hole` —
   СОСТОЯНИЕ («пустая рельса, дырка в пресете»), оно временное и требует действия. Одним цветом
   они неотличимы, а свойство ещё и берёт числом — отсюда рябь.
   Правило этого экрана уже записано абзацем ниже, у рельсы: «метка тихая — это свойство поля,
   а не проблема». Здесь оно просто не было применено. Теперь янтарь в анкете значит РОВНО ДВЕ
   вещи, и обе — проблема: пустая рельса (полоса слева) и [ДОГАДКА] (капсула). «Отвечаете вы»
   говорится словами под пустым полем, синим — цветом «твой ход», а не тревоги. */
#screen-kitgen .kg-fhint{font-size:12.5px;color:var(--ash-2);line-height:1.5;margin-top:5px}
/* ── СПРАВКА ПОД ПОЛЕМ — НЕ В «ВСЕЙ АНКЕТЕ» ──
   Абзац справки это 2–4 строки серого у КАЖДОГО поля: на блок в десять полей — до сорока строк,
   и это и есть та самая пелена. Содержимое не теряется: `infoBtn` кладёт ровно этот текст первым
   ответом («Что это») в попап у подписи, а попап — оверлей, он не двигает сетку.
   Разница по месту, а не по вкусу: «Вся анкета» — запасной выход, туда приходят ИСКАТЬ поле
   среди семидесяти, и справка там мешает искать. В шагах «Решения» и «Чего канал не сказал»
   оператор встречает по одному вопросу за раз — там справка на месте и остаётся видимой. */
#kg-form .kg-fhint{display:none}
/* `.kg-man` снят 16.08.2026: класс не выдавал НИКТО (сверено grep'ом по `ui/`), а правило было
   третьим янтарным носителем одного и того же смысла «отвечаете вы». */
/* Бейдж уровня доказательства — капсула (идиома `.ml-badge`), пунктир = поле из ЧУЖОГО разбора. */
#screen-kitgen .kg-badge{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;
  padding:2px 9px;border-radius:20px;border:1px solid var(--hair-b);color:var(--ash-2);
  text-transform:uppercase;white-space:nowrap}
#screen-kitgen .kg-badge.ok{color:var(--ok-2);border-color:rgba(var(--green-rgb),.4);
  background:rgba(var(--green-rgb),.06)}
#screen-kitgen .kg-badge.guess{color:var(--warn);border-color:rgba(var(--amber-rgb),.5);
  background:rgba(var(--amber-rgb),.07)}
#screen-kitgen .kg-badge.man{color:var(--acc-2);border-color:var(--hair-hi);
  background:rgba(var(--acc-rgb),.07)}
#screen-kitgen .kg-badge.other{border-style:dashed}
/* «У канала нет» — измеренный ответ, а не пробел: тон нейтральный, чтобы не читался тревогой.
   «Умолчание» — наше производственное решение: тот же нейтральный тон, но пунктиром. */
#screen-kitgen .kg-badge.no{color:var(--ash-2);border-color:var(--hair-hi);
  background:rgba(255,255,255,.03)}
#screen-kitgen .kg-badge.def{color:var(--ash-1);border-color:var(--hair-hi);border-style:dashed}
/* ПОДТВЕРЖДЁННАЯ ДОГАДКА — зелёная, как «замер»: оператор ответил, вопрос закрыт. Отдельный
   класс, а не `.ok`: происхождение у значения по-прежнему не замер канала, и подсказка бейджа
   говорит именно это. */
#screen-kitgen .kg-badge.okc{color:var(--ok-2);border-color:rgba(var(--green-rgb),.45);
  background:rgba(var(--green-rgb),.08)}
/* ── ГАЛОЧКА «СОГЛАСЕН С ДОГАДКОЙ» ──
   Стоит СЛЕВА от статуса и есть у каждого поля-догадки: другого способа согласиться со
   значением у оператора нет (правка метит поле по факту СМЕНЫ значения, а он менять не хочет).
   Отжимается тем же нажатием, поэтому `role=switch`, а не кнопка-действие.
   Ненажатая — тихий контур: это приглашение, а не ещё одна тревога рядом с жёлтой капсулой. */
#screen-kitgen .kg-lvl{display:inline-flex;align-items:center;gap:7px}
#screen-kitgen .kg-ok{flex:none;width:17px;height:17px;padding:0;line-height:1;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;border-radius:50%;
  font-size:10px;background:none;border:1px solid var(--hair-hi);color:var(--ash-1);
  transition:.14s}
#screen-kitgen .kg-ok:hover{border-color:rgba(var(--green-rgb),.55);color:var(--ok-2);
  background:rgba(var(--green-rgb),.1)}
#screen-kitgen .kg-ok.on{border-color:rgba(var(--green-rgb),.75);color:var(--ok-2);
  background:rgba(var(--green-rgb),.16)}
#screen-kitgen .kg-ok:focus-visible{outline:2px solid rgba(var(--green-rgb),.6);outline-offset:2px}
/* РЕЛЬСА: поле с машинным эффектом. Метка тихая — это свойство поля, а не проблема; красным
   подсвечивается только ДЫРКА (пустая рельса), полосой слева, идиомой статуса дизайн-системы. */
#screen-kitgen .kg-rail{font-family:var(--mono);font-size:10px;letter-spacing:.1em;
  padding:2px 7px;border-radius:20px;border:1px solid var(--hair-b);color:var(--ash-2);
  text-transform:uppercase;white-space:nowrap}
/* «Не едет в пресет» — та же капсула, что рельса, но пунктиром: это не свойство переноса,
   а его отсутствие, и сплошная рамка ставила бы обе метки в один ряд утверждений. */
#screen-kitgen .kg-rail.ref{border-style:dashed}
#screen-kitgen .kg-ro{font-family:var(--mono);font-size:10px;letter-spacing:.1em;padding:2px 7px;
  border-radius:20px;border:1px solid rgba(var(--green-rgb),.35);color:var(--ok-2);
  text-transform:uppercase;white-space:nowrap}
#screen-kitgen .kg-field.hole{box-shadow:inset 3px 0 0 rgba(var(--amber-rgb),.55);
  padding-left:11px;margin-left:-11px}
/* ── ПОЛЕ, ОТКРЫТОЕ РАЗВИЛКОЙ НАД НИМ («Решения») ──
   Отбивка слева тонкой линией: вопрос вырос из выбора выше, а не встал рядом третьим
   равноправным. Идиома та же, что у `.kg-fneed` и цитаты в шапке раздела — линия-указатель,
   а не рамка: рамка читалась бы как «отдельная плита».
   Сдвиг — `margin-left`, а НЕ `padding-left`: отступать должен весь подпункт ВМЕСТЕ с линией.
   Внутренним отступом уезжало только содержимое, линия оставалась на общей левой кромке — и
   пометки внутри поля (янтарная полоса дырки, синяя полосы правки) отъезжали от неё вместе с
   текстом, вместо того чтобы стоять у своего края. */
#screen-kitgen .kg-opened{grid-column:1/-1;margin-left:45px;padding-left:15px;
  border-left:2px solid rgba(var(--acc-rgb),.4)}
/* ── ПРИЗЫВ ПОД ПОЛЕМ («заведите его в библиотеке») ──
   Виден ВСЕГДА, в том числе в «Всей анкете», где справка скрыта: справка объясняет поле, а это
   говорит, что поля НЕДОСТАТОЧНО. Тон приглушённый, кнопка-призрак — это не действие анкеты,
   а выход в соседний раздел. */
/* Пара «вопрос + его ответ» в одной ячейке сетки: без неё второй уезжал под чужой вопрос,
   стоило первому спрятаться гейтом (двухколоночная сетка, поля текут слева направо). */
#screen-kitgen .kg-pair{display:block}
/* ── ПРАВЛЕНО ВРУЧНУЮ ──
   Синяя полоса слева = «это значение поставили вы». Синий, а не янтарь: правка — не проблема,
   а факт; янтарь на этом экране значит РОВНО проблему (пустая рельса, догадка). Полоса той же
   толщины и в том же месте, что у дырки, — двух таких у поля не бывает: дырка это пусто,
   а правка это не пусто. */
#screen-kitgen .kg-field.edited{box-shadow:inset 3px 0 0 rgba(var(--acc-rgb),.5);
  padding-left:11px;margin-left:-11px}
/* «По умолчанию» — рядом с бейджами, тихой строчкой: это отмена, а не действие анкеты. */
#screen-kitgen .kg-reset{background:none;border:0;padding:0 0 0 4px;cursor:pointer;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ash-2);text-decoration:underline;text-underline-offset:3px;transition:.12s}
#screen-kitgen .kg-reset:hover{color:var(--acc-2)}
#screen-kitgen .kg-reset.off{display:none}
#screen-kitgen .kg-cta{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:8px;
  padding:9px 11px;border:1px solid var(--hair-b);border-radius:6px;background:var(--plate);
  font-size:12.5px;color:var(--ash-2);line-height:1.45}
#screen-kitgen .kg-cta span{flex:1;min-width:190px}
#screen-kitgen .kg-cta .btn{flex:none}
/* Привязанная карточка библиотеки рядом с кнопкой. Селектор `span.kg-cta-now`, а не `.kg-cta-now`:
   правило выше (`.kg-cta span`) специфичнее на тип элемента, и без него метка тянулась бы через
   всю строку с `min-width:190px`. Это не пояснение на всю ширину, а метка выбранного — она
   обязана стоять рядом с кнопкой, которая её меняет. */
#screen-kitgen .kg-cta span.kg-cta-now{flex:none;min-width:0;display:inline-flex;gap:7px;
  align-items:center;
  padding:3px 8px 3px 3px;border:1px solid rgba(var(--acc-rgb),.4);border-radius:20px;
  background:rgba(var(--acc-rgb),.1);color:var(--bone);font-size:12.5px}
#screen-kitgen .kg-cta-now img,#screen-kitgen .kg-cta-now i{width:24px;height:24px;flex:none;
  border-radius:50%;object-fit:cover;background:var(--plate-2)}
#screen-kitgen .kg-cta-now i{display:flex;align-items:center;justify-content:center;
  font-style:normal;font-size:12px;color:var(--ash-2)}
#screen-kitgen .kg-cta-now a{cursor:pointer;color:var(--ash-2);padding:0 2px}
#screen-kitgen .kg-cta-now a:hover{color:var(--err-2)}
#screen-kitgen .kg-field.ro .inp{opacity:.72;cursor:default}
/* ── ЦЕЛЬ ПЕРЕХОДА ИЗ ПРИЁМКИ (KG.jumpField / KG.openPresetPrompt) ──
   Приёмка ссылается на поле, но поле — одно из семидесяти в двухколоночной сетке, и «просто
   прокрутили» оставляет искать глазами. Вспышка гаснет за 2.4 с и в самом поле ничего не меняет.
   Обводкой (`outline`), а НЕ тенью: тень слева у поля уже занята — ею помечена дырка
   (`.kg-field.hole`), и анимация теней стёрла бы метку на время перехода.
   Второй scope — карточка пресета: туда ведут замечания приёмки, на конкретный промт. */
#screen-kitgen .kg-field.kg-hit{outline:2px solid var(--acc-2);outline-offset:4px;
  border-radius:3px;animation:kg-hit 2.4s ease-out 1 forwards}
#screen-preset-editor .kg-hit{outline:2px solid var(--accent-2);outline-offset:3px;
  animation:kg-hit 2.4s ease-out 1 forwards}
@keyframes kg-hit{0%,60%{outline-color:var(--accent-2)}100%{outline-color:transparent}}
/* Мелкая служебная приписка у значения («сейчас отсюда», «31 полей», «необязательный»).
   `font-variant-numeric` — из слитого сюда второго объявления: цифры в приписках табличные. */
#screen-kitgen .kg-sub{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;
  color:var(--ash-2);text-transform:uppercase;margin-left:6px;font-variant-numeric:tabular-nums}
/* ── КНОПКА «i»: четыре вопроса у каждого поля.
   Раскрытие на CSS (:hover/:focus-within), без JS: попап живёт внутри поля и умирает вместе с
   ним при каждой перерисовке формы — обработчик пришлось бы вешать заново после каждого
   `renderForm`, а он тут срабатывает на всё (гейты, чипы, сохранение). ── */
/* ⚠ Селекторы держат ДВА экрана: конструктор и редактор пресета (плашка «Маркеры
   разреза»). Копии под второй scope НЕ заводим — она разъехалась бы с оригиналом на первой же
   правке попапа; `var(--acc, …)` подставляет общий акцент там, где локального алиаса нет. */
#screen-kitgen .kg-i,#screen-preset-editor .kg-i{position:relative;display:inline-flex;align-items:center;
  justify-content:center;width:16px;height:16px;margin-left:7px;border-radius:50%;
  border:1px solid var(--hair-hi);background:rgba(255,255,255,.04);
  font-family:var(--mono);font-size:10.5px;font-weight:700;
  font-style:italic;color:var(--ash);cursor:help;vertical-align:middle;transition:.12s;
  text-transform:none;letter-spacing:0}
#screen-kitgen .kg-i:hover,#screen-kitgen .kg-i:focus,
#screen-preset-editor .kg-i:hover,#screen-preset-editor .kg-i:focus{color:var(--bone);
  border-color:var(--acc,var(--accent));
  background:rgba(var(--acc-rgb,var(--accent-rgb)),.12);outline:none}
#screen-kitgen .kg-ipop,#screen-preset-editor .kg-ipop{position:absolute;left:50%;top:calc(100% + 8px);transform:translateX(-50%);
  z-index:60;width:340px;max-width:78vw;padding:11px 13px;background:var(--void);
  border:1px solid var(--hair-hi);border-radius:8px;box-shadow:0 14px 40px rgba(0,0,0,.6);
  display:none;text-align:left;cursor:auto;
  /* Не влезает по высоте — скроллим ВНУТРИ, а не обрезаемся краем экрана (у `.main` overflow:hidden,
     у `.screen` свой скролл; попап нижних плиток резало именно ими). Точную координату, прижим к
     рабочей области и переворот вверх считает `InfoPop` в core.js — CSS этого не умеет: здешние
     left/top живут только до первого наведения, дальше их перебивают инлайновые fixed-координаты. */
  max-height:min(70vh,560px);overflow:auto;overscroll-behavior:contain;
  /* Шрифт задаём ЯВНО: `inherit` брал моно у заголовка плитки, и попап читался кодом. Переменной
     `--sans` в проекте нет — UI-шрифт называется `--ui` (строка 36). */
  font-family:var(--ui);font-style:normal;font-weight:400;letter-spacing:0}
#screen-kitgen .kg-i:hover .kg-ipop,#screen-kitgen .kg-i:focus .kg-ipop,
#screen-preset-editor .kg-i:hover .kg-ipop,#screen-preset-editor .kg-i:focus .kg-ipop{display:block}
#screen-kitgen .kg-ipop b,#screen-preset-editor .kg-ipop b{display:block;font-family:var(--mono);font-size:9.5px;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ash-2);font-weight:700;margin-top:8px}
#screen-kitgen .kg-ipop b:first-child,#screen-preset-editor .kg-ipop b:first-child{margin-top:0}
#screen-kitgen .kg-ipop span,#screen-preset-editor .kg-ipop span{display:block;font-size:12.75px;line-height:1.5;color:var(--ash);
  margin-top:2px}
/* Расшифровка терминов завода — последним блоком подсказки. Отбита рамкой слева, как «чем
   закрыть пустое поле»: это справка о справке, а не пятый ответ на вопрос о поле. */
#screen-kitgen .kg-ipop .kg-term{margin-top:6px;padding-left:9px;color:var(--ash-1);
  border-left:2px solid var(--hair-b);font-size:12.25px}
#screen-kitgen .kg-ipop .kg-term i{font-style:normal;color:var(--bone)}
/* ⚠ Прижима второй колонки к правому краю (`nth-child(even)`) здесь БОЛЬШЕ НЕТ: он лечил только
   правую половину анкеты, а левая точно так же уходила под меню. Оба края теперь считает
   `InfoPop` (core.js) по реальной ширине попапа и границам `.main`. */
/* Подсказка «чем закрыть пустое поле»: живёт только у пустого — у заполненного это шум. */
#screen-kitgen .kg-fneed{font-size:12.25px;color:var(--ash-2);line-height:1.45;margin-top:5px;
  padding-left:9px;border-left:2px solid var(--hair-b)}
/* «Отвечаете вы» — не тревога, а адресат: синий, тот же, что у капсулы уровня `.kg-badge.man`.
   Янтарь тут спорил бы с дыркой, у которой смысл другой — «в пресете будет пусто». */
#screen-kitgen .kg-fneed.man{border-left-color:rgba(var(--acc-rgb),.55);color:var(--ash-1)}
#screen-kitgen .kg-fneed.no{border-left-color:rgba(var(--green-rgb),.4);color:var(--ash-1)}
/* Чипы готовых значений — та же идиома, что `.pa-chip` в редакторе пресета. Своих форм не
   заводим: у оператора один жест на всё приложение. */
/* Чипы готовых значений. `margin-bottom` — из слитого сюда второго объявления: чипы артефактов
   отбиваются снизу от того, что под ними. */
#screen-kitgen .kg-chips{display:flex;flex-wrap:wrap;align-items:center;gap:6px;
  margin-top:6px;margin-bottom:8px}
#screen-kitgen .kg-chips.prof{margin:0 0 12px}
#screen-kitgen .kg-chiplbl{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash-2);flex:none;margin-right:2px}
#screen-kitgen .kg-chip{padding:3px 10px;border:1px solid var(--hair-b);border-radius:6px;
  background:rgba(7,8,10,.5);color:var(--ash-1);font-size:12.25px;cursor:pointer;
  transition:.12s;white-space:nowrap}
#screen-kitgen .kg-chip:hover{border-color:var(--hair-hi);color:var(--bone)}
#screen-kitgen .kg-chip.on{border-color:rgba(var(--accent-rgb),.5);
  background:rgba(var(--accent-rgb),.09);color:var(--bone)}
/* Группа полей одной строкой (хронометраж: цель и норма — три числа из ОДНОЙ метки ДНК). */
/* Отбивку группы задаёт лестница полей (`.kg-fields > *`) — своего `margin-bottom` тут быть не
   должно, иначе под группой воздуха вдвое больше, чем под соседним полем. */
#screen-kitgen .kg-group{grid-column:1/-1;margin-bottom:0}
#screen-kitgen .kg-group .kg-grow{display:flex;gap:10px}
#screen-kitgen .kg-group .kg-grow .kg-field{flex:1;min-width:0}
#screen-kitgen .kg-group .kg-grow .inp-lbl>span:first-child{font-size:0}
#screen-kitgen .kg-group .kg-grow .kg-fhint,
#screen-kitgen .kg-group .kg-grow .kg-fneed{display:none}
#screen-kitgen .kg-cnt.hole{color:var(--warn);border-color:rgba(var(--amber-rgb),.5);
  background:rgba(var(--amber-rgb),.07)}
#screen-kitgen .kg-donors{display:flex;flex-wrap:wrap;gap:6px 14px;margin-bottom:12px;
  padding:10px 14px 10px 16px;border:1px solid var(--hair-b);border-radius:6px;
  box-shadow:inset 3px 0 0 var(--acc);background:var(--plate-2);font-size:13px;color:var(--ash)}
#screen-kitgen .kg-donors.multi{border-color:rgba(var(--amber-rgb),.5);
  box-shadow:inset 3px 0 0 var(--warn)}
#screen-kitgen .kg-donor b{color:var(--bone);font-weight:500}
#screen-kitgen .kg-notes{background:var(--plate-2);border:1px solid rgba(var(--amber-rgb),.28);
  border-radius:6px;box-shadow:inset 3px 0 0 var(--warn);padding:10px 14px 10px 16px;
  margin-bottom:14px;font-size:13.5px;color:var(--warn);line-height:1.6}
#screen-kitgen .kg-chk{display:inline-flex;gap:7px;align-items:center;font-size:14.5px;
  color:var(--ash);cursor:pointer;padding:3px 0}
/* ── ДА/НЕТ ──
   Два переключателя в строку вместо одной галочки: у галочки видно только состояние «да»,
   а «нет» неотличимо от «сюда ещё не дошли». Выбранный подсвечивается сам, через `:checked`,
   а не классом от JS: значение поля меняется и без перерисовки формы (`markEdited`), и класс
   разошёлся бы с настоящим состоянием переключателя. */
#screen-kitgen .kg-yn{display:flex;gap:8px;align-items:center}
#screen-kitgen .kg-yn-o{display:inline-flex;gap:7px;align-items:center;font-size:14px;
  color:var(--ash-2);cursor:pointer;padding:6px 13px;border:1px solid var(--hair-b);
  border-radius:6px;background:var(--plate);transition:color .12s,border-color .12s}
#screen-kitgen .kg-yn-o:hover{border-color:var(--hair-hi);color:var(--ash)}
#screen-kitgen .kg-yn-o:has(input:checked){border-color:rgba(var(--acc-rgb),.55);
  background:rgba(var(--acc-rgb),.1);color:var(--bone)}
#screen-kitgen .kg-yn-o input:disabled{cursor:default}
#screen-kitgen .kg-yn-o:has(input:disabled){cursor:default;opacity:.65}
/* Своё значение поля выбора: строка под селектом. Акцентная полоса слева — то же, чем размечены
   гнёзда-«дырки»: видно, что значение не из меню и его ещё надо расшифровать полем ниже. */
#screen-kitgen .kg-own{margin-top:6px;box-shadow:inset 3px 0 0 rgba(var(--accent-rgb),.55)}
#screen-kitgen .kg-multi{display:flex;flex-direction:column;gap:2px;border:1px solid var(--hair-b);
  border-radius:6px;background:var(--plate);padding:8px 12px}
/* ПОЛЕ-ТАБЛИЦА ВО ВСЮ ШИРИНУ СЕТКИ. Анкета двухколоночная, и карта глав в половине ширины
   давала четыре ячейки по паре слов: «чем заканчивается» — самая длинная запись строки
   (23.08.2026 туда переехала концовка каждой главы), и вписать её было физически некуда.
   Правило — и в модалке «Вся анкета» (`.kg-ov`), там та же сетка `1fr 1fr`. */
:is(#screen-kitgen,.kg-ov) .kg-field.wide{grid-column:1/-1}
#screen-kitgen .kg-table{display:flex;flex-direction:column;gap:6px}
#screen-kitgen .kg-tr{display:flex;flex-direction:column;gap:4px}
#screen-kitgen .kg-trow{display:grid;grid-template-columns:22px 1fr 1.9fr .5fr 2.2fr 20px;gap:6px;
  align-items:center}
#screen-kitgen .kg-trow .inp{font-size:13.5px;padding:6px 9px}
/* Ориентиры ячейки: скрыты, пока курсор не в ней. Всегда видимые пять чипов на каждой из восьми
   глав — сорок кнопок вместо карты; ряд поднимается на фокусе и уходит по уходу из ячейки. */
#screen-kitgen .kg-tchips{display:none}
#screen-kitgen .kg-tchips.on{display:flex;flex-wrap:wrap;align-items:center;gap:6px;
  margin:0 0 4px 28px}
#screen-kitgen .kg-tchips .kg-chip{font-size:11.75px;padding:2px 8px}
#screen-kitgen .kg-tn{font-family:var(--mono);font-size:12px;color:var(--ash-2);
  font-variant-numeric:tabular-nums}
/* Крестик строки — в потоке, а не поверх картинки, как базовый `.kg-x`. Видимость приглушена и
   поднимается на наведении: убрать строку нужно редко, а мозолить глаза в каждой строке нечему. */
:is(#screen-kitgen,#screen-library) .kg-trow .kg-x{position:static;background:none;padding:0;text-align:center;
  font-size:12px;line-height:1.6;color:var(--ash-2);opacity:.55;transition:.14s}
/* Клавиатура видит то же, что мышь: приглушение снимается и по `:focus-visible`, иначе дойти до
   крестика табом можно, а понять, что дошёл, — нет. Тот же уговор, что у `.kg-libx` в библиотеке. */
:is(#screen-kitgen,#screen-library) .kg-trow:hover .kg-x,
:is(#screen-kitgen,#screen-library) .kg-trow .kg-x:focus-visible{opacity:1}
/* Пустая строка помечена номером: она в анкете есть, но в пресет не поедет и главой не считается. */
#screen-kitgen .kg-trow.blank .kg-tn{color:var(--warn)}

/* ── блок-сообщение: статус ПОЛОСОЙ СЛЕВА, а не крашеной рамкой по кругу ── */
:is(#screen-kitgen,#screen-library) .kg-block{border:1px solid var(--hair-b);border-radius:6px;background:var(--plate);
  padding:12px 15px 12px 17px;margin-bottom:10px;font-size:14px;color:var(--ash);line-height:1.6}
:is(#screen-kitgen,#screen-library) .kg-block b{color:var(--bone)}
:is(#screen-kitgen,#screen-library) .kg-block ul{margin:7px 0 0;padding-left:20px}
:is(#screen-kitgen,#screen-library) .kg-block.bad{box-shadow:inset 3px 0 0 var(--bad);
  border-color:rgba(var(--err-rgb),.24);background:rgba(var(--err-rgb),.05)}
:is(#screen-kitgen,#screen-library) .kg-block.warn{box-shadow:inset 3px 0 0 var(--warn);
  border-color:rgba(var(--amber-rgb),.26);background:rgba(var(--amber-rgb),.05)}
:is(#screen-kitgen,#screen-library) .kg-block.ok{box-shadow:inset 3px 0 0 var(--ok-2);
  border-color:rgba(var(--green-rgb),.24);background:rgba(var(--green-rgb),.05)}
:is(#screen-kitgen,#screen-library) .kg-block a{color:var(--acc-2);cursor:pointer;text-decoration:underline}

/* ── выборочное применение ДНК (в оверлее) ── */
#screen-kitgen .kg-pbrow,.kg-ov .kg-pbrow{display:block;border:1px solid var(--hair-b);
  border-radius:6px;background:var(--plate-2);padding:10px 14px;font-size:14px;color:var(--ash);
  cursor:pointer;margin-bottom:9px;transition:.14s}
#screen-kitgen .kg-pbrow:hover,.kg-ov .kg-pbrow:hover{border-color:var(--hair-hi)}
#screen-kitgen .kg-pbrow.off,.kg-ov .kg-pbrow.off{opacity:.45;cursor:default}
#screen-kitgen .kg-pbrow.off:hover,.kg-ov .kg-pbrow.off:hover{border-color:var(--hair-b)}
#screen-kitgen .kg-pbrow b,.kg-ov .kg-pbrow b{color:var(--bone);font-weight:500}
:is(#screen-kitgen,#screen-library) .kg-pbrow .kg-hint,.kg-ov .kg-pbrow .kg-hint{margin:3px 0 0 22px;display:block}
.kg-ov .kg-fields{display:grid;grid-template-columns:1fr 1fr;gap:0 20px}
.kg-ov .kg-note{font-size:13.5px;color:var(--ash);line-height:1.6;margin:0 0 14px;
  border-left:2px solid var(--hair-hi);padding-left:11px}
.kg-ov .kg-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:10px}
.kg-ov .kg-hint{font-size:13px;color:var(--ash-2);line-height:1.5}
.kg-ov .kg-englbl{font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ash-2)}
@media(max-width:900px){.kg-ov .kg-fields{grid-template-columns:1fr}}


@media(max-width:1100px){
  #screen-kitgen .kg-fields,#screen-kitgen .kg-2col{grid-template-columns:1fr}
  /* Узко: поля строки друг под другом в одной колонке, номер и крестик — по краям первой
     строки. Без явных колонок поля разъезжались по 18-пиксельной колонке номера. */
  #screen-kitgen .kg-trow{grid-template-columns:18px 1fr 18px;align-items:start}
  #screen-kitgen .kg-trow .inp{grid-column:2}
  :is(#screen-kitgen,#screen-library) .kg-trow .kg-x{grid-column:3;grid-row:1}
}

/* ПОЛНОЭКРАННАЯ ОБОЛОЧКА — ОБЩАЯ, а не только для конструктора (05.08.2026 селекторы
   с `#kg-ov` обобщены до класса). Ею пользуются: просмотр артефактов ДНК (каталог — сотни строк,
   описание — простыня, превью — марка 132px) и правка длинных полей на «Идеях» во весь экран.
   Префикс `kg-` исторический: переименовывать разметку двух работающих экранов дороже, чем
   объяснить это здесь. */
.kg-ov{position:fixed;inset:0;z-index:400;background:rgba(4,4,5,.86);display:flex;
  align-items:center;justify-content:center;padding:32px;backdrop-filter:blur(3px)}
.kg-ov .kg-ov-bx{background:var(--plate);border:1px solid var(--hair-b);border-radius:var(--cut);
  box-shadow:0 22px 50px -18px rgba(0,0,0,.85);max-width:1180px;
  width:100%;max-height:100%;display:flex;flex-direction:column}
.kg-ov .kg-ov-hd{display:flex;gap:14px;align-items:baseline;padding:15px 18px;
  border-bottom:1px solid var(--hair)}
.kg-ov .kg-ov-t{font-size:18px;font-weight:700;color:var(--bone)}
.kg-ov .kg-ov-sub{font-family:var(--mono);font-size:12.5px;color:var(--ash-2);
  font-variant-numeric:tabular-nums}
.kg-ov .kg-ov-hd .btn{margin-left:auto}
.kg-ov .kg-ov-bd{overflow:auto;padding:18px;min-height:0}
.kg-ov .kg-ov-pre{max-height:none;border:0;background:none;padding:0;color:var(--bone);font-size:14px}
.kg-ov .kg-pre{background:var(--plate-2);border:1px solid var(--hair);border-radius:6px;padding:14px;
  font-family:var(--mono);font-size:13px;line-height:1.62;white-space:pre-wrap;word-break:break-word;
  overflow:auto;color:var(--ash)}
/* ── ЖУРНАЛ ПРОГОНОВ (#fx-ov, 16.08.2026): «прошлые прогоны вот этого» ──
   Живёт в общем оверлее `.kg-ov` — второй модалки в продукте не заводим (то же правило, по
   которому в нём же открываются темы и правка поля во весь экран). Строки СВЁРНУТЫ: список
   читают, чтобы выбрать прогон, а не чтобы прочесть все сразу — и `result` одного брифа
   развернул бы страницу на экран текста ещё до того, как его попросили. ── */
.kg-ov .fx-rows{display:flex;flex-direction:column;gap:8px}
.kg-ov .fx-row{border:1px solid var(--hair-b);border-radius:6px;background:var(--plate-2);
  overflow:hidden;transition:.14s}
.kg-ov .fx-row.on{border-color:var(--hair-hi)}
.kg-ov .fx-hd{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;
  font-size:12.5px;color:var(--ash)}
.kg-ov .fx-hd:hover{background:var(--plate)}
.kg-ov .fx-car{color:var(--ash-2);font-size:11px;width:10px;flex:none}
.kg-ov .fx-when{color:var(--ash-2);white-space:nowrap;flex:none}
/* Причина отказа в свёрнутой строке: единственный элемент шапки, которому разрешено сжиматься —
   номер, исход и время обязаны читаться целиком, а причина честнее обрезается многоточием. */
.kg-ov .fx-why{color:var(--err-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  flex:1 1 auto;min-width:0}
.kg-ov .fx-eng{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--ash-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:40%;flex:none}
.kg-ov .fx-body{border-top:1px solid var(--hair);padding:12px}
.kg-ov .fx-sect{display:flex;align-items:center;gap:10px;margin:0 0 8px;font-family:var(--mono);
  font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ash-2)}
.kg-ov .fx-body .fx-sect:not(:first-child){margin-top:16px}
.kg-ov .fx-err{border:1px solid var(--hair-b);border-radius:6px;background:var(--plate);
  box-shadow:inset 3px 0 0 var(--err-2);padding:10px 12px;font-size:12.5px;color:var(--ash);
  margin-bottom:12px}
.kg-ov .fx-load{font-size:12.5px;color:var(--ash-2);padding:8px 2px;line-height:1.6}
.kg-ov .fx-pre{background:var(--void);border:1px solid var(--hair);border-radius:6px;padding:12px;
  font-family:var(--mono);font-size:12px;line-height:1.6;white-space:pre-wrap;word-break:break-word;
  max-height:46vh;overflow:auto;color:var(--ash);margin:0}
.kg-ov .fx-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;
  font-size:12.5px;color:var(--ash)}
.kg-ov .fx-kv{display:flex;flex-direction:column;gap:6px;font-size:12.5px}
.kg-ov .fx-kv>div{display:flex;gap:10px;align-items:baseline}
.kg-ov .fx-kv b{font-family:var(--mono);font-size:11px;letter-spacing:.05em;color:var(--ash-2);
  flex:none;min-width:110px}
.kg-ov .fx-kv span{color:var(--ash);word-break:break-word;min-width:0}

.kg-ov.img .kg-ov-bd{display:flex;align-items:center;justify-content:center;background:var(--void)}
.kg-ov .kg-ov-img{max-width:100%;max-height:78vh;object-fit:contain;display:block;border-radius:6px}
/* Правка поля во весь экран: само поле ПЕРЕЕЗЖАЕТ сюда, поэтому растягиваем его на всю
   высоту тела и снимаем ручной ресайз — тянуть больше нечего.
   Коробке нужна ЯВНАЯ высота: `max-height` её не задаёт, и тело оставалось по содержимому —
   textarea приезжала в две строки посреди пустого экрана. */
.kg-ov.edit .kg-ov-bx{height:100%}
.kg-ov.edit .kg-ov-bd{display:flex;flex:1;padding:0;min-height:0}
.kg-ov.edit .kg-ov-bd textarea{flex:1;width:100%;border:0;background:none;resize:none;
  padding:18px 20px;font-size:15px;line-height:1.65;min-height:0}
.kg-ov.edit .kg-ov-bd textarea:focus{outline:none;box-shadow:none}
.kg-ov .kg-ov-cnt{font-family:var(--mono);font-size:12px;color:var(--ash-2);margin-left:auto;
  font-variant-numeric:tabular-nums}
.kg-ov .kg-ov-cnt + .btn{margin-left:14px}
.kg-ov .kg-toplist{display:flex;flex-direction:column;gap:2px}
.kg-ov .kg-toprow{display:flex;gap:14px;align-items:baseline;width:100%;text-align:left;
  background:none;border:0;border-bottom:1px solid var(--hair);border-radius:6px;color:var(--ash);
  padding:9px 10px;cursor:pointer;font-family:var(--ui);font-size:14.5px;transition:.12s}
.kg-ov .kg-toprow:hover{background:var(--plate-2);color:var(--bone)}
.kg-ov .kg-topv{font-family:var(--mono);font-size:13px;color:var(--accent-2);min-width:78px;
  text-align:right;font-variant-numeric:tabular-nums}
.kg-ov .kg-topd{font-family:var(--mono);font-size:12.5px;color:var(--ash-2);min-width:52px;
  font-variant-numeric:tabular-nums}
.kg-ov .kg-topt{flex:1}

/* ── движки: метка + список на шаг ── */
#screen-kitgen .kg-engrows{display:grid;grid-template-columns:1fr 1fr;gap:10px 22px}
#screen-kitgen .kg-engrow{display:flex;gap:12px;align-items:center}
#screen-kitgen .kg-englbl{font-family:var(--mono);font-size:11.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash-2);min-width:150px;display:flex;gap:6px;align-items:center}
#screen-kitgen .kg-eye{font-size:11px;opacity:.75}
@media(max-width:1100px){#screen-kitgen .kg-engrows{grid-template-columns:1fr}}

/* ⚠ ОПИСАНИЯ РОЛИКОВ ОТСЮДА УЕХАЛИ — стили удалены 16.08.2026. Раздел «Стиль описания» снят
   15.08.2026: описания и обложки разбирает библиотека упаковки тройками (`backend/pack/`).
   Разметку с классами `.kg-desctiles`/`.kg-desctile`/`.kg-dt-*`/`.kg-descadd` и с полями правки
   в развороте (`.kg-ov-ti`/`.kg-ov-ta`/`.kg-ov-row`) после этого не печатал никто во всём `ui/`,
   а жили они ещё сорок строк — вместе с багом, который в мёртвом коде и нашёлся: крестик плитки
   стоял `opacity:0` и поднимался только по `:hover`, то есть с клавиатуры был невидим. Понадобится
   похожая плитка — берите её у библиотеки упаковки, а не воскрешайте эту. */

/* Транскрипты — ДВА СЛОТА: метод скелета это пересечение ДВУХ роликов, и форма обязана это
   выражать, а не позволять «накидать сколько получится» (тогда можно молча положить один и
   тот же ролик дважды, пересечения не будет, и скелет запомнит сюжет вместо формата). */
:is(#screen-kitgen,#screen-library) .kg-tr-slots{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:8px}
/* Отступ слева ОДИН для всех состояний (16px): полоса статуса рисуется inset-тенью поверх
   отступа, а не добавляет его — иначе слот дёргался на 2px в момент заполнения. */
:is(#screen-kitgen,#screen-library) .kg-tr-slot{border:1px solid var(--hair-b);border-radius:6px;background:var(--plate);
  padding:12px 14px 12px 16px;transition:.14s}
:is(#screen-kitgen,#screen-library) .kg-tr-slot.full{box-shadow:inset 3px 0 0 var(--ok-2)}
:is(#screen-kitgen,#screen-library) .kg-tr-slot.dirty{box-shadow:inset 3px 0 0 var(--warn)}
:is(#screen-kitgen,#screen-library) .kg-tr-slot.drop{border-color:var(--acc);background:var(--accent-dim);
  box-shadow:inset 0 0 24px rgba(var(--acc-rgb),.12)}
:is(#screen-kitgen,#screen-library) .kg-tr-hd{display:flex;gap:10px;align-items:baseline;margin-bottom:8px;
  font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--ash)}
/* Пять правил ниже забыли расширить на библиотеку вместе с остальным блоком, когда разборы
   переехали из конструктора (16.08.2026): слот там рисовался, а имя файла, поле и зона вставки
   оставались стандартными. Заметно стало, когда панель разбора уехала в модалку. */
:is(#screen-kitgen,#screen-library) .kg-tr-n{font-size:11.5px;letter-spacing:.03em;text-transform:none;color:var(--ok-2);
  font-variant-numeric:tabular-nums}
:is(#screen-kitgen,#screen-library) .kg-tr-n.dim{color:var(--ash-2)}
:is(#screen-kitgen,#screen-library) .kg-tr-hd .kg-x{position:static;background:none;margin-left:auto;padding:0}
:is(#screen-kitgen,#screen-library) .kg-tr-ta{font-family:var(--mono);font-size:12.5px;line-height:1.55;resize:vertical}
/* Вставка скриншота из буфера: зона выбирается кликом, дальше работает обычный Ctrl+V. */
:is(#screen-kitgen,#screen-library) .kg-paste{background:none;border:1px dashed var(--hair-b);border-radius:6px;
  color:var(--ash-2);font-family:var(--mono);font-size:12px;padding:7px 13px;cursor:pointer;
  transition:.14s}
:is(#screen-kitgen,#screen-library) .kg-paste:hover{border-color:var(--hair-hi);color:var(--ash)}
:is(#screen-kitgen,#screen-library) .kg-paste.on{border-color:var(--acc);border-style:solid;color:var(--acc-2);
  background:rgba(var(--acc-rgb),.08);box-shadow:0 0 10px rgba(var(--acc-rgb),.2)}
@media(max-width:1100px){:is(#screen-kitgen,#screen-library) .kg-tr-slots{grid-template-columns:1fr}}

/* ═══ БИБЛИОТЕКА КАНОНА (#screen-library) ═══════════════════════════════════
   Персонажи и локации между прогонами. Два состояния экрана, не одно:
   ВИТРИНА (бенто из всех референсов вкладки) → клик → КАРТОЧКА одной сущности,
   где картинка занимает треть ширины, а остальное — поля канона.
   Ростер-колонку 262px убрали 08.08.2026: библиотеку смотрят по картинкам, а в
   такую колонку референс влезал только аватаркой 38px. */
/* Локальные псевдонимы акцента — как у #screen-ideas/#screen-kitgen. Без них var(--acc)
   в этом блоке не разрешался вообще (в :root токены зовутся --accent*), и подчёркивание
   активной вкладки, рамка выбранной плитки и чипы стиля молча оставались бесцветными. */
#screen-library{--acc:var(--accent);--acc-2:var(--accent-2);--acc-rgb:var(--accent-rgb)}
#screen-library .lib-hd{display:flex;align-items:flex-start;gap:18px;margin-bottom:16px}
#screen-library .lib-hd-act{margin-left:auto;display:flex;gap:8px;align-items:center;flex:0 0 auto}
#screen-library .lib-tabs{display:flex;gap:8px;margin-bottom:14px;border-bottom:1px solid var(--hair)}
#screen-library .lib-tab{background:none;border:0;border-bottom:2px solid transparent;color:var(--ash-2);
  font-size:14.5px;padding:9px 14px;cursor:pointer;transition:.14s}
#screen-library .lib-tab:hover{color:var(--bone)}
#screen-library .lib-tab.active{color:var(--acc-2);border-bottom-color:var(--acc)}
#screen-library .lib-tab span{font-family:var(--mono);font-size:12px;color:var(--ash-2)}
/* ── РАЗБОРЫ ЧУЖИХ КАНАЛОВ: «Скелет формата» и «Стиль видеоряда» (16.08.2026, `DNALIB`) ──
   Витрина ЧИТАЕТСЯ, а не правится: карточка канала — выбор, работа с выбранным открывается
   модалкой поверх (`#dl-pv`, ниже). Своих цветов и форм не заводим — токены и идиомы те же,
   что у канона рядом. */
#screen-library .lib-body.dl{display:block}
#screen-library .dl-head{margin-bottom:16px}
#screen-library .dl-h-t{font-family:var(--mono);font-size:13px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--bone);margin-bottom:6px}
#screen-library .dl-h-s{font-size:14.5px;color:var(--ash);line-height:1.55;max-width:78ch}
#screen-library .dl-h-n{font-size:13px;color:var(--ash-2);line-height:1.5;margin-top:6px;
  padding-left:11px;border-left:2px solid var(--hair-b);max-width:78ch}
/* Плитки ряда — ОДНОЙ ВЫСОТЫ (`stretch`, а не `start`): без ссылки на канал карточка была на
   строку ниже соседних, и ряд бенто вставал ступенькой. Растяжка чинит это заодно и для длинного
   названия в две строки — то есть по причине, а не по симптому. */
#screen-library .dl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));
  gap:10px;align-items:stretch;margin-bottom:16px}
#screen-library .dl-card{position:relative;display:flex;flex-direction:column;gap:3px;width:100%;
  height:100%;text-align:left;
  background:var(--plate);border:1px solid var(--hair);border-radius:10px;padding:12px 14px;
  cursor:pointer;transition:.14s;font-family:var(--ui)}
/* Крестик — в углу плитки, ВИДИМЫЙ ВСЕГДА, а не по наведению: скрытый до `:hover` он недоступен
   с клавиатуры и не находится на тач-экране (ровно этот баг уже ловили у снятой плитки разбора).
   Приглушён до наведения — удаление не должно спорить за внимание с самой карточкой. */
#screen-library .dl-x{position:absolute;top:6px;right:7px;z-index:2;width:20px;height:20px;
  display:flex;align-items:center;justify-content:center;border-radius:5px;
  background:rgba(4,4,5,.62);color:var(--ash-2);font-size:11px;line-height:1;cursor:pointer;
  transition:.12s}
#screen-library .dl-x:hover{background:rgba(var(--err-rgb),.22);color:var(--err-2)}
/* Строка ссылки печатается всегда, у разбора без ссылки — пустой: место под неё держится, и
   текст в соседних плитках стоит на одной высоте. */
#screen-library .dl-c-u:empty{min-height:1em}
#screen-library .dl-card:hover{border-color:var(--acc);background:var(--accent-dim)}
#screen-library .dl-card.on{border-color:var(--acc);box-shadow:inset 3px 0 0 var(--acc)}
#screen-library .dl-c-t{font-size:15px;color:var(--bone);line-height:1.35;word-break:break-word}
#screen-library .dl-c-m{font-family:var(--mono);font-size:11.5px;color:var(--ash-2);
  font-variant-numeric:tabular-nums}
#screen-library .dl-c-u{font-family:var(--mono);font-size:11px;color:var(--ash-2);opacity:.7;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* ── ВИД КАДРА: сцена / смешанная / схема ──
   Переключатель под самим кадром, шириной ровно в него: вид — свойство ЭТОЙ картинки, и общий
   список видов где-то сбоку заставлял бы сверять «какой кадр сейчас настраиваю». Три кнопки в
   ряд, а не выпадашка: вариантов три, они не меняются, и выпадашка тут стоила бы двух кликов
   вместо одного. */
#screen-library .dl-fr{display:flex;flex-direction:column;gap:4px}
/* Ширина ряда — АВТОМАТИЧЕСКАЯ, а не числом. Здесь стояло `width:132px` — копия тогдашнего
   размера плитки, и стоило плитке подрасти, как ряд кнопок остался узким, а подписи в нём
   продолжили обрезаться. `.dl-fr` — колоночный флекс, дети растягиваются по его ширине, а её
   задаёт самый широкий ребёнок, то есть сам кадр. Ряд теперь идёт за плиткой сам. */
#screen-library .dl-fr-k{display:grid;grid-template-columns:repeat(3,1fr);gap:2px;width:auto}
#screen-library .dl-k{font-family:var(--mono);font-size:10px;letter-spacing:.04em;padding:3px 2px;
  border:1px solid var(--hair-b);border-radius:4px;background:var(--plate);color:var(--ash-2);
  cursor:pointer;transition:.12s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#screen-library .dl-k:hover{border-color:var(--hair-hi);color:var(--bone)}
#screen-library .dl-k.on{border-color:var(--acc);background:var(--accent-dim);color:var(--bone)}

/* ── ПОЛОСКА КАДРОВ («Стиль видеоряда») ──
   Карточка стиля ведёт КАРТИНКОЙ, а не подписью: на этой витрине ищут манеру рисунка, и название
   канала на вопрос «тот ли это стиль» не отвечает. Полоска идёт первой в карточке, во всю её
   ширину и без внутренних отступов — четыре кадра встык читаются как один образец видеоряда,
   а не как четыре мелкие иконки. Пропорция 16:9 — та же, что у кадра ролика. */
#screen-library .dl-card.pic{padding-top:0;overflow:hidden}
/* Высота полосы ФИКСИРОВАНА, а не выведена из пропорции кадра: число колонок зависит от того,
   сколько кадров у разбора (их ставит JS), и при пропорции полоса из двух кадров была бы вдвое
   выше полосы из четырёх — карточки в ряду встали бы разной высоты. `cover` кадрирует. */
/* ⚠ ГЕОМЕТРИЮ ПОЛОСКИ ЗАДАЁТ МЕСТО ПОКАЗА, через свойства, а не переопределением этого правила:
   `:is(#screen-library,.kg-ov)` берёт специфичность самого сильного аргумента, то есть id, и
   перебить его из контекста (`.kg-ov .kg-srcp-pic .dl-strip` — три класса) НЕЛЬЗЯ. Именно на этом
   диалог «Откуда взять „Стиль видеоряда"» получал полоску 74px с вылетом на 14px за колонку
   вместо своих 54px без вылета — правило писалось, но молча не работало. */
:is(#screen-library,.kg-ov) .dl-strip{display:grid;gap:1px;
  grid-template-columns:repeat(var(--dl-cols,4),var(--dl-w,1fr));
  height:var(--dl-h,74px);margin:var(--dl-m,0 -14px 8px);
  background:var(--hair-b);position:relative}
:is(#screen-library,.kg-ov) .dl-strip img{width:100%;height:100%;object-fit:cover;display:block;
  background:var(--plate-2)}
/* Кадров больше, чем влезло: число — справкой поверх последнего, а не пятой плиткой. */
:is(#screen-library,.kg-ov) .dl-more{position:absolute;right:5px;bottom:5px;font-family:var(--mono);
  font-size:11px;color:var(--bone);background:rgba(4,4,5,.72);border-radius:4px;padding:1px 6px;
  font-variant-numeric:tabular-nums}
/* Кадров нет — честная строка на месте полоски, а не пустота: «нечего показать» это тоже ответ,
   и он объясняет, почему карточка выглядит иначе, чем соседние. */
:is(#screen-library,.kg-ov) .dl-strip.none{display:flex;align-items:center;justify-content:center;
  background:none;border-bottom:1px solid var(--hair);font-family:var(--mono);font-size:11px;
  color:var(--ash-2);text-align:center;text-transform:uppercase;letter-spacing:.08em}
/* ── КАРТИНКА НЕ ЗАГРУЗИЛАСЬ (`ui/imgx.js`) ──
   Заглушка встаёт НА МЕСТО картинки (та скрыта) и размеры берёт у места показа: в полоске это
   ячейка сетки, в бенто — блок с пропорцией, в сетке разбора — плитка 132×74. Своих размеров не
   задаём: ряд не должен ехать ровно там, где и без того что-то пошло не так.
   ⚠ Правило БЕЗ префикса экрана намеренно: заглушка нужна и в витрине, и в диалоге конструктора
   (`.kg-ov`), и в пикере, который живёт в `body`, а не внутри экрана.
   ⚠ Появляется ТОЛЬКО при обрыве связи. Удалённый файл (404) прячется молча — различает их
   `IMGX.fail` одним HEAD-запросом, см. `ui/imgx.js`. */
.imgx-fail{display:flex;align-items:center;justify-content:center;width:100%;height:100%;
  box-sizing:border-box;padding:0 6px;text-align:center;cursor:pointer;
  font-family:var(--mono);font-size:10px;line-height:1.25;letter-spacing:.04em;
  color:var(--ash-2);background:var(--plate-2);border:1px dashed var(--hair-b);border-radius:4px}
.imgx-fail:hover{color:var(--bone);border-color:var(--hair-hi)}
/* Пикер даёт картинке жёсткие 90×90 и не тянет детей — заглушке размер приходится назвать. */
.lib-pick-v .imgx-fail{width:90px;height:90px;flex:none}
/* ── ПАНЕЛЬ РАЗБОРА — МОДАЛКА (#dl-pv) ──
   Высота КОРОБА фиксирована во весь экран (идиома `#it-ov`), а не подогнана под содержимое:
   панель перерисовывается на каждое действие — загрузили кадр, сохранился транскрипт, пришёл
   опрос идущего разбора, — и коробка, растущая вместе с содержимым, прыгала бы под курсором
   каждые две с половиной секунды. Прокрутка внутри тела, оно же держит позицию при перерисовке. */
#screen-library #dl-pv .kg-ov-bx{height:100%}
#screen-library #dl-pv .kg-ov-bd{flex:1;min-height:0}
/* Кадры В ПАНЕЛИ РАЗБОРА крупнее общих 132×74 (`:is(#screen-kitgen,#screen-library) .kg-img`):
   здесь кадр РАЗГЛЯДЫВАЮТ — вопрос вкладки «Стиль видеоряда» в манере рисунка, а не в том,
   какой это кадр, — и на миниатюре размером с ноготь манера не читается. Клик открывает полный
   размер (`DNALIB.zoom`), но до клика должно быть видно, что открывать.
   ⚠ Только в библиотеке: у конструктора та же плитка остаётся 132×74 — там кадры ОПОЗНАЮТ
   в длинном списке артефактов, и ряд из крупных увёл бы форму на два экрана вниз.
   ⚠ Двух id (`#screen-library #dl-pv`) хватает, чтобы перебить `:is(...)`: тот берёт
   специфичность сильнейшего аргумента, то есть ОДНОГО id (см. предупреждение у `.dl-strip`). */
#screen-library #dl-pv .kg-img{width:176px;height:99px}
/* Название канала в шапке модалки честно обрезается: длинное имя не имеет права оттеснить
   «Закрыть» за край короба. */
#screen-library #dl-pv .kg-ov-t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  max-width:52%;flex:0 1 auto}
#screen-library #dl-pv .kg-ov-sub{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  min-width:0}
/* Действия шапки — ОДНОЙ группой справа. `margin-left:auto` живёт на группе, а не на каждой
   кнопке (общее правило `.kg-ov .kg-ov-hd .btn`): иначе вторая кнопка отъезжала бы от первой
   через весь короб. */
#screen-library #dl-pv .dl-hd-act{margin-left:auto;display:flex;gap:8px;align-items:center;
  flex:none}
#screen-library #dl-pv .dl-hd-act .btn{margin-left:0}
/* Подпись шага в строке движка не нужна: строка в панели раздела ровно одна, и её имя уже стоит
   в заголовке модалки и в заголовке вкладки. Освободившееся место уходит селекторам. */
#screen-library #dl-pv .kg-englbl{display:none}
/* Разделы рабочей панели: материал → прогон → результат. Шапка — та же mono-капс, что у плит
   конструктора; пояснение под ней обычным текстом, иначе капс-строка в три предложения нечитаема. */
#screen-library .dl-sect{border-top:1px solid var(--hair);padding:14px 0 0;margin-top:14px}
#screen-library .dl-sect:first-of-type{border-top:0;margin-top:0}
#screen-library .dl-s-h{font-family:var(--mono);font-size:12px;font-weight:700;letter-spacing:.09em;
  text-transform:uppercase;color:var(--bone);margin-bottom:10px;
  font-variant-numeric:tabular-nums}
#screen-library .dl-s-n{display:block;margin-top:5px;font-family:var(--ui);font-size:12.75px;
  font-weight:400;letter-spacing:0;text-transform:none;color:var(--ash-2);line-height:1.5;
  max-width:82ch}
#screen-library .dl-ok{color:var(--green-2);font-weight:400}
#screen-library .dl-card.dim .dl-c-t{color:var(--ash)}
#screen-library .dl-pre{background:var(--plate);border:1px solid var(--hair);border-radius:6px;
  padding:14px;font-family:var(--mono);font-size:12.5px;line-height:1.62;white-space:pre-wrap;
  word-break:break-word;max-height:560px;overflow:auto;color:var(--ash);margin:0}
#screen-library .dl-load{font-size:13.5px;color:var(--ash-2);
  line-height:1.5;padding:4px 0}
/* Имя и ссылка — В ОДНУ СТРОКУ, двумя равными колонками: это одна мысль «что за канал», и
   разнесённые по строкам поля читались бы как два разных раздела формы. Ярлык над полем —
   общий `.lib-lb` библиотеки, своего здесь нет. На узком окне колонки складываются в столбик:
   ссылка в поле шириной в ладонь не читается вовсе. */
#screen-library .dl-meta{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:10px}
/* ── «БЫЛО → СТАЛО» В ВОПРОСЕ ПРО НЕСОХРАНЁННОЕ ──
   ⚠ БЕЗ `#screen-library` В ГОЛОВЕ: диалог `uiConfirm` живёт в `<body>`, и правила экрана до него
   не достают (тот же случай, что у `.pk-card .lib-lb` ниже). Строка на поле: подпись — колонкой
   фиксированной ширины, чтобы стрелки у обеих строк стояли друг под другом; значения переносятся
   и рвутся по символам — ссылка на канал длиннее короба диалога и иначе распирала бы его. */
.dl-diff{display:flex;flex-direction:column;gap:8px}
/* 104px — по самой длинной подписи («Транскрипт 2»): в 78px она ломалась на две строки, и
   строка правки переставала читаться как строка. */
.dl-diff-r{display:grid;grid-template-columns:104px minmax(0,1fr) 14px minmax(0,1fr);gap:8px;
  align-items:baseline;font-size:14px}
.dl-diff-l{font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ash-2)}
.dl-diff-was{color:var(--ash-2);text-decoration:line-through;overflow-wrap:anywhere}
.dl-diff-ar{color:var(--ash-2);text-align:center}
.dl-diff-now{color:var(--bone);overflow-wrap:anywhere}
.dl-diff i{font-style:normal;color:var(--ash-2);opacity:.75}
@media(max-width:640px){#screen-library .dl-meta{grid-template-columns:1fr}}

/* ── витрина: бенто ──
   auto-fill + minmax: число колонок задаёт ширина окна, а не константа — на широком мониторе
   плитки не растягиваются в полотна, на узком не выпадают за край. */
#screen-library .lib-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(208px,1fr));
  gap:12px;align-items:start}
#screen-library .lib-tile{display:flex;flex-direction:column;width:100%;text-align:left;padding:0;
  overflow:hidden;position:relative;background:var(--plate);border:1px solid var(--hair);
  border-radius:12px;cursor:pointer;transition:.14s}
#screen-library .lib-tile:hover{border-color:var(--acc);background:var(--accent-dim)}
/* Плитка сущности с двумя и более карточками занимает две колонки: версии показываются рядом
   в натуральную величину, а не сжимаются до полосок. */
#screen-library .lib-tile.wide{grid-column:span 2}
@media(max-width:520px){#screen-library .lib-tile.wide{grid-column:span 1}}
#screen-library .lib-t-img{position:relative;display:flex;gap:2px;height:216px;background:var(--hair)}
#screen-library .lib-t-shot{position:relative;flex:1 1 0;min-width:0;display:flex;
  align-items:center;justify-content:center;background:var(--void);overflow:hidden}
#screen-library .lib-t-shot img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
/* Подпись = ключ версии = второй токен тега кадра. Она поверх картинки, а не под ней: иначе
   у плитки с тремя версиями подписи разъезжаются с картинками при разной высоте. */
#screen-library .lib-t-shot b{position:absolute;left:5px;bottom:5px;font-weight:400;
  font-family:var(--mono);font-size:10.5px;color:var(--bone);background:rgba(4,4,5,.74);
  border-radius:4px;padding:2px 6px;max-width:calc(100% - 10px);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#screen-library .lib-t-none{flex:1 1 0;display:flex;flex-direction:column;gap:6px;
  align-items:center;justify-content:center;background:var(--void);color:var(--ash-2);font-size:34px}
#screen-library .lib-t-none i{font-style:normal;font-family:var(--mono);font-size:11px}
#screen-library .lib-t-more{position:absolute;right:6px;top:6px;font-family:var(--mono);font-size:11px;
  color:var(--bone);background:rgba(4,4,5,.74);border-radius:5px;padding:2px 7px}
/* Плитка витрины — родитель компактного `.ed-loader.sm`; свой значок «рисуется» здесь снят
   (был ⏳ эмодзи, а прелоадер в проекте один). */
#screen-library .lib-t-img>.ed-loader{border-radius:0}
#screen-library .lib-t-ft{display:flex;flex-direction:column;gap:2px;padding:9px 11px 10px;min-width:0}
#screen-library .lib-t-nm{color:var(--bone);font-size:14.5px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
#screen-library .lib-t-sub{font-family:var(--mono);font-size:11px;color:var(--ash-2)}
#screen-library .lib-foreign{position:absolute;right:9px;bottom:10px;font-size:13px;opacity:.6}

/* ── карточка одной сущности ── */
#screen-library .lib-body.one{background:var(--plate);border:1px solid var(--hair);
  border-radius:12px;padding:16px 18px}
#screen-library .lib-p-hd{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
#screen-library .lib-back{flex:0 0 auto}
#screen-library .lib-name{flex:1 1 220px;font-size:17px;color:var(--bone)}
#screen-library .lib-name-en{flex:0 0 200px}
#screen-library .lib-hint{font-size:12.5px;color:var(--ash-2);margin:8px 0 4px;line-height:1.5}
#screen-library .lib-hint code{font-family:var(--mono);font-size:12px;color:var(--acc-2)}
#screen-library .lib-sect{margin-top:18px}
#screen-library .lib-sect-h{display:flex;align-items:baseline;gap:8px;font-family:var(--mono);font-size:11px;
  letter-spacing:.11em;text-transform:uppercase;color:var(--ash);margin-bottom:8px}
#screen-library .lib-sect-h span{font-size:11px;letter-spacing:0;text-transform:none;color:var(--ash-2)}
#screen-library .lib-two{display:grid;grid-template-columns:1fr 1fr;gap:10px}
#screen-library .lib-two textarea{min-height:74px;resize:vertical;font-size:13px;line-height:1.5}
#screen-library .lib-chips{display:flex;flex-wrap:wrap;gap:6px}
#screen-library .lib-chip{background:none;border:1px solid var(--hair-b);border-radius:6px;color:var(--ash-2);
  font-size:12.5px;padding:5px 11px;cursor:pointer;transition:.14s}
#screen-library .lib-chip:hover{border-color:var(--hair-hi);color:var(--bone)}
#screen-library .lib-chip.on{border-color:var(--acc);color:var(--acc-2);background:rgba(var(--acc-rgb),.08)}
#screen-library .lib-vars{display:flex;flex-direction:column;gap:10px}
/* Треть ширины под картинку, две трети под поля. Доля, а не 132px: карточка — это то, что
   реально уедет во вход генератора, и по огрызку в 132px нельзя судить ни о лице, ни о свете. */
#screen-library .lib-var{display:grid;grid-template-columns:minmax(190px,32%) 1fr;gap:14px;
  border:1px solid var(--hair);border-radius:9px;padding:10px;background:rgba(255,255,255,.012)}
#screen-library .lib-var-img{position:relative;width:100%;aspect-ratio:3/4;border-radius:7px;
  overflow:hidden;background:var(--void);display:flex;align-items:center;justify-content:center}
/* Локация — кадр, а не рост: 16:9. Общая рамка на обе вкладки давала бы половину пустых полей. */
#screen-library .lib-var-img.place{aspect-ratio:16/9}
/* contain, а не cover: карточка персонажа — это РЕФЕРЕНС в полный рост с подписью имени сверху.
   Обрезка по квадрату съедала бы то ноги, то саму подпись, и оператор не видел бы, что реально
   уедет во вход генератора. Поля вокруг вписанной картинки — плата за то, что видно всю. */
#screen-library .lib-var-img a{display:flex;width:100%;height:100%;align-items:center;justify-content:center}
#screen-library .lib-var-img img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
#screen-library .lib-noimg{font-family:var(--mono);font-size:11px;color:var(--ash-2)}
/* Осталась ТОЛЬКО плашка отказа: «идёт генерация» рисует общий `.ed-loader` (дизайн-система §7),
   своей плашки для этого заводить нельзя. */
#screen-library .lib-job.err{position:absolute;inset:0;display:flex;align-items:center;
  justify-content:center;background:rgba(10,12,16,.72);font-family:var(--mono);font-size:11.5px;
  letter-spacing:.04em;text-transform:uppercase;color:var(--err-2);z-index:3}
#screen-library .lib-var-b{display:flex;flex-direction:column;gap:7px;min-width:0}
#screen-library .lib-var-r{display:flex;gap:7px;align-items:center}
#screen-library .lib-var-r input{flex:1 1 120px}
#screen-library .lib-var-b textarea{min-height:44px;resize:vertical;font-size:12.5px;line-height:1.5}
#screen-library .lib-var-act{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
#screen-library .lib-var-act select{flex:0 0 auto;max-width:180px}
#screen-library .lib-lock{font-size:12px;opacity:.75}
/* «✎ По фото» — у инварианта прижата к правому краю заголовка секции, у версии стоит в ряду
   действий вместе с «Фото» и «Нарисовать». */
#screen-library .lib-desc.hd{margin-left:auto;font-family:var(--ui);letter-spacing:0;text-transform:none}
#screen-library .lib-desc[disabled]{opacity:.6;cursor:default}
#screen-library .lib-x,.lib-pick .lib-x{background:none;border:0;color:var(--ash-2);font-size:15px;
  cursor:pointer;padding:2px 5px;transition:.14s}
#screen-library .lib-x:hover,.lib-pick .lib-x:hover{color:var(--accent-2)}
#screen-library .lib-empty{color:var(--ash-2);font-size:13.5px;padding:14px 2px;line-height:1.55}
#screen-library .inp.sm{font-size:12.5px;padding:6px 9px}
@media(max-width:1000px){#screen-library .lib-two{grid-template-columns:1fr}}
/* На узком экране картинка уходит НАД полями: колонка в 32% от 600px — это 190px, то есть тот
   самый огрызок, от которого ушли. */
@media(max-width:720px){#screen-library .lib-var{grid-template-columns:1fr}
  #screen-library .lib-var-img{max-width:320px}}

/* ── Вкладка «Упаковка» (ui/pack.js) ──
   Живёт на том же экране и в том же контейнере, что канон, поэтому переиспользует его рамку
   (.lib-tile, .lib-sect, .lib-p-hd, .lib-pick). Своё здесь — только РОЛИК-ОБРАЗЕЦ: превью слева,
   заголовок и описание справа. Разложить его в две независимые сетки нельзя: связка «эта
   картинка под этим заголовком» и есть предмет разбора, и глазами она читается только рядом. */
#screen-library .lib-three{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
#screen-library .lib-lb{display:flex;flex-direction:column;gap:5px;font-family:var(--mono);
  font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ash-2)}
/* БЕНТО-СЕТКА ОБРАЗЦОВ: крупное превью, заголовок под ним, описание — в карточке по клику.
   Оператор сравнивает образцы глазами (превью и заголовок — то, на что кликает зритель), и
   сравнение работает, только когда они видны рядом. Прежняя раскладка строкой-формой на
   пятнадцати образцах давала три экрана прокрутки без единой пары в поле зрения. */
#screen-library .pk-samples{display:grid;gap:12px;margin-top:10px;
  grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}
#screen-library .pk-bento{all:unset;cursor:pointer;display:flex;flex-direction:column;gap:8px;
  background:var(--plate);border:1px solid var(--hair);border-radius:10px;padding:8px;
  transition:.14s}
#screen-library .pk-bento:hover{border-color:var(--hair-hi);background:rgba(var(--accent-rgb),.05)}
#screen-library .pk-bento-img{position:relative;display:block;border-radius:7px;overflow:hidden;
  background:var(--hair);aspect-ratio:16/9}
#screen-library .pk-bento-img img{width:100%;height:100%;object-fit:cover;display:block}
#screen-library .pk-bento-img .lib-t-none{display:flex;width:100%;height:100%;align-items:center;
  justify-content:center;color:var(--ash-2);font-size:12px}
#screen-library .pk-bento-v{position:absolute;right:6px;bottom:6px;padding:2px 7px;border-radius:5px;
  background:rgba(4,4,5,.78);color:var(--bone);font-family:var(--mono);font-size:11px}
#screen-library .pk-bento-warn{position:absolute;left:6px;top:6px;padding:2px 7px;border-radius:5px;
  background:rgba(var(--amber-rgb),.9);color:#12100a;font-family:var(--mono);font-size:10.5px;
  letter-spacing:.04em;text-transform:uppercase}
#screen-library .pk-bento-t{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;font-size:13.5px;line-height:1.4;color:var(--bone);padding:0 2px 2px}
/* Крестик проявляется на наведении и фокусе, но НЕ прячется совсем: на тач-экране :hover не
   наступает никогда, и спрятанное там недостижимо. Отсюда полупрозрачность вместо display:none. */
#screen-library .pk-bento-x{all:unset;cursor:pointer;position:absolute;right:6px;top:6px;
  width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:6px;
  background:rgba(4,4,5,.7);color:var(--ash-2);font-size:13px;line-height:1;opacity:.35;
  transition:.14s}
#screen-library .pk-bento:hover .pk-bento-x{opacity:1}
#screen-library .pk-bento-x:hover{background:rgba(var(--err-rgb),.85);color:var(--bone)}
#screen-library .pk-bento-x:focus-visible{opacity:1;outline:1px solid var(--accent-2)}
/* Пустая плитка «добавить» — близнец `.tile.add` экрана «Каналы»: пунктир, крупный плюс, подпись
   капителью. Своя высота не задаётся — тянется по соседям, чтобы ряд не рвался. */
#screen-library .pk-bento.pk-add{align-items:center;justify-content:center;gap:4px;
  border-style:dashed;color:var(--ash-2);min-height:150px}
#screen-library .pk-bento.pk-add:hover{border-color:var(--accent);color:var(--accent-2);
  background:rgba(var(--accent-rgb),.03)}
#screen-library .pk-add-plus{font-size:30px;font-weight:300;line-height:1}
#screen-library .pk-add-t{font-family:var(--mono);font-size:11px;letter-spacing:.12em;
  text-transform:uppercase}
/* ГОДНОСТЬ В РАБОТУ — крупно и словами: «промтов нет» подсказкой оператор читал как заметку,
   а это причина, по которой упаковку нельзя привязать к пресету. */
#screen-library .pk-st{margin-top:10px;padding:9px 12px;border-radius:8px;font-size:13.5px;
  line-height:1.5;background:var(--plate);box-shadow:inset 3px 0 0 var(--hair-hi)}
#screen-library .pk-st b{color:var(--bone);font-weight:700}
#screen-library .pk-st span{color:var(--ash-2)}
#screen-library .pk-st.ok{box-shadow:inset 3px 0 0 var(--green)}
#screen-library .pk-st.ok b{color:var(--green)}
#screen-library .pk-st.raw{box-shadow:inset 3px 0 0 var(--amber-2)}
#screen-library .pk-st.raw b{color:var(--amber-2)}
#screen-library .pk-st.bad{box-shadow:inset 3px 0 0 var(--err-2)}
#screen-library .pk-st.bad b{color:var(--err-2)}
#screen-library .pk-st.run b{color:var(--accent-2)}
/* Несобранная упаковка в сетке и в пикере: приглушена, но видна — прятать её значило бы */
/* оставить оператора гадать, куда делась только что заведённая. */
#screen-library .lib-tile.pk-raw .lib-t-sub{color:var(--amber-2)}
.lib-pick-v.pk-raw{opacity:.55}
.lib-pick-v.pk-raw:hover{opacity:.8}
#screen-library .pk-admin textarea{min-height:150px;resize:vertical;font-size:12.5px;line-height:1.5}
/* Движки упаковки: разметка строк ОДНА с конструктором (`ui/kitgen.js::engRows`), но правила там
   заперты в `#screen-kitgen` — здесь их эквивалент под свой экран. Строка из трёх колонок:
   подпись · модель · раздумья; в одну колонку, потому что шага всего два и рядом им тесно. */
#screen-library .kg-engrows{display:grid;grid-template-columns:1fr;gap:10px}
#screen-library .kg-engrow{display:flex;gap:10px;align-items:center}
#screen-library .kg-engrow .kg-engm{flex:2;min-width:0}
#screen-library .kg-engrow .kg-engt{flex:1;min-width:0}
#screen-library .kg-engrow .csel{min-width:0}
#screen-library .kg-englbl{font-family:var(--mono);font-size:11.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ash-2);min-width:190px;display:flex;gap:6px;align-items:center}
#screen-library .kg-eye{font-size:11px;opacity:.75}
#screen-library .kg-hint{font-size:12px;color:var(--ash-2)}
@media(max-width:820px){#screen-library .kg-engrow{flex-wrap:wrap}
  #screen-library .kg-englbl{min-width:100%}}
/* «сколько» рядом с «Собрать с канала»: подпись и поле в один рост с кнопкой, чтобы ряд читался
   одной строкой действия, а не формой из двух этажей. */
#screen-library .pk-cnt{display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);
  font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ash-2)}
#screen-library .pk-cnt input{width:64px;padding:6px 8px;text-align:center;font-size:13.5px}
@media(max-width:1000px){#screen-library .lib-three{grid-template-columns:1fr}
  #screen-library .pk-samples{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))}}

/* Карточка образца упаковки — рамка общая с пикером (.lib-pick), своё только превью и описание.
   ⚠ Вне #screen-library ОБЯЗАТЕЛЬНО: карточка живёт в body, и `.lib-lb`/`.lib-t-none` там не
   достаются — их версии для карточки объявлены здесь же, иначе подписи полей теряют вид. */
.pk-card{max-width:560px}
.pk-card .lib-lb{display:flex;flex-direction:column;gap:5px;margin-top:12px;font-family:var(--mono);
  font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ash-2)}
.pk-card-shot{display:block;cursor:pointer;border-radius:8px;overflow:hidden;
  background:var(--hair);aspect-ratio:16/9}
.pk-card-shot img{width:100%;height:100%;object-fit:cover;display:block}
.pk-card-shot .lib-t-none{display:flex;width:100%;height:100%;align-items:center;
  justify-content:center;color:var(--ash-2);font-size:12px;text-align:center;padding:0 16px}
.pk-card-desc{min-height:150px;resize:vertical;font-size:13px;line-height:1.55}

/* Пикер «взять версию из библиотеки» — оверлеем поверх редактора прогона (вкладка «Персонажи»
   и карточка кадра). Вне #screen-library: он живёт в body, а не внутри экрана. */
.lib-pick-ov{position:fixed;inset:0;background:rgba(8,10,13,.72);z-index:2200;display:flex;
  align-items:center;justify-content:center;padding:24px}
.lib-pick{background:var(--panel,#12151b);border:1px solid var(--hair);border-radius:13px;
  width:min(760px,96vw);max-height:82vh;display:flex;flex-direction:column;overflow:hidden}
.lib-pick-hd{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--hair);
  color:var(--bone);font-size:15px}
.lib-pick-hd .lib-x{margin-left:auto}
.lib-pick-body{overflow:auto;padding:14px 16px}
.lib-pick-ent{margin-bottom:16px}
.lib-pick-nm{color:var(--bone);font-size:14px;margin-bottom:7px}
.lib-pick-vars{display:flex;flex-wrap:wrap;gap:9px}
.lib-pick-v{background:var(--plate);border:1px solid var(--hair);border-radius:8px;padding:6px;
  cursor:pointer;width:104px;transition:.14s;display:flex;flex-direction:column;gap:5px;align-items:center}
/* --accent, а не --acc: пикер живёт в <body>, вне #screen-library, где объявлены псевдонимы. */
.lib-pick-v:hover{border-color:var(--accent);background:var(--accent-dim)}
/* В пикере тоже contain — по нему выбирают, какая версия уедет в кадр; обрезанная плитка врёт
   о содержимом карточки. Фон-подложка держит одинаковый размер плиток при разных пропорциях. */
.lib-pick-v img{width:90px;height:90px;object-fit:contain;border-radius:5px;background:var(--hair)}
.lib-pick-v span{font-family:var(--mono);font-size:11px;color:var(--ash-2);max-width:92px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Заглушка вместо картинки: у стиля образца может не быть вовсе — он работает строкой, и в
   пикере привязки к пресету такой стиль обязан быть виден. */
.lib-pick-nopic{display:flex;width:90px;height:90px;align-items:center;justify-content:center;
  border-radius:5px;background:var(--hair);color:var(--ash);font-size:30px}
.lib-pick .lib-empty{color:var(--ash-2);font-size:13.5px;line-height:1.55}

/* ══ МАТРИЦА РЕЗЕРВА «аккаунты × операторы» (.rxm, 18.08.2026) ═══════════════════
   Один блок на оба пула — /gemini-royale (профили) и /claude-accounts (подписки); разметку
   строит ui/reserve-matrix.js. Пришла на смену <select multiple size="3"> в ячейке: тот отвечал
   только «кто у этого аккаунта», а спрашивают «сколько общих осталось» и «кто уже отрезан от
   общего пула» — цифры сводки отвечают на это до того, как о резерве расскажет очередь.
   Классы глобальные (не под #screen-…): блок живёт на двух разных экранах. ── */
.rxm{border:1px solid var(--hair-b);background:rgba(7,8,10,.4);margin-bottom:18px}
.rxm-bal{display:flex;gap:22px;flex-wrap:wrap;align-items:center;padding:12px 16px;
  border-bottom:1px solid var(--hair)}
.rxm-n{font-size:26px;font-weight:800;line-height:1}
.rxm-n.sh{color:var(--accent-2)}
.rxm-n.pr{color:var(--amber-2)}
.rxm-l{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--ash-2);margin-top:4px}
.rxm-barwrap{flex:1;min-width:170px}
.rxm-bar{height:6px;background:var(--plate-2);border:1px solid var(--hair);display:flex}
.rxm-bar i{display:block;height:100%}
.rxm-bar .sh{background:var(--accent)}
.rxm-bar .pr{background:var(--amber-2)}
.rxm-warn{max-width:430px;font-size:13.5px;line-height:1.55;color:var(--amber-2)}
.rxm-warn b{color:var(--bone);font-weight:600}
.rxm-warn.none{color:var(--ash-2)}
/* Операторов может стать больше, чем влезает: колонки уезжают вбок, первая липнет на месте —
   иначе в прокрутке не видно, какому аккаунту принадлежит строка. */
.rxm-wrap{overflow-x:auto}
table.rxm-t{border-collapse:collapse;min-width:100%}
table.rxm-t th,table.rxm-t td{border:1px solid var(--hair);padding:0}
table.rxm-t thead th{background:var(--plate-2);vertical-align:bottom;padding:10px 8px;font-weight:500}
table.rxm-t th.rxm-acc{text-align:left;padding:10px 14px;min-width:230px;position:sticky;left:0;
  background:var(--plate-2);z-index:2;font-family:var(--mono);font-size:12px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ash-2)}
table.rxm-t td.rxm-acc{text-align:left;padding:9px 14px;position:sticky;left:0;background:var(--plate);z-index:1}
/* Имена операторов вертикально: 8+ колонок горизонтальными подписями растянули бы таблицу
   вдвое шире экрана уже на средней команде. */
.rxm-op{writing-mode:vertical-rl;transform:rotate(180deg);white-space:nowrap;font-size:14px;
  color:var(--bone);padding:6px 0;line-height:1.2;font-family:var(--ui);letter-spacing:0;text-transform:none}
.rxm-op small{font-family:var(--mono);font-size:10.5px;color:var(--ash-2);letter-spacing:.06em}
.rxm-op.locked small{color:var(--amber-2)}
.rxm-t td.rxm-c{width:52px;height:46px;text-align:center;cursor:pointer;transition:.1s}
.rxm-t td.rxm-c:hover{background:rgba(var(--accent-rgb),.12)}
.rxm-dot{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;
  border:1px solid var(--hair-b);border-radius:50%;color:transparent;font-size:12px;transition:.12s}
.rxm-t td.rxm-c:hover .rxm-dot{border-color:var(--hair-hi);color:var(--ash-2)}
.rxm-t td.rxm-c.on .rxm-dot{background:var(--amber-2);border-color:var(--amber-2);color:#0b0c0f;
  box-shadow:0 0 10px rgba(var(--amber-rgb),.5)}
.rxm-t tr.priv td.rxm-acc{box-shadow:inset 2px 0 0 var(--amber-2)}
.rxm-t tbody tr:hover td{background:rgba(var(--accent-rgb),.04)}
.rxm-t tbody tr:hover td.rxm-c.on{background:rgba(var(--amber-rgb),.14)}
.rxm-nm{font-size:15.5px;color:var(--bone);font-weight:600;display:flex;align-items:center;gap:7px}
.rxm-busy{font-size:11px}
.rxm-clr{all:unset;cursor:pointer;font-family:var(--mono);font-size:13px;line-height:1;color:var(--ash-2);
  width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;transition:.12s}
.rxm-clr:hover{color:var(--err-2);background:rgba(var(--err-rgb),.16)}
.rxm-st{font-family:var(--mono);font-size:11px;color:var(--ash-2);margin-top:2px}
.rxm-st.p{color:var(--amber-2)}
.rxm-st .rxm-meta{color:var(--ash-2)}
.rxm-t tfoot td{background:var(--plate-2);font-family:var(--mono);font-size:11px;color:var(--ash-2);
  text-align:center;padding:7px 4px}
.rxm-t tfoot td.rxm-acc{text-align:left;color:var(--ash);text-transform:none;letter-spacing:.04em;font-size:11px}
.rxm-t tfoot td.has{color:var(--amber-2)}
/* Путь профиля/CLAUDE_CONFIG_DIR под именем: первая колонка тянется на всю ширину блока, и без
   него в ней зияла пустота — а по пути аккаунт и опознают, когда имена вида gem-01/gem-02. */
.rxm-sub{font-family:var(--mono);font-size:11px;color:var(--ash-2);margin-top:3px;
  word-break:break-all;opacity:.8}
/* Колонка ВЫКЛЮЧЕННОГО оператора (.off): /account-users отдаёт только активных, а отбор аккаунтов
   (core/account_access.scope) на активность не смотрит — закрепление за выключенным держит аккаунт
   вне общего пула, и взять его при этом некому. Колонку показываем приглушённой, но кликабельной:
   иначе такой доступ нечем снять. */
.rxm-op.off{color:var(--ash-2);text-decoration:line-through;text-decoration-color:var(--hair-b)}
.rxm-op.off small{color:var(--err-2);text-decoration:none}
.rxm-t td.rxm-c.off{background:rgba(var(--err-rgb),.05)}
.rxm-t td.rxm-c.off.on .rxm-dot{background:var(--err-2);border-color:var(--err-2);
  box-shadow:0 0 10px rgba(var(--err-rgb),.5)}
.rxm-t tfoot td.dead{color:var(--err-2)}
.rxm-warn.dead{color:var(--err-2);max-width:none;flex:1 1 100%}

/* ═══════════════════════════════════════════════════════
   ОТЧЁТ О ПРОБЛЕМЕ (ui/bugreport.js) — доступен на любом экране
   Раскладка та же, что у диалога правки обложки (.cve-*): затемнение + карточка по центру,
   ширина под чтение, прокрутка внутри карточки. Отдельный префикс нужен потому, что диалог
   живёт ВНЕ экранов и обязан переживать их перерисовку.
═══════════════════════════════════════════════════════ */
.bgr-ov{position:fixed;inset:0;z-index:10100;background:rgba(4,4,5,.72);backdrop-filter:blur(2px);
  -webkit-backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;padding:20px}
.bgr-card{position:relative;width:100%;max-width:620px;max-height:90vh;overflow:auto;
  background:var(--void);border:1px solid var(--hair-b);border-radius:10px;padding:20px 22px;
  box-shadow:0 20px 60px rgba(0,0,0,.6)}
.bgr-x{position:absolute;top:10px;right:12px;padding:2px 9px;line-height:1.4}
.bgr-hd{font-size:19px;font-weight:700;color:var(--bone);margin-bottom:14px;padding-right:34px}
.bgr-lbl{display:block;font-size:12.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ash-2);margin:14px 0 6px}
.bgr-lbl i{color:var(--err-2);font-style:normal}
.bgr-ta{width:100%;min-height:96px;resize:vertical;font-size:15px;line-height:1.5;
  background:rgba(0,0,0,.3);border:1px solid var(--hair);border-radius:6px;color:var(--bone);
  padding:9px 11px;transition:.12s;font-family:var(--ui)}
.bgr-ta.sm{min-height:56px}
.bgr-ta:focus{outline:none;border-color:var(--accent-deep)}
.bgr-kinds{display:flex;gap:7px;flex-wrap:wrap}
.bgr-chip{all:unset;cursor:pointer;padding:6px 13px;border:1px solid var(--hair-b);border-radius:6px;
  font-size:13.5px;color:var(--ash);transition:.12s}
.bgr-chip:hover{color:var(--bone);border-color:var(--hair-hi)}
.bgr-chip.on{color:var(--accent-2);border-color:rgba(var(--accent-rgb),.55);
  background:rgba(var(--accent-rgb),.1)}
.bgr-shots{display:flex;gap:8px;flex-wrap:wrap;min-height:40px}
.bgr-shot{position:relative;width:170px;border:1px solid var(--hair);border-radius:6px;overflow:hidden}
.bgr-shot img{width:100%;height:auto;display:block}
.bgr-shot-x{all:unset;cursor:pointer;position:absolute;top:4px;right:4px;width:20px;height:20px;
  text-align:center;line-height:20px;font-size:12px;color:var(--bone);background:rgba(4,4,5,.75);
  border-radius:4px}
.bgr-shot-x:hover{background:rgba(var(--err-rgb),.8)}
.bgr-noshot{font-size:13px;color:var(--ash-2);line-height:1.5}
.bgr-noshot b{color:var(--ash)}
.bgr-file{margin-top:8px}
.bgr-det{margin-top:16px;border-top:1px solid var(--hair);padding-top:10px}
.bgr-det summary{cursor:pointer;font-size:13px;color:var(--ash-2);list-style:none}
.bgr-det summary:hover{color:var(--ash)}
.bgr-ctx{margin-top:9px}
.bgr-kv{display:flex;justify-content:space-between;gap:12px;font-size:13px;padding:3px 0;
  border-bottom:1px solid var(--hair)}
.bgr-kv span{color:var(--ash-2)}
.bgr-kv b{color:var(--ash);font-weight:500;text-align:right;word-break:break-all}
.bgr-errs{margin-top:9px;max-height:150px;overflow:auto;font-family:var(--mono);font-size:11.5px;
  line-height:1.6;color:var(--err-2);background:rgba(var(--err-rgb),.06);border-radius:6px;
  padding:8px 10px;white-space:pre-wrap;word-break:break-all}
.bgr-acts{display:flex;gap:10px;align-items:center;justify-content:flex-end;margin-top:18px}
.bgr-hint{flex:1;font-size:13px;color:var(--err-2)}

/* ── Экран «Проблемы» (ui/bugs.js): список слева, карточка справа ───────────────────────────── */
.bgs-filters{display:flex;gap:7px}
.bgs-wrap{display:grid;grid-template-columns:minmax(280px,360px) minmax(0,1fr);gap:18px;
  align-items:start;margin-top:14px}
.bgs-list{display:flex;flex-direction:column;gap:8px;max-height:calc(100vh - 210px);overflow:auto}
.bgs-row{border:1px solid var(--hair);border-radius:8px;padding:10px 12px;cursor:pointer;
  background:var(--plate);transition:.12s}
.bgs-row:hover{border-color:var(--hair-hi);background:var(--plate-2)}
.bgs-row.on{border-color:rgba(var(--accent-rgb),.55);background:rgba(var(--accent-rgb),.08)}
.bgs-row-hd{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:4px}
.bgs-num{font-family:var(--mono);font-size:12.5px;color:var(--ash-2)}
.bgs-row-t{font-size:14.5px;color:var(--bone);line-height:1.35;word-break:break-word}
.bgs-row-m{font-size:12px;color:var(--ash-2);margin-top:4px}
.bgs-st{font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;padding:2px 7px;
  border-radius:4px;border:1px solid var(--hair-b);color:var(--ash);white-space:nowrap}
.bgs-st.s-new{color:var(--amber-2);border-color:rgba(var(--amber-rgb),.4)}
.bgs-st.s-triage{color:var(--accent-2);border-color:rgba(var(--accent-rgb),.4)}
.bgs-st.s-confirmed{color:var(--err-2);border-color:rgba(var(--err-2-rgb),.4)}
/* «Проверка фикса» — НЕ зелёный: зелёный читается как «всё, готово», а тут ещё ничего не
   подтверждено. Янтарный «в работе», как у нового, но своим оттенком границы. */
.bgs-st.s-verify{color:var(--amber-2);border-color:rgba(var(--accent-rgb),.5)}
.bgs-st.s-fixed{color:var(--green-2);border-color:rgba(var(--green-rgb),.45)}
.bgs-st.s-wontfix{color:var(--ash-2)}
.bgs-card{border:1px solid var(--hair);border-radius:10px;padding:18px 20px;background:var(--plate);
  max-height:calc(100vh - 210px);overflow:auto}
.bgs-empty{color:var(--ash-2);font-size:14px;padding:22px 4px;text-align:center}
.bgs-c-hd{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.bgs-c-kind{font-size:12.5px;color:var(--ash-2)}
.bgs-c-t{font-size:18px;color:var(--bone);margin:8px 0 3px;line-height:1.3}
.bgs-c-m{font-size:12.5px;color:var(--ash-2)}
.bgs-sec{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--ash-2);
  margin:16px 0 6px;border-top:1px solid var(--hair);padding-top:10px}
.bgs-txt{font-size:14.5px;color:var(--bone);line-height:1.55;white-space:pre-wrap;word-break:break-word}
.bgs-kv{display:flex;justify-content:space-between;gap:12px;font-size:13px;padding:3px 0}
.bgs-kv span{color:var(--ash-2)}
.bgs-kv b{color:var(--ash);font-weight:500;text-align:right;word-break:break-all}
.bgs-shots{display:flex;gap:8px;flex-wrap:wrap}
.bgs-shot{width:220px;height:auto;border:1px solid var(--hair);border-radius:6px;cursor:zoom-in;
  background:rgba(255,255,255,.03);min-height:60px}
.bgs-json{max-height:260px;overflow:auto;font-family:var(--mono);font-size:11.5px;line-height:1.55;
  color:var(--ash);background:rgba(0,0,0,.3);border-radius:6px;padding:9px 11px;white-space:pre-wrap;
  word-break:break-all;margin-top:8px}
.bgs-ev{display:flex;flex-direction:column;gap:8px}
.bgs-ev-i{border-left:2px solid var(--hair-b);padding-left:10px}
.bgs-ev-i span{display:block;font-size:11.5px;color:var(--ash-2);margin-bottom:2px}
.bgs-ev-i div{font-size:14px;color:var(--bone);line-height:1.5;white-space:pre-wrap}
.bgs-reply{display:flex;gap:8px;align-items:flex-start;margin-top:10px}
.bgs-reply .bgr-ta{flex:1}
.bgs-adm{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:9px}
.bgs-adm-acts{display:flex;gap:8px;margin-top:10px;justify-content:flex-end}
@media (max-width:1100px){ .bgs-wrap{grid-template-columns:1fr} .bgs-list{max-height:none} }

/* ═══════════════════════════════════════════════════════
   СПРАВКА (#screen-help) — первые шаги и карта разделов
   Экран статический: ни данных, ни своего JS-модуля. Всё на общих токенах — плита --plate-2,
   волосяная обводка, --cut у панелей и 6px у вложенного; служебные подписи mono-капс.
   Карточка раздела — <button> с `all:unset`, поэтому display/box-sizing задаются здесь явно:
   без них она схлопнулась бы в inline и вылезла из грида.
═══════════════════════════════════════════════════════ */
.hlp-wrap{max-width:1180px;margin:0 auto;padding:8px 4px}
.hlp-hero{margin-bottom:26px}
.hlp-lead{font-size:16.5px;color:var(--ash);line-height:1.6;max-width:880px;margin-top:8px}
.hlp-sect2{margin-top:32px}

/* ── четыре шага: 2×2, потому что в каждом абзац текста, а не подпись ── */
.hlp-steps{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.hlp-step{position:relative;display:flex;flex-direction:column;gap:10px;background:var(--plate-2);
  border:1px solid var(--hair-b);border-radius:var(--cut);padding:16px 18px}
.hlp-step::before{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background:linear-gradient(135deg,rgba(255,255,255,.015),transparent 50%)}
.hlp-step>*{position:relative}
.hlp-step-hd{display:flex;align-items:center;gap:10px;font-size:17px;font-weight:700;color:var(--bone)}
.hlp-stepn{flex:none;width:26px;height:26px;border-radius:50%;display:inline-flex;align-items:center;
  justify-content:center;font-family:var(--mono);font-size:13px;font-weight:700;color:var(--accent-2);
  background:rgba(var(--accent-rgb),.12);border:1px solid rgba(var(--accent-rgb),.45)}
.hlp-step-d{font-size:15px;color:var(--ash);line-height:1.6}
.hlp-step-d b{color:var(--bone);font-weight:700}
/* Сноска внутри шага — вложенный уровень: --plate (темнее плиты) + 6px, полоса слева тенью
   поверх отступа, как у блоков-сообщений конструктора. */
.hlp-note{margin-top:10px;padding:9px 12px;border-radius:6px;background:var(--plate);
  box-shadow:inset 2px 0 0 rgba(var(--accent-rgb),.55);font-size:14px;line-height:1.55;color:var(--ash)}
.hlp-step-go{margin-top:auto;display:flex;gap:8px;flex-wrap:wrap}

/* ── карта разделов: карточка = пункт меню ── */
.hlp-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:12px}
.hlp-card{all:unset;box-sizing:border-box;cursor:pointer;position:relative;display:flex;
  flex-direction:column;gap:7px;background:var(--plate-2);border:1px solid var(--hair-b);
  border-radius:var(--cut);padding:15px 17px;transition:.14s}
.hlp-card::before{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background:linear-gradient(135deg,rgba(255,255,255,.015),transparent 50%)}
.hlp-card>*{position:relative}
.hlp-card:hover{border-color:var(--hair-hi);background:rgba(var(--accent-rgb),.03)}
.hlp-card:focus-visible{border-color:var(--accent);box-shadow:0 0 0 1px rgba(var(--accent-rgb),.35)}
.hlp-c-hd{display:flex;align-items:center;gap:9px;font-size:16.5px;font-weight:700;color:var(--bone)}
.hlp-ic{flex:none;width:19px;text-align:center;font-size:15px;color:var(--accent-2)}
.hlp-c-d{font-size:14.25px;color:var(--ash);line-height:1.55}
.hlp-c-w{margin-top:auto;padding-top:5px;font-family:var(--mono);font-size:11.5px;
  text-transform:uppercase;letter-spacing:.12em;color:var(--ash-2)}

/* ── частые вопросы: <details>, каретка треугольником на бордюрах (глиф ▾ на мелком кегле
     в моношрифте вырождается в чёрточку — см. дизайн-систему §7) ── */
.hlp-faq{display:flex;flex-direction:column;gap:8px}
.hlp-q{background:var(--plate-2);border:1px solid var(--hair-b);border-radius:var(--cut);transition:.14s}
.hlp-q:hover{border-color:var(--hair-hi)}
.hlp-q>summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:11px;
  padding:13px 17px;font-size:15.75px;line-height:1.45;color:var(--bone)}
.hlp-q>summary::-webkit-details-marker{display:none}
.hlp-q>summary::before{content:'';flex:none;width:0;height:0;border-left:5px solid transparent;
  border-right:5px solid transparent;border-top:6px solid var(--ash-2);transform:rotate(-90deg);
  transition:transform .18s}
.hlp-q[open]>summary::before{transform:none;border-top-color:var(--accent-2)}
.hlp-a{padding:0 17px 15px 33px;font-size:14.75px;color:var(--ash);line-height:1.65}

/* ── словарь: две колонки KV-строк ── */
.hlp-gloss{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 28px}
.hlp-g{display:flex;gap:12px;padding:9px 2px;border-bottom:1px solid var(--hair);
  font-size:14.25px;line-height:1.5}
.hlp-g b{flex:none;width:138px;color:var(--bone);font-weight:700}
.hlp-g span{min-width:0;color:var(--ash)}

.hlp-foot{margin-top:28px;padding-top:14px;border-top:1px solid var(--hair);
  font-size:14px;line-height:1.6;color:var(--ash-2)}

@media (max-width:1100px){
  .hlp-steps{grid-template-columns:1fr}
  .hlp-gloss{grid-template-columns:1fr}
}
@media (max-width:900px){
  .hlp-cards{grid-template-columns:1fr}
  .hlp-g b{width:118px}
}
