/* ── Экран инвентаризации (тема iiko.css) ───────────────────────── */
#screen-inventory .inv-body { padding: 16px; display: flex; flex-direction: column; gap: 12px; }
#screen-inventory .btn-lg { width: 100%; justify-content: center; }
.inv-status { font-size: 14px; color: var(--ink-muted); }
/* ── Карточка активного черновика (AI-3527) ───────────────────────────
   Была строка из двух кнопок: «Продолжить инвентаризацию» с датой внутри подписи
   + красная «Удалить» с текстом. Стало: карточка (тот же визуальный язык, что у
   .inv-hist-card ниже) с заголовком, подписью «создана … · посчитано N позиций»,
   иконкой корзины в правом верхнем углу и кнопкой «Продолжить» на всю ширину.
   Кнопка одна на оба состояния: без черновика карточка получает --empty и
   становится прозрачной, оставляя обычную кнопку «Начать новую инвентаризацию». */
.inv-draft-card {
  position: relative;
  display: flex; flex-direction: column; gap: 4px;
  padding: 12px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}
.inv-draft-title {
  font-size: 15px; font-weight: 700; color: var(--ink);
  padding-right: 40px;   /* место под корзину, иначе длинный заголовок под неё уезжает */
}
.inv-draft-sub {
  font-size: 12px; color: var(--ink-muted); line-height: 1.35;
  padding-right: 40px;
}
#screen-inventory .inv-draft-card .inv-draft-del {
  position: absolute; top: 6px; right: 6px;
  width: auto; min-height: 0;
  color: var(--ink-faint);
}
#screen-inventory .inv-draft-card .btn[data-inv-online] {
  width: 100%; justify-content: center; margin-top: 8px;
}
/* Черновика нет — карточка невидима, остаётся только кнопка */
.inv-draft-card--empty { background: none; border-color: transparent; padding: 0; }
#screen-inventory .inv-draft-card--empty .btn[data-inv-online] { margin-top: 0; }
.inv-status-msg { font-size: 14px; color: var(--ink-muted); padding: 8px 2px; }
/* Спиннер загрузки — оверлей поверх контента (но НЕ поверх шапки с «Назад»),
   не двигает список истории. */
.inv-loading-overlay {
  position: fixed; left: 0; right: 0; bottom: 0;
  top: calc(var(--header-h) + var(--safe-top));
  z-index: 60;
  display: flex; align-items: center; justify-content: center;
  background: var(--surface-page);
}
.inv-loading-overlay .flow-loader-screen { min-height: 0; flex: 0 1 auto; }

/* Скелетон-загрузчик списка истории (как у остатков на складах) */
.inv-hist-skel { cursor: default; }
.inv-hist-skel .sk { border-radius: 6px; }
.inv-validate { display: flex; flex-direction: column; gap: 6px; }
.inv-row {
  display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center;
  padding: 8px 10px; background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}
.inv-row.is-low { background: var(--warning-bg); }
.inv-row select {
  padding: 6px 8px; border: 1px solid var(--border);
  border-radius: var(--radius-sm); background: var(--surface); color: var(--ink);
}
.inv-row-name { font-size: 14px; }
.inv-row-sub { font-size: 12px; color: var(--ink-subtle); }

/* Печать бланка — серверный PDF (backend/inventory/pdf.py), CSS для печати не нужен. */

/* ── Онлайн-форма инвентаризации ─────────────────────────────────────── */
/* Экран — колонка во всю высоту: список скролится, кнопка всегда под ним. */
#screen-inventory-form.is-active.uses-shell {
  height: 100dvh; min-height: 0; max-height: 100dvh;
  /* контекст позиционирования для плавающей кнопки голоса (AI-3566): fixed
     привязался бы к вьюпорту и уехал бы при показе клавиатуры */
  position: relative;
}
#screen-inventory-form .app-header {
  justify-content: space-between; flex-shrink: 0; flex-wrap: wrap; gap: 4px;
  height: auto; min-height: calc(var(--header-h) + var(--safe-top));
  padding-top: calc(8px + var(--safe-top)); padding-bottom: 8px;
}
.invf-headbtns { display: flex; flex: 1; min-width: 0; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 4px; }
.invf-tagtools { display: flex; align-items: center; gap: 4px; }
.invf-save { font-size: 12px; color: var(--ink-muted); margin-right: 4px; }
.invf-metarow {
  flex-shrink: 0; display: flex; align-items: center; justify-content: space-between;
  gap: 8px; padding: 8px 12px 4px 16px;
}
.invf-meta { font-size: 13px; color: var(--ink-muted); }
.invf-metabtns { display: flex; gap: 4px; flex-shrink: 0; }
.invf-metarow .btn { flex-shrink: 0; }
[data-share-qr] img { width: 200px; height: 200px; image-rendering: pixelated; }
.invf-search {
  flex-shrink: 0; display: flex; align-items: center; gap: 8px;
  margin: 4px 12px 8px; padding: 0 12px;
  background: var(--surface); border: 1px solid var(--hairline);
  border-radius: var(--r-lg); color: var(--ink-muted);
}
.invf-search input {
  /* min-width:0 — иначе поле не сжимается и чип сортировки рядом вылезает
     за контейнер на узком экране (AI-3182) */
  flex: 1; min-width: 0; border: none; background: transparent; outline: none;
  padding: 10px 0; font-size: 14px; color: var(--ink);
}
/* One clear control across browsers, including WebKit's search inputs. */
.invf-search input::-webkit-search-cancel-button { -webkit-appearance: none; }
.invf-search-clear {
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
  width: 44px; height: 44px; margin-right: -10px; padding: 0;
  border: none; border-radius: var(--r-sm); background: transparent;
  color: var(--ink-muted); cursor: pointer;
}
.invf-search-clear[hidden] { display: none; }
.invf-search-clear:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
/* Чипы фильтра/сортировки (AI-3106, уплотнены в AI-3169) */
.invf-chips { display: flex; gap: 6px; flex-shrink: 0; }

/* Нижний бар с «Завершить» (AI-3182): кнопка нужна в конце работы, а место
   сверху дефицитное. Последний flex-ребёнок экрана — прижат к низу, список
   скроллится над ним и не прячет последнюю строку под кнопкой. */
.invf-footer {
  flex-shrink: 0; display: flex; align-items: stretch; gap: 12px;
  padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0px));
  /* фон страницы, а не белый: бар — часть экрана, а не карточка поверх списка */
  background: var(--surface-page); border-top: 1px solid var(--hairline);
}
.invf-footer .btn { flex: 1; min-width: 0; }
/* Пока поднята экранная клавиатура, бар прячем (AI-6704): экран растянут по
   видимой полосе (--vvh), поэтому бар вставал ровно на кромку клавиатуры и
   съедал строку списка в самом дефицитном месте. Класс kb-open ставит
   js/util/viewport_fit.js. Завершают инвентаризацию с закрытой клавиатурой. */
html.kb-open:not(.sheet-open) .invf-footer { display: none; }
/* За попапом сохраняем место футера, чтобы список не менял высоту. */
html.sheet-open .invf-footer { visibility: hidden; }

/* Расхождение в строке — только в режиме сортировки: иначе порядок строк
   выглядит случайным и непонятно, что делает чип (AI-3182). */
