/* ============================================================================
   Obsidian Gold — админка.
   Только переменные из tokens.css и классы каркаса из shell.css; собственных
   цветов не объявляем (прозрачные оттенки — rgba() ровно теми значениями, что
   заданы в хендоффе, как и в tokens.css/shell.css). Hex-кодов в файле нет.

   ВАЖНО ПРО КАСКАД
   -----------------------------------------------------------------------------
   Разделы админки живут в app/templates/_admin/** и тянут app/static/css/
   admin_page.css из <body>, то есть ПОЗЖЕ наших файлов из <head>. Поэтому все
   правила, перекрывающие легаси-классы (.m2-*, .adm-*), написаны с префиксом
   `.fl-body` — специфичность (0,3,x) против (0,2,x) у базового файла. Плюс в
   admin.html этот файл ещё раз подключён сразу за admin_page.css.

   ОГЛАВЛЕНИЕ
   -----------------------------------------------------------------------------
   1  Токены графиков       --adm-chart-* (их читает section_overview_charts.html)
   2  Каркас страницы       .m2-admin-page .zp-admin
   3  Навигация разделов    .adm-hub-nav .adm-hub-nav__link .adm-hub-nav__dropdown
   4  Шапка раздела         .adm-head .adm-head__title .adm-head__actions
   5  Панель фильтров       .adm-filterbar
   6  KPI                   .adm-zone .adm-kpis .adm-kpi(--revenue/-site/-bot/--pending)
   7  Панели и сетки        .adm-panel .adm-grid .adm-metrics .adm-minicard .adm-stack
   8  Таблицы               .m2-table-wrap .m2-table .adm-table .adm-rowactions
   9  Формы                 .m2-card .m2-field .m2-input .m2-btn .adm-fold .adm-check
   10 Статусы и чипы        .adm-status .adm-color-* .adm-sync-status .adm-filter-chip
   11 Карточка пользователя .adm-user-* (admin_user_edit.html)
   12 Тикеты                .admin-ticket-item #adminTicketMessages
   13 Легаси-разделы        .adm-stat .adm-compact-* .adm-analytics-* .adm-charts-*
   14 Адаптив               1280 / 1024 / 760 / 560 / 380
   15 Поверхность админки   точная сборка экранов по макету
   16 Чат тикета            .adm-chat__* (блок S8)
   17 Остальные разделы     .adm-switch(row/group) .adm-pill .adm-grid--pair/--trio
                            .adm-promoform .adm-squadform .adm-logopreview
                            .adm-fold--warn .adm-panel__foot/__subtitle/__table
   18 Строка тикета         .admin-ticket-item__top/__title/__meta .adm-support__body
   ============================================================================ */


/* ============================================================================
   1. Токены графиков
   section_overview_charts.html читает их через getComputedStyle(:root), поэтому
   перекрасить Chart.js можно отсюда, не копируя сам шаблон.
   ============================================================================ */

:root {
  --adm-chart-text: var(--zp-ink-3);
  --adm-chart-grid: rgba(246, 240, 228, 0.12);
  --adm-chart-grid-soft: rgba(246, 240, 228, 0.07);
  --adm-chart-primary: var(--zp-gold);
  --adm-chart-primary-fill: rgba(255, 184, 0, 0.14);
  --adm-chart-secondary: var(--zp-ink-2);

  --adm-chart-series-1: var(--zp-gold);
  --adm-chart-series-2: var(--zp-ok);
  --adm-chart-series-3: var(--zp-amber);
  --adm-chart-series-4: var(--zp-ink-2);
  --adm-chart-series-5: var(--zp-gold-light);
  --adm-chart-series-6: var(--zp-ok-ink);
  --adm-chart-series-7: var(--zp-amber-dark);
  --adm-chart-series-8: var(--zp-ink-3);
}


/* ============================================================================
   2. Каркас страницы админки
   ============================================================================ */

.fl-body .m2-admin-page {
  display: flex;
  flex-direction: column;
  gap: clamp(12px, 1.6vw, 16px);
  min-width: 0;
}

/* В макете блоки экрана разделены ровно 12px. */
.fl-body .m2-admin-page.zp-admin { gap: 12px; }

/* Появление экрана — как в макете (zp-screen уже есть в shell.css) */
.fl-body .m2-admin-page > * { min-width: 0; }


/* ============================================================================
   3. Навигация разделов админки
   ============================================================================ */

.fl-body .adm-hub-nav {
  margin: 0 0 clamp(10px, 1.4vw, 16px);
  padding: 6px;
  border-radius: var(--zp-r-pill);
  background: var(--zp-grad-glass) padding-box,
    var(--zp-grad-glass-line) border-box;
  border: 1px solid transparent;
  box-shadow: 0 18px 44px rgba(0, 0, 0, 0.38);
}

.fl-body .adm-hub-nav__scroll {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px;
}

.fl-body .adm-hub-nav__link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
  min-height: 40px;
  padding: 9px 15px;
  border: 1px solid transparent;
  border-radius: var(--zp-r-pill);
  font-family: var(--zp-font-text);
  font-size: 13.5px;
  font-weight: 500;
  line-height: 1.2;
  white-space: nowrap;
  text-decoration: none;
  opacity: 1;
  color: var(--zp-ink-2);
  transition: color var(--zp-t-fast) var(--zp-ease),
    background-color var(--zp-t-fast) var(--zp-ease),
    border-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-hub-nav__link:hover {
  color: var(--zp-ink);
  background: rgba(255, 255, 255, 0.05);
  opacity: 1;
}

.fl-body .adm-hub-nav__link.is-active {
  color: var(--zp-on-gold);
  background: var(--zp-grad-gold);
  border-color: transparent;
  font-weight: 600;
  box-shadow: 0 10px 24px rgba(255, 140, 0, 0.3);
}

.fl-body .adm-hub-nav__icon {
  font-size: 15px;
  line-height: 1;
  flex-shrink: 0;
}

.fl-body .adm-hub-nav__more > summary {
  cursor: pointer;
  list-style: none;
  color: var(--zp-ink-3);
}

.fl-body .adm-hub-nav__more > summary::-webkit-details-marker { display: none; }
.fl-body .adm-hub-nav__more[open] > summary { color: var(--zp-gold); }

.fl-body .adm-hub-nav__dropdown {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  left: auto;
  z-index: 60;
  min-width: 210px;
  margin: 0;
  padding: 8px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  border-radius: var(--zp-r-tile);
  background: rgba(10, 9, 7, 0.97);
  border: 1px solid rgba(255, 184, 0, 0.22);
  box-shadow: var(--zp-shadow-card);
  animation: zp-rise 260ms var(--zp-ease) both;
}

.fl-body .adm-hub-nav__dropdown .adm-hub-nav__link {
  border-radius: var(--zp-r-btn-sm);
  width: 100%;
  white-space: normal;
}


/* ============================================================================
   4. Шапка раздела
   ============================================================================ */

.fl-body .adm-head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 12px 24px;
  margin-bottom: 2px;
}

.fl-body .adm-head__text { flex: 1 1 260px; min-width: 0; }

.fl-body .m2-admin-page .adm-head__title {
  margin: 8px 0 0;
  font-family: var(--zp-font-display);
  font-weight: 300;
  font-size: clamp(24px, 2.8vw, 36px);
  line-height: 1.05;
  letter-spacing: -0.035em;
  color: var(--zp-ink);
  text-transform: none;
  opacity: 1;
}

.fl-body .adm-head__actions {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}

.fl-body .adm-head__actions form { margin: 0; }


/* ============================================================================
   5. Панель фильтров (GET-форма разделов)
   ============================================================================ */

.fl-body .adm-filterbar { margin: 0; }

/* flex-direction задаём явно: у старой custom.css есть
   `@media (max-width: 768px) { .filter-bar { flex-direction: column } }`,
   из-за которого поля вытягивались на всю высоту flex-basis. */
.fl-body .adm-filterbar__form {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 12px;
}

.fl-body .adm-filterbar__field {
  margin: 0;
  flex: 0 1 200px;
  min-width: 150px;
}

.fl-body .adm-filterbar__field--sm { flex: 0 1 150px; min-width: 120px; }
.fl-body .adm-filterbar__field--grow { flex: 1 1 220px; min-width: 170px; }

.fl-body .adm-filterbar__submit {
  margin: 0;
  flex: 0 0 auto;
  align-self: flex-end;
}


/* ============================================================================
   6. KPI
   ============================================================================ */

.fl-body .adm-zone { margin: 0; }

.fl-body .adm-kpis {
  display: grid;
  gap: 12px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr));
  margin: 0;
}

.fl-body .adm-kpi {
  margin: 0;
  padding: clamp(16px, 2vw, 24px);
  border-radius: var(--zp-r-tile);
  background: var(--zp-grad-card);
  border: 1px solid rgba(246, 240, 228, 0.08);
  color: var(--zp-ink);
  box-shadow: none;
  min-width: 0;
  transition: transform var(--zp-t-mid) var(--zp-ease),
    border-color var(--zp-t-mid) var(--zp-ease);
  animation: zp-rise 700ms var(--zp-ease) 100ms both;
}

/* KPI экрана «Платежи»: без дельты, значение мельче и ближе к метке (макет S6). */
.fl-body .adm-kpis--sm .adm-kpi-value {
  margin-top: 12px;
  font-size: clamp(26px, 2.6vw, 36px);
}

.fl-body .adm-kpi-value--gold { color: var(--zp-gold); }

.fl-body .adm-kpi-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
}

.fl-body .adm-kpi-delta {
  flex: 0 0 auto;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  white-space: nowrap;
  color: var(--zp-ink-3);
}

.fl-body .adm-kpi-delta--ok { color: var(--zp-ok-ink); }
.fl-body .adm-kpi-delta--gold { color: var(--zp-gold); }
.fl-body .adm-kpi-delta--warn { color: var(--zp-warn); }

.fl-body .adm-kpi-label {
  margin: 0;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-kpi-value {
  margin: 16px 0 0;
  font-family: var(--zp-font-display);
  font-weight: 300;
  font-size: clamp(28px, 2.8vw, 40px);
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--zp-ink);
  word-break: break-word;
}

.fl-body .adm-kpi-sub {
  margin: 8px 0 0;
  font-size: 12.5px;
  color: var(--zp-ink-3);
  opacity: 1;
}

/* Первая карточка — золотая, как «выручка сегодня» в макете */
.fl-body .adm-kpi--revenue {
  background: var(--adm-grad-gold-card);
  border-color: transparent;
  box-shadow: 0 24px 60px rgba(255, 140, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.5);
}

.fl-body .adm-kpi--revenue .adm-kpi-delta { color: rgba(40, 20, 0, 0.85); }

.fl-body .adm-kpi--revenue .adm-kpi-label,
.fl-body .adm-kpi--revenue .adm-kpi-sub { color: var(--zp-on-gold-soft); }
.fl-body .adm-kpi--revenue .adm-kpi-value { color: var(--zp-on-gold); }

.fl-body .adm-kpi--revenue-site,
.fl-body .adm-kpi--revenue-bot {
  background: var(--zp-grad-card);
  color: var(--zp-ink);
}

.fl-body .adm-kpi--revenue-bot .adm-kpi-value { color: var(--zp-ink); }
.fl-body .adm-kpi--revenue-site .adm-kpi-value { color: var(--zp-ink); }

.fl-body .adm-kpi--pending {
  background: var(--zp-grad-card);
  border-color: var(--zp-warn-line);
  color: var(--zp-ink);
}

.fl-body .adm-kpi--pending .adm-kpi-value { color: var(--zp-warn); }


/* ============================================================================
   7. Панели, сетки, счётчики
   ============================================================================ */

.fl-body .adm-grid {
  display: grid;
  gap: 12px;
  min-width: 0;
}

.fl-body .adm-grid--2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr)); }
.fl-body .adm-grid--3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
.fl-body .adm-grid--providers { grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); }

.fl-body .adm-stack {
  display: grid;
  gap: 12px;
  align-content: start;
  min-width: 0;
}

.fl-body .m2-admin-page .adm-panel {
  padding: clamp(18px, 2.2vw, 30px);
  border-radius: var(--adm-r-panel);
  background: var(--zp-grad-card);
  border: 1px solid var(--zp-hairline);
  margin: 0;
}

.fl-body .adm-panel--glass {
  background: var(--zp-grad-glass) padding-box,
    var(--adm-grad-glass-line) border-box;
  border: 1px solid transparent;
  box-shadow: var(--zp-shadow-card);
}

.fl-body .adm-panel--warn {
  border-color: var(--zp-warn-line);
  background: linear-gradient(180deg, rgba(255, 184, 0, 0.06), rgba(255, 255, 255, 0.01));
}

.fl-body .adm-panel__head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: 10px 18px;
  margin-bottom: 14px;
}

.fl-body .adm-panel__head > div { min-width: 0; }

.fl-body .m2-admin-page .adm-panel__title {
  margin: 0 0 14px;
  font-family: var(--zp-font-display);
  font-weight: 400;
  font-size: 19px;
  letter-spacing: -0.02em;
  line-height: 1.25;
  text-transform: none;
  color: var(--zp-ink);
  opacity: 1;
}

.fl-body .adm-panel__head .adm-panel__title { margin-bottom: 4px; }

.fl-body .adm-panel__note {
  margin: 0;
  max-width: 78ch;
  font-size: 13px;
  line-height: 1.5;
  color: var(--zp-ink-3);
  opacity: 1;
}

/* Сетка мелких счётчиков (Платежи / Пользователи / Аналитика) */
.fl-body .adm-metrics {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 96px), 1fr));
}

.fl-body .adm-metrics--3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 120px), 1fr)); }
.fl-body .adm-metrics--5 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 128px), 1fr)); }
.fl-body .adm-metrics--6 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 130px), 1fr)); }

