/* ============================================================================
   ЕДИНЫЙ CSS-СЛОЙ ТАБЛИЦ (openspec/changes/standard-tables-modifiers,
   требование «Единый CSS-слой таблиц без копий канон-CSS и ручной зебры»).

   ПРАВИЛА СЛОЯ:
   - ТОЛЬКО классовые селекторы: глобальный селектор tag-`table{}` запрещён (ckeditor и
     email-шаблоны не должны получать стили панели).
   - Цвета ИСКЛЮЧИТЕЛЬНО через токены partials/tokens.html (--tbl-bg,
     --tbl-row-alt, --tbl-line, --border, --panel, --panel2, --accent,
     --accent-soft, --surface2, --text, --muted и т.д.) — обе темы (тёмная
     веб и светлая ЛентаCRM) работают без правок слоя.
   - Зебра — только внутри класса таблицы (.tbl tbody tr:nth-child(even) и
     аналоги для существующих классов), не глобально.
   - Сюда переехали копии канон-CSS: base.html L76–139, partials/settings_layout
     (.ref-table), products_editor (.prop-table/.prod-table + canon-add-row),
     products2_import/catalog/categories (тег-селекторы таблиц), crm.html
     (.crm-table), admin_db (.admin-tbl), products_nomenclature (.nm-tbl),
     products_site_export (.se-tbl). Инъекция ensureCanonCss в table_std.js
     живёт до удаления её другим изменением — значения правил совпадают.
   ============================================================================ */

/* ---------- Базовая канон-таблица: класс .tbl ----------
   (переехала из глобальных `table`/`th,td`/зебры base.html — семантика
   1-в-1, размеры те же: паддинг 8px 10px, шрифт 14px). */
.tbl { width: 100%; border-collapse: collapse; background: var(--tbl-bg); }
.tbl th, .tbl td { padding: 8px 10px; text-align: left; border-bottom: 1px solid var(--tbl-line); font-size: 14px; }
.tbl th { color: var(--muted); font-weight: 700; }
.tbl tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Компактный режим — тот же канон, плотнее (списки в тесных панелях). */
.tbl--compact th, .tbl--compact td { padding: 4px 6px; font-size: 12px; }

/* ---------- Движок TableStd (app/web/static/table_std.js) ----------
   Классы движка: .tstd-table, .tstd-th, .tstd-col-label, .tstd-active,
   .tstd-action, .tstd-pencil, .tstd-add-row/.tstd-add-btn + иконки заголовка
   (см. слой модификаторов ниже). Значения = ensureCanonCss + локальные
   <style> products2_* (sticky-шапка, паддинги), чтобы после удаления
   инъекции вид не менялся. */
.tstd-table{ width: 100%; border-collapse: collapse; background: var(--tbl-bg); }
.tstd-table thead { position: sticky; top: 0; z-index: 3; }
.tstd-table thead th { position: sticky; top: 0; z-index: 3; background: var(--tbl-bg); box-shadow: 0 1px 0 var(--tbl-line); }
/* Канон 25.10.2026: заголовок переносит слова (как и ячейки), нижний предел
   ширины задаёт движок (MIN_COL_W=40) — прежний min-width:80px × 9 колонок
   физически не влезал в узкую панель и таблица выходила за контейнер. */
.tstd-th { text-align: left; vertical-align: top; min-width: 0; padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); white-space: normal; overflow-wrap: anywhere; }
/* Канон 25.10.2026: ширина колонки из colgroup включает padding — иначе
   вписывание в контейнер промахивалось на 9×16px (замер: таблица 447px в
   панели 420px из-за content-box). */
.tstd-table th, .tstd-table td { box-sizing: border-box; }
.tstd-th .tstd-col-label { font-weight: 700; }
.tstd-table tbody td { padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); vertical-align: middle; }
/* Канон 25.10.2026 (fix-tables-drag-and-icon-gates): word-wrap ячеек по
   умолчанию — текст переносится, длинные токены ломаются; таблица 100%
   ширины контейнера, горизонтального скролла за контейнер нет. */
