/* ============================================================================
   kadrum.css — стили нового дизайна админки (Kadrum Admin), которых нет у дизайнера.
   Файлы дизайнера (tokens.css, bundle.css, pages.css) лежат рядом дословно и заменяются целиком при обновлении
   дизайна; всё своё — здесь и в kadrum.js. Порядок подключения: tokens → bundle → pages → kadrum; на страницах
   редакторов между pages и kadrum — photo-template-edit.css (и video-template-edit.css у видео) дизайнера (блок styles в v2/layouts).
   Разделы: 1 основа · 2 каркас и меню · 3 раздел и плита · 4 фильтры и селекты · 5 строка над таблицей ·
   6 таблица · 7 пагинация · 8 массовые действия · 9 тосты · 10 лайтбокс · 11 вход и ошибки ·
   12 редактор фото-шаблона (поверх photo-template-edit.css дизайнера) · 13 редактор видео-шаблона (поверх
   photo-template-edit.css и video-template-edit.css) · 14 адаптив · 15 мобильная версия списка видео (поверх
   video-templates.css дизайнера) · 16 рубрики (поверх rubrics.css дизайнера) · 17 мобильная версия списка фото
   (поверх photo-templates.css дизайнера) · 18 мобильная версия редакторов · 19 рубрики на телефоне ·
   20 шторки снизу: смахнуть вниз.
   ============================================================================ */

/* ---- 1. Основа ------------------------------------------------------------ */
[hidden] { display: none !important; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
/* без зума двойным тапом — у каждого элемента: touch-action действует только до ближайшего прокручиваемого предка, и в
   шторках (.m-sh-body прокручивается) iOS снова ждал двойной тап — второй быстрый тап по флажку съедался (30.09).
   Селектор * без веса: свои жесты (.lb-stage, .vc-bar, ручки) задают классы и перекрывают его */
* { touch-action: manipulation; }
html { color-scheme: light; }
html[data-theme="dark"] { color-scheme: dark; }
.sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
/* ссылки — цвет акцента, как правило a{} / a:hover{} каждой доски (без веса: цвет классов компонентов главнее) */
:where(a) { color: var(--accent-strong); }
:where(a:hover) { color: var(--accent-deep); }
a.kd-btn, a.kd-tab { text-decoration: none; }
.kd-btn { box-sizing: border-box; }   /* ссылка-кнопка и span[aria-disabled]: высота задана с рамкой, как у <button> */
.kd-field__input[type="search"] { -webkit-appearance: none; appearance: none; }
.kd-iconbtn[disabled] { opacity: .5; pointer-events: none; }
.kd-btn:disabled { opacity: .55; cursor: default; pointer-events: none; }   /* как [aria-disabled] в bundle.css: «Ничего не найдено» и т. п. */
button.kd-check { -webkit-tap-highlight-color: transparent; }
.kd-check__label { user-select: none; }

/* Язык названий и описаний в списках: data-lang на <main> (ru | en), тексты выводятся на обоих языках. */
.kd-shell__main[data-lang="en"] .lang-ru,
.kd-shell__main:not([data-lang="en"]) .lang-en { display: none; }

/* ---- 2. Каркас и меню ----------------------------------------------------- */
.kd-shell { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 24px; align-items: start; padding: 12px; min-height: 100vh; min-height: 100dvh; box-sizing: border-box; }
.kd-shell__main { min-width: 0; padding: 0 12px 40px 0; display: flex; flex-direction: column; }

/* тема: солнце ↔ луна */
.kd-icon--moon { display: none; }
[data-theme="dark"] .kd-icon--sun { display: none; }
[data-theme="dark"] .kd-icon--moon { display: block; }

/* меню: развёрнутое показывает окружение и тему, свёрнутое — только кнопку окружения */
.kd-sidebar:not(.kd-sidebar--collapsed) .kd-sidebar__switch { display: none; }
.kd-sidebar--collapsed .kd-sidebar__scope { display: none; }
.kd-sidebar__logout { display: contents; }

/* разделы, которых в новом дизайне ещё нет: не ссылки, приглушены */
.kd-nav--off, .kd-tab--off { opacity: .55; cursor: default; }
.kd-nav--off:hover { background: transparent; color: var(--ink-2); }
.kd-nav--off:hover .kd-nav__iconBox { background: transparent; color: var(--ink-3); }
.kd-sidebar .kd-nav--off:hover .kd-nav__iconBox { background: transparent; }
.kd-tab--off:hover { background: transparent; color: var(--ink-2); }

/* ---- 3. Строка раздела и плита ------------------------------------------- */
.lp-head__text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.lp-head h1 { margin: 0; font-size: 28px; line-height: 1.2; font-weight: 600; letter-spacing: -.02em; color: var(--ink-0); }
.lp-head__text > span { font-size: 13.5px; color: var(--ink-3); }
.lp-tabs { flex: none; }
@media (min-width: 1024px) { .lp-head { min-height: 58px; } }
a.kd-tab, a.kd-seg__opt, a.ptab { letter-spacing: normal; }   /* у досок вкладки — button: межбуквенное не наследуется */   /* все доски: min-height 58 (строка с вкладками была на 2 px ниже) */
.lp-plate__top { display: flex; align-items: center; justify-content: space-between; gap: 24px; }
.lp-plate__title { display: flex; align-items: center; gap: 14px; min-width: 0; }
.lp-plate h2 { margin: 0; font-size: 40px; line-height: 1.05; font-weight: 600; letter-spacing: -.035em; color: var(--plate-ink-0); }
.lp-plate__desc { font-size: 13.5px; color: var(--plate-ink-2); }

/* ---- 4. Фильтры и селекты ------------------------------------------------- */
.lp-fgrid { display: grid; gap: 10px; }
.lp-fgrid--photos { grid-template-columns: minmax(200px, 1fr) repeat(3, minmax(150px, 200px)); }
.lp-fgrid--videos { grid-template-columns: minmax(200px, 1fr) minmax(170px, 220px) minmax(170px, 220px); }
.lp-frow__seg { flex: 0 0 auto; }
.lp-frow__grow { flex-grow: 1; }
/* пока kadrum.js не разложил флаги по строке и «Ещё» (скрипт в конце страницы — после первой отрисовки), они не
   вылезают за карточку: строка обрезана, флаги невидимы; не загрузился скрипт — через 1,5 с всё равно видны */
.lp-frow:not([data-ready]) { overflow: hidden; }
.lp-frow:not([data-ready]) .lp-cb { visibility: hidden; animation: lp-reveal 0s 1.5s forwards; }
@keyframes lp-reveal { to { visibility: visible; } }
.lp-measure { position: fixed; left: -9999px; top: 0; }   /* замер ширины флагов — за пределами страницы, без прокрутки */

/* селект: меню открывается вниз по ширине кнопки, варианты — вправо/вверх */
.kd-selectWrap[data-open] { z-index: 41; }
.kd-selectWrap--up .kd-selectWrap__menu, .kd-selectWrap__menu.is-up { top: auto; bottom: calc(100% + 8px); }
.kd-selectWrap--end .kd-selectWrap__menu { left: auto; right: 0; width: max-content; max-width: min(360px, 92vw); }
.kd-selectWrap--compact .kd-menu__list { max-height: min(440px, 60vh); }
.kd-selectWrap--compact { display: inline-block; }
.kd-selectWrap--compact .kd-select { width: auto; min-height: 34px; padding: 0 8px 0 12px; gap: 6px; font-size: 13.5px; background: var(--card); box-shadow: var(--shadow-tile); }
.kd-selectWrap--compact .kd-select[data-open="true"] { box-shadow: 0 0 0 3px var(--accent-ring); }
.kd-selectWrap--compact .kd-select__value { flex: none; }
.kd-selectWrap--compact .kd-select__caret { width: 16px; height: 16px; }
.kd-select__prefix { flex: none; color: var(--ink-3); white-space: nowrap; }
.kd-select__value[data-placeholder="true"] { color: var(--ink-4); }
.kd-menu__opt:not([data-active="true"]) .kd-menu__check { display: none; }
.kd-menu__opt[disabled] { opacity: .45; cursor: not-allowed; }
.kd-menu__opt[disabled]:hover { background: transparent; }
.kd-menu__empty { padding: 14px 12px; }
.kd-menu__optLabel .lang-ru, .kd-menu__optLabel .lang-en, .kd-select__value .lang-ru, .kd-select__value .lang-en { display: inline; }
.kd-shell__main[data-lang="en"] .kd-menu__optLabel .lang-ru, .kd-shell__main[data-lang="en"] .kd-select__value .lang-ru,
.kd-shell__main:not([data-lang="en"]) .kd-menu__optLabel .lang-en, .kd-shell__main:not([data-lang="en"]) .kd-select__value .lang-en { display: none; }

/* ---- 5. Строка над таблицей ---------------------------------------------- */
.lp-listbar { margin-top: 28px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px 16px; padding: 0 4px; }
.lp-listbar__count { font-size: 17px; font-weight: 600; letter-spacing: -.02em; color: var(--ink-0); font-variant-numeric: tabular-nums; }
.lp-listbar__count span { font-weight: 400; color: var(--ink-3); }
.lp-listbar__tools { gap: 8px; }
.lp-selected { margin-right: 6px; font-size: 13.5px; font-weight: 500; color: var(--accent-deep); font-variant-numeric: tabular-nums; }
.lp-vsep { width: 1px; height: 20px; margin: 0 6px; background: var(--line-strong); }

/* ---- 6. Таблица ------------------------------------------------------------ */
#table { transition: opacity var(--dur) var(--ease-out); }
#table.htmx-request { opacity: .5; pointer-events: none; }
/* Рука — только на кликабельном (ссылки, кнопки, чекбоксы, фото): у строки целиком — обычный курсор
   (pages.css ставит pointer на .lp-row; двойной клик по строке открывает форму — это не повод для руки). */
.lp-row { cursor: auto; }
.lp-table { margin-top: 14px; padding: 8px; overflow-x: auto; overscroll-behavior-x: contain; }
.lp-table__in { min-width: 1112px; }  /* фото: колонка превью 264px (pages.css 29.09) */
.lp-table--videos .lp-table__in { min-width: 990px; }
.lp-th__r { text-align: right; }
.lp-empty a { color: var(--accent-strong); }
.lp-cell-name, .lp-cell-model { min-width: 0; }
.lp-id { display: block; font-size: 13px; font-weight: 500; color: var(--ink-0); text-decoration: none; }
.lp-id:hover { color: var(--accent-deep); }
.lp-meta--id { margin-top: 4px; }
.lp-meta--line { margin-top: 4px; }
.lp-meta--sub { margin-top: 2px; }
.lp-name { font-size: 15px; font-weight: 600; letter-spacing: -.01em; color: var(--ink-0); text-decoration: none; }
.lp-name:hover { color: var(--accent-deep); }
.lp-alt { margin-left: 8px; font-size: 13.5px; color: var(--ink-3); }
.lp-desc { margin-top: 4px; font-size: 13.5px; color: var(--ink-3); }
.lp-desc--none { font-style: italic; }
.lp-tags { display: flex; align-items: center; gap: 6px; margin-top: 8px; min-width: 0; }
.lp-tags .lp-link { min-width: 0; }
.lp-link:hover { color: var(--accent-deep); }
a.lp-rubric:hover { background: var(--fill-hover); color: var(--ink-0); }
.lp-num { text-align: right; }
.lp-num__main { font-size: 17px; font-weight: 600; letter-spacing: -.02em; color: var(--ink-0); }
.lp-actions { display: flex; gap: 2px; justify-content: flex-end; }
.lp-model { font-size: 14px; font-weight: 500; color: var(--ink-0); }
.lp-model--none { font-weight: 400; color: var(--ink-3); }
.lp-poster.is-broken { background: var(--fill); border-radius: 10px; }
.ph-slot.is-broken { background: var(--fill); border-radius: 12px; }
.lp-row--saved { animation: lp-flash 1.4s var(--ease-out); }
.lp-row--hl { animation: lp-flash 2.6s var(--ease-out); }
@keyframes lp-flash { 0%, 35% { background: var(--accent-soft-hi); } }
.lp-locales { flex-wrap: wrap; }

/* ---- 7. Нижняя пагинация --------------------------------------------------- */
.lp-pager { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px; margin-top: 22px; }
.lp-pager .kd-btn { margin: 0 6px; }
.lp-pg { display: inline-grid; place-items: center; min-width: 36px; height: 36px; padding: 0 10px; box-sizing: border-box; border-radius: var(--radius-pill);
  color: var(--ink-2); font-size: 14px; font-weight: 500; text-decoration: none; font-variant-numeric: tabular-nums;
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out); }
a.lp-pg:hover { background: var(--fill); color: var(--ink-0); }
.lp-pg[aria-current="page"] { background: var(--card); color: var(--ink-0); font-weight: 600; box-shadow: var(--shadow-tile); }
.lp-pg--gap { color: var(--ink-4); }