.fl-body .adm-metric {
  min-width: 0;
  padding: 14px 16px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid rgba(246, 240, 228, 0.08);
  text-align: left;
  transition: border-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-metric:hover { border-color: rgba(255, 184, 0, 0.35); }

.fl-body .adm-metric__value {
  font-family: var(--zp-font-display);
  font-weight: 300;
  font-size: 26px;
  line-height: 1.05;
  letter-spacing: -0.03em;
  color: var(--zp-ink);
  word-break: break-word;
}

.fl-body .adm-metric__value--gold { color: var(--zp-gold); }

.fl-body .adm-metric__label {
  margin-bottom: 8px;
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

/* Мини-карточка настройки (видимые группы / ID / тариф по умолчанию) */
.fl-body .m2-admin-page .adm-minicard { padding: 14px 16px; }

.fl-body .adm-minicard__label {
  margin-bottom: 9px;
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

/* Контейнер графика */
.fl-body .m2-chart-wrap {
  position: relative;
  width: 100%;
  min-height: 200px;
  height: clamp(200px, 24vw, 260px);
  max-height: 300px;
}


/* ============================================================================
   8. Таблицы
   ============================================================================ */

.fl-body .m2-admin-page .adm-tablecard {
  padding: clamp(10px, 1.4vw, 16px);
  overflow: hidden;
}

/* Скролл живёт ВНУТРИ карточки, страница горизонтально не едет */
.fl-body .m2-admin-page .m2-table-wrap {
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  border: 0;
  border-radius: var(--zp-r-tile-sm);
  scrollbar-color: rgba(255, 184, 0, 0.45) transparent;
  scrollbar-width: thin;
}

.fl-body .m2-admin-page .m2-table-wrap::-webkit-scrollbar { height: 8px; }
.fl-body .m2-admin-page .m2-table-wrap::-webkit-scrollbar-track { background: transparent; }

.fl-body .m2-admin-page .m2-table-wrap::-webkit-scrollbar-thumb {
  background: rgba(255, 184, 0, 0.35);
  border-radius: var(--zp-r-pill);
}

.fl-body .m2-admin-page .m2-table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  background: transparent;
  font-size: 14px;
  color: var(--zp-ink);
}

.fl-body .m2-admin-page .m2-table th {
  padding: 8px 12px;
  text-align: left;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  white-space: nowrap;
  background: transparent;
  border: 0;
  opacity: 1;
}

.fl-body .m2-admin-page .m2-table td {
  padding: 12px;
  border: 0;
  color: var(--zp-ink);
  vertical-align: middle;
  opacity: 1;
}

.fl-body .m2-admin-page .m2-table tbody tr {
  transition: background-color 160ms var(--zp-ease);
}

.fl-body .m2-admin-page .m2-table tbody tr:hover { background: rgba(255, 255, 255, 0.03); }
.fl-body .m2-admin-page .m2-table tbody td:first-child { border-radius: 12px 0 0 12px; }
.fl-body .m2-admin-page .m2-table tbody td:last-child { border-radius: 0 12px 12px 0; }

/* Таблицы с инлайн-редактированием шире — им нужен горизонтальный скролл */
.fl-body .m2-admin-page .adm-table--edit { min-width: 940px; }

.fl-body .adm-table__id { width: 64px; }
.fl-body .adm-table__num { text-align: right; }
.fl-body .adm-table__mid { text-align: center; }
.fl-body .adm-table__nowrap { white-space: nowrap; }

.fl-body .adm-table__strong { font-size: 14px; color: var(--zp-ink); }

.fl-body .adm-table__sub {
  margin-top: 2px;
  font-size: 11.5px;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-table__money {
  font-family: var(--zp-font-mono);
  font-size: 13px;
  white-space: nowrap;
  color: var(--zp-gold);
}

.fl-body .adm-table__email {
  max-width: 220px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13px;
}

.fl-body .m2-admin-page .m2-break-all { word-break: break-all; }

/* Ячейка «пользователь»: аватар с инициалами + логин + источник */
.fl-body .adm-user-cell {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
}

.fl-body .adm-user-cell .avatar {
  width: 32px;
  height: 32px;
  border-radius: 10px;
  font-size: 11px;
  flex: 0 0 auto;
}

/* Длинный логин обрезается многоточием, иначе колонка распирает таблицу */
.fl-body .adm-user-cell__text { min-width: 0; max-width: 152px; }

.fl-body .adm-user-cell__name {
  display: block;
  font-size: 14px;
  font-weight: 500;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.fl-body .adm-user-cell__meta {
  display: block;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
}

/* Колонка действий прижимается к содержимому, чтобы кнопки стояли в один ряд,
   а не столбиком: ширина 1% в таблице = «по содержимому». */
.fl-body .m2-admin-page .adm-table th:last-child,
.fl-body .m2-admin-page .adm-table td:last-child { width: 1%; white-space: nowrap; }

/* Кнопки действий в строке */
.fl-body .adm-rowactions {
  display: flex;
  flex-wrap: nowrap;
  gap: 3px;
  justify-content: flex-end;
  align-items: center;
}

.fl-body .adm-rowactions__form { display: inline-flex; margin: 0; }

.fl-body .m2-admin-page .adm-iconbtn {
  display: inline-grid;
  place-items: center;
  width: 31px;
  min-width: 31px;
  height: 31px;
  min-height: 31px;
  padding: 0;
  font-size: 13.5px;
  line-height: 1;
  border-radius: var(--zp-r-btn-sm);
}

.fl-body .m2-admin-page .adm-cellinput {
  min-height: 32px;
  padding: 6px 9px;
  font-size: 13px;
  border-radius: 10px;
}

/* Ширины колоночных полей задаются с запасом специфичности: иначе их
   перебивает общее правило `.m2-table input[type=…] { width: 100% }` выше. */
.fl-body .m2-admin-page .m2-table .adm-cellinput--name { width: 150px; min-width: 130px; }
.fl-body .m2-admin-page .m2-table .adm-cellinput--group { width: 88px; }
.fl-body .m2-admin-page .m2-table .adm-cellinput--price { width: 84px; text-align: right; }
.fl-body .m2-admin-page .m2-table .adm-cellinput--n { width: 72px; text-align: center; }
.fl-body .m2-admin-page .m2-table .adm-cellinput--date { width: 178px; }
.fl-body .m2-admin-page .m2-table .adm-cellinput--alias { width: 104px; }

.fl-body .adm-statecell {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

/* Чекбоксы «★» и «заморозка» */
.fl-body .m2-admin-page input[type="checkbox"],
.fl-body .m2-admin-page input[type="radio"] {
  width: 17px;
  height: 17px;
  accent-color: var(--zp-gold);
  cursor: pointer;
}

.fl-body .adm-starbox { margin: 0; }


/* ============================================================================
   9. Карточки, формы и кнопки разделов (легаси-классы m2-*)
   ============================================================================ */

.fl-body .m2-admin-page .m2-card {
  padding: clamp(14px, 1.8vw, 20px);
  border-radius: var(--zp-r-card);
  background: var(--zp-grad-card);
  border: 1px solid var(--zp-hairline);
  box-shadow: var(--zp-shadow-card);
  color: var(--zp-ink);
  min-width: 0;
}

.fl-body .m2-admin-page .m2-stack-16 > * + * { margin-top: 14px; }

.fl-body .m2-admin-page h2,
.fl-body .m2-admin-page h3 {
  font-family: var(--zp-font-display);
  color: var(--zp-ink);
  letter-spacing: -0.02em;
  opacity: 1;
  text-transform: none;
}

.fl-body .m2-admin-page h2 { font-weight: 300; font-size: clamp(20px, 2.2vw, 28px); }
.fl-body .m2-admin-page h3 { font-weight: 400; font-size: 17px; }

.fl-body .m2-admin-page .m2-muted { color: var(--zp-ink-3); opacity: 1; }

.fl-body .m2-admin-page .m2-kicker {
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .m2-admin-page .m2-metric,
.fl-body .m2-admin-page .m2-metric-card {
  font-family: var(--zp-font-display);
  font-weight: 300;
  letter-spacing: -0.03em;
  color: var(--zp-ink);
}

/* --- Поля --- */

.fl-body .m2-admin-page .m2-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
  margin: 0;
}

.fl-body .m2-admin-page .m2-field > span {
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .m2-admin-page .m2-field input,
.fl-body .m2-admin-page .m2-field select,
.fl-body .m2-admin-page .m2-field textarea,
.fl-body .m2-admin-page .m2-input,
.fl-body .m2-admin-page .m2-table input[type="text"],
.fl-body .m2-admin-page .m2-table input[type="number"],
.fl-body .m2-admin-page .m2-table input[type="datetime-local"],
.fl-body .m2-admin-page .m2-table select {
  width: 100%;
  min-height: 42px;
  padding: 10px 13px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.45);
  border: 1px solid rgba(246, 240, 228, 0.14);
  color: var(--zp-ink);
  font-family: var(--zp-font-text);
  font-size: 14px;
  transition: border-color var(--zp-t-fast) var(--zp-ease),
    box-shadow var(--zp-t-fast) var(--zp-ease);
}

.fl-body .m2-admin-page .m2-field textarea,
.fl-body .m2-admin-page textarea.m2-input { resize: vertical; line-height: 1.5; }

.fl-body .m2-admin-page .m2-field input::placeholder,
.fl-body .m2-admin-page .m2-field textarea::placeholder,
.fl-body .m2-admin-page .m2-input::placeholder { color: var(--zp-ink-3); }

.fl-body .m2-admin-page .m2-field input:focus,
.fl-body .m2-admin-page .m2-field select:focus,
.fl-body .m2-admin-page .m2-field textarea:focus,
.fl-body .m2-admin-page .m2-input:focus,
.fl-body .m2-admin-page .m2-table input:focus,
.fl-body .m2-admin-page .m2-table select:focus {
  outline: none;
  border-color: var(--zp-gold);
  box-shadow: 0 0 0 4px rgba(255, 184, 0, 0.14);
}

.fl-body .m2-admin-page .m2-field select,
.fl-body .m2-admin-page select.m2-input {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 34px;
  background-image: linear-gradient(45deg, transparent 50%, var(--zp-ink-3) 50%),
    linear-gradient(135deg, var(--zp-ink-3) 50%, transparent 50%);
  background-position: calc(100% - 17px) calc(50% + 1px), calc(100% - 12px) calc(50% + 1px);
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}

.fl-body .m2-admin-page select option { background: var(--zp-bg); color: var(--zp-ink); }

.fl-body .m2-admin-page input[disabled],
.fl-body .m2-admin-page select[disabled],
.fl-body .m2-admin-page textarea[disabled],
.fl-body .m2-admin-page input[readonly] { opacity: 0.6; cursor: not-allowed; }

.fl-body .m2-admin-page input[readonly] { cursor: text; }

/* Чекбокс с подписью */
.fl-body .adm-check {
  display: flex;
  align-items: center;
  gap: 9px;
  font-size: 13.5px;
  color: var(--zp-ink-2);
  cursor: pointer;
  min-height: 34px;
}

.fl-body .adm-check input { flex: 0 0 auto; }

/* --- Кнопки --- */

.fl-body .m2-admin-page .m2-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 42px;
  padding: 11px 18px;
  border: 1px solid transparent;
  border-radius: var(--zp-r-btn-sm);
  background: var(--adm-grad-gold-btn);
  color: var(--zp-on-gold);
  font-family: var(--zp-font-text);
  font-size: 14px;
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  box-shadow: 0 10px 26px rgba(255, 140, 0, 0.3);
  transition: transform var(--zp-t-fast) var(--zp-ease),
    box-shadow var(--zp-t-fast) var(--zp-ease),
    border-color var(--zp-t-fast) var(--zp-ease),
    color var(--zp-t-fast) var(--zp-ease),
    background-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .m2-admin-page .m2-btn:hover {
  color: var(--zp-on-gold);
  transform: translateY(-2px);
  box-shadow: var(--zp-shadow-gold-hover);
}

.fl-body .m2-admin-page .m2-btn-ghost {
  background: rgba(255, 255, 255, 0.03);
  border-color: rgba(246, 240, 228, 0.16);
  color: var(--zp-ink-2);
  box-shadow: none;
}

.fl-body .m2-admin-page .m2-btn-ghost:hover {
  background: rgba(255, 255, 255, 0.03);
  border-color: var(--zp-gold);
  color: var(--zp-gold);
  box-shadow: none;
}

.fl-body .m2-admin-page .m2-btn-danger {
  background: transparent;
  border-color: rgba(255, 98, 93, 0.3);
  color: var(--zp-err-ink);
  box-shadow: none;
}

.fl-body .m2-admin-page .m2-btn-danger:hover {
  background: rgba(255, 98, 93, 0.2);
  color: var(--zp-err-ink);
  box-shadow: none;
}

.fl-body .m2-admin-page .m2-btn-ghost.adm-color-danger { color: var(--zp-err-ink); }

.fl-body .m2-admin-page .m2-btn-ghost.adm-color-danger:hover {
  background: var(--zp-err-bg);
  border-color: var(--zp-err-line);
  color: var(--zp-err-ink);
}

.fl-body .m2-admin-page .m2-btn-ghost.adm-color-success { color: var(--zp-ok-ink); }

.fl-body .m2-admin-page .m2-btn-ghost.adm-color-success:hover {
  background: var(--zp-ok-bg);
  border-color: var(--zp-ok-line);
  color: var(--zp-ok-ink);
}

/* --- Складные блоки (details/summary) --- */

.fl-body .m2-admin-page .adm-fold { padding: 0; overflow: hidden; }

.fl-body .adm-fold__summary {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 15px clamp(14px, 1.8vw, 20px);
  cursor: pointer;
  list-style: none;
  font-family: var(--zp-font-text);
  font-size: 14px;
  font-weight: 600;
  color: var(--zp-ink-2);
  transition: color var(--zp-t-fast) var(--zp-ease),
    background-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-fold__summary::-webkit-details-marker { display: none; }

.fl-body .adm-fold__summary::after {
  content: "";
  margin-left: auto;
  width: 8px;
  height: 8px;
  border-right: 1.6px solid currentColor;
  border-bottom: 1.6px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-fold[open] > .adm-fold__summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.fl-body .adm-fold__summary:hover { color: var(--zp-gold); background: rgba(255, 184, 0, 0.05); }
.fl-body .adm-fold[open] > .adm-fold__summary { color: var(--zp-ink); border-bottom: 1px solid var(--zp-hairline); }
.fl-body .adm-fold__icon { font-size: 15px; line-height: 1; }

.fl-body .adm-fold__body {
  padding: clamp(14px, 1.8vw, 20px);
  animation: zp-rise 400ms var(--zp-ease) both;
}

.fl-body .adm-fold__body > .adm-panel__note { margin-bottom: 14px; }

/* Общие раскладки форм внутри складных блоков */
.fl-body .adm-stackform { display: grid; gap: 10px; }

.fl-body .adm-inlineform {
  display: flex;
  align-items: flex-end;
  gap: 8px;
  flex-wrap: wrap;
}

.fl-body .adm-inlineform > .m2-field,
.fl-body .adm-inlineform > .m2-input,
.fl-body .adm-inlineform > input,
.fl-body .adm-inlineform > select { flex: 1 1 120px; min-width: 0; }

.fl-body .adm-inlineform__field { flex: 1 1 140px; }

.fl-body .adm-bulk-form {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
  align-items: end;
}

.fl-body .adm-bulk-form__ids { min-height: 42px; }
.fl-body .adm-bulk-form__submit { align-self: end; }

.fl-body .adm-createform {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 150px), 1fr));
  align-items: end;
}

.fl-body .adm-createform__flags {
  display: flex;
  gap: 14px;
  align-items: center;
  flex-wrap: wrap;
}

.fl-body .adm-createform__submit { align-self: end; }

/* Карточка платёжного провайдера */
.fl-body .m2-admin-page .adm-provider {
  display: grid;
  gap: 9px;
  align-content: start;
}

.fl-body .adm-provider__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
}

.fl-body .adm-provider__name {
  font-family: var(--zp-font-display);
  font-weight: 500;
  font-size: 16px;
  letter-spacing: -0.02em;
  color: var(--zp-ink);
}

/* Блок exact bridge */
.fl-body .adm-bypass { display: grid; gap: 12px; }
.fl-body .adm-bypass__flags { display: flex; flex-wrap: wrap; gap: 6px; }
.fl-body .adm-bypass__notice { margin: 0; }
.fl-body .adm-bypass__submit { justify-self: start; }

.fl-body .adm-bypass-settings-grid {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  gap: 10px;
}

.fl-body .m2-admin-page code {
  padding: 2px 6px;
  border-radius: 6px;
  background: rgba(255, 184, 0, 0.1);
  color: var(--zp-gold-light);
  font-size: 0.92em;
}

/* Уведомления разделов */
.fl-body .m2-admin-page .m2-notice {
  display: block;
  padding: 13px 16px;
  border-radius: var(--zp-r-input);
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--zp-hairline);
  color: var(--zp-ink-2);
  font-size: 13.5px;
  line-height: 1.5;
}

.fl-body .m2-admin-page .m2-notice.m2-success { background: var(--zp-ok-bg); border-color: var(--zp-ok-line); color: var(--zp-ok-ink); }
.fl-body .m2-admin-page .m2-notice.m2-warning { background: var(--zp-warn-bg); border-color: var(--zp-warn-line); color: var(--zp-warn); }
.fl-body .m2-admin-page .m2-notice.m2-error { background: var(--zp-err-bg); border-color: var(--zp-err-line); color: var(--zp-err-ink); }


/* ============================================================================
   10. Статусы, бейджи, чипы
   ============================================================================ */

.fl-body .adm-status,
.fl-body .m2-admin-page .m2-badge {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 10px;
  border-radius: var(--zp-r-pill);
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  font-weight: 400;
  letter-spacing: 0.08em;
  white-space: nowrap;
  background: rgba(246, 240, 228, 0.06);
  border: 1px solid rgba(246, 240, 228, 0.14);
  color: var(--zp-ink-2);
}

.fl-body .adm-status--ok { background: var(--zp-ok-bg); border-color: var(--zp-ok-line); color: var(--zp-ok-ink); }
.fl-body .adm-status--pending { background: var(--zp-warn-bg); border-color: var(--zp-warn-line); color: var(--zp-warn); }
.fl-body .adm-status--fail { background: var(--zp-err-bg); border-color: var(--zp-err-line); color: var(--zp-err-ink); }
.fl-body .adm-status--muted { background: rgba(246, 240, 228, 0.06); border-color: rgba(246, 240, 228, 0.14); color: var(--zp-ink-2); }
.fl-body .adm-status--gold { background: rgba(255, 184, 0, 0.12); border-color: rgba(255, 184, 0, 0.4); color: var(--zp-gold-light); }

.fl-body .adm-paystats { gap: 6px; }

.fl-body .adm-color-success { color: var(--zp-ok-ink); }
.fl-body .adm-color-warn { color: var(--zp-warn); }
.fl-body .adm-color-danger { color: var(--zp-err-ink); }
.fl-body .adm-color-muted { color: var(--zp-ink-3); opacity: 1; }

.fl-body .adm-sync-status {
  display: inline-grid;
  place-items: center;
  width: 22px;
  height: 22px;
  border-radius: 7px;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  background: rgba(255, 255, 255, 0.04);
  color: var(--zp-ink-2);
}

.fl-body .adm-sync-status--synced { color: var(--zp-ok-ink); background: var(--zp-ok-bg); }
.fl-body .adm-sync-status--modified { color: var(--zp-warn); background: var(--zp-warn-bg); }
.fl-body .adm-sync-status--local { color: var(--zp-gold-light); background: rgba(255, 184, 0, 0.12); }
.fl-body .adm-sync-status--archived,
.fl-body .adm-sync-status--unknown { color: var(--zp-ink-3); }

.fl-body .adm-source-badge,
.fl-body .adm-role-badge {
  background: rgba(255, 184, 0, 0.12);
  border-color: rgba(255, 184, 0, 0.4);
  color: var(--zp-gold-light);
}

.fl-body .adm-source-badge--bot { background: rgba(30, 143, 214, 0.16); border-color: rgba(63, 182, 242, 0.42); color: var(--zp-tg-ink); }
.fl-body .adm-source-badge--site { background: rgba(255, 184, 0, 0.12); border-color: rgba(255, 184, 0, 0.4); color: var(--zp-gold-light); }

.fl-body .adm-program-status,
.fl-body .adm-partner-status {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 11px;
  border-radius: var(--zp-r-pill);
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  background: rgba(246, 240, 228, 0.06);
  border: 1px solid rgba(246, 240, 228, 0.14);
  color: var(--zp-ink-2);
}

.fl-body .adm-program-status.is-enabled,
.fl-body .adm-partner-status.is-enabled,
.fl-body .adm-partner-status--active { background: var(--zp-ok-bg); border-color: var(--zp-ok-line); color: var(--zp-ok-ink); }
.fl-body .adm-partner-status--suspended { background: var(--zp-err-bg); border-color: var(--zp-err-line); color: var(--zp-err-ink); }
.fl-body .adm-pending-value { color: var(--zp-warn); font-family: var(--zp-font-mono); }

/* Чипы фильтров и разделов */
.fl-body .adm-chip-row,
.fl-body .m2-admin-page .m2-chip-row {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  min-width: 0;
}

.fl-body .adm-filter-chip,
.fl-body .m2-admin-page .m2-chip-link,
.fl-body .m2-admin-page .m2-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 38px;
  padding: 9px 16px;
  border-radius: var(--zp-r-pill);
  border: 1px solid rgba(246, 240, 228, 0.14);
  background: rgba(255, 255, 255, 0.03);
  font-family: var(--zp-font-mono);
  font-size: 12px;
  font-weight: 400;
  white-space: nowrap;
  text-decoration: none;
  color: var(--zp-ink-2);
  opacity: 1;
  transition: color var(--zp-t-fast) var(--zp-ease),
    border-color var(--zp-t-fast) var(--zp-ease),
    background-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-filter-chip:hover,
.fl-body .m2-admin-page .m2-chip-link:hover {
  color: var(--zp-ink);
  border-color: rgba(255, 184, 0, 0.45);
}

.fl-body .adm-filter-chip.is-active,
.fl-body .m2-admin-page .m2-chip-link.is-active {
  background: var(--adm-grad-chip);
  border-color: transparent;
  color: var(--zp-on-gold);
  box-shadow: 0 10px 24px rgba(255, 140, 0, 0.3);
}

.fl-body .adm-filter-chip.is-muted { color: var(--zp-ink-2); opacity: 1; }


/* ============================================================================
   11. Карточка пользователя (admin_user_edit.html)
   ============================================================================ */

/* Страница пользуется переменными старой темы (--color-success/--color-danger
   из custom.css). Переопределяем их только внутри этого поддерева — глобальные
   значения принадлежат другим поверхностям и не трогаются. */
.fl-body .adm-user-edit {
  --color-success: var(--zp-ok-ink);
  --color-danger: var(--zp-err-ink);
  --color-warning: var(--zp-warn);
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 0;
}

.fl-body .adm-user-edit .page-header {
  padding: clamp(16px, 2.2vw, 26px);
  border-radius: var(--zp-r-card);
  background: var(--zp-grad-glass) padding-box,
    var(--zp-grad-glass-line) border-box;
  border: 1px solid transparent;
  box-shadow: var(--zp-shadow-card);
}

.fl-body .adm-user-edit .page-header-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 14px 20px;
}

.fl-body .adm-user-edit .user-avatar-section {
  display: flex;
  align-items: center;
  gap: 14px;
  min-width: 0;
}

.fl-body .adm-user-edit .btn-group {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.fl-body .adm-user-edit .flex-col { flex-direction: column; }
.fl-body .adm-user-edit .gap-4 { gap: 16px; }
.fl-body .badge-muted { background: rgba(246, 240, 228, 0.06); border-color: rgba(246, 240, 228, 0.14); color: var(--zp-ink-2); }

.fl-body .adm-user-header,
.fl-body .adm-user-card {
  border-radius: var(--zp-r-card);
  background: var(--zp-grad-card);
  border: 1px solid var(--zp-hairline);
  color: var(--zp-ink);
}

.fl-body .adm-user-header {
  padding: clamp(16px, 2.2vw, 26px);
  background: var(--zp-grad-glass) padding-box,
    var(--zp-grad-glass-line) border-box;
  border: 1px solid transparent;
  box-shadow: var(--zp-shadow-card);
}

.fl-body .adm-user-header__info { display: flex; align-items: center; gap: 14px; min-width: 0; flex-wrap: wrap; }

.fl-body .adm-user-avatar {
  display: grid;
  place-items: center;
  width: 52px;
  height: 52px;
  border-radius: 16px;
  background: var(--zp-grad-gold);
  color: var(--zp-on-gold);
  font-family: var(--zp-font-display);
  font-weight: 700;
  font-size: 17px;
}

.fl-body .adm-user-name {
  font-family: var(--zp-font-display);
  font-weight: 500;
  font-size: 20px;
  letter-spacing: -0.02em;
  color: var(--zp-ink);
}

.fl-body .adm-user-sub {
  font-family: var(--zp-font-mono);
  font-size: 11.5px;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-user-badge {
  display: inline-flex;
  align-items: center;
  padding: 4px 11px;
  border-radius: var(--zp-r-pill);
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  background: rgba(246, 240, 228, 0.06);
  border: 1px solid rgba(246, 240, 228, 0.14);
  color: var(--zp-ink-2);
}

.fl-body .adm-user-badge--active { background: var(--zp-ok-bg); border-color: var(--zp-ok-line); color: var(--zp-ok-ink); }
.fl-body .adm-user-badge--blocked { background: var(--zp-err-bg); border-color: var(--zp-err-line); color: var(--zp-err-ink); }
.fl-body .adm-user-badge--site { background: rgba(255, 184, 0, 0.12); border-color: rgba(255, 184, 0, 0.4); color: var(--zp-gold-light); }
.fl-body .adm-user-badge--bot { background: rgba(30, 143, 214, 0.16); border-color: rgba(63, 182, 242, 0.42); color: var(--zp-tg-ink); }

.fl-body .adm-user-kpis {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 170px), 1fr));
}