.tstd-table tbody td { white-space: normal; overflow-wrap: anywhere; word-break: break-word; }
.tstd-table tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }
/* Активная строка — подсветка акцентом (движок красит теми же токенами).
   Канон 25.10.2026: фон --tbl-sel (акцент по закону «яркость −1%, сатурация −1%,
   оттенок тот же»), ОДИН для чётных и нечётных строк; текст --on-accent.
   Обводка убрана — она и была «видимым выделением» на чётных строках, где
   зебру перебить не удавалось (дефект владельца 25.10.2026). Зебра теперь
   исключает активные строки через :not() — см. правила чередования выше. */
.tstd-active { background: var(--tbl-sel); color: var(--on-accent); }
/* Кнопки действий в активной строке. */
.tstd-action { padding: 2px 8px; margin-right: 4px; border: none; border-radius: 6px; background: var(--panel2); color: var(--text); cursor: pointer; font-size: 13px; line-height: 1.4; }
/* Карандаш активной строки ✏️. */
.tstd-pencil { margin-left: 6px; padding: 0 4px; border: none; background: none; color: var(--text); cursor: pointer; font-size: 13px; line-height: 1; }
/* Правила индикатора сортировки (tstd-sort-ind, текстовый ▲/▼) и поля поиска
   колонки (tstd-col-filter) УДАЛЕНЫ каноном 23.10.2026: направление сортировки
   показывает иконка-пирамидка (.tbl-ico-sort), поиска в шапке нет — условия в
   попапе воронки. */
/* Строка добавления — не участвует в чередовании (специфичность выше зебры
   и стоит ПОЗЖЕ — канон «невидимая строка под последней»). */
.tstd-table tbody tr.tstd-add-row { background: transparent; }
.tstd-add-row td { background: transparent; border-bottom: 1px solid transparent; }
.tstd-add-row .tstd-add-btn { visibility: hidden; border: none; background: none;
    cursor: pointer; color: var(--text); font-size: 13px; line-height: 1; padding: 0 4px; }
.tstd-add-row td:hover { background: var(--surface2); }
.tstd-add-row td:hover .tstd-add-btn { visibility: visible; }

/* ---------- Строка добавления «+» для самописных таблиц (канон 21.10.2026)
   (переехала из base.html и products_editor.html — там была копия). ---------- */
tr.canon-add-row { background: transparent !important; }
tr.canon-add-row td { background: transparent; border-bottom: 1px solid transparent; }
tr.canon-add-row .canon-add-btn { visibility: hidden; border: none; background: none;
    cursor: pointer; color: var(--text); font-size: 13px; line-height: 1; padding: 0 4px; }
tr.canon-add-row td:hover { background: var(--surface2); }
tr.canon-add-row td:hover .canon-add-btn { visibility: visible; }

/* ---------- Существующие классы таблиц: канон-копии из шаблонов ---------- */

/* Справочники (partials/settings_layout.html). */
.ref-table{ width: 100%; border-collapse: collapse; background: var(--tbl-bg); }
.ref-table th, .ref-table td { padding: 8px 12px; border-bottom: 1px solid var(--tbl-line); text-align: left; font-size: 13px; }
.ref-table th { background: var(--panel2); font-weight: 700; }
.ref-table tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Смета/Участники в редакторе сделки (base.html). td font-size:14px —
   сохранял вычисленный размер старой глобальной пары `th, td {font-size:14px}`. */
.deal-table{ width: 100%; border-collapse: collapse; font-size: 12px; background: var(--tbl-bg); }
.deal-table th { text-align: left; font-size: 12px; color: var(--accent); font-weight: 700; padding: 3px 4px; border-bottom: 1px solid var(--tbl-line); }
.deal-table td { padding: 3px 4px; border-bottom: 1px solid var(--tbl-line); vertical-align: top; font-size: 14px; }
.deal-table input, .deal-table select { width: 100%; padding: 4px 6px; border-radius: 6px; border: 1px solid var(--border); background: var(--panel2); color: var(--text); font-size: 12px; }
.deal-table .di-narrow { width: 70px; }
.deal-table tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Таблицы CRM (crm.html). */
.crm-table{ width: 100%; border-collapse: collapse; background: var(--tbl-bg); }
.crm-table th, .crm-table td { padding: 8px 12px; border-bottom: 1px solid var(--tbl-line); text-align: left; font-size: 13px; vertical-align: top; }
.crm-table th { background: var(--panel2); font-weight: 700; }
.crm-table tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Админ-браузер БД (admin_db.html; ховер строки остался на странице —
   там единственный не-токенный цвет слоя). */