/* ---- 8. Массовые действия -------------------------------------------------- */
.lp-bulk { position: sticky; bottom: 16px; z-index: 35; align-self: center; max-width: 100%; box-sizing: border-box; margin-top: 16px;
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 10px 12px 10px 18px; border-radius: var(--radius-lg);
  background: var(--card-raised); box-shadow: var(--shadow-pop), inset 0 0 0 1px var(--line); animation: kd-drop var(--dur) var(--ease-out); }
.lp-bulk__count { margin-right: 4px; font-size: 14px; font-weight: 600; color: var(--accent-deep); white-space: nowrap; font-variant-numeric: tabular-nums; }
.lp-bulk [data-bulk-value] { display: inline-block; }

/* ---- 9. Тосты (база — K.Toast / K.Toaster в bundle.css, поведение — kadrum.js) -------- */
/* Тостер один на страницу (kadrum.js создаёт section.kd-toaster в body): десктоп — справа сверху, телефон (< 768,
   правило bundle.css) — сверху во всю ширину с полями 16 px. Здесь — отступ под вырез/статус-бар веб-приложения
   и уход закрытого тоста. */
.kd-toaster--top-right { top: calc(16px + env(safe-area-inset-top)); right: calc(16px + env(safe-area-inset-right)); }
@media (max-width: 767px) { .kd-toaster:not(.kd-toaster--contained) { top: calc(12px + env(safe-area-inset-top)); } }
.kd-toaster__item.is-leaving { opacity: 0; transform: translateY(-8px) scale(.97) !important; pointer-events: none; }
.kd-toast__title > span:first-child { min-width: 0; overflow-wrap: anywhere; }
#toasts[hidden] { display: none; }

/* ---- 10. Просмотр фото (база — photo-viewer.css по доскам PhotoViewer*, разметка и листание — kadrum.js) ------ */
/* На досках слой вписан в кадр (absolute) — у нас во весь экран. Сцена .lb-stage — окно Embla: дорожка .lb-track
   из слайдов во всю ширину, внутри — .lb-img в пропорциях фото (aspect-ratio ставит kadrum.js по миниатюре). */
.lb { position: fixed; z-index: 150; }
.lb--m .lb-top > .lb-ib { flex: none; }   /* «Скачать» слева вместо распорки доски (владелец, 30.09) */
.lb--m .lb-top { height: calc(72px + env(safe-area-inset-top)); padding-top: calc(6px + env(safe-area-inset-top)); }
a.lb-ib { text-decoration: none; }
.lb-ib[aria-disabled="true"] { pointer-events: none; }
button.lb-th { flex: none; border: 0; padding: 0; background: var(--plate); color: var(--plate-ink-0); font: inherit; cursor: pointer; }
.lb-keys__gap { width: 10px; }
.lb-stage { align-items: stretch; justify-content: flex-start; overflow: hidden; touch-action: pan-y pinch-zoom; cursor: grab; }
.lb-stage:active { cursor: grabbing; }
.lb-track { display: flex; width: 100%; height: 100%; }
.lb-slide { flex: 0 0 100%; min-width: 0; height: 100%; display: flex; align-items: center; justify-content: center; }
.lb-img { max-width: 100%; }
.lb--m .lb-stage { padding: 0; }   /* поле 16 px доски — у слайда: у окна Embla в поле выглядывал соседний слайд */
.lb--m .lb-slide { padding: 16px; box-sizing: border-box; }
.lb--m .lb-img { max-height: 100%; }
.lb-img img { user-select: none; -webkit-user-select: none; -webkit-user-drag: none; pointer-events: none; }
/* просмотр видео (video-viewer.css по доскам VideoViewer* и VideoEditViewer*; kadrum.js — openVideoViewer): одно видео
   без ленты, листание кнопками, ← →, на телефоне — смахиванием вбок; сцена по центру, поле 16 px на телефоне как на доске */