.fl-body .adm-user-kpi {
  padding: 14px 16px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid rgba(246, 240, 228, 0.08);
}

.fl-body .adm-user-kpi__val {
  font-family: var(--zp-font-display);
  font-weight: 300;
  font-size: 26px;
  letter-spacing: -0.03em;
  line-height: 1.05;
  color: var(--zp-ink);
}

.fl-body .adm-user-kpi__lbl {
  margin-bottom: 8px;
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-user-grid2 {
  display: grid;
  gap: 12px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
}

.fl-body .adm-user-card__head {
  padding: 14px 18px;
  border-bottom: 1px solid var(--zp-hairline);
  font-family: var(--zp-font-display);
  font-weight: 500;
  font-size: 16px;
  letter-spacing: -0.02em;
  color: var(--zp-ink);
  background: transparent;
}

.fl-body .adm-user-card__body { padding: 18px; }

.fl-body .adm-user-field-row {
  display: grid;
  gap: 12px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));
  padding-bottom: 14px;
  margin-bottom: 14px;
  border-bottom: 1px solid rgba(246, 240, 228, 0.06);
}

.fl-body .adm-user-field-row:last-child { padding-bottom: 0; margin-bottom: 0; border-bottom: 0; }

.fl-body .adm-user-field__label {
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-user-field__input {
  width: 100%;
  min-height: 42px;
  margin-top: 6px;
  padding: 10px 13px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.45);
  border: 1px solid rgba(246, 240, 228, 0.14);
  color: var(--zp-ink);
  font-size: 14px;
}

.fl-body .adm-user-field__input:focus {
  outline: none;
  border-color: var(--zp-gold);
  box-shadow: 0 0 0 4px rgba(255, 184, 0, 0.14);
}

.fl-body .adm-user-field__hint { margin-top: 6px; font-size: 12px; color: var(--zp-ink-3); opacity: 1; }

.fl-body .adm-user-actions-grid {
  display: grid;
  gap: 8px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr));
}

