/* Вкладка «Склад» (stock.js): каталог позиций и поток разметки. Геометрия — как у
   оболочки, привязки и сборки (shell.css, bind.css, assembly.css; One UI): заголовок
   28/700 у левого края, группы одной капсулой 26px с разделителями от начала текста,
   капсульные поля и кнопки, без теней; главные кнопки — внизу экрана. Цвета — токены
   lab.css, тёмная тема приходит оттуда же.

   Экран стоит на фоне страницы (--bg), поэтому капсулы и кнопки на нём — --surface;
   внутри листа снизу (он сам --surface) группы — --surface-2.

   Карточка цели читается на расстоянии вытянутой руки: номер единицы — крупным
   моноширинным, итог скана — цветом всей карточки. Она «липнет» под шапкой: список
   единиц прокручивается под ней, а цель и итог видно всегда. Кнопок в ней нет — все
   действия внизу, в панели экрана (nav.css .rf-actbar, docs/spec_scanner_app_modes.md §3.4):
   до верха экрана большой палец на санях сканера не достаёт. */

.rf-stk { max-width: 640px; margin: 0 auto; }
/* Зазор 8, а не 12: на 360×640 между заголовком, фильтрами, чипами и списком таких зазоров
   три-четыре — это полстроки каталога. Блоки и так отделены фоном капсул. */
.rf-stk-screen { display: grid; gap: 8px; min-width: 0; }
.rf-stk-screen > * { min-width: 0; }

/* ---------- заголовки */
.rf-stk-head { display: grid; gap: 4px; padding: 4px 8px 0; }
.rf-stk-title {
  font-size: 28px; font-weight: 700; letter-spacing: -0.02em; line-height: 1.2;
  margin: 0; overflow-wrap: anywhere;
}
.rf-stk-title--pos { font-size: 24px; line-height: 1.25; }
.rf-stk-lede { margin: 0; color: var(--muted); font-size: 14px; line-height: 1.4; }
/* Заглушка «Загружаю…» — тоже текст: --faint на фоне страницы давал 2.6:1 при нужных 4.5. */
.rf-stk-skel { color: var(--muted); }
.rf-stk-mono { font-family: var(--mono); }

.rf-stk-sum { margin: 0; color: var(--muted); font-size: 15px; line-height: 1.45; }
.rf-stk-sum b { color: var(--text); font-weight: 700; font-variant-numeric: tabular-nums; }
.rf-stk-sum__empty { white-space: nowrap; }
.rf-stk-bar { display: block; height: 6px; border-radius: 3px; background: var(--surface); overflow: hidden; }
.rf-stk-bar > i { display: block; height: 100%; border-radius: inherit; background: var(--accent); transition: width .3s var(--oui-ease); }
.rf-stk-bar.is-full > i { background: var(--good); }
.rf-stk-head .rf-stk-bar { margin-top: 2px; }

/* ---------- поиск каталога — в ряду нижней панели, рядом с кнопкой источника */
.rf-stk-search { flex: 1 1 auto; min-width: 0; }
.rf-stk-search[hidden] { display: none; }
/* 44 px — как у всего ряда над меню (nav.css .rf-actbar, srcbar.css): поле поиска стоит с
   кнопками источника в одной строке и обязано быть с ними одной высоты. */
.rf-stk-search input.rf-input { height: 44px; min-height: 44px; border-radius: 22px; padding: 0 14px 0 42px; }
.rf-stk-search > svg { left: 14px; }

.rf-stk-ibtn {
  width: 44px; height: 44px; flex: none; padding: 0;
  display: grid; place-items: center;
  border: 0; border-radius: 999px;
  background: var(--surface); color: var(--text);
  cursor: pointer;
  transition: background .15s var(--oui-ease), transform .1s ease;
}
.rf-stk-ibtn svg { width: 22px; height: 22px; }
.rf-stk-ibtn:active { transform: scale(.94); }
.rf-stk-ibtn.is-on { background: var(--accent-soft); color: var(--accent-text); }
.rf-stk-ibtn:focus-visible, .rf-stk-chip:focus-visible, .rf-stk-seg button:focus-visible,
.rf-stk-pact:focus-visible, .rf-stk-unit__pick:focus-visible, .rf-stk-act:focus-visible,
.rf-stk-unit__open:focus-visible, .rf-stk-feed__x:focus-visible { outline: none; box-shadow: var(--ring); }

/* ---------- фильтры: состояние (сегменты) и категории (чипы с прокруткой). Цели касания —
   от 44 px: фильтры меняют на ходу одной рукой, а 34–40 px промахивались по соседнему. */
.rf-stk-seg { display: flex; gap: 2px; padding: 3px; border-radius: 999px; background: var(--surface); }
.rf-stk-seg button {
  flex: 1 1 auto; min-width: 0; min-height: 44px; padding: 0 8px;
  border: 0; border-radius: 999px; background: none;
  color: var(--muted); font: inherit; font-size: 14px; font-weight: 600;
  cursor: pointer; white-space: nowrap;
  transition: background .2s var(--oui-ease), color .2s var(--oui-ease);
}
.rf-stk-seg button[aria-checked="true"] { background: var(--accent-soft); color: var(--accent-text); }