table.admin-tbl { width: 100%; border-collapse: collapse; font-size: 12px; background: var(--tbl-bg); }
table.admin-tbl th { position: sticky; top: 0; background: var(--tbl-bg); padding: 6px 8px; text-align: left; border-bottom: 1px solid var(--tbl-line); font-weight: 700; cursor: pointer; white-space: nowrap; user-select: none; }
table.admin-tbl th:hover { background: var(--panel2); }
table.admin-tbl td { padding: 4px 8px; border-bottom: 1px solid var(--tbl-line); max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 12px; }
table.admin-tbl .null { color: var(--muted); font-style: italic; }
table.admin-tbl tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Экспорт на сайт (products_site_export.html). */
table.se-tbl { width: 100%; max-width: 1200px; border-collapse: collapse; font-size: 13px; background: var(--tbl-bg); }
.se-tbl th { text-align: left; font-size: 12px; color: var(--muted); font-weight: 700; padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); }
.se-tbl td { padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); vertical-align: top; }
.se-tbl tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Таблица номенклатуры (products_nomenclature.html). */
table.nm-tbl { width: 100%; border-collapse: collapse; font-size: 13px; background: var(--tbl-bg); }
.nm-tbl th { text-align: left; font-size: 12px; color: var(--muted); font-weight: 700;
    padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); position: sticky;
    top: 0; background: var(--tbl-bg); }
.nm-tbl td { padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); vertical-align: top; }
.nm-tbl tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Свойства в редакторе товара (products_editor.html). */
.prop-table{ width: 100%; margin-top: 8px; font-size: 13px; background: var(--tbl-bg); }
.prop-table th { text-align: left; padding: 6px 10px 6px 0; font-size: 12px; text-transform: uppercase;
    color: var(--text2); font-weight: 700; border-bottom: 1px solid var(--tbl-line); }
.prop-table td { padding: 6px 10px 6px 0; border-bottom: 1px solid var(--tbl-line); }
.prop-table tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* Список товаров (products_editor.html; поведение строк .prod-row осталось
   на странице). */
.prod-table{ width: 100%; border-collapse: collapse; font-size: 13px; background: var(--tbl-bg); }
.prod-table th { text-align: left; font-size: 12px; padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); color: var(--text2); font-weight: 700; position: sticky; top: 0; background: var(--tbl-bg); }
.prod-table td { padding: 6px 8px; border-bottom: 1px solid var(--tbl-line); color: var(--text); vertical-align: top; }
.prod-table tbody tr:nth-child(even):not(.tbl-row-active):not(.tstd-active) { background: var(--tbl-row-alt); }

/* ---------- Слой модификаторов (openspec standard-tables-modifiers) ----------
   Группа 10 (23.10.2026, канон после приёмки мышью): в заголовке КАЖДОЙ
   колонки ВСЕГДА две стандартные иконки — сортировка (.tbl-ico-sort,
   пирамидка/стрелочки) и фильтр (.tbl-ico-filter, воронка). Иконки на
   фиксированных местах: фиксированный размер + flex-резерв (flex:0 0 12px) —
   появление/активация НЕ меняют высоту и ширину шапки (слова владельца: «мне
   не нравится, что всё скачет, когда появляется строка с модификаторами»).
   Меняются только подсветка (.tbl-ico--active — акцентный токен) и
   направление стрелок (.tbl-ico--asc/--desc скрывают противоположный
   треугольник пирамидки — габарит не меняется). Кнопка «плюс», контекстное
   меню, теги-модификаторы, фолбэк-иконка и поле поиска колонки
   УДАЛЕНЫ каноном 23.10.2026 — их правила из слоя
   вычищены (в JS этих классов больше нет). Цвет — currentColor из токенов:
   обе темы, никаких hex. */

