/* Режим «Площадка» (venue.js, docs/spec_scanner_checkpoints_levels_locate.md §А.9).

   Каркас — классы сборки и приёмки (assembly.css, returns.css): те же экраны, карточки,
   строки, лента и лист снизу. Отмечающий на площадке — тот же человек, что собирает на
   складе, и второй интерфейс ему учить не надо. Здесь — только то, чего у них нет:
   две полосы этапов на карточке списка, свёрнутые группы цепочки («Выбыли раньше»,
   «Не уезжали со склада», «Лишние») и ряд из трёх действий внизу.

   Цвета — токены lab.css, тёмная тема приходит оттуда же. */

/* ---------- чей экран виден на вкладке #tab-asm.
   data-mode у неё ставит scanflow.js: «Сборка», «Площадка» и «Приёмка» — три пункта
   нижнего меню на одну вкладку. Приёмку в режиме venue уже прячет assembly.css («не
   returns» → #ret-* скрыты), а вот сборку и саму площадку развести больше некому: без
   этого правила в режиме venue поверх пустого #ven-root остался бы живой экран сборки —
   с её списками, лентой и отметками. Правило обязано жить здесь: venue.css грузится
   всегда, даже когда модуль площадки ещё заглушка. */
#tab-asm:not([data-mode="venue"]) :is(#ven-root, #ven-bottom, #ven-sheet),
#tab-asm[data-mode="venue"] :is(#asm-root, #asm-bottom, #asm-sheet) { display: none !important; }

/* ---------- экран списков */
/* Большой заголовок стоит внизу «зоны просмотра», карточки начинаются под большим
   пальцем — то же правило, что у сборки и приёмки (assembly.css), вместе с тем, что зона
   отдаёт своё место карточкам, когда их не хватает на экран (там же — почему). */
#ven-lists {
  display: flex;
  flex-direction: column;
  min-height: calc(100vh - var(--bar-h, 52px) - var(--gutter) - var(--rf-nav-h, 64px) - var(--rf-actbar-h, 0px) - var(--rf-banner-h, 0px) - 24px);
  min-height: calc(100svh - var(--bar-h, 52px) - var(--gutter) - var(--rf-nav-h, 64px) - var(--rf-actbar-h, 0px) - var(--rf-banner-h, 0px) - 24px);
}
#ven-lists > .rf-asm-head {
  flex: 1 0 auto;
  max-height: calc(38vh - var(--bar-h, 52px));
  max-height: calc(38svh - var(--bar-h, 52px));
  align-content: end;
}
#ven-lists > #ven-lists-body { flex: none; }

/* Карточка списка — не кнопка целиком: у неё своя верхняя часть (открыть подсвеченный
   этап) и две полосы этапов. Вид — карточки сборки. */
/* Поля 10/12, а не 14/14: карточка несёт имя, «когда и куда» и две полосы этапов —
   142 px были воздухом, а на 360×640 это половина второй карточки. */
.rf-ven-card { display: grid; gap: 8px; padding: 10px 12px 10px; cursor: default; }
.rf-ven-card__top {
  display: grid; gap: 4px; width: 100%;
  padding: 4px 6px 2px; border: 0; border-radius: 16px;
  background: none; color: inherit; font: inherit; text-align: left; cursor: pointer;
}
.rf-ven-card__top:active { background: var(--surface-2); }

/* Две полосы этапов: «Приезд 38/40 ⚠2» и «Отправка —». Подсвеченная (suggested) —
   янтарная: это и есть подсказка, куда идти. Обе открыты, подсвечена одна. */
