:root {
    --bg: #f7f7f5;
    --panel: #ffffff;
    --border: #e2e2df;
    --text: #1f1f1d;
    --muted: #6b6b66;
    --accent: #2f5d50;
    /* Правка 81: единая палитра кнопок. */
    --accent-dark: #234539;
    --accent-soft: #e4efe9;
    --danger: #9a3b2e;
    --focus: #f2b134;
}
* { box-sizing: border-box; }
body { margin: 0; font-family: system-ui, sans-serif; background: var(--bg); color: var(--text); }

/* Правка 51 (docs/decisions/pravka-51-catalog-ui-fixes.md, пункт 4
   задания): раньше `.shell` был просто `display:flex; min-height:100vh` —
   страница прокручивалась целиком через `body`, вместе с ней уезжало вверх
   и боковое меню (не было ни `position:sticky`, ни собственной прокрутки).
   Теперь `.shell` — ровно высота окна, `.sidebar` и `.content` — два
   НЕЗАВИСИМЫХ скролл-контейнера внутри него: меню остаётся на экране,
   каталог прокручивается сам по себе. */
html, body { height: 100%; }
.shell { display: flex; height: 100vh; overflow: hidden; }
.sidebar {
    width: 240px; flex: 0 0 240px; background: var(--panel); border-right: 1px solid var(--border);
    display: flex; flex-direction: column; padding: 16px;
    height: 100vh; overflow-y: auto;
}
.brand { font-weight: 700; margin-bottom: 16px; }
.sidebar ul { list-style: none; padding: 0; margin: 0; }
.sidebar ul.sidebar-main { flex: 1; }
.sidebar li { margin-bottom: 4px; }
.sidebar a { display: block; padding: 8px 10px; border-radius: 6px; color: var(--text); text-decoration: none; }
.sidebar a.active, .sidebar a:hover { background: var(--accent); color: #fff; }
/* Правка 59 (docs/decisions/pravka-59-manager-workspace.md, раздел 2
   задания): группа «Администрирование» — визуально отделена от рабочих
   пунктов менеджера (подпись + отступ сверху), но тем же списком, не
   вложенным аккордеоном — только admin вообще видит эту группу. */
.sidebar-group-label { font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); margin: 16px 0 4px; padding: 0 10px; }
.sidebar-group { margin-bottom: 12px; }
.logout { border-top: 1px solid var(--border); padding-top: 12px; display: flex; flex-direction: column; gap: 8px; }
.logout .user { font-size: 12px; color: var(--muted); }
.logout button { cursor: pointer; }
.change-password-link { font-size: 12px; color: var(--accent); text-decoration: none; }
.change-password-link:hover { text-decoration: underline; }