/* Обёртка иконок: inline-flex с фиксированным шагом — резерв места в шапке. */
.tbl-head-icons { display: inline-flex; align-items: center; gap: 8px;
    margin-left: 0; flex: 0 0 auto; }
/* Канон 25.10.2026 (решение владельца): иконки модификаторов стоят ПОД
   заголовком колонки — вторая строка шапки, а не справа от текста. Поэтому
   текст заголовка — отдельный блок .tstd-col-text, а .tstd-col-label —
   колонка: сначала имя, под ним иконки. Габариты шапки постоянны (резерв
   места под иконки есть всегда), «скачков» при активации нет. */
.tstd-th .tstd-col-label { display: flex; flex-direction: column;
    align-items: flex-start; gap: 2px; }
.tstd-col-text { display: block; }
/* База иконки: фиксированный габарит (резерв), цвет — приглушённый токен;
   svg красится currentColor — цвет всегда из токена, не из разметки. */
.tbl-ico { display: inline-flex; align-items: center; justify-content: center;
    width: 12px; height: 14px; flex: 0 0 12px;
    color: var(--muted); cursor: pointer; user-select: none; }
.tbl-ico svg { fill: currentColor; display: block; }
.tbl-ico:hover { color: var(--accent); }
/* Активный модификатор — подсветка иконки акцентом (спека: «активное
   состояние модификатора показывает подсветка его иконки»). */
.tbl-ico--active { color: var(--accent); }
/* Направление сортировки: в активной фазе видна своя стрелка пирамидки. */
.tbl-ico--asc .tbl-arr-dn { display: none; }
.tbl-ico--desc .tbl-arr-up { display: none; }

/* Мини-попап настроек модификатора. */
.tbl-popup { position: absolute; z-index: 1200; width: 260px; background: var(--panel);
    border: 1px solid var(--border); border-radius: 10px; padding: 10px;
    box-shadow: 0 4px 16px color-mix(in srgb, var(--bg) 60%, transparent);
    display: flex; flex-direction: column; gap: 8px; }
.tbl-popup-row { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text); }
.tbl-popup-row input, .tbl-popup-row select { flex: 1; min-width: 0; padding: 5px 8px;
    border-radius: 6px; border: 1px solid var(--border); background: var(--panel2);
    color: var(--text); font-size: 13px; box-sizing: border-box; }
/* Галочки «Показать»/«Покрасить». */
.tbl-popup-check { display: flex; align-items: center; gap: 6px; font-size: 13px;
    color: var(--text); cursor: pointer; }
/* Кнопка «+ условие» и крестик удаления условия в мини-попапе фильтра.
   (Классы меню и крестика тегов для этих целей удалены вместе с меню
   и тегами — попап самодостаточен.) */
.tbl-popup-add { padding: 8px 12px; border: none; background: none; text-align: left;
    color: var(--text); font-size: 13px; cursor: pointer; border-radius: 6px; }
.tbl-popup-add:hover { background: var(--panel2); }
.tbl-cond-x { border: none; background: none; color: var(--muted); cursor: pointer;
    font-size: 12px; line-height: 1; padding: 0 2px; flex: 0 0 auto; }
.tbl-cond-x:hover { color: var(--err); }

/* Окраска ячейки режима «Покрасить» — цвет ТОЛЬКО токеном (спека). */
.tbl-painted { background: var(--accent-soft); }

/* Подвал таблицы (по умолчанию не рендерится; включается опцией таблицы). */
.tbl-foot th, .tbl-foot td, tfoot.tbl-foot th, tfoot.tbl-foot td {
    padding: 8px 10px; border-top: 1px solid var(--tbl-line); border-bottom: none;
    font-weight: 700; color: var(--muted); font-size: 13px; background: var(--panel2); }