.lp-poster[data-vlb-open], .lp-noposter[data-vlb-open], .m-post[data-vlb-open] { cursor: zoom-in; }
.lp-poster[data-vlb-open]:focus-visible, .lp-noposter[data-vlb-open]:focus-visible, .m-post[data-vlb-open]:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
.lb--video .lb-stage { align-items: center; justify-content: center; cursor: auto; touch-action: none; }
.lb--video.lb--m .lb-stage { padding: 16px; }
.lb-vid video { display: block; width: 100%; height: 100%; object-fit: cover; background: #000; cursor: pointer; }
.lb-vid:fullscreen video { object-fit: contain; }
.lb-vid:fullscreen { width: 100%; height: 100%; max-width: none; max-height: none; aspect-ratio: auto !important; border-radius: 0; background: #000; }
.vc { user-select: none; -webkit-user-select: none; }
.vc-bar { cursor: pointer; touch-action: none; }
.vc-bar::before { content: ""; position: absolute; left: 0; right: 0; top: -10px; bottom: -10px; }   /* поле для пальца */
.vc-btn, button.vc-rate { cursor: pointer; font-family: inherit; }
button.vc-rate { border: 0; }
.vc-btn:hover, button.vc-rate:hover { background-color: #ffffff1f; }
.vc-btn--main:hover { background: #ffffff38; }
.lb-vid.is-loading::after { content: ""; position: absolute; left: 50%; top: 50%; width: 28px; height: 28px; margin: -14px 0 0 -14px; box-sizing: border-box;
  border-radius: 99px; border: 2.5px solid #ffffff4d; border-top-color: #fff; animation: lb-spin .8s linear infinite; pointer-events: none; }
@keyframes lb-spin { to { transform: rotate(360deg); } }   /* ed-spin — только на страницах редакторов */

/* ---- 11. Вход и страница ошибки -------------------------------------------- */
.kd-auth { display: grid; place-items: center; min-height: 100vh; min-height: 100dvh; padding: 24px 16px; box-sizing: border-box; }
.kd-auth__theme { position: fixed; top: 16px; right: 16px; z-index: 5; }
.kd-auth__main { width: 100%; display: flex; justify-content: center; }
.kd-auth__card { width: min(400px, 100%); box-sizing: border-box; padding: 28px; display: flex; flex-direction: column; gap: 24px; box-shadow: var(--shadow-raise); }
.kd-auth__brand { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.kd-auth__form { display: flex; flex-direction: column; gap: 16px; }
.kd-auth__form .kd-btn { margin-top: 4px; }
.kd-error { width: min(520px, 100%); box-sizing: border-box; margin: 48px auto 0; padding: 32px; display: flex; flex-direction: column; align-items: flex-start; gap: 10px; box-shadow: var(--shadow-raise); }
.kd-auth__main .kd-error { margin: 0; }
.kd-error__code { font-size: 64px; line-height: 1; font-weight: 600; letter-spacing: -.04em; color: var(--accent-strong); font-variant-numeric: tabular-nums; }
.kd-error__title { margin: 4px 0 0; font-size: 24px; line-height: 1.25; font-weight: 600; letter-spacing: -.02em; color: var(--ink-0); }
.kd-error__message { margin: 0; font-size: 14.5px; color: var(--ink-2); }
.kd-error__actions { margin-top: 12px; }
.kd-error__rid { margin: 8px 0 0; color: var(--ink-4); }

/* ---- 12. Редактор фото-шаблона ---------------------------------------------- */
/* Превью «как в приложении» — в пропорциях самого фото (prompt-edit.js ставит aspect-ratio по загруженной
   картинке), без чёрных полос; до загрузки — 510×700, как тумбы галереи. Референс по-прежнему вписывается целиком. */
.pv { aspect-ratio: 51 / 70; }
.pv:not(.pv--ref) img { object-fit: cover; }
/* Разметка — v2/pages/prompts/form.html, _form_body.html, partials/upload_thumb.html; база — photo-template-edit.css
   (дизайнер, подключается блоком styles до этого файла), здесь — то, что макет держал инлайн-стилями, и состояния,
   которых в нём нет (ошибки, загрузка, отключённое «Перегенерить»). Состояние чипов/вкладок — по data-ok. */
.ed-plate__body { flex-grow: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
.ed-plate__row { display: flex; align-items: center; gap: 12px; min-width: 0; }
.ed-id { flex: none; font-size: 15px; font-weight: 500; color: var(--plate-ink-2); }
/* «К списку» и «Отмена» в макете — ссылки a.kd-btn без border-box: 44px и 64px панели; повторяем как нарисовано */
.ed-plate > a.kd-btn, .save > a.kd-btn { box-sizing: content-box; }
.ed-plate .kd-badge { flex: none; }
.ed-form { margin: 0; }
.ed-main { min-width: 0; display: flex; flex-direction: column; gap: 16px; }
/* панель «Сохранить» липнет к низу окна только в пределах своей колонки: колонка тянется на высоту ряда (у сетки
   дизайнера align-items: start), панель — в её низ, иначе при высокой правой колонке она уезжала вверх (владелец, 30.09) */
@media (min-width: 1024px) {
  .ed-grid > .ed-main { align-self: stretch; }
  .ed-main > .save { margin-top: auto; }
}
.ed-card--flags { padding: 18px 20px 6px; }
.flags > .kd-switch + .kd-switch { box-shadow: 0 -1px 0 var(--hairline); }   /* линия между флагами; у дизайнера — по обёрткам .sc-host-x макета */
.ed-h--pv { margin-bottom: 16px; }
.ed-h--tight { margin-bottom: 4px; }
.ed-ptabs { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.ed-ptabs .pt-tabs { max-width: 100%; overflow-x: auto; scrollbar-width: none; }
.ed-ptabs .pt-tabs::-webkit-scrollbar { display: none; }
@media (max-width: 1340px) {   /* колонка формы уже 590px: шесть вкладок в плотную, без прокрутки */
  .ed-ptabs .pt-tabs { gap: 2px; }
  .pt-tab { gap: 4px; padding: 0 10px 0 9px; }
}

/* чипы RU/EN и галочки вкладок: в разметке есть и галочка, и точка — видна одна */
.lp-locale[data-ok="false"] > .kd-icon, .lp-locale[data-ok="true"] > .lp-locale__dot { display: none; }
.pt-tab[data-ok="false"] > .kd-icon, .pt-tab[data-ok="true"] > i { display: none; }
.pt-tab[data-error="true"] { color: var(--danger-ink); }
.pt-tab[data-error="true"][aria-selected="true"] { box-shadow: var(--shadow-tile), inset 0 0 0 1px var(--danger-line); }

/* ошибки полей — под полем (стиль kd-field__error из bundle.css) */
.ed-field .kd-field__error, .ed-sel .kd-field__error, .ed-ref__err { display: block; margin-top: 7px; }
.ed-field--error .ed-in { box-shadow: inset 0 0 0 1px var(--danger-line); }
.ed-field--error .ed-in:focus { box-shadow: inset 0 0 0 1px var(--danger), 0 0 0 3px var(--danger-soft); }
.ed-sel--error .kd-select { border-color: var(--danger-line); }
.ed-warn { margin: 8px 0 0; font-size: 13px; line-height: 1.45; color: var(--warn-ink); }
.pt-area[aria-invalid="true"] { box-shadow: inset 0 0 0 1px var(--danger-line); }
textarea.pt-area { overflow-y: auto; }   /* у дизайнера .pt-area — статичный блок с overflow: hidden: живой промт не прокручивался */
.pt-foot + .kd-field__error { margin-top: 6px; }
.ed-notice { margin-top: 20px; }
.ed-notice + .ed-form .ed-grid { margin-top: 16px; }
.ed-notice__list { margin: 6px 0 0; padding-left: 18px; }
.ed-notice__list li + li { margin-top: 2px; }

/* фото и превью */
.th { position: relative; }
.th--error .th__img { box-shadow: inset 0 0 0 1.5px var(--danger), 0 0 0 3px var(--danger-soft); }
.th--error[aria-pressed="true"] .th__img { box-shadow: 0 0 0 2px var(--card), 0 0 0 4px var(--danger); }
.th--error b { color: var(--danger-ink); }
.th.htmx-request { cursor: progress; }
.th.htmx-request .th__img::after { content: ""; position: absolute; inset: 0; background: #0e0a118c; }
.th.htmx-request .th__img::before { content: ""; position: absolute; z-index: 1; left: 50%; top: 50%; width: 18px; height: 18px; margin: -9px 0 0 -9px;
  box-sizing: border-box; border-radius: 99px; border: 2px solid #ffffff4d; border-top-color: #fff; animation: ed-spin .8s linear infinite; }
.slot-act__grow { flex-grow: 1; }
.regen.regen--off:disabled, .regen.regen--off:hover { background: var(--accent-soft-hi); color: var(--accent-deep); opacity: .55; cursor: not-allowed; }
.ed-ref { display: block; }
.ed-ref.htmx-request { opacity: .6; cursor: progress; }
.ed-ref.is-drop .ref-add, .ed-ref.is-drop .ref { box-shadow: inset 0 0 0 1.5px var(--accent-hot); }
.ed-ref--error .ref-add { box-shadow: inset 0 0 0 1.5px var(--danger-line); }
.ref__img { text-decoration: none; }
.th, .ref-add, label.kd-btn { -webkit-tap-highlight-color: transparent; }

/* панель сохранения: состояния и размеры кнопок */
.save__grow { flex-grow: 1; }
.save .kd-btn--busy { min-width: 96px; }
.saved[hidden], .dirty[hidden] { display: none; }
.dirty, .saved { white-space: nowrap; }
@media (max-width: 1100px) {   /* колонка формы уже 520px: подсказка ⌘S не нужна, статус уходит на вторую строку */
  .save { flex-wrap: wrap; row-gap: 6px; }
  .save .kbd { display: none; }
}

/* ---- 13. Редактор видео-шаблона ------------------------------------------- */
/* Разметка — v2/pages/videos/form.html, _form_body.html, _previews.html, _gallery_job.html, partials/upload_thumb.html
   (kind=poster | video); база — photo-template-edit.css (.ed-*, .save, .flags) и video-template-edit.css (холст VideoEdit,
   дословно). Здесь — то, что холст держал инлайн-стилями или обёртками .sc-host-x, живые поля вместо макетных div и состояния,
   которых в макете нет: загрузка, ошибки, пустые плитки, игра видео. */
.ed-2__wide { grid-column: 1 / -1; }
.ed-2--loc { row-gap: 12px; }
.cb__link { color: var(--accent-strong); }
.cb__link:hover { color: var(--accent-deep); }
.cb__link[hidden] { display: none; }
.cb .ed-sel { flex-grow: 1; min-width: 0; }
.cb + .kd-field__error { display: block; margin-top: 7px; }
.ed-2__wide .kd-selectWrap { display: block; }

/* промт и счётчик под ним */
textarea.pt-area--gen { height: 224px; }
.ed-pcount { display: flex; justify-content: flex-end; margin-top: 8px; font-size: 12.5px; color: var(--ink-4); font-variant-numeric: tabular-nums; }

/* модель, число секунд, ожидание, цена */
.gen-row .ed-field { min-width: 0; }
.ed-in.num { cursor: text; }
.ed-in.num:focus-within { box-shadow: inset 0 0 0 1px var(--accent-strong), 0 0 0 3px var(--accent-ring); }
.ed-field--error .ed-in.num { box-shadow: inset 0 0 0 1px var(--danger-line); }
.ed-num { flex: 1; min-width: 0; width: 100%; padding: 0; border: 0; outline: none; background: transparent; color: inherit; font: inherit; font-size: 15px;
  font-variant-numeric: tabular-nums; -moz-appearance: textfield; appearance: textfield; }
.ed-num::-webkit-outer-spin-button, .ed-num::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.ed-num::placeholder { color: var(--ink-4); }
.cost:empty { display: none; }
.cost.is-over { color: var(--danger-ink); }
.cost.is-over b { color: var(--danger-ink); }
.ed-gen-err { margin: 10px 0 0; }
.motion .kd-switch[aria-disabled="true"] .kd-switch__title { color: var(--ink-2); }

/* референс-видео Motion control: карточка как «Дополнительный референс» фото-редактора */
.ed-ref--video .ref__img { display: block; }
.ed-ref--video .ref__img video { display: block; width: 100%; height: 100%; object-fit: cover; }

/* постер и 360p: плитки .mt */
.media2 > .mt { min-width: 0; }
.mt__v img, .mt__v video { display: block; width: 100%; height: 100%; object-fit: cover; }
.mt__v .pv__shade { pointer-events: none; }
.mt__txt { pointer-events: none; }
.mt__txt b .pv__noen { margin-right: 6px; }
.mt__cap .mt__ratio { color: var(--ink-4); }
.mt__cap .mt__off { color: var(--ink-4); }
.mt__cap .mt__off--err { color: var(--danger-ink); }
.mt__acts > .kd-btn:first-child { flex-grow: 1; justify-content: center; }
.mt__acts > .kd-btn--icon { flex: none; }
.mt .regen { flex: none; }
.mt__v--360 video { filter: brightness(.8); }
.mt__v.is-playing video { filter: none; }
.mt__v.is-playing .play { display: none; }
.mt__v[data-video] { cursor: pointer; }
.mt__v--locked { cursor: default; }
.mt__v--error .pv__empty { color: var(--danger-ink); }
.mt__v--busy img { filter: brightness(.6); }
.mt__v--busy .pv__busy { background: transparent; backdrop-filter: none; font-size: 12.5px; text-align: center; }
.mt--poster.htmx-request { cursor: progress; }
.mt--poster.htmx-request .mt__v::after { content: ""; position: absolute; inset: 0; background: #0e0a118c; }
.mt--poster.htmx-request .mt__v::before { content: ""; position: absolute; z-index: 1; left: 50%; top: 50%; width: 22px; height: 22px; margin: -11px 0 0 -11px;
  box-sizing: border-box; border-radius: 99px; border: 2px solid #ffffff4d; border-top-color: #fff; animation: ed-spin .8s linear infinite; }
.mt--poster.is-drop .mt__v { box-shadow: 0 0 0 2px var(--card), 0 0 0 4px var(--accent-hot); }
.mt--error .mt__v { box-shadow: inset 0 0 0 2px var(--danger); }
.mt--poster > .kd-field__error { margin: 0; }
.media2 + .ed-hint { margin-top: 14px; }
.regen--sm:disabled { cursor: progress; }
.regen--sm .spin { flex: none; }
button.play { padding: 0; border: 0; cursor: pointer; font: inherit; }
button.play:hover { background: #fff; }
.play svg { margin-left: 2px; }

/* превью: плитки 9:16, перетаскивание, загрузка */
.ed-h__n { font-weight: 500; color: var(--ink-4); }
.pvt { min-width: 0; }
.pvt__v video { display: block; width: 100%; height: 100%; object-fit: cover; }
.pvt__v[data-video] { cursor: pointer; }
.pvt__v.is-playing .play { display: none; }
.pvt__drag { z-index: 1; }
.pvt__n, .pvt__drag { pointer-events: auto; }
.pvt--add button { width: 100%; }
.pvt--add small { font-weight: 400; color: var(--ink-4); }
.pvt.sortable-ghost { opacity: .35; }
.pvt.sortable-drag { opacity: .95; box-shadow: var(--shadow-pop); border-radius: var(--radius-md); cursor: grabbing; }
.pvt.sortable-drag .pvt__drag { cursor: grabbing; }
#previews.htmx-request { opacity: .6; cursor: progress; pointer-events: none; }
/* плитка загрузки .pvt--load (доска VideoEdit; строит video-edit.js): карточка не гаснет — гаснут остальные плитки,
   крестик отмены остаётся живым */
#previews.is-uploading.htmx-request { opacity: 1; cursor: auto; pointer-events: auto; }
#previews.is-uploading .pvt:not(.pvt--load) { opacity: .6; pointer-events: none; }
.pvl__arc { transition: stroke-dashoffset .2s linear; }
/* «На весь экран» на плитках 360p и превью — на доске span, у нас кнопка (открывает просмотр видео, kadrum.js) */
button.v-full { z-index: 1; padding: 0; border: 0; font: inherit; }
button.v-full:hover { background: #0e0a11d9; }
.ed-previews__err { margin: 0 0 12px; }
.ed-locked { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; padding: 32px 16px; border-radius: var(--radius-md);
  box-shadow: inset 0 0 0 1.5px var(--line-strong); color: var(--ink-3); font-size: 13px; line-height: 1.4; text-align: center; }

/* ---- 14. Адаптив ------------------------------------------------------------ */
/* Ширины — как в макете «Видео-шаблоны» (video-templates.css; data-bp на <html>): d ≥ 1280 · l 1024–1279 · t 768–1023 · m.
   ≥ 1024 — сайдбар слева; на l он по умолчанию свёрнут (base.html: data-auto до выбора пользователя, kadrum.js).
   < 1024 — без шапки и сайдбара: разделы в нижней панели .m-tb и шторке «Ещё» (§21).
   Части экрана: .kd-desk — только ≥ 1024, .kd-mob — только < 1024 (экраны без мобильного макета их не используют). */
/* Меню не выше окна: верх (логотип или стрелки-подсказка свёрнутого меню) и подвал («Выйти»,
   «Свернуть/Развернуть») закреплены, пункты между ними прокручиваются. Стрелки — не кнопка. */
.kd-sidebar__switch { cursor: default; }
.kd-sidebar__switch:hover { color: var(--ink-3); }
.kd-sidebar__switch:active { transform: none; }
.kd-shell__menu { min-width: 0; }
@media (min-width: 1024px) {
  .kd-mob, .m-top { display: none !important; }
  .kd-shell__side { position: sticky; top: 12px; }
  .kd-shell__side > .m-scrim { display: none; }
  .kd-sidebar { max-height: calc(100vh - 24px); max-height: calc(100dvh - 24px); }
  .kd-sidebar__switch, .kd-sidebar__scope, .kd-sidebar__foot { flex: none; }
  .kd-sidebar__nav { min-height: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: none; }
  .kd-sidebar__nav::-webkit-scrollbar { display: none; }
}

/* l: компактная таблица видео (.lp-grid--l макета): без колонки «Генераций» — счётчик под датой; уже фильтры; без сортировки */
.lp-meta--gen { display: none; margin-top: 2px; }
.lp-listbar__sort { display: contents; }
@media (min-width: 1024px) and (max-width: 1279px) {
  .lp-table--videos .lp-grid { grid-template-columns: 28px 80px 62px minmax(0, 1fr) 140px 150px 72px !important; column-gap: 12px !important; }
  .lp-table--videos .lp-table__in { min-width: 720px; }
  .lp-table--videos .lp-col-gen { display: none; }
  .lp-table--videos .lp-meta--gen { display: block; }
  .lp-fgrid--videos { grid-template-columns: minmax(180px, 1fr) minmax(150px, 190px) minmax(150px, 190px); }
  .lp-listbar--videos .lp-listbar__sort { display: none; }
}

@media (max-width: 1023px) {
  .kd-desk { display: none !important; }
  .kd-shell { display: block; padding: 0; }
  .kd-shell__main { max-width: 1000px; margin: 0 auto; padding: 4px 16px calc(24px + env(safe-area-inset-bottom)); }   /* = .m-body и .m-page дизайнера; + полоса «Домой» */
  .m-menu { bottom: calc(12px + env(safe-area-inset-bottom)); }
  .kd-shell__side:not(.m-layer) { display: none; }
  .lp-plate h2 { font-size: 34px; }
}
@media (min-width: 768px) and (max-width: 1023px) {
  .kd-shell__main { padding: 4px 24px calc(24px + env(safe-area-inset-bottom)); }   /* [data-bp="t"] .m-body */
}
@media (max-width: 359px) {
  .kd-shell__main { padding: 4px 12px calc(24px + env(safe-area-inset-bottom)); }
}

@media (max-width: 900px) {
  .lp-fgrid--photos, .lp-fgrid--videos { grid-template-columns: 1fr 1fr; }
  .lp-fgrid > .kd-field { grid-column: 1 / -1; }
  /* сегмент статуса + флаги не помещаются в одну строку: строка переносится, флаги видны все, без «Ещё» */
  .lp-frow { flex-wrap: wrap; gap: 10px 14px; }
  .lp-frow__seg { flex: 1 1 100%; max-width: 100%; overflow-x: auto; scrollbar-width: none; }
  .lp-frow__seg::-webkit-scrollbar { display: none; }
  .lp-frow__grow { display: none; }
  .lp-reset { margin-left: auto; }
}

/* до 720px — экраны без мобильного макета (фото-шаблоны, редакторы): одна колонка раздела, плита и фильтры плотнее */
@media (max-width: 720px) {
  .lp-head { flex-direction: column; align-items: flex-start; gap: 14px; padding: 12px 0 14px; }
  .lp-tabs { max-width: 100%; overflow-x: auto; scrollbar-width: none; }
  .lp-tabs::-webkit-scrollbar { display: none; }
  .lp-plate { margin-top: 14px; padding: 20px 18px 84px; gap: 8px; }
  .lp-plate__top { flex-wrap: wrap; gap: 14px; }
  .lp-plate h2 { font-size: 28px; }
  .lp-filters { margin: -62px 8px 0; padding: 14px; }
  .lp-fgrid--photos, .lp-fgrid--videos { grid-template-columns: 1fr; }
  .lp-filters .kd-seg__opt { padding: 0 12px; }
  .lp-listbar { margin-top: 20px; flex-direction: column; align-items: flex-start; }
  .lp-listbar__tools { width: 100%; }
  .lp-vsep { display: none; }
  .kd-field__input, .kd-menu__searchInput { font-size: 16px; }   /* iOS не приближает страницу при фокусе */
  .lp-bulk { bottom: 8px; padding: 10px 12px; width: calc(100% - 8px); }
  .lp-pager .kd-btn { margin: 0 2px; }
  .kd-error { margin-top: 24px; padding: 24px; }
  .ph-lb img { height: auto; max-height: 70vh; }
}

/* ---- 15. Мобильная версия списка видео (< 1024) --------------------------------- */
/* База — video-templates.css (m-*, дословно из макета); здесь — то, чего нет в макете: наши ссылки вместо кнопок,
   поля формы в fieldset, скрытые состояния, сортировка селектом, «+» по ширине, блокировка прокрутки под слоями. */
.kd-fs { display: contents; min-width: 0; margin: 0; padding: 0; border: 0; }
a.kd-seg__opt, span.kd-seg__opt { display: grid; place-items: center; text-decoration: none; }
.m-ib--off { opacity: .55; cursor: default; }
.m-ib--off:active { transform: none; }
.m-plate__add { flex: none; }
a.m-add, a.m-rub, a.m-sort { text-decoration: none; }
@media (min-width: 768px) { .m-add { display: none; } }
@media (max-width: 767px) { .m-plate__add { display: none; } }
.m-sum > div { min-width: 0; }
.m-sortWrap { flex: none; }
.m-sum > div:first-child { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }   /* только текст: второй div — сортировка, её меню не обрезать */
.m-reset { margin-left: 6px; font-size: 13.5px; font-weight: 500; color: var(--accent-strong); text-decoration: none; }   /* при фильтре — рядом с «Найдено N», сортировка остаётся справа */
.kd-select.m-sort { width: auto; min-height: 0; }
.m-sort .kd-select__value { flex: none; }
.m-sort .kd-select__caret { width: 14px; height: 14px; }
.m-card__main { min-width: 0; }
.m-dots { padding: 0; }   /* кнопка 28 px, иконка 22: с отступом браузера (1px 6px) точки съезжали от центра подложки */
.m-card .lp-locales { flex-wrap: nowrap; }
.m-pop button { text-align: left; }
.m-pop .kd-icon { flex: none; }
.m-pop--up { top: auto; bottom: 30px; }   /* внизу экрана — над «⋯» (kadrum.js setPop) */
/* мелкие кнопки карточек (как на досках: «⋯» 28, ручка рубрики 28×24, «на весь экран» 28) — зона нажатия пальцем
   шире самой кнопки, вид тот же */
@media (max-width: 1023px) {
  .m-dots, .r-drag { position: relative; }
  .m-dots::after, .r-drag::after, button.v-full::after { content: ""; position: absolute; inset: -8px; }
}
.kd-mob > .lp-empty { padding: 40px 16px; }   /* = .m-page .lp-empty */
.m-sheet .kd-field__input, .m-filters .kd-field__input, .m-filters .kd-menu__searchInput { font-size: 16px; }   /* iOS: без приближения */
html.is-locked, html.is-locked body { overflow: hidden; }
/* доска VideoMobile: полупрозрачный белый фон кнопок шапки, вкладок и сортировки — в тёмной теме как .lp-tabs */
[data-theme="dark"] .m-ib, [data-theme="dark"] .m-seg .kd-seg, [data-theme="dark"] .m-sort { background: var(--card-sunken); }
.m-sh-body { overflow-y: auto; }
[data-bp="t"] .m-list { display: grid; }   /* доска — телефон (m-list flex); на планшете — 2 колонки, как в прежнем макете */   /* на доске overflow: hidden (статичный кадр) — на коротком телефоне шторка прокручивается */
.m-card__bot .lp-locale { gap: 3px; }
.m-card__bot .lp-locale .kd-icon { width: 12px; height: 12px; }
.m-card__bot .lp-locale__dot { margin: 0 2px; }

/* ---- 16. Рубрики (поверх rubrics.css дизайнера) ------------------------------ */
/* Разметка — v2/pages/rubrics/*.html, поведение — rubrics.js. Здесь — то, что макет держал инлайн-стилями, живые поля
   вместо макетных div, перетаскивание, состояния без прав и горизонтальная прокрутка таблицы на узком экране. */
.rb-filters { flex-direction: row; align-items: center; }
.rb-filters__q { flex-grow: 1; min-width: 0; }
.rb-table { margin-top: 28px; padding: 8px; overflow-x: auto; overscroll-behavior-x: contain; }
.rb-table__in { min-width: 940px; }
.rr.sortable-ghost { opacity: .35; }
.rr.sortable-drag { background: var(--card); box-shadow: var(--shadow-pop); }
.drag:active { cursor: grabbing; }
.racts .kd-iconbtn[aria-disabled="true"]:hover { background: transparent; }
.rr .kd-switch[aria-disabled="true"] { cursor: not-allowed; }
/* панель правки (K.Drawer, ширина как в макете) */
.kd-drawer--rubric { width: min(460px, calc(100vw - var(--shell-gap) * 2)); }
@media (max-width: 720px) { .kd-drawer--rubric { width: auto; } }
.rb-form { display: contents; }
.rb-head { min-width: 0; }
.rb-foot { justify-content: space-between; }
.rb-foot__acts { display: flex; gap: 8px; }
input.dr-in { width: 100%; border: 0; outline: none; font: inherit; font-size: 15px; color: var(--ink-0); }
input.dr-in::placeholder { color: var(--ink-4); }
input.dr-in:focus { box-shadow: inset 0 0 0 1px var(--accent-strong), 0 0 0 3px var(--accent-ring); }
.dr-field--error input.dr-in { box-shadow: inset 0 0 0 1px var(--danger-line); }
.kd-drawer__body .kd-field__error { display: block; margin-top: 7px; }
.dr-box { padding: 14px 16px; border-radius: var(--radius-md); box-shadow: inset 0 0 0 1px var(--line); }   /* инлайн-стиль макета */
@media (max-width: 720px) { .rb-filters { flex-wrap: wrap; } .rb-filters__q { flex-basis: 100%; } input.dr-in { font-size: 16px; } }

/* ---- 17. Мобильная версия списка фото (< 1024) ------------------------------------ */
/* База — photo-templates.css (доски PhotosMobile / PhotosMobileFilters, дословно) и общие m-* из video-templates.css;
   разметка — v2/pages/prompts/_card.html, _filters.html. Здесь — то, что доска держала инлайн-стилем или рисовала не
   ссылками: слот фото — ссылка на оригинал (лайтбокс kadrum.js), чип модели, состояние битой картинки. */
a.m-slot { text-decoration: none; }
a.m-slot:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
.m-chips__model { min-width: 0; font-size: 12.5px; color: var(--ink-3); }
.m-slot.is-broken { box-shadow: inset 0 0 0 1px var(--line); }   /* kadrum.js прячет img и ставит is-broken на слот: рамка с подписью */

/* ---- 18. Мобильная версия редакторов фото- и видео-шаблона (< 1024) --------------- */
/* Доски холста «Мобильная › Фото-шаблон › Редактирование» и «… › Видео-шаблон › Редактирование» (29.09.2026): это
   десктопная разметка редактора плюс правила `.mob …` — здесь те же правила под media-запросом, селекторы переложены на
   нашу разметку (v2/pages/prompts|videos/form.html, _form_body.html). Колонки .ed-main / .ed-aside растворяются
   (display: contents), карточки встают одной колонкой в порядке досок (order): фото — Основное, Фото и превью, Промты,
   референс, Флаги; видео — Основное, Постер и 360p, Превью, Генерация (+ референс Motion control), Флаги; панель
   сохранения — последней и не липнет: «Отмена», точка «есть изменения», широкая «Сохранить». */
@media (max-width: 1023px) {
  .lp-head--crumb { min-height: 0; padding: 16px 0; box-shadow: none; }
  .lp-head--crumb h1 { font-size: 26px; }
  .lp-head--crumb .lp-tabs { display: none; }

  .ed-plate { margin-top: 0; padding: 16px; align-items: flex-start; gap: 12px; border-radius: var(--radius-xl); }
  .ed-plate__row { flex-wrap: wrap; row-gap: 6px; }
  .ed-plate h2 { order: 3; flex-basis: 100%; white-space: normal; font-size: 22px; line-height: 1.2; }
  .ed-plate .pmeta { flex-wrap: wrap; row-gap: 4px; font-size: 12.5px; }

  .ed-grid { display: flex; flex-direction: column; align-items: stretch; gap: 16px; margin-top: 16px; }
  .ed-notice + .ed-form .ed-grid { margin-top: 16px; }
  .ed-grid > .ed-main, .ed-grid > .ed-aside { display: contents; }
  .ed-main > .ed-card:nth-of-type(1) { order: 1; }
  .ed-aside > .ed-card:nth-of-type(1) { order: 2; }
  .ed-aside > .ed-card:nth-of-type(2):not(.ed-card--flags) { order: 3; }
  .ed-main > .ed-card:nth-of-type(2), .ed-main > .ed-ref { order: 4; }
  .ed-aside > .ed-card--flags { order: 6; }
  .ed-main > .save { order: 99; }
  .ed-grid .kd-card { padding: 16px; min-width: 0; }
  .ed-h { flex-wrap: wrap; row-gap: 4px; }

  .ed-2 { grid-template-columns: minmax(0, 1fr); }
  /* названия и описания: сначала весь русский блок, затем английский (на доске — .ed-texts > :nth-child) */
  .ed-sep + .ed-2 > :nth-child(1) { order: 1; }
  .ed-sep + .ed-2 > :nth-child(3) { order: 2; }
  .ed-sep + .ed-2 > :nth-child(5) { order: 3; }
  .ed-sep + .ed-2 > :nth-child(2) { order: 4; margin-top: 10px; }
  .ed-sep + .ed-2 > :nth-child(4) { order: 5; }
  .ed-sep + .ed-2 > :nth-child(6) { order: 6; }

  .ed-ptabs .pt-tabs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); width: 100%; box-sizing: border-box; border-radius: 18px; overflow: visible; }
  .pt-tab { justify-content: center; padding: 0 6px; }
  .pt-area, textarea.pt-area--gen { height: 240px; }

  .gen-row { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
  .gen-row > :first-child { grid-column: 1 / -1; }
  .pv { max-width: 340px; margin: 0 auto; }
  .ref { flex-wrap: wrap; }
  .cb__link { font-size: 0; display: grid; place-items: center; width: 44px; height: 44px; border-radius: 12px; background: var(--fill); }
  .cb__link::after { content: "↗"; font-size: 18px; }

  .save { position: relative; bottom: auto; margin: 0; padding: 8px; background: var(--card); box-shadow: var(--shadow-card);
    -webkit-backdrop-filter: none; backdrop-filter: none; border-radius: var(--radius-lg); flex-wrap: nowrap; }
  [data-theme="dark"] .save { background: var(--card); }
  .save .kd-btn--secondary, .save .save__grow, .save .kbd { display: none; }
  .save .kd-btn--primary { order: 3; flex-grow: 1; justify-content: center; }
  .save .kd-btn--ghost { order: 1; }
  .save .dirty, .save .saved { order: 2; margin-left: auto; font-size: 0; gap: 0; }
}

/* ---- 19. Рубрики на телефоне (< 1024; поверх rubrics.css) ---------------------------------- */
/* Доски RubricsMobile / RubricEditMobile. Карточки .r-card (_card.html) в двух блоках [data-rsec] для перетаскивания —
   промежутки как у .m-list доски; фильтры — поиск и «Фильтры» со шторкой (как у видео, kadrum.js + rubrics.js). Панель
   правки #rubric-drawer меньше 1024 — шторка снизу в размерах .m-sheet доски: шапка m-sh-head, крестик .m-close,
   подписи .m-lbl, переключатель в рамке .m-sw, подвал без «Отмены». Смахивание вниз — kadrum.js. */
.rb-msec { display: flex; flex-direction: column; gap: 16px; }
.rb-msec:empty { display: none; }
.rb-sum { flex-direction: column; align-items: flex-start; gap: 0; }
.r-main { min-width: 0; }
.r-drag { cursor: grab; touch-action: none; }
.r-card.sortable-ghost { opacity: .35; }
.r-card.sortable-drag { box-shadow: var(--shadow-pop); }
@media (max-width: 1023px) {
  .kd-drawer--rubric { top: auto; left: 0; right: 0; bottom: 0; width: auto; max-height: 88dvh; border-radius: 28px 28px 0 0;
    background: var(--card-raised); transform: translateY(100%); }
  .kd-drawer--rubric .kd-drawer__head { align-items: flex-start; padding: 10px 20px 12px; box-shadow: none; }
  .kd-drawer--rubric .kd-drawer__title { font-size: 19px; }
  .kd-drawer--rubric .kd-drawer__sub { margin-top: 2px; font-size: 13px; }
  .kd-drawer--rubric .kd-drawer__close { width: 36px; height: 36px; margin: 0; background: var(--fill); color: var(--ink-2); }
  .kd-drawer--rubric .kd-drawer__body { padding: 4px 20px 16px; gap: 16px; }
  .kd-drawer--rubric .dr-lbl, .kd-drawer--rubric .dr-sec { margin-bottom: 8px; font-size: 13px; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--ink-2); }
  .kd-drawer--rubric input.dr-in { min-height: 48px; }
  .kd-drawer--rubric .dr-box { padding: 12px 14px; }
  .kd-drawer--rubric .dr-box .kd-switch { width: 100%; flex-direction: row-reverse; justify-content: space-between; }
  .kd-drawer--rubric .kd-drawer__foot { gap: 10px; padding: 12px 20px 30px; }
  .kd-drawer--rubric .rb-foot > span { flex: none; }
  .kd-drawer--rubric .rb-foot__acts { flex-grow: 1; }
  .kd-drawer--rubric .rb-foot .kd-btn--secondary { display: none; }
  .kd-drawer--rubric .rb-foot .kd-btn--primary { flex-grow: 1; justify-content: center; }
}

/* ---- 20. Шторки снизу: смахнуть вниз ------------------------------------------------------ */
/* kadrum.js: за ручку .m-grab и шапку шторки (.m-sh-head, шапка K.Drawer в режиме шторки) — тянем вниз, отпустили
   ниже порога — закрыть; выше — вернуть. Жест не отдаём прокрутке страницы. */
.m-grab, .m-sh-head { touch-action: none; }
.m-grab { cursor: grab; }
@media (max-width: 1023px) {
  .kd-drawer--rubric .kd-drawer__head { touch-action: none; }
}
.is-sheet-drag { transition: none !important; }   /* animation не трогаем: её снятие и возврат заново проигрывает въезд шторки */
/* без размытия фона под шторками и меню на телефоне: backdrop-filter на слое во весь экран пересчитывается каждый кадр
   въезда, смахивания и затемнения — анимации дёргались (владелец, 30.09). Затемнение (--scrim) остаётся. */
@media (max-width: 1023px) {
  .m-scrim, .kd-drawer__backdrop { -webkit-backdrop-filter: none; backdrop-filter: none; }
}
.m-sheet, .kd-drawer { will-change: transform; }
.m-grab { position: relative; }
.m-grab::before { content: ""; position: absolute; inset: -12px -80px -10px; }   /* ручка 40×5 — ловим палец шире */

/* ---- 21. Нижняя панель разделов и шторка «Ещё» (< 1024; доски 30.09, video-templates.css — .m-tb, .mm-*) ---- */
/* Разметка — partials/tabbar.html (внутри .kd-shell). На доске панель в кадре (absolute, 83 px с полосой «Домой» 34 px) — у нас fixed,
   полоса — env(safe-area-inset-bottom) (без неё 8 px). Неактивные разделы — как в сайдбаре (.kd-nav--off). */
.m-tb { position: fixed; z-index: 60; height: auto; padding: 7px 4px max(8px, env(safe-area-inset-bottom)); }
.m-tb > * { display: flex; flex-direction: column; align-items: center; gap: 2px; min-width: 0; font-size: 10.5px; font-weight: 500;
  letter-spacing: .01em; color: var(--ink-3); text-decoration: none; }
.m-tb > * > span { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.m-tb > button { padding: 0; border: 0; background: none; font-family: inherit; cursor: pointer; }
.m-tb > button:hover { color: var(--ink-1); }
body:has(#m-more:not([hidden])) .m-tb > button { color: var(--accent-strong); }   /* «Ещё» открыта — вкладка активна, как на доске */
.m-tb__off { opacity: .45; cursor: default; }
[data-theme="dark"] .m-tb { background: color-mix(in srgb, var(--card) 84%, transparent); }
@media (min-width: 1024px) { .m-tb { display: none; } }
@media (max-width: 1023px) {
  .kd-shell:has(> .m-tb) .kd-shell__main { padding-bottom: calc(73px + max(8px, env(safe-area-inset-bottom))); }   /* панель 49 + 24 */
  .kd-shell__main { padding-top: calc(4px + env(safe-area-inset-top)); }   /* шапки нет (доски 30.09, вечер) — сразу заголовок */
  /* Верх страницы — ровно цвет статус-бара (theme-color = --page, partials/head.html) и плавно в фон дизайнера: на iOS
     background-attachment: fixed не работает, фон .kd-page растянут на всю страницу, и сверху была тёмная виньетка
     --page-tint — полоса у статус-бара (владелец, 30.09). */
  .kd-page { background-image: linear-gradient(var(--page), var(--page) 16px, transparent 220px), var(--page-tint); }
  /* статус-бар веб-приложения прозрачный (viewport-fit=cover) — под ним полупрозрачная подложка цвета страницы с
     размытием, как у нижней панели: прокрученный текст не лезет под часы; вверху страницы сливается с фоном. В слое
     .kd-page (как и панель) — затемнение шторок ложится поверх неё */
  .kd-shell::after { content: ""; position: fixed; z-index: 55; left: 0; right: 0; top: 0; height: env(safe-area-inset-top); pointer-events: none;
    background: color-mix(in srgb, var(--page) 86%, transparent); -webkit-backdrop-filter: saturate(1.8) blur(20px); backdrop-filter: saturate(1.8) blur(20px); }
}
.mm-sheet { padding-bottom: env(safe-area-inset-bottom); }
.mm-head { justify-content: flex-start; gap: 12px; }   /* шапка шторки — на доске инлайн-стили */
.mm-logo { flex: none; width: 40px; height: 40px; border-radius: 11px; }
.mm-brand { flex: 1; min-width: 0; }
.mm-brand h3 { font-family: var(--font-sans); font-weight: 700; letter-spacing: -.03em; }
.mm-brand div { font-size: 12.5px; color: var(--ink-3); }
.mm-brand .mm-env { margin-left: 2px; }
.mm-row > .kd-switch { flex: none; }
.mm-switch { flex: none; font-size: 14.5px; font-weight: 500; color: var(--accent-strong); }
.mm-switch[aria-disabled="true"] { opacity: .45; cursor: default; }
.mm-body { gap: 16px; padding-bottom: 16px; }
button.m-sh-x { padding: 0; border: 0; cursor: pointer; }
.mm-row--off { cursor: default; }
.mm-row--off > * { opacity: .5; }
.mm-form { display: contents; }
button.mm-row { width: 100%; border: 0; background: none; font-family: inherit; text-align: left; cursor: pointer; }
.mm-form > .mm-row { box-shadow: 0 -1px 0 var(--hairline); }   /* разделитель .mm-row + .mm-row доски — через форму не доходит */
.lp-poster span, .m-post span { font-variant-numeric: tabular-nums; white-space: nowrap; }   /* длительность на постере */
.m-name a { color: inherit; text-decoration: none; }   /* название карточки — ссылка на редактор, как .lp-name строки */

/* ---- 22. Задания (поверх tasks.css доски; разметка — v2/pages/tasks/*) --------------------------- */
/* шапка: заголовок слева, здоровье очереди (.qh доски, приходит со сводкой) справа; плита — вкладки статусов вместо
   кнопки «Добавить»; карточка фильтров (доски Tasks, TasksFilters) — поиск и период строкой, ниже 4 селекта, «Ещё фильтры»
   и «Сбросить», под ними панель .fpanel (шаблон, движок, реакция, «На странице», флажки) */
.qh a { color: inherit; text-decoration: none; }
.qh a:hover b { color: var(--accent-strong); }
.qh .bad { display: inline-flex; align-items: center; gap: 7px; font-weight: 600; color: var(--danger-ink); }
.qh .bad::before { content: ""; width: 8px; height: 8px; border-radius: 99px; background: var(--danger-ink); box-shadow: 0 0 0 3px var(--danger-soft); }
.qh--alarm { box-shadow: inset 0 0 0 1px var(--danger); }
[data-theme="dark"] .qh { background: var(--card-sunken); }
.t-tabs { display: flex; gap: 4px; padding: 4px; border-radius: 999px; background: var(--plate-fill); box-shadow: inset 0 0 0 1px var(--plate-line); }
a.ptab { text-decoration: none; }
.t-phrase a { color: inherit; }
/* колонки (владелец 01.10: «пользователи не влазят, названиям столько места не надо»): на 1440 — как на доске (196 · 108 ·
   ~244 · 164 · 172 · 144), шире — запас делят «Что генерировали» и «Пользователь» (1 : 0.6), пользователь не уже 144;
   уже 1380 — узкие колонки (меню развёрнуто — иначе «Что генерировали» сжималось до 80 px), но полоска «вход → образец
   → результат» — всегда 196: три миниатюры 54 px и стрелки (194 px) не влезали в 164 и наезжали на #id задания */
@media (min-width: 1380px) { .tgrid { grid-template-columns: 196px 108px minmax(0, 1fr) 164px 172px minmax(144px, .6fr); } }
@media (min-width: 1280px) and (max-width: 1379px) {
  .tgrid { grid-template-columns: 196px 100px minmax(0, 1fr) 150px 150px minmax(128px, .6fr); column-gap: 12px; }
}
/* «Готово» без числа, когда вкладки с числами не влезают рядом с заголовком плиты (kadrum.js [data-fit]) */
.lp-count { white-space: nowrap; }
[data-fit-drop][data-fit-off] { display: none; }
[data-fit][data-fit-wrap] { flex-wrap: wrap; row-gap: 14px; }   /* и без числа не влезло — вкладки строкой ниже */
/* карточка телефона (доска TasksMobile): «#id · Имя · все» строкой; на доске — инлайн-стили */
.t-user .tuid { display: inline; margin: 0; font-size: 12px; }
.t-user .tall { margin: 0 0 0 auto; }
.t-uname { color: var(--ink-1); text-decoration: none; }
.t-frow { display: flex; gap: 10px; align-items: center; }
.t-frow > .kd-field { flex-grow: 1; min-width: 0; }
.t-fgrid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)) auto auto; gap: 10px; align-items: center; }
.t-fgrid .kd-selectWrap, .t-fgrid .kd-select, .fpanel-grid .kd-selectWrap, .fpanel-grid .kd-select { min-width: 0; }
.fpanel-grid .kd-select { width: 100%; box-sizing: border-box; }
.fmore { cursor: pointer; }
.fmore:hover { background: var(--fill-hover); color: var(--ink-0); }
.fmore[aria-pressed="true"]:hover { background: var(--accent-soft-hi); color: var(--accent-deep); }
/* период (kd.drp, kadrum.js строит окно): ячейки дней — кнопки, как у bundle.css; на телефоне в шторке — окном снизу */
.kd-drp__trigger > span { overflow: hidden; text-overflow: ellipsis; }
.kd-drp__pop[hidden] { display: none; }
/* с досок Tasks / TasksMobilePeriod — общие для всех экранов с календарём (задания, пользователи) */
.kd-drp__trigger { white-space: nowrap; }
@media (max-width: 600px) {
  .kd-drp__pop { box-shadow: 0 0 0 100vmax #120e1657, var(--shadow-pop); }
}
/* планшет (601–1023, шторка фильтров та же): правила телефона из bundle.css (≤ 600, календарь снизу — 30.09 вечером
   пресеты одной строкой и большие кнопки внизу, как в шторке) — только для календаря в шторке .tf-drp */
@media (min-width: 601px) and (max-width: 1023px) {
  .tf-drp .kd-drp__pop { position: fixed; inset: auto 0 0; grid-template-columns: 1fr; max-height: 88dvh; overflow-y: auto; border-radius: 28px 28px 0 0;
    box-shadow: 0 0 0 100vmax #120e1657, var(--shadow-pop); }
  .tf-drp .kd-drp__presets { flex-flow: row nowrap; gap: 6px; min-width: 0; overflow-x: auto; padding: 20px 20px 8px; background: transparent; scrollbar-width: none; }
  .tf-drp .kd-drp__presets::-webkit-scrollbar { display: none; }
  .tf-drp .kd-drp__preset { flex: none; border-radius: var(--radius-pill); padding: 9px 14px; font-size: 14px; background: var(--fill); }
  .tf-drp .kd-drp__months { flex-direction: column; align-items: center; }
  .tf-drp .kd-drp__month { width: 100%; max-width: 320px; }
  .tf-drp .kd-drp__info { display: none; }
  .tf-drp .kd-drp__foot { position: sticky; bottom: 0; z-index: 1; padding: 12px 20px calc(30px + env(safe-area-inset-bottom, 0px)); background: var(--card-raised); }
  .tf-drp .kd-drp__foot .kd-row { flex: 1; display: flex; gap: 10px; }
  .tf-drp .kd-drp__foot .kd-row > :last-child { flex: 1; }
  .tf-drp .kd-drp__foot .kd-btn { height: 42px; padding: 0 18px; font-size: 14.5px; }
  .tf-drp .kd-drp__foot .kd-btn--quiet { background: var(--card); color: var(--ink-0); border-color: var(--line-strong); box-shadow: var(--shadow-tile); }
}
/* над таблицей: чипы скрытых фильтров (пользователь, ошибка) и пояснения сервера */
.t-notes { margin-top: 18px; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 0 4px; }
.t-chip { display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 8px 0 12px; border-radius: 99px; background: var(--accent-soft-hi);
  color: var(--accent-deep); font-size: 13px; font-weight: 500; text-decoration: none; }
.t-chip:hover { background: var(--accent-soft); }
.t-note { flex-basis: 100%; margin: 0; font-size: 13px; color: var(--ink-3); }
.t-span { margin-right: 6px; font-size: 13.5px; color: var(--ink-3); font-variant-numeric: tabular-nums; white-space: nowrap; }
.t-table { margin-top: 14px; padding: 8px; }
.tr { cursor: auto; }   /* курсор-рука — только на кликабельном (владелец 29.09): строка открывается двойным кликом */
.t-row--muted { opacity: .6; }
a.ts-b, a.tsm-b { color: inherit; text-decoration: none; cursor: zoom-in; }
.tcost .t-extra { color: var(--warn-ink); }
.pg-end, .t-pg-end { width: auto; padding: 0 10px; text-decoration: none; }
/* нет строк: тяжёлый запрос / пусто — карточка с кнопками */
.t-state { padding: 36px 24px; display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center; }
.t-state__title { margin: 0; font-size: 17px; font-weight: 600; color: var(--ink-0); }
.t-state__text { margin: 0; max-width: 520px; font-size: 14px; color: var(--ink-3); }
.t-state__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 8px; }
.t-state--heavy .t-state__title { color: var(--warn-ink); }
/* телефон: шторка фильтров (сетка селектов 2×3 доски), «Очередь не в норме», название-ссылка */
.t-sh-body { gap: 18px; }
.tf-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; }
.tf-grid .kd-selectWrap { min-width: 0; }
/* меню селекта в сетке шторки — не шире двух колонок; у правой колонки — от правого края: иначе меню вылезало за шторку
   и тело шторки уезжало вбок (владелец, 30.09: «Что покупали» в «Оплатах») */
.tf-grid .kd-selectWrap__menu { max-width: calc(200% + 10px); }
.tf-grid > :nth-child(2n) .kd-selectWrap__menu, .tf-grid > .kd-selectWrap:nth-child(2n) > .kd-selectWrap__menu { left: auto; right: 0; }
.qok--alarm { color: var(--danger-ink); }
.qok--alarm::before { background: var(--danger-ink); }
[data-theme="dark"] .qok { background: var(--card-sunken); }
a.t-name { text-decoration: none; }
.t-top .m-dotsw { margin-left: auto; }
.t-top .m-dotsw .m-dots { margin: -6px -6px -6px 0; }
.t-card .t-bot .kd-badge { flex: none; }
@media (min-width: 1024px) and (max-width: 1279px) {
  .tgrid { grid-template-columns: 196px 96px minmax(0, 1fr) 140px 140px 120px !important; column-gap: 12px !important; }
  .t-fgrid { grid-template-columns: repeat(2, minmax(0, 1fr)) repeat(2, minmax(0, 1fr)); }
  .t-fgrid .fmore, .t-fgrid .lp-reset { grid-row: 2; }
  .fpanel-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .qh { gap: 10px; padding: 0 12px; }
}

/* ---- 23. Карточка задания (поверх task-view.css досок TaskView / TaskViewMobile; разметка — v2/pages/tasks/detail.html) ---- */
/* плита доски (там — инлайн-стили): «К списку», #id и копирование, название, статус; строка времени; «Ссылка» */
.tv-plate { margin-top: 24px; padding: 22px 24px 22px 20px; display: flex; align-items: center; gap: 16px; }
.tv-plate__main { flex-grow: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
.tv-plate__top { display: flex; align-items: center; gap: 12px; min-width: 0; }
.tv-id { font-family: var(--font-mono); font-size: 15px; font-weight: 500; color: var(--plate-ink-2); }
.tv-plate h2 { margin: 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: 30px; line-height: 1.1; font-weight: 600; letter-spacing: -0.03em; color: var(--plate-ink-0); white-space: nowrap; }
button.tv-copy { flex: none; padding: 0; border: 0; cursor: pointer; }
button.tv-copy:hover { background: var(--plate-fill-hover); color: var(--plate-ink-0); }
.tv-status { flex: none; display: inline-flex; align-items: center; gap: 6px; }
.tv-run { flex: none; width: 11px; height: 11px; margin-right: 7px; border-radius: 99px; border: 2px solid currentColor; border-right-color: transparent; box-sizing: border-box; animation: tvspin .8s linear infinite; }
.tv-share { flex: none; }
.tv-when__m { display: none; }
/* две колонки доски: слева карточки задания, справа (360 px) — кадры, пользователь, действия, воркер, раскрывашки */
.tv-grid { margin-top: 20px; display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 20px; align-items: start; }
.tv-main, .tv-side { min-width: 0; display: flex; flex-direction: column; gap: 16px; }
main .tv-side .tv-kv { grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr); }
/* вход → образец → результат: столбцов по числу плиток (--n), без входа и образца — один результат */
.tv-media .tv-flow { grid-template-columns: repeat(var(--n, 2), 132px 16px) minmax(0, 1fr); }
.tv-media .tv-flow--solo { grid-template-columns: minmax(0, 420px); }
.tv-ph__a { display: block; border-radius: var(--radius-md); cursor: zoom-in; }
.tv-ph video.s { display: block; width: 100%; aspect-ratio: 3/4; object-fit: cover; border-radius: var(--radius-md); background: var(--fill); }
.tv-ph__none, .tv-ph__file { display: grid; place-items: center; aspect-ratio: 3/4; padding: 6px; border-radius: var(--radius-md); box-shadow: inset 0 0 0 1px var(--line-strong);
  box-sizing: border-box; font-size: 12px; font-weight: 500; color: var(--ink-3); text-align: center; text-decoration: none; }
.tv-ph__file { gap: 4px; color: var(--accent-strong); }
a.tv-res { display: block; cursor: zoom-in; }
/* результат — целиком, в своих пропорциях (владелец 30.09; на доске — 4:3 с обрезкой): рамка по картинке, на десктопе
   не выше 560 px и 70 % окна; на телефоне — на всю ширину, без предела высоты */
.tv-res:has(> img) { width: fit-content; max-width: 100%; }
.tv-res > img { width: auto; max-width: 100%; height: auto; max-height: min(560px, 70vh); aspect-ratio: auto; object-fit: contain; }
.tv-res--none, .tv-res__none { display: grid; place-items: center; align-content: center; gap: 10px; aspect-ratio: 4/3; font-size: 13.5px; color: var(--ink-3); }
/* промт и анализ фото: «Показать полностью» [data-tv-more] раскрывает; короткий — без маски и кнопки (--fit, kadrum.js) */
.tv-prompt p { white-space: pre-wrap; word-break: break-word; }
.tv-prompt button { cursor: pointer; }
.tv-prompt[data-open] p, .tv-prompt--fit p { height: auto; -webkit-mask: none; mask: none; }
.tv-prompt--fit { padding-bottom: 14px; }
.tv-prompt--fit > button { display: none; }
/* попытки: строка «Код» (.tv-code доски) — ссылка без подчёркивания; ошибка — «Показать полностью»; на телефоне — за кнопкой */
.tv-code a { display: inline-grid; text-decoration: none; }
.tv-a .err[data-open] span { display: block; -webkit-line-clamp: unset; overflow: visible; }
.tv-a .err .errmore { display: flex; }
.tv-a [aria-expanded="true"] svg:last-child, .tv-a .err[data-open] .errmore svg { transform: rotate(180deg); }
.tv-card .tv-a .errbtn { display: none; }
.tv-a--raw b { display: block; margin-bottom: 2px; }
.tv-probe { cursor: pointer; }
.tv-probe:hover { background: var(--fill-hover); color: var(--ink-0); }
.tv-probe:disabled { opacity: .6; cursor: default; }
.tv-probe-note { margin-left: auto; font-size: 12.5px; }
.tv-probe-out:not(:empty) { margin-top: 14px; }
.tv-probe-res { display: flex; flex-direction: column; gap: 8px; }
.tv-probe-res > .tv-note { margin-top: 0; }
/* итоги действий, ответ провайдера, экран удаления */
.tv-out { margin: 0; padding: 10px 12px; border-radius: var(--radius-sm); background: var(--card-sunken); font-size: 13px; line-height: 1.45; color: var(--ink-2); }
.tv-out > b { display: block; font-size: 13.5px; font-weight: 600; color: var(--ink-0); }
.tv-out p { margin: 4px 0 0; }
.tv-out code { font-family: var(--font-mono); font-size: 12px; }
.tv-out .tv-dl { margin-top: 8px; }
.tv-out .tv-dl dt, .tv-out .tv-dl dd { padding: 7px 0; font-size: 12.5px; }
.tv-out--success { background: var(--ok-soft); }
.tv-out--success > b { color: var(--ok-ink); }
.tv-out--error { background: var(--danger-soft); }
.tv-out--error > b { color: var(--danger-ink); }
.tv-out--warn { background: var(--warn-soft); }
.tv-out--warn > b { color: var(--warn-ink); }
.tv-out__acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.tv-acts-out:not(:empty) { margin-top: 10px; display: flex; flex-direction: column; gap: 8px; }
/* действия поддержки — кнопки .tv-act доски */
button.tv-act { width: 100%; border: 0; font: inherit; color: inherit; }
button.tv-act:not([aria-disabled="true"]):hover { background: var(--fill-hover); }
button.tv-act.htmx-request { opacity: .7; cursor: progress; }
/* кадры и деньги: судьба возврата, переплата; журнал кадров */
.tv-stat em.ok { color: var(--ok-ink); }
.tv-stat em.bad { color: var(--danger-ink); }
.tv-stat em.warn { color: var(--warn-ink); }
.tv-ledger { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; gap: 4px; font-size: 13px; color: var(--ink-2); }
.tv-ledger li { display: grid; grid-template-columns: 40px minmax(0, 1fr) auto; gap: 8px; align-items: baseline; }
.tv-ledger b { font-weight: 600; color: var(--ink-0); font-variant-numeric: tabular-nums; }
.tv-ledger b.ok { color: var(--ok-ink); }
.tv-ledger time { font-size: 12px; color: var(--ink-4); font-variant-numeric: tabular-nums; }
.tv-user > div > span .kd-badge { height: 20px; font-size: 11px; }
.tv-btns--one { grid-template-columns: 1fr; margin-top: 12px; }
/* вердикт (на доске нет — только у заданий не «Готово») */
.tv-verdict__text { margin: 0; font-size: 15px; line-height: 1.45; font-weight: 500; color: var(--ink-0); }
.tv-verdict--bad .tv-verdict__text { color: var(--danger-ink); }
.tv-verdict--warn .tv-verdict__text { color: var(--warn-ink); }
.tv-verdict--ok .tv-verdict__text { color: var(--ok-ink); }
.tv-issues { margin: 8px 0 0; padding-left: 18px; display: flex; flex-direction: column; gap: 4px; font-size: 13.5px; color: var(--ink-2); }
.tv-issues .is-bad { color: var(--danger-ink); }
.tv-issues .is-warn { color: var(--warn-ink); }
.tv-vo--ok { color: var(--ok-ink); }
.tv-vo--bad { color: var(--danger-ink); }
.tv-vo--warn { color: var(--warn-ink); }
.tv-vo--run { color: var(--ink-3); }
/* воркер */
.tv-work .tv-dl { margin-top: 4px; }
.tv-job-err { color: var(--danger-ink); word-break: break-word; }
.tv-job-errors { margin: 6px 0 0; padding-left: 20px; display: flex; flex-direction: column; gap: 4px; font-size: 12.5px; color: var(--ink-2); }
.tv-job-errors code { font-family: var(--font-mono); font-size: 12px; color: var(--ink-3); }
/* «События» и «Все поля» — ссылки .tv-link → панель: K.Drawer справа (.tv-drw, 520 px доски) или экран телефона .mp
   (kadrum.js меняет классы по data-cls-d / data-cls-m); у .mp доски — safe-area и прокрутка тела */
.tv-drw { width: min(520px, calc(100vw - var(--shell-gap) * 2)); }
.tv-panel.kd-drawer .tv-panel__m, .tv-panel.mp .tv-panel__d { display: none; }
.tv-panel.mp { position: fixed; z-index: 120; }
.tv-panel.mp[data-open="false"] { display: none; }
.tv-panel .mp-top { padding-top: calc(14px + env(safe-area-inset-top)); }
.tv-panel .mp-body { overflow-y: auto; overscroll-behavior: contain; }
.tv-panel .mp-foot { padding-bottom: max(12px, env(safe-area-inset-bottom)); }
button.mp-bk { padding: 0; border: 0; cursor: pointer; }
button.ev-chip { border: 0; font-family: inherit; line-height: 1; cursor: pointer; }
button.ev-chip:not(.ev-chip--on):hover { background: var(--fill-hover); color: var(--ink-0); }
button.tv-copy2 { padding: 0; border: 0; background: none; cursor: pointer; }
.ev-more { cursor: pointer; }
.ev-p dd.e { cursor: pointer; }
.ev-p dd.e.is-open { display: block; -webkit-line-clamp: unset; overflow: visible; }
/* крупный просмотр задания (task-media.css доски TaskMedia): триггеры в карточке и списке, слой .lb--tm */
.tv-res[data-tm-open], .tv-ph [data-tm-open], .ts-b[data-tm-open], .tsm-b[data-tm-open] { cursor: zoom-in; }
.lb--tm .lb-stage { align-items: center; justify-content: center; touch-action: none; }
.lb--tm.lb--m .lb-stage { padding: 16px; }   /* как .lb--m .lb-stage доски TaskMediaMobile */
.lb--tm .tm-f[href] { cursor: zoom-in; }
.lb--tm a.tm-open { text-decoration: none; cursor: pointer; }
.lb--tm .lb-img > .tm-f--ph { position: absolute; inset: 0; border-radius: inherit; }
/* «Генерируется» на телефоне (доска TaskMediaMobileRunning: инлайн-стили) — плитка во всю сцену с отступами 16, без подписи */
.lb--tm .lb-img--gen { width: 100%; height: 100%; padding: 0 16px; box-sizing: border-box; background: none; box-shadow: none; }
.lb--tm .lb-img--gen .tm-gen { height: 100%; border-radius: 18px; }
.lb--tm .lb-img--gen .lb-cap { display: none; }
.tm-bar i { transition: width 1s linear; }
.lb--tm .lb-th { padding: 0; border: 0; background: none; cursor: pointer; }
.tv-state { margin-top: 20px; }
.tv-find { max-width: 520px; margin: 4px auto 0; }
@media (min-width: 1024px) and (max-width: 1279px) {
  .tv-grid { grid-template-columns: minmax(0, 1fr) 320px; }
  .tv-media .tv-flow { grid-template-columns: repeat(var(--n, 2), 112px 16px) minmax(0, 1fr); }
}
@media (max-width: 1023px) {
  /* плита TaskViewMobile: «‹ #id ⧉ … статус», ниже название и строка времени; «Ссылки» нет; сверху 20 + 4 px, как на доске */
  .tv-plate { margin-top: 4px; padding: 16px; border-radius: var(--radius-xl); display: grid; grid-template-columns: auto auto auto minmax(0, 1fr) auto;
    grid-template-areas: "back id copy . st" "h h h h h" "m m m m m"; align-items: center; gap: 10px; }
  .tv-plate__main, .tv-plate__top { display: contents; }
  .tv-back { grid-area: back; }
  .tv-id { grid-area: id; font-size: 14px; }
  .tv-plate .tv-copy { grid-area: copy; }
  .tv-status { grid-area: st; }
  .tv-plate h2 { grid-area: h; margin: 2px 0 0; font-size: 24px; line-height: 1.15; white-space: normal; }
  .tv-plate .tv-meta { grid-area: m; }
  .tv-share { display: none; }
  .tv-when__d { display: none; }
  .tv-when__m { display: inline; }
  /* одна колонка в порядке доски (--o у карточек) */
  .tv-grid { margin-top: 16px; display: flex; flex-direction: column; align-items: stretch; gap: 16px; }
  .tv-main, .tv-side { display: contents; }
  .tv-grid > * > .kd-card { order: var(--o, 5); }
  .tv-media .tv-flow, .tv-media .tv-flow--solo { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 12px 10px; }
  .tv-media .tv-res { grid-column: 1 / -1; order: -1; }
  .tv-media .tv-res:has(> img) { width: 100%; }   /* телефон — на всю ширину карточки, высота — по пропорциям */
  .tv-media .tv-res > img { width: 100%; max-height: none; }
  .tv-media .tv-ar { display: none; }
  .tv-card .tv-a .errbtn { display: inline-flex; }
  .tv-card .tv-a .err { display: none; }
  .tv-card .tv-a[data-err-open] .err { display: block; }
  .tv-probe-note { margin-left: 0; }
}

/* ---- 24. Пользователи (поверх users.css досок Users / UsersMobile; разметка — v2/pages/users/*) ---------------------- */
/* строки фильтров доски (там — инлайн-стили): реферер и партнёр по 210 px рядом с поиском; платформа 190 px, источник
   210 px, флажки справа, «Сбросить» */
.u-frow { display: flex; align-items: center; gap: 12px; }
.u-frow__plat { width: 190px; flex: none; }
.u-frow__src, .u-frow__inv { width: 210px; flex: none; }
.u-frow__inv .kd-selectWrap, .u-frow__inv .kd-select { width: 100%; min-width: 0; box-sizing: border-box; }
.u-frow__inv .kd-selectWrap__menu { left: auto; right: 0; width: 340px; }   /* UsersRefSearch: меню 340 px вправо */
.u-inv .kd-select__value { min-width: 0; }
.uref-id { font-family: var(--font-mono); font-weight: 500; }
.uref-opt .tp { margin-left: 4px; vertical-align: 1px; }
/* шторка телефона: «Реферер · Партнёр» в две колонки; меню — на ширину обеих */
.u-inv2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.u-inv2 > div { min-width: 0; }
.u-inv2 .kd-selectWrap__menu { width: calc(200% + 10px); }
.u-inv2 > div:first-child .kd-selectWrap__menu { right: auto; }
.u-inv2 > div:last-child .kd-selectWrap__menu { left: auto; right: 0; }
/* «Сортировка: …» над таблицей — K.Select (kadrum.js) с кнопкой .usort доски UsersSort; меню 280 px вправо */
.kd-select.usort { width: auto; min-height: 0; }
.u-sortWrap { margin-right: 6px; }
.u-sortWrap .kd-selectWrap__menu { width: 280px; max-width: none; }
.u-sortWrap .kd-menu__list { max-height: none; }
a.ms-opt { text-decoration: none; color: inherit; }
.u-frow__sp { flex-grow: 1; }
.u-frow .kd-selectWrap, .u-frow .kd-select, .u-src .kd-selectWrap, .u-src .kd-select { width: 100%; min-width: 0; box-sizing: border-box; }
.u-frow .lp-reset { white-space: nowrap; }
.ur { cursor: auto; }   /* курсор-рука — только на кликабельном (владелец 29.09): карточка — двойным кликом */
a.srt, a.ui-ok { text-decoration: none; }
.th a.srt:hover { color: var(--ink-1); }
.vb-name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: inherit; text-decoration: none; }
a.uw-b { display: block; cursor: zoom-in; }
@media (min-width: 1024px) and (max-width: 1279px) {
  .ugrid { grid-template-columns: minmax(0, 1fr) 128px 124px 44px 112px 140px 124px; column-gap: 12px; }
  .u-frow { flex-wrap: wrap; row-gap: 10px; }
  .u-frow__sp { display: none; }
  .u-frow .lp-reset { margin-left: auto; }
}

/* ---- 25. Карточка пользователя (поверх user-view.css и task-view.css досок UserView* / UserViewMobile*; разметка —
   v2/pages/users/detail.html и партиалы панелей) -------------------------------------------------------------------- */
a.uv-av { display: block; cursor: zoom-in; }
.uv-av--empty { display: grid; place-items: center; background: var(--plate-fill); color: var(--plate-ink-2); }
.uv-bal em a, .uv-bal-a { color: inherit; text-decoration: none; font-family: var(--font-mono); font-size: .95em; }
a.uv-tile { color: inherit; }
.uv-tile .kd-stat__foot { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.uv-w small i.uv-w-err { color: var(--danger-ink); }
.uv-owarn { align-items: flex-start; }
.uv-owarn .kd-icon { flex: none; margin-top: 1px; }
.uv-owarn--err { background: var(--danger-soft); color: var(--danger-ink); }
.uv-opay:empty { display: none; }
.uv-dev + .uv-dev { margin-top: 12px; }
.uv-dev > div { min-width: 0; }
.uv-dev span { overflow-wrap: anywhere; }
.uv-dev i { flex: none; }
.uv-dev-warn { font-style: normal; color: var(--warn-ink); }
.uv-sw .kd-switch[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }
.tv-act[aria-disabled="true"] { opacity: .6; }
/* панели: слот и форма растворяются — тело и подвал остаются детьми K.Drawer / .mp */
.uv-slot, .uv-panel-form { display: contents; }
.uv-more-slot:empty { display: none; }
.tv-panel .kd-drawer__foot .uv-more-slot + .kd-btn, .tv-panel .mp-foot .uv-more-slot + .kd-btn { margin-left: auto; }
.uv-ro { display: flex; align-items: center; min-height: 48px; padding: 0 14px; border-radius: var(--radius-sm); background: var(--card-sunken);
  font-size: 15px; color: var(--ink-1); box-sizing: border-box; }
.dw-row2 > div { min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.dw-row2 .dw-lbl { margin-bottom: 2px; }
.dw-link .uv-code-btn { margin-left: auto; }
.dw-danger .kd-btn { flex: none; }
/* «Изменить баланс»: кнопки вместо span доски — те же правила .dw-q span / .dw-reasons span */
.dw-q button { display: inline-flex; align-items: center; height: 32px; padding: 0 12px; border: 0; border-radius: 99px; background: var(--fill);
  font: inherit; font-size: 13.5px; font-weight: 600; color: var(--ink-1); font-variant-numeric: tabular-nums; cursor: pointer; }
.dw-q button[aria-pressed="true"] { background: var(--ink-0); color: var(--card); }
.dw-reasons button { display: inline-flex; align-items: center; height: 32px; padding: 0 12px; border: 0; border-radius: 99px; background: none;
  box-shadow: inset 0 0 0 1px var(--line-strong); font: inherit; font-size: 13px; font-weight: 500; color: var(--ink-1); cursor: pointer; }
.dw-reasons button[aria-pressed="true"] { box-shadow: none; background: var(--accent-soft-hi); color: var(--accent-deep); font-weight: 600; }
.dw-amt { cursor: text; }
.dw-amt b { display: inline-flex; align-items: baseline; }
.dw-amt[data-dir="sub"] b::before { content: "−"; color: var(--danger-ink); }
.dw-amt__in { width: 2ch; min-width: 1ch; padding: 0; border: 0; outline: 0; background: none; font: inherit; letter-spacing: inherit; color: inherit;
  font-variant-numeric: tabular-nums; }
.dw-amt:focus-within { box-shadow: inset 0 0 0 2px var(--accent-strong), 0 0 0 3px var(--accent-ring); }
.dw-res[data-bad="true"], .dw-res--sub { background: var(--danger-soft); color: var(--danger-ink); }
.uv-cf-t { margin: 0; font-size: 15px; font-weight: 600; line-height: 1.35; color: var(--ink-0); }
.uv-cf-p { margin: 0; font-size: 14px; color: var(--ink-1); }
.uv-cf-list { display: flex; flex-direction: column; gap: 6px; margin: 0; padding-left: 18px; font-size: 13.5px; line-height: 1.5; color: var(--ink-2); }
.uv-cf-acts { display: flex; justify-content: flex-end; gap: 8px; }
/* «Задания»: превью и название — ссылки на карточку задания; статус второй строкой (телефон) — цветом тона */
.dw-tasks a.th { display: block; }
.uv-tn a { color: inherit; text-decoration: none; }
.dw-tasks b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.uv-st { font-style: normal; font-weight: 600; }
.uv-st--success { color: var(--ok-ink); }
.uv-st--danger { color: var(--danger-ink); }
.uv-st--info { color: var(--info-ink); }
.uv-empty { padding: 14px 0; font-size: 13.5px; color: var(--ink-3); list-style: none; }
.uv-ev-more { display: flex; justify-content: center; padding-top: 4px; }
.ev-p a.evv { text-decoration: none; }
.um-state b.warn::before { background: #f3c27a; }
@media (max-width: 1023px) {
  /* колонки растворяются — порядок доски UserViewMobile: работы, кадры, оплаты, профиль, входы, управление, события, поля */
  .uv-grid { display: flex; flex-direction: column; align-items: stretch; gap: 16px; margin-top: 16px; }
  .uv-grid > * , .uv-col > * { min-width: 0; }
  .uv-col { display: contents; }
  .uv-c-works { order: 1; } .uv-c-credits { order: 2; } .uv-c-orders { order: 3; } .uv-c-profile { order: 4; }
  .uv-c-devices { order: 5; } .uv-c-manage { order: 6; } .uv-c-events { order: 7; } .uv-c-fields { order: 8; }
  .um-works { overflow-x: auto; scrollbar-width: none; }
  .um-works::-webkit-scrollbar { display: none; }
  .um-tiles .uv-tile { display: block; }
  /* «Редактировать · Изменить баланс» — внизу экрана вместо панели разделов (доска: абсолютно внизу артборда) */
  .um-cta { position: fixed; padding-bottom: max(12px, env(safe-area-inset-bottom)); }
  .um-cta > .kd-btn:last-child { flex-grow: 1; }
  .kd-shell__main:has(.um-cta) { padding-bottom: calc(96px + env(safe-area-inset-bottom)); }
}

/* ---- 26. Оплаты и карточка заказа (поверх orders.css / order-view.css и task-view.css досок Payments* / PaymentView*;
   разметка — v2/pages/orders/*) ------------------------------------------------------------------------------------------ */
/* фильтры доски (там — инлайн-стили): платёжка 190 px, способ и пакет по 170 px, флажки справа, «Ещё» и «Сбросить»;
   в панели «Ещё» — откуда оплата и что покупали по 170 px и «Ошибка чека» */
.o-frow { display: flex; align-items: center; gap: 10px; }
.o-frow__gw { width: 190px; flex: none; }
.o-frow__sel { width: 170px; flex: none; }
.o-frow__sp { flex-grow: 1; }
.o-frow .kd-selectWrap, .o-frow .kd-select, .o-more .kd-selectWrap, .o-more .kd-select { width: 100%; min-width: 0; box-sizing: border-box; }
.o-frow .lp-reset { white-space: nowrap; }
.o-more { align-items: center; gap: 10px 20px; }
/* строка: курсор-рука — только на кликабельном (владелец 29.09), карточка — двойным кликом; имя — в одну строку */
.or { cursor: auto; }
a.ou.one, span.ou.one { display: block; }
a.ou:hover { color: var(--accent-deep); }
.owhat { flex-wrap: wrap; row-gap: 4px; }   /* «1000 кадров» и «+250 бонус» не сжимаются — бонус переносится целиком */
.o-rcpt { font-style: normal; color: var(--danger-ink); }
.ost .o-miss, .o-cr .o-miss { color: var(--danger-ink); }
@media (min-width: 1024px) and (max-width: 1379px) {
  .og { grid-template-columns: 130px minmax(0, 1fr) 130px 190px 190px; column-gap: 12px; }
  .o-frow { flex-wrap: wrap; row-gap: 10px; }
  .o-frow__sp { display: none; }
  .o-frow .lp-reset { margin-left: auto; }
}
/* карточка телефона: № — ссылка, «все заказы» — ссылка серым (на доске — текст), «начислено» справа внизу */
a.o-no { text-decoration: none; }
.o-u a.o-all { margin-top: 2px; font-size: 12.5px; font-weight: 400; color: var(--ink-3); }
.o-bot .one { min-width: 0; }
.o-bot .o-cr { flex: none; margin-left: auto; }
/* нижняя панель: «Ещё» — активная вкладка на разделах из шторки («Финансы») */
.m-tb > button[aria-current="page"] { color: var(--accent-strong); }
/* карточка заказа: колонки доски (справа 380 px); плита — «№ ⧉ сумма · что статус», на телефоне «Ссылка» — круглой кнопкой */
.od-grid { grid-template-columns: minmax(0, 1fr) 380px; }
.od-h { display: contents; }
.od-share { display: none; }
.od-st--bad { background: var(--danger-soft); color: var(--danger-ink); }
.od-st--info { background: var(--info-soft); color: var(--info-ink); }
.od-ok { font-weight: 600; color: var(--ok-ink); }
.od-bad { color: var(--danger-ink); }
.od-rem span.od-sent { color: var(--ok-ink); }
.od-ol a { text-decoration: none; }
@media (min-width: 1024px) and (max-width: 1279px) {
  .od-grid { grid-template-columns: minmax(0, 1fr) 320px; }
}
@media (max-width: 1023px) {
  .od-plate { grid-template-areas: "back id copy . sh" "h h h h h" "m m m m m"; }
  .od-h { grid-area: h; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; min-width: 0; margin-top: 2px; }   /* не влез — статус строкой ниже */
  .od-plate h2 { margin: 0; font-size: 28px; }
  .od-share { display: inline-flex; grid-area: sh; }
  .od-plate-meta { grid-area: m; }
}

/* ---- 27. Типы персон (поверх person-types.css досок Persons* / PersonsMobile*; разметка — v2/pages/person_types/*) ---- */
/* карточка сетки на плите (доска: инлайн-стили) и замок под ней; на телефоне — .pgm-card доски */
@media (min-width: 1024px) { .pg-card { margin: -62px 30px 0; position: relative; padding: 24px; box-shadow: var(--shadow-raise); } }
.pg-note { margin-top: 16px; padding: 0 34px; }
.pg-note .pnote { color: var(--ink-3); }
.pc[aria-disabled="true"] { cursor: default; }
.pc-none { display: grid; place-items: center; width: 100%; height: 100%; font-size: 12.5px; color: var(--ink-4); }
/* панель правки: 460 px доски; фото пустое — силуэт; ошибка загрузки — под кнопками по центру */
.pe-drw.kd-drawer { width: min(460px, calc(100vw - var(--shell-gap) * 2)); }
.pe-none { display: grid; place-items: center; width: 100%; height: 100%; color: var(--ink-4); }
/* фото в панели — целиком и во всю высоту: рамка по размеру фото (владелец 30.09; на доске — 3:4 и cover); без фото — 3:4 */
.pe-drw .pe-ph { width: fit-content; max-width: 100%; aspect-ratio: auto; }
.pe-drw .pe-ph img { width: auto; height: auto; max-width: 100%; max-height: 300px; }
.pe-drw .pe-ph:has(.pe-none) { width: 220px; aspect-ratio: 3/4; }
@media (max-width: 1023px) {
  .pe-drw .pe-ph img { max-height: 200px; }
  .pe-drw .pe-ph:has(.pe-none) { width: 150px; }
}
.pe-err { margin: 8px 0 0; text-align: center; }
.pe-acts label.kd-btn { cursor: pointer; }
.pe-slot.htmx-request .pe-ph { opacity: .6; }
/* «Удалить тип» (root; на досках нет — как .dw-danger карточки пользователя); подтверждение — на месте (data-ask) */
.pe-del { display: flex; flex-direction: column; gap: 12px; padding: 12px 14px; border-radius: var(--radius-md); box-shadow: inset 0 0 0 1px var(--danger-line); }
.pe-del__row { display: flex; align-items: center; gap: 12px; }
.pe-del__row > div { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pe-del b { font-size: 14px; font-weight: 600; color: var(--danger-ink); }
.pe-del span { font-size: 12.5px; color: var(--ink-3); }
.pe-del .kd-btn { flex: none; }
.pe-del[data-asking] [data-ask-open] { display: none; }
.pe-del__ask p { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--ink-1); }
.pe-del__acts { display: flex; justify-content: flex-end; gap: 8px; margin-top: 10px; }

/* ---- 28. Финансы › Пакеты и Выводы партнёрам (поверх finance.css досок Packages* / Payouts*; разметка — v2/pages/packages,
   v2/pages/payouts; шапка раздела — kd.finance_head) ---- */
/* плита «Пакеты кадров» без карточки фильтров под ней (доска: padding 28/32/30); «Выводы» — вторая строка: «Ждут выплаты» и
   вкладки статусов (доска: инлайн-стили) */
.fin-plate { padding-bottom: 30px; }
.fin-plate, .lp-plate:has(.fin-plate__row) { gap: 14px; }   /* доска: gap 14 (у .lp-plate — 12) */
.fin-plate__row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px 16px; }
.fin-card { padding: 8px; }
.pk-d, .pk-st, .w-p, .wdg > div:has(> .w-c) { min-width: 0; }
.pk-st code.none { color: var(--ink-4); }   /* «нет RC Product ID» (доска: инлайн) */
.wdg .kd-badge + .w-t { margin-top: 5px; }   /* «создан …» под статусом (доска: инлайн) */
.w-t--wait { color: var(--info-ink); font-weight: 500; }   /* «ждёт выплаты» (доска: инлайн) */
.lp-listbar.fin-listbar { margin-top: 24px; }
.mw-c a { font-weight: 500; text-decoration: none; }
.fin-empty { margin: 0; padding: 22px 12px; font-size: 14px; color: var(--ink-3); }
/* фильтры выводов: поиск, партнёр 230 px, период справа (доска: инлайн-стили) */
.fin-frow { display: flex; align-items: center; gap: 10px; min-width: 0; }
.fin-frow__q { flex: 1; min-width: 0; }
.fin-frow__sel { flex: none; width: 230px; }
/* строка и карточка открывают панель правки (кроме ссылок и кнопок внутри — kadrum.js) */
.tr[data-tv-panel-open], .mk[data-tv-panel-open], .mw[data-tv-panel-open] { cursor: pointer; }
.mk[data-sel="true"], .mw[data-sel="true"] { box-shadow: inset 0 0 0 2px var(--accent-strong), var(--shadow-tile); }
/* «⋯» строки пакета: Дублировать · Удалить (подтверждение на месте); пакет с заказами — замок вместо «Удалить» */
.pk-pop { min-width: 230px; cursor: default; }
.pk-pop[data-asking] .pk-pop__menu { display: none; }
.pk-pop__ask p { margin: 0; padding: 8px 12px 6px; font-size: 13.5px; line-height: 1.4; color: var(--ink-1); }
.pk-pop__note { display: flex; align-items: flex-start; gap: 8px; margin: 0; padding: 8px 12px; font-size: 12.5px; line-height: 1.4; color: var(--ink-3); }
.pk-pop__note svg { flex: none; margin-top: 1px; }
/* панель правки: 500 px доски; «Дублировать» / «Удалить» подвала — слева; «Удалить запрос» — вопрос вместо кнопок */
.fin-drw.kd-drawer { width: min(500px, calc(100vw - var(--shell-gap) * 2)); }
/* превью «Так пакет увидят в приложении» (.pv доски) — не превью фото-шаблона (§12: .pv в пропорциях фото) */
.fin-drw .pv { aspect-ratio: auto; max-width: none; margin: 0; }
.fin-drw .kd-drawer__body { gap: 20px; }   /* доска: 20 (у .tv-drw — 16) */
.fin-foot-l { margin-right: auto; }
.fin-foot[data-asking] > :not(.fin-ask) { display: none; }
.fin-ask:not([hidden]) { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; width: 100%; }
.fin-ask span { flex: 1 1 180px; font-size: 13.5px; line-height: 1.4; color: var(--ink-1); }
.fin-partner { display: flex; flex-direction: column; gap: 7px; }
.fin-partner .kd-selectWrap, .fin-partner .kd-select { width: 100%; }
/* статус запроса (.stp доски — span): выбор мышью и с клавиатуры (kadrum.js [data-stp]); тоны «В обработке» и «Отклонён» —
   на доске только «Новый» (info) и «Оплачен» (ok) */
.stp span { cursor: pointer; user-select: none; }
.stp span:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
.stp span.warn[aria-pressed="true"] { background: var(--warn-soft); color: var(--warn-ink); }
.stp span.bad[aria-pressed="true"] { background: var(--danger-soft); color: var(--danger-ink); }
/* 1024–1379 (досок нет, 1440 — доска): колонки уже, быстрые «В работу · Оплачен» без галочки — как .og «Оплат» */
@media (min-width: 1024px) and (max-width: 1379px) {
  .pkg { grid-template-columns: 84px 170px minmax(0, 1fr) 160px 72px 76px; column-gap: 12px; }
  .wdg { grid-template-columns: 56px minmax(0, 1fr) 116px 126px minmax(0, 1.2fr) 112px 156px; column-gap: 12px; }
  .w-q { gap: 4px; }
  .w-q .kd-btn { padding-inline: 10px; }
  .w-q .kd-btn svg { display: none; }
  .fin-frow__sel { width: 200px; }
}
@media (max-width: 1023px) {
  /* пилюли статусов уходят под край плиты (владелец 01.10: «лейблы за край»): лента во всю ширину плиты, первая — по
     отступу; прокручиваются пальцем */
  .m-pst { overflow-x: auto; scrollbar-width: none; margin-inline: -20px; padding-inline: 20px; scroll-padding-inline: 20px; }
  [data-bp="t"] .m-pst { margin-inline: -24px; padding-inline: 24px; scroll-padding-inline: 24px; }
  .m-pst::-webkit-scrollbar { display: none; }
  .m-pst a { flex: none; text-decoration: none; }
  .m-plate #m-pw-wait b { color: var(--plate-ink-0); font-weight: 600; }
  .mw-q--one { grid-template-columns: 1fr; }
  /* подвал экрана правки: «Отмена» по тексту, главная кнопка — остальное (доска: .sc-host-x:last-child — flex-grow) */
  .fin-drw .mp-foot .kd-btn { width: auto; }
  .fin-drw .mp-foot > .kd-btn:last-of-type { flex-grow: 1; }
  .m-plate.fin-mplate { padding-bottom: 20px; }
  .m-plate.fin-mplate--pw { padding-bottom: 80px; }   /* выводы: под плитой — поиск (доска: 80) */   /* пакеты: под плитой нет карточки фильтров (доска: padding-bottom 20) */
  .fin-empty.kd-card { padding: 20px 16px; }
}