/* Ряд чипов выходит к краям экрана: прокрутка не обрезает крайний чип посередине. */
.rf-stk-chips {
  display: flex; gap: 8px;
  overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none;
  margin: 0 calc(var(--gutter) * -1); padding: 0 var(--gutter);
}
.rf-stk-chips::-webkit-scrollbar { display: none; }
.rf-stk-chips[hidden] { display: none; }
.rf-stk-chips:empty { display: none; }
.rf-stk-chip {
  flex: none; display: inline-flex; align-items: center; gap: 6px;
  height: 44px; padding: 0 16px;
  border: 0; border-radius: 22px;
  background: var(--surface); color: var(--text);
  font: inherit; font-size: 14px; font-weight: 600; white-space: nowrap;
  cursor: pointer;
  transition: background .2s var(--oui-ease), color .2s var(--oui-ease);
}
.rf-stk-chip[aria-checked="true"] { background: var(--accent-soft); color: var(--accent-text); }
/* Число позиций в чипе — вторичное, но читаемое: --faint давал 2.8:1 (светлая тема) и
   3.3:1 (тёмная), --muted — 5.4 и 6.3. У выбранного — цвет подписи чуть приглушён: 7:1. */
.rf-stk-chip__n { color: var(--muted); font-weight: 500; font-variant-numeric: tabular-nums; }
.rf-stk-chip[aria-checked="true"] .rf-stk-chip__n { color: inherit; opacity: .85; }
/* Подкатегории выглядят мельче (капсула 36 px), но цель касания — те же 44 px: прозрачная
   рамка вокруг капсулы, фон по внутренний край. */
.rf-stk-chips--sub { margin-top: -8px; }
.rf-stk-chips--sub .rf-stk-chip {
  height: 44px; padding: 0 12px; font-size: 13px;
  border: 4px solid transparent; background-clip: padding-box;
}

/* ---------- список позиций */
.rf-stk-glabel { margin: 8px 0 4px; }
#stk-list > .rf-stk-glabel:first-child { margin-top: 2px; }
.rf-stk-group + .rf-stk-glabel { margin-top: 10px; }
/* Строка каталога — ОДИН ярус 44 px (22.09; было 56 с подписью «4 ед. · с кодом 0» вторым
   ярусом, до того 72): название, справа «0 из 4» — сколько единиц уже с кодом, кольцо 28.
   Название переносится на вторую строку, а не режется: у техники различается хвост
   («EW 100 G4» / «EW 500 G4»). Цель касания 44 — строку только открывают.
   Разделитель — от начала текста: 16 поле + 28 кольцо + 12 зазор = 56. */