.card form label { display: flex; flex-direction: column; gap: 4px; font-size: 14px; }
.card form input { padding: 8px; border: 1px solid var(--border); border-radius: 6px; }
.card form button { padding: 10px; border: none; border-radius: 6px; background: var(--accent); color: #fff; cursor: pointer; }

/* Правка 51, пункт 2 задания: `.content` был `flex:1` БЕЗ `min-width:0` —
   стандартная ловушка flexbox: элемент-flex не сжимается меньше
   min-content своего содержимого, поэтому широкое содержимое (таблица,
   нерастягивающийся ряд пагинации) раздвигало весь `.shell` и создавало
   горизонтальную прокрутку у всей страницы вместо того, чтобы просто
   переноситься/сжиматься внутри `.content`. `min-width:0` — не косметика,
   а разрешение браузеру действительно сжимать эту колонку; `overflow-y:
   auto` — независимая прокрутка каталога (см. `.shell` выше), `overflow-x:
   hidden` здесь НЕ подмена фикса, а обычная подстраховка ПОСЛЕ того, как
   реальные широкие элементы (таблица, пагинация) уже исправлены ниже —
   без этих исправлений `overflow-x:hidden` просто обрезал бы контент. */
.content { flex: 1; min-width: 0; height: 100vh; overflow-y: auto; overflow-x: hidden; padding: 32px; box-sizing: border-box;
    container-type: inline-size; container-name: content; }  /* правка 102: карточки по ширине области контента */
.content-full { display: flex; align-items: center; justify-content: center; min-height: 100vh; }

.login-box { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 32px; width: 320px; }
.login-box form { display: flex; flex-direction: column; gap: 12px; margin-top: 12px; }
.login-box label { display: flex; flex-direction: column; gap: 4px; font-size: 14px; }
.login-box input { padding: 8px; border: 1px solid var(--border); border-radius: 6px; }
.login-box button { padding: 10px; border: none; border-radius: 6px; background: var(--accent); color: #fff; cursor: pointer; }
.error { color: #b3261e; font-size: 14px; }
.muted { color: var(--muted); }

h1 { margin-top: 0; }

.filters { display: flex; flex-wrap: wrap; gap: 10px; align-items: end; margin-bottom: 16px; }
/* Правка 62 (docs/decisions/pravka-62-room-selection-filters.md, раздел 5
   задания): найдена НАСТОЯЩАЯ причина «панель фильтров уезжает вправо» —
   `#facet-fields` держался на всю ширину строки инлайн-атрибутом
   `style="flex-basis:100%"` в search/index.html, а не CSS-правилом. htmx
   `hx-swap-oob` меняет элемент ЦЕЛИКОМ (outerHTML) — новый узел из ответа
   сервера (search/_htmx_fragment.html) этого инлайн-атрибута не несёт,
   поэтому после ПЕРВОГО же изменения фильтра блок терял «на всю ширину»
   и становился обычным по размеру содержимого flex-элементом, вставая
   рядом с полем поиска в оставшееся место справа — то самое «уехал в
   правую колонку», о котором сообщил пользователь. Правило в таблице
   стилей (не инлайн-атрибут) переживает outerHTML-замену, потому что
   применяется по `id`, а не по атрибуту самого узла. */
#facet-fields { flex-basis: 100%; width: 100%; min-width: 0; }
.filters label { display: flex; flex-direction: column; gap: 4px; font-size: 13px; color: var(--muted); }
.filters input, .filters select { padding: 7px 8px; border: 1px solid var(--border); border-radius: 6px; min-width: 160px; }
/* Правка 102: флажки и переключатели — не поля ввода: без min-width 160px
   (из-за него флажок фильтра был шириной 160 px, а названию оставалось ~76 px). */
.filters input[type="checkbox"], .filters input[type="radio"] { min-width: 0; padding: 0; border: 0; border-radius: 0; }
.filters button { padding: 8px 14px; border: none; border-radius: 6px; background: var(--accent); color: #fff; cursor: pointer; }

.result-meta { color: var(--muted); font-size: 13px; margin-bottom: 8px; }

/* `table-layout:fixed` -- без него ширина колонок (в т.ч. "Название")
   считается по самому длинному непереносимому фрагменту содержимого, а не
   по доступной ширине `.content`; в паре с `overflow-wrap:anywhere` это и
   есть настоящее исправление горизонтальной прокрутки таблицы (правка 51,
   пункт 2 задания), а не `overflow-x:hidden` поверх нерешённой причины. */
table.products { width: 100%; table-layout: fixed; border-collapse: collapse; background: var(--panel); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
table.products th, table.products td { padding: 10px 12px; border-bottom: 1px solid var(--border); text-align: left; font-size: 14px; overflow-wrap: break-word; word-break: normal; }
table.products th { background: #f0f0ec; font-weight: 600; }
table.products tr:last-child td { border-bottom: none; }
table.products tr:hover { background: #fafaf8; }
table.products a { color: var(--accent); text-decoration: none; font-weight: 600; }
table.products a:hover { text-decoration: underline; }

/* Правка 51 (пункт "сделай строки товаров компактными и одинаковыми по
   высоте" + пункт 2 задания про перенос характеристик во вторую строку):
   `.product-row`/`.product-row-details` — пара строк на один товар вместо
   одиннадцати колонок в одну строку (Габариты/Материал-цвет/Срок поставки
   уходят во вторую, приглушённую строку). Строки одной высоты — за счёт
   строго фиксированного `.product-thumb`/`.product-thumb-placeholder`
   (см. ниже), а не за счёт натурального размера фото. */
/* Правка 65 (docs/decisions/pravka-65-navigation-bulk-selection-quote-
   ui.md, раздел 8 задания): страница КП — своя, более широкая раскладка
   колонок (не переиспользует .products--compact, рассчитанный на узкую
   карточку товарной базы). `overflow-wrap: normal` — самое важное:
   базовое правило `table.products td { overflow-wrap: anywhere }`
   (нужное для узких карточек каталога) заставляло длинное название
   товара переноситься ПО ОТДЕЛЬНЫМ БУКВАМ в этой широкой таблице —
   здесь это отменяется, слово просто переходит на новую строку целиком. */
/* Правка 67 (docs/decisions/pravka-67-selection-state-quote-conditions.md,
   раздел 7 задания): реальный найденный баг — `overflow-wrap: normal`
   НЕ переносит слово, если внутри него нет пробела (длинный артикул без
   пробелов, например «P185-HS-268», просто вылезал за пределы своей
   ячейки и накладывался на соседнюю колонку с фото). `break-word`
   переносит по обычным местам, где это возможно, и только когда слово
   само по себе не помещается — переносит принудительно, без вылезания
   наружу и без разбивки обычных слов по буквам. Колонки — №/фото/товар
   и артикул (объединены, раздел 7: «допускается объединить»)/материал-
   цвет/кол-во/цена/сумма — 7 штук, тот же порядок и число, что в
   preview.html и pdf.html (раздел 7: «одинаковый понятный порядок
   данных» в браузере и PDF).

   Правка 71 (docs/decisions/pravka-71-responsive.md): `table-layout:auto`
   и `overflow-wrap:break-word` здесь молча не применялись — специфичность
   `.quote-items-table`/`.quote-items-table td` (0,1,0)/(0,1,1) была НИЖЕ,
   чем у `table.products{table-layout:fixed}`/`table.products td{overflow-
   wrap:anywhere}` (0,1,1)/(0,1,2) выше в этом же файле, и правка 67
   фактически не работала (подтверждено живой проверкой: computed
   `table-layout` на реальном выпущенном КП был `fixed`, не `auto`).
   `table.quote-items-table` поднимает специфичность до той же (0,1,1)/
   (0,1,2), и побеждает порядком объявления (это правило ниже по файлу). */
table.quote-items-table { table-layout: auto; }
.quote-items-table col.kp-col-num { width: 32px; }
.quote-items-table col.kp-col-photo { width: 96px; }
.quote-items-table col.kp-col-name { width: auto; }
.quote-items-table col.kp-col-material { width: 130px; }
.quote-items-table col.kp-col-qty { width: 60px; }
.quote-items-table col.kp-col-price { width: 100px; }
.quote-items-table col.kp-col-sum { width: 110px; }
table.quote-items-table td, table.quote-items-table th { overflow-wrap: break-word; word-break: normal; }
.quote-item-name { min-width: 220px; }
.quote-room-block { margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--border); }
.quote-room-block:first-child { margin-top: 8px; padding-top: 0; border-top: none; }
.quote-grand-total { margin-top: 16px; padding-top: 12px; border-top: 2px solid var(--border); }
table.products--compact .col-select { width: 32px; }
table.products--compact .thumb-cell { width: 180px; text-align: center; }  /* правка 102: миниатюра 156 px + поля */
table.products--compact .col-name { width: auto; }
table.products--compact .col-supplier { width: 11%; }
table.products--compact .col-category { width: 11%; }
/* Правка 62 (docs/decisions/pravka-62-room-selection-filters.md, раздел
   7 задания): «13 000 ₽ — закупочная» переносится почти по одному
   слову в слишком узкой колонке — короткая подпись (price_semantic_
   label_short) уже сама по себе чинит большую часть проблемы, колонке
   всё равно даётся отдельная явная ширина, чтобы не зависеть от того,
   сколько места останется от других колонок. Артикул/Наличие/Действие
   тоже получили явную ширину по той же причине — при `table-layout:
   fixed` доля колонки, оставшаяся «без класса», ужимается до мизерной,
   когда соседние колонки берут фиксированные пиксели (найдено визуально:
   «Артикул»/«Наличие» переносились по одной букве после того, как у
   колонки действия появилась явная ширина под поле количества). */
table.products--compact .col-article { width: 175px; }  /* правка 102: артикул вида AG.001.AN.72.AN без переноса внутри */
table.products--compact .col-price { width: 160px; }
table.products--compact .col-availability { width: 150px; }  /* правка 114: «поставщик не публикует остаток» — 2–3 строки, не по буквам */
table.products--compact td.col-availability { overflow-wrap: normal; word-break: normal; hyphens: none; }
table.products--compact .col-action { width: 176px; }
table.products--compact th.col-article, table.products--compact th.col-availability { white-space: nowrap; }
table.products--compact tr.product-row td { border-bottom: none; padding-bottom: 4px; vertical-align: middle; }
table.products--compact tr.product-row-details td { padding-top: 0; padding-bottom: 8px; border-bottom: 1px solid var(--border); color: var(--muted); font-size: 12px; }
table.products--compact tr.product-row-details:hover { background: none; }
/* Правка 65 (раздел 5 задания): «выбранная строка визуально
   выделяется» -- раньше галочка не давала никакого видимого следа. */
/* Правка 67 (docs/decisions/pravka-67-selection-state-quote-conditions.md,
   раздел 3 задания): два РАЗНЫХ, независимых состояния строки — нельзя
   путать «уже добавлен в помещение» (серверная истина, светло-жёлтый фон,
   держится через фильтры/поиск/перезагрузку) и «отмечен галочкой для
   массового действия» (временное, тонкая синяя рамка, пропадает после
   снятия галочки или добавления). Раньше ОБА состояния делили один класс
   `.product-row--selected` с жёлтым фоном — товар, добавленный кнопкой
   «Добавить в помещение», вообще не получал подсветки (галочка не была
   отмечена), а подсветка терялась после любого обновления результатов. */
table.products--compact tr.product-row--in-room { background: #fbf6e8; }
table.products--compact tr.product-row--in-room td { border-bottom: none; }
table.products--compact tr.product-row--selected { box-shadow: inset 0 0 0 2px var(--accent, #1a5fb4); }

.badge { display: inline-block; padding: 2px 8px; border-radius: 100px; font-size: 12px; }
.badge.archive { background: #f4e3e1; color: #9a3b2e; }
.badge.promo { background: #fdeecb; color: #8a5a00; }
.badge.active { background: #e4efe9; color: var(--accent); }

/* Правка 51, пункт 3 задания: раньше здесь рендерилась ссылка на КАЖДУЮ
   страницу (до 456 штук) в одном `display:flex` ряду без переноса --
   именно этот элемент растягивал `scrollWidth` документа до ~14000px
   (проверено живьём Playwright ДО фикса: `.pagination` шириной 13984px при
   1280px окна). Теперь окно из "Назад/1…/соседи/…456/Вперёд" — не больше
   7-9 номеров (см. `_pagination_window` в routes.py); `flex-wrap:wrap`
   остаётся как подстраховка на очень узких экранах, а не как решение --
   решение — сокращённый список номеров. */
.pagination { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 16px; align-items: center; font-size: 14px; }
.pagination a, .pagination .pagination-nav { color: var(--accent); text-decoration: none; padding: 4px 8px; border-radius: 4px; }
.pagination a:hover { background: #eef3f0; }
.pagination a.active { background: var(--accent); color: #fff; font-weight: 600; }
.pagination .pagination-nav.disabled { color: var(--muted); cursor: default; }
.pagination .pagination-ellipsis { color: var(--muted); padding: 0 2px; }
.pagination .pagination-info { color: var(--muted); margin-right: 8px; }

.card { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 24px; max-width: 760px; }
.card h1 { margin-top: 0; }
.card dl { display: grid; grid-template-columns: 200px 1fr; gap: 8px 16px; margin: 0; }
.card dt { color: var(--muted); }
.card dd { margin: 0; }
.back-link { display: inline-block; margin-bottom: 12px; color: var(--accent); text-decoration: none; }

/* Правка 22 (docs/decisions/pravka-22-image-coverage-and-navigation.md):
   было height:120px + width:auto -- ширина плитки менялась вместе с
   пропорциями каждого фото (широкий стол растягивал плитку на всю строку,
   квадратное кресло давало маленький квадрат) -- визуально "разные
   размеры" в галерее. Теперь плитка -- фиксированная адаптивная область
   (клетка одного размера у всех карточек), фото внутри вписывается по
   пропорциям через object-fit:contain (не обрезается, не растягивается). */
.product-photos { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0; }
.product-photos a {
    display: flex; align-items: center; justify-content: center;
    width: clamp(140px, 22vw, 220px); aspect-ratio: 1 / 1; max-width: 100%;
    border: 1px solid var(--border); border-radius: 6px; background: #fff; overflow: hidden;
}
.product-photo { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: scale-down; }

/* Правка 51, пункт 1 задания: `.product-thumb-cell a { width:56px;
   height:56px }` было объявлено, но НИ ОДИН шаблон (search/
   _results_table.html и другие таблицы товаров) не оборачивал `<img
   class="product-thumb">` в `.product-thumb-cell` -- сама картинка получала
   только `max-width/max-height:100%` от НЕограниченного родителя (`<td>`
   без ширины), то есть фактически рендерилась в своём натуральном размере
   (?size=400 -- до 400px). Отсюда и регрессия: большое фото растягивало
   строку, маленькое -- не менялось. Исправление -- фиксированный размер
   ПРЯМО на `.product-thumb` (не нужен отдельный контейнер-обёртка),
   `.product-thumb-placeholder` -- заглушка ТОГО ЖЕ размера для
   отсутствующих/битых фото (обработка ошибки загрузки -- инлайн-
   `onerror` в search/_results_table.html, подменяет `<img>` на такую же
   заглушку). Старый неиспользуемый `.product-thumb-cell` удалён. */
.product-thumb {
    display: block; width: 96px; height: 96px; object-fit: scale-down;
    border: 1px solid var(--border); border-radius: 6px; background: #fff;
    padding: 4px; box-sizing: border-box;
}
.product-thumb-placeholder {
    display: flex; align-items: center; justify-content: center; text-align: center;
    width: 96px; height: 96px; box-sizing: border-box;
    border: 1px dashed var(--border); border-radius: 6px; background: var(--bg);
    color: var(--muted); font-size: 11px; padding: 4px;
}

.trace-table { width: 100%; border-collapse: collapse; margin-top: 8px; font-size: 13px; }
.trace-table th, .trace-table td { padding: 6px 8px; border-bottom: 1px solid var(--border); text-align: left; }
.section-title { margin-top: 28px; margin-bottom: 8px; font-size: 15px; }

.as-of { color: var(--muted); font-size: 13px; margin-top: -8px; margin-bottom: 20px; }
.stat-grid { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 24px; }
.stat-card { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px 20px; min-width: 160px; }
.stat-card .stat-value { font-size: 26px; font-weight: 700; }
.stat-card .stat-label { color: var(--muted); font-size: 13px; margin-top: 4px; }

.badge.applied { background: #e4efe9; color: var(--accent); }
.badge.failed, .badge.rejected { background: #f4e3e1; color: #9a3b2e; }
.badge.quarantined { background: #fdeecb; color: #8a5a00; }
.badge.running { background: #e6eef7; color: #2a5a8a; }
.badge.no-data { background: #ececea; color: var(--muted); }
.badge.good { background: #e4efe9; color: var(--accent); }
.badge.bad { background: #f4e3e1; color: #9a3b2e; }

.sum-check { font-size: 12px; margin-top: 4px; }
.sum-check.ok { color: var(--accent); }
.sum-check.bad { color: #9a3b2e; }

.article-list { list-style: none; padding: 0; margin: 4px 0 0; display: flex; flex-wrap: wrap; gap: 6px; font-size: 12px; }
.article-list li a { color: var(--accent); text-decoration: none; border: 1px solid var(--border); border-radius: 4px; padding: 2px 6px; display: inline-block; }
.article-list li a:hover { background: var(--accent); color: #fff; }

/* Правка 32 (docs/decisions/pravka-32-product-card-redesign.md): единая
   карточка товара — фото и основные сведения рядом на широком экране,
   друг под другом на узком. flex-wrap делает это без media-запросов:
   .product-hero__info не помещается рядом с фото у себя в flex-basis —
   переносится на новую строку, оба блока становятся на всю ширину. */
.product-hero { display: flex; flex-wrap: wrap; gap: 24px; align-items: flex-start; margin-bottom: 24px; }
.product-hero__photo { flex: 1 1 340px; max-width: 460px; }
.product-hero__info { flex: 2 1 380px; min-width: 280px; background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 24px; }
.product-hero__info h1 { margin: 8px 0 0; font-size: 20px; }
.product-hero__main-photo {
    display: block; width: 100%; max-height: 420px; object-fit: scale-down;
    border: 1px solid var(--border); border-radius: 8px; background: #fff;
}
.product-hero__no-photo {
    display: flex; align-items: center; justify-content: center; height: 260px;
    border: 1px dashed var(--border); border-radius: 8px; background: var(--panel); color: var(--muted);
}
.card-summary { display: grid; grid-template-columns: 150px 1fr; gap: 10px 16px; margin: 16px 0 0; }
.card-summary dt { color: var(--muted); font-size: 13px; }
.card-summary dd { margin: 0; }

/* Правка 60 (docs/decisions/pravka-60-catalog-selection-undo-project-
   delete.md, раздел 3 задания): характеристики — адаптивная сетка
   БЛОКОВ (не отдельных пар) через auto-fill/minmax, без ручных
   медиа-запросов на 1280/1440/1920 — ширина блока (300px) сама даёт 1
   колонку на телефоне, 2-3 на 1280, 3 на 1440, 4 на 1920 (раздел 3:
   «равномерное заполнение ширины», «нет горизонтальной прокрутки»). */
.characteristics-grid {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px 24px; margin-top: 12px;
}
.characteristics-block { min-width: 0; }
.characteristics-block h3 { font-size: 14px; color: var(--muted); margin: 0 0 8px; text-transform: uppercase; letter-spacing: .02em; }
.characteristics-pair { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0; border-bottom: 1px solid var(--border); font-size: 14px; }
.characteristics-pair__label { color: var(--muted); flex: 1 1 45%; }
.characteristics-pair__value { flex: 1 1 55%; text-align: right; overflow-wrap: anywhere; font-weight: 500; }

/* Правка 60, раздел 5 задания: карточки помещений с явными кнопками
   «Изменить»/«Сохранить»/«Отмена» — редактирование БЕЗ пересоздания. */
.room-cards { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 4px; }
.room-card { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 10px 14px; min-width: 220px; flex: 1 1 240px; }
/* Правка 65 (раздел 6 задания): заметное выделение карточки помещения
   после возврата из подбора мебели -- не только прокрутка к ней. */
.room-card--highlight { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent); }
/* Правка 66 (docs/decisions/pravka-66-selection-navigation-room-budgets.md,
   раздел 6 задания): красное предупреждение о превышении бюджета
   помещения -- не блокирует работу, только заметно сигнализирует. */
.room-card--over-budget { border-color: #9a3b2e; background: #fbf1ef; }
/* Правка 62 (docs/decisions/pravka-62-room-selection-filters.md, раздел 6
   задания): найден реальный баг — `.room-card__view`/`.room-card__edit`
   были заданы БЕЗ учёта атрибута `hidden`: класс и `[hidden]` у браузера
   имеют одинаковую специфичность (0,1,0), и правило класса, идущее в
   таблице стилей ПОСЛЕ встроенных правил браузера, побеждало — элемент с
   `hidden` всё равно показывался как `display:flex`. Из-за этого форма
   редактирования помещения была видна ВСЕГДА, а не только после нажатия
   «Изменить» (обнаружено живой проверкой в браузере, не только чтением
   кода). Селектор `:not([hidden])` отдаёт `[hidden]{display:none}`
   браузеру, когда атрибут есть, и включает display только его отсутствие. */
.room-card__view:not([hidden]) { display: flex; flex-direction: column; gap: 4px; align-items: flex-start; }
.room-card__edit:not([hidden]) { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; }
.room-card__edit input { padding: 6px; border: 1px solid var(--border); border-radius: 6px; width: 100%; }

/* Правка 60, раздел 6 задания: закреплённая панель массового добавления —
   `position: sticky` держит её видимой при прокрутке длинного списка
   результатов (раздел 11: «панель выбранных товаров остаётся видимой»),
   не перекрывает шапку сайта (top небольшой, а не 0). */
/* Правка 65: `:not([hidden])` -- та же ловушка специфичности, что и
   `.room-card__edit` в правке 62: класс с `display:flex` побеждает
   встроенное правило `[hidden]{display:none}` браузера, потому что
   объявлен позже в каскаде, и панель оставалась видимой пустой. */
.selection-panel:not([hidden]) {
    display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
    background: #fbf6e8; border: 1px solid var(--border); border-radius: 8px;
    padding: 10px 14px; margin: 16px 0; position: sticky; top: 8px; z-index: 5;
}

/* Правка 60, раздел 7 задания: вместо длинной строки характеристик —
   компактные значки-предупреждения, разворачивающие пояснение через
   <details>, не занимающие отдельную длинную строку. */
.warn-badge { display: inline-block; margin-right: 8px; }
.warn-badge summary { cursor: pointer; list-style: none; }
.warn-badge summary::-webkit-details-marker { display: none; }
.warn-badge__note { display: block; margin-top: 4px; color: var(--muted); font-size: 12px; }
.small { font-size: 12px; }

.history-block { margin-top: 32px; background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px 24px 24px; }
.history-block > summary { cursor: pointer; font-weight: 600; padding: 8px 0; }
.history-block[open] > summary { margin-bottom: 8px; }

/* Правка 60, раздел 8 задания: чиним «дёргание» панели «Точные фильтры» —
   раньше пункт с нулевым текущим количеством просто исчезал из DOM
   (`{% if count %}`), из-за чего после первого выбора блок терял/обретал
   строки и менял высоту и ширину. Теперь пункт остаётся на месте всегда —
   только тускнеет, когда текущий счётчик равен нулю и сам не выбран. */
.facet-option--empty { opacity: .4; }

/* Правка 62 (docs/decisions/pravka-62-room-selection-filters.md, раздел 5
   задания): настоящая причина «смещения» панели «Точные фильтры» —
   `<fieldset>`-колонки внутри неё раньше были обычными flex-элементами
   БЕЗ заданной ширины, поэтому браузер считал их ширину по содержимому
   (`shrink-to-fit`): как только у поставщика счётчик менялся с «(8229)»
   на «(0)», колонка становилась УЖЕ, и все соседние колонки справа
   сдвигались — визуально воспринималось как «блок съехал». CSS Grid с
   `auto-fill`/`minmax` считает ширину колонок от ширины КОНТЕЙНЕРА, не
   от содержимого — величина счётчика внутри больше никак не влияет на
   раскладку. */
.facet-columns { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px 24px; align-items: start; }
.facet-columns fieldset { border: 1px solid var(--border); border-radius: 8px; padding: 10px; min-width: 0; width: 100%; box-sizing: border-box; margin: 0; }
.facet-columns fieldset label { display: block; font-weight: normal; overflow-wrap: break-word; }
/* Обращение №1: «ширина/глубина/высота от … до …» — сетка с подписью
   постоянной ширины, чтобы поля всех трёх строк стояли в одну линию
   (иначе `.filters input { min-width:160px }` переносил «до» на новую строку). */
.facet-columns fieldset label.facet-range { display: grid; grid-template-columns: 6.5em minmax(0, 1fr) auto minmax(0, 1fr); gap: 6px; align-items: center; margin-bottom: 6px; }
.facet-columns fieldset label.facet-range input { min-width: 0; width: 100%; box-sizing: border-box; }

/* Раздел 5 задания: съёмные метки выбранных фильтров + «Сбросить все». */
.filter-chips { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 12px 0; }
.filter-chips a.badge { text-decoration: none; }

.compare-table th { vertical-align: top; min-width: 160px; text-align: left; }
.compare-table td.compare-cell { text-align: center; }
.compare-table tr.compare-differs td:first-child { border-left: 3px solid var(--accent); }
.compare-table tr.compare-differs { background: #fbf6e8; }
.compare-cell.compare-no_data { color: var(--muted); font-style: italic; }
.compare-cell.compare-varies { color: #9a6b00; }
.compare-cell.compare-needs_review { color: #9a3b00; }

/* Правка 42: кнопка-действие внутри строки таблицы, визуально как ссылка. */
.link-button { background: none; border: none; padding: 0; color: var(--accent, #1a5fb4); text-decoration: underline; cursor: pointer; font: inherit; }
/* Правка 67 (раздел 4 задания): «одинаковые кнопки до и после фильтров» —
   реальная причина: `.card form button` (выше, специфичность 0,1,2)
   перебивала `.link-button` (0,1,0) внутри карточек словарного разбора
   (`.card` оборачивает каждый «Пункт N», обычная таблица результатов
   фильтров — нет) — одна и та же кнопка «Сохранить количество»/«Удалить
   из помещения» выглядела сплошной цветной кнопкой в одном месте и
   текстовой ссылкой в другом. Явный override с более высокой
   специфичностью делает вид ссылки устойчивым везде. #}
.card form button.link-button, .qty-stepper button.link-button { background: none; border: none; padding: 0; border-radius: 0; color: var(--accent, #1a5fb4); }
/* Тот же приём для основной кнопки добавления — одинаковый явный класс
   вместо зависимости от того, обёрнута ли строка в `.card`. */
.card form button.qty-stepper__submit, .qty-stepper button.qty-stepper__submit {
    padding: 6px 12px; border: none; border-radius: 6px; background: var(--accent); color: #fff; cursor: pointer; font: inherit;
}

/* Правка 60, раздел 9 задания: «Удалить проект» — в меню действий, а не
   отдельной большой кнопкой рядом с основным действием. */
.row-menu { position: relative; display: inline-block; }
.row-menu > summary { list-style: none; cursor: pointer; padding: 2px 8px; }
.row-menu > summary::-webkit-details-marker { display: none; }
.row-menu__panel { position: absolute; right: 0; top: 100%; z-index: 10; background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 8px; display: flex; flex-direction: column; gap: 6px; min-width: 160px; box-shadow: 0 4px 12px rgba(0,0,0,.1); }

/* Правка 59 (docs/decisions/pravka-59-manager-workspace.md, раздел 5
   задания): общая шапка рабочего пространства проекта — один аккуратный
   каркас, повторяется на всех 4 этапах (раздел 11: «одинаковые заголовки,
   понятная основная кнопка, нормальные интервалы»). */
.workspace-header { margin-bottom: 24px; }
.workspace-header__top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; gap: 12px; flex-wrap: wrap; }
.workspace-header__saved { color: var(--muted); font-size: 13px; white-space: nowrap; }
/* Правка 60, раздел 4 задания: две понятные кнопки в верхней панели
   проекта, неактивны, когда отменять/повторять нечего, подсказка — какое
   действие будет затронуто (title, плюс подпись прямо на кнопке). */
.workspace-header__undoredo { display: flex; gap: 6px; flex: 1 1 auto; justify-content: center; }
.workspace-header__undoredo button {
    padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--panel);
    cursor: pointer; font-size: 13px; max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.workspace-header__undoredo button:disabled { color: var(--muted); cursor: default; opacity: .5; }
.workspace-header__undoredo button:not(:disabled):hover { border-color: var(--accent); color: var(--accent); }
.workspace-header__title { margin: 0 0 12px; }
.workspace-header__meta { display: flex; flex-wrap: wrap; gap: 24px; margin: 0 0 16px; }
.workspace-header__meta > div { display: flex; flex-direction: column; gap: 2px; }
.workspace-header__meta dt { color: var(--muted); font-size: 12px; }
.workspace-header__meta dd { margin: 0; font-weight: 600; }
/* Правка 61 (docs/decisions/pravka-61-project-quote-workflow.md, раздел 1
   задания): шкала из 5 этапов вместо 4 линейных вкладок — горизонтальная
   на широком экране, вертикальный список на узком (раздел 10: «удобная
   работа при 1280×800/1440×900/1920×1080»), пройденный этап отмечен
   галочкой, текущий — подсвечен, у текущего незавершённого — подсказка,
   чего не хватает. */
.stage-bar { display: flex; flex-wrap: wrap; gap: 4px; border-bottom: 1px solid var(--border); padding-bottom: 4px; }
.stage-bar__item {
    display: flex; align-items: center; gap: 8px; padding: 8px 12px; color: var(--muted); text-decoration: none;
    border-bottom: 2px solid transparent; font-size: 14px; border-radius: 6px 6px 0 0;
}
.stage-bar__num {
    display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px;
    border-radius: 50%; background: var(--border); color: var(--text); font-size: 12px; flex: 0 0 auto;
}
.stage-bar__item.done .stage-bar__num { background: var(--accent); color: #fff; }
.stage-bar__item.active { color: var(--accent); border-bottom-color: var(--accent); font-weight: 600; background: rgba(0,0,0,.02); }
.stage-bar__item:hover { color: var(--text); }
.stage-bar__text { display: flex; flex-direction: column; line-height: 1.3; }
.stage-bar__check { color: var(--accent); }
.stage-bar__hint { font-size: 11px; color: #8a5a00; font-weight: 400; }
@media (max-width: 720px) {
    .stage-bar { flex-direction: column; border-bottom: none; }
    .stage-bar__item { border-bottom: none; border-left: 2px solid transparent; border-radius: 0; }
    .stage-bar__item.active { border-left-color: var(--accent); background: rgba(0,0,0,.03); }
}

/* Правка 61, раздел 1 задания: «длинные завершённые блоки можно
   свернуть» — обычный <details>, без новой библиотеки сворачивания. */
.stage-section { margin: 8px 0 16px; }
.stage-section > summary { cursor: pointer; font-weight: 600; color: var(--muted); padding: 4px 0; }

/* Правка 61, раздел 5 задания: «Действия проекта» — подписанная кнопка
   меню, не одинокий символ «⋮» (раздел 5 задания: «не должно быть
   спрятано под одной неясной иконкой»). */
.action-menu-trigger { list-style: none; cursor: pointer; padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; font-size: 13px; color: var(--text); }
.action-menu-trigger::-webkit-details-marker { display: none; }

/* Раздел 6 задания: баннер текущего рабочего проекта на «Товарной базе» —
   менеджер всегда видит, в какой проект попадёт добавленный товар. */
.active-project-banner {
    display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;
    background: #eef3f0; border: 1px solid var(--border); border-radius: 8px; padding: 10px 14px; margin-bottom: 16px; font-size: 14px;
}
.active-project-banner a { color: var(--accent); }
/* Правка 62, раздел 2 задания: две строки (проект/помещение) слева,
   явные действия справа — вместо одной строки текста через « · ». */
.active-project-banner__info { display: flex; flex-direction: column; gap: 2px; }
.active-project-banner__actions { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }

/* Раздел 3 задания: карточки проектов на главной странице менеджера. */
.project-cards { display: flex; flex-direction: column; gap: 10px; margin-bottom: 28px; }
.project-card {
    display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;
    background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px 20px;
}
.project-card__info { display: flex; flex-direction: column; gap: 4px; }
.project-card__name { font-weight: 600; font-size: 16px; }
.project-card__meta { color: var(--muted); font-size: 13px; }
.project-card__action { padding: 8px 16px; border-radius: 6px; background: var(--accent); color: #fff; text-decoration: none; font-weight: 600; white-space: nowrap; }
.empty-state { color: var(--muted); background: var(--panel); border: 1px dashed var(--border); border-radius: 10px; padding: 24px; text-align: center; }

/* Правка 50 (docs/decisions/pravka-50-quote-wizard.md, раздел 1 задания):
   заметная кнопка входа в мастер «Запрос → КП», видна на каждой странице
   admin/manager в боковом меню (не пункт навигации -- явно отделена). */
/* Правка 81: основные действия — зелёные (было оранжевым #c8501a). */
.wizard-cta {
    display: block; margin: 4px 0 12px; padding: 10px 12px; text-align: center;
    border-radius: 6px; background: var(--accent); color: #fff; text-decoration: none; font-weight: 600;
    border: 1px solid var(--accent);
}
.wizard-cta:hover { background: var(--accent-dark); }

/* Правка 65 (docs/decisions/pravka-65-navigation-bulk-selection-quote-ui.md,
   раздел 7 задания): «крупная основная кнопка... заметна без поиска
   глазами и визуально отличается от обычных ссылок» — раньше это была
   обычная <button style="font-weight:bold"> неотличимая от десятков
   других кнопок на странице. */
.quote-issue-cta { margin-top: 20px; padding: 16px; background: #fbf6e8; border: 1px solid var(--border); border-radius: 10px; }
.quote-issue-cta__primary {
    padding: 14px 28px; font-size: 16px; font-weight: 700; border: none; border-radius: 8px;
    background: var(--accent); color: #fff; cursor: pointer;
}
.quote-issue-cta__primary:hover { opacity: 0.92; }
.quote-issue-cta__primary:disabled { background: #b9b9b0; cursor: not-allowed; }
.quote-issue-cta__secondary {
    padding: 12px 20px; font-size: 15px; border: 1px solid var(--accent); border-radius: 8px;
    color: var(--accent); text-decoration: none; background: transparent;
}
.quote-issue-cta__secondary:hover { background: rgba(0,0,0,0.03); }

/* Правка 63 (docs/decisions/pravka-63-quantity-and-room-review.md,
   раздел 1 задания): понятный блок «Количество: [−] [N] [+] [Добавить в
   помещение]» — раньше было одно узкое числовое поле без подписи. */
.qty-stepper { display: flex; flex-direction: column; gap: 4px; align-items: flex-start; min-width: 150px; }
.qty-stepper__label { font-size: 11px; }
.qty-stepper__controls { display: inline-flex; align-items: center; gap: 2px; }
.qty-stepper__btn { width: 22px; height: 22px; line-height: 1; padding: 0; border: 1px solid var(--border); background: var(--panel); border-radius: 4px; cursor: pointer; }
.qty-stepper__input { width: 48px; text-align: center; }

/* Правка 63 (раздел 5 задания): компактные карточки выбранных товаров
   помещения, разворачиваются прямо под карточкой помещения. */
.room-items-panel { border: 1px solid var(--border); border-top: none; border-radius: 0 0 10px 10px; padding: 12px; background: var(--panel); margin-top: -1px; }
.room-item-card { display: flex; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--border); }
.room-item-card:last-of-type { border-bottom: none; }
.room-item-card__thumb { flex: 0 0 64px; }
.room-item-card__thumb img, .room-item-card__thumb .product-thumb-placeholder { width: 64px; height: 64px; object-fit: scale-down; display: flex; align-items: center; justify-content: center; }
.room-item-card__body { flex: 1; min-width: 0; }
.room-items-panel__totals { font-weight: 600; margin-top: 8px; }

/* Правка 71 (docs/decisions/pravka-71-responsive.md): адаптация всей
   программы для ноутбуков/планшетов/телефонов через ОБЩИЕ компоненты
   (навигация, таблицы, формы) — не точечные правки под каждую страницу. */

/* 1. Безопасный базовый предел для "голых" <img> без собственных рамок —
   уже существующие более строгие правила (.product-thumb и т.п.) не
   затрагиваются, они и так уже ограничены явным размером. */
img { max-width: 100%; height: auto; }
/* `<code>characteristics_backfill.py</code>/<code>model_backfill.py</code>`
   (quality.html) и подобные — слэш без пробела между двумя `<code>` не
   даёт браузеру точки переноса, что при ровно 360px даёт горизонтальную
   прокрутку всей страницы на несколько пикселей (найдено живой проверкой
   правки 71). `break-word` достаточно — это не тот агрессивный
   `anywhere`/`break-all`, что разбивает обычные слова по буквам. */
code { overflow-wrap: break-word; }

/* 2. Верхняя компактная панель + кнопка меню (раздел 2 задания) — видна
   только на планшете/телефоне. На широком экране боковое меню остаётся
   ровно таким, как было. */
.topbar { display: none; }
.sidebar-backdrop { display: none; }
.sidebar__close-btn { display: none; }

@media (max-width: 900px) {
    .content { padding: 16px; }
    /* Правка 51 держала `.shell` ровно высотой окна для НЕЗАВИСИМОЙ
       прокрутки `.sidebar`/`.content` (см. докстринг выше) — на мобильном
       боковая панель уходит в оверлей (position:fixed, см. ниже), эта
       независимость больше не нужна, а `height:100vh;overflow:hidden`
       на `.shell` мешала бы обычной прокрутке всей страницы. */
    .shell { display: block; height: auto; min-height: 100vh; overflow: visible; }
    .content { height: auto; overflow: visible; }
    .topbar {
        display: flex; align-items: center; gap: 12px; position: sticky; top: 0; z-index: 20;
        background: var(--panel); border-bottom: 1px solid var(--border); padding: 10px 16px; margin: 0 0 16px;
    }
    .topbar__menu-btn {
        width: 40px; height: 40px; flex: 0 0 auto; border: 1px solid var(--border); border-radius: 8px;
        background: var(--panel); font-size: 18px; line-height: 1; cursor: pointer;
    }
    .topbar__brand { font-weight: 700; }
    .sidebar {
        position: fixed; top: 0; left: 0; bottom: 0; z-index: 30; width: min(84vw, 300px); height: 100vh;
        transform: translateX(-100%); transition: transform .22s ease; box-shadow: 2px 0 16px rgba(0,0,0,.18);
    }
    .sidebar--open { transform: translateX(0); }
    .sidebar__close-btn {
        display: block; align-self: flex-end; width: 36px; height: 36px; border: 1px solid var(--border);
        border-radius: 8px; background: var(--panel); font-size: 16px; cursor: pointer; margin-bottom: 8px;
    }
    .sidebar-backdrop[hidden] { display: none; }
    .sidebar-backdrop:not([hidden]) { display: block; position: fixed; inset: 0; background: rgba(0,0,0,.35); z-index: 25; }
    /* Панель массового выбора иначе пряталась бы под залипающей .topbar. */
    .selection-panel:not([hidden]) { top: 70px; }
}

/* 3. Лейблы в столбик + поля на всю ширину — переиспользует набор, уже
   применяемый к `.card form` (правка 32 и ранее), под общим именем для
   форм, у которых нет окружающей карточки `.card`. */
/* `:not(:has(...))` — чекбокс/радио со своей надписью не нужно превращать
   в колонку (флажок должен остаться рядом с текстом, не над ним). */
.card form label:not(:has(> input[type="checkbox"])):not(:has(> input[type="radio"])),
.stacked-form label:not(:has(> input[type="checkbox"])):not(:has(> input[type="radio"])) {
    display: flex; flex-direction: column; gap: 4px; font-size: 14px;
}
.card form input, .card form select, .card form textarea,
.stacked-form input, .stacked-form select, .stacked-form textarea {
    width: 100%; box-sizing: border-box; padding: 8px; border: 1px solid var(--border); border-radius: 6px; font: inherit;
}
.card form button[type="submit"], .stacked-form button[type="submit"] {
    padding: 10px; border: none; border-radius: 6px; background: var(--accent); color: #fff; cursor: pointer;
}

/* 4. Вариант B (раздел 4 задания) — прокручивается ТОЛЬКО сама таблица,
   не вся страница; подсказка о прокрутке — псевдоэлемент обёртки, не
   отдельная строка текста в каждом шаблоне. */
.table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; position: relative; } /* абсолютные элементы таблицы (скрытые подписи) не выходят за блок (обращение №23) */
.table-scroll > table { margin: 0; }
@media (max-width: 680px) {
    .table-scroll::before {
        content: "Таблицу можно прокрутить в стороны →"; display: block; font-size: 12px; color: var(--muted); margin-bottom: 6px;
    }
}
/* Широкие таблицы без заранее заданных узких колонок — тот же приём, что
   уже применялся к `.quote-items-table` (правка 65/67): `table-layout:auto`
   + `break-word`/`word-break:normal` вместо унаследованного от
   `table.products` агрессивного `overflow-wrap:anywhere`, который на
   многоколоночных таблицах даёт перенос по одной букве (раздел 4: «запретить
   агрессивный word-break»). */
/* `table.` в селекторе — не косметика: без него специфичность `.wide-table`
   (0,1,0) ниже, чем у `table.products{table-layout:fixed}` (0,1,1) выше в
   этом же файле, и переопределение молча проигрывает (найдено живой
   проверкой: kits/detail.html на 1024px всё равно сжимал колонки по
   буквам, несмотря на уже добавленный класс). */
table.wide-table { table-layout: auto; }
table.wide-table th, table.wide-table td { overflow-wrap: break-word; word-break: normal; }

/* 5. Вариант A (раздел 4/5/7 задания) — карточка товара вместо строки
   таблицы на телефоне. Один общий компонент для товарной базы
   (`table.products--compact`, уже размечена классами col-*), проверки
   комплекта и состава комплекта (`.kit-items-table`, см. kits/detail.html
   и projects/workspace_review.html) — разная разметка строк, одна и та же
   раскладка карточки. */
/* Правка 102: порог — ширина области контента (container query), а не окна:
   при окне 900–1280 px меню забирает 240 px, и таблица с колонками
   фиксированной ширины (~720 px) сжимала «Название» до столбика букв. */
@container content (max-width: 1300px) {
    table.table-cards, table.table-cards thead, table.table-cards tbody,
    table.table-cards tr, table.table-cards td, table.table-cards th { display: block; width: 100%; }
    table.table-cards { table-layout: auto; }
    table.table-cards thead { display: none; }
    table.table-cards tr.row-card {
        display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: flex-start;
        border: 1px solid var(--border); border-radius: 10px; padding: 10px; margin-bottom: 10px; background: var(--panel);
    }
    table.table-cards tr.row-card-details {
        border: 1px solid var(--border); border-top: none; border-radius: 0 0 10px 10px;
        margin-top: -10px; margin-bottom: 10px; padding: 0 10px 8px;
    }
    table.table-cards td { border: none; padding: 0; min-width: 0; overflow-wrap: break-word; word-break: normal; }
    table.table-cards td.cell-full { flex: 1 1 100%; }
    table.table-cards td.cell-half { flex: 1 1 45%; }
    table.table-cards td.cell-photo { flex: 0 0 auto; }
    table.table-cards td.cell-select { flex: 0 0 auto; align-self: center; }
    table.table-cards td.cell-actions {
        flex: 1 1 100%; margin-top: 4px; padding-top: 8px; border-top: 1px dashed var(--border);
        display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
    }
    table.table-cards td[data-label]::before {
        content: attr(data-label); display: block; font-size: 11px; font-weight: 600; color: var(--muted); margin-bottom: 2px;
    }
    table.table-cards td.cell-name { font-weight: 600; flex: 1 1 200px; }
}

/* 6. Сенсорные цели и Safari-зум на полях ввода (раздел 10 задания):
   `font-size:16px` на инпутах — именно этот порог не даёт Safari на iOS
   автоматически увеличивать страницу при фокусе на поле. */
@media (max-width: 680px) {
    input[type="text"], input[type="number"], input[type="email"], input[type="password"],
    input[type="date"], input[type="tel"], select, textarea { font-size: 16px; }
    .wizard-cta, .quote-issue-cta__primary, .quote-issue-cta__secondary,
    .project-card__action, .topbar__menu-btn, .sidebar__close-btn,
    .filters button, .filters-toggle > summary { min-height: 44px; }
    .pagination a, .pagination .pagination-nav { padding: 8px 12px; }
    .badge { padding: 5px 10px; }
}

/* 7. «Фильтры» на телефоне (раздел 5 задания) — то же сворачиваемое
   содержимое `<details>`, что и на широком экране (см.
   search/_facet_fields.html), оформленное заметной кнопкой со счётчиком
   активных фильтров, а не отдельный новый компонент/модальное окно. */
.filters-toggle > summary { cursor: pointer; display: inline-flex; align-items: center; gap: 6px; }
@media (max-width: 680px) {
    .filters-toggle { margin-bottom: 8px; }
    .filters-toggle > summary {
        border: 1px solid var(--border); border-radius: 8px; padding: 8px 14px; background: var(--panel); font-weight: 600;
    }
}

/* ===================================================================
   Правка 72 (docs/decisions/pravka-72-admin-system-status.md): раздел
   «Состояние системы». Компоненты общие для всех страниц панели;
   раскладка таблиц на телефоне — те же `.table-cards`/`.table-scroll`
   правки 71, здесь только новые блоки (статус, сводные карточки,
   проблемы, панели, закрытые блоки подробностей, кнопки действий).
   =================================================================== */
.nav-badge {
    display: inline-block; min-width: 20px; padding: 1px 6px; margin-left: 4px; border-radius: 100px;
    background: #c0503f; color: #fff; font-size: 11px; font-weight: 700; text-align: center; vertical-align: 1px;
}
.system-status {
    display: flex; align-items: center; gap: 12px; padding: 14px 18px; margin-bottom: 16px;
    border: 1px solid; border-radius: 10px; font-weight: 600; font-size: 18px;
}
.system-status__dot { width: 12px; height: 12px; border-radius: 50%; background: currentColor; flex: 0 0 auto; }
.system-status__note { font-weight: 400; font-size: 14px; }
.system-status--ok { background: #e4efe9; border-color: #b9d6c6; color: var(--accent); }
.system-status--attention { background: #fdf3dc; border-color: #f0d58e; color: #7a5200; }
.system-status--critical { background: #f8e3e0; border-color: #e5b3ab; color: #8f2f22; }

.summary-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 24px; }
.summary-card { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 14px 16px; min-width: 0; }
.summary-card__label { color: var(--muted); font-size: 13px; }
.summary-card__value { font-size: 26px; font-weight: 700; margin-top: 4px; overflow-wrap: break-word; }
.summary-card__value--small { font-size: 17px; }
.summary-card__note { color: var(--muted); font-size: 13px; margin-top: 4px; overflow-wrap: break-word; }
@media (max-width: 1100px) { .summary-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 520px) { .summary-cards { grid-template-columns: 1fr; } }

.admin-section-title { font-size: 17px; margin: 28px 0 10px; }
.notice { padding: 10px 14px; border-radius: 8px; background: #e6eef7; color: #2a4a6a; margin-bottom: 16px; font-size: 14px; }
.notice--error { background: #f8e3e0; color: #8f2f22; }
.notice--warn { background: var(--warn-soft, #fbf0d9); color: var(--warn, #7a5300); }
.notice--warn .inline-form { display: inline-block; margin: 6px 0 0; }

.problem-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; }
.problem {
    display: flex; flex-wrap: wrap; gap: 10px 16px; align-items: center; justify-content: space-between;
    background: var(--panel); border: 1px solid var(--border); border-left: 4px solid #e0b64a; border-radius: 8px; padding: 12px 14px;
}
.problem--critical { border-left-color: #c0503f; }
.problem__body { flex: 1 1 320px; min-width: 0; }
.problem__title { font-weight: 600; overflow-wrap: break-word; }
.problem__text { color: var(--muted); font-size: 14px; margin-top: 2px; overflow-wrap: break-word; }
.problem__meta { color: var(--muted); font-size: 12px; margin-top: 4px; }
.problem__action { flex: 0 0 auto; }
.problem__action form { margin: 0; }
.no-problems { background: #e4efe9; color: var(--accent); border-radius: 8px; padding: 12px 14px; font-weight: 600; }

.btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 8px 14px;
    border: 1px solid var(--accent); border-radius: 6px; background: var(--accent); color: #fff;
    font: inherit; font-size: 14px; text-decoration: none; cursor: pointer; white-space: nowrap;
}
.btn--secondary { background: var(--panel); color: var(--accent); }
.btn--danger { background: var(--panel); color: #9a3b2e; border-color: #d9a79f; }
.btn:disabled, .btn[aria-disabled="true"] { opacity: .55; cursor: default; }
.btn-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.btn-row form { margin: 0; }

.admin-grid { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 20px; align-items: start; }
@media (max-width: 1100px) { .admin-grid { grid-template-columns: minmax(0, 1fr); } }
.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px; min-width: 0; }
.panel + .panel { margin-top: 16px; }
.panel__title { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: space-between; margin: 0 0 10px; font-size: 16px; }
.panel--ai { border-style: dashed; }
.kv { display: grid; grid-template-columns: minmax(110px, 42%) minmax(0, 1fr); gap: 6px 12px; margin: 0 0 12px; font-size: 14px; }
.kv dt { color: var(--muted); }
.kv dd { margin: 0; min-width: 0; overflow-wrap: break-word; }
@media (max-width: 420px) { .kv { grid-template-columns: minmax(0, 1fr); gap: 0; } .kv dd { margin-bottom: 8px; } }
.count-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 8px; margin: 0 0 12px; }
.count-grid > div { background: var(--bg); border-radius: 8px; padding: 8px 10px; }
.count-grid strong { display: block; font-size: 20px; }
.count-grid span { color: var(--muted); font-size: 12px; }

.closed-block { margin-top: 20px; border: 1px solid var(--border); border-radius: 10px; background: var(--panel); min-width: 0; }
.closed-block > summary { cursor: pointer; padding: 12px 16px; font-weight: 600; }
.closed-block[open] > summary { border-bottom: 1px solid var(--border); }
.closed-block__body { padding: 12px 16px 16px; min-width: 0; }
.closed-block__body h3 { font-size: 14px; margin: 16px 0 6px; }
.closed-block__body h3:first-child { margin-top: 0; }
.setting-row { display: grid; grid-template-columns: minmax(0, 1fr) 160px; gap: 4px 16px; padding: 10px 0; border-bottom: 1px solid var(--border); align-items: center; }
.setting-row:last-of-type { border-bottom: none; }
.setting-row__label { font-weight: 600; font-size: 14px; }
.setting-row__help { color: var(--muted); font-size: 13px; grid-column: 1; }
.setting-row__control { grid-column: 2; grid-row: 1 / span 2; }
.setting-row__control input[type="number"], .setting-row__control select { width: 100%; padding: 6px 8px; border: 1px solid var(--border); border-radius: 6px; font: inherit; }
@media (max-width: 680px) {
    .setting-row { grid-template-columns: minmax(0, 1fr); }
    .setting-row__control { grid-column: 1; grid-row: auto; }
    .btn { min-height: 44px; }
}
.confirm-check { display: flex; gap: 8px; align-items: flex-start; font-size: 14px; margin: 8px 0; }
.confirm-check input { margin-top: 3px; flex: 0 0 auto; }
.code-block { background: #f4f4f2; border-radius: 6px; padding: 10px 12px; font-family: monospace; font-size: 13px; overflow-x: auto; white-space: pre; }
.secret-key { font-family: monospace; font-size: 16px; background: #f4f4f2; padding: 12px; border-radius: 6px; overflow-wrap: anywhere; }
/* На телефоне таблица `.table-cards` уже превращена в карточки и не
   прокручивается — подсказка о прокрутке там вводила бы в заблуждение. */
@media (max-width: 680px) {
    .table-scroll:has(> table.table-cards)::before { display: none; }
}

/* Правка 74: длинные характеристики (механизмы, колёса, основания —
   несколько строк «код — описание») переносятся по строкам и по словам,
   а не по буквам. */
.characteristics-pair__value { white-space: pre-line; overflow-wrap: break-word; word-break: normal; }
@media (max-width: 680px) {
    .characteristics-pair { flex-wrap: wrap; }
    .characteristics-pair__label, .characteristics-pair__value { flex: 1 1 100%; text-align: left; }
}

/* Правка 75: ручной ввод цены на карточке товара (только администратор). */
.price-entry { margin: 12px 0 20px; }
.price-entry > summary { cursor: pointer; font-weight: 600; }
.price-entry__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px 14px; margin-top: 12px; }
.price-entry__wide { grid-column: 1 / -1; }

/* Правка 76: комплектация строки комплекта и карточки товара. */
.variant-label { color: var(--accent); margin-top: 2px; }
.variant-edit > summary { cursor: pointer; color: var(--accent); }
.variant-edit__form { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; margin-top: 6px; }
.variant-edit__form label { display: flex; flex-direction: column; gap: 2px; }
.variant-select { max-width: 240px; }
.subsection-title { font-size: 15px; margin: 18px 0 8px; }

/* Правка 77: ручное редактирование карточки. */
.edit-table td { vertical-align: top; }
.edit-table input:not([type="checkbox"]), .edit-table select, .edit-table textarea { width: 100%; min-width: 160px; box-sizing: border-box; }
.edit-mode { min-width: 130px; }
.edit-photos { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; margin-bottom: 12px; }
.edit-photo img { width: 100%; aspect-ratio: 1; object-fit: scale-down; background: #f4f4f2; border-radius: 6px; }
.edit-photo--hidden { opacity: .55; }

/* Правка 78: управление поставщиками. */
.supplier-table td { vertical-align: top; }
.row-muted { opacity: .65; }
.inline-form { display: inline-flex; gap: 6px; align-items: center; flex-wrap: wrap; }

/* Правка 79: импорт сайтов, PDF и Excel. */
.mapping-table th { vertical-align: top; min-width: 170px; }
.mapping-table select { max-width: 200px; }
.price-conf { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; font-weight: normal; }
.import-preview td { vertical-align: top; }


/* Правка 81 (docs/decisions/pravka-81-ui-simplification.md): единые кнопки.
   Основное действие — зелёное; второстепенное и возврат (`.secondary`,
   `.btn--secondary`) — белое с зелёной рамкой; опасное (`.danger`,
   `.btn--danger`) — красное. Кнопки без класса в рабочей области больше не
   серые системные. Заметный фокус и состояние «недоступно». */
.content button:not(.link-button):not(.qty-stepper__btn):not(.btn):not(.secondary):not(.danger):not(.topbar__menu-btn):not(.sidebar__close-btn):not(.btn-ghost):not(.btn-link):not(.btn-danger):not(.toast__close):not([data-plain]) {
    background: var(--accent); color: #fff; border: 1px solid var(--accent); border-radius: 6px;
    padding: 6px 12px; font: inherit; cursor: pointer;
}
.content button:not(.link-button):not(.qty-stepper__btn):not(.btn):not(.secondary):not(.danger):not(.btn-ghost):not(.btn-link):not(.btn-danger):not(.toast__close):not([data-plain]):hover { background: var(--accent-dark); }
.content button.secondary {
    background: #fff; color: var(--accent); border: 1px solid var(--accent); border-radius: 6px;
    padding: 6px 12px; font: inherit; cursor: pointer;
}
.content button.secondary:hover, .btn--secondary:hover { background: var(--accent-soft); }
.content button.danger { background: #fff; color: var(--danger); border: 1px solid #d9a79f; border-radius: 6px; padding: 6px 12px; cursor: pointer; }
.content button.danger:hover, .btn--danger:hover { background: #fbeeeb; }
.content button:disabled, .content button[aria-disabled="true"] {
    background: #d5d9d5 !important; border-color: #d5d9d5 !important; color: #4d524d !important; cursor: not-allowed;
}
button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, summary:focus-visible {
    outline: 3px solid var(--focus); outline-offset: 2px;
}
.btn:hover:not(.btn--secondary):not(.btn--danger) { background: var(--accent-dark); }

/* Правка 81: раздел «Настройки». */
.settings-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px; }
.settings-card { display: block; background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px; color: var(--text); text-decoration: none; }
.settings-card:hover { border-color: var(--accent); }
.settings-card h2 { margin: 0 0 8px; font-size: 18px; color: var(--accent); }
.badge--active { background: var(--accent); color: #fff; }

/* Правка 81: панель помещения (закреплена при прокрутке), выбранная мебель. */
.room-bar-wrap { position: sticky; top: 0; z-index: 30; }
.room-bar-wrap:empty { display: none; }
.room-bar {
    display: flex; flex-wrap: wrap; gap: 6px 18px; align-items: center; background: var(--panel);
    border: 1px solid var(--accent); border-radius: 10px; padding: 8px 14px; margin: 0 0 12px;
    box-shadow: 0 2px 6px rgba(0,0,0,.06);
}
.room-bar__label { display: block; font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: .03em; }
.room-bar__name strong { font-size: 17px; }
.room-bar__seats { background: var(--accent); color: #fff; border-radius: 8px; padding: 4px 12px; font-size: 15px; }
.room-bar__seats strong { font-size: 24px; line-height: 1; }
.room-bar__seats .muted { color: #dfe9e4; }
.room-bar__money strong { font-size: 16px; }
.room-bar__over strong, .room-bar__over .room-bar__label { color: var(--danger); }
.room-bar__left strong { color: var(--accent); }
@media (max-width: 680px) {
    /* На узком экране — одна компактная строка, чтобы не закрывать каталог. */
    .room-bar { gap: 4px 12px; padding: 6px 10px; font-size: 13px; }
    .room-bar__name strong { font-size: 14px; }
    .room-bar__seats strong { font-size: 18px; }
    .room-bar__money strong { font-size: 14px; }
    .room-bar__label { font-size: 10px; }
}
@media (max-height: 520px) { .room-bar-wrap { position: static; } }
.room-selection { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; margin: 12px 0 16px; }
.room-selection__title { font-size: 17px; margin: 0 0 10px; }
.room-selection__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.room-selection__item { display: grid; grid-template-columns: 64px 1fr auto; gap: 12px; align-items: center; padding: 8px; border: 1px solid var(--border); border-radius: 8px; }
.room-selection__item--new { animation: stg-highlight 2.5s ease-out; border-color: var(--accent); }
.room-selection__photo img, .room-selection__photo .product-thumb-placeholder { width: 64px; height: 64px; object-fit: scale-down; display: flex; align-items: center; justify-content: center; font-size: 11px; background: #f4f4f2; border-radius: 6px; }
.room-selection__actions { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; justify-content: flex-end; }
.room-selection__actions form { margin: 0; display: flex; gap: 6px; align-items: center; }
@media (max-width: 680px) {
    .room-selection__item { grid-template-columns: 48px 1fr; }
    .room-selection__actions { grid-column: 1 / -1; justify-content: flex-start; }
    .room-selection__photo img, .room-selection__photo .product-thumb-placeholder { width: 48px; height: 48px; }
}
@keyframes stg-highlight { 0% { background: #fff4c7; } 100% { background: transparent; } }
.stg-highlight { animation: stg-highlight 2.5s ease-out; outline: 2px solid var(--accent); outline-offset: 2px; }
.to-selection-btn {
    position: fixed; right: 18px; bottom: 18px; z-index: 40; background: var(--accent); color: #fff;
    padding: 10px 14px; border-radius: 24px; text-decoration: none; box-shadow: 0 3px 10px rgba(0,0,0,.2);
}
.stg-toast {
    position: fixed; left: 50%; transform: translateX(-50%); bottom: 18px; z-index: 50; max-width: min(560px, 92vw);
    background: #1f3b33; color: #fff; padding: 10px 16px; border-radius: 8px; box-shadow: 0 3px 12px rgba(0,0,0,.25);
}
.flash { padding: 10px 14px; border-radius: 8px; margin: 0 0 12px; font-weight: 600; animation: stg-highlight 3s ease-out; }
.flash--ok { background: var(--accent-soft); color: var(--accent-dark); border: 1px solid var(--accent); }
.flash--error { background: #fbeeeb; color: var(--danger); border: 1px solid #d9a79f; }
/* Правка 81: прокрутку после обновления блоков удерживает скрипт подбора
   (браузерная привязка теряла опору при замене таблицы и сдвигала страницу). */
main.content { overflow-anchor: none; }
/* Правка 114: точка отсчёта для абсолютных элементов (.visually-hidden в результатах) —
   иначе они отсчитывались от окна и растягивали документ: пустая прокрутка ниже содержимого. */
main.content { position: relative; }

/* Правка 82: рекомендации по серии и поставщику к последнему добавленному товару. */
.room-recs { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; margin: 0 0 16px; }
.room-recs__title { font-size: 1rem; margin: 0 0 2px; }
.room-recs__hint { margin: 0 0 8px; }
.room-recs__group { font-size: .95rem; margin: 12px 0 6px; }
.room-recs__list { list-style: none; margin: 0 0 6px; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px; }
.rec-card { display: flex; gap: 10px; border: 1px solid var(--border); border-radius: 8px; padding: 8px; background: #fff; min-width: 0; }
.rec-card--in-room { border-color: #9cc9a4; background: #f4faf5; }
.rec-card__photo { flex: 0 0 64px; width: 64px; height: 64px; display: flex; align-items: center; justify-content: center; overflow: hidden; border-radius: 6px; background: #f3f3f3; }
.rec-card__photo img { width: 100%; height: 100%; object-fit: scale-down; }
.rec-card__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.rec-card__name { font-weight: 600; font-size: .9rem; overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.rec-card__add { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; margin-top: 4px; }
.rec-card__add .qty-stepper__input { width: 4.5em; }
#room-recommendations .rec-card__add button { white-space: normal; max-width: 100%; padding: 6px 12px; font-size: .9rem; line-height: 1.2; }
.room-recs > button, .room-recs > a { margin-right: 10px; }
@media (max-width: 680px) { .room-recs__list { grid-template-columns: 1fr; } }

/* ===================================================================
   Правка 83 (docs/decisions/pravka-83-readable-ui-statuses.md).
   1. Подписи зелёных кнопок-ссылок. Реальная причина «пустой» кнопки
   «Выбрать проект» и тёмного текста на «Новый проект»: контекстные
   правила цвета ссылок — `.active-project-banner a { color: accent }`,
   `.sidebar a { color: text }`, `table.products a`, `.card a` — имеют
   большую специфичность (0,1,1 и выше), чем класс кнопки `.wizard-cta`
   (0,1,0), и перекрашивали текст в зелёный на зелёном или тёмный на
   зелёном. Цвет текста кнопок закреплён для всех состояний ссылки.
   =================================================================== */
a.wizard-cta, a.wizard-cta:link, a.wizard-cta:visited, a.wizard-cta:hover, a.wizard-cta:active,
a.btn:not(.btn--secondary):not(.btn--danger):not(.btn-ghost), a.btn:not(.btn--secondary):not(.btn--danger):not(.btn-ghost):link,
a.btn:not(.btn--secondary):not(.btn--danger):not(.btn-ghost):visited, a.btn:not(.btn--secondary):not(.btn--danger):not(.btn-ghost):hover,
a.project-card__action, a.project-card__action:visited, a.project-card__action:hover,
a.to-selection-btn, a.to-selection-btn:visited, a.to-selection-btn:hover,
button.qty-stepper__submit, .content button.qty-stepper__submit:hover {
    color: #fff !important; text-decoration: none;
}
a.btn.btn--secondary, a.btn.btn--secondary:visited, a.btn.btn--secondary:hover,
a.btn.btn-ghost, a.btn.btn-ghost:visited, a.btn.btn-ghost:hover,
a.quote-issue-cta__secondary, a.quote-issue-cta__secondary:visited { color: var(--accent) !important; text-decoration: none; }
a.btn.btn--danger, a.btn.btn--danger:visited { color: var(--danger) !important; }
.sidebar a.wizard-cta { background: var(--accent); }
.sidebar a.wizard-cta:hover, a.wizard-cta:hover, a.project-card__action:hover { background: var(--accent-dark); border-color: var(--accent-dark); }
a.btn[aria-disabled="true"], a.wizard-cta[aria-disabled="true"] { background: #d5d9d5 !important; border-color: #d5d9d5 !important; color: #4d524d !important; pointer-events: none; }
.logout button { background: #fff; color: var(--text); border: 1px solid var(--border); border-radius: 6px; padding: 6px 10px; font: inherit; }
.logout button:hover { border-color: var(--accent); color: var(--accent); }

/* 2. Фокус. Оранжевая рамка активного поля — правило приложения
   (`:focus-visible` с `--focus: #f2b134`), не браузера: Safari считает
   `:focus-visible` любым фокусом текстового поля, в том числе по щелчку.
   Теперь фокус зелёный: у полей — зелёная граница и мягкое кольцо, у кнопок
   и ссылок — зелёный контур, видимый при работе с клавиатуры. */
:root { --focus: var(--accent); --focus-ring: rgba(47, 93, 80, .28); }
button:focus-visible, a:focus-visible, summary:focus-visible {
    outline: 2px solid var(--accent); outline-offset: 2px;
}
input:focus, select:focus, textarea:focus,
input:focus-visible, select:focus-visible, textarea:focus-visible {
    outline: none; border-color: var(--accent) !important; box-shadow: 0 0 0 3px var(--focus-ring);
}
input[type="checkbox"]:focus-visible, input[type="radio"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; box-shadow: none; }

/* 3. Формы проекта и помещений: постоянная подпись над полем, текст 16 px,
   поле высотой 44 px на всю ширину своей колонки, заметная граница. */
.stg-form { display: flex; flex-direction: column; gap: 16px; max-width: 760px; }
.stg-form label:not(:has(> input[type="checkbox"])):not(:has(> input[type="radio"])),
form.card label:not(:has(> input[type="checkbox"])):not(:has(> input[type="radio"])),
.room-card__edit label, .room-create-form label {
    display: flex; flex-direction: column; gap: 6px; font-size: 15px; font-weight: 600; color: var(--text);
}
.stg-form label .muted, .room-card__edit label .muted, .room-create-form label .muted { font-weight: 400; font-size: 13px; }
.stg-form input:not([type="checkbox"]):not([type="radio"]), .stg-form select, .stg-form textarea,
form.card input:not([type="checkbox"]):not([type="radio"]), form.card select, form.card textarea,
.room-card__edit input, .room-create-form input, .room-create-form select {
    width: 100%; box-sizing: border-box; min-height: 44px; padding: 10px 12px; font: inherit; font-size: 16px; font-weight: 400;
    color: var(--text); background: #fff; border: 1px solid #a9aea8; border-radius: 8px;
}
.stg-form textarea, form.card textarea { min-height: 88px; }
.stg-form select, form.card select { -webkit-appearance: menulist; appearance: auto; }
.stg-form__row { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; }
form.card button[type="submit"], .stg-form button[type="submit"], .room-create-form button[type="submit"], .room-card__edit button[type="submit"] {
    min-height: 44px; padding: 10px 20px; font-size: 16px; font-weight: 600; border-radius: 8px;
}
.room-create-form {
    display: grid; grid-template-columns: minmax(220px, 2fr) minmax(140px, 1fr) minmax(180px, 1fr) auto; gap: 14px; align-items: end;
    background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px; margin-top: 12px; max-width: 1000px;
}
.room-create-form__title { grid-column: 1 / -1; margin: 0; font-size: 16px; }
.room-card__edit:not([hidden]) { gap: 12px; }
@media (max-width: 760px) { .room-create-form { grid-template-columns: 1fr; } }
.page-head { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; justify-content: space-between; margin: 24px 0 6px; }
.supplier-list td { vertical-align: top; }
.supplier-list__reason { margin-top: 4px; max-width: 340px; }
.supplier-list__actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: flex-start; }
.supplier-list__actions form { margin: 0; }

/* Правка 83: «Подбор мебели» в проекте — список помещений и отдельный блок мебели. */
.furniture-layout { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; align-items: start; }
.furniture-layout--open { grid-template-columns: minmax(240px, 320px) minmax(0, 1fr); }
.room-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
.furniture-layout--open .room-list { grid-template-columns: minmax(0, 1fr); }
.room-list__item { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; min-width: 0; }
.room-list__item--open { border: 2px solid var(--accent); background: var(--accent-soft); }
.room-list__item--over { border-left: 4px solid var(--danger); }
.room-list__link { display: flex; flex-direction: column; gap: 3px; padding: 10px 12px; color: var(--text); text-decoration: none; }
.room-list__link:hover .room-list__name { text-decoration: underline; }
.room-list__name { font-weight: 700; font-size: 16px; overflow-wrap: break-word; }
.room-list__meta, .room-list__money { font-size: 13px; color: var(--muted); }
.room-list__over { color: var(--danger); display: block; }
.room-list__pick { display: inline-block; margin: 0 12px 10px; font-size: 14px; font-weight: 600; color: var(--accent); }
.room-detail { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px; min-width: 0; }
.room-detail__head { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; justify-content: space-between; }
.room-detail__title { margin: 0; font-size: 20px; overflow-wrap: break-word; min-width: 0; }
.room-detail__stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px; margin: 12px 0; }
.room-detail__stats > div { background: var(--bg); border-radius: 8px; padding: 8px 10px; }
.room-detail__stats dt { font-size: 12px; color: var(--muted); }
.room-detail__stats dd { margin: 2px 0 0; font-size: 18px; font-weight: 700; }
.room-detail__over dd, .room-detail__over dt { color: var(--danger); }
.room-detail__left dd { color: var(--accent); }
.room-detail__empty { margin: 0; }
.room-detail__items .room-item-card { align-items: flex-start; flex-wrap: wrap; }
.room-item-card__name { overflow-wrap: break-word; }
.room-item-card__name a { color: var(--text); text-decoration: none; }
.room-item-card__actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-left: auto; }
.room-item-card__actions form { margin: 0; display: flex; gap: 6px; align-items: center; }
@media (max-width: 900px) {
    .furniture-layout--open { grid-template-columns: minmax(0, 1fr); }
    .room-item-card__actions { margin-left: 76px; }
}
@media (max-width: 900px) { .furniture-layout--open .room-detail { order: -1; } }

/* Правка 84: верхний раздел выбранных товаров и подсказки. */
.room-selection { background: var(--accent-soft); border: 1px solid #b9d6c6; }
.room-selection__head { display: flex; flex-wrap: wrap; gap: 6px 14px; align-items: baseline; margin-bottom: 10px; }
.room-selection__head .room-selection__title { margin: 0; }
.room-selection__count { color: var(--accent-dark); font-weight: 600; font-size: 14px; }
.room-selection__item { background: #fff; scroll-margin-top: 120px; }
.room-selection__item--rec { border-color: var(--accent); }
.room-selection__name { font-weight: 600; color: var(--text); text-decoration: none; overflow-wrap: break-word; }
.room-selection__name:hover { text-decoration: underline; }
.room-selection__just { color: var(--accent); font-weight: 700; margin-top: 2px; }
.room-selection__item--new { animation: stg-highlight 3s ease-out; border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent); }
.results-divider { font-size: 18px; margin: 20px 0 8px; padding-top: 14px; border-top: 2px solid var(--border); }
.continue-btn { border: none; font: inherit; font-weight: 600; cursor: pointer; }
.room-recs { padding: 14px 16px; }
.room-recs__anchor { display: flex; gap: 12px; align-items: center; margin-bottom: 10px; }
.room-recs__anchor-photo { flex: 0 0 56px; width: 56px; height: 56px; border-radius: 8px; background: #f3f3f1; overflow: hidden; display: flex; align-items: center; justify-content: center; }
.room-recs__anchor-photo img { width: 100%; height: 100%; object-fit: scale-down; }
.room-recs__label { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: .03em; }
.room-recs .room-recs__title { font-size: 16px; font-weight: 700; margin: 0; overflow-wrap: break-word; }
.room-recs__tabs { display: flex; flex-wrap: wrap; gap: 6px; border-bottom: 1px solid var(--border); margin-bottom: 12px; }
#room-recommendations .room-recs__tab {
    background: transparent; color: var(--text); border: 1px solid transparent; border-bottom: none; border-radius: 8px 8px 0 0;
    padding: 8px 12px; font: inherit; font-size: 14px; cursor: pointer; margin-bottom: -1px;
}
#room-recommendations .room-recs__tab:hover { background: var(--bg); }
#room-recommendations .room-recs__tab.is-active { background: #fff; border-color: var(--border); color: var(--accent); font-weight: 700; }
.room-recs__list { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; }
.rec-card { flex-direction: column; padding: 10px; gap: 8px; }
.rec-card__photo { flex: none; width: 100%; height: 150px; background: #fff; border: 1px solid var(--border); }
.rec-card__photo img { width: 100%; height: 100%; object-fit: scale-down; }
.rec-card__nophoto { color: var(--muted); font-size: 12px; }
.rec-card__name { font-size: 14px; line-height: 1.3; color: var(--text); text-decoration: none; -webkit-line-clamp: 3; }
.rec-card__name:hover { text-decoration: underline; }
.rec-card__meta { font-size: 12px; color: var(--muted); }
.rec-card__prices { font-size: 13px; }
.rec-card__in-room { font-size: 12px; font-weight: 700; color: var(--accent); }
.room-recs__cats { list-style: none; padding: 0; margin: 8px 0 12px; display: flex; flex-wrap: wrap; gap: 8px; }
.room-recs__cats a { display: inline-block; padding: 6px 12px; border: 1px solid var(--border); border-radius: 100px; color: var(--accent); text-decoration: none; background: #fff; }
.room-recs__cats a:hover { border-color: var(--accent); }
@media (max-width: 680px) {
    .room-recs__list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .rec-card__photo { height: 110px; }
    #room-recommendations .room-recs__tab { flex: 1 1 100%; text-align: left; border-radius: 6px; border: 1px solid var(--border); margin: 0; }
    .room-recs__tabs { border-bottom: none; }
}
/* Правка 85: удаление КП. */
.link-button.link-button--danger { color: var(--danger); }
.quote-deleted-banner { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; padding: 10px 14px; border: 1px solid #d9a79f; border-radius: 8px; background: #fbeeeb; font-size: 14px; }
/* Правка 83: кнопки «Отменить/Повторить» с длинными подписями не выходят за край узкого экрана. */
.workspace-header__undoredo { flex-wrap: wrap; min-width: 0; }
.workspace-header__undoredo form { min-width: 0; max-width: 100%; }
.workspace-header__undoredo button { max-width: 100%; }
@media (max-width: 680px) { .workspace-header__undoredo { justify-content: flex-start; flex-basis: 100%; } .workspace-header__undoredo form { flex: 1 1 100%; } .workspace-header__undoredo button { width: 100%; } }
/* Правка 84: сообщение о добавлении не перекрывает кнопку «Продолжить подбор»
   (на узком экране оно было поверх неё — найдено проверкой в Safari). */
.stg-toast { pointer-events: none; }
@media (max-width: 680px) { .stg-toast { bottom: 76px; } }
.room-selection:not(.is-expanded) .room-selection__item--more { display: none; }
.room-selection__toggle { margin-top: 10px; }
/* Правка 85: действия КП переносятся по строкам — «удалить» не уходит за
   правый край таблицы (раньше колонка была без переноса, ~2500 px). */
table.quote-list { table-layout: auto; }
table.quote-list td { overflow-wrap: break-word; word-break: normal; }
.quote-actions { min-width: 260px; max-width: 400px; line-height: 1.7; }
@media (max-width: 680px) { .table-scroll:has(> table.supplier-list)::before { display: none; } }
@media (max-width: 680px) {
    .table-scroll:has(> table.quote-list)::before { display: none; }
    .quote-actions { max-width: none; min-width: 0; }
}
.rec-card__photo { text-decoration: none; }

/* Правка 87: финансовые итоги подбора (только для права на закупку). */
.finance { background: var(--panel); border: 1px solid var(--border); border-left: 4px solid var(--accent); border-radius: 10px; padding: 12px 14px; margin: 0 0 16px; }
.finance__title { font-weight: 700; margin-bottom: 8px; }
.finance__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 8px; margin: 0; }
.finance__grid > div { background: var(--bg); border-radius: 8px; padding: 8px 10px; }
.finance__grid dt { font-size: 12px; color: var(--muted); }
.finance__grid dd { margin: 2px 0 0; font-size: 18px; font-weight: 700; font-variant-numeric: tabular-nums; }
.finance__diff dd { color: var(--accent); }
.finance__partial { color: var(--muted); font-weight: 600; }
.finance__note { font-size: 13px; margin: 6px 0 0; }
.room-bar__finance { flex-basis: 100%; display: flex; flex-wrap: wrap; gap: 4px 16px; border-top: 1px dashed var(--border); padding-top: 4px; color: var(--muted); }
.room-bar__finance strong { color: var(--text); font-variant-numeric: tabular-nums; }

/* Правка 87: крупное управление количеством — «−» и «+» не меньше 40×40 px,
   читаемое поле между ними; везде: выбранная мебель, каталог, подсказки,
   «Подбор мебели» в проекте. Минимум 1 — stgStepQty; удаление — отдельной кнопкой. */
.qty-stepper__controls { display: inline-flex; align-items: stretch; gap: 4px; flex-wrap: nowrap; }
.qty-stepper__controls .qty-stepper__btn {
    width: 40px; height: 40px; min-width: 40px; font-size: 20px; font-weight: 600; line-height: 1;
    border: 1px solid #a9aea8; border-radius: 8px; background: #fff; color: var(--text); cursor: pointer;
    touch-action: manipulation; -webkit-user-select: none; user-select: none;
}
.qty-stepper__controls .qty-stepper__btn:hover { border-color: var(--accent); color: var(--accent); }
.qty-stepper__controls .qty-stepper__btn:active { background: var(--accent-soft); }
.qty-stepper__controls .qty-stepper__input, .rec-card__add .qty-stepper__controls .qty-stepper__input {
    width: 60px; height: 40px; font-size: 16px; text-align: center; border: 1px solid #a9aea8; border-radius: 8px; padding: 0 4px;
    -moz-appearance: textfield;
}
.qty-stepper__controls .qty-stepper__input::-webkit-outer-spin-button,
.qty-stepper__controls .qty-stepper__input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.qty-stepper { min-width: 0; }
.rec-card__add { flex-wrap: wrap; }
.rec-card__stock { font-size: 12px; color: var(--muted); }
#room-recommendations .room-recs__cat {
    background: #fff; color: var(--accent); border: 1px solid var(--border); border-radius: 100px; padding: 6px 12px; font: inherit; font-size: 14px; cursor: pointer;
}
#room-recommendations .room-recs__cat:hover { border-color: var(--accent); }
#room-recommendations .room-recs__cat.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }
#room-recommendations .room-recs__cat.is-active .muted { color: #dfe9e4; }
.room-recs__anchor { flex-wrap: wrap; }
.room-recs__hide { margin-left: auto; }
.room-recs--collapsed { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; justify-content: space-between; padding: 10px 14px; }
/* Правка 87: на телефоне карточки подсказок в одну колонку — крупные «−/+» не выходят за карточку. */
@media (max-width: 480px) { .room-recs__list { grid-template-columns: minmax(0, 1fr); } .rec-card__photo { height: 140px; } }

/* Правка 88: карточка поставщика — одна плашка ошибки, вкладки. */
.supplier-head { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; justify-content: space-between; }
.supplier-head h1 { margin: 0; }
.supplier-problem { border: 1px solid #e5b3ab; background: #fbf1ef; border-radius: 10px; padding: 12px 14px; margin: 12px 0; }
.supplier-problem p { margin: 0 0 6px; }
.supplier-tabs { display: flex; flex-wrap: wrap; gap: 4px; border-bottom: 1px solid var(--border); margin: 16px 0; }
.supplier-tabs__tab { padding: 10px 14px; text-decoration: none; color: var(--text); border: 1px solid transparent; border-bottom: none; border-radius: 8px 8px 0 0; margin-bottom: -1px; }
.supplier-tabs__tab:hover { background: var(--bg); }
.supplier-tabs__tab.is-active { background: var(--panel); border-color: var(--border); color: var(--accent); font-weight: 700; }
.add-data { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; max-width: 980px; }
.add-data__choice { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 16px; display: flex; flex-direction: column; gap: 10px; }
.add-data__choice h2 { margin: 0; font-size: 18px; }
.add-data__choice ul { margin: 0; padding-left: 18px; font-size: 14px; color: var(--muted); }
.add-data__choice input[type=file] { font-size: 15px; }
.add-data__choice textarea { width: 100%; min-height: 88px; font: inherit; font-size: 16px; padding: 10px 12px; border: 1px solid #a9aea8; border-radius: 8px; box-sizing: border-box; }

/* Правка 89: фото товара в списках крупнее в 1,5 раза (96 → 144 px в каталоге,
   64 → 96 px в выбранном), без обрезки и без растягивания маленьких
   исходников; нажатие открывает увеличенный просмотр. */
.photo-thumb { position: relative; display: inline-flex; align-items: center; justify-content: center; padding: 4px; margin: 0;
    background: #fff; border: 1px solid var(--border); border-radius: 8px; cursor: zoom-in; box-sizing: border-box; overflow: hidden; }
.content button.photo-thumb, .content button.photo-thumb:hover { background: #fff; color: inherit; border: 1px solid var(--border); padding: 4px; }
.photo-thumb:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.photo-thumb img { display: block; width: auto; height: auto; max-width: 100%; max-height: 100%; object-fit: scale-down; border: 0; padding: 0; background: transparent; }
.photo-thumb__none { display: inline-flex; align-items: center; justify-content: center; text-align: center; box-sizing: border-box;
    border: 1px dashed var(--border); border-radius: 8px; background: var(--bg); color: var(--muted); font-size: 12px; padding: 6px; }
.photo-thumb__mark { position: absolute; left: 4px; bottom: 4px; background: rgba(255,255,255,.92); color: var(--muted); font-size: 10px; padding: 1px 5px; border-radius: 4px; }
.product-thumb-box { width: 144px; height: 144px; flex: 0 0 144px; }
.sel-thumb-box { width: 96px; height: 96px; flex: 0 0 96px; }
table.products--compact .thumb-cell { width: 168px; }
table.products--compact tr.product-row td.thumb-cell { padding-top: 8px; padding-bottom: 8px; }
.room-selection__item { grid-template-columns: 96px 1fr auto; }
.room-item-card__thumb { flex: 0 0 144px; }
@media (max-width: 680px) {
    .product-thumb-box { width: 112px; height: 112px; flex-basis: 112px; }
    .sel-thumb-box { width: 72px; height: 72px; flex-basis: 72px; }
    .room-selection__item { grid-template-columns: 72px minmax(0, 1fr); }
    .room-item-card__thumb { flex-basis: 112px; }
}
/* Увеличенный просмотр с галереей товара. */
.photo-viewer[hidden] { display: none; }
.photo-viewer { position: fixed; inset: 0; z-index: 100; background: rgba(15, 20, 18, .82); display: flex; align-items: center; justify-content: center; padding: 16px; }
.photo-viewer__box { background: #fff; border-radius: 12px; max-width: min(1100px, 100%); max-height: 100%; width: 100%; display: flex; flex-direction: column; overflow: hidden; }
.photo-viewer__head { display: flex; gap: 12px; align-items: center; justify-content: space-between; padding: 10px 14px; border-bottom: 1px solid var(--border); }
.photo-viewer__title { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.photo-viewer__main { position: relative; flex: 1; min-height: 0; display: flex; align-items: center; justify-content: center; background: #fff; padding: 10px; }
.photo-viewer__main img { max-width: 100%; max-height: calc(100vh - 220px); object-fit: scale-down; }
/* Правка 104: область просмотра — фиксированной высоты, изображение (версия
   «view», обрезанная по границам предмета) вписывается целиком; маленький
   исходник не растягивается браузером сверх натурального размера. */
.photo-viewer__main { flex: 0 0 auto; height: calc(100vh - 230px); box-sizing: border-box; }
.photo-viewer__main img { width: auto; height: auto; max-width: 100%; max-height: 100%; object-fit: scale-down; display: block; }
@media (max-width: 680px) {
    .photo-viewer { padding: 0; }
    .photo-viewer__box { max-height: 100vh; height: 100vh; border-radius: 0; }
    .photo-viewer__main { height: calc(100vh - 190px); padding: 6px; }
    .photo-viewer__nav { width: 38px; height: 38px; }
}
.photo-viewer__nav { position: absolute; top: 50%; transform: translateY(-50%); width: 44px; height: 44px; border-radius: 50%; border: 1px solid var(--border); background: #fff; font-size: 22px; cursor: pointer; }
.photo-viewer__nav--prev { left: 10px; } .photo-viewer__nav--next { right: 10px; }
.photo-viewer__thumbs { display: flex; gap: 8px; overflow-x: auto; padding: 10px 14px; border-top: 1px solid var(--border); }
.photo-viewer__thumbs button { flex: 0 0 72px; height: 72px; padding: 3px; border: 2px solid var(--border); border-radius: 8px; background: #fff; cursor: pointer; }
.photo-viewer__thumbs button.is-active { border-color: var(--accent); }
.photo-viewer__thumbs img { width: 100%; height: 100%; object-fit: scale-down; }
.photo-viewer__note { font-size: 12px; color: var(--muted); padding: 0 14px 10px; }
/* Старые правила задавали размер самой картинке — внутри блока фото размер задаёт блок. */
table.table-cards .photo-thumb img.product-thumb, .room-item-card__thumb .photo-thumb img, .room-selection__photo .photo-thumb img, .photo-thumb img.product-thumb {
    width: auto; height: auto; max-width: 100%; max-height: 100%; border: 0; padding: 0; background: transparent; border-radius: 0;
}
.gallery__main { display: block; width: 100%; padding: 0; border: 0; background: transparent; cursor: zoom-in; }
.content button.gallery__main, .content button.gallery__main:hover { background: transparent; border: 0; padding: 0; }
.gallery__thumbs { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.content button.gallery__thumb, .gallery__thumb { width: 72px; height: 72px; padding: 3px; background: #fff; border: 2px solid var(--border); border-radius: 8px; cursor: pointer; }
.content button.gallery__thumb.is-active { border-color: var(--accent); }
.gallery__thumb img { width: 100%; height: 100%; object-fit: scale-down; }
.gallery__source { margin-top: 8px; }
/* Общее правило зелёных кнопок (.content button:not(...)) сильнее по специфичности —
   у кнопок с фото свои отступы и белый фон. */
.photo-thumb, .content button.photo-thumb:hover { padding: 4px !important; background: #fff !important; color: inherit !important; border: 1px solid var(--border) !important; }
.content button.gallery__main, .content button.gallery__main:hover { padding: 0 !important; background: transparent !important; border: 0 !important; }
.content button.gallery__thumb, .content button.gallery__thumb:hover { padding: 3px !important; background: #fff !important; border: 2px solid var(--border) !important; }
.content button.gallery__thumb.is-active { border-color: var(--accent) !important; }
.photo-viewer__thumbs button, .photo-viewer__thumbs button:hover { padding: 3px !important; background: #fff !important; border: 2px solid var(--border) !important; }
.photo-viewer__thumbs button.is-active { border-color: var(--accent) !important; }
.photo-viewer__nav, .photo-viewer__nav:hover { background: #fff !important; color: var(--text) !important; border: 1px solid var(--border) !important; padding: 0 !important; }

/* Правка 90: проверка фотографий. */
.photo-proposals { list-style: none; padding: 0; margin: 12px 0; display: grid; gap: 14px; }
.photo-proposal { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; }
.photo-proposal__head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 8px; }
.photo-proposal__pair { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.photo-proposal__pair figure { margin: 0; background: #fff; border: 1px solid var(--border); border-radius: 8px; padding: 8px; }
.photo-proposal__pair figcaption { font-size: 12px; color: var(--muted); margin-bottom: 6px; }
.photo-proposal__pair img { display: block; width: 100%; height: 260px; object-fit: scale-down; }
.photo-proposal--enhanced .photo-proposal__pair img { height: 420px; }
@media (max-width: 680px) { .photo-proposal__pair { grid-template-columns: minmax(0, 1fr); } .photo-proposal__pair img { height: 220px; } }

/* Правка 91: пакет агента фотографий. */
.photo-batch-product { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; margin: 12px 0; }
.photo-batch-strip { display: flex; gap: 8px; overflow-x: auto; padding: 6px 0 10px; max-width: 100%; }
.photo-batch-product { min-width: 0; max-width: 100%; box-sizing: border-box; overflow: hidden; }
@media (max-width: 680px) { .photo-batch-items { grid-template-columns: minmax(0, 1fr); } }
.photo-batch-strip figure { margin: 0; flex: 0 0 96px; text-align: center; }
.photo-batch-strip img { width: 96px; height: 96px; object-fit: scale-down; background: #fff; border: 1px solid var(--border); border-radius: 6px; }
.photo-batch-strip figcaption { font-size: 11px; color: var(--muted); }
.photo-batch-items { list-style: none; padding: 0; margin: 6px 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
.photo-batch-item { background: #fff; border: 1px solid var(--border); border-radius: 8px; padding: 8px; display: grid; gap: 4px; align-content: start; min-width: 0; }
.photo-batch-item--rejected, .photo-batch-item--kept, .photo-batch-item--rolled_back { opacity: .55; }
.content button.photo-batch-item__img, .content button.photo-batch-item__img:hover { padding: 0 !important; background: #fff !important; border: 0 !important; cursor: zoom-in; }
.photo-batch-item__img img { display: block; width: 100%; height: 180px; object-fit: scale-down; }
.text-warn { color: #9a5b00; }

/* Правка 92: перелистывание фото в карточках. Блок фиксированного размера —
   высота не прыгает при смене фото; стрелки видны всегда (не только при
   наведении — на планшете наведения нет). */
.product-thumb-box { width: 156px; height: 156px; flex: 0 0 156px; }
table.products--compact .thumb-cell { width: 180px; }
.room-item-card__thumb { flex: 0 0 156px; }
@media (max-width: 680px) {
    .product-thumb-box { width: 112px; height: 112px; flex-basis: 112px; }
    .room-item-card__thumb { flex-basis: 112px; }
}
.photo-card { position: relative; display: inline-block; box-sizing: border-box; outline: none; touch-action: pan-y; }
.photo-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 8px; }
.photo-card > .photo-thumb { width: 100%; height: 100%; }
.photo-card__nav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 2; width: 26px; height: 26px; line-height: 22px;
    border-radius: 50%; font-size: 18px; text-align: center; cursor: pointer; box-shadow: 0 1px 3px rgba(0,0,0,.18); }
.photo-card__nav, .content button.photo-card__nav, .content button.photo-card__nav:hover {
    padding: 0 !important; background: rgba(255,255,255,.94) !important; color: var(--text) !important; border: 1px solid var(--border) !important; min-height: 0 !important; }
.photo-card__nav--prev { left: 3px; } .photo-card__nav--next { right: 3px; }
.photo-card__count { position: absolute; right: 4px; bottom: 4px; z-index: 2; background: rgba(255,255,255,.94); color: var(--text);
    font-size: 11px; line-height: 1; padding: 3px 5px; border-radius: 4px; border: 1px solid var(--border); pointer-events: none; }
.photo-card .photo-thumb__mark { bottom: 22px; }
/* Карточка товара: крупное фото со стрелками. */
.gallery__stage { position: relative; display: block; }
.gallery__stage .photo-card__nav { width: 40px; height: 40px; line-height: 36px; font-size: 24px; }
.gallery__stage .photo-card__nav--prev { left: 8px; } .gallery__stage .photo-card__nav--next { right: 8px; }
.gallery__stage .photo-card__count { font-size: 13px; padding: 4px 8px; right: 8px; bottom: 8px; }
.gallery__stage .product-hero__main-photo { display: block; width: 100%; height: 420px; object-fit: scale-down; }
@media (max-width: 680px) { .gallery__stage .product-hero__main-photo { height: 300px; } }
/* Подсказки: фото карточки — тот же блок с перелистыванием. */
.rec-card__photo { border: 0 !important; background: transparent !important; }
.rec-thumb-box, .rec-card__photo .photo-card, .rec-card__photo > .photo-thumb, .rec-card__photo > .photo-thumb__none { width: 100%; height: 100%; }

/* Правка 95, исправлено правкой 102: строка фильтра — фиксированное место
   флажка, гибкое место названия, отдельное место количества. Перенос
   только между словами (не дробим слова: overflow-wrap normal). */
.filters .facet-columns label.facet-option, .facet-columns label.facet-option {
    display: grid; grid-template-columns: 20px minmax(0, 1fr) auto; column-gap: 8px; align-items: start;
    flex-direction: initial; font-size: 14px; color: var(--text); padding: 3px 0; line-height: 1.35; cursor: pointer;
}
.facet-columns label.facet-option > input[type="checkbox"] { margin: 2px 0 0; width: 16px; height: 16px; min-width: 0; justify-self: start; }
.facet-option__name { min-width: 0; overflow-wrap: normal; word-break: normal; hyphens: manual; }
.facet-option__count { color: var(--muted); font-size: 13px; white-space: nowrap; font-variant-numeric: tabular-nums; text-align: right; }
.facet-option__count::before { content: "("; } .facet-option__count::after { content: ")"; }
.facet-columns label.facet-option--empty { opacity: 1; color: var(--muted); }
.facet-columns label.facet-option--empty .facet-option__name, .facet-columns label.facet-option--empty .facet-option__count { opacity: .55; }
@media (max-width: 680px) {
    .facet-columns { grid-template-columns: minmax(0, 1fr); }
    .filters .facet-columns label.facet-option, .facet-columns label.facet-option { font-size: 15px; padding: 5px 0; }
}

/* Правка 96: карточка серии или модели без артикула. */
.badge.series-badge { background: #eef1f7; color: #3c4a66; border: 1px solid #c9d1e3; font-weight: 600; white-space: nowrap; }
.series-notice { margin: 8px 0 12px; padding: 10px 12px; border: 1px solid #c9d1e3; background: #f5f7fb; border-radius: 8px; font-size: 14px; line-height: 1.4; }
.series-notice a { display: inline-block; margin-top: 4px; }

/* Правка 102: сворачивание бокового меню на широком экране — меню уходит
   целиком (без зарезервированной ширины), область контента занимает место. */
.sidebar__collapse-btn { margin-top: 8px; width: 100%; padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px;
    background: var(--panel); color: var(--muted); font-size: 13px; cursor: pointer; }
.nav-expand-btn { display: none; }
@media (min-width: 901px) {
    .shell--nav-collapsed .sidebar { display: none; }
    .shell--nav-collapsed .nav-expand-btn { display: inline-flex; align-items: center; gap: 6px; position: sticky; top: 0; z-index: 15;
        margin: -16px 0 12px; padding: 6px 12px; border: 1px solid var(--border); border-radius: 8px; background: var(--panel); cursor: pointer; font-size: 14px; }
}
@media (max-width: 900px) { .sidebar__collapse-btn { display: none; } }

/* Правка 106: мастер «Добавить поставщика». */
.onboarding-form { max-width: 720px; }
.onboarding-stages { display: flex; flex-wrap: wrap; gap: 6px; list-style: none; padding: 0; margin: 12px 0; }
.onboarding-stages li { padding: 4px 10px; border: 1px solid var(--border); border-radius: 999px; color: var(--muted); font-size: 0.9em; }
.onboarding-stages li.is-done { color: var(--text); border-color: var(--accent); }
.onboarding-stages li.is-done::before { content: "✓ "; color: var(--accent); }
.onboarding-stages li.is-current { color: var(--text); border-color: var(--accent); background: var(--accent-soft); }
.onboarding-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.onboarding-actions .inline-form { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.kv-grid { display: grid; grid-template-columns: minmax(0, max-content) minmax(0, 1fr); gap: 4px 16px; max-width: 760px; }
.kv-grid dt { color: var(--muted); }
.kv-grid dd { margin: 0; overflow-wrap: break-word; }
.onboarding-log { max-height: 420px; overflow: auto; padding-left: 18px; }
@media (max-width: 520px) {
    .kv-grid { grid-template-columns: minmax(0, 1fr); }
    .kv-grid dd { margin-bottom: 6px; }
}

/* Правка 106: увеличение в просмотре фото — натуральный размер файла,
   перемещение прокруткой; стрелки листания скрыты до выхода из увеличения. */
.photo-viewer__head { display: flex; gap: 8px; align-items: center; }
.photo-viewer__head .photo-viewer__title { flex: 1 1 auto; min-width: 0; }
.photo-viewer__main.is-zoomed { overflow: auto; display: block; cursor: zoom-out; -webkit-overflow-scrolling: touch; }
.photo-viewer__main.is-zoomed img { max-width: none; max-height: none; width: auto; height: auto; margin: 0 auto; }
.photo-viewer__main.is-zoomed .photo-viewer__nav { display: none; }
.photo-viewer__main.can-zoom:not(.is-zoomed) img { cursor: zoom-in; }
.official-docs { padding-left: 18px; }
.official-docs li { overflow-wrap: break-word; margin-bottom: 4px; }

/* Правка 107: выбор варианта модели в строке-карточке каталога. */
.visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.variant-switch { display: block; margin-top: 4px; }
.variant-switch__select { max-width: 100%; min-width: 0; width: 100%; font-size: 0.85em; padding: 2px 4px; }
.badge.variant-count { white-space: nowrap; }

/* Правка 109: карточка товара — навигация по блокам, компактные блоки, карточки похожих товаров. */
.detail-sections { display: flex; flex-wrap: wrap; gap: 6px 14px; margin: 18px 0 6px; padding: 8px 0; border-bottom: 1px solid var(--border);
    position: sticky; top: 0; background: var(--bg, #fff); z-index: 5; }
.detail-sections a { white-space: nowrap; font-size: 0.92em; }
.detail-anchor { display: block; position: relative; top: -60px; visibility: hidden; }
.detail-blocks { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr)); gap: 0 32px; }
.detail-block .section-title { margin-top: 18px; }
.product-cards { list-style: none; padding: 0; margin: 8px 0 14px; display: grid; gap: 14px;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 190px), 1fr)); }
.product-card { border: 1px solid var(--border); border-radius: 10px; padding: 10px; display: flex; flex-direction: column; gap: 4px; min-width: 0; background: var(--panel, #fff); }
.product-card__photo { display: flex; justify-content: center; }
.product-card__photo .rec-thumb-box, .product-card__photo .photo-card { width: 100%; height: 150px; }
.product-card__photo img.rec-thumb { width: auto; height: auto; max-width: 100%; max-height: 146px; object-fit: scale-down; }
.product-card__name { font-weight: 600; overflow-wrap: break-word; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.product-card__meta { font-size: 0.85em; color: var(--muted); overflow-wrap: break-word; }
.product-card__prices { font-size: 0.92em; }
.product-card__add { display: flex; gap: 6px; align-items: center; margin-top: auto; flex-wrap: wrap; }
.product-card__add .qty-stepper__input { width: 64px; }
/* Правка 109: перетаскивание фото в редактировании. */
.edit-photo--draggable { cursor: grab; }
.edit-photo.is-dragging { opacity: 0.5; outline: 2px dashed var(--accent); }
.photo-source-edit form { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 4px; }
.photo-source-edit input { min-width: 0; flex: 1 1 160px; }
/* Правка 109: панель обработки фотографий. */
.processing-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: flex-start; }
.processing-actions form { display: inline-flex; gap: 4px; flex-wrap: wrap; }
.processing-actions input { min-width: 0; width: 160px; }

/* Правка 110: вместимость помещения */
.stg-toast--error { background: var(--danger, #b42318); color: #fff; }
.seat-meter { display: inline-flex; gap: 6px; align-items: baseline; flex-wrap: wrap; }
.seat-meter--full strong { color: var(--danger, #b42318); }
.seat-meter--over { color: var(--danger, #b42318); font-weight: 600; }
button[data-seat-blocked], .qty-stepper button[disabled] { opacity: .45; cursor: not-allowed; }
.caster-options { border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px; }
.caster-option { display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: flex-end; padding: 4px 0; }
/* Правка 110: бронирование у поставщиков */
.booking { margin: 18px 0; }
.booking-group { border: 1px solid var(--border); border-radius: 10px; padding: 8px 12px; margin: 8px 0; background: var(--panel); }
.booking-group > summary { cursor: pointer; padding: 4px 0; }
/* Правка 113: блок компании — заголовок со сводным статусом, цветная полоса по статусу. */
.booking-group { border-left-width: 4px; }
.booking-group--confirmed { border-left-color: #2e7d4f; }
.booking-group--needs_answer, .booking-group--rejected, .booking-group--expired { border-left-color: #b3261e; }
.booking-group--sent, .booking-group--partial, .booking-group--prepared { border-left-color: #d8a12a; }
.booking-group__head { display: flex; flex-wrap: wrap; gap: 4px 12px; align-items: baseline; }
.booking-group__name { display: inline-flex; gap: 8px; align-items: baseline; flex-wrap: wrap; font-size: 1.05rem; }
.booking-group__meta { flex: 1 1 260px; }
.booking-group__comment { margin: 2px 0 6px; }
.booking-summary .badge { margin-right: 4px; }
.issue-supplier { margin: 4px 0; }
.issue-supplier > summary { cursor: pointer; }
.booking-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.booking-actions__form { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: flex-end; }
.booking-text textarea { width: 100%; max-width: 100%; box-sizing: border-box; font-family: inherit; }
.facet-search { width: 100%; box-sizing: border-box; margin: 0 0 6px; }
.facet-option input[disabled] + .facet-option__name { opacity: .55; }
.series-description { white-space: pre-line; max-width: 820px; margin: 8px 0; }
.series-photos-block { margin-top: 10px; }
.series-photos-block > summary { cursor: pointer; }
.series-photos { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; margin: 10px 0; }
.series-photos__item { display: flex; align-items: center; justify-content: center; aspect-ratio: 1; background: #fff; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
.series-photos__item img { max-width: 100%; max-height: 100%; object-fit: scale-down; }
/* Правка 110: описание из фактов карточки */
.description-facts { display: grid; grid-template-columns: minmax(140px, max-content) 1fr; gap: 4px 14px; margin: 6px 0; }
.description-facts dt { color: var(--muted, #667); }
.description-facts dd { margin: 0; overflow-wrap: anywhere; }
.description-text { white-space: pre-line; max-width: 860px; }
@media (max-width: 560px) { .description-facts { grid-template-columns: 1fr; } .description-facts dt { margin-top: 6px; } }
/* Правка 110: фото низкого разрешения — не растягивается, с отметкой */
img.is-low { width: auto !important; height: auto !important; max-width: min(100%, 160px) !important; max-height: min(100%, 160px) !important; image-rendering: auto; opacity: .92; }
.photo-thumb__mark--low { background: #fdeecb; color: #7a4d00; }
.supplier-filter { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0; }
.supplier-filter input { flex: 1 1 220px; min-width: 0; }
/* Правка 110: длинные подписи колёс не расширяют страницу на телефоне */
.casters-edit .variant-edit__form, .casters-edit label { min-width: 0; max-width: 100%; }
.casters-edit select { max-width: 100%; min-width: 0; width: 100%; box-sizing: border-box; }

/* Правка 116: условия словесного поиска */
.nl-conditions { display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: center; margin: 6px 0 10px; }
.nl-condition label { display: inline-flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.nl-condition select, .nl-condition input[type=number] { max-width: 100%; }
.nl-unknown { margin-top: 10px; }
.nl-unknown summary { cursor: pointer; color: var(--muted, #666); }

/* Правка 116: список поставщиков — показатели качества и меню действий */
.quality-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.quality-chip { display: inline-flex; gap: 4px; align-items: baseline; padding: 2px 8px; border-radius: 999px; font-size: 13px; text-decoration: none; color: inherit; border: 1px solid var(--border, #ddd); white-space: nowrap; }
/* Правка 117: раскрываемая подсказка показателя */
details.quality-chip { position: relative; display: inline-block; }
details.quality-chip > summary { list-style: none; cursor: pointer; display: inline-flex; gap: 4px; align-items: baseline; }
details.quality-chip > summary::-webkit-details-marker { display: none; }
.quality-chip__panel { position: absolute; z-index: 20; top: calc(100% + 6px); left: 0; min-width: 260px; max-width: min(340px, calc(100vw - 32px));
  white-space: normal; background: var(--surface, #fff); color: var(--text, #222); border: 1px solid var(--border, #ddd); border-radius: 8px;
  padding: 10px 12px; box-shadow: 0 6px 18px rgba(0,0,0,.12); font-size: 13px; }
.quality-chip__panel ul { margin: 0 0 6px; }
.quality-chip--good { background: #e7f4ec; border-color: #b9dcc6; }
.quality-chip--mid { background: #fdf3dc; border-color: #ecd6a0; }
.quality-chip--low { background: #fbe7e4; border-color: #e9b9b1; }
.quality-chip--na { background: #eef0f3; border-color: #d5d9df; }
.action-menu { position: relative; display: inline-block; }
.action-menu > summary { list-style: none; cursor: pointer; }
.action-menu > summary::-webkit-details-marker { display: none; }
.action-menu__list { position: absolute; right: 0; z-index: 20; min-width: 260px; max-width: calc(100vw - 32px); background: var(--surface, #fff); border: 1px solid var(--border, #ddd); border-radius: 8px; box-shadow: 0 6px 24px rgba(0,0,0,.12); padding: 6px; display: flex; flex-direction: column; }
.action-menu__list a, .action-menu__list .link-button { display: block; padding: 8px 10px; text-align: left; white-space: normal; }
.supplier-list__actions { display: flex; gap: 8px; align-items: flex-start; flex-wrap: wrap; }
.update-wizard fieldset { border: 1px solid var(--border, #ddd); border-radius: 8px; padding: 10px 14px; margin-bottom: 12px; display: flex; flex-direction: column; gap: 6px; }
.update-wizard select, .update-wizard textarea { max-width: 100%; margin-left: 24px; }
.update-wizard__problems { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-left: 24px; }
/* Правка 117: переключатель области — круг, данные — квадрат; уточнение области — под выбранным вариантом */
.update-wizard label.choice { display: flex; align-items: center; gap: 8px; font-weight: normal; margin: 0; cursor: pointer; }
.update-wizard label.choice input[type=radio], .update-wizard label.choice input[type=checkbox] { width: 18px; height: 18px; min-width: 18px; margin: 0; padding: 0; flex: none; box-shadow: none; }
.update-wizard label.choice input[type=radio] { appearance: auto; -webkit-appearance: radio; border-radius: 50%; }
.update-wizard label.choice input[type=checkbox] { appearance: auto; -webkit-appearance: checkbox; }
.update-wizard__option { display: flex; flex-direction: column; gap: 6px; padding: 4px 0; }
.update-wizard__option .update-wizard__detail:disabled, .update-wizard__option .update-wizard__detail input:disabled + span { opacity: .55; }
.update-wizard__option:not(.is-active) .update-wizard__detail { display: none; }
.update-preview__facts { display: grid; grid-template-columns: max-content 1fr; gap: 4px 14px; margin: 0 0 10px; }
.update-preview__facts dt { color: var(--muted, #666); }
.update-preview__facts dd { margin: 0; }
@media (max-width: 600px) { .update-preview__facts { grid-template-columns: 1fr; } .update-preview__facts dd { margin-bottom: 6px; } }
.is-highlighted { outline: 2px solid #2f5d4b; }
.settings-advanced { margin-top: 18px; }
.settings-advanced > summary { cursor: pointer; font-weight: 600; margin-bottom: 10px; }
.wizard-steps { margin: 12px 0; }
.wizard-steps__list { display: grid; gap: 4px; padding-left: 22px; }
.wizard-step--done strong::after { content: " ✓"; color: #2f7a4f; }
.wizard-step--na { color: var(--muted, #777); }
.wizard-step.is-current { font-weight: 600; }
/* Правка 117: быстрые фильтры «Качества каталога» */
.quality-filters { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 12px; }
.quality-filter { padding: 4px 10px; border-radius: 999px; border: 1px solid var(--border, #ddd); text-decoration: none; color: inherit; font-size: 14px; }
.quality-filter.is-active { background: var(--accent-soft, #e8f0fe); border-color: var(--accent, #3b6fd8); }
.quality-group--supplier h2 { color: var(--muted-strong, #555); }

/* Правка 117: отметки условий словесного поиска */
.nl-marks { display: inline-flex; flex-wrap: wrap; gap: 4px 8px; margin-left: 6px; }
.nl-mark { font-size: 12px; padding: 1px 6px; border-radius: 6px; white-space: normal; }
.nl-mark--ok { background: #e7f4ec; color: #1d5e35; }
.nl-mark--no { background: #fbe7e4; color: #8a2a1c; }
.nl-mark--unknown { background: #eef0f3; color: #4a5260; }
.nl-groups strong { font-weight: 600; }

/* Правка 118: «Источники и агенты» */
.agents-metric { background: var(--panel); border: 1px solid var(--border, #dde2e8); border-radius: 8px; padding: 10px 14px; margin: 10px 0 18px; }
.agents-metric h2 { margin: 0 0 4px; font-size: 16px; }
.agent-supplier { border-top: 1px solid var(--border, #dde2e8); padding: 12px 0 6px; }
.agent-supplier h3 { margin: 0 0 6px; }
.agent-supplier .processing-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 8px 0; }
.agent-supplier .inline-form input[type=text] { min-width: 0; width: 220px; max-width: 100%; }
.agent-supplier .inline-form select { max-width: 260px; }
.nowrap { white-space: nowrap; }
@media (max-width: 560px) { .agent-supplier .inline-form, .agent-supplier .inline-form label { width: 100%; } .agent-supplier .inline-form input[type=text], .agent-supplier .inline-form select { width: 100%; max-width: none; } }
.agent-supplier .description-facts { grid-template-columns: minmax(120px, max-content) minmax(0, 1fr); }
@media (max-width: 560px) { .agent-supplier .description-facts { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 560px) { .agent-supplier .nowrap { white-space: normal; } }

/* Правка 123: панель фильтров — применение кнопкой, своё расположение блоков. */
.filters-pending { position: sticky; bottom: 8px; z-index: 5; display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
    margin: 8px 0; padding: 8px 12px; border: 1px solid #e0c16a; background: #fff8e1; border-radius: 8px; font-size: 14px; flex-basis: 100%; }
.filters-pending[hidden] { display: none; }
.facet-layout-bar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.facet-tools { display: flex; flex-wrap: wrap; gap: 4px; margin: -2px 0 6px; }
.facet-tools__edit { display: none; gap: 4px; flex-wrap: wrap; }
#facetPanel.is-editing .facet-tools__edit { display: inline-flex; }
#facetPanel.is-editing .facet-columns > fieldset[data-block] { outline: 2px dashed #c9d1e3; outline-offset: 2px; }
#facetPanel .facet-tool, #facetPanel .facet-layout-bar button { font-size: 12px; font-weight: 500; padding: 2px 8px; min-height: 28px; width: auto; border: 1px solid var(--border); background: var(--surface, #fff); color: var(--text); border-radius: 6px; cursor: pointer; box-shadow: none; }
#facetPanel .facet-tool:hover, #facetPanel .facet-layout-bar button:hover { border-color: var(--accent); }
.facet-tool:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.facet-block--collapsed > :not(legend):not(.facet-tools) { display: none !important; }
.facet-block--collapsed { max-height: none !important; }
@media (min-width: 900px) {
    .facet-columns > fieldset.facet-block--wide { grid-column: span 2; }
    .facet-columns > fieldset.facet-block--full { grid-column: 1 / -1; }
}
.result-bar { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 4px 16px; }
.per-page { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.per-page__opt { display: inline-block; min-width: 40px; padding: 4px 8px; text-align: center; border: 1px solid var(--border); border-radius: 6px; text-decoration: none; }
.per-page__opt.is-active { background: var(--accent); color: #fff; border-color: var(--accent); font-weight: 600; }
.series-choice { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin: 8px 0; }
.series-choice__opt { display: inline-flex; align-items: center; gap: 6px; padding: 6px 10px; border: 1px solid #c9d1e3; background: #f5f7fb; border-radius: 8px; text-decoration: none; color: var(--text); min-height: 36px; }
.series-choice__opt:hover, .series-choice__opt:focus-visible { border-color: var(--accent); }
.series-choice__box { width: 16px; height: 16px; border: 2px solid #3c4a66; border-radius: 3px; flex: none; }
.nl-typos, .nl-excl { margin: 4px 0; }
.nl-excl .chip { display: inline-block; margin: 0 4px 2px 0; padding: 1px 8px; border-radius: 10px; background: #fdecea; color: #8a2a1e; text-decoration: line-through; }
.source-gap { margin-top: 8px; }
@media (max-width: 680px) { #facetPanel .facet-tool, #facetPanel .facet-layout-bar button { min-height: 40px; padding: 4px 10px; font-size: 14px; } }
#facetPanel .facet-tool:disabled { opacity: .4; cursor: default; }
/* Доп. проверка после правки 123: конфликт выбранного значения; устаревший список до применения. */
.facet-columns label.facet-option--conflict .facet-option__name { color: #8a2a1e; }
.facet-option__conflict { display: block; font-size: 12px; color: #8a2a1e; }
#results-table.is-stale { opacity: .45; transition: opacity .15s; }
.stale-note { margin: 6px 0; padding: 6px 10px; border-radius: 6px; background: #fff8e1; border: 1px solid #e0c16a; font-size: 14px; }
.stale-note[hidden] { display: none; }
/* Доп. проверка после правки 123: подсказка об опечатке под строкой поиска. */
.search-hint, .search-live-hint { flex-basis: 100%; margin: 0; }
.search-hint__line, .search-live-hint { margin: 2px 0 4px; padding: 6px 10px; border-radius: 6px; font-size: 14px; line-height: 1.45; overflow-wrap: anywhere; }
.search-hint__line--fixed { background: #eef4ff; border: 1px solid #c5d5f3; }
.search-hint__line--suggest, .search-live-hint { background: #fff8e1; border: 1px solid #e0c16a; }
.search-hint__action, .search-hint__opt { font-weight: 600; margin-left: 4px; }
.search-live-hint button { margin: 0 4px; padding: 2px 10px; min-height: 32px; border-radius: 6px; border: 1px solid #c9a227; background: #fff; color: var(--text); font-weight: 600; cursor: pointer; }
input[name="q"].has-typo { border-color: #c9a227; box-shadow: 0 0 0 2px rgba(201, 162, 39, .25); }
@media (max-width: 680px) { .search-live-hint button { min-height: 40px; } }
/* Пункт 1.4: цена и скидка строки в черновике КП. */
.kp-price-edit summary { cursor: pointer; color: var(--accent); }
.kp-price-edit__form { display: flex; flex-direction: column; gap: 4px; margin-top: 4px; min-width: 0; }
.kp-price-edit__form input { width: 100%; max-width: 160px; box-sizing: border-box; }
/* пакет 2.1: версия стилей обновлена вместе с ui.css (меню «⋯» на телефоне) */
/* Мастер поставщика: шапка состояния, фактический прогресс, единые этапы (доработка после проверки Alsav). */
.onb-status { border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; margin: 10px 0; background: var(--surface, #fff); min-width: 0; }
.onb-status--processing, .onb-status--queued { border-color: var(--info, #2f5f8a); }
.onb-status--awaiting, .onb-status--limited, .onb-status--paused { border-color: #ecd59b; }
.onb-status--error { border-color: #e2a59a; }
.onb-status__head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.onb-status__headline { margin: 8px 0; overflow-wrap: anywhere; }
.onb-status__headline .muted-sm { display: block; margin-top: 2px; }
.sum-check.warn { color: var(--warn, #8a5a00); }
.onb-progress { margin: 8px 0; }
.onb-progress__label { font-size: 14px; margin-bottom: 4px; overflow-wrap: anywhere; }
.onb-progress__track { height: 8px; border-radius: 6px; background: var(--border); overflow: hidden; }
.onb-progress__track span { display: block; height: 100%; background: var(--accent); }
.onb-progress__track--unknown span { width: 30%; animation: onb-indeterminate 1.6s ease-in-out infinite; opacity: .7; }
@keyframes onb-indeterminate { 0% { margin-left: -30%; } 100% { margin-left: 100%; } }
@media (prefers-reduced-motion: reduce) { .onb-progress__track--unknown span { animation: none; width: 100%; opacity: .35; } }
.onb-next { margin: 8px 0; }
.onb-next p { margin: 0 0 6px; font-size: 14px; }
.onb-next .btn-row { display: flex; flex-wrap: wrap; gap: 8px; }
.onb-next .inline-form { display: inline-block; margin: 0; max-width: 100%; }
.onb-next .btn-row button, .onb-next .btn-row .btn { white-space: normal; text-align: center; max-width: 100%; }
.onb-facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 2px 12px; font-size: 13px; margin: 8px 0 0; }
.onb-facts dt { color: var(--muted); }
.onb-facts dd { margin: 0; overflow-wrap: anywhere; }
.onb-limits { margin-top: 8px; }
.onb-limits ul { margin: 4px 0 0; padding-left: 18px; }
.onb-phases { margin: 12px 0; }
.onb-phases__list { padding-left: 22px; display: grid; gap: 4px; }
.onb-phase--done > strong::after, .onb-substep--done::before { content: "✓ "; color: #2f7a4f; }
.onb-phase--done > strong::after { content: " ✓"; }
.onb-phase--current > strong { color: var(--accent); }
.onb-phase--todo { color: var(--muted); }
.onb-substeps { list-style: none; padding-left: 4px; margin: 4px 0; font-size: 13px; }
.onb-substep--na, .onb-substep--todo, .onb-substep--skipped { color: var(--muted); }
.onb-substep--na::before { content: "— "; }
.onb-substep--skipped::before { content: "○ "; }
.onb-substep--current::before, .onb-substep--queued::before { content: "▸ "; color: var(--accent); }
@media (max-width: 560px) {
    .onb-facts { grid-template-columns: 1fr; }
    .onb-facts dd { margin-bottom: 4px; }
    .onb-next .btn-row > * { flex: 1 1 100%; display: block; }
    .onb-next .btn-row button, .onb-next .btn-row .btn { width: 100%; }
}

/* 23.10.2026: мастер поставщика — кандидаты официального сайта (только название, без файлов и сайта). */
.site-cands { list-style: none; margin: 0 0 12px; padding: 0; display: grid; gap: 10px; }
.site-cand { border: 1px solid var(--border, #e2e2df); border-radius: 8px; padding: 10px 12px; background: var(--panel, #fff); min-width: 0; }
.site-cand--likely { border-color: var(--accent); }
.site-cand__pick { display: flex; gap: 8px; align-items: flex-start; cursor: pointer; }
.site-cand__pick input { margin-top: 4px; flex: none; }
.site-cand__head { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; min-width: 0; }
.site-cand__url { overflow-wrap: anywhere; }
.site-cand__list { margin: 6px 0 4px; padding-left: 20px; font-size: 13px; }
.site-cand__list--warn { color: var(--warn-text, #8a5a00); }
.site-search__custom { margin-top: 12px; }
.site-search__custom .field { max-width: 520px; }

/* 23.10.2026: мастер поставщика — найденный сайт одной строкой, выбор при дубле (без наложения на 768 px),
   файлы сайта и предварительный результат с конфликтами. */
.site-found__line { font-size: 17px; margin: 0 0 10px; overflow-wrap: anywhere; }
.site-found__actions { margin-bottom: 8px; }
.site-found__why summary, .site-search__others summary { cursor: pointer; }
.dup-choice { border: 1px solid var(--border, #e2e2df); border-radius: 8px; padding: 10px 12px 12px; margin: 0 0 14px; min-width: 0; }
.dup-choice legend { padding: 0 4px; font-weight: 600; }
.dup-choice label.choice, .merge-conflict label.choice { display: flex; gap: 8px; align-items: flex-start; margin: 6px 0; font-weight: normal; cursor: pointer; min-width: 0; }
.dup-choice label.choice input, .merge-conflict label.choice input { margin-top: 3px; flex: none; }
.dup-choice label.choice > span, .merge-conflict label.choice > span { min-width: 0; overflow-wrap: anywhere; }
.merge-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 12px; }
.merge-chips a.status { text-decoration: none; }
.merge-conflicts { list-style: none; margin: 0 0 10px; padding: 0; display: grid; gap: 8px; }
.merge-conflict fieldset { border: 1px solid var(--border, #e2e2df); border-radius: 8px; padding: 8px 12px; margin: 0; min-width: 0; }
.merge-conflict.is-resolved fieldset { border-color: var(--accent); }
.merge-conflict legend { padding: 0 4px; overflow-wrap: anywhere; }
.merge-kind { max-width: 640px; }
.merge-sources { columns: 2 320px; }
.merge-table td { overflow-wrap: anywhere; }
/* поле выбора файлов мастера: стандартное поле скрыто визуально (остаётся доступным), видна кнопка и подпись */
.file-pick { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; position: relative; }
.file-pick .file-pick__input { position: absolute; width: 1px; height: 1px; opacity: 0; overflow: hidden; clip: rect(0 0 0 0); border: 0; padding: 0; }
.file-pick__btn { cursor: pointer; margin: 0; }
.file-pick__input:focus-visible + .file-pick__btn { outline: 2px solid var(--focus, var(--accent)); outline-offset: 2px; }
.merge-thumb { width: 64px; height: 64px; object-fit: contain; float: right; margin: 0 0 4px 8px; border: 1px solid var(--border, #e2e2df); border-radius: 6px; background: #fff; }
.merge-held li { margin: 4px 0; overflow-wrap: anywhere; }

/* 31.10.2026: совпадения по артикулу над результатами поиска */
.article-hits { border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; margin: 8px 0 12px; background: var(--panel); }
.article-hits__head { margin: 0 0 6px; }
.article-hits__list { margin: 0; padding-left: 18px; }
.article-hits__item { margin: 2px 0; overflow-wrap: anywhere; }

/* 31.10.2026: поиск по фото */
.photo-results { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
.photo-results__item { border: 1px solid var(--border); border-radius: 8px; padding: 8px; background: var(--panel); min-width: 0; }
.photo-results__item img { width: 100%; height: 180px; object-fit: contain; background: #fff; border-radius: 4px; }
.photo-results__meta { margin-top: 6px; overflow-wrap: anywhere; }

/* 31.10.2026: кнопка и окно «Найти по фото» */
.photo-search-button { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border-radius: 6px;
    background: var(--accent, #2f7d4f); color: #fff; text-decoration: none; font-weight: 600; white-space: nowrap; }
.photo-search-button:hover { filter: brightness(0.92); }
.photo-dialog { border: 1px solid var(--border); border-radius: 10px; padding: 0; width: min(520px, calc(100vw - 32px)); }
.photo-dialog::backdrop { background: rgba(0, 0, 0, .35); }
.photo-dialog__form { padding: 16px; display: flex; flex-direction: column; gap: 10px; }
.photo-dialog__form h2 { margin: 0; }
.photo-drop { display: flex; align-items: center; justify-content: center; min-height: 180px; border: 2px dashed var(--border);
    border-radius: 8px; padding: 12px; text-align: center; cursor: pointer; background: var(--panel); position: relative; }
.photo-drop input[type=file] { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
.photo-drop--over { border-color: var(--accent, #2f7d4f); }
.photo-drop__preview { max-width: 100%; max-height: 240px; object-fit: contain; }
.photo-dialog__actions { display: flex; flex-wrap: wrap; gap: 8px; }
.photo-dialog__busy { display: flex; align-items: center; gap: 8px; margin: 0; }
.spinner { width: 16px; height: 16px; border: 2px solid var(--border); border-top-color: var(--accent, #2f7d4f); border-radius: 50%;
    animation: spin .8s linear infinite; display: inline-block; }
@keyframes spin { to { transform: rotate(360deg); } }
.photo-found { background: #e7f3ec; color: #1f5c39; }