.invf-rowdiff { font-size: 11px; font-weight: 400; color: var(--ink-muted); }
.invf-rowdiff.is-short { color: var(--danger); }
.invf-rowdiff.is-over { color: var(--success); }
.invf-body:not(.invf-show-diff) .invf-rowdiff { display: none; }
/* Подпись расхождения — третья строка в ячейке имени, фиксированных 60px мало. */
.invf-body.invf-show-diff .invf-item .invf-cell {
  height: auto; min-height: 60px; padding-top: 6px; padding-bottom: 6px;
}
.invf-chip {
  display: inline-flex; align-items: center; gap: 4px;
  border: 1px solid var(--hairline-strong); border-radius: 999px;
  background: var(--surface); color: var(--ink-muted);
  font-size: 12px; padding: 6px 10px; cursor: pointer; white-space: nowrap;
}
/* Включённый чип должен читаться однозначно: иначе спрятанные фильтром строки
   выглядят как «позиции пропали». Акцентный, а не чёрный: чёрный спорил с
   кнопкой «Завершить» рядом (AI-3169). */
.invf-chip[aria-pressed="true"] {
  background: var(--accent); color: #fff; border-color: var(--accent);
}
.invf-chip[hidden] { display: none; }

/* Пометка о неуехавшей правке — рядом с «Завершить». Успешный автосейв молчит. */
.invf-unsaved { font-size: 11px; color: var(--danger); white-space: nowrap; }
.invf-unsaved[hidden] { display: none; }

/* Размеры тары — справка: ⓘ рядом с ед.изм, список раскрывается под названием. */
.invf-info {
  display: inline-flex; align-items: center; justify-content: center;
  margin-left: 4px; padding: 0; width: 18px; height: 18px;
  border: none; background: transparent; color: var(--ink-subtle); cursor: pointer;
  vertical-align: -3px;
}
.invf-info[aria-expanded="true"] { color: var(--accent-deep); }
/* Список фасовок ушёл в чёрный тултип (util/tooltip.js): строка больше не
   растёт и не дёргает скролл (AI-3229). */
/* Неактивный чип — серый: жёлтый читался как предупреждение и спорил с
   остальной шапкой (AI-3203). Активный остаётся акцентным. */
.invf-chip-warn {
  background: var(--surface-sunken); color: var(--ink-muted); border-color: transparent;
}

/* Поиск, группа и порядок строк — одна строка (AI-3203):
   поиск занимает свободное место, селекты сохраняют компактную ширину.
   Нативный select даёт системный пикер на телефоне. */
.invf-controls {
  flex-shrink: 0; display: flex; align-items: stretch; gap: 8px;
  margin: 4px 12px 8px;
}
/* box-sizing обязателен: без него паддинги и рамка добавляются к flex-базису и
   правый контрол вылезает за экран (замер: 384px при вьюпорте 383). */
.invf-controls .invf-search { flex: 1 1 0; min-width: 0; margin: 0; box-sizing: border-box; }
.invf-sortbox, .invf-groupbox {
  flex: 0 0 clamp(112px, 35vw, 156px); min-width: 0; box-sizing: border-box;
  /* 12px справа — нативная стрелка select иначе липнет к тексту (AI-3246) */
  display: flex; align-items: center; padding: 0 12px 0 10px;
  background: var(--surface); border: 1px solid var(--hairline);
  border-radius: var(--r-lg);
}
.invf-groupbox { flex-basis: clamp(90px, 23vw, 112px); }
.invf-sortbox:focus-within, .invf-groupbox:focus-within {
  outline: 2px solid var(--accent); outline-offset: 2px;
}
@media (max-width: 380px) {
  .invf-controls { gap: 6px; }
  .invf-controls .invf-search { padding: 0 8px; }
  .invf-controls .invf-search > .ic { display: none; }
}
.invf-sortsel {
  width: 100%; min-width: 0; border: none; background: transparent; outline: none;
  padding: 9px 0; font-size: 13px; color: var(--ink-muted); cursor: pointer;
  text-overflow: ellipsis;
}
.invf-zprogress {
  font-size: 11px; font-weight: 400; letter-spacing: 0;
  text-transform: none; color: var(--ink-subtle);
}

/* Tag visibility is independent of filtering: show labels only in edit mode. */
.invf-tags {
  --invf-tag-bg: #e6f1ff; --invf-tag-ink: #1c4a92; --invf-tag-border: #b9d2f3;
  display: none; flex-wrap: wrap; align-items: center; gap: 8px; width: 100%; margin-top: 6px;
}
.invf-edit-tags .invf-tags { display: flex; }
.invf-tag {
  display: inline-flex; align-items: center; max-width: 100%; box-sizing: border-box;
  border: 1px solid var(--invf-tag-border); border-radius: var(--r-full);
  padding: 0 6px; background: var(--invf-tag-bg); color: var(--invf-tag-ink);
  font-size: 11px; font-weight: 400; line-height: 1.4;
}
.invf-tag > span { min-width: 0; overflow-wrap: anywhere; white-space: normal; }
.invf-tag-add, .invf-tag-remove {
  display: none; align-items: center; justify-content: center; flex-shrink: 0;
  position: relative; width: 18px; height: 15.4px; padding: 0; border: none; border-radius: var(--r-full);
  background: transparent; color: var(--invf-tag-ink); cursor: pointer;
}
.invf-tag-add { width: 20px; height: 17.4px; border: 1px dashed var(--invf-tag-border); }
/* Keep compact visuals while extending the pointer target into the row gap. */
.invf-tag-add::after, .invf-tag-remove::after { content: ''; position: absolute; inset: -4px -3px; }
.invf-tag-add .ic, .invf-tag-remove .ic { width: 12px; height: 12px; }
.invf-edit-tags .invf-tag { padding: 0 4px 0 6px; }
.invf-edit-tags .invf-tag-add, .invf-edit-tags .invf-tag-remove { display: inline-flex; }
.invf-tag-add:hover, .invf-tag-remove:hover { background: var(--invf-tag-border); }
.invf-tag-add:focus-visible, .invf-tag-remove:focus-visible, .invf-tag-choice:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 2px;
}
.invf-tag-add:disabled, .invf-tag-remove:disabled, .invf-tag-choice:disabled { opacity: .5; cursor: default; }
.invf-tag-picker { display: flex; flex-direction: column; gap: 8px; }
.invf-tag-picker label { display: flex; flex-direction: column; gap: 8px; font-size: 13px; color: var(--ink-muted); }
.invf-tag-picker input {
  width: 100%; box-sizing: border-box; min-height: 44px; padding: 10px 12px;
  border: 1px solid var(--hairline-strong); border-radius: var(--r-md);
  font-size: 16px; background: var(--surface); color: var(--ink);
}
.invf-tag-picker input:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
.invf-tag-choices { display: flex; flex-direction: column; gap: 8px; }
.invf-tag-choice {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  min-height: 44px; padding: 10px 12px; text-align: left;
  border: 1px solid var(--hairline); border-radius: var(--r-md);
  background: var(--surface); color: var(--ink); font: inherit; cursor: pointer;
}
.invf-tag-choice > span, .invf-tag-create > span { min-width: 0; overflow-wrap: anywhere; white-space: normal; }
.invf-tag-choice:hover { border-color: var(--accent); }
.invf-tag-error { color: var(--danger); font-size: 13px; }
.invf-tag-error:empty { display: none; }

/* Индикатор состояния строки — в закреплённой колонке имени: остальные колонки
   уезжают в горизонтальный скролл и на телефоне не видны. Включается только
   после «Завершить» или при включённом фильтре (класс на .invf-body). */