/* ---------- Группа 8 (23.10.2026): ширины, выделение строки, закрепление ----------
   openspec standard-tables-modifiers, задачи 8.1–8.5. Цвета — только токены,
   селекторы — только классовые (глобального table{} нет — правило слоя). */

/* Ручка перетаскивания ширины на ПРАВОЙ границе заголовка (8.1): прозрачная
   полоска на всю высоту ячейки; ячейка заголовка — опора позиционирования
   (класс навешивает движок). width 6px — зона захвата всей границы. */
.tbl-th-resizable { position: relative; }
.tbl-col-resizer { position: absolute; top: 0; right: 0; width: 6px; height: 100%;
    cursor: col-resize; user-select: none; z-index: 3; }
.tbl-col-resizer:hover { background: color-mix(in srgb, var(--accent) 25%, transparent); }

/* Выделение текста мышкой запрещено только в ТЕЛЕ канон-таблиц (8.4):
   селекторы канонических классов (.tbl tbody, .tstd-table tbody), не глобально —
   ckeditor, email-шаблоны, попапы и меню вне tbody не затронуты. Поля ввода,
   select и редактируемые зоны ВНУТРИ ячеек выделение сохраняют (канон:
   «выделение в полях ввода и попапах остаётся возможным»). .tbl-painted не трогается. */
.tbl tbody, .tstd-table tbody { user-select: none; }
.tbl tbody input, .tbl tbody textarea, .tbl tbody select, .tbl tbody [contenteditable],
.tstd-table tbody input, .tstd-table tbody textarea, .tstd-table tbody select,
.tstd-table tbody [contenteditable] { user-select: text; }

/* Подсветка всей строки кликом в самописной таблице (хелпер TableMod.attach,
   8.4) — канон-класс, тот же токен, что у .tstd-active движка.
   Канон 25.10.2026 (владелец): фон --tbl-sel нормализован по закону
   «яркость −1%, сатурация −1%, оттенок тот же» и одинаков на чётных и
   нечётных строках; текст --on-accent; inset-обводка удалена (на чётных
   строках она оставалась единственным признаком выделения). */
.tbl-row-active { background: var(--tbl-sel); color: var(--on-accent); }

/* ── Зона закрепления строк (8.5 + приёмка 23.10.2026, дефект 2) ────────── */
/* Зона — отдельный tbody.tstd-pinned (движок) / .tbl-pinned (хелпер):
   стоит в разметке сразу после thead (над всеми строками данных). */
.tstd-pinned, .tbl-pinned { border-bottom: 1px solid var(--tbl-line); }
/* Дефект 2 приёмки (23.10.2026): зона закреплённых — ОБЫЧНЫЙ ПОТОК
   (position:static). Отдельный tbody физически занимает своё место и
   сдвигает ВСЕ строки тела вниз под себя, без наложения. Прежний sticky с
   top=var(--tbl-head-h)=44px наезжал на строки тела при прокрутке
   («каша из строк» по словам владельца) — реальная шапка выше константы
   (строки тегов-модификаторов), и sticky считался от неё неверно.
   Зона выглядит зоной: собственный фон токеном --panel2 и тонкая нижняя
   граница над данными. Фон ставим на td, а не на tr: зебра
   `.tbl tbody tr:nth-child(...) td` красит ячейки и перекрывала бы
   прозрачный tr по специфичности. */
.tstd-pinned tr td, .tbl-pinned tr td { background: var(--panel2); }
/* sticky оправдан ТОЛЬКО когда таблица лежит во внутреннем скроллящемся
   контейнере (overflow auto/scroll с фиксированной высотой): тогда движок
   добавляет зоне класс tbl-pinned-sticky, а top строки — ЗАМЕРЕННАЯ в JS
   высота шапки (offsetHeight thead), проставленный инлайном, не константа.
   Наружный скролл страницы — зона остаётся в потоке. */
.tstd-pinned.tbl-pinned-sticky tr, .tbl-pinned.tbl-pinned-sticky tr {
    position: sticky; z-index: 1; }