.rf-ven-bars { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.rf-ven-bar {
  display: flex; align-items: center; gap: 6px;
  min-height: 48px; padding: 0 12px;   /* цель касания 48 ≥ 44: этап открывают этой полосой */
  border: 0; border-radius: 18px;
  background: var(--surface-2); color: var(--text);
  font: inherit; font-size: 14px; text-align: left; cursor: pointer;
}
.rf-ven-bar:active:not(:disabled) { filter: brightness(.96); }
.rf-ven-bar:disabled { opacity: .5; cursor: default; }
.rf-ven-bar:focus-visible { outline: none; box-shadow: var(--ring); }
.rf-ven-bar__name { flex: 1; min-width: 0; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rf-ven-bar__nums { flex: none; font-variant-numeric: tabular-nums; font-weight: 700; }
.rf-ven-bar__warn { flex: none; display: inline-flex; align-items: center; gap: 2px; color: var(--bad-ink); font-weight: 700; }
.rf-ven-bar__warn svg { width: 14px; height: 14px; }
.rf-ven-bar__ok { flex: none; display: inline-flex; color: var(--good-ink); }
.rf-ven-bar__ok svg { width: 16px; height: 16px; }
.rf-ven-bar.is-hot { background: var(--accent-soft); color: var(--accent-text); }
.rf-ven-bar.is-done { background: color-mix(in srgb, var(--good) 18%, var(--surface-2)); }
[data-theme="dark"] .rf-ven-bar { background: var(--border-strong); }
[data-theme="dark"] .rf-ven-bar.is-hot { background: var(--accent-soft); }

/* ---------- экран этапа */
.rf-ven-where { margin: -2px 0 0; color: var(--muted); font-size: 14px; line-height: 1.4; }
/* Вторая и третья строки прогресса («Не доехали до площадки», «Сборку на складе не
   отмечали») — правила цепочки, а не итог: тише и плотнее. */
.rf-ven-sub--extra { margin-top: -6px !important; font-size: 13px; }
.rf-ven-progress.is-done .rf-ven-sub--extra { color: var(--muted); font-weight: 400; }

/* Значки итогов, которых нет у приёмки: довоз и лишние. Остальные — её же
   (.rf-ret-badge--damaged / --lost): «повреждено» и «не нашли» значат то же самое. */
.rf-ret-badge.rf-ven-badge--late { background: var(--info-soft); color: var(--text); }
.rf-ret-badge.rf-ven-badge--extra { background: var(--warn-soft); color: var(--warn-ink); }

/* Состояния единицы: кружок слева. «На месте» — зелёный, «повреждено» — янтарный,
   «не нашли» — красный, довоз — пунктир янтарём, выбывшая и не уезжавшая — пунктир. */
.rf-ven-tone--ok { background: var(--good); color: var(--accent-ink); }
.rf-ven-tone--damaged { background: var(--mid); color: var(--accent-ink); }
.rf-ven-tone--missing { background: var(--bad); color: var(--accent-ink); }
.rf-ven-tone--wait { background: var(--surface-2); color: var(--muted); }

.rf-ven-unit.is-ok .rf-ret-check { background: var(--good); border-color: var(--good); color: var(--accent-ink); }
.rf-ven-unit.is-damaged .rf-ret-check { background: var(--mid); border-color: var(--mid); color: var(--accent-ink); }
.rf-ven-unit.is-missing .rf-ret-check { background: var(--bad); border-color: var(--bad); color: var(--accent-ink); }
.rf-ven-unit.is-late .rf-ret-check { border-style: dashed; border-color: var(--accent); }
.rf-ven-unit:is(.is-gone, .is-idle) .rf-ret-check { border-style: dashed; border-color: var(--faint); }
.rf-ven-unit:is(.is-ok, .is-damaged) .rf-asm-unit__inv { color: var(--muted); }
.rf-ven-unit.is-ok .rf-asm-unit__sub { color: var(--good-ink); }
.rf-ven-unit.is-damaged .rf-asm-unit__sub { color: var(--warn-ink); }
.rf-ven-unit.is-missing .rf-asm-unit__sub { color: var(--bad-ink); }
/* Пометок у единицы бывает несколько («довоз», «повреждено на приезде», «уже принята на
   складе») — они складываются своим ярусом (.rf-asm-unit__flags, assembly.css), а не режутся
   многоточием. */

/* Строка, по которой на этом этапе ничего не ждут: тише, но отметить можно — единицу
   могли привезти без отметки на складе. */
.rf-ven-line.is-idle .rf-asm-line__name { color: var(--muted); }

/* Подпись «Довоз (N)» внутри строки: те, кого собрали уже после «Завершить».
   Отступ слева — от начала текста строки (assembly.css: 16 + 28 + 12 = 56). */
.rf-ven-sublabel {
  padding: 4px 16px 2px 56px;
  color: var(--accent-text); font-size: 12px; font-weight: 700; letter-spacing: .01em;
}

/* Свёрнутая группа внутри строки и «Лишние»: строка-кнопка с шевроном. Скан единиц из
   свёрнутых групп работает — сервер вернёт их в цепочку сам. */
.rf-ven-fold {
  display: flex; align-items: center; gap: 8px;
  width: 100%; min-height: 44px; padding: 4px 12px 4px 56px;   /* 44 — цель касания, не трогаем */
  border: 0; background: none; color: var(--muted);
  font: inherit; font-size: 13px; font-weight: 700; text-align: left; cursor: pointer;
}
.rf-ven-fold:active { background: var(--surface-2); }
.rf-ven-fold__chev { display: inline-flex; transition: transform .15s var(--oui-ease); }
.rf-ven-fold__chev svg { width: 16px; height: 16px; }
.rf-ven-fold__chev.is-open { transform: rotate(90deg); }
/* «Лишние» — своя капсула вне строк: у неё поля начинаются от края, а не от кольца. */
.rf-group > .rf-ven-fold { padding-left: 18px; }
.rf-ven-extra { cursor: default; }
.rf-ven-extra:active { background: none; }

/* Кнопка «Найти» у заголовка строки: цели — неотмеченные единицы этой строки (§В.1). */
.rf-ven-line__find {
  flex: none; align-self: center;
  width: 44px; height: 44px; padding: 0;
  display: grid; place-items: center;
  border: 0; border-radius: 999px; background: var(--surface-2); color: var(--accent-text);
  cursor: pointer;
}
.rf-ven-line__find svg { width: 20px; height: 20px; }
.rf-ven-line__find:active { filter: brightness(.95); }
.rf-ven-line__find:focus-visible { outline: none; box-shadow: var(--ring); }
[data-theme="dark"] .rf-ven-line__find { background: var(--border-strong); }

/* ---------- нижний ряд: «Завершить», «Найти (N)» и «⋯» — ВСЕ действия экрана (§А.9).
   Шапка действий не несёт: большой палец с рукоятью H103 достаёт только до нижней трети
   экрана. Ряд делит ширину с кнопками источника (srcbar.js), поэтому «Найти» — значок с
   числом, а «⋯» — 44 px без подписи. */
/* Действий три, и рядом стоят кнопки источника («Подключить», ⌨, метки): на 390 px в одну
   строку они не влезают — «Завершить» сжималось до пустого кружка. Поэтому у ПАНЕЛИ
   ПЛОЩАДКИ ряд переносится: действия занимают свою строку во всю ширину, источник — свою.
   Высоту панели nav.js меряет сам (--rf-actbar-h), список сдвигается ровно на эту строку.
   Правило ограничено #ven-bottom: у сборки и приёмки действие одно, и им перенос не нужен. */
#ven-bottom .rf-actbar__row:has(.rf-ven-acts) { flex-wrap: wrap; }
#ven-bottom .rf-actbar__row:has(.rf-ven-acts) > #ven-actions { flex: 1 1 100%; }
#ven-bottom .rf-actbar__row:has(.rf-ven-acts) > #ven-src { flex: 1 1 auto; justify-content: flex-end; }
.rf-ven-acts { display: flex; align-items: center; gap: 6px; min-width: 0; }
.rf-ven-acts > .rf-btn:first-child { flex: 1 1 auto; min-width: 0; }
/* width: auto обязателен: у .rf-btn базовая ширина 100 %, и «flex: none» отдавал бы
   «Найти» всю строку, а «Завершить» сжимался бы до кружка. */
.rf-asm-actions .rf-btn.rf-ven-find {
  flex: 0 0 auto; gap: 4px; width: auto; min-width: 0; padding: 0 12px;
  background: var(--surface); color: var(--accent-text); font-weight: 700;
}
.rf-ven-find svg { width: 20px; height: 20px; }
.rf-ven-find span { font-variant-numeric: tabular-nums; }
[data-theme="dark"] .rf-asm-actions .rf-btn.rf-ven-find { background: var(--surface-2); }
/* Действий три («Завершить», «Найти», «⋯»), и полная подпись перестаёт помещаться
   раньше порога одиночной кнопки (178 px, assembly.css) и раньше, чем у приёмки: у той в
   ряду две кнопки, а здесь третья — «⋯» шириной 44 px, и подписи остаётся на 44 меньше.
   Порог измерен по пикселю на самой длинной подписи («Приезд отмечен»): при 264 px ряда
   она целая, при 263 уже с многоточием (129 > 127). Поэтому 264, а не 250 приёмки. */
@container (width < 264px) {
  .rf-ven-acts .rf-asm-finish__full { display: none; }
  .rf-ven-acts .rf-asm-finish__short { display: inline; }
}
/* 44 — общая высота ряда над меню (srcbar.css): «⋯» стоит рядом с кнопками источника. */
.rf-ven-more {
  flex: none; width: 44px; height: 44px; border-radius: 22px;
  background: var(--surface); color: var(--muted);
}
.rf-ven-more svg { width: 22px; height: 22px; }
[data-theme="dark"] .rf-ven-more { background: var(--surface-2); }

/* «Найти сканером» в окне единицы — строка капсулы, как «Снять отметку». */
.rf-asm-sheet .rf-ven-find__btn {
  min-height: 52px; justify-content: center;
  color: var(--accent-text); font-weight: 600; font-size: 16px;
}

/* Пустые обёртки окон не занимают место (то же правило, что у приёмки). */
[data-fin-queue]:empty, [data-fin-venues]:empty, #ven-sheet [data-sheet-done]:empty,
#ven-sheet [data-sheet-error]:empty { display: none; }
.rf-asm-sheet [data-fin-list] { display: block; max-height: 36vh; overflow: auto; overscroll-behavior: contain; }
.rf-asm-sheet [data-fin-list] .rf-list__label { margin: 12px 0 6px; }
.rf-asm-sheet [data-fin-list] .rf-list__label:first-child { margin-top: 0; }
.rf-asm-sheet [data-fin-list]:empty { display: none; }

@media (prefers-reduced-motion: reduce) {
  .rf-ven-fold__chev { transition: none; }
}