.fl-body .adm-user-status-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: rgba(246, 240, 228, 0.25);
}

.fl-body .adm-user-status-dot--active { background: var(--zp-ok); }
.fl-body .adm-user-status-dot--frozen { background: var(--zp-warn); }
.fl-body .adm-user-status-dot--expired { background: rgba(246, 240, 228, 0.25); }

.fl-body .adm-user-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  padding: 5px;
  border-radius: var(--zp-r-pill);
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid var(--zp-hairline);
}

.fl-body .adm-user-tab {
  flex: 0 1 auto;
  min-height: 38px;
  padding: 9px 16px;
  border: 0;
  border-radius: var(--zp-r-pill);
  background: transparent;
  color: var(--zp-ink-2);
  font-size: 13.5px;
  font-weight: 500;
  opacity: 1;
  cursor: pointer;
  transition: color var(--zp-t-fast) var(--zp-ease),
    background-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-user-tab:hover { color: var(--zp-ink); background: rgba(255, 255, 255, 0.05); opacity: 1; }

.fl-body .adm-user-tab.is-active {
  background: var(--zp-grad-gold);
  color: var(--zp-on-gold);
  font-weight: 600;
  opacity: 1;
}

.fl-body .adm-user-device-card {
  padding: 13px 15px;
  margin-bottom: 8px;
  border-radius: var(--zp-r-tile-sm);
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid rgba(246, 240, 228, 0.08);
}

.fl-body .adm-user-device-name { font-size: 14px; font-weight: 500; color: var(--zp-ink); }
.fl-body .adm-user-device-hwid { font-family: var(--zp-font-mono); font-size: 11px; color: var(--zp-ink-3); opacity: 1; word-break: break-all; }
.fl-body .adm-user-device-seen { font-size: 12px; color: var(--zp-ink-3); opacity: 1; }


/* ============================================================================
   12. Тикеты поддержки (admin_support.html)
   Список слева, переписка справа: сообщения пользователя серые, ответы
   поддержки — золотые, как в макете.
   ============================================================================ */

.fl-body .admin-ticket-item {
  display: block;
  width: 100%;
  margin-bottom: 4px;
  padding: 12px 14px;
  min-height: 44px;
  border-radius: var(--zp-r-input);
  border: 1px solid transparent;
  background: transparent;
  text-align: left;
  white-space: normal;
  color: var(--zp-ink);
  transition: background-color 180ms var(--zp-ease),
    border-color 180ms var(--zp-ease);
}

.fl-body .admin-ticket-item:hover {
  background: rgba(255, 255, 255, 0.04);
  border-color: var(--zp-hairline);
  transform: none;
}

.fl-body .admin-ticket-item.is-active {
  background: rgba(255, 184, 0, 0.08);
  border-color: rgba(255, 184, 0, 0.4);
}

.fl-body .admin-ticket-item.is-new { border-color: var(--zp-err-line); }
.fl-body .admin-ticket-item .text-secondary { display: block; margin-top: 4px; font-size: 12.5px; }

.fl-body #adminTicketMessages { display: flex; flex: 1 1 auto; flex-direction: column; gap: 12px; padding: 18px 0; }

/* Класс ставит renderMessage() по флагу is_from_admin, а не по чётности:
   подряд идущие сообщения одной стороны остаются на своей стороне. */
.fl-body .admin-ticket-msg {
  margin: 0;
  max-width: 82%;
  padding: 12px 16px;
  border-radius: 16px;
  font-size: 14.5px;
  line-height: 1.5;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid rgba(246, 240, 228, 0.1);
  box-shadow: none;
}

.fl-body .admin-ticket-msg--user { align-self: flex-start; }

.fl-body .admin-ticket-msg--admin {
  align-self: flex-end;
  background: linear-gradient(140deg, rgba(255, 184, 0, 0.18), rgba(255, 184, 0, 0.08));
  border-color: rgba(255, 184, 0, 0.35);
}

.fl-body .admin-ticket-msg b { font-family: var(--zp-font-display); font-weight: 500; font-size: 14px; }
.fl-body .admin-ticket-msg .text-secondary { font-family: var(--zp-font-mono); }

.fl-body #adminTicketUserHistory { display: flex; flex-direction: column; gap: 4px; }

/* Раскладка страницы тикетов */
.fl-body .adm-support__body { align-items: start; }
.fl-body .adm-support__list { align-self: start; }

.fl-body .m2-admin-page .adm-support__chat {
  background: var(--zp-grad-glass) padding-box,
    var(--zp-grad-glass-line) border-box;
  border: 1px solid transparent;
  box-shadow: var(--zp-shadow-card);
}

/* Плитки счётчиков тикетов рисует renderStats() классом .adm-metric —
   размеры берутся из блока 7, отдельного правила им больше не нужно. */


/* ============================================================================
   13. Легаси-классы разделов
   Рассылки, промокоды, рефералы, дизайн, админы и группы тарифов теперь
   скопированы в custom/templates/themes/gold/_admin/ и свёрстаны по макету
   (их классы — в блоке 17). Правила ниже остаются страховкой для разметки,
   которая ещё приходит из app/templates/_admin/** без копии в теме, и для
   тех мест скопированных шаблонов, где легаси-класс сохранён намеренно.
   ============================================================================ */

.fl-body .adm-zone-title {
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-stats-row,
.fl-body .adm-compact-grid,
.fl-body .adm-analytics-grid {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr));
}

.fl-body .adm-stat,
.fl-body .adm-compact-card,
.fl-body .adm-analytics-card {
  padding: 14px 16px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid rgba(246, 240, 228, 0.08);
  color: var(--zp-ink);
  min-width: 0;
}

.fl-body .adm-stat-value,
.fl-body .adm-compact-value,
.fl-body .adm-analytics-value {
  font-family: var(--zp-font-display);
  font-weight: 300;
  font-size: clamp(20px, 2vw, 26px);
  line-height: 1.05;
  letter-spacing: -0.03em;
  color: var(--zp-ink);
}

.fl-body .adm-stat-label,
.fl-body .adm-compact-label,
.fl-body .adm-analytics-label {
  margin-top: 6px;
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-charts-row,
.fl-body .adm-charts-2,
.fl-body .adm-charts-3 {
  display: grid;
  gap: 12px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
}

.fl-body .m2-admin-page .m2-grid { display: grid; gap: 12px; min-width: 0; }
.fl-body .m2-admin-page .m2-grid-2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); }
.fl-body .m2-admin-page .m2-grid-3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); }

.fl-body .m2-admin-page .m2-form-grid {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 10px;
}

.fl-body .m2-admin-page .m2-form-grid > .m2-field { flex: 1 1 190px; }
.fl-body .m2-admin-page .m2-row-wrap { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }

.fl-body .m2-admin-page .m2-inline-form {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}

.fl-body .m2-admin-page .m2-actions-wrap { display: flex; flex-wrap: wrap; gap: 6px; }

.fl-body .m2-admin-page .m2-coupon-modal__backdrop {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: rgba(5, 5, 5, 0.78);
  backdrop-filter: blur(6px);
}

.fl-body .m2-admin-page .m2-coupon-modal__dialog {
  border-radius: var(--zp-r-card);
  background: rgba(10, 9, 7, 0.98);
  border: 1px solid rgba(255, 184, 0, 0.22);
  box-shadow: var(--zp-shadow-card);
  color: var(--zp-ink);
}


/* ----------------------------------------------------------------------------
   Фокус. Золотая рамка задана глобально в shell.css (`:focus-visible`), но
   вместе с ней там ставится border-radius: 6px — из-за этого пилюли и круглые
   кнопки на фокусе «квадратятся». Возвращаем им их радиус.
   ---------------------------------------------------------------------------- */

.fl-body .adm-hub-nav__link:focus-visible,
.fl-body .adm-filter-chip:focus-visible,
.fl-body .m2-admin-page .m2-chip-link:focus-visible,
.fl-body .adm-user-tab:focus-visible,
.fl-body .adm-status:focus-visible { border-radius: var(--zp-r-pill); }

.fl-body .m2-admin-page .m2-btn:focus-visible,
.fl-body .m2-admin-page .adm-iconbtn:focus-visible,
.fl-body .m2-admin-page .adm-cellinput:focus-visible,
.fl-body .admin-ticket-item:focus-visible { border-radius: var(--zp-r-btn-sm); }

.fl-body .adm-fold__summary:focus-visible { border-radius: var(--zp-r-card); }

.fl-body .m2-admin-page .m2-field input:focus-visible,
.fl-body .m2-admin-page .m2-field select:focus-visible,
.fl-body .m2-admin-page .m2-field textarea:focus-visible,
.fl-body .m2-admin-page .m2-input:focus-visible,
.fl-body .adm-user-field__input:focus-visible { border-radius: var(--zp-r-input); }


/* ============================================================================
   14. Адаптив
   ============================================================================ */

@media (max-width: 1280px) {
  .fl-body .adm-bypass-settings-grid { grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); }
}

@media (max-width: 1024px) {
  .fl-body .adm-head { align-items: flex-start; }
  .fl-body .adm-hub-nav { border-radius: var(--zp-r-card); }
}

@media (max-width: 900px) {
  .fl-body .adm-bypass-settings-grid { grid-template-columns: 1fr; }
}

@media (max-width: 760px) {
  .fl-body .m2-admin-page { gap: 10px; }

  .fl-body .adm-hub-nav {
    padding: 5px;
    border-radius: var(--zp-r-tile);
  }

  .fl-body .adm-hub-nav__scroll {
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }

  .fl-body .adm-hub-nav__scroll::-webkit-scrollbar { display: none; }
  .fl-body .adm-hub-nav__link { padding: 8px 13px; font-size: 12.5px; min-height: 38px; }
  .fl-body .adm-hub-nav__more { flex-shrink: 0; }

  .fl-body .m2-admin-page .m2-card { padding: 14px; border-radius: var(--zp-r-tile); }
  .fl-body .m2-admin-page .adm-panel { padding: 16px; }
  .fl-body .adm-fold__summary,
  .fl-body .adm-fold__body { padding: 14px; }

  .fl-body .adm-head__actions { width: 100%; }
  .fl-body .adm-head__actions form,
  .fl-body .adm-head__actions .m2-btn { flex: 1 1 auto; }

  .fl-body .adm-filterbar__field,
  .fl-body .adm-filterbar__field--sm,
  .fl-body .adm-filterbar__field--grow { flex: 1 1 100%; min-width: 0; }

  .fl-body .adm-filterbar__submit { width: 100%; }
  .fl-body .adm-filterbar__submit .btn { width: 100%; }

  .fl-body .adm-metrics,
  .fl-body .adm-metrics--3,
  .fl-body .adm-metrics--5,
  .fl-body .adm-metrics--6 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 104px), 1fr)); }

  /* Узкие таблицы разворачиваются в карточки (логика из admin_page.css,
     здесь — только золотое оформление). .keys-table остаётся таблицей
     с горизонтальным скроллом внутри .m2-table-wrap. */
  .fl-body .m2-admin-page .m2-table-wrap { overflow-x: auto; }

  .fl-body .m2-admin-page .m2-table:not(.keys-table) tr {
    margin-bottom: 8px;
    padding: 12px 14px;
    border-radius: var(--zp-r-tile-sm);
    border: 1px solid var(--zp-hairline);
    background: rgba(255, 255, 255, 0.03);
  }

  .fl-body .m2-admin-page .m2-table:not(.keys-table) tr:hover { background: rgba(255, 255, 255, 0.05); }
  .fl-body .m2-admin-page .m2-table:not(.keys-table) td { padding: 4px 0; font-size: 13.5px; }

  .fl-body .m2-admin-page .m2-table:not(.keys-table) td::before {
    font-family: var(--zp-font-mono);
    font-size: 9.5px;
    font-weight: 500;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--zp-ink-3);
    opacity: 1;
  }

  .fl-body .m2-admin-page .m2-table:not(.keys-table) .adm-table__num,
  .fl-body .m2-admin-page .m2-table:not(.keys-table) .adm-table__mid { text-align: left; }
  /* Вне карточного режима колонка действий сжата до содержимого (width:1%).
     В карточке от неё оставалось ~3px, и ряд кнопок вываливался за её границы —
     возвращаем строке полную ширину и обычный перенос. */
  .fl-body .m2-admin-page .adm-table:not(.keys-table) th:last-child,
  .fl-body .m2-admin-page .adm-table:not(.keys-table) td:last-child { width: 100%; white-space: normal; }

  /* Кнопок в строке может быть до пяти — если они не влезают, ряд переносится,
     а не уезжает за край карточки. */
  .fl-body .m2-admin-page .m2-table:not(.keys-table) .adm-rowactions { justify-content: flex-start; margin-top: 6px; flex-wrap: wrap; row-gap: 6px; }

  .fl-body .m2-admin-page .m2-table:not(.keys-table) .adm-table__email,
  .fl-body .m2-admin-page .m2-table:not(.keys-table) .adm-table__purpose { max-width: 100%; white-space: normal; overflow-wrap: anywhere; }

  /* Строка развёрнута в карточку — поля занимают всю ширину */
  .fl-body .m2-admin-page .m2-table .adm-cellinput { width: 100%; min-width: 0; text-align: left; }
  /* …кроме поля, стоящего прямо в ряду действий (статус платежа): оно делит
     строку с кнопкой «применить», иначе кнопка падает под него отдельной строкой. */
  .fl-body .m2-admin-page .m2-table .adm-rowactions .adm-cellinput { flex: 1 1 120px; width: auto; }
  .fl-body .m2-admin-page .m2-table .adm-user-cell__text { max-width: none; }

  .fl-body #adminTicketMessages .card { max-width: 100%; }
}