.invf-show-status .invf-item.invf-st-untouched .invf-cell-name { border-left: 3px solid var(--warning-dot); padding-left: 7px; }
.invf-show-status .invf-item.invf-st-filled .invf-cell-name { border-left: 3px solid var(--success); padding-left: 7px; }
.invf-show-status .invf-item.invf-st-error .invf-cell-name { border-left: 3px solid var(--danger); padding-left: 7px; }
/* Заливка — только у блокирующих строк. У непосчитанных достаточно полосы:
   при включённом фильтре незаполненными оказываются все видимые строки, и
   заливка на каждой перестала бы что-либо сообщать. */
.invf-show-status .invf-item.invf-st-error,
.invf-show-status .invf-item.invf-st-error .invf-cell-name { background: var(--danger-bg); }
.invf-rowhint { font-size: 11px; font-weight: 400; color: var(--danger); }

/* Единый скроллер (обе оси) — для sticky-шапки зоны и фикс-колонки имени. */
.invf-body {
  flex: 1 1 auto; min-height: 0; overflow: auto; -webkit-overflow-scrolling: touch;
  background: var(--surface-page);  /* беж вокруг таблицы */
  /* Строки меняют высоту (подписи расхождений, статусы, тултип-кнопки), и
     браузерный scroll anchoring «догонял» позицию — список уезжал сам собой
     во время заполнения (замер: scrollTop 0 → 18576). Отключаем якорение:
     позицию задаёт только человек и явный scrollIntoView (AI-3246). */
  overflow-anchor: none;
}
.invf-row, .invf-item { overflow-anchor: none; }

/* Строка = flex, ширину задаёт контейнер (.invf-body), а не контент строки:
   с width:max-content каждая строка считала свою ширину по самому длинному
   названию — правый край рвался, а sticky-колонка «Факт» наезжала на «Остаток»
   (AI-3287). auto + min-width:100% — таблица всегда во всю ширину рабочей
   области; когда она уже контента, работает горизонтальный скролл самого
   .invf-body. Фон строки белый — сама таблица на белом, вокруг беж. */
.invf-body .invf-row { display: flex; width: auto; min-width: 100%; margin: 0; background: var(--surface); }
.invf-cell {
  flex: 0 0 auto; display: flex; align-items: center;
  padding: 0 10px; min-width: 0; box-sizing: border-box;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Ширины колонок: имя | Остаток | Факт | Коробки | Размер | Итого */
.invf-row > .invf-cell:nth-child(1) { width: 150px; }
.invf-row > .invf-cell:nth-child(2) { width: 74px; justify-content: flex-end; }
.invf-row > .invf-cell:nth-child(3) { width: 78px; }
.invf-row > .invf-cell:nth-child(4) { width: 76px; }
.invf-row > .invf-cell:nth-child(5) { width: 88px; }
.invf-row > .invf-cell:nth-child(6) { width: 74px; justify-content: flex-end; }
/* Ввод коробок скрыт (AI-3169): остаются Название · Остаток · Факт. Название —
   растяжимая колонка (AI-3287): слак (и сжатие на узком экране) достаётся ей,
   числовые колонки фиксированы. «Факт» — 96px, под сумму + круглую «+». */
.invf-nobox .invf-row > .invf-cell:nth-child(1) { width: auto; flex: 1 1 auto; min-width: 132px; }
.invf-nobox .invf-row > .invf-cell:nth-child(2) { width: 78px; justify-content: flex-end; }
.invf-nobox .invf-row > .invf-cell:nth-child(3) { width: 96px; }
/* Шаринг без «Остатка»: Название · Факт */
.invf-nobox.invf-nobal .invf-row > .invf-cell:nth-child(1) { min-width: 180px; }
.invf-nobox.invf-nobal .invf-row > .invf-cell:nth-child(2) { width: 100px; justify-content: flex-start; }

/* Шаринг без колонки «Остаток» — 5 колонок */
.invf-nobal .invf-row > .invf-cell:nth-child(2) { width: 78px; justify-content: flex-start; }
.invf-nobal .invf-row > .invf-cell:nth-child(3) { width: 76px; }
.invf-nobal .invf-row > .invf-cell:nth-child(4) { width: 88px; }
.invf-nobal .invf-row > .invf-cell:nth-child(5) { width: 74px; justify-content: flex-end; }

/* Фикс-колонка имени (sticky слева) */
.invf-cell-name {
  position: sticky; left: 0; z-index: 2;
  flex-direction: column; align-items: flex-start; justify-content: center;
  background: var(--surface); border-right: 1px solid var(--hairline);
  box-shadow: 2px 0 6px rgba(40, 30, 20, 0.04);
}
.invf-iname {
  font-size: 13px; font-weight: 600; color: var(--ink); line-height: 1.2;
  max-width: 100%;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; text-overflow: ellipsis; white-space: normal;
}
.invf-name-pack {
  font-size: 11px; font-weight: 400; color: var(--ink-subtle);
  max-width: 100%; overflow: hidden; text-overflow: ellipsis;
}

/* Строки позиций. Высота — auto/min-height (AI-3287): строка тянется под
   разбивку по местам под названием, а не режет её (было жёстко 60px). */
.invf-item { border-bottom: 1px solid var(--hairline); }
.invf-item .invf-cell { height: auto; min-height: 60px; padding-top: 8px; padding-bottom: 8px; font-size: 13px; }
.invf-bal { color: var(--ink-muted); }
.invf-total { font-weight: 700; font-variant-numeric: tabular-nums; }
.invf-muted, .invf-size-fixed { color: var(--ink-subtle); }

/* ── Записи подсчёта (AI-3287, место убрано в AI-6679) ───────────────────── */

/* Разбивка чипами под названием — числа записей в порядке ввода. Записи не
   склеиваются: два захода по 20 — два чипа, а не «40». Одиночная запись чипом
   не рисуется вовсе, её показывает сумма справа (RS.countParts). */
.invq-parts { display: flex; flex-wrap: wrap; gap: 3px; margin-top: 3px; }
/* Обёртка рендерится всегда (проще точечно обновлять innerHTML при поллинге/
   правке в шите) — без записей она пуста и не должна съедать место. */
.invq-parts:empty { display: none; margin-top: 0; }
.invq-part {
  font-size: 11px; font-weight: 400; line-height: 1.4;
  color: var(--ink-muted); background: var(--surface-raised);
  border: 1px solid var(--hairline-strong); border-radius: var(--r-full);
  padding: 0 6px; white-space: nowrap;
}
.invq-part b { font-weight: 600; color: var(--ink); }

/* Ячейка «Факт»: сумма записей + круглая «+». Пусто — «—», не «0». */
.invq-fact { display: flex; align-items: center; gap: 6px; width: 100%; justify-content: flex-end; cursor: pointer; }
.invq-sum { font-size: 15px; font-weight: 600; color: var(--ink); font-variant-numeric: tabular-nums; }
.invq-sum.is-empty { font-weight: 400; color: var(--ink-faint); }
.invq-add {
  width: 30px; height: 30px; min-height: 30px; padding: 0; flex: 0 0 auto;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--hairline-strong); border-radius: var(--r-full);
  background: var(--surface); color: var(--accent); cursor: pointer;
}
.invq-add:active { transform: scale(0.94); }
.invq-add.is-filled { background: var(--accent-soft); }

.invq-head {
  font-size: 11px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase;
  color: var(--ink-subtle); padding-bottom: 6px;
}

/* Формула внесённых значений: «40 + 25 = 65» (AI-6679 iter 2). Переносится на
   несколько строк, когда значений много — это не таблица, а именно выражение,
   поэтому wrap, а не скролл. */
