/*
 * Стили админки. Правила и объяснения — в docs/design-admin.md.
 *
 * ⚠️ ГЛАВНОЕ ПРАВИЛО: один селектор — одно объявление. Этот файл собран из
 * таблицы, которая росла слоями: каждая правка дописывалась в конец, прежнее
 * объявление оставалось выше. К моменту разбора 21 селектор из 128 был
 * объявлен по два-три раза, 27 свойств несли противоречащие значения, а 31
 * объявление из 529 не действовало вовсе. Узнать высоту карточки можно было
 * только прочитав весь файл и вычислив, какая правка легла последней.
 *
 * Меняешь поведение — правишь СУЩЕСТВУЮЩЕЕ объявление, а не дописываешь новое
 * ниже. Сторож: src/adminDesign.test.ts.
 */

/* ── Основа ──────────────────────────────────────────── */
* {
  box-sizing: border-box;
}
html {
  overflow-x: clip;
}
body {
  overflow-x: clip;
  margin: 0;
  background: var(--color-paper);
  color: var(--color-ink);
  font: var(--text-sm)/1.5 var(--font-body);
  text-wrap: pretty;
}
.skip-link {
  position: fixed;
  top: var(--space-xs);
  left: var(--space-sm);
  z-index: 40;
  display: inline-flex;
  align-items: center;
  min-height: var(--control-h-emphasis);
  padding-inline: var(--space-sm);
  border-radius: var(--radius-input);
  background: var(--color-accent);
  color: var(--color-accent-ink);
  font-weight: 600;
  text-decoration: none;
  transform: translateY(-200%);
  transition: transform var(--dur-short) var(--ease-out);
}
.skip-link:focus-visible {
  transform: translateY(0);
}
.hidden,
[hidden],
.capability-hidden {
  display: none!important;
}
/* Заголовок раздела читается с экрана, но не занимает место: как называется
   раздел, уже сказано выделенной вкладкой. Без него у страницы не осталось бы
   заголовка первого уровня. */
.sr-only {
  position: absolute;
  width: var(--rule-thin);
  height: var(--rule-thin);
  margin: calc(-1 * var(--rule-thin));
  padding: 0;
  border: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* ── Вход ──────────────────────────────────────────── */
.auth {
  display: flex;
  align-items: center;
  width: min(32rem,calc(100% - var(--space-lg)));
  min-height: 100dvh;
  margin: 0 auto;
  padding-block: var(--space-lg);
}
.auth-card {
  position: relative;
  width: 100%;
  background: var(--color-surface);
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-card);
  padding: var(--space-lg);
  box-shadow: var(--shadow-md);
}
.auth-card::before {
  position: absolute;
  top: calc(-1 * var(--rule-thin));
  right: var(--space-lg);
  left: var(--space-lg);
  height: var(--rule-thin);
  border-radius: 0;
  background: var(--color-accent);
  content: "";
}
.auth-card input {
  width: 100%;
  margin-top: var(--space-xs);
}
.auth-card .eyebrow {
  color: var(--color-accent-text);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
}
.auth-card h1 {
  margin-bottom: var(--space-2xs);
  text-wrap: balance;
}
.brand {
  font: 700 var(--text-lg)/1 var(--font-display);
  letter-spacing: var(--tracking-label);
}
.brand small {
  display: block;
  margin-top: var(--space-2xs);
  font: 400 var(--text-xs)/1.3 var(--font-body);
  color: var(--color-muted);
}
.auth-card label input {
  margin-top: 0;
}
.auth-card summary {
  display: flex;
  align-items: center;
  min-height: var(--control-h-emphasis);
  cursor: pointer;
}
summary {
  min-height: var(--control-h-emphasis);
  cursor: pointer;
}
.auth-card .actions {
  margin-top: var(--space-md);
}

/* ── Заголовки и шапка страницы ──────────────────────────────────────────── */
h1 {
  font-family: var(--font-display);
  font-style: normal;
  overflow-wrap: anywhere;
  min-width: 0;
  font-size: var(--text-xl);
  line-height: 1;
  margin: 0;
  text-wrap: balance;
}
.muted {
  color: var(--color-muted);
}
.eyebrow {
  color: var(--color-muted);
  margin: 0 0 var(--space-2xs);
  font-size: var(--text-xs);
}
code {
  font-family: var(--font-mono);
  word-spacing: normal;
  overflow-wrap: anywhere;
  word-break: normal;
}
/* Свежесть данных вместо кнопки «Обновить»: строка отвечает на вопрос
   «то ли я вижу, что сейчас на сервере». Кнопка на него не отвечала. */
.stamp {
  margin: 0;
  color: var(--color-muted);
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.error {
  color: var(--color-accent-text);
  min-height: var(--line-reserved);
}
#publication-error:empty,
#operations-error:empty {
  display: none;
}
.bad {
  color: var(--color-accent-text);
}
.load-error {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  flex-wrap: wrap;
  margin-bottom: var(--space-md);
  padding: var(--space-sm);
  border: var(--rule-thin) solid var(--color-accent);
  border-radius: var(--radius-card);
  color: var(--color-accent-text);
  background: var(--color-warn-bg);
  border-color: var(--color-accent-text);
}
h2 {
  font-family: var(--font-display);
  font-style: normal;
  overflow-wrap: anywhere;
  min-width: 0;
  font-size: var(--text-title-lg);
  margin: 0 0 var(--space-2xs);
  line-height: 1.2;
  text-wrap: balance;
}
h3 {
  font-family: var(--font-display);
  font-style: normal;
  overflow-wrap: anywhere;
  min-width: 0;
  font-size: var(--text-panel-title);
  line-height: 1.3;
  font-weight: 600;
  letter-spacing: var(--tracking-label);
  color: var(--color-ink-2);
  margin: var(--space-lg) 0 var(--space-2xs);
  text-wrap: balance;
}
/* ⚠️ Верхняя строка и разделы держатся у края экрана. До этого шапка
   страницы занимала 130 px и повторяла вкладку: первая строка таблицы
   начиналась на 400 px от верха, а на длинном списке и свежесть данных, и
   вход в другой раздел уезжали за верхний край. */