/* ── Полоса настроек таблицы (канон 25.10.2026, решение владельца) ──────── */
/* Тонкая полоска НАД таблицей, по центру «…»; клик по полоске открывает
   настройки этой таблицы. Высота = половина высоты прописной буквы шрифта
   таблицы — считается в JS (measureCapitalHalf в table_std.js) и ставится
   инлайном, чтобы не привязываться к константе. Цвета — только токены. */
.tstd-bar { position: relative; display: block; width: 100%; background: var(--panel2);
    border-radius: 3px; cursor: pointer; user-select: none; }
.tstd-bar:hover { background: var(--accent-soft); }
/* Троеточие по центру полоски; шрифт — шрифт таблицы (ставится инлайном). */
.tstd-bar-more { position: absolute; left: 50%; top: 50%;
    transform: translate(-50%, -50%); color: var(--muted); line-height: 1; }
.tstd-bar:hover .tstd-bar-more, .tstd-bar--active .tstd-bar-more { color: var(--accent); }

/* ── Обрезка текста ячейки по числу строк (настройка «Высота строки») ───── */
/* Авто/0 — обрезки нет (класс не ставится). N строк — -webkit-line-clamp
   внутри .tstd-clamp; «…» (.tstd-more) появляется только у обрезанных
   ячеек, по наведению — title с полным текстом, по нажатию ячейка
   разворачивается целиком (строка таблицы растёт по высоте). */
.tstd-clamp { display: -webkit-box; -webkit-box-orient: vertical;
    -webkit-line-clamp: var(--tstd-lines, 1); overflow: hidden; }
.tstd-clamp--open { display: block; overflow: visible;
    -webkit-line-clamp: unset; line-clamp: unset; }
.tstd-more { display: block; margin: 2px 0 0; padding: 0 2px; border: none;
    background: none; color: var(--accent); cursor: pointer; line-height: 1;
    font-size: 13px; }
.tstd-more:hover { text-decoration: underline; }

/* ── Кнопки и наведение (канон ui-controls 27.10.2026) ──────────────────── */
/* Один источник вида кнопок для всего приложения. Три вида (ui-controls):
   обычная (.p2v-btn), главная кнопка этапа (.p2v-btn.primary — рамка и текст
   акцента БЕЗ заливки) и иконка-кнопка (без рамки/фона, своими правилами).
   Акцентная ЗАЛИВКА обозначает только состояние «выбрано/включено» — у
   закладок (.prod-tab.active) и у переключателей (.p2v-tabgroup). */
.p2v-btn { padding: 7px 14px; border: 1px solid var(--border); border-radius: 8px;
    background: var(--panel2); color: var(--text); font-size: 13px; cursor: pointer;
    transition: background-color .12s, color .12s, border-color .12s; }
.p2v-btn:hover { background: var(--accent-soft); color: var(--accent); }
.p2v-btn:active { background: var(--accent-soft); color: var(--accent); }
/* Недоступная команда: приглушённый текст, курсор not-allowed, без отклика. */
.p2v-btn:disabled, .p2v-btn[disabled] { color: var(--muted); cursor: not-allowed; }
.p2v-btn:disabled:hover, .p2v-btn[disabled]:hover { background: var(--panel2); color: var(--muted); }
/* Главная кнопка этапа: акцент в рамке и тексте, не в фоне. */
.p2v-btn.primary { background: var(--panel); border-color: var(--accent); color: var(--accent); }
.p2v-btn.primary:hover { background: var(--accent-soft); color: var(--accent); }

/* Строка шапки этапа: закладки слева, редактор версий по центру (центровку
   даёт обёртка с flex:1 1 auto), кнопки функций справа. Одна строка вместо
   двух (openspec/changes/ui-canon-head-trees-versions). */
.prod-tabs--head { display: flex; align-items: center; gap: 12px; padding: 6px 16px;
    border-bottom: 1px solid var(--border); background: var(--panel); flex: 0 0 auto; }