@media (max-width: 560px) {
  .fl-body .adm-createform { grid-template-columns: 1fr 1fr; }
  .fl-body .adm-createform__flags,
  .fl-body .adm-createform__submit { grid-column: 1 / -1; }
  .fl-body .adm-bulk-form { grid-template-columns: 1fr; }
  .fl-body .adm-user-kpis { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 380px) {
  .fl-body .adm-metrics,
  .fl-body .adm-metrics--3,
  .fl-body .adm-metrics--6 { grid-template-columns: 1fr 1fr; }
  .fl-body .adm-createform { grid-template-columns: 1fr; }
  .fl-body .m2-admin-page .m2-btn { width: 100%; }
  .fl-body .m2-admin-page .adm-iconbtn { width: 34px; min-width: 34px; }
  .fl-body .adm-kpi { padding: 16px; }
}


/* ============================================================================
   15. Поверхность «админка» — точная сборка по макету
   «Zapret VPN Админка.dc.html». Значения перенесены буквально; то, чего нет в
   tokens.css, объявлено здесь переменными --adm-* и в разметку hex не сыплется.

   Область действия — документ, помеченный data-surface="admin" (атрибут ставит
   однострочный скрипт внутри рельса, он выполняется до разбора <main>).
   Для браузеров без JS те же правила продублированы через :has(.adm-rail)
   в блоке @supports ниже.
   ============================================================================ */

:root {
  --adm-r-panel: 22px;                       /* у макета панели 22px, не 24px */
  --adm-grad-chip: linear-gradient(140deg, #ffd75a, #ff8300);
  --adm-grad-gold-btn: linear-gradient(140deg, #ffe38a, #ffb800 50%, #ff8300);
  --adm-grad-gold-card: radial-gradient(130% 150% at 0% 0%, #ffe38a 0%, #ffb800 38%, #ff8300 74%, #c25b00 100%);
  --adm-grad-glass-line: linear-gradient(160deg, rgba(255, 184, 0, 0.4), rgba(255, 184, 0, 0.05) 45%, rgba(246, 240, 228, 0.08));
  --adm-grad-tg: linear-gradient(140deg, #3fb6f2, #1477b8);
  --adm-tg-ink: #3fb6f2;
  --adm-gold-hover: #ffd15c;                 /* hover текстовых ссылок в макете */
  --adm-halo: radial-gradient(circle, rgba(255, 150, 0, 0.18), rgba(255, 120, 0, 0.05) 45%, transparent 70%);
}

/* Ядро анимации у макета мягче кабинетного: 20px и blur(6px). */
@keyframes adm-rise {
  from { opacity: 0; transform: translateY(20px); filter: blur(6px); }
  to   { opacity: 1; transform: none; filter: none; }
}

@keyframes adm-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.35; }
}

@keyframes adm-glow {
  0%, 100% { box-shadow: 0 0 0 0 rgba(88, 184, 120, 0.6); }
  70%      { box-shadow: 0 0 0 9px rgba(88, 184, 120, 0); }
}


/* --- 15.1 Каркас админ-страницы -------------------------------------------- */

/* Заголовок один: кабинетная шапка уступает место .adm-topbar внутри контента. */
html[data-surface="admin"] .topbar { display: none; }

/* Рельс занимает весь сайдбар: карточка пользователя, выход и переключатель
   локали на админ-страницах не нужны — выход остаётся в кабинете, куда ведёт
   знак в шапке рельса (так же, как в макете). */
html[data-surface="admin"] .fl-sidebar > .sidebar-header,
html[data-surface="admin"] .fl-sidebar > .sidebar-admin-link,
html[data-surface="admin"] .fl-sidebar > .sidebar-footer { display: none; }

html[data-surface="admin"] .fl-sidebar {
  flex: 1 1 232px;
  width: auto;
  max-width: 270px;
  gap: 24px;
  padding: 22px 14px;
}

/* Ореол один, справа сверху, 56vw / 11s — как в макете. */
html[data-surface="admin"] .zp-decor__halo--a {
  width: 56vw;
  height: 56vw;
  background: var(--adm-halo);
  filter: blur(34px);
  animation-duration: 11s;
}

html[data-surface="admin"] .zp-decor__halo--b,
html[data-surface="admin"] .zp-decor__grid { display: none; }

html[data-surface="admin"] .main-content > .page-content {
  padding: clamp(18px, 2.4vw, 36px) clamp(16px, 2.8vw, 44px) clamp(40px, 5vw, 72px);
}

/* Горизонтальная лента разделов заменена рельсом. Разметку оставляем ради
   ссылок и подключения admin_page.css, но в макете её нет. */
.fl-body .adm-hub-nav { display: none; }

html[data-surface="admin"] .zp-screen { animation: adm-rise 500ms var(--zp-ease) both; }

.fl-body .adm-kpi { animation: adm-rise 700ms var(--zp-ease) 100ms both; }
.fl-body .zp-rise-delay-2 { animation: adm-rise 700ms var(--zp-ease) 200ms both; }
.fl-body .zp-rise-delay-3 { animation: adm-rise 700ms var(--zp-ease) 300ms both; }
.fl-body .zp-rise-delay-4 { animation: adm-rise 700ms var(--zp-ease) 400ms both; }

@supports selector(:has(*)) {
  .fl-body:has(.adm-rail) .topbar { display: none; }
  .fl-body:has(.adm-rail) .fl-sidebar > .sidebar-header,
  .fl-body:has(.adm-rail) .fl-sidebar > .sidebar-admin-link,
  .fl-body:has(.adm-rail) .fl-sidebar > .sidebar-footer { display: none; }
  .fl-body:has(.adm-rail) .fl-sidebar { flex: 1 1 232px; width: auto; max-width: 270px; gap: 24px; padding: 22px 14px; }
  .fl-body:has(.adm-rail) .zp-decor__halo--a {
    width: 56vw;
    height: 56vw;
    background: var(--adm-halo);
    filter: blur(34px);
    animation-duration: 11s;
  }
  .fl-body:has(.adm-rail) .zp-decor__halo--b,
  .fl-body:has(.adm-rail) .zp-decor__grid { display: none; }
  .fl-body:has(.adm-rail) .main-content > .page-content {
    padding: clamp(18px, 2.4vw, 36px) clamp(16px, 2.8vw, 44px) clamp(40px, 5vw, 72px);
  }
  .fl-body:has(.adm-rail) .zp-screen { animation: adm-rise 500ms var(--zp-ease) both; }
}


/* --- 15.2 Рельс админки (макет, блок S1) ----------------------------------- */

.fl-body .adm-rail {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 24px;
}

.fl-body .adm-rail__brand {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 6px 8px;
  min-width: 0;
  text-decoration: none;
  color: var(--zp-ink);
}

.fl-body .adm-rail__mark {
  width: 38px;
  height: 38px;
  flex: 0 0 auto;
  filter: drop-shadow(0 8px 20px rgba(255, 140, 0, 0.35));
}

.fl-body .adm-rail__mark img { display: block; width: 100%; height: 100%; }

.fl-body .adm-rail__brandtext { min-width: 0; }

.fl-body .adm-rail__wordmark {
  display: block;
  font-family: var(--zp-font-display);
  font-weight: 700;
  font-size: 13.5px;
  letter-spacing: 0.14em;
  line-height: 1.1;
  color: var(--zp-ink);
  white-space: nowrap;
}

.fl-body .adm-rail__kicker {
  display: block;
  margin-top: 2px;
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
}

.fl-body .adm-rail__nav {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.fl-body .adm-rail__grouptitle {
  padding: 0 12px 8px;
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
}

.fl-body .adm-rail__items {
  display: flex;
  flex-wrap: wrap;
  gap: 3px;
}

.fl-body .adm-rail__link {
  display: flex;
  align-items: center;
  gap: 11px;
  width: 100%;
  flex: 1 1 160px;
  min-width: 0;
  min-height: 44px;                          /* тач-зона, README «Адаптив» */
  padding: 10px 12px;
  border-radius: 11px;
  font-size: 14px;
  line-height: 1.25;
  text-decoration: none;
  color: var(--zp-ink-3);
  background: transparent;
  box-shadow: none;
  transition: color 200ms var(--zp-ease),
    background-color 200ms var(--zp-ease),
    transform 200ms var(--zp-ease),
    box-shadow 200ms var(--zp-ease);
}

.fl-body .adm-rail__link:hover {
  color: var(--zp-ink);
  background: rgba(255, 255, 255, 0.05);
  transform: translateX(3px);
}

.fl-body .adm-rail__link.is-active {
  color: var(--zp-ink);
  background: linear-gradient(90deg, rgba(255, 184, 0, 0.14), rgba(255, 184, 0, 0.03));
  box-shadow: inset 0 0 0 1px rgba(255, 184, 0, 0.25);
}

.fl-body .adm-rail__dot {
  width: 6px;
  height: 6px;
  flex: 0 0 auto;
  transform: rotate(45deg);
  background: rgba(246, 240, 228, 0.2);
  transition: background 200ms var(--zp-ease), box-shadow 200ms var(--zp-ease);
}

.fl-body .adm-rail__link.is-active .adm-rail__dot {
  background: var(--adm-grad-chip);
  box-shadow: 0 0 12px rgba(255, 184, 0, 0.8);
}

.fl-body .adm-rail__label {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.fl-body .adm-rail__badge {
  flex: 0 0 auto;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  white-space: nowrap;
  color: var(--zp-ink-3);
}

.fl-body .adm-rail__link.is-active .adm-rail__badge { color: var(--zp-gold); }
.fl-body .adm-rail__badge--ok { color: var(--zp-ok-ink); }

.fl-body .adm-rail__status {
  margin-top: auto;
  padding: 12px 14px;
  border-radius: 14px;
  background: rgba(255, 255, 255, 0.025);
  border: 1px solid rgba(246, 240, 228, 0.08);
  display: flex;
  align-items: center;
  gap: 12px;
}

.fl-body .adm-rail__statusdot {
  width: 8px;
  height: 8px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: var(--zp-ok);
  animation: adm-glow 2.2s ease-out infinite;
}

.fl-body .adm-rail__statusdot--idle { background: var(--zp-ink-3); animation: none; }

.fl-body .adm-rail__statustext {
  min-width: 0;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  color: var(--zp-ink-2);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}


/* --- 15.3 Шапка экрана (макет, блок S3) ------------------------------------ */

.fl-body .adm-topbar {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 14px 24px;
  margin: 0 0 clamp(22px, 2.8vw, 36px);
}

.fl-body .adm-topbar__menu { order: -1; }

.fl-body .adm-topbar__text { flex: 1 1 260px; min-width: 0; }

.fl-body .adm-topbar__eyebrow {
  margin: 0;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
}

.fl-body .adm-topbar__title {
  margin: 8px 0 0;
  font-family: var(--zp-font-display);
  font-weight: 300;
  font-size: clamp(28px, 3.2vw, 42px);
  line-height: 1;
  letter-spacing: -0.035em;
  color: var(--zp-ink);
}

/* nowrap из макета — только там, где колонка заведомо шире заголовка. */
@media (min-width: 900px) {
  .fl-body .adm-topbar__title { white-space: nowrap; }
}

.fl-body .adm-topbar__side {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
}

.fl-body .adm-search { margin: 0; }

.fl-body .adm-search__label {
  position: relative;
  display: flex;
  align-items: center;
  margin: 0;
}

.fl-body .adm-search__icon {
  position: absolute;
  left: 14px;
  width: 15px;
  height: 15px;
  color: var(--zp-ink-3);
  pointer-events: none;
}

.fl-body .adm-search__input {
  width: min(320px, 70vw);
  padding: 11px 14px 11px 38px;
  border-radius: var(--zp-r-pill);
  background: rgba(0, 0, 0, 0.45);
  border: 1px solid rgba(246, 240, 228, 0.12);
  color: var(--zp-ink);
  font-family: var(--zp-font-text);
  font-size: 13.5px;
  transition: border-color 200ms var(--zp-ease), box-shadow 200ms var(--zp-ease);
}

.fl-body .adm-search__input::placeholder { color: var(--zp-ink-3); }

.fl-body .adm-search__input:focus {
  outline: none;
  border-color: var(--zp-gold);
  box-shadow: 0 0 0 4px rgba(255, 184, 0, 0.12);
}

.fl-body .adm-rolepill {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 14px;
  border-radius: var(--zp-r-pill);
  background: rgba(255, 184, 0, 0.08);
  border: 1px solid rgba(255, 184, 0, 0.3);
}

.fl-body .adm-rolepill__mark {
  width: 26px;
  height: 26px;
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  border-radius: 8px;
  background: var(--adm-grad-chip);
  color: var(--zp-on-gold);
  font-family: var(--zp-font-display);
  font-weight: 700;
  font-size: 11px;
}

.fl-body .adm-rolepill__role {
  font-family: var(--zp-font-mono);
  font-size: 11.5px;
  color: var(--zp-gold);
  white-space: nowrap;
}


/* --- 15.4 Чипы-фильтры (GET-форма в виде ряда пилюль) ----------------------- */

.fl-body form.adm-filterbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  box-shadow: none;
}

.fl-body .adm-chips {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  min-width: 0;
}

.fl-body .adm-chips__caption {
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  white-space: nowrap;
}

.fl-body .adm-chip {
  display: inline-flex;
  margin: 0;
  cursor: pointer;
}

.fl-body .adm-chip > input {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  border: 0;
}

.fl-body .adm-chip > span,
.fl-body button.adm-chip,
.fl-body summary.adm-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 38px;
  padding: 9px 16px;
  border-radius: var(--zp-r-pill);
  border: 1px solid rgba(246, 240, 228, 0.14);
  background: rgba(255, 255, 255, 0.03);
  font-family: var(--zp-font-mono);
  font-size: 12px;
  font-weight: 400;
  line-height: 1.2;
  white-space: nowrap;
  color: var(--zp-ink-2);
  box-shadow: none;
  cursor: pointer;
  list-style: none;
  transition: color 200ms var(--zp-ease),
    border-color 200ms var(--zp-ease),
    background-color 200ms var(--zp-ease),
    box-shadow 200ms var(--zp-ease);
}

.fl-body summary.adm-chip::-webkit-details-marker { display: none; }

.fl-body .adm-chip > span:hover,
.fl-body button.adm-chip:hover,
.fl-body summary.adm-chip:hover {
  color: var(--zp-ink);
  border-color: rgba(255, 184, 0, 0.45);
}

.fl-body .adm-chip > input:checked + span,
.fl-body button.adm-chip.is-active {
  color: var(--zp-on-gold);
  background: var(--adm-grad-chip);
  border-color: transparent;
  box-shadow: 0 10px 24px rgba(255, 140, 0, 0.3);
}

.fl-body .adm-chip > input:focus-visible + span {
  outline: 2px solid var(--zp-gold);
  outline-offset: 2px;
}

.fl-body .adm-chip--submit { font-family: var(--zp-font-mono); }

/* «Ещё» раскрывает редкие состояния под рядом.
   display:contents здесь нельзя: он ломает штатное скрытие содержимого
   <details> — редкие чипы оказались бы видны всегда. */
.fl-body .adm-chips__more { display: block; min-width: 0; }

/* Раскрытый список занимает всю строку ряда: иначе редкие чипы считались бы от
   56-пиксельной ширины самой <summary> и вылезали за карточку на узком экране. */
.fl-body .adm-chips__more[open] { flex: 1 1 100%; }

.fl-body .adm-chips__moreitems {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 8px;
  max-width: 100%;
}


/* --- 15.5 График выручки (макет, блок S4.2) -------------------------------- */

.fl-body .adm-bars {
  margin-top: 22px;
  display: flex;
  align-items: flex-end;
  gap: clamp(3px, 0.6vw, 8px);
  height: clamp(150px, 18vw, 220px);
  border-bottom: 1px solid rgba(246, 240, 228, 0.12);
}

.fl-body .adm-bars:empty { display: none; }

.fl-body .adm-bars__col {
  flex: 1 1 0;
  min-width: 0;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 2px;
}

.fl-body .adm-bars__fill {
  display: block;
  width: 100%;
  border-radius: 3px 3px 2px 2px;
  background: linear-gradient(180deg, rgba(255, 184, 0, 0.6), rgba(255, 184, 0, 0.2));
  transition: height 700ms var(--zp-ease) var(--adm-bar-delay, 0ms);
}

.fl-body .adm-bars__fill--last {
  background: linear-gradient(180deg, var(--zp-gold-lighter), var(--zp-amber));
}

.fl-body .adm-bars__empty {
  margin: 22px 0 0;
  font-size: 13px;
  color: var(--zp-ink-3);
}

.fl-body .adm-bars__legend {
  margin-top: 12px;
  display: flex;
  flex-wrap: wrap;
  gap: 8px 20px;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  color: var(--zp-ink-3);
}

.fl-body .adm-bars__key { display: flex; align-items: center; gap: 8px; }

.fl-body .adm-bars__swatch {
  width: 10px;
  height: 10px;
  border-radius: 3px;
  background: linear-gradient(180deg, var(--zp-gold-lighter), var(--zp-amber));
}

.fl-body .adm-bars__total { margin-left: auto; }


/* --- 15.6 «Требуют внимания» ----------------------------------------------- */

.fl-body .adm-panel__head--tight { align-items: center; margin-bottom: 0; }

.fl-body .adm-countpill {
  flex: 0 0 auto;
  padding: 4px 10px;
  border-radius: var(--zp-r-pill);
  background: var(--zp-err-bg);
  border: 1px solid rgba(255, 98, 93, 0.35);
  font-family: var(--zp-font-mono);
  font-size: 11px;
  color: var(--zp-err-ink);
}

.fl-body .adm-countpill--ok {
  background: var(--zp-ok-bg);
  border-color: var(--zp-ok-line);
  color: var(--zp-ok-ink);
}

.fl-body .adm-alerts {
  margin: 14px 0 0;
  padding: 0;
  list-style: none;
  display: flex;
  flex-direction: column;
}

.fl-body .adm-alert {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  width: 100%;
  padding: 13px 0;
  border-bottom: 1px solid rgba(246, 240, 228, 0.07);
  text-decoration: none;
  color: var(--zp-ink);
  transition: padding 180ms var(--zp-ease);
}

.fl-body .adm-alert:hover { padding-left: 8px; color: var(--zp-ink); }
.fl-body .adm-alerts li:last-child .adm-alert { border-bottom: 0; }

.fl-body .adm-alert__dot {
  width: 8px;
  height: 8px;
  flex: 0 0 auto;
  margin-top: 6px;
  border-radius: 50%;
  background: var(--zp-ink-3);
}

.fl-body .adm-alert__dot--warn {
  background: var(--zp-warn);
  animation: adm-pulse 1.6s ease-in-out infinite;
}

.fl-body .adm-alert__dot--err { background: var(--zp-err); }
.fl-body .adm-alert__dot--muted { background: var(--zp-ink-3); }

.fl-body .adm-alert__text { flex: 1 1 auto; min-width: 0; }

.fl-body .adm-alert__title { display: block; font-size: 14px; color: var(--zp-ink); }

.fl-body .adm-alert__meta {
  display: block;
  margin-top: 3px;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  color: var(--zp-ink-3);
}

.fl-body .adm-alert__arrow { flex: 0 0 auto; color: var(--zp-ink-3); }

.fl-body .adm-linkmore {
  flex: 0 0 auto;
  font-size: 14px;
  color: var(--zp-gold);
  text-decoration: none;
  white-space: nowrap;
}

.fl-body .adm-linkmore:hover { color: var(--adm-gold-hover); }

.fl-body .adm-panel__note--empty { margin-top: 14px; }


/* --- 15.7 Grid-таблица платежей на «Панели» -------------------------------- */

.fl-body .adm-gtable-wrap {
  margin-top: 14px;
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  scrollbar-color: rgba(255, 184, 0, 0.45) transparent;
  scrollbar-width: thin;
}

/* Макет: min-width 880 и колонки 110px 1.4fr 1fr 110px 120px 100px.
   Первая колонка расширена со 110 до 150px (и min-width — с 880 до 920px):
   в макете там «14:32», а бэкенд отдаёт created_at целиком, «2026-09-16 14:32».
   На 110px строка переносилась и ряд становился двухэтажным — силуэт макета
   держится именно однострочной строкой. */
.fl-body .adm-gtable--payments { min-width: 920px; }

.fl-body .adm-gtable__head,
.fl-body .adm-gtable__row {
  display: grid;
  grid-template-columns: 150px 1.4fr 1fr 110px 120px 100px;
  gap: 12px;
}

.fl-body .adm-gtable__head {
  padding: 8px 12px;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
}

.fl-body .adm-gtable__row {
  align-items: center;
  padding: 12px;
  border-radius: 12px;
  transition: background-color 160ms var(--zp-ease);
}

.fl-body .adm-gtable__row:hover { background: rgba(255, 255, 255, 0.03); }

.fl-body .adm-gtable__right { text-align: right; }

.fl-body .adm-gtable__time {
  font-family: var(--zp-font-mono);
  font-size: 12px;
  white-space: nowrap;
  color: var(--zp-ink-3);
}

.fl-body .adm-gtable__name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 14px;
}

.fl-body .adm-gtable__desc {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13.5px;
  color: var(--zp-ink-2);
}

.fl-body .adm-gtable__mono {
  font-family: var(--zp-font-mono);
  font-size: 12px;
  color: var(--zp-ink-2);
}

.fl-body .adm-gtable__money {
  font-family: var(--zp-font-mono);
  font-size: 13px;
  text-align: right;
  white-space: nowrap;
  color: var(--zp-ink-2);
}

.fl-body .adm-gtable__money--ok { color: var(--zp-ok-ink); }
.fl-body .adm-gtable__money--pending { color: var(--zp-warn); }
.fl-body .adm-gtable__money--fail { color: var(--zp-ink-3); }


/* --- 15.8 Топ тарифов (столбики вместо Chart.js) --------------------------- */

.fl-body .adm-toplist {
  margin-top: 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.fl-body .adm-toplist:empty { display: none; }

.fl-body .adm-toplist__row {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(90px, 2fr) 48px;
  gap: 12px;
  align-items: center;
}

.fl-body .adm-toplist__name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13.5px;
}

.fl-body .adm-toplist__track {
  height: 8px;
  border-radius: var(--zp-r-pill);
  background: rgba(246, 240, 228, 0.08);
  overflow: hidden;
}

.fl-body .adm-toplist__fill {
  display: block;
  height: 100%;
  border-radius: var(--zp-r-pill);
  background: var(--adm-grad-chip);
  transition: width 700ms var(--zp-ease);
}

.fl-body .adm-toplist__val {
  font-family: var(--zp-font-mono);
  font-size: 12px;
  text-align: right;
  color: var(--zp-gold);
}


/* --- 15.9 Таблицы разделов: строки-плитки ---------------------------------- */

.fl-body .m2-admin-page .adm-tablecard {
  padding: clamp(14px, 1.8vw, 24px);
  border-radius: var(--adm-r-panel);
}

.fl-body .m2-admin-page .adm-table--users { min-width: 1000px; }
.fl-body .m2-admin-page .adm-table--payments { min-width: 880px; }

.fl-body .m2-admin-page .m2-table tbody tr:hover { background: transparent; }
.fl-body .m2-admin-page .m2-table tbody tr:hover td { background: rgba(255, 255, 255, 0.03); }

/* Аватар строки: плоский двухстоповый квадрат без свечения, как в макете. */
.fl-body .adm-user-cell .avatar {
  background: var(--adm-grad-chip);
  box-shadow: none;
}

.fl-body .adm-user-cell .avatar--tg {
  background: var(--adm-grad-tg);
  box-shadow: none;
}

/* Вторая строка ячейки — email, регистр не меняем. */
.fl-body .adm-user-cell__meta {
  font-size: 11px;
  letter-spacing: normal;
  text-transform: none;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.fl-body .adm-table__ellipsis {
  max-width: 180px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Колонка «назначение» в макете — одна строка 13.5px, приглушённая,
   с многоточием: id платежа длиннее ячейки и не должен её распирать. */
.fl-body .adm-table__purpose {
  max-width: 260px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13.5px;
  color: var(--zp-ink-2);
}

.fl-body .adm-table__tg {
  font-family: var(--zp-font-mono);
  font-size: 12px;
  color: var(--adm-tg-ink);
}

.fl-body .adm-table__tg--empty { color: var(--zp-ink-3); }

.fl-body .adm-table__money--ok { color: var(--zp-ok-ink); }
.fl-body .adm-table__money--pending { color: var(--zp-warn); }
.fl-body .adm-table__money--fail { color: var(--zp-ink-3); }


/* --- 15.9b Карточка открытого пользователя (макет, экран «Пользователи») ----
   Стеклянная панель с золотой градиентной рамкой под таблицей: аватар 48,
   имя Geologica 500/20, моно-строка «email · telegram», ряд из четырёх тёмных
   плиток (те же .adm-metric, что и в остальной админке) и строка действий,
   где «заблокировать» отжата вправо. Значения — из хендоффа. */

.fl-body .adm-usercard {
  margin: 0;
  padding: clamp(18px, 2.2vw, 30px);
  border-radius: var(--adm-r-panel);
  background: var(--zp-grad-glass) padding-box,
    var(--zp-grad-glass-line) border-box;
  border: 1px solid transparent;
  box-shadow: var(--zp-shadow-card);
  animation: adm-rise 400ms var(--zp-ease) both;
}

.fl-body .adm-usercard__head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

.fl-body .adm-usercard__ident {
  display: flex;
  align-items: center;
  gap: 14px;
  min-width: 0;
}

.fl-body .adm-usercard__avatar {
  flex: 0 0 auto;
  width: 48px;
  height: 48px;
  display: grid;
  place-items: center;
  border-radius: 15px;
  font-family: var(--zp-font-display);
  font-weight: 700;
  font-size: 16px;
  color: var(--zp-on-gold);
  background: var(--adm-grad-chip);
}

.fl-body .adm-usercard__avatar--tg { background: var(--adm-grad-tg); }

.fl-body .adm-usercard__idtext { min-width: 0; }

.fl-body .m2-admin-page .adm-usercard__name {
  margin: 0;
  font-family: var(--zp-font-display);
  font-weight: 500;
  font-size: 20px;
  letter-spacing: -0.02em;
  line-height: 1.2;
  text-transform: none;
  color: var(--zp-ink);
  overflow-wrap: anywhere;
}

.fl-body .adm-usercard__meta {
  margin-top: 2px;
  font-family: var(--zp-font-mono);
  font-size: 12px;
  color: var(--zp-ink-3);
  overflow-wrap: anywhere;
}

.fl-body .adm-usercard__close {
  flex: 0 0 auto;
  width: 36px;
  height: 36px;
  display: grid;
  place-items: center;
  border-radius: 10px;
  border: 1px solid rgba(246, 240, 228, 0.14);
  text-decoration: none;
  color: var(--zp-ink-2);
  transition: color var(--zp-t-fast) var(--zp-ease),
    border-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-usercard__close:hover {
  color: var(--zp-ink);
  border-color: rgba(246, 240, 228, 0.35);
}

/* Плитки карточки шире обычных счётчиков: в макете 180px, а не 96px. */
.fl-body .adm-usercard .adm-metrics--user {
  margin-top: 18px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));
}

/* Дата и длинный статус не должны ломать плитку. */
.fl-body .adm-usercard .adm-metric__value { overflow-wrap: anywhere; }
.fl-body .adm-usercard .adm-metric__value--date { font-family: var(--zp-font-mono); font-size: 22px; }

.fl-body .adm-usercard__actions {
  margin-top: 18px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}

.fl-body .adm-usercard__form { display: inline-flex; margin: 0; }
.fl-body .adm-usercard__form--end { margin-left: auto; }

.fl-body .adm-usercard__note {
  margin: 18px 0 0;
  font-size: 13.5px;
  color: var(--zp-ink-3);
}

/* Кнопка карточки: 11×18, радиус 12, 14px — админский размер из макета
   (общая .zp-btn кабинета крупнее: 13×22, радиус 16, 15px). */
.fl-body .m2-admin-page .adm-ubtn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 11px 18px;
  border-radius: 12px;
  border: 1px solid rgba(246, 240, 228, 0.16);
  background: transparent;
  font-family: var(--zp-font-text);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.2;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  color: var(--zp-ink);
  transition: color var(--zp-t-fast) var(--zp-ease),
    border-color var(--zp-t-fast) var(--zp-ease),
    background-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .m2-admin-page .adm-ubtn:hover {
  border-color: var(--zp-gold);
  color: var(--zp-gold);
}

.fl-body .m2-admin-page .adm-ubtn--gold {
  border-color: transparent;
  background: var(--adm-grad-chip);
  font-weight: 600;
  color: var(--zp-on-gold);
  box-shadow: 0 10px 26px rgba(255, 140, 0, 0.3);
}

.fl-body .m2-admin-page .adm-ubtn--gold:hover { color: var(--zp-on-gold); }

.fl-body .m2-admin-page .adm-ubtn--danger {
  border-color: rgba(255, 98, 93, 0.3);
  color: var(--zp-err-ink);
}

.fl-body .m2-admin-page .adm-ubtn--danger:hover {
  background: var(--zp-err-bg);
  border-color: rgba(255, 98, 93, 0.3);
  color: var(--zp-err-ink);
}

.fl-body .m2-admin-page .adm-ubtn--ok {
  border-color: var(--zp-ok-line);
  color: var(--zp-ok-ink);
}

.fl-body .m2-admin-page .adm-ubtn--ok:hover {
  background: var(--zp-ok-bg);
  border-color: var(--zp-ok-line);
  color: var(--zp-ok-ink);
}


/* --- 15.10 Тарифы карточками (макет, блок S7) ------------------------------ */

.fl-body .adm-tariffs-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

.fl-body .adm-tariffs-bar__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}

.fl-body .adm-tariffs-bar__actions form { margin: 0; }

.fl-body .adm-tariffs-note {
  margin: 12px 0 0;
  font-size: 13.5px;
  max-width: 70ch;
  color: var(--zp-ink-3);
}

.fl-body .adm-tariffs {
  margin-top: 14px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr));
  gap: 12px;
}