.app-head {
  position: sticky;
  top: 0;
  z-index: 3;
  background: var(--color-paper);
  border-bottom: var(--rule-thin) solid var(--color-rule);
}
.app-topbar {
  min-height: calc(var(--control-h-emphasis) + var(--space-sm));
  padding-block: var(--space-xs);
  background: var(--color-paper-2);
  border-bottom: var(--rule-thin) solid var(--color-rule);
}
.app-brand {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-3xs);
  min-width: 0;
  font: 700 var(--text-lg)/1 var(--font-display);
  letter-spacing: var(--tracking-label);
}
.app-brand small {
  max-width: 32ch;
  margin: 0;
  overflow: hidden;
  color: var(--color-muted);
  font: 400 var(--text-xs)/1.2 var(--font-body);
  letter-spacing: normal;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.account-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2xs);
  padding-inline: var(--space-2xs);
  max-width: 14rem;
  background: var(--color-surface);
  border-color: var(--color-rule);
}
.who-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: var(--control-h-mini);
  height: var(--control-h-mini);
  border-radius: var(--radius-compact);
  background: var(--color-calm-bg);
  color: var(--color-ink);
  font-size: var(--text-xs);
  font-weight: 700;
}
/* Разделы разделены на «команду» и «сервер» подписью с чертой: девять вкладок
   в ряд не показывали, что половина видна только администратору сервера. */
.tab-group {
  display: flex;
  align-items: center;
  margin-inline-start: var(--space-2xs);
  padding-inline-start: var(--space-sm);
  border-left: var(--rule-thin) solid var(--color-rule);
  color: var(--color-muted);
  font-size: var(--text-xs);
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  white-space: nowrap;
}
.tab-command-group,
.tab-server-group {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: var(--space-2xs);
  min-width: 0;
  flex: 0 1 auto;
  padding-inline-start: var(--space-2xs);
}

/* ── Карточки, раскладки и формы ──────────────────────────────────────────── */
.page-shell {
  width: min(100%, 96rem);
  padding-block: var(--space-lg) var(--space-2xl);
}
.split {
  display: grid;
  grid-template-columns: minmax(0,1.3fr) minmax(18rem,.7fr);
  gap: var(--space-lg);
}
.overview-grid {
  display: grid;
  grid-template-columns: minmax(0,2fr) minmax(18rem,1fr);
  gap: var(--space-lg);
  align-items: start;
}
.overview-queue {
  min-width: 0;
  margin-bottom: 0;
}
.overview-side {
  display: grid;
  align-content: start;
  gap: var(--space-lg);
  min-width: 0;
}
.overview-side > .card {
  margin-bottom: 0;
}
.overview-side > .card h2 {
  font-size: var(--text-panel-title);
  margin-bottom: var(--space-sm);
}
.form-submit {
  display: flex;
  align-items: flex-end;
}
.form-submit button {
  width: 100%;
}
.mobile-nav {
  display: none;
  color: var(--color-muted);
  font-size: var(--text-xs);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
}
.error.good {
  color: var(--color-ink-2);
}
.form-grid {
  display: grid;
  grid-template-columns: repeat(3,minmax(0,1fr));
  gap: var(--space-sm);
  align-items: end;
}
.member-create {
  max-width: 64rem;
}
.temporary-password {
  display: grid;
  gap: var(--space-xs);
  margin-top: var(--space-sm);
  padding-top: var(--space-sm);
  border-top: var(--rule-thin) solid var(--color-rule);
}
.temporary-password-field {
  margin-top: var(--space-xs);
}
.member-create-fields {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--space-sm);
}
.member-create-fields > label {
  flex: 1 1 11rem;
  min-width: 0;
}
.member-create-fields > label:first-child {
  flex: 1.4 1 14rem;
}
.member-create-fields > label:last-of-type {
  flex: .8 1 10rem;
}
.billing-card {
  max-width: 64rem;
}
.billing-card .card-head {
  align-items: center;
  flex-wrap: wrap;
}
.billing-card h2,
.billing-topup > h3,
.billing-card .card-head > p {
  margin: 0;
}
.billing-mode {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--space-xs);
}
.billing-mode > label {
  flex: 0 1 26rem;
  min-width: 0;
}
.billing-mode > p {
  margin: 0;
  flex-basis: 100%;
  max-width: 72ch;
}
.billing-topup {
  display: grid;
  gap: var(--space-sm);
  border-top: var(--rule-thin) solid var(--color-rule);
  margin-top: var(--space-sm);
  padding-top: var(--space-sm);
}
.billing-topup > p {
  margin: 0;
  max-width: 72ch;
}
.billing-topup-fields {
  display: grid;
  grid-template-columns: minmax(0,9rem) minmax(0,1fr) minmax(0,1.4fr);
  align-items: end;
  gap: var(--space-sm);
}
.billing-topup-fields > label {
  min-width: 0;
}
.billing-limits-fields {
  max-width: 48rem;
}
.billing-footer {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs);
}
.billing-limits-fields + .billing-footer {
  margin-top: var(--space-md);
}
.billing-card > .error:not(:empty) {
  margin-top: var(--space-sm);
}
.billing-card > .error:empty {
  display: none;
}
label {
  display: grid;
  gap: var(--space-3xs);
  color: var(--color-ink-2);
}
.member-list {
  display: flex;
  gap: var(--space-3xs);
  flex-wrap: wrap;
}
.empty {
  padding: var(--space-lg);
  text-align: center;
  color: var(--color-muted);
}
.card>p.muted {
  max-width: 72ch;
  margin: 0 0 var(--space-md);
}
.card-head p.muted {
  max-width: 72ch;
  margin: 0 0 var(--space-md);
  margin-bottom: 0;
}
.split td:first-child {
  min-width: 10ch;
}
.card {
  background: var(--color-surface);
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-card);
  padding: var(--space-lg);
  margin-bottom: var(--space-lg);
  min-width: 0;
}
.actions button[aria-pressed="true"] {
  background: var(--color-calm-bg);
  border-color: var(--color-muted);
  color: var(--color-ink);
}
.card>label {
  margin-bottom: var(--space-sm);
}

/* ── Плитки обзора ──────────────────────────────────────────── */
.stats {
  display: grid;
  grid-template-columns: repeat(4,minmax(0,1fr));
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-card);
  overflow: hidden;
  margin-bottom: var(--space-lg);
}
.stats.dispatch-strip {
  grid-template-columns: repeat(4,minmax(0,1fr));
  gap: 0;
  background: var(--color-paper-2);
  border-radius: var(--radius-compact);
  margin-bottom: var(--space-lg);
}
.stats.dispatch-strip .stat {
  min-height: var(--control-h-emphasis);
  padding: var(--space-sm) var(--space-lg);
  background: transparent;
  border-right: var(--rule-thin) solid var(--color-rule);
}
.stats.dispatch-strip .stat b {
  font: 600 var(--text-title)/1.1 var(--font-display);
}
.stats.dispatch-strip .stat span:first-of-type {
  font-size: var(--text-xs);
  color: var(--color-ink-2);
}
.stat {
  padding: var(--space-sm) var(--space-md);
  background: var(--color-surface);
  border-right: var(--rule-thin) solid var(--color-rule);
  display: flex;
  flex-direction: column;
  gap: var(--space-3xs);
  width: 100%;
  text-align: left;
  border: 0;
  border-radius: 0;
  font: inherit;
  color: inherit;
  cursor: pointer;
  min-height: 0;
}
.stat:last-child {
  border-right: 0;
}
/* Число — главное в плитке. При 21 px оно терялось в собственном тайле, и
   полоса сводки читалась как четыре полупустых прямоугольника. */