.invq-formula {
  display: flex; flex-wrap: wrap; align-items: center; gap: 2px 6px;
  font-size: 18px; font-variant-numeric: tabular-nums; line-height: 1.5;
  margin-bottom: 12px;
  /* Место под строку формулы занято даже когда значений ещё нет (AI-6704):
     высота = .invq-term, поэтому первое значение не раздвигает шит вверх.
     Второй перенос строки (много значений) шит по-прежнему растит — это
     редко и происходит уже без клавиатуры на экране. */
  min-height: calc(1.5em + 6px); /* line-height + padding + border у .invq-term */
}
.invq-op { color: var(--ink-faint); font-weight: 400; }
.invq-res { font-weight: 700; color: var(--ink); }
/* Слагаемое — цель нажатия: выделяется, показывает ✕. Паддинг даёт палец,
   отрицательный margin возвращает визуальный ритм формулы. */
.invq-term {
  display: inline-flex; align-items: center; gap: 4px;
  min-height: 32px; padding: 2px 6px; margin: 0 -2px;
  border: 1px solid transparent; border-radius: var(--r-sm);
  background: transparent; color: var(--ink); cursor: pointer;
  font: inherit; font-variant-numeric: tabular-nums;
}
.invq-term:active { background: var(--surface-raised); }
.invq-term.is-sel {
  background: var(--surface-raised); border-color: var(--hairline-strong);
}
.invq-x { display: inline-flex; align-items: center; color: var(--danger); }

/* Ввод и «Добавить» — одной строкой: набрал и добавил, одним движением. */
.invq-entry { display: flex; align-items: stretch; gap: 8px; }
.invq-entry .invf-input {
  flex: 1 1 auto; min-width: 0; height: 48px; font-size: 16px; box-sizing: border-box;
  text-align: right; font-weight: 600; font-variant-numeric: tabular-nums; padding: 7px 12px;
}
.invq-entry .invf-input::placeholder { font-weight: 400; }
.invq-addbtn { flex: 0 0 auto; min-height: 48px; padding-left: 16px; padding-right: 18px; }
.invq-addbtn[disabled] { opacity: 0.45; }
.invq-tot {
  display: flex; justify-content: space-between; align-items: baseline;
  margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--hairline-strong);
  font-size: 14px; color: var(--ink-muted);
}
.invq-tot b { font-size: 20px; font-weight: 700; color: var(--ink); }

/* Шапка зоны (sticky сверху); имя зоны — угол (sticky слева+сверху) */
.invf-zhead { position: sticky; top: 0; z-index: 3; }
.invf-zhead .invf-cell {
  height: 42px; background: var(--accent-soft);
  border-bottom: 1px solid var(--hairline);
  font-size: 11px; font-weight: 700; color: var(--ink-subtle);
  text-transform: uppercase; letter-spacing: 0.6px;
}
/* В шапке зоны имя и прогресс — в одну строку (в обычных строках ячейка имени
   остаётся колонкой: там название и подписи друг под другом). */
.invf-zhead .invf-cell-name {
  /* justify-content:center из .invf-cell-name в колонке центрировал по вертикали,
     а после перевода в строку стал центрировать по горизонтали — имя зоны уезжало
     от левого края, в отличие от остальных заголовков (регресс AI-3222). */
  z-index: 4; flex-direction: row; align-items: center; justify-content: flex-start;
  gap: 6px;
}
.invf-zname { color: var(--ink); }

.ta-right { text-align: right; }

.invf-input {
  width: 100%; padding: 7px 6px; font-size: 13px;
  border: 1.5px solid var(--ink); border-radius: 8px;
  background: var(--surface); color: var(--ink); text-align: center;
  font-variant-numeric: tabular-nums; box-sizing: border-box;
}
.invf-input:disabled { border-color: var(--hairline); background: var(--surface-raised); }
.invf-select { padding: 6px 4px; text-align: left; }
.invf-select.invf-rec { font-weight: 700; }  /* выбран рекомендованный из накладных размер */

/* Итог завершения */
.invf-done { padding: 24px 16px; display: flex; flex-direction: column; gap: 12px; }
.invf-done-title { font-size: 17px; font-weight: 700; color: var(--ink); }
.invf-done-sub { font-size: 13px; color: var(--ink-muted); }
.invf-diffs { width: 100%; border-collapse: collapse; font-size: 13px; }
.invf-diffs th, .invf-diffs td {
  padding: 6px 8px; border-bottom: 1px solid var(--hairline); text-align: left;
}
.invf-diffs th { color: var(--ink-subtle); font-weight: 700; }