.fl-body .adm-tariff {
  position: relative;
  min-width: 0;
  padding: clamp(18px, 2.2vw, 26px);
  border-radius: var(--zp-r-tile);
  background: var(--zp-grad-card);
  border: 1px solid var(--zp-hairline);
  transition: transform 240ms var(--zp-ease), border-color 240ms var(--zp-ease);
}

.fl-body .adm-tariff:hover {
  transform: translateY(-3px);
  border-color: rgba(255, 184, 0, 0.45);
}

.fl-body .adm-tariff__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}

.fl-body .adm-tariff__code {
  min-width: 0;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.fl-body .adm-tariff__name {
  margin: 14px 0 0;
  font-family: var(--zp-font-display);
  font-weight: 500;
  font-size: 19px;
  letter-spacing: -0.02em;
  line-height: 1.25;
  color: var(--zp-ink);
}

.fl-body .adm-tariff__price {
  margin-top: 12px;
  font-family: var(--zp-font-display);
  font-weight: 300;
  font-size: 34px;
  letter-spacing: -0.04em;
  line-height: 1;
  color: var(--zp-ink);
}

.fl-body .adm-tariff.is-off .adm-tariff__price { color: var(--zp-ink-3); }

.fl-body .adm-tariff__dl {
  margin: 14px 0 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 12px;
  font-size: 12.5px;
}

.fl-body .adm-tariff__dl dt {
  font-family: var(--zp-font-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
}

.fl-body .adm-tariff__dl dd {
  margin: 3px 0 0;
  font-family: var(--zp-font-mono);
  color: var(--zp-ink);
}

/* «Редактировать» и удаление стоят в одну строку, поля раскрываются под ними.
   Сетка вместо display:contents: у <details> с display:contents содержимое
   перестаёт скрываться в закрытом состоянии. */
.fl-body .adm-tariff__foot {
  margin-top: 16px;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: 8px;
}

.fl-body .adm-tariff__edit { min-width: 0; }

.fl-body .adm-tariff__editbtn {
  display: block;
  width: 100%;
  padding: 10px 14px;
  border-radius: 10px;
  border: 1px solid rgba(246, 240, 228, 0.16);
  font-size: 13.5px;
  text-align: center;
  list-style: none;
  cursor: pointer;
  color: var(--zp-ink-2);
  transition: color 200ms var(--zp-ease), border-color 200ms var(--zp-ease);
}

.fl-body .adm-tariff__editbtn::-webkit-details-marker { display: none; }
.fl-body .adm-tariff__editbtn:hover { border-color: var(--zp-gold); color: var(--zp-gold); }

.fl-body .adm-tariff__fields {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 120px), 1fr));
  gap: 8px;
  margin-top: 8px;
}