.stat b {
  display: block;
  font: 700 var(--text-lg)/1 var(--font-display);
  font-variant-numeric: tabular-nums;
  font-size: var(--text-xl);
}
.stat span {
  font-size: var(--text-sm);
  color: var(--color-ink-2);
  display: block;
  white-space: normal;
}
.stat .muted {
  font-size: var(--text-xs);
  color: var(--color-muted);
  margin-top: var(--space-3xs);
}

/* ── Таблицы ──────────────────────────────────────────── */
.table-wrap {
  overflow: auto;
  max-width: 100%;
  background: var(--color-paper-2);
  border-radius: var(--radius-compact);
  border: var(--rule-thin) solid var(--color-rule);
}
.num {
  text-align: right;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.pager {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  margin-top: var(--space-xs);
}
.pager span {
  font-variant-numeric: tabular-nums;
}
table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--text-sm);
  font-variant-numeric: tabular-nums;
}
/* ⚠️ Кнопки в строке таблицы — РАВНОЙ ширины, и это не украшение. Ширину
   задаёт самая длинная надпись, короткая ей соответствует: иначе колонка
   действий рвана по правому краю, а с прилипшей к краю колонкой это особенно
   заметно. Замер до правки: «Отключить» 100 px рядом со «Сбросить пароль»
   144 px. Сетка по содержимому, а не на всю ширину: растянутые на 238 px
   кнопки читаются как поля ввода. */
td .actions {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  width: max-content;
}
td .actions button {
  width: 100%;
}
#by-board th:nth-child(n+2),
#by-people th:nth-child(n+2),
#by-model th:nth-child(n+2),
#account-shares th:nth-child(4),
#storage-jobs th:nth-child(3) {
  text-align: right;
}
th {
  text-align: left;
  color: var(--color-muted);
  font-weight: 600;
  padding: var(--space-2xs);
  border-bottom: var(--rule-thin) solid var(--color-rule);
  font-size: var(--text-sm);
  padding-inline: var(--space-sm);
  padding-block: var(--space-xs);
  line-height: 1.5;
  letter-spacing: normal;
  white-space: normal;
}
/* ⚠️ Вся строка стоит на ОДНОЙ оси, и держит её общее выравнивание, а не
   посадка отдельной ячейки. Замер до первой правки: имя сотрудника стояло на
   12 px выше центра кнопки, и строка читалась как две. Посадка ячейки без
   контрола это чинила, но платила высотой: каждая строка получала габарит
   кнопки — 44 px там, где текста на 21. Не возвращать: ось задаётся здесь,
   один раз, а действия строки живут в меню и высоту больше не диктуют. */
td {
  padding: var(--space-xs) var(--space-2xs);
  border-bottom: var(--rule-thin) solid var(--color-rule);
  vertical-align: middle;
  overflow-wrap: anywhere;
  padding-inline: var(--space-sm);
  padding-block: var(--space-xs);
  white-space: normal;
}
tbody tr:last-child td {
  border-bottom: 0;
}
tbody tr:hover td {
  background: var(--color-calm-bg);
}
td[data-label="Что случилось"] {
  white-space: normal;
  min-width: 24ch;
}
td[data-label="Что делать"] {
  white-space: normal;
  min-width: 30ch;
}
td[data-label="Что делать"] .actions {
  flex-wrap: wrap;
}
td:first-child {
  white-space: normal;
  min-width: 14ch;
}
td[data-label="Доступ"] {
  white-space: normal;
  min-width: 14ch;
  max-width: 32ch;
}
/* ⚠️ Заливка последней ячейки — только у липкой колонки, которая едет над
   содержимым. У обычной таблицы она рисовала полосу цвета карточки: внутри
   диалога, где фон другой, эта полоса читалась как отдельный блок. */
td:last-child,
th:last-child {
  position: static;
  right: 0;
  background: transparent;
  box-shadow: none;
}
.table-wrap[data-scrolls="true"] th:last-child {
  position: sticky;
  right: 0;
  background: var(--color-surface);
}
.table-wrap[data-scrolls="true"] td:last-child {
  position: sticky;
  right: 0;
  background: var(--color-surface);
  box-shadow: inset var(--rule-thin) 0 0 var(--color-rule);
}
.cell-actions {
  margin-top: var(--space-2xs);
}

/* ── Контролы и состояния ──────────────────────────────────────────── */
button:disabled,
button[aria-busy="true"],
input:disabled,
select:disabled,
textarea:disabled {
  opacity: var(--state-disabled);
  cursor: not-allowed;
}
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible {
  outline: 2px solid var(--color-focus);
  outline-offset: 1px;
}
input[aria-invalid="true"],
textarea[aria-invalid="true"] {
  border-color: var(--color-accent);
}
.badge {
  display: inline;
  min-height: 0;
  border: 0;
  border-radius: 0;
  padding: 0;
  background: transparent;
  color: var(--color-ink-2);
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
}
.card h2 .badge {
  font-size: var(--text-xs);
  font-weight: 600;
  vertical-align: middle;
}
.attention-badge {
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
}
.compact-select {
  max-width: 11rem;
}
button {
  font: inherit;
  color: var(--color-accent-ink);
  height: auto;
  white-space: normal;
  line-height: 1.5;
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-input);
  padding: var(--space-2xs) var(--space-xs);
  background: var(--color-accent);
  cursor: pointer;
  border-color: var(--color-accent);
  font-weight: 600;
  transition: background-color var(--dur-short) var(--ease-out),border-color var(--dur-short) var(--ease-out),opacity var(--dur-short) var(--ease-out),transform var(--dur-active) var(--ease-out);
  min-height: var(--control-h-emphasis);
}
input,
select {
  min-width: 0;
  font: inherit;
  color: inherit;
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-input);
  padding: var(--space-2xs) var(--space-xs);
  background: var(--color-paper-2);
  min-height: var(--control-h-emphasis);
  border-color: var(--color-rule);
}
textarea {
  font: inherit;
  color: inherit;
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-input);
  padding: var(--space-2xs) var(--space-xs);
  background: var(--color-paper-2);
  width: 100%;
  min-height: 8rem;
  resize: vertical;
  font-family: var(--font-mono);
  border-color: var(--color-rule);
}
button.ghost {
  background: transparent;
  border-color: var(--color-rule);
  color: var(--color-ink-2);
}
.ghost:not(:disabled):hover,
input:not(:disabled):hover,
select:not(:disabled):hover,
textarea:not(:disabled):hover {
  border-color: var(--color-ink-2);
}
button:not(:disabled):active {
  transform: scale(.98);
}
.badge.bad {
  color: var(--color-accent-text);
}
#tabs {
  gap: var(--space-xs);
  flex-wrap: wrap;
  overflow-x: visible;
  align-items: stretch;
  background: var(--color-paper-2);
  border-bottom-color: var(--color-rule);
}
#tabs button {
  min-height: var(--control-h-emphasis);
  padding-inline: var(--space-2xs);
  border-radius: var(--radius-input);
  color: var(--color-muted);
  transition: background-color var(--dur-short) var(--ease-out),color var(--dur-short) var(--ease-out),transform var(--dur-active) var(--ease-out);
}
#tabs button:hover {
  color: var(--color-ink);
  background: var(--color-calm-bg);
}
#tabs button.on {
  color: var(--color-ink);
  background: var(--color-calm-bg);
  box-shadow: inset 0 calc(-1 * var(--rule-thin)) var(--color-accent);
}
.theme-field select {
  font-size: var(--text-sm);
}
.icon-btn {
  flex-shrink: 0;
  width: var(--control-h-emphasis);
  padding-inline: 0;
}
/* ⚠️ Действия строки собраны в одно меню. В «Команде» их было две кнопки, в
   «Досках» три, и колонка действий читалась как форма ввода: одинаковые
   призрачные прямоугольники в каждой строке перевешивали сами данные. */