.rf-stk-prow { gap: 12px; padding: 4px 10px 4px 16px; min-height: 44px; }
.rf-stk-prow + .rf-stk-prow::before { left: 56px; }
.rf-stk-prow .rf-row__main { gap: 0; }
.rf-stk-prow .rf-row__name {
  font-size: 16px; line-height: 1.25;
  white-space: normal; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.rf-stk-prow__count {
  flex: none; font-size: 13px; font-weight: 600; white-space: nowrap;
  color: var(--muted); font-variant-numeric: tabular-nums;
}
.rf-stk-prow__count.is-done { color: var(--good-ink); }
.rf-stk-prow .rf-row__chev { margin-left: -6px; }

.rf-stk-ring { width: 36px; height: 36px; flex: none; display: grid; place-items: center; border-radius: 999px; }
.rf-stk-ring svg { width: 36px; height: 36px; display: block; }
.rf-stk-ring__track { fill: none; stroke: var(--border-strong); stroke-width: 3; }
.rf-stk-ring__val { fill: none; stroke: var(--accent); stroke-width: 3.4; stroke-linecap: round; }
.rf-stk-ring.is-done { background: var(--good); color: var(--accent-ink); }
.rf-stk-ring.is-done svg { width: 20px; height: 20px; }
/* Значок «+» у позиции без единиц — единственное, что об этом говорит: значку нужно ≥ 3:1
   (WCAG 1.4.11), а --faint давал 2,8:1 в светлой теме. */
.rf-stk-ring.is-empty { border: 2px dashed var(--border-strong); color: var(--muted); }
.rf-stk-ring.is-empty svg { width: 16px; height: 16px; }
/* В строке каталога кольцо 28 — как кольца строк «Сборки» (assembly.css). Толщина линии —
   в единицах viewBox 36, поэтому при уменьшении её прибавляем: видимая остаётся ≈2,6 px. */
.rf-stk-prow .rf-stk-ring, .rf-stk-prow .rf-stk-ring svg { width: 28px; height: 28px; }
.rf-stk-prow .rf-stk-ring__track { stroke-width: 3.4; }
.rf-stk-prow .rf-stk-ring__val { stroke-width: 4; }
.rf-stk-prow .rf-stk-ring.is-done svg, .rf-stk-prow .rf-stk-ring.is-empty svg { width: 16px; height: 16px; }
.rf-stk-prow .rf-stk-ring.is-empty svg { width: 14px; height: 14px; }

.rf-stk-kinds { flex: none; display: flex; gap: 4px; }
.rf-stk-kind {
  display: inline-flex; align-items: center; height: 20px; padding: 0 7px;
  border-radius: 999px; background: var(--surface-2); color: var(--muted);
  font-size: 10px; font-weight: 700; letter-spacing: .03em;
}
.rf-stk-kind--rfid { background: var(--accent-soft); color: var(--accent-text); }

.rf-stk-empty {
  display: grid; justify-items: center; gap: 8px;
  padding: 32px 24px 28px; border-radius: var(--oui-r);
  background: var(--surface); text-align: center;
}
.rf-stk-empty__ico {
  width: 60px; height: 60px; border-radius: 999px; margin-bottom: 4px;
  display: grid; place-items: center;
  background: var(--accent-soft); color: var(--accent-text);
}
.rf-stk-empty__ico svg { width: 28px; height: 28px; }
.rf-stk-empty__text { margin: 0; color: var(--muted); font-size: 15px; line-height: 1.5; max-width: 34ch; }
.rf-stk-retry { width: auto; justify-self: center; margin-top: 6px; background: var(--surface-2); }
.rf-stk-target .rf-stk-retry { justify-self: start; }
.rf-stk-more { height: 1px; }
.rf-stk-more__text { margin: 10px 0 0; text-align: center; color: var(--muted); font-size: 13px; }
.rf-stk-link {
  display: inline-flex; align-items: center; min-height: 44px; padding: 0 10px;
  border: 0; border-radius: 22px; background: none;
  color: var(--accent-text); font: inherit; font-weight: 700; cursor: pointer;
}

/* ---------- позиция: шапка и прогресс по видам */
.rf-stk-prog { display: grid; gap: 8px; margin-top: 4px; }
.rf-stk-prog__row { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.rf-stk-kp {
  display: inline-flex; align-items: center;
  height: 26px; padding: 0 10px; border-radius: 999px;
  background: var(--surface); color: var(--muted);
  font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums;
}
.rf-stk-kp b { color: var(--text); }
.rf-stk-kp.is-full { background: color-mix(in srgb, var(--good) 18%, var(--surface)); color: var(--good-ink); }
.rf-stk-kp.is-full b { color: inherit; }
.rf-stk-prog__all { margin-left: auto; color: var(--muted); font-size: 13px; font-variant-numeric: tabular-nums; }

/* ---------- карточка цели: липнет под шапкой (вкладок сверху больше нет — меню внизу) */
.rf-stk-stick {
  position: sticky;
  top: var(--bar-h, 53px);
  z-index: 6;
  margin: -6px calc(var(--gutter) * -1) 0;
  padding: 6px var(--gutter);
  background: var(--bg);
}

.rf-stk-target {
  display: grid; gap: 2px;
  /* Поля были 10/12/12/20 — на 360×640 карточка занимала 187 px, и списку единиц (по
     которому опознают предмет тапом) не оставалось ни строки. Поля прежнего блока
     @media (max-height: 780px) стали базой: карточка от этого не стала хуже читаться,
     крупный номер и итог не тронуты. */
  padding: 8px 12px 10px 18px;
  border-radius: var(--oui-r);
  background: var(--surface);
  transition: box-shadow .2s var(--oui-ease), background .35s var(--oui-ease);
}
/* Выбранную человеком цель видно издалека: янтарная рамка. */
.rf-stk-target[data-mode="explicit"] { box-shadow: inset 0 0 0 2.5px var(--accent); }
.rf-stk-target[data-mode="done"] { background: color-mix(in srgb, var(--good) 14%, var(--surface)); }
.rf-stk-target[data-mode="identify"],
.rf-stk-target[data-mode="empty"],
.rf-stk-target[data-mode="skipped"] { background: color-mix(in srgb, var(--accent) 12%, var(--surface)); }

/* Верх карточки — метка режима и чипы-пометки; кнопок в нём больше нет. */
.rf-stk-target__top { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; min-height: 22px; }
.rf-stk-target__label {
  font-size: 12px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  color: var(--muted); margin-right: 2px;
}
.rf-stk-target[data-mode="explicit"] .rf-stk-target__label { color: var(--accent-text); }
.rf-stk-target[data-mode="done"] .rf-stk-target__label { color: var(--good-ink); }
.rf-stk-target[data-mode="identify"] .rf-stk-target__label { color: var(--warn-ink); }
.rf-stk-tchip {
  display: inline-flex; align-items: center; gap: 3px;
  height: 22px; padding: 0 8px; border: 0; border-radius: 999px;
  background: var(--surface-2); color: var(--muted);
  font: inherit; font-size: 11px; font-weight: 700; white-space: nowrap;
}
.rf-stk-tchip--on { background: var(--accent-soft); color: var(--accent-text); }

/* Номер единицы — моноширинным (0 и O, 1 и l не путаются), «инв.» — подписью: целиком
   моноширинным «инв. SN-EON715-003» переносился на вторую строку уже на 390 px. */
.rf-stk-target__big {
  display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 8px;
  font-family: var(--mono); font-weight: 700;
  font-size: clamp(24px, 7.8vw, 34px); line-height: 1.15; letter-spacing: -0.02em;
  overflow-wrap: anywhere; min-width: 0;
}
.rf-stk-target__big > span { min-width: 0; }
.rf-stk-target__pre { font-family: var(--font-ui); font-size: 16px; font-weight: 600; letter-spacing: 0; color: var(--muted); }
.rf-stk-target__big.is-text { align-items: center; gap: 10px; font-family: var(--font-ui); font-size: clamp(22px, 6.4vw, 28px); line-height: 1.2; }
.rf-stk-target__ok {
  width: 34px; height: 34px; flex: none; border-radius: 999px;
  display: grid; place-items: center;
  background: var(--good); color: var(--accent-ink);
}
.rf-stk-target__ok svg { width: 20px; height: 20px; }
.rf-stk-target__sub { color: var(--muted); font-size: 15px; line-height: 1.35; overflow-wrap: anywhere; margin-top: 2px; }
/* «Дальше — «Имя»»: куда ведёт «Следующая» внизу. Одной строкой: карточка липнет над списком. */
.rf-stk-target__next {
  margin-top: 2px; color: var(--good-ink); font-size: 14px; font-weight: 600; line-height: 1.35;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Нижняя строка карточки: подсказка «что делать» или итог последнего скана. */
.rf-stk-target__line {
  display: flex; align-items: center; gap: 10px;
  min-height: 42px; margin: 6px 0 0 -8px; padding: 4px 6px 4px 8px;
  border-radius: 18px; background: var(--surface-2);
  font-size: 14px; line-height: 1.3;
}
.rf-stk-line__ico {
  width: 30px; height: 30px; flex: none; border-radius: 999px;
  display: grid; place-items: center;
  background: var(--surface); color: var(--muted);
}
.rf-stk-line__ico svg { width: 17px; height: 17px; }
.rf-stk-line__ico.is-busy { animation: pulse 1s infinite; }
.rf-stk-line__text { flex: 1; min-width: 0; display: grid; gap: 1px; }
.rf-stk-line__text > span:first-child {
  font-weight: 600; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.rf-stk-line__sub { font-family: var(--mono); font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Подпись подсказки (не кода) — обычным шрифтом. */
.rf-stk-line__sub.is-plain { font-family: var(--font-ui); font-size: 13px; }
.rf-stk-target__line.is-new { animation: stk-in .2s var(--oui-ease); }

/* Тоны итога — общие для строки карточки, ленты и журнала. */
.rf-stk-tone--ok.rf-stk-target__line { background: color-mix(in srgb, var(--good) 20%, var(--surface)); }
.rf-stk-tone--sel.rf-stk-target__line { background: var(--accent-soft); }
.rf-stk-tone--info.rf-stk-target__line { background: var(--info-soft); }
.rf-stk-tone--bad.rf-stk-target__line { background: var(--danger-soft); color: var(--bad-ink); }
.rf-stk-tone--warn.rf-stk-target__line { background: var(--warn-soft); color: var(--warn-ink); }
.rf-stk-tone--ok :is(.rf-stk-line__ico, .rf-stk-feed__ico, .rf-stk-jrow__ico) { background: var(--good); color: var(--accent-ink); }
.rf-stk-tone--sel :is(.rf-stk-line__ico, .rf-stk-feed__ico, .rf-stk-jrow__ico) { background: var(--accent); color: var(--accent-ink); }
.rf-stk-tone--info :is(.rf-stk-line__ico, .rf-stk-feed__ico, .rf-stk-jrow__ico) { background: var(--info-soft); color: var(--text); }
.rf-stk-tone--bad :is(.rf-stk-line__ico, .rf-stk-feed__ico, .rf-stk-jrow__ico) { background: var(--danger-soft); color: var(--bad-ink); }
.rf-stk-tone--bad .rf-stk-line__ico { background: var(--surface); }
.rf-stk-tone--warn :is(.rf-stk-line__ico) { background: var(--surface); color: var(--warn-ink); }
.rf-stk-tone--warn :is(.rf-stk-feed__ico, .rf-stk-jrow__ico) { background: var(--warn-soft); color: var(--warn-ink); }
.rf-stk-feed__item.rf-stk-tone--warn { background: var(--warn-soft); color: var(--warn-ink); }
.rf-stk-feed__item.rf-stk-tone--warn .rf-stk-feed__ico { background: var(--surface); }
.rf-stk-tone--warn .rf-stk-jrow__text { color: var(--warn-ink); }
/* Подпись на тонированной строке — цветом строки без приглушения: с opacity .8 выходило
   3.6:1 на красном и 4.5 на янтарном (светлая тема). */
.rf-stk-tone--warn .rf-stk-line__sub { color: inherit; }
.rf-stk-tone--sel .rf-stk-line__sub { color: var(--accent-text); }
.rf-stk-tone--busy :is(.rf-stk-line__ico, .rf-stk-feed__ico, .rf-stk-jrow__ico) { color: var(--accent-text); }
.rf-stk-tone--bad .rf-stk-line__sub { color: inherit; }

/* Итог скана — вспышкой всей карточки: цвет виден краем глаза, пока руки заняты. */
.rf-stk-target.is-flash-ok { animation: stk-flash-ok .9s ease-out; }
.rf-stk-target.is-flash-sel { animation: stk-flash-sel .9s ease-out; }
.rf-stk-target.is-flash-bad { animation: stk-flash-bad .9s ease-out, stk-shake .35s ease-in-out; }
@keyframes stk-flash-ok { 0%, 22% { background: color-mix(in srgb, var(--good) 48%, var(--surface)); } }
@keyframes stk-flash-sel { 0%, 22% { background: color-mix(in srgb, var(--accent) 45%, var(--surface)); } }
@keyframes stk-flash-bad { 0%, 22% { background: color-mix(in srgb, var(--bad) 42%, var(--surface)); } }
@keyframes stk-shake { 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); } }

.rf-stk-pact {
  flex: none; height: 44px; padding: 0 14px;
  border: 0; border-radius: 999px;
  background: var(--accent); color: var(--accent-ink);
  font: inherit; font-size: 13px; font-weight: 700; white-space: nowrap; cursor: pointer;
}
.rf-stk-pact:disabled { opacity: .55; cursor: default; }
.rf-stk-pact--ghost { background: var(--surface-2); color: var(--text); }
/* В журнале кнопок десяток — сплошной янтарь у каждой строки кричал бы. */
.rf-stk-pact--soft { background: var(--accent-soft); color: var(--accent-text); }
.rf-stk-tone--bad .rf-stk-pact--ghost { background: var(--surface); }

/* ---------- единицы позиции */
.rf-stk-units { overflow: hidden; }
.rf-stk-unit {
  position: relative; display: flex; align-items: stretch;
  /* строку цели прокрутка ставит между липкой карточкой и нижними слоями (панель, меню) */
  scroll-margin-top: calc(var(--bar-h, 53px) + var(--stk-stick-h, 170px) + 8px);
  scroll-margin-bottom: calc(var(--rf-nav-h, 64px) + var(--rf-actbar-h, 0px) + var(--rf-banner-h, 0px) + 8px);
  transition: background .2s var(--oui-ease);
}
/* Разделитель — от начала текста: 16 поле + 26 кружок + 12 зазор = 54. */
.rf-stk-unit + .rf-stk-unit::before {
  content: ""; position: absolute; top: 0; left: 54px; right: 16px;
  height: 1px; background: var(--border);
}
/* 44 и ОДИН ярус (22.09; было 48 в два яруса, до того 64): номер и значки («следующая»,
   «выбрана») слева, серийный номер и место — справа мелко. Подпись сжимается многоточием,
   а когда ей остаётся меньше 72 px — уходит вторым ярусом. Цель касания 44. Это ГЛАВНЫЙ
   список позиции: по нему и считают, сколько единиц видно без прокрутки (§2.5). */
.rf-stk-unit__pick {
  flex: 1; min-width: 0;
  display: flex; align-items: center; gap: 12px;
  min-height: 44px; padding: 3px 4px 3px 16px;
  border: 0; background: none; color: var(--text);
  font: inherit; text-align: left; cursor: pointer;
}
.rf-stk-unit__pick:active { background: var(--surface-2); }
.rf-stk-unit__dot {
  width: 26px; height: 26px; flex: none; border-radius: 999px;
  display: grid; place-items: center;
  border: 2px solid var(--border-strong); color: var(--accent-ink);
  transition: background .2s var(--oui-ease), border-color .2s var(--oui-ease);
}
.rf-stk-unit__dot svg { width: 14px; height: 14px; }
.rf-stk-unit.is-coded .rf-stk-unit__dot { background: var(--good); border-color: var(--good); }
.rf-stk-unit.is-next .rf-stk-unit__dot { border-color: var(--accent); border-style: dashed; }
.rf-stk-unit.is-explicit { background: var(--accent-soft); }
/* --muted на янтарной заливке тёмной темы — 3.9:1: подпись и «инв.» выбранной строки — её чернилами. */
.rf-stk-unit.is-explicit :is(.rf-stk-unit__sub, .rf-stk-unit__inv small) { color: var(--accent-text); }
.rf-stk-unit.is-explicit .rf-stk-unit__dot { border-color: var(--accent); border-width: 3px; }
.rf-stk-unit.is-next { background: color-mix(in srgb, var(--accent) 7%, transparent); }
.rf-stk-unit.is-skipped .rf-stk-unit__inv { color: var(--muted); }
.rf-stk-unit__main {
  flex: 1; min-width: 0;
  display: flex; flex-wrap: wrap; align-items: center; column-gap: 10px; row-gap: 1px;
  line-height: 1.3;
}
.rf-stk-unit__top { flex: 0 1 auto; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
.rf-stk-unit__inv { font-family: var(--mono); font-size: 15px; font-weight: 600; overflow-wrap: anywhere; }
.rf-stk-unit__inv small { margin-right: 5px; font-family: var(--font-ui); font-size: 12px; font-weight: 600; color: var(--muted); }
.rf-stk-unit__sub {
  flex: 1 1 72px; min-width: 0; text-align: right;
  font-size: 13px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.rf-stk-unit .rf-stk-kinds { align-self: center; }
.rf-stk-unit__open {
  flex: none; width: 46px;
  display: grid; place-items: center;
  /* Шеврон — единственный признак кнопки карточки: ему нужно 3:1, --faint давал 2.8. */
  border: 0; background: none; color: var(--muted); cursor: pointer;
}
.rf-stk-unit__open svg { width: 20px; height: 20px; }
.rf-stk-unit__open:active { background: var(--surface-2); color: var(--text); }
.rf-stk-unit.is-flash { animation: stk-row-flash 1.2s ease-out; }
@keyframes stk-row-flash { 0%, 30% { background: color-mix(in srgb, var(--good) 34%, var(--surface)); } }

.rf-stk-badge {
  display: inline-flex; align-items: center; height: 20px; padding: 0 8px;
  border-radius: 999px; background: var(--accent-soft); color: var(--accent-text);
  font-size: 11px; font-weight: 700; white-space: nowrap;
}
.rf-stk-badge--sel { background: var(--accent); color: var(--accent-ink); }
.rf-stk-badge--muted { background: var(--surface-2); color: var(--muted); }
.rf-stk-badge--new { background: var(--info-soft); color: var(--text); }
.rf-stk-status {
  display: inline-flex; align-items: center; height: 20px; padding: 0 8px;
  border-radius: 999px; font-size: 11px; font-weight: 700; white-space: nowrap;
  background: var(--warn-soft); color: var(--warn-ink);
}
.rf-stk-status--broken { background: var(--danger-soft); color: var(--bad-ink); }
.rf-stk-foot { margin: 8px 8px 0; color: var(--muted); font-size: 13px; line-height: 1.45; }
.rf-stk-foot--empty { margin: 4px 0 0; padding: 18px 20px; border-radius: var(--oui-r); background: var(--surface); color: var(--muted); font-size: 14px; }

/* ---------- нижняя панель: лента, слот камеры, ряд действий. Геометрию (fixed над меню,
   поля, фон) задаёт .rf-actbar в nav.css, слот камеры — srcbar.css. */
.rf-stk-feed { display: grid; gap: 3px; }
.rf-stk-feed:empty, .rf-stk-actions:empty { display: none; }
/* Строка ленты — 44 px, как весь ряд над меню. Кнопка внутри — 40 (замечание ревью U14:
   «Отменить» живёт 6 с, в него попадают на ходу одной рукой), поэтому её поле касания
   расширено псевдоэлементом до 48: видимый размер меньше цели нажатия. Поля строки
   сверху и снизу — 2 px, кнопка остаётся капсулой внутри капсулы; радиус строки
   22 = радиус кнопки 20 + поле 2, иначе кнопка вылезала бы за скругление. */
.rf-stk-feed__item {
  display: flex; align-items: center; gap: 8px;
  min-height: 44px; padding: 2px 2px 2px 8px;
  border-radius: 22px; background: var(--surface);
  font-size: 14px; line-height: 1.3;
}
.rf-stk-feed__item > .rf-stk-feed__text:last-child { margin-right: 8px; }
.rf-stk-feed__item.rf-stk-tone--bad { background: var(--danger-soft); color: var(--bad-ink); }
.rf-stk-feed__item.rf-stk-tone--info { background: var(--info-soft); }
.rf-stk-feed__ico {
  width: 28px; height: 28px; flex: none; border-radius: 999px;
  display: grid; place-items: center;
  background: var(--surface-2); color: var(--muted);
}
.rf-stk-feed__ico svg { width: 16px; height: 16px; }
.rf-stk-feed__ico.is-busy { animation: pulse 1s infinite; }
.rf-stk-feed__item.rf-stk-tone--bad .rf-stk-feed__ico { background: var(--surface); color: var(--bad-ink); }
.rf-stk-feed__item.rf-stk-tone--info .rf-stk-feed__ico { background: var(--surface); }
.rf-stk-feed__text { flex: 1; min-width: 0; display: grid; }
.rf-stk-feed__text > span:first-child { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Заметка каталога («Код не привязан — откройте позицию…») — в две строки: её читают целиком. */
.rf-stk-feed__item.is-wrap .rf-stk-feed__text > span:first-child {
  white-space: normal; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.rf-stk-feed__sub { font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Строки очереди и ошибок: число — в заголовке, причина — подписью, и ей можно в две строки
   (на 360 px рядом с кнопками ей остаётся 120–180 px). Строка итога («Отменить») остаётся в
   одну строку: она частая, и её высота — бюджет списка при камере. */
.rf-stk-feed__item.is-wrap-sub .rf-stk-feed__sub {
  white-space: normal; overflow-wrap: anywhere; text-wrap: balance;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
/* Две текстовые кнопки рядом с текстом на 360 px не помещаются: текст — первой строкой,
   кнопки — второй, у правого края. */
.rf-stk-feed__item.is-stack { flex-wrap: wrap; row-gap: 4px; padding-top: 8px; }
.rf-stk-feed__item.is-stack .rf-stk-feed__text { flex: 1 1 calc(100% - 36px); }   /* значок 28 + зазор 8 */
.rf-stk-feed__item.is-stack > button:first-of-type { margin-left: auto; }
.rf-stk-tone--bad .rf-stk-feed__sub { color: inherit; }
/* Кнопки ленты — 40 px с полем касания 48 через ::after: видимый размер меньше цели
   нажатия (правило мелких кнопок Material). Без него лента была бы 48 px — лишние 4 px
   у каждой из трёх строк при включённой камере (§2.5). */
.rf-stk-feed__item .rf-stk-pact { position: relative; height: 40px; padding: 0 12px; }
.rf-stk-feed__item .rf-stk-pact::after { content: ""; position: absolute; inset: -4px -2px; border-radius: inherit; }
.rf-stk-feed__item .rf-stk-ibtn--journal { position: relative; width: 40px; height: 40px; background: var(--surface-2); }
.rf-stk-feed__item .rf-stk-ibtn--journal::after { content: ""; position: absolute; inset: -4px; border-radius: inherit; }
.rf-stk-feed__item .rf-stk-ibtn--journal svg { width: 18px; height: 18px; }
.rf-stk-feed__item.rf-stk-tone--bad .rf-stk-ibtn--journal,
.rf-stk-feed__item.rf-stk-tone--warn .rf-stk-ibtn--journal,
.rf-stk-feed__item.rf-stk-tone--info .rf-stk-ibtn--journal { background: var(--surface); }
.rf-stk-feed__item--last.rf-stk-tone--ok { background: color-mix(in srgb, var(--good) 14%, var(--surface)); }
.rf-stk-feed__x {
  position: relative;
  flex: none; width: 40px; height: 40px; margin-left: -6px;
  display: grid; place-items: center;
  border: 0; border-radius: 999px; background: none; color: inherit; cursor: pointer; opacity: .75;
}
.rf-stk-feed__x::after { content: ""; position: absolute; inset: -4px; border-radius: inherit; }
.rf-stk-feed__x svg { width: 16px; height: 16px; }

/* Камера видна — лента в одну строку (§2.5): первая строка с решением (.has-act —
   «Отменить», «Открыть», «Сбросить»…), иначе первая. Лента упорядочена по свежести, и
   «только первая» прятала бы «Отменить» под строкой, которая сама не уходит. */
.rf-actbar.has-cam .rf-stk-feed:has(> .has-act) > :not(.has-act),
.rf-actbar.has-cam .rf-stk-feed:has(> .has-act) > .has-act ~ .has-act,
.rf-actbar.has-cam .rf-stk-feed:not(:has(> .has-act)) > :not(:first-child) { display: none; }

/* Ряд действий потока: [действие][⋯] + кнопка источника (srcbar.js). Действие сжимается
   первым — подпись с многоточием, а не перелив: при 360 px ему остаётся 208 px. */
.rf-stk-actions { flex: 1 1 auto; min-width: 0; display: flex; gap: 6px; align-items: center; }
.rf-stk-actions[hidden] { display: none; }
/* 44 px — общая высота ряда над меню (srcbar.css, assembly.css, bind.css): ряд ровный и
   панель на 8 px ниже. Цель касания 44 — нижняя граница, ниже не опускать. */
.rf-stk-act {
  flex: 1 1 auto; width: auto; min-width: 0;
  min-height: 44px; padding: 0 14px; gap: 6px;
  background: var(--surface); font-size: 15px;
}
.rf-stk-act:disabled { opacity: .55; }
.rf-stk-act__txt { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rf-stk-act.rf-btn--primary { background: var(--accent); color: var(--accent-ink); }
.rf-stk-act--add svg { width: 20px; height: 20px; }
.rf-stk-act-gap { flex: 1 1 auto; }
.rf-stk-ibtn--menu { width: 44px; height: 44px; }

/* Невысокий экран (360×640, 360×740): липкая карточка, панель со слотом камеры и меню
   съедали список единиц, по которому опознают предмет тапом. Карточка плотнее ещё на
   шаг; высоту слота камеры позиции держит srcbar.css (17vh / 15vh).
   Строки единиц здесь НЕ трогаем: база уже 48 px, а ниже — цель касания меньше 44. */
@media (max-height: 700px) {
  .rf-stk-stick { padding-top: 4px; padding-bottom: 4px; }
  .rf-stk-target { padding: 6px 10px 6px 16px; gap: 0; }
  .rf-stk-target__big { font-size: clamp(22px, 7vw, 28px); }
  .rf-stk-target__big.is-text { font-size: clamp(20px, 5.8vw, 24px); }
  .rf-stk-target__sub, .rf-stk-target__next { margin-top: 0; }
  .rf-stk-target__sub { font-size: 14px; line-height: 1.3; }
  /* Отступ 4, а не 6: на 360×640 при камере полоса под список единиц была 191 px — на
     один пиксель меньше четырёх строк по 48. Четвёртая строка стоит этих 4 px. */
  .rf-stk-target__line { min-height: 40px; margin-top: 4px; padding: 4px 6px 4px 8px; }
  .rf-stk-line__ico { width: 26px; height: 26px; }
}

/* ---------- лист «⋯»: быстрые действия позиции ('flow') и журнал с настройками ('more').
   Панель по высоте содержимого и прижата к низу: страница быстрых действий короткая, и её
   пункты оказываются под пальцем, а не в верхней трети экрана. */
.rf-stk-sheet {
  position: fixed; inset: 0; z-index: 86;
  display: flex; align-items: flex-end; justify-content: center;
  background: rgba(0, 0, 0, .45);
  animation: menu-fade .2s var(--oui-ease);
}
.rf-stk-sheet__panel {
  width: min(100%, 520px); max-height: 88vh; overflow: auto; overscroll-behavior: contain;
  display: grid; gap: 8px; align-content: start;
  padding: 14px 16px calc(18px + env(safe-area-inset-bottom));
  border-radius: var(--oui-r) var(--oui-r) 0 0;
  background: var(--surface);
  animation: menu-up .38s var(--oui-ease);
}
@media (min-width: 700px) {
  .rf-stk-sheet { align-items: center; }
  .rf-stk-sheet__panel { border-radius: var(--oui-r); }
}
html.rf-stk-sheet-open body { overflow: hidden; }
.rf-stk-sheet__head { display: flex; align-items: center; gap: 8px; padding: 4px 0 2px 8px; }
.rf-stk-sheet__head.has-back { padding-left: 0; gap: 4px; }
.rf-stk-sheet__back svg { transform: scaleX(-1); }
.rf-stk-sheet__title { flex: 1; margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -0.01em; }
.rf-stk-sheet .rf-list__label { margin: 10px 0 2px; padding: 0 8px; }
.rf-stk-sheet .rf-group { background: var(--surface-2); border-radius: 22px; }
.rf-stk-sheet__note { margin: 0; padding: 0 8px; color: var(--muted); font-size: 13px; line-height: 1.45; }
.rf-stk-seg--sheet { background: var(--surface-2); }
[data-theme="dark"] .rf-stk-seg--sheet button[aria-checked="true"] { background: var(--accent-soft); }
.rf-stk-sw { cursor: pointer; min-height: 72px; }
.rf-stk-sw .rf-grow__name { font-size: 16px; }
.rf-stk-sw .rf-grow__sub { font-size: 13px; }
.rf-stk-sw + .rf-stk-sw::before { left: 20px; }
.rf-stk-sheet .rf-grow--pick { min-height: 60px; }
.rf-stk-sheet .rf-grow:active { background: var(--border); }
/* Переключатель строки листа (One UI): «Создавать единицы», «Любая по порядку», «Звук». */
.rf-stk-switch {
  position: relative; flex: none;
  width: 38px; height: 22px; border-radius: 11px;
  background: var(--border-strong);
  transition: background .2s var(--oui-ease);
}
.rf-stk-switch::after {
  content: ""; position: absolute; top: 3px; left: 3px;
  width: 16px; height: 16px; border-radius: 50%;
  background: #fff;
  transition: transform .22s cubic-bezier(.34, 1.4, .64, 1);
}
.rf-stk-sw.is-on .rf-stk-switch { background: var(--accent); }
.rf-stk-sw.is-on .rf-stk-switch::after { transform: translateX(16px); }

/* Пункты потока: «Создавать», «+ Единица», «Ввести номер», «Камера телефона»… */
.rf-stk-flow { cursor: pointer; min-height: 64px; gap: 14px; }
.rf-stk-flow + .rf-stk-flow::before { left: 70px; }
.rf-stk-flow__ico {
  width: 36px; height: 36px; flex: none; border-radius: 999px;
  display: grid; place-items: center;
  background: var(--accent-soft); color: var(--accent-text);
}
.rf-stk-flow__ico svg { width: 20px; height: 20px; }
.rf-stk-flow .rf-grow__name { font-size: 16px; }
.rf-stk-flow .rf-grow__sub { font-size: 13px; }
.rf-stk-flow .rf-grow__sub.is-bad { color: var(--bad-ink); font-weight: 600; }
.rf-stk-flow--more { min-height: 64px; }
/* Невысокий экран (360×640): страница быстрых действий всё равно у пальца — строки плотнее. */
@media (max-height: 700px) {
  .rf-stk-sheet__panel { padding-top: 10px; gap: 6px; }
  .rf-stk-sheet .rf-stk-flow { min-height: 56px; padding-top: 10px; padding-bottom: 10px; }
}
.rf-stk-flow--more .rf-stk-flow__ico { background: var(--surface); color: var(--text); }

/* Журнал — длинный список, его читают пачками: строка 52 (значок 30 + поля 8+8 и два
   яруса текста 15/12). Разделитель от текста: 12 поле + 30 значок + 12 зазор = 54. */
.rf-stk-jrow {
  position: relative;
  display: flex; align-items: center; gap: 12px;
  min-height: 52px; padding: 8px 10px 8px 12px;
}
.rf-stk-jrow + .rf-stk-jrow::before {
  content: ""; position: absolute; top: 0; left: 54px; right: 16px;
  height: 1px; background: var(--border);
}
.rf-stk-jrow__ico {
  width: 30px; height: 30px; flex: none; border-radius: 999px;
  display: grid; place-items: center;
  background: var(--surface); color: var(--muted);
}
.rf-stk-jrow__ico svg { width: 16px; height: 16px; }
.rf-stk-jrow__ico.is-busy { animation: pulse 1s infinite; }
.rf-stk-jrow__main { flex: 1; min-width: 0; display: grid; gap: 2px; }
.rf-stk-jrow__text { font-size: 15px; line-height: 1.3; overflow-wrap: anywhere; }
.rf-stk-tone--bad .rf-stk-jrow__text { color: var(--bad-ink); }
.rf-stk-jrow__sub { font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rf-stk-jrow__acts { flex: none; display: flex; flex-direction: column; gap: 4px; align-items: stretch; }
/* «Повторить» / «Убрать» / «Отменить» журнала — по 44 px: строка с двумя кнопками выше,
   зато в них попадают, а не в соседнюю. */
.rf-stk-jrow__acts .rf-stk-pact { height: 44px; }
.rf-stk-jrow__acts .rf-stk-pact--ghost { background: var(--surface); }
.rf-stk-jrow__done { color: var(--muted); font-size: 12px; font-weight: 600; }

@keyframes stk-in { from { opacity: 0; transform: translateY(6px); } }

@media (prefers-reduced-motion: reduce) {
  .rf-stk-target.is-flash-ok, .rf-stk-target.is-flash-sel, .rf-stk-target.is-flash-bad,
  .rf-stk-unit.is-flash, .rf-stk-target__line.is-new,
  .rf-stk-sheet, .rf-stk-sheet__panel { animation: none; }
}