.fl-body .adm-tariff__fields .m2-field { margin: 0; }
.fl-body .adm-tariff__save { grid-column: 1 / -1; margin: 0; }
.fl-body .adm-tariff__delete { flex: 0 0 auto; margin: 0; }

/* Тумблер активности — числа макета (трек 40×22, кноб 16, ход 2 → 19). */
.fl-body .adm-tariff .toggle { width: 40px; height: 22px; }

.fl-body .adm-tariff .toggle-slider {
  background: rgba(246, 240, 228, 0.08);
  border: 1px solid rgba(246, 240, 228, 0.14);
  transition: background-color 220ms var(--zp-ease-toggle),
    border-color 220ms var(--zp-ease-toggle);
}

.fl-body .adm-tariff .toggle-slider::before {
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  background: var(--zp-ink-3);
  transition: transform 220ms var(--zp-ease-toggle),
    background-color 220ms var(--zp-ease-toggle);
}

.fl-body .adm-tariff .toggle input:checked + .toggle-slider {
  background: rgba(255, 184, 0, 0.25);
  border-color: rgba(255, 184, 0, 0.5);
}

.fl-body .adm-tariff .toggle input:checked + .toggle-slider::before {
  transform: translateX(17px);
  background: var(--zp-gold);
}


/* --- 15.11 Тикеты (макет, блок S8) ----------------------------------------- */

.fl-body .adm-support .grid.grid-2 {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
  gap: 12px;
}

/* display:flex перебивает UA-правило [hidden] — возвращаем его явно,
   иначе карточка тикета видна ещё до выбора обращения. */
.fl-body .m2-admin-page .adm-support__chat[hidden] { display: none; }

.fl-body .m2-admin-page .adm-support__chat {
  display: flex;
  flex-direction: column;
  min-height: 480px;
  border-radius: var(--adm-r-panel);
  padding: clamp(18px, 2.2vw, 28px);
}

.fl-body .admin-ticket-msg .text-secondary {
  display: block;
  margin-top: 5px;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  color: var(--zp-ink-3);
}


/* --- 15.12 Адаптив рельса и шапки ------------------------------------------ */

@media (max-width: 1024px) {
  /* Рельс уезжает в выдвижное меню (shell.css). Возвращаем ему те же размеры,
     иначе наши десктопные flex/max-width перебивают мобильное правило и
     сайдбар продолжает занимать колонку. */
  html[data-surface="admin"] .fl-sidebar {
    flex: 0 0 auto;
    width: min(300px, 86vw);
    max-width: none;
    padding: 22px 14px;
  }

  @supports selector(:has(*)) {
    .fl-body:has(.adm-rail) .fl-sidebar {
      flex: 0 0 auto;
      width: min(300px, 86vw);
      max-width: none;
      padding: 22px 14px;
    }
  }

  .fl-body .adm-topbar__title { white-space: normal; }
}

@media (max-width: 760px) {
  .fl-body .adm-topbar { align-items: flex-start; }
  .fl-body .adm-topbar__side { flex: 1 1 100%; }
  .fl-body .adm-search { flex: 1 1 100%; }
  .fl-body .adm-search__input { width: 100%; }
  .fl-body .adm-gtable__head { display: none; }
  .fl-body .adm-gtable--payments { min-width: 0; }
  .fl-body .adm-gtable__row {
    grid-template-columns: 1fr auto;
    row-gap: 4px;
    border: 1px solid var(--zp-hairline);
    margin-bottom: 8px;
  }
}

@media (max-width: 560px) {
  .fl-body .adm-tariff__dl { grid-template-columns: 1fr; }

  /* Крестик остаётся в правом верхнем углу карточки, а не уезжает под имя. */
  .fl-body .adm-usercard__head { flex-wrap: nowrap; align-items: flex-start; }
  .fl-body .adm-usercard__ident { flex: 1 1 auto; }
  .fl-body .adm-usercard__actions > *,
  .fl-body .adm-usercard__form { width: 100%; }
  .fl-body .adm-usercard__form--end { margin-left: 0; }
  .fl-body .m2-admin-page .adm-ubtn { width: 100%; white-space: normal; }
}


/* ============================================================================
   16. Тикеты: чат по макету (блок S8)
   Список слева с рядом чипов, переписка справа: шапка с двумя кнопками и
   разделителем, лента, прижатая к низу, и инлайн-строка ответа.
   ============================================================================ */

.fl-body .adm-chips--tickets { gap: 6px; margin-bottom: 12px; }
.fl-body .adm-support__refresh { margin-left: auto; }

.fl-body .adm-support__items {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.fl-body .adm-chat__head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding-bottom: 16px;
  border-bottom: 1px solid rgba(246, 240, 228, 0.08);
}

.fl-body .adm-chat__titlebox { min-width: 0; }

.fl-body .adm-chat__meta {
  margin-top: 4px;
  font-family: var(--zp-font-mono);
  font-size: 11.5px;
  color: var(--zp-ink-3);
}

.fl-body .adm-chat__actions {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.fl-body .adm-chat__btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 9px 14px;
  border-radius: 10px;
  border: 1px solid rgba(246, 240, 228, 0.16);
  background: transparent;
  font-family: var(--zp-font-text);
  font-size: 13px;
  line-height: 1.2;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  color: var(--zp-ink-2);
  transition: color var(--zp-t-fast) var(--zp-ease),
    border-color var(--zp-t-fast) var(--zp-ease),
    background-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-chat__btn:hover { border-color: var(--zp-gold); color: var(--zp-gold); }

.fl-body .adm-chat__btn--ok {
  border-color: rgba(88, 184, 120, 0.35);
  color: var(--zp-ok-ink);
}

.fl-body .adm-chat__btn--ok:hover {
  background: rgba(88, 184, 120, 0.12);
  border-color: rgba(88, 184, 120, 0.35);
  color: var(--zp-ok-ink);
}

.fl-body .adm-chat__state { margin-top: 12px; }

.fl-body .adm-chat__statebtn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 12px;
  border-radius: 10px;
  border: 1px solid rgba(246, 240, 228, 0.14);
  font-family: var(--zp-font-mono);
  font-size: 11px;
  color: var(--zp-ink-3);
  cursor: pointer;
  list-style: none;
}

.fl-body .adm-chat__statebtn::-webkit-details-marker { display: none; }
.fl-body .adm-chat__statebtn:hover { color: var(--zp-ink); border-color: rgba(255, 184, 0, 0.45); }

.fl-body .adm-chat__stategrid {
  margin-top: 10px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr));
  gap: 8px;
  align-items: end;
}

/* Лента прижимает строку ответа к низу карточки. */
.fl-body #adminTicketUserHistory { margin-top: 10px; }

.fl-body .admin-ticket-row {
  display: flex;
  flex-direction: column;
  max-width: 82%;
}

.fl-body .admin-ticket-row--user { align-self: flex-start; align-items: flex-start; }
.fl-body .admin-ticket-row--admin { align-self: flex-end; align-items: flex-end; }

.fl-body .admin-ticket-msg p { margin: 0; }

.fl-body .admin-ticket-meta {
  margin-top: 5px;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  color: var(--zp-ink-3);
}

.fl-body .adm-chat__reply {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  padding-top: 14px;
  border-top: 1px solid rgba(246, 240, 228, 0.08);
}

.fl-body .adm-chat__input {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 48px;
  max-height: 140px;
  padding: 13px 16px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.45);
  border: 1px solid rgba(246, 240, 228, 0.14);
  color: var(--zp-ink);
  font-family: var(--zp-font-text);
  font-size: 14px;
  line-height: 1.4;
  resize: vertical;
  transition: border-color var(--zp-t-fast) var(--zp-ease), box-shadow var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-chat__input::placeholder { color: var(--zp-ink-3); }

.fl-body .adm-chat__input:focus {
  outline: none;
  border-color: var(--zp-gold);
  box-shadow: 0 0 0 4px rgba(255, 184, 0, 0.12);
}