.row-menu {
  position: relative;
  display: inline-flex;
}
.menu-trigger {
  width: var(--control-h-emphasis);
  min-height: var(--control-h-emphasis);
  padding-inline: 0;
  color: var(--color-ink-2);
  font-size: var(--text-md);
  line-height: 1;
}
/* ⚠️ Список действий стоит в «fixed» и позиционируется из JS по кнопке.
   Обычный «absolute» обрезает прокрутка «.table-wrap»: у широкой таблицы
   меню пропадало за её краем. */
.menu-pop {
  position: fixed;
  z-index: 20;
  display: grid;
  gap: var(--space-3xs);
  min-width: 12rem;
  max-width: calc(100vw - var(--space-sm));
  max-height: calc(100dvh - var(--space-sm));
  overflow-y: auto;
  padding: var(--space-3xs);
  background: var(--color-surface);
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-compact);
  box-shadow: var(--shadow-lg);
}
.menu-item {
  width: 100%;
  text-align: left;
  /* Кнопка сама по себе центрирует содержимое: в списке это ставило пункты
     по центру, и левый край меню читался рваным. */
  justify-content: flex-start;
  background: transparent;
  border-color: transparent;
  color: var(--color-ink);
  font-weight: 400;
}
.menu-item.bad {
  color: var(--color-accent-text);
}
.menu-item:hover {
  background: var(--color-calm-bg);
}
/* Третий вес действия: текст без рамки. Нужен там, где действие
   второстепенно, а кнопка добавила бы строке высоту контрола. */
.link-btn {
  display: inline-flex;
  align-items: center;
  min-height: var(--control-h-emphasis);
  padding: 0 var(--space-2xs);
  border: 0;
  background: transparent;
  color: var(--color-accent-text);
  font-weight: 600;
}
.provider-source-link {
  display: inline-flex;
  align-items: center;
  min-height: var(--control-h-emphasis);
  padding-inline: var(--space-2xs);
  margin-block: calc(-1 * var(--space-2xs));
  white-space: nowrap;
}
.attention-head-copy {
  min-width: 0;
  flex: 1;
}
.attention-help {
  max-width: 72ch;
  margin: var(--space-sm) 0 0;
  font-size: var(--text-xs);
}
.attention-tools {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--space-2xs);
  flex-wrap: wrap;
}
.attention-status {
  min-height: var(--line-reserved);
  margin: calc(-1 * var(--space-xs)) 0 var(--space-xs);
}
.attention-when {
  display: flex;
  align-items: baseline;
  gap: var(--space-3xs);
  margin-top: var(--space-xs);
  color: var(--color-ink-2);
  font-size: var(--text-xs);
}
.attention-detail {
  max-width: 72ch;
  margin: 0;
}
.attention-advice {
  margin-top: var(--space-xs);
  border-top: var(--rule-thin) solid var(--color-rule);
  padding-top: var(--space-3xs);
}
.attention-advice summary {
  min-height: var(--control-h-emphasis);
  color: var(--color-ink-2);
  font-size: var(--text-xs);
  font-weight: 600;
}
.attention-advice p {
  max-width: 72ch;
  margin: var(--space-2xs) 0 0;
}
#stuck {
  table-layout: fixed;
}
#stuck th:first-child,
#stuck td:first-child {
  width: 34%;
}
#stuck td {
  vertical-align: top;
  white-space: normal;
}
#stuck td:last-child {
  padding-left: var(--space-md);
}
#stuck .cell-actions {
  margin-top: var(--space-xs);
}
#running {
  table-layout: fixed;
}
#running th:first-child,
#running td:first-child {
  width: 38%;
}
#running th:last-child,
#running td:last-child {
  width: 62%;
}
#running td {
  white-space: normal;
  overflow-wrap: anywhere;
}
.running-wait {
  display: block;
  margin-top: var(--space-3xs);
  font-size: var(--text-xs);
}
.attention-dismiss {
  min-height: var(--control-h-emphasis);
  padding: var(--space-2xs);
}

/* ── Диалог подробностей ──────────────────────────────────────────── */
.detail-dialog {
  width: min(52rem,calc(100% - var(--space-lg)));
  max-height: calc(100dvh - var(--space-lg));
  margin: auto;
  padding: 0;
  overflow: hidden;
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-card);
  background: var(--color-surface);
  color: var(--color-ink);
  box-shadow: var(--shadow-lg);
}
.detail-dialog::backdrop {
  background: var(--color-backdrop);
}
.detail-shell {
  max-height: calc(100dvh - var(--space-lg));
  overflow-y: auto;
  padding: var(--space-lg);
}
.detail-grid {
  display: grid;
  grid-template-columns: repeat(3,minmax(0,1fr));
  gap: var(--space-xs);
  margin-bottom: var(--space-md);
}
.detail-grid b {
  display: block;
  font: 700 var(--text-md)/1 var(--font-display);
}
.detail-grid>div {
  padding: var(--space-sm);
  background: var(--color-paper-2);
  border-radius: var(--radius-compact);
}
/* Статус бывает длиннее даты: переносим его, чтобы разбор помещался в диалог. */
.work-slices td:last-child {
  white-space: normal;
}
.work-idle {
  overflow-wrap: anywhere;
}
.evidence-list {
  display: grid;
  gap: var(--space-xs);
}
.evidence-group,
.evidence-single {
  padding-block: var(--space-xs);
  border-bottom: var(--rule-thin) solid var(--color-rule);
  overflow-wrap: anywhere;
}
.evidence-summary {
  min-height: var(--control-h-emphasis);
  cursor: pointer;
  border-radius: var(--radius-input);
}
.evidence-summary:hover {
  color: var(--color-ink-2);
}
.evidence-heading {
  display: inline-flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--space-xs);
  max-width: calc(100% - var(--space-sm));
}
.evidence-count {
  color: var(--color-muted);
  font-size: var(--text-xs);
  white-space: nowrap;
}
.evidence-meta {
  display: block;
  font-size: var(--text-xs);
}
.evidence-events {
  max-height: 32vh;
  overflow-y: auto;
  margin: var(--space-xs) 0 0;
  padding-inline-start: var(--space-lg);
  color: var(--color-muted);
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
}
.evidence-events li {
  padding-block: var(--space-3xs);
}