.prod-tabs--head .prod-tab { color: var(--accent); text-decoration: none; font-weight: 500;
    padding: 5px 12px; border-radius: 8px; font-size: 14px; white-space: nowrap;
    transition: background-color .12s, color .12s, border-color .12s; }
.prod-tabs--head .prod-tab:hover { background: var(--accent-soft); color: var(--accent);
    text-decoration: none; }
.prod-tabs--head .prod-tab.active { background: var(--accent); color: var(--on-accent); }
.prod-tabs--head .prod-tab.active:hover { background: var(--accent); color: var(--on-accent); }

/* Переключатель вида правой панели (Карточка / Агент и подобные): общий
   компонент, различаются только данные. Выбранный — залит акцентом. */
.p2v-tabgroup { display: flex; gap: 6px; padding: 8px 10px;
    border-bottom: 1px solid var(--border); }
.p2v-tabgroup .p2v-btn { padding: 4px 10px; font-size: 12px; }
.p2v-tabgroup .p2v-btn.active { background: var(--accent); border-color: var(--accent);
    color: var(--on-accent); }
.p2v-tabgroup .p2v-btn.active:hover { background: var(--accent); color: var(--on-accent); }

/* ── КАНОН 27.10.2026 (владелец, дословно): «НИ КОГДА НЕ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ
   НЕЛЬЗЯ ДЕЛАТЬ ПОЛЯ С ТЕКСТОМ НИ КАКИМ ЦВЕТОМ КРОМЕ БЕЛОГО!!!! МЕНЯ ЗАМАНАЛИ ЭТИ
   СЕРЫЕ ПОЛЯ С ЧЁРНЫМ ТЕКСТОМ!!!» + уточнение того же дня: «ЗАПРЕТИЛ КАКОЙ ЛИБО ЦВЕТ
   ФОНА ПОД ТЕКСТОМ КРОМЕ БЕЛОГО В СВЕТЛОЙ И ЗАПРЕТИЛ КАКОЙ ЛИБО ЦВЕТ ТЕКСТА КРОМЕ
   ЧЁРНОГО!»

   Значит поля ввода в СВЕТЛОЙ теме: БЕЛЫЙ фон, ЧЁРНЫЙ текст. В тёмной теме — тёмный
   фон и белый текст (иначе белое поле слепит). Никаких серых плашек нигде.
   Правило жёсткое (!important): в шаблонах остались инлайновые стили старых панелей.
   Чекбоксы, радио, ползунки и выбор файла — не текстовые поля, их вид не меняется. */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
textarea,
select {
    background-color: var(--field-bg) !important;
    color: var(--field-text) !important;
    border-color: var(--border) !important;
}
input::placeholder,
textarea::placeholder { color: #6b7683 !important; }
select option { background-color: var(--field-bg); color: var(--field-text); }
input:focus, textarea:focus, select:focus {
    outline: none;
    border-color: var(--accent) !important;
    background-color: var(--field-bg) !important;
    color: var(--field-text) !important;
}
input[readonly], textarea[readonly], input:disabled, textarea:disabled, select:disabled {
    background-color: var(--field-bg) !important;
    color: var(--field-text) !important;
    opacity: 1;
}
/* Тёмная тема: белое поле слепило бы — фон тёмный, текст белый. */
html[data-theme="dark"] input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
html[data-theme="dark"] textarea,
html[data-theme="dark"] select,
body[data-theme="dark"] input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
body[data-theme="dark"] textarea,
body[data-theme="dark"] select {
    background-color: var(--field-bg) !important;
    color: var(--field-text) !important;
    border-color: #2f4152 !important;
}
html[data-theme="dark"] select option,
body[data-theme="dark"] select option { background-color: var(--field-bg); color: var(--field-text); }

/* ── Выделение строк мышью (канон 26.10.2026, подтверждён 28.10.2026):
   первая выделенная — зелёная, остальные — жёлтые; галочек в таблицах нет. */
.table-std tr.sel-first td, table tr.sel-first td { background: rgba(46, 125, 50, 0.18) !important; }
.table-std tr.sel-rest td, table tr.sel-rest td { background: rgba(255, 193, 7, 0.22) !important; }