/* ── История инвентаризаций (список карточек на экране #screen-inventory) ─── */
.inv-history-divider {
  font-size: 11px; font-weight: 700; color: var(--ink-subtle);
  text-transform: uppercase; letter-spacing: 0.6px;
  padding: 4px 2px 2px;
  border-top: 1px solid var(--hairline);
  margin-top: 4px;
}
.inv-history-list {
  display: flex; flex-direction: column; gap: 6px;
}
.inv-hist-card {
  display: flex; flex-direction: column; gap: 4px;
  width: 100%; padding: 10px 12px;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-sm); cursor: pointer;
  text-align: left; font: inherit; color: var(--ink);
  transition: background 0.12s;
}
.inv-hist-card:active { background: var(--accent-soft); }
.inv-hist-main { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.inv-hist-date { font-size: 14px; font-weight: 600; color: var(--ink); }
.inv-hist-status { font-size: 12px; font-weight: 500; }
.inv-hist-status--done { color: var(--color-success, #2a8c4a); }
.inv-hist-status--active { color: var(--ink-muted); }
.inv-hist-sub { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.inv-hist-store { font-size: 12px; color: var(--ink-muted); }
.inv-hist-count { font-size: 12px; color: var(--ink-subtle); }
.inv-hist-empty { font-size: 13px; color: var(--ink-subtle); padding: 4px 2px; margin: 0; }

/* ── Экран распределения новых позиций по зонам ──────────────────────────────── */
#screen-inventory-zones.is-active.uses-shell {
  height: 100dvh; min-height: 0; max-height: 100dvh; display: flex; flex-direction: column;
}
#screen-inventory-zones .app-header { justify-content: flex-start; gap: 8px; flex-shrink: 0; }
.invz-title { font-size: 15px; font-weight: 600; color: var(--ink); }
.invz-body {
  flex: 1 1 auto; min-height: 0; overflow: auto; -webkit-overflow-scrolling: touch;
  padding: 12px 16px; display: flex; flex-direction: column; gap: 8px;
}
.invz-body .btn { width: 100%; justify-content: center; }

/* ── Detail экран инвентаризации (read-only таблица) ─────────────────────────── */
#screen-inventory-detail.is-active.uses-shell {
  height: 100dvh; min-height: 0; max-height: 100dvh; display: flex; flex-direction: column;
}
#screen-inventory-detail .app-header { justify-content: flex-start; gap: 8px; flex-shrink: 0; }
.invd-title {
  font-size: 15px; font-weight: 600; color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.invd-body {
  flex: 1 1 auto; min-height: 0; overflow: auto; -webkit-overflow-scrolling: touch;
  background: var(--surface-page);
}
/* Фиксированная шапка detail (мета+сводка+поиск) — не скроллится с таблицей */
.invd-fixedhead { flex-shrink: 0; background: var(--surface-page); }
.invd-fixedhead .invd-search { margin: 4px 0 8px; }

/* Фиксированный низ detail с кнопкой «Анализ и сведение» */
.invd-footer {
  flex-shrink: 0; padding: 10px 16px calc(10px + var(--safe-bottom, 0px));
  background: var(--surface-page); border-top: 1px solid var(--hairline);
}
.invd-footer .btn { width: 100%; justify-content: center; }
.invd-iiko-warn {
  margin: 8px 12px; padding: 8px 12px;
  background: var(--warning-bg, #fff7e0); border: 1px solid var(--warning-border, #e6c84a);
  border-radius: var(--radius-sm); font-size: 12px; color: var(--ink-muted);
}
.invd-meta {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 8px 16px 4px; font-size: 13px;
}
.invd-meta-status { font-weight: 600; color: var(--ink); }
.invd-meta-date { color: var(--ink-muted); }
.invd-meta-store { color: var(--ink-subtle); }

/* Сводка по излишкам/недостаче перед таблицей */
.invd-summary { display: flex; gap: 8px; padding: 4px 16px 12px; }
.invd-sum-card {
  flex: 1 1 0; min-width: 0; padding: 10px 12px;
  background: var(--surface); border: 1px solid var(--hairline);
  border-radius: var(--radius-sm); display: flex; flex-direction: column; gap: 2px;
}
.invd-sum-label {
  font-size: 10px; font-weight: 700; color: var(--ink-subtle);
  text-transform: uppercase; letter-spacing: 0.4px;
}
.invd-sum-val { font-size: 15px; font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.invd-sum-sub { font-size: 11px; color: var(--ink-muted); }
.invd-sum-surplus .invd-sum-val { color: var(--color-success, #2e7d32); }
.invd-sum-loss .invd-sum-val { color: var(--color-danger, #c62828); }
.invd-sum-net { background: var(--accent-soft); }
.invd-sum-net .invd-sum-val { color: var(--ink); }

/* Поиск под основным блоком — отделён воздухом сверху и снизу */
.invd-search { margin-top: 10px; margin-bottom: 10px; }

/* Сортируемые заголовки колонок */
.invd-th-sortable { cursor: pointer; user-select: none; -webkit-user-select: none; }
.invd-th-sortable:hover { color: var(--ink); }
.invd-th-active { color: var(--ink); }
.invd-sort-arrow { margin-left: 3px; font-size: 9px; }
.invd-empty, .invd-error {
  font-size: 14px; color: var(--ink-muted); padding: 24px 16px; margin: 0;
}
/* Без своего скролл-контейнера: единственный скроллер (обе оси) — .invd-body,
   чтобы корректно работали sticky-шапка (top) и фикс-колонка имени (left). */
.invd-wrap { padding: 0 0 16px; }
.invd-table {
  width: 100%; min-width: 420px; border-collapse: separate; border-spacing: 0;
  font-size: 13px; background: var(--surface);
}
.invd-th {
  padding: 8px 10px; background: var(--accent-soft);
  border-bottom: 1px solid var(--hairline);
  font-size: 11px; font-weight: 700; color: var(--ink-subtle);
  text-transform: uppercase; letter-spacing: 0.5px;
  position: sticky; top: 0; z-index: 2;
  white-space: nowrap;
}
.invd-td {
  padding: 8px 10px; border-bottom: 1px solid var(--hairline);
  color: var(--ink); vertical-align: middle;
}
.invd-th-name, .invd-td-name { text-align: left; min-width: 150px; max-width: 240px; }
.invd-th-unit, .invd-td-unit { text-align: left; min-width: 44px; color: var(--ink-muted); }
.invd-th-num, .invd-td-num { text-align: right; min-width: 68px; font-variant-numeric: tabular-nums; }
.invd-bal { color: var(--ink-muted); }
.invd-sum { color: var(--ink-muted); }
.invd-diff-pos { color: var(--color-success, #2e7d32); font-weight: 600; }
.invd-diff-neg { color: var(--color-danger, #c62828); font-weight: 600; }
.invd-row:nth-child(even) .invd-td { background: var(--surface-raised, #fafaf8); }

/* Фикс-колонка имени (sticky слева). Непрозрачный фон обязателен — иначе
   при горизонтальном скролле под ней просвечивают другие колонки. */
.invd-th-name, .invd-td-name {
  position: sticky; left: 0;
  background: var(--surface);
  border-right: 1px solid var(--hairline);
  box-shadow: 2px 0 6px rgba(40, 30, 20, 0.04);
}
.invd-td-name { z-index: 1; }
.invd-th-name { z-index: 3; background: var(--accent-soft); }  /* угол: над шапкой и колонкой */
.invd-row:nth-child(even) .invd-td-name { background: var(--surface-raised, #fafaf8); }

/* Карточка истории — две колонки: слева дата+№, справа суммы. Всё в две строки. */
.inv-hist-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.inv-hist-left { display: flex; flex-direction: column; gap: 2px; flex-shrink: 0; }
.inv-hist-doc {
  font-size: 12px; font-weight: 500; white-space: nowrap;
  color: var(--color-success, #2a8c4a);
}
.inv-hist-pos-count { color: var(--ink-subtle); font-weight: 400; }

/* Блок сумм справа: итог (жирно) сверху, излишки/недостача снизу — две строки */
.inv-hist-stats {
  display: flex; flex-direction: column; align-items: flex-end; gap: 2px;
  margin-left: auto; flex-shrink: 0; text-align: right;
}
.inv-hist-net {
  font-size: 14px; font-weight: 700; white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.inv-hist-subsums {
  display: flex; gap: 8px; white-space: nowrap;
  font-size: 11.5px; font-variant-numeric: tabular-nums;
}
.inv-hist-pos { color: var(--color-success, #2e7d32); }
.inv-hist-neg { color: var(--color-danger, #c62828); }

/* Кнопка «Показать ещё» в истории инвентаризаций */
.inv-hist-more {
  width: 100%; margin-top: 4px;
  justify-content: center;
}

/* ── Кнопка «Анализ расхождений» в шапке detail-экрана ─────────────────────── */
.inva-trigger-btn { margin-left: auto; flex-shrink: 0; }

/* ── Экран анализа расхождений ──────────────────────────────────────────────── */
#screen-inventory-analysis.is-active.uses-shell {
  height: 100dvh; min-height: 0; max-height: 100dvh; display: flex; flex-direction: column;
}
#screen-inventory-analysis .app-header { justify-content: flex-start; gap: 8px; flex-shrink: 0; }

.inva-body {
  flex: 1 1 auto; min-height: 0; overflow: auto; -webkit-overflow-scrolling: touch;
  background: var(--surface-page);
}

/* Строка периода анализа */
.inva-period {
  padding: 2px 16px 6px;
  font-size: 12px; color: var(--ink-muted);
}

/* Сводка-чипы по кодам гипотез */
.inva-chips {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 6px 16px 10px;
}
.inva-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 10px; border-radius: 100px;
  background: var(--accent-soft); border: 1px solid var(--hairline);
  font-size: 12px; color: var(--ink-muted); white-space: nowrap;
}
.inva-chip b { color: var(--ink); font-weight: 700; }
.inva-chip-unclass { opacity: 0.7; }

/* Подсказка «рецептуры и AI будут позже» */
.inva-footnote {
  padding: 0 16px 8px;
  font-size: 11px; color: var(--ink-subtle);
}

/* Таблица анализа: 7 колонок, min-width шире за счёт «Причины» */
.inva-table { min-width: 520px; }

/* Колонка «Причина» */
.inva-th-reason {
  text-align: left; min-width: 130px;
}
.inva-td-reason {
  text-align: left; min-width: 130px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px;
}
.inva-reason-none { color: var(--ink-subtle); }

/* Точки confidence */
.inva-dot {
  display: inline-block; width: 8px; height: 8px; border-radius: 50%;
  margin-right: 5px; vertical-align: middle; flex-shrink: 0;
}
.inva-dot-high { background: var(--color-success, #2e7d32); }
.inva-dot-med  { background: var(--color-warning, #e6a817); }
.inva-dot-low  { background: var(--color-danger, #c62828); opacity: 0.65; }

/* Метка гипотезы */
.inva-label { vertical-align: middle; }

/* Значок «ещё N» */
.inva-more {
  display: inline-block; margin-left: 5px;
  padding: 0 5px; border-radius: 8px;
  background: var(--hairline); color: var(--ink-muted);
  font-size: 11px; vertical-align: middle;
}

/* Строка с раскрытыми гипотезами */
.inva-row { cursor: pointer; }
/* Только строки у которых есть гипотезы — показывать указатель */
.inva-row:not([data-pid]) { cursor: default; }
.inva-row-open > .invd-td { background: var(--accent-soft) !important; }
.inva-row-open > .invd-td-name { background: var(--accent-soft) !important; }

.inva-expand-row > .inva-expand-td {
  padding: 0; background: var(--surface-raised, #fafaf8);
  border-bottom: 2px solid var(--hairline);
}
.inva-expand-body {
  padding: 10px 14px 12px;
  display: flex; flex-direction: column; gap: 10px;
}

/* Одна гипотеза внутри раскрытия */
.inva-hyp {
  display: flex; flex-direction: column; gap: 3px;
  padding: 8px 10px; border-radius: var(--radius-sm);
  background: var(--surface); border: 1px solid var(--hairline);
}
.inva-hyp-head {
  display: flex; align-items: center; gap: 0;
  font-size: 13px; font-weight: 600; color: var(--ink);
}
.inva-hyp-code {
  margin-left: auto; padding: 1px 6px; border-radius: 4px;
  background: var(--accent-soft); color: var(--ink-subtle);
  font-size: 11px; font-weight: 700; letter-spacing: 0.3px;
}
.inva-hyp-evidence {
  font-size: 12px; color: var(--ink-muted); line-height: 1.4;
}
.inva-hyp-action {
  font-size: 12px; color: var(--ink); font-weight: 500; line-height: 1.4;
}
.inva-action-icon {
  margin-right: 4px; color: var(--ink-muted);
}

/* ── Пресеты «Всегда по факту» v2 (именованные) ──────────────────────────── */

/* Обёртка панели */
.inva-preset-wrap {
  display: flex; align-items: stretch;
}

/* Круглые иконки-кнопки в шапке попапа состава (переименовать/удалить) */
.inva-edit-head-actions { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; margin-right: 6px; }
.inva-head-btn {
  width: 36px; height: 36px; min-height: 0; padding: 0; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
}
.inva-head-btn-warm { background: var(--accent-warm, #f5e6d0) !important; color: var(--color-brand, #b85c00) !important; border-color: transparent !important; }
.inva-head-btn-danger { background: var(--color-error, #c0392b) !important; color: #fff !important; border-color: transparent !important; }

/* Фиксированная полоса поиска — над скроллящейся таблицей, не едет с ней */
.inva-search-bar {
  flex-shrink: 0;
  background: var(--surface-page);
}
.inva-search-bar .invd-search { margin: 4px 0 8px; }

/* Панель — две строки */
.inva-preset-panel {
  flex: 1; display: flex; flex-direction: column; gap: 4px;
  padding: 6px 16px 6px; box-sizing: border-box;
}

/* Строка 1: кнопка «＋ Создать пресет» */
.inva-preset-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.inva-preset-row1 { /* первая строка — самостоятельный ряд */ }
.inva-preset-row2 { /* вторая строка: label + select + кнопки */ }

/* Метка «Пресет:» */
.inva-preset-label {
  font-size: 12px; color: var(--ink-muted); white-space: nowrap; flex-shrink: 0;
}

/* Селектор пресетов */
.inva-preset-select {
  font-size: 13px; color: var(--ink);
  padding: 4px 8px; border: 1px solid var(--border);
  border-radius: var(--radius-sm); background: var(--surface);
  cursor: pointer; max-width: 220px; flex-shrink: 1; min-width: 0;
}
.inva-preset-select:focus { outline: 2px solid var(--color-brand, #e36b00); outline-offset: 1px; }

/* Поле ввода в попапе создания пресета */
.inva-preset-new-input {
  font-size: 14px; color: var(--ink);
  padding: 8px 12px; border: 1px solid var(--border);
  border-radius: var(--r-sm); background: var(--surface);
  width: 100%; box-sizing: border-box;
}
.inva-preset-new-input:focus { outline: 2px solid var(--color-brand, #e36b00); outline-offset: 1px; }

/* Кнопка «Редактировать» — оранжевый warm-стиль с иконкой карандаша */
.btn-warm {
  background: var(--accent-warm, #f5e6d0);
  color: var(--color-brand, #b85c00);
  border-color: transparent;
  display: inline-flex; align-items: center; gap: 5px;
}
.btn-warm:not(:disabled):hover {
  background: var(--color-brand, #e36b00);
  color: #fff;
}
.btn-warm .ic { flex-shrink: 0; }

/* Кнопка опасного действия (удалить пресет) — сплошная красная, белый текст */
.btn-danger {
  background: var(--color-error, #c0392b) !important;
  color: #fff !important;
  border-color: transparent !important;
}
.btn-danger:not(:disabled):hover { background: #a8311f !important; color: #fff !important; }

/* Строки пресета: ненавязчивая подсветка (тёплый тон, не перебивает diff-цвета) */
.inva-row-preset > .invd-td {
  background: var(--preset-row-bg, #fffaf4) !important;
}
.inva-row-preset > .invd-td-name {
  background: var(--preset-row-bg, #fffaf4) !important;
}
/* Even-строки пресета — чуть темнее */
.inva-row-preset:nth-child(even) > .invd-td {
  background: var(--preset-row-bg-alt, #fff5ea) !important;
}
.inva-row-preset:nth-child(even) > .invd-td-name {
  background: var(--preset-row-bg-alt, #fff5ea) !important;
}

/* Выбранный в дропбоксе пресет — сильная цветная подсветка строк (зелёный тон) */
.inva-row-highlight > .invd-td,
.inva-row-highlight > .invd-td-name {
  background: var(--preset-hl-bg, #e3f3e0) !important;
}
.inva-row-highlight:nth-child(even) > .invd-td,
.inva-row-highlight:nth-child(even) > .invd-td-name {
  background: var(--preset-hl-bg-alt, #d9eed5) !important;
}

/* Попап «Принять по факту» (превью) */
.inva-apply-warn {
  background: var(--warn-soft, #fff4e0); color: var(--ink, #333);
  border-radius: 10px; padding: 10px 12px; font-size: 13px; line-height: 1.4;
  margin-bottom: 14px;
}
.inva-apply-group { margin-bottom: 14px; }
.inva-apply-group-title {
  font-size: 12px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .04em; color: var(--ink-muted, #888); margin-bottom: 6px;
}
.inva-apply-row {
  display: flex; align-items: baseline; gap: 10px;
  padding: 7px 0; border-bottom: 1px solid var(--border-soft, #eee);
}
.inva-apply-name { flex: 1; font-size: 14px; }
.inva-apply-unit { color: var(--ink-muted, #999); font-size: 12px; min-width: 28px; }
.inva-apply-qty { font-variant-numeric: tabular-nums; font-weight: 600; }

/* Инкремент B: выбор счёта + метаданные */
.inva-apply-account-row {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 14px; flex-wrap: wrap;
}
.inva-apply-account-label {
  font-size: 13px; font-weight: 600; white-space: nowrap;
  color: var(--ink, #333);
}
.inva-apply-account-select {
  flex: 1; min-width: 180px; max-width: 100%;
  font-size: 14px; padding: 7px 10px;
  border: 1.5px solid var(--border, #ddd); border-radius: 8px;
  background: var(--surface, #fff); color: var(--ink, #333);
  appearance: auto; cursor: pointer;
}
.inva-apply-account-select--error {
  border-color: var(--color-danger, #d9534f);
}
.inva-apply-meta {
  font-size: 13px; color: var(--ink-muted, #888);
  margin-bottom: 10px;
}
.inva-apply-meta b { color: var(--ink, #333); }
.inva-apply-idempotency-note {
  font-size: 12px; color: var(--ink-muted, #888);
  margin-top: 12px; padding: 8px 10px;
  background: var(--surface-alt, #f8f8f8); border-radius: 8px;
  line-height: 1.45;
}
.inva-apply-success {
  font-size: 14px; line-height: 1.55;
  padding: 6px 0;
}
.inva-apply-success b { color: var(--color-brand, #b85c00); }
.inva-apply-error {
  font-size: 14px; color: var(--color-danger, #d9534f); line-height: 1.45;
}

/* Бейдж с именем пресета рядом с названием позиции */
.inva-preset-badge {
  display: inline-block; margin-left: 5px;
  padding: 1px 6px; border-radius: 100px;
  background: var(--accent-warm, #f5e6d0); color: var(--color-brand, #b85c00);
  font-size: 10px; font-weight: 600; letter-spacing: 0.2px;
  vertical-align: middle; white-space: nowrap; cursor: default;
}
.inva-preset-badge-more {
  background: var(--surface-alt, #ede8df); color: var(--ink-muted);
}

/* ── Попап редактирования состава пресета (Sheet) ───────────────────────── */

/* Обёртка: поле поиска + прокручиваемый список */
.inva-edit-sheet-wrap {
  display: flex; flex-direction: column; height: 100%; min-height: 0;
}

/* Строка поиска внутри попапа */
.inva-edit-sheet-search-wrap {
  flex-shrink: 0; padding: 4px 0 10px;
}
.inva-edit-sheet-search {
  width: 100%; box-sizing: border-box;
  font-size: 14px; color: var(--ink);
  padding: 8px 12px; border: 1px solid var(--border);
  border-radius: var(--r-sm); background: var(--surface); outline: none;
}
.inva-edit-sheet-search:focus { outline: 2px solid var(--color-brand, #e36b00); outline-offset: 1px; }

/* Прокручиваемый список позиций */
.inva-edit-sheet-list {
  flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch;
  border: 1px solid var(--border); border-radius: var(--r-sm);
}

/* Одна строка-позиция: чекбокс + имя + ед. */
.inva-edit-sheet-row {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 12px; cursor: pointer;
  border-bottom: 1px solid var(--hairline, #eee);
  transition: background 0.1s;
}
.inva-edit-sheet-row:last-child { border-bottom: none; }
.inva-edit-sheet-row:hover { background: var(--surface-raised); }
.inva-edit-sheet-cb {
  flex-shrink: 0; width: 16px; height: 16px; cursor: pointer;
  accent-color: var(--color-brand, #e36b00);
}
.inva-edit-sheet-name { flex: 1; font-size: 14px; color: var(--ink); }
.inva-edit-sheet-unit {
  font-size: 12px; color: var(--ink-muted); min-width: 28px; text-align: right; flex-shrink: 0;
}

/* Строка кнопок управления пресетом (Переименовать / Удалить) в заголовке попапа */
.inva-edit-sheet-mgmt {
  display: flex; gap: 8px; padding-top: 6px;
}

/* Попап создания нового пресета */
.inva-create-sheet-wrap { padding: 4px 0; }

/* Бейдж «по факту» (оставлен для обратной совместимости, не используется в v2) */
.inva-fact-badge {
  display: inline-block; margin-left: 6px;
  padding: 1px 6px; border-radius: 100px;
  background: var(--accent-warm, #f5e6d0); color: var(--color-brand, #b85c00);
  font-size: 10px; font-weight: 600; letter-spacing: 0.2px;
  vertical-align: middle; white-space: nowrap;
}

/* ── AI-бейдж (инкремент 3: LLM-причины) ───────────────────────────────────── */
.inva-ai-badge {
  display: inline-flex; align-items: center;
  margin-left: 5px;
  padding: 1px 5px; border-radius: 4px;
  background: #e8f0fe; color: #1a56db;
  font-size: 10px; font-weight: 700; letter-spacing: 0.3px;
  vertical-align: middle; white-space: nowrap;
  border: 1px solid #c7d9fc;
  line-height: 1.4;
}

/* Сноска «AI-версии недоступны» */
.inva-llm-footnote {
  margin: 8px 16px 0;
  font-size: 12px; color: var(--ink-muted);
  font-style: italic;
}

/* ── Шпаргалка по таре (AI-3318) ─────────────────────────────────────────────
   Справочник «название → вес пустой тары» в bottom-sheet. Строка — кнопка:
   раскрывает калькулятор оттарки. Только токены палитры, без хардкода цветов. */
.cs-wrap { display: flex; flex-direction: column; gap: var(--sp-2); }
.cs-search {
  display: flex; align-items: center; gap: var(--sp-2);
  padding: 8px 10px; box-sizing: border-box;
  background: var(--surface-sunken); border-radius: var(--r-full);
  color: var(--ink-subtle);
}
/* display:flex класса перебивает UA-правило для [hidden] — нужно явно */
.cs-search[hidden] { display: none; }
.cs-search input {
  flex: 1; min-width: 0; border: none; background: transparent;
  font: inherit; font-size: 14px; color: var(--ink); outline: none;
}
.cs-list { display: flex; flex-direction: column; }
.cs-row {
  display: grid; grid-template-columns: 1fr auto; align-items: center;
  border-bottom: 1px solid var(--hairline);
}
/* Вес по центру высоты строки, а не по базовой линии названия: с примечанием
   («Гастроном 1/3» + «глубокий») строка растёт вниз, и при baseline цифра
   оставалась у верхнего края — вразрез с иконками, которые центрирует грид
   .cs-row. */
.cs-main {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3);
  width: 100%; padding: 10px 2px; box-sizing: border-box;
  border: none; background: transparent; text-align: left;
  font: inherit; color: var(--ink); cursor: pointer;
}
.cs-main[aria-expanded="true"] { color: var(--accent-deep); }
.cs-name { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cs-note { font-size: 12px; color: var(--ink-muted); }
.cs-weight {
  font-variant-numeric: tabular-nums; font-weight: 600;
  color: var(--ink-muted); white-space: nowrap;
}
.cs-acts { display: flex; align-items: center; gap: 2px; }
.cs-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px; padding: 0;
  border: none; background: transparent; color: var(--ink-subtle); cursor: pointer;
}
.cs-icon:hover { color: var(--accent-deep); }
/* Раскрывающийся блок под строкой — калькулятор, форма правки, подтверждение */
.cs-extra { grid-column: 1 / -1; }
.cs-extra[hidden] { display: none; }

.cs-calc {
  display: flex; align-items: flex-end; gap: var(--sp-3);
  padding: 0 0 10px; flex-wrap: wrap;
}
/* В вертикальной форме поле не должно нести flex-basis: в колонке 160px стали бы
   ВЫСОТОЙ поля (между полями зияли пустоты). Basis нужен только в строке
   калькулятора, где поле и результат делят ширину. */
.cs-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.cs-calc .cs-field { flex: 1 1 160px; }
.cs-lbl { font-size: 12px; color: var(--ink-muted); }
.cs-input {
  width: 100%; box-sizing: border-box; padding: 9px 10px;
  border: 1px solid var(--hairline-strong); border-radius: var(--r-sm);
  background: var(--surface); font: inherit; font-size: 14px; color: var(--ink);
}
.cs-input:focus { outline: none; border-color: var(--accent); }
.cs-result {
  flex: 1 1 160px; padding: 9px 10px; box-sizing: border-box;
  border-radius: var(--r-sm); background: var(--surface-sunken);
  font-size: 14px; color: var(--ink-muted);
}
.cs-result.is-ok { background: var(--success-bg); color: var(--success); font-weight: 600; }
.cs-result.is-bad { background: var(--danger-bg); color: var(--danger); }

.cs-form { display: flex; flex-direction: column; gap: var(--sp-2); padding: 4px 0 12px; }
.cs-form-btns { display: flex; gap: var(--sp-2); justify-content: flex-end; }
.cs-form-err { font-size: 12px; color: var(--danger); }
.cs-form-err[hidden] { display: none; }
.cs-confirm {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3);
  padding: 8px 10px; margin-bottom: 10px; flex-wrap: wrap;
  background: var(--danger-bg); border-radius: var(--r-sm);
  font-size: 14px; color: var(--danger);
}
.cs-empty { padding: 16px 2px; font-size: 14px; color: var(--ink-muted); }

/* Экраны инвентаризации, прижатые к вьюпорту, — от видимой полосы, а не от dvh
   (AI-3502; про обязательность @supports см. конец iiko.css). */
@supports (height: 100dvh) {
  #screen-inventory-form.is-active.uses-shell,
  #screen-inventory-zones.is-active.uses-shell,
  #screen-inventory-detail.is-active.uses-shell,
  #screen-inventory-analysis.is-active.uses-shell {
    height: var(--vvh, 100dvh); max-height: var(--vvh, 100dvh);
  }
  /* Пока открыт шит, экран под ним под клавиатуру НЕ подстраивается (AI-6704):
     сжимать его незачем — он за скримом, — а вот перекладка списка и всплывшая
     кнопка «Завершить» в момент ухода клавиатуры были отчётливо видны и
     читались как «страница дёргается». Класс ставит js/sheet.js. */
  html.sheet-open #screen-inventory-form.is-active.uses-shell,
  html.sheet-open #screen-inventory-zones.is-active.uses-shell,
  html.sheet-open #screen-inventory-detail.is-active.uses-shell,
  html.sheet-open #screen-inventory-analysis.is-active.uses-shell {
    height: 100dvh; max-height: 100dvh;
  }
}

/* ── Голосовой ввод позиций (AI-3566) ────────────────────────────────────── */
.invv-fab {
  position: absolute; right: 16px; z-index: 40;
  bottom: calc(78px + env(safe-area-inset-bottom, 0px));
  width: 56px; height: 56px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--accent); color: #fff; border: none; cursor: pointer;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .18);
}
.invv-fab:active { transform: scale(.96); }
.invv-footer-trigger {
  position: relative; flex: 0 0 56px; min-height: 52px;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid var(--hairline); border-radius: var(--r-lg);
  background: var(--surface); color: var(--accent-deep); cursor: pointer;
}
.invv-footer-trigger[hidden] { display: none; }
.invv-footer-trigger:active { transform: scale(.96); }
.invv-footer-trigger:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.invv-fab-badge {
  position: absolute; top: -4px; right: -4px; min-width: 20px; height: 20px;
  padding: 0 5px; border-radius: 10px; background: var(--danger); color: #fff;
  font-size: 12px; font-weight: 600; line-height: 20px; text-align: center;
  border: 2px solid var(--surface-page); box-sizing: content-box;
}
.invv-fab-badge[hidden] { display: none; }

.invv-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: var(--sp-3); }
.invv-row {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px; border: 1px solid var(--hairline); border-radius: var(--r-sm);
  background: var(--surface);
}
/* Неразобранная строка видна сразу: именно она блокирует «Принять». */
.invv-row.is-unmatched { border-color: var(--danger); background: var(--danger-bg); }
.invv-main {
  flex: 1 1 auto; min-width: 0; text-align: left;
  background: none; border: none; padding: 0; cursor: pointer;
}
.invv-name {
  font-size: 14px; font-weight: 600; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.invv-row.is-unmatched .invv-name { color: var(--danger); font-weight: 500; }
/* Дословная реплика — единственный способ понять, почему матч не тот. */
.invv-said {
  font-size: 11px; color: var(--ink-faint);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.invv-qty { flex: 0 0 64px; width: 64px; text-align: right; }
.invv-unit { flex: 0 0 auto; font-size: 11px; color: var(--ink-muted); min-width: 18px; }

.invv-ptt { width: 100%; height: 56px; font-size: 16px; gap: 8px; }
.invv-ptt.is-rec { background: var(--danger); border-color: var(--danger); color: #fff; }
.invv-timer { font-variant-numeric: tabular-nums; }
.invv-pulse {
  width: 10px; height: 10px; border-radius: 50%; background: #fff;
  animation: invv-blink 1s infinite;
}
@keyframes invv-blink { 0%, 100% { opacity: 1; } 50% { opacity: .25; } }
@media (prefers-reduced-motion: reduce) { .invv-pulse { animation: none; } }

.invv-empty { font-size: 13px; color: var(--ink-muted); padding: 4px 2px 12px; }
.invv-note { font-size: 12px; color: var(--ink-muted); text-align: center; margin-top: 8px; }
.invv-note.is-warn { color: var(--danger); }

/* Разбор реплики (AI-3566, iter 2) — свёрнутый блок диагностики. Нужен на
   проде с телефона: до логов сервера оттуда не дотянуться, а «почему распознало
   не то» объясняется путём разбора и score выбранного кандидата. */
.invv-diag { margin-top: 10px; font-size: 12px; color: var(--ink-muted); }
.invv-diag summary { cursor: pointer; color: var(--ink-faint); }
.invv-diag-body { padding: 6px 0 0; display: flex; flex-direction: column; gap: 3px; }
.invv-diag-row { color: var(--ink-muted); }
.invv-diag-score { color: var(--ink-faint); font-variant-numeric: tabular-nums; }
.invv-diag-err { color: var(--danger); }

/* Подсказка под строкой пачки (AI-3566, iter 3): пересчёт единиц или вопрос
   «сказано 10 штук, учёт в л». Пустое поле количества без объяснения читается
   как «не расслышало», хотя на деле система отказалась угадывать. */
.invv-rownote {
  margin: -2px 0 4px; padding: 0 10px;
  font-size: 11px; line-height: 1.35; color: var(--ink-muted);
}
.invv-rownote.is-warn { color: var(--danger); }

/* Microphone choice stays visible beside recording, including on shared forms. */
.invv-record-controls { display: flex; align-items: flex-end; gap: 12px; margin-top: 12px; }
.invv-microphone { flex: 1 1 55%; min-width: 0; }
.invv-microphone > label { display: grid; gap: 4px; font-size: 12px; color: var(--ink-muted); }
.invv-microphone select { width: 100%; min-width: 0; height: 48px; }
.invv-record-buttons { flex: 1 1 45%; min-width: 0; }
.invv-record-buttons .invv-ptt { height: 48px; font-size: 14px; }
.invv-record-buttons .btn { white-space: normal; }
.invv-active-mic { text-align: left; overflow-wrap: anywhere; }