/* ── Разбор сотрудника ──────────────────────────────────────────── */
/* Отрицательный отступ сжимал две строки имени до одной и накладывал их
   на почту. Кнопка сохраняет цель касания, а строки занимают свою высоту. */
.member-detail-link {
  display: inline-flex;
  align-items: center;
  min-height: var(--control-h-emphasis);
  height: auto;
  max-width: 100%;
  margin: 0;
  padding: 0;
  border: 0;
  color: var(--color-ink);
  background: transparent;
  text-align: left;
  justify-content: flex-start;
  line-height: 1.5;
  overflow-wrap: anywhere;
  white-space: normal;
  text-decoration: underline;
  text-decoration-color: var(--color-rule);
  text-decoration-thickness: var(--rule-thin);
  text-underline-offset: var(--space-3xs);
}
.member-detail-link:hover {
  color: var(--color-accent-text);
  text-decoration-color: currentColor;
}
.member-summary {
  display: grid;
  gap: var(--space-sm);
  margin-bottom: var(--space-md);
}
.member-summary-line {
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  flex-wrap: wrap;
  color: var(--color-ink-2);
}
.member-last-action {
  color: var(--color-muted);
}
.member-period {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-sm);
  flex-wrap: wrap;
}
.member-counters {
  display: flex;
  gap: var(--space-2xs);
  flex-wrap: wrap;
  align-items: stretch;
}
.member-counter {
  display: inline-flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-2xs);
  min-width: 7.5rem;
  text-align: left;
  font-variant-numeric: tabular-nums;
}
.member-counter b {
  font: 700 var(--text-md)/1 var(--font-display);
}
.member-counter span {
  color: var(--color-muted);
  font-size: var(--text-xs);
}
.member-counter[aria-pressed="true"] {
  border-color: var(--color-accent-text);
  color: var(--color-accent-text);
  background: var(--color-warn-bg);
}
.member-counter-static {
  display: inline-flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-2xs);
  min-width: 7.5rem;
  min-height: var(--control-h-emphasis);
  padding: var(--space-2xs) var(--space-xs);
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-input);
  color: var(--color-ink-2);
  font-variant-numeric: tabular-nums;
}
.member-activity-meta {
  display: flex;
  gap: var(--space-sm);
  flex-wrap: wrap;
  margin: 0;
  color: var(--color-muted);
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
}
.member-coverage-note {
  margin: 0;
}
.member-daily {
  margin-bottom: var(--space-lg);
}
.member-daily .card-head {
  margin-bottom: var(--space-xs);
}
.member-daily-chart {
  min-width: 0;
  margin: 0;
  padding: 0;
}
.member-daily-plot {
  display: grid;
  grid-template-columns: auto minmax(0,1fr);
  gap: var(--space-2xs);
  min-width: 0;
}
.member-daily-scale {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  height: 10rem;
  color: var(--color-muted);
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
}
.member-daily-plot-main {
  display: grid;
  gap: var(--space-3xs);
  min-width: 0;
}
.member-daily-bars {
  display: flex;
  align-items: flex-end;
  gap: var(--rule-thin);
  min-width: 0;
  height: 10rem;
  padding-block: var(--space-3xs);
  border-bottom: var(--rule-thin) solid var(--color-rule);
}
.member-daily-column {
  display: flex;
  align-items: flex-end;
  flex: 1 1 0;
  align-self: stretch;
  min-width: 0;
  cursor: help;
}
.member-daily-fill {
  display: block;
  width: 100%;
  height: var(--chart-fill);
  min-height: var(--rule-thin);
  border-radius: var(--radius-compact) var(--radius-compact) 0 0;
  background: var(--color-accent);
}
.member-daily-axis {
  display: flex;
  justify-content: space-between;
  gap: var(--space-2xs);
  min-width: 0;
  color: var(--color-muted);
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
}
.member-daily-axis span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.member-daily-values {
  margin-top: var(--space-xs);
}
.member-daily-values summary {
  min-height: var(--control-h-emphasis);
  cursor: pointer;
  color: var(--color-muted);
  font-size: var(--text-xs);
}
.member-daily-values ol {
  max-height: 14rem;
  overflow-y: auto;
  margin: var(--space-2xs) 0 0;
  padding-inline-start: var(--space-md);
  color: var(--color-muted);
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
}
.member-daily-values li {
  display: flex;
  justify-content: space-between;
  gap: var(--space-sm);
}
.member-daily-empty {
  padding-block: var(--space-xs);
}
.member-secondary {
  margin-bottom: var(--space-md);
  border-top: var(--rule-thin) solid var(--color-rule);
  border-bottom: var(--rule-thin) solid var(--color-rule);
}
.member-secondary summary {
  display: flex;
  align-items: center;
  min-height: var(--control-h-emphasis);
  cursor: pointer;
  font-weight: 600;
}
.member-secondary[open] summary {
  margin-bottom: var(--space-sm);
}

/* ── Мастер настройки ──────────────────────────────────────────── */
.setup-wizard {
  display: grid;
  grid-template-columns: minmax(9rem,.34fr) minmax(0,1fr);
  gap: var(--space-lg);
  border-color: var(--color-accent);
}
.setup-steps {
  display: grid;
  align-content: start;
  gap: var(--space-2xs);
  margin: 0;
  padding: 0;
  list-style: none;
}
.setup-step {
  display: flex;
  justify-content: space-between;
  gap: var(--space-xs);
  padding-block: var(--space-2xs);
  border-bottom: var(--rule-thin) solid var(--color-rule);
  color: var(--color-muted);
}
.setup-step[data-state="active"] {
  color: var(--color-ink);
  font-weight: 700;
}
.setup-content {
  max-width: 46rem;
  min-width: 0;
}
.setup-content p {
  max-width: 65ch;
}
.setup-fields {
  display: grid;
  grid-template-columns: repeat(2,minmax(0,1fr));
  gap: var(--space-sm);
}
.setup-fields .wide {
  grid-column: 1/-1;
}
.setup-actions {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  flex-wrap: wrap;
  margin-top: var(--space-md);
}
.setup-recovery {
  white-space: pre-wrap;
  word-break: break-all;
  padding: var(--space-sm);
  background: var(--color-paper-2);
  border-radius: var(--radius-input);
  font-family: var(--font-mono);
  font-size: var(--text-xs);
}