.fl-body .adm-chat__attach {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  margin: 0;
  border-radius: var(--zp-r-input);
  border: 1px solid rgba(246, 240, 228, 0.14);
  color: var(--zp-ink-2);
  cursor: pointer;
  transition: border-color var(--zp-t-fast) var(--zp-ease), color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-chat__attach:hover { border-color: var(--zp-gold); color: var(--zp-gold); }

.fl-body .adm-chat__attach input[type="file"] {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

.fl-body .adm-chat__send {
  flex: 0 0 auto;
  padding: 13px 20px;
  border: 0;
  border-radius: var(--zp-r-input);
  background: var(--adm-grad-gold-btn);
  color: var(--zp-on-gold);
  font-family: var(--zp-font-text);
  font-weight: 600;
  font-size: 14px;
  line-height: 1.2;
  white-space: nowrap;
  cursor: pointer;
  box-shadow: 0 10px 26px rgba(255, 140, 0, 0.3);
  transition: transform var(--zp-t-fast) var(--zp-ease), box-shadow var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-chat__send:hover { transform: translateY(-2px); box-shadow: var(--zp-shadow-gold-hover); }

@media (max-width: 560px) {
  .fl-body .adm-chat__reply { flex-wrap: wrap; }
  .fl-body .adm-chat__input { flex: 1 1 100%; }
  .fl-body .adm-chat__send { flex: 1 1 auto; }
  .fl-body .admin-ticket-row { max-width: 100%; }
}


/* ============================================================================
   17. Разделы, дошедшие до макета вторым проходом
   Рассылки, промокоды, рефералы, группы тарифов, админы, уведомления, дизайн.
   Все значения взяты из «Zapret VPN Админка.dc.html»: тумблер 40×22 с ходом
   17px — тот же, что на карточке тарифа; пилюля-чип 9px/14px, radius 999;
   сетка пар и троек — auto-fit minmax(min(100%,…),1fr) с зазором 10–12px.
   Hex-кодов нет: только переменные из tokens.css и rgba() из хендоффа.
   ============================================================================ */

/* ----------------------------------------------------------------------------
   17.1 Тумблер строки настройки
   В макете переключатель живёт справа от подписи и занимает всю ширину строки
   (карточка тарифа, блок S6). Базовый .toggle из shell.css — 46×26; здесь он
   ужимается до макетных 40×22 ровно так же, как у .adm-tariff .toggle.
   ---------------------------------------------------------------------------- */

.fl-body .toggle.adm-switch { width: 40px; height: 22px; }

.fl-body .toggle.adm-switch .toggle-slider {
  background: rgba(246, 240, 228, 0.08);
  border: 1px solid rgba(246, 240, 228, 0.14);
}

.fl-body .toggle.adm-switch .toggle-slider::before {
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  background: var(--zp-ink-3);
}

.fl-body .toggle.adm-switch input:checked + .toggle-slider {
  background: rgba(255, 184, 0, 0.25);
  border-color: rgba(255, 184, 0, 0.5);
}

.fl-body .toggle.adm-switch input:checked + .toggle-slider::before {
  transform: translateX(17px);
  background: var(--zp-gold);
}

.fl-body .adm-switchrow {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  min-width: 0;
  min-height: 42px;
  margin: 0;
  padding: 10px 14px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid rgba(246, 240, 228, 0.08);
  cursor: pointer;
  transition: border-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .adm-switchrow:hover { border-color: rgba(255, 184, 0, 0.35); }

/* Недоступная настройка: тумблер и подпись гаснут, курсор обычный */
.fl-body .adm-switchrow:has(input:disabled) {
  cursor: default;
  opacity: 0.55;
}

.fl-body .adm-switchrow:has(input:disabled):hover { border-color: rgba(246, 240, 228, 0.08); }

.fl-body .adm-switchrow__text {
  flex: 1 1 auto;
  min-width: 0;
  font-size: 13.5px;
  line-height: 1.35;
  color: var(--zp-ink);
  overflow-wrap: anywhere;
}

/* Строка переключателя + поле рядом; на узком — друг под другом */
.fl-body .adm-switchgroup {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
  align-items: center;
}

.fl-body .adm-switchgroup--wide {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr));
}

/* ----------------------------------------------------------------------------
   17.2 Сетки пар и троек внутри карточки
   ---------------------------------------------------------------------------- */

.fl-body .adm-grid--pair { grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr)); }
.fl-body .adm-grid--trio { grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr)); }

/* Внутри карточки зазор мельче страничного */
.fl-body .adm-panel .adm-grid { gap: 10px; }

/* ----------------------------------------------------------------------------
   17.3 Пилюля-чип только для чтения (макет, блок «прочие разделы»)
   ---------------------------------------------------------------------------- */

.fl-body .adm-pill {
  display: inline-block;
  max-width: 100%;
  padding: 9px 14px;
  border-radius: var(--zp-r-pill);
  border: 1px solid rgba(246, 240, 228, 0.14);
  font-family: var(--zp-font-mono);
  font-size: 12px;
  line-height: 1.2;
  color: var(--zp-ink-2);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: middle;
}

/* ----------------------------------------------------------------------------
   17.4 Части панели: подвал, подзаголовок, вложенная таблица
   ---------------------------------------------------------------------------- */

.fl-body .adm-panel__foot {
  margin-top: 14px;
  padding-top: 12px;
  border-top: 1px solid var(--zp-hairline);
}

.fl-body .m2-admin-page .adm-panel__subtitle {
  margin: 0 0 8px;
  font-family: var(--zp-font-mono);
  font-size: 10.5px;
  font-weight: 400;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--zp-ink-3);
  opacity: 1;
}

.fl-body .adm-panel__table { margin-top: 14px; }

/* Таблица-карточка, у которой есть своя шапка с заголовком */
.fl-body .m2-admin-page .adm-panel.adm-tablecard { padding: clamp(14px, 1.8vw, 22px); }

.fl-body .adm-panel.adm-tablecard .adm-panel__head { margin-bottom: 10px; }

/* ----------------------------------------------------------------------------
   17.5 Формы разделов
   ---------------------------------------------------------------------------- */

.fl-body .adm-inlineform__grow { flex: 1 1 220px; }
.fl-body .adm-stackform__submit { justify-self: start; margin-top: 2px; }

.fl-body .adm-formactions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 2px;
}

/* Промокоды: форма создания и раскрытая строка редактирования.
   display:grid сильнее атрибута hidden, поэтому скрытие возвращаем явно —
   иначе форма создания видна до нажатия кнопки. */
.fl-body .adm-promoform { display: grid; gap: 10px; }
.fl-body .adm-promoform[hidden],
.fl-body .adm-stackform[hidden],
.fl-body .adm-inlineform[hidden],
.fl-body .adm-createform[hidden],
.fl-body .adm-switchgroup[hidden],
.fl-body .adm-grid[hidden] { display: none; }
.fl-body .adm-promoform__code { text-transform: uppercase; }

.fl-body .m2-admin-page .adm-editrow > td {
  padding: 14px 12px;
  background: rgba(0, 0, 0, 0.32);
  border-radius: var(--zp-r-tile-sm);
}

.fl-body .m2-admin-page .adm-editrow:hover { background: transparent; }

/* Группы тарифов: список сквадов + тип + кнопка одной строкой */
.fl-body .adm-squadform {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 8px;
  min-width: 0;
}

.fl-body .adm-squadform__ta {
  flex: 1 1 200px;
  min-width: 0;
  min-height: 62px;
  font-family: var(--zp-font-mono);
  font-size: 12px;
  resize: vertical;
}

.fl-body .adm-squadform__type { flex: 0 0 110px; }

/* Рассылки: размер батча и процент партнёра — узкие поля прямо в строке */
.fl-body .adm-batchform,
.fl-body .adm-pctform {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.fl-body .adm-rowactions--wrap { flex-wrap: wrap; justify-content: flex-end; }

/* Предпросмотр логотипа */
.fl-body .adm-logopreview {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  padding: 10px 12px;
  border-radius: var(--zp-r-input);
  background: rgba(0, 0, 0, 0.4);
  border: 1px solid rgba(246, 240, 228, 0.08);
}

.fl-body .adm-logopreview img {
  width: 40px;
  height: 40px;
  flex: 0 0 auto;
  border-radius: 12px;
  object-fit: contain;
  background: rgba(0, 0, 0, 0.35);
}

.fl-body .adm-logopreview__note {
  min-width: 0;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  color: var(--zp-ink-3);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ----------------------------------------------------------------------------
   17.6 Свёртка-предупреждение (режим обслуживания)
   ---------------------------------------------------------------------------- */

.fl-body .m2-admin-page .adm-fold--warn {
  border-color: var(--zp-err-line);
  background: linear-gradient(180deg, rgba(255, 98, 93, 0.06), rgba(255, 255, 255, 0.01));
}

.fl-body .adm-fold--warn > .adm-fold__summary { color: var(--zp-err-ink); }
.fl-body .adm-fold--warn[open] > .adm-fold__summary { border-bottom-color: var(--zp-err-line); }

/* ----------------------------------------------------------------------------
   17.7 Поиск внутри раздела (строка действий промокодов)
   ---------------------------------------------------------------------------- */

.fl-body .adm-search--inline {
  flex: 1 1 260px;
  min-width: 0;
  max-width: 420px;
  margin: 0;
}

.fl-body .adm-search--inline .adm-search__input {
  width: 100%;
  border-radius: var(--zp-r-pill);
  padding-left: 16px;
}

/* ----------------------------------------------------------------------------
   17.8 Модалка подтверждения
   ---------------------------------------------------------------------------- */

.fl-body .m2-admin-page .m2-coupon-modal__dialog {
  display: grid;
  gap: 10px;
  padding: clamp(18px, 2.2vw, 28px);
  width: min(420px, calc(100vw - 32px));
}

.fl-body .adm-modal__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 4px;
}

/* ----------------------------------------------------------------------------
   17.9 Мелочи, которых не хватало разметке первого прохода
   ---------------------------------------------------------------------------- */

.fl-body .adm-tariff__sync { display: flex; align-items: center; gap: 6px; }

/* Таблица админов — пять колонок, ей хватает меньшей ширины, чем списку
   пользователей (там 1000px из-за баланса и ряда действий). */
.fl-body .m2-admin-page .adm-table--admins { min-width: 720px; }

/* Таблицы разделов без инлайн-редактирования: узкие, но не уже макетных 880px */
.fl-body .m2-admin-page .adm-panel__table .adm-table { min-width: 720px; }
.fl-body .m2-admin-page .adm-panel__table .adm-table--edit { min-width: 940px; }

@media (max-width: 760px) {
  .fl-body .adm-switchgroup,
  .fl-body .adm-switchgroup--wide { grid-template-columns: 1fr; }
  .fl-body .adm-squadform__type { flex: 1 1 110px; }
  .fl-body .adm-search--inline { max-width: none; }
}

@media (max-width: 560px) {
  .fl-body .adm-grid--pair,
  .fl-body .adm-grid--trio { grid-template-columns: 1fr; }
  .fl-body .adm-switchrow { padding: 10px 12px; }
  .fl-body .adm-rowactions--wrap { justify-content: flex-start; }
}


/* ============================================================================
   18. Тикеты: строка списка и счётчики по макету (блок S8)
   В макете строка тикета двухэтажная: тема слева, пилюля статуса справа,
   под ними — моно-строка «#id · пользователь · когда». Раньше разметку
   рисовал JS одной плоской строкой с кнопочными классами .btn.btn-ghost;
   теперь он отдаёт структуру макета, а размеры задаются здесь.
   ============================================================================ */

.fl-body .adm-support__body {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
  gap: 12px;
}

/* Список тикетов — обычная тёмная карточка макета, чат рядом — золотая */
.fl-body .m2-admin-page .adm-support__list { padding: clamp(14px, 1.8vw, 22px); }

.fl-body .adm-support__stats { margin-bottom: 0; }

.fl-body .admin-ticket-item__top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  min-width: 0;
}

.fl-body .admin-ticket-item__title {
  flex: 1 1 auto;
  min-width: 0;
  font-size: 14px;
  font-weight: 500;
  line-height: 1.3;
  color: var(--zp-ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.fl-body .admin-ticket-item__meta {
  display: block;
  margin-top: 5px;
  font-family: var(--zp-font-mono);
  font-size: 11px;
  line-height: 1.4;
  color: var(--zp-ink-3);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Пилюля статуса внутри строки не должна тянуть строку по ширине */
.fl-body .admin-ticket-item .adm-status { flex: 0 0 auto; }

/* Ссылка на вложение внутри пузыря */
.fl-body .admin-ticket-msg__file {
  display: inline-block;
  margin-top: 8px;
  padding: 7px 12px;
  border-radius: var(--zp-r-btn-sm);
  border: 1px solid rgba(246, 240, 228, 0.16);
  font-size: 12.5px;
  line-height: 1.2;
  text-decoration: none;
  color: var(--zp-ink-2);
  transition: color var(--zp-t-fast) var(--zp-ease),
    border-color var(--zp-t-fast) var(--zp-ease);
}

.fl-body .admin-ticket-msg__file:hover {
  border-color: var(--zp-gold);
  color: var(--zp-gold);
}

/* Сетка «статус / приоритет / кнопки» в свёртке чата — поля gold, не form-* */
.fl-body .adm-chat__stategrid .m2-field { margin: 0; min-width: 0; }

/* ============================================================================
   Правки по итогам машинного прогона вёрстки (layout_audit.py)
   ============================================================================ */

/* Таблицы пользователей и платежей вылезали за экран на 12px и тянули страницу.
   Причина не в самой таблице, а в цепочке контейнеров: элемент grid/flex по
   умолчанию имеет min-width:auto и отказывается сжиматься под широкого потомка,
   поэтому overflow-x на обёртке не срабатывал. */
.fl-body .m2-admin-page,
.fl-body .m2-admin-page .m2-card,
.fl-body .m2-admin-page .adm-panel,
.fl-body .m2-admin-page .adm-panel__body,
.fl-body .m2-admin-page .m2-table-wrap {
  min-width: 0;
}

.fl-body .m2-admin-page .m2-table-wrap {
  max-width: 100%;
  overscroll-behavior-x: contain;
}

/* Чипы «ещё N» вылезали за свой контейнер — переносим их по строкам. */
.fl-body .m2-admin-page .adm-chips__moreitems {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  min-width: 0;
}

.fl-body .m2-admin-page .adm-chips__moreitems .adm-chip {
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Закрытый <details> в современном Chrome больше не убирает содержимое из
   раскладки: оно живёт в ::details-content с content-visibility: hidden и
   сохраняет застывшую геометрию. Поля свёрнутой панели продолжают отдавать
   свои прямоугольники — они наезжают друг на друга (шаг строки 23px при
   высоте поля 42px) и на то, что нарисовано ниже по странице. Глазом этого
   не видно, но ломается всё, что меряет раскладку: автотесты, скролл к
   элементу, hit-testing. Явный display:none в закрытом состоянии возвращает
   прежнее поведение; по клику на «Редактировать»/«Создать» панель
   раскрывается и все поля доступны как раньше. */
.fl-body .adm-fold:not([open]) > .adm-fold__body,
.fl-body .adm-tariff__edit:not([open]) > .adm-tariff__fields { display: none; }


/* Подзаголовки карточек: в макете интерлиньяж 1.5 (28.5px при 19px), у нас
   наследовался 1.25 — строка сидела теснее эталона. */
.fl-body .m2-admin-page h2,
.fl-body .m2-admin-page .adm-card__title,
.fl-body .m2-admin-page .m2-card__title {
  line-height: 1.5;
}