/* ── Списки доступа, устройств и провайдеров ──────────────────────────────────────────── */
.provider-settings {
  max-width: 64rem;
}
.provider-settings > .error:empty {
  display: none;
}
.device-list,
.provider-credentials {
  display: grid;
  gap: var(--space-2xs);
}
.provider-credential {
  display: grid;
  grid-template-columns: 11rem minmax(0,1fr);
  align-items: start;
  gap: var(--space-md);
  padding-block: var(--space-sm);
  border-bottom: var(--rule-thin) solid var(--color-rule);
}
.provider-credential:last-child {
  border-bottom: 0;
}
.provider-heading {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-2xs);
  min-width: 0;
  overflow-wrap: anywhere;
}
.provider-heading code {
  font-size: var(--text-xs);
}
.provider-heading .badge {
  max-width: 100%;
  white-space: normal;
}
.provider-editor {
  display: grid;
  gap: var(--space-xs);
  min-width: 0;
}
.provider-credential input,
.provider-credential select {
  width: 100%;
  min-width: 0;
}
.provider-fields {
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  gap: var(--space-xs);
}
.provider-fields > label {
  flex: 1 1 18rem;
  max-width: 28rem;
  min-width: 0;
}
.provider-fields > .provider-field-select {
  flex: 0 1 14rem;
}
.provider-actions,
.provider-feedback {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2xs) var(--space-xs);
}
.provider-check {
  font-size: var(--text-xs);
  color: var(--color-muted);
  max-width: 72ch;
  overflow-wrap: anywhere;
}
.provider-balance {
  color: var(--color-good);
  font-variant-numeric: tabular-nums;
}
.member-account {
  display: grid;
  gap: var(--space-3xs);
  min-width: 0;
}
.member-account code {
  font-size: var(--text-xs);
}
/* Значок состояния не тянется на всю ячейку: растянутый, он читается как
   поле ввода. Остальные строки карточки тянутся — длинная почта иначе
   выпирала бы из колонки. */
.member-account .badge {
  justify-self: start;
}
.device-row select {
  min-height: var(--control-h-emphasis);
}
.provider-check.bad {
  color: var(--color-accent-text);
}

/* ── Общие правила нескольких разделов ─────────────────── */
.good,
.setup-step[data-state="done"] {
  color: var(--color-good);
}
.actions,
.assignment-row,
.device-row {
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  flex-wrap: wrap;
}
.setup-status,
.action-status {
  min-height: var(--line-reserved);
  margin-top: var(--space-xs);
}
.setup-wizard h2 {
  margin-bottom: var(--space-2xs);
}
.detail-head,
.card-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: var(--space-sm);
  padding-bottom: var(--space-sm);
  margin-bottom: var(--space-sm);
  border-bottom: var(--rule-thin) solid var(--color-rule);
}
.detail-head > div:first-child,
.card-head > div:first-child {
  min-width: 0;
}
td[data-label="Контекст"],
td[data-label="Файл"],
td[data-label="Где работал"],
td[data-label="За период"],
td[data-label="Работа"],
.split th,
.split td[data-label="Устройства"],
.split td[data-label="Сотрудник"] {
  white-space: normal;
}
.card>.actions,
.auth-card label,
.auth-card details,
.card>button {
  margin-top: var(--space-sm);
}
.icon-btn svg,
[data-theme="dark"] .icon-btn .icon-sun {
  display: block;
}
.icon-btn .icon-sun,
[data-theme="dark"] .icon-btn .icon-moon {
  display: none;
}

/* ── Узкий экран и доступность ─────────────────────────── */
.dynamic-grid {
  display: grid;
  grid-template-columns: repeat(2,minmax(0,1fr));
  gap: var(--space-sm);
  margin-block: var(--space-sm);
}
.dynamic-grid > * { min-width: 0; }
.dynamic-steps {
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  gap: var(--space-2xs);
  padding: 0;
  margin-block: var(--space-md);
}
.dynamic-steps [aria-current="step"] {
  color: var(--color-accent-text);
  background: var(--color-warn-bg);
  border-color: var(--color-accent-text);
}
.dynamic-field {
  min-width: 0;
  border: var(--rule-thin) solid var(--color-rule);
  border-radius: var(--radius-input);
  padding: var(--space-sm);
  margin: 0 0 var(--space-sm);
}
.dynamic-field legend { font-weight: 600; padding-inline: var(--space-2xs); }
.dynamic-check { display: flex; align-items: center; gap: var(--space-2xs); }
.dynamic-check input { width: auto; min-height: var(--control-h-emphasis); }
.dynamic-advanced { margin-block: var(--space-md); }
.dynamic-advanced label { margin-top: var(--space-sm); }
.dynamic-issues {
  border: var(--rule-thin) solid var(--color-accent-text);
  background: var(--color-warn-bg);
  color: var(--color-accent-text);
  padding: var(--space-sm);
  margin-bottom: var(--space-sm);
  border-radius: var(--radius-input);
}
.dynamic-issues summary {
  cursor: pointer;
  font-weight: 600;
  list-style-position: inside;
}
.dynamic-issues[open] summary { margin-bottom: var(--space-xs); }
.dynamic-issues ul { padding-left: var(--space-md); margin-bottom: 0; }
.dynamic-autosetup {
  border: var(--rule-thin) solid var(--color-rule);
  background: var(--color-calm-bg);
  padding: var(--space-sm) var(--space-md);
  margin-block: var(--space-sm);
  border-radius: var(--radius-input);
}
.dynamic-autosetup strong { display: block; margin-bottom: var(--space-2xs); }
.dynamic-autosetup p { margin: 0; color: var(--color-muted); }
.dynamic-autosetup p + p, .dynamic-autosetup ul + p { margin-top: var(--space-2xs); }
.dynamic-autosetup ul { margin: var(--space-2xs) 0 0; padding-left: var(--space-md); overflow-wrap: anywhere; }
.dynamic-autosetup-success { border-color: var(--color-rule); }
.dynamic-autosetup-success strong { color: var(--color-good); }
.dynamic-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-sm);
  margin-top: var(--space-md);
  padding-top: var(--space-sm);
  border-top: var(--rule-thin) solid var(--color-rule);
}
.dynamic-result {
  display: grid;
  gap: var(--space-xs);
  margin-block: var(--space-sm);
  overflow-wrap: anywhere;
}
.dynamic-result img, .dynamic-result video {
  display: block;
  max-width: 100%;
  max-height: 24rem;
  object-fit: contain;
  border-radius: var(--radius-input);
}
.dynamic-result audio { max-width: 100%; }
.dynamic-result-text { white-space: pre-wrap; max-height: 24rem; overflow: auto; }
#dynamic-model-form textarea { width: 100%; resize: vertical; }
#dynamic-model-form section > .actions { margin-top: var(--space-sm); }
#dynamic-model-form .dynamic-variants { margin: var(--space-sm) 0; padding: var(--space-sm); border: var(--rule-thin) solid var(--color-rule); border-radius: var(--radius-input); background: var(--color-surface); }
#dynamic-model-form .dynamic-variants .actions { display: flex; flex-wrap: wrap; gap: var(--space-xs); margin-top: var(--space-xs); }
#dynamic-model-form .dynamic-mode-switch[aria-pressed="true"] { border-color: var(--color-accent); color: var(--color-accent-text); }
#dynamic-test-controls > label { margin-top: var(--space-sm); }
#dynamic-test-upload-section { margin-top: var(--space-sm); }
.dynamic-upload { display: flex; align-items: center; justify-content: space-between; gap: var(--space-xs); margin-top: var(--space-2xs); }
.dynamic-upload span { overflow-wrap: anywhere; min-width: 0; }
#dynamic-model-revisions { margin-bottom: var(--space-sm); }
/* Фильтры каталога в одну строку: поиск шире, выборы — по содержимому. */
.catalog-filters { display: grid; grid-template-columns: minmax(0, 2fr) repeat(3, minmax(0, 1fr)); gap: var(--space-xs); align-items: end; margin-block: var(--space-sm); }
.catalog-filters-short { grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); }
.catalog-pager { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs); margin-block: var(--space-sm); }
#catalog-error:empty { display: none; }
#catalog-page { margin-right: auto; font-variant-numeric: tabular-nums; }
.catalog-page-jump { display: flex; align-items: center; gap: var(--space-2xs); margin: 0; }
.catalog-page-jump select { width: 5rem; margin: 0; font-variant-numeric: tabular-nums; }
#catalog-models td { white-space: normal; }
.catalog-model-details { min-width: 12ch; max-width: 34rem; }
.catalog-model-details summary { min-height: var(--control-h-emphasis); cursor: pointer; align-content: center; }
.catalog-history { margin-top: var(--space-sm); }
.catalog-history > summary { min-height: var(--control-h-emphasis); cursor: pointer; align-content: center; }
.provider-model-list { margin-top: var(--space-sm); border-top: var(--rule-thin) solid var(--color-rule); padding-top: var(--space-sm); }
.provider-model-list > summary { font-weight: 600; }
.provider-model-filters { grid-template-columns: minmax(0, 1fr) auto; }
.provider-models-summary,
.team-models-summary { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs); margin-bottom: var(--space-xs); }
.provider-models-summary > p,
.team-models-summary > p { margin: 0; }
.provider-models-summary .pager,
.team-models-summary .pager { margin-top: 0; margin-left: auto; }
.catalog-note { display: block; margin-top: var(--space-3xs); color: var(--color-muted); font-size: var(--text-xs); }
.spend-filters { display: grid; grid-template-columns: minmax(0,2fr) repeat(3,minmax(0,1fr)) auto; gap: var(--space-xs); align-items: end; margin-block: var(--space-sm); min-width: 0; }
.spend-filters > label { min-width: 0; }
.spend-filter-search { min-width: 0; }
.spend-filter-reset { align-self: end; }
.spend-filters-caption { grid-column: 1 / -1; margin: 0; font-size: var(--text-xs); }
.spend-status { grid-column: 1 / -1; margin: 0; font-variant-numeric: tabular-nums; }
.spend-error { grid-column: 1 / -1; margin: 0; }
.spend-error:empty { display: none; }
.backup-settings { max-width: 64rem; }
.backup-filters { grid-template-columns: minmax(0,2fr) minmax(0,1fr) auto; }
.backup-filters > label { min-width: 0; }
.backup-summary { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs); margin-bottom: var(--space-xs); }
.backup-summary > p { margin: 0; }
.backup-summary .pager { margin-top: 0; margin-left: auto; }
.backup-settings td:last-child { white-space: normal; max-width: 36ch; overflow-wrap: anywhere; }
.backup-create { margin-top: var(--space-md); padding-top: var(--space-sm); border-top: var(--rule-thin) solid var(--color-rule); }
.backup-create > summary { width: fit-content; }
.backup-create-body { display: grid; gap: var(--space-sm); max-width: 44rem; padding-top: var(--space-sm); }
.backup-create-body > p { margin: 0; max-width: 72ch; }
.backup-create-body textarea { min-height: var(--control-h-emphasis); }
.backup-create-body > .error:empty { display: none; }

@media(min-width:801px) {
  .work-slices th:not(:first-child):not(:last-child),
  .work-slices td:not(:first-child):not(:last-child) {
    padding-inline: var(--space-2xs);
    text-align: right;
  }
  .work-slices td:first-child {
    min-width: 0;
  }
}
@media(max-width:800px) {
  .dynamic-grid { grid-template-columns: 1fr; }
  .overview-grid { grid-template-columns: 1fr; }
  .stats.dispatch-strip { grid-template-columns: repeat(2,minmax(0,1fr)); }
  .catalog-filters, .catalog-filters-short { grid-template-columns: 1fr; }
  .catalog-pager { gap: var(--space-2xs); justify-content: space-between; }
  .catalog-pager > button { padding-inline: var(--space-3xs); }
  #catalog-page { width: 100%; }
  .catalog-page-label { display: none; }
  .catalog-page-jump { gap: var(--space-3xs); }
  .catalog-page-jump select { width: 4rem; }
  .spend-filters { grid-template-columns: repeat(2,minmax(0,1fr)); }
  .spend-filters > label:first-child { grid-column: 1 / -1; }
  .spend-filter-reset { width: 100%; }
  .backup-filters { grid-template-columns: repeat(2,minmax(0,1fr)); }
  .backup-filters > label:first-child { grid-column: 1 / -1; }
  .backup-summary .pager { width: 100%; margin-left: 0; justify-content: space-between; }
  .team-models-filters { grid-template-columns: repeat(2,minmax(0,1fr)); }
  .team-models-filters > label:first-child, .team-models-filters > label:last-child { grid-column: 1 / -1; }
  .provider-models-summary .pager,
  .team-models-summary .pager { width: 100%; margin-left: 0; justify-content: space-between; }
  .dynamic-steps { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); }
  .dynamic-steps button { width: 100%; }
  .detail-dialog {
    width: calc(100% - var(--space-sm));
    max-height: calc(100dvh - var(--space-sm));
  }
  .detail-shell {
    max-height: calc(100dvh - var(--space-sm));
    padding: var(--space-sm);
  }
  .app-tabs { display: none !important; }
  .mobile-nav { display: flex; align-items: center; gap: var(--space-sm); padding: var(--space-2xs) var(--space-sm); background: var(--color-paper-2); border-bottom: var(--rule-thin) solid var(--color-rule); }
  .mobile-nav select { flex: 1; min-width: 0; }
  .app-topbar { flex-direction: row; align-items: center; gap: var(--space-2xs); padding-block: var(--space-2xs); }
  .app-brand { min-width: 0; }
  .app-brand small { overflow-wrap: anywhere; }
  .app-tools { width: auto; flex-wrap: nowrap; margin-left: auto; gap: var(--space-3xs); }
  .app-tools .stamp, .who-name { display: none; }
  .account-chip { width: var(--control-h-emphasis); padding: 0; justify-content: center; }
  .card { padding: var(--space-sm); margin-bottom: var(--space-sm); }
  .card-head input { width: 100%; min-width: 0; }
  .card-head { flex-direction: column; gap: var(--space-xs); }
  .form-grid > * { min-width: 0; }
  .member-create-fields { display: grid; grid-template-columns: 1fr; }
  .billing-card .card-head { align-items: flex-start; }
  .billing-mode { display: grid; grid-template-columns: 1fr; }
  .billing-mode > button { justify-self: start; }
  .billing-topup-fields { grid-template-columns: repeat(2,minmax(0,1fr)); }
  .billing-topup-fields > label:last-child { grid-column: 1 / -1; }
  .provider-credential { grid-template-columns: 1fr; gap: var(--space-sm); }
  .provider-heading { flex-direction: row; flex-wrap: wrap; align-items: center; }
  .provider-fields { display: grid; grid-template-columns: repeat(auto-fit,minmax(min(16rem,100%),1fr)); }
  .provider-fields > label { max-width: none; }
  .provider-actions { gap: var(--space-2xs); }
  .provider-actions > button { padding-inline: var(--space-2xs); }
  .attention-tools { width: 100%; justify-content: flex-start; }
  td[data-label="Что случилось"], td[data-label="Что делать"], td[data-label="Доступ"] { min-width: 0; max-width: none; }
  .table-wrap td:first-child { font-size: var(--text-panel-title); font-weight: 600; padding-bottom: var(--space-2xs); }
  .table-wrap td:first-child::before { content: none; }
  #stuck th:first-child, #stuck td:first-child,
  #running th:first-child, #running td:first-child,
  #running th:last-child, #running td:last-child { width: auto; }
  #stuck td:last-child { padding-left: 0; }
  .menu-pop .menu-item { white-space: normal; height: auto; min-height: var(--control-h-emphasis); line-height: 1.4; }

  .stat:nth-child(2) {
    border-right: 0;
  }
  .split,
  .detail-grid,
  .form-grid,
  .setup-wizard,
  .setup-fields {
    grid-template-columns: 1fr;
  }
  .setup-fields .wide {
    grid-column: auto;
  }
  .stats,
  .setup-steps {
    grid-template-columns: repeat(2,minmax(0,1fr));
  }
  /* Липкая шапка на узком экране съела бы половину высоты: там она едет
     вместе со страницей. */
  .app-head {
    position: static;
  }
  .table-wrap table,
  .table-wrap tbody {
    display: block;
  }
  .table-wrap td:not(:first-child)[data-label]::before {
    content: attr(data-label) ": ";
    display: block;
    color: var(--color-muted);
    font-size: var(--text-xs);
    font-weight: 600;
    letter-spacing: var(--tracking-label);
    margin-bottom: var(--space-3xs);
  }
  .table-wrap th,
  .table-wrap thead {
    display: none;
  }
  .table-wrap td.empty {
    padding: var(--space-lg);
    text-align: center;
  }
  /* На узком экране строка становится карточкой, места хватает: кнопки
     возвращаются к обычному потоку и переносятся. */
  td .actions {
    display: flex;
    flex-wrap: wrap;
    width: auto;
  }
  th,
  td {
    padding-inline: 0;
    white-space: normal;
    min-width: 0;
  }
  td:first-child {
    white-space: normal;
    min-width: 0;
  }
  button,
  input,
  select,
  textarea,
  .theme-field select {
    font-size: var(--text-panel-title);
  }
  .table-wrap td {
    display: block;
    border: 0;
    padding: var(--space-3xs) 0;
    text-align: left;
    padding-block: var(--space-2xs);
  }
  .table-wrap tr {
    display: block;
    padding: var(--space-xs) 0;
    border-bottom: var(--rule-thin) solid var(--color-rule);
    padding-block: var(--space-sm);
    padding-inline: var(--space-sm);
  }
  td:last-child,
  th:last-child,
  .table-wrap[data-scrolls="true"] td:last-child,
  .table-wrap[data-scrolls="true"] th:last-child {
    position: static;
    box-shadow: none;
  }
}
@media(max-width:414px) {
  .stats,
  .setup-steps {
    grid-template-columns: 1fr;
  }
  .stats.dispatch-strip { grid-template-columns: repeat(2,minmax(0,1fr)); }
  .stats.dispatch-strip .stat { border-right: var(--rule-thin) solid var(--color-rule); border-bottom: var(--rule-thin) solid var(--color-rule); }
  .stats.dispatch-strip .stat:nth-child(2n) { border-right: 0; }
  .stats.dispatch-strip .stat:nth-last-child(-n+2) { border-bottom: 0; }
  .stat {
    border-right: 0;
    border-bottom: var(--rule-thin) solid var(--color-rule);
  }
  .stat:last-child {
    border-bottom: 0;
  }
  .assignment-row,
  .device-row {
    align-items: stretch;
  }
  .spend-filters { grid-template-columns: repeat(auto-fit,minmax(min(8rem,100%),1fr)); }
  .billing-topup-fields { grid-template-columns: 1fr; }
  .assignment-row>*,
  .device-row>* {
    max-width: none;
    width: 100%;
  }
}
@media(prefers-reduced-motion:reduce) {
  button,
  .skip-link {
    transition-duration: 0ms;
  }
  button:not(:disabled):active,
  .skip-link:focus-visible {
    transform: none;
  }
}

.catalog-json { max-width: 38rem; max-height: 22rem; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--text-xs); }
