/* ============================================================
   KAVACHAM Lab — TMA-специфика поверх site/styles.css.
   Палитра/типографика НЕ дублируются: берём токены оттуда
   (--ground, --panel, --text, --rule, --accent, --gold, --serif, --sans).

   ⚠️ НЕ ПИСАТЬ здесь звёздочку перед слэшем: последовательность «звезда+слэш»
   ЗАКРЫВАЕТ комментарий. Так и было: строка со списком токенов содержала
   «--gold» со звёздочкой и слэшем, комментарий обрывался на 4-й строке,
   а весь блок :root ниже парсер выбрасывал как мусор. Итог: с самого Ф0 в
   проде не работали --tma-pad, --tma-tab-h, --tma-measure, --tma-vh и все
   четыре safe-area — экран жил без полей, таб-бар без min-height 3.6rem.

   Здесь только то, чего нет на сайте: таб-бар, лента, оглавление,
   тир-бейджи, ⚖️ SRI, safe-area, деградация вне Telegram.

   Тон Этапа 1 — инженерный: палитра и гарнитуры прежние (единство с
   лендингом), но плотнее, суше, а всё счётное (номера, статусы, объёмы)
   — моноширинно и с tabular-nums. «Терминал исследователя» — это про
   плотность и честность цифр, а не про смену палитры.
   ============================================================ */

:root {
  /* высота вьюпорта Telegram (viewportStableHeight); вне TG — обычные 100dvh */
  --tma-vh: 100dvh;
  /* safe-area: Telegram отдаёт свои инсеты, браузер — env() */
  --sa-top: env(safe-area-inset-top, 0px);
  --sa-bottom: env(safe-area-inset-bottom, 0px);
  --sa-left: env(safe-area-inset-left, 0px);
  --sa-right: env(safe-area-inset-right, 0px);

  --tma-top-h: 3.25rem;
  /* 4rem, не 3.6: в табах появилась вторая строка-подпись (.tab-sub) —
     при 3.6rem реальная высота бара превышала токен и контент прятался под ним */
  --tma-tab-h: 4rem;
  --tma-pad: clamp(1rem, 4.5vw, 1.6rem);
  /* длина строки в протоколах: 65–75 символов */
  --tma-measure: 68ch;
  /* третья гарнитура — только для счётного: номера заявок, объёмы, статусы */
  --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;

  /* ——— Семантические токены контраста ———
     --sel-ink: «золото выбранного» НА ПАНЕЛИ (чип, тир, кнопка вклада).
     Глобально --gold-hi трогать нельзя: на тёмно-синем хроме шапки/таббара он
     корректен (12:1), а на светлой панели нечитаем (1.3:1) — поэтому отдельный
     токен, который светлая тема подменяет тёмным акцентом (4.6–5.0:1, замерено).
     --focus: цвет индикатора фокуса; в светлой теме золото на пергаменте — 2.0:1
     при норме 3:1 для не-текста, акцент #866620 даёт 4.4:1. */
  --sel-ink: var(--gold-hi);
  --focus: var(--gold);
}
:root[data-theme="light"] {
  --sel-ink: var(--accent);
  --focus: var(--accent);
}

/* счётное — моноширинно и не «прыгает» при смене цифр */
.mono {
  font-family: var(--mono);
  font-variant-numeric: tabular-nums;
  font-size: 0.94em;
}

/* заголовок экрана, нужный скринридеру, но избыточный на глаз:
   его роль на Терминале играет строка статуса, на Полигоне — сегменты,
   а название вкладки и так подписано в таб-баре */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

/* тело TMA: не ездит вбок, дышит под шапкой и таб-баром */
body.tma {
  min-height: var(--tma-vh);
  background: var(--ground);
  color: var(--text);
  overflow-x: hidden;
  overscroll-behavior-y: none;
  padding-left: var(--sa-left);
  padding-right: var(--sa-right);
}

/* ——— Шапка ——— */
.tma-top {
  position: sticky;
  top: 0;
  z-index: 60;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-height: var(--tma-top-h);
  padding: 0.4rem var(--tma-pad);
  padding-top: calc(0.4rem + var(--sa-top));
  background: var(--deep);
  border-bottom: 1px solid var(--deep-rule);
  color: var(--deep-ink);
}
.tma-brand {
  display: inline-flex;
  align-items: baseline;
  gap: 0.45rem;
  font-family: var(--serif);
  font-weight: 600;
  font-size: 1.05rem;
  letter-spacing: 0.14em;
  color: var(--gold-hi);
  text-decoration: none;
  margin-right: auto;
  padding: 0.35rem 0.1rem;
}
.tma-brand-lab {
  font-family: var(--mono);
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  padding: 0.1rem 0.32rem;
  border: 1px solid var(--deep-rule);
  border-radius: 3px;
  color: var(--deep-dim);
}
.tma-back,
.tma-theme {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 6px;
  background: none;
  color: var(--gold-hi);
  font-size: 1.15rem;
  line-height: 1;
  cursor: pointer;
}
.tma-back:hover,
.tma-theme:hover { border-color: var(--gold); }
.tma-back[hidden] { display: none; }

/* ——— Честная плашка «песочница» ——— */
.tma-sandbox {
  padding: 0.4rem var(--tma-pad);
  background: var(--deep-2);
  border-bottom: 1px solid var(--deep-rule);
  color: var(--deep-dim);
  font-family: var(--sans);
  font-size: 0.78rem;
  line-height: 1.45;
}
.tma-sandbox strong { color: var(--gold-hi); font-weight: 600; }

/* ——— Каркас экранов ——— */
.tma-main {
  display: block;
  padding: 1rem var(--tma-pad) 2.4rem;
  /* запас под фиксированный таб-бар + safe-area */
  padding-bottom: calc(var(--tma-tab-h) + var(--sa-bottom) + 2.4rem);
  max-width: 46rem;
  margin: 0 auto;
  outline: none;
}
.screen[hidden] { display: none; }
/* инженерный тон: заголовок экрана компактнее, чем на сайте — на 390×600
   каждый лишний десяток пикселей отодвигает первое дело за сгиб */
.screen-h {
  font-size: clamp(1.3rem, 5vw, 1.8rem);
  line-height: 1.2;
  margin: 0 0 0.35rem;
}
.screen-sub {
  color: var(--text-2);
  font-size: 0.92rem;
  line-height: 1.5;
  max-width: var(--tma-measure);
  margin: 0 0 0.9rem;
}
.about-h {
  font-size: 1.2rem;
  margin: 2rem 0 0.8rem;
  padding-top: 1.2rem;
  border-top: 1px solid var(--rule);
}

/* состояние загрузки / ошибки / пустоты — честное, не тишина */
.state {
  padding: 1.1rem 1.2rem;
  border: 1px solid var(--rule);
  border-left: 3px solid var(--accent-2);
  border-radius: 6px;
  background: var(--panel);
  color: var(--text-2);
  font-size: 0.97rem;
}
.state[hidden] { display: none; }
.state.err { border-left-color: #C0705B; }
.state .state-h {
  display: block;
  font-family: var(--serif);
  font-size: 1.05rem;
  color: var(--text);
  margin-bottom: 0.35rem;
}
.state .btn { margin-top: 0.9rem; }

/* ——— Рубрики ленты (чипы-сегменты) ———
   Горизонтальный скроллер: рубрик может стать больше — строка не должна ломать
   вёрстку и не должна ездить телом страницы. */
.rubrics {
  display: flex;
  gap: 0.45rem;
  margin: 0 0 0.9rem;
  padding-bottom: 0.3rem;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  scroll-snap-type: x proximity;
  /* растушёвка правого края: видно, что строка прокручивается дальше */
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 2rem), transparent 100%);
  mask-image: linear-gradient(to right, #000 calc(100% - 2rem), transparent 100%);
}
.rubrics.at-end {
  -webkit-mask-image: none;
  mask-image: none;
}
.rubrics .chip { scroll-snap-align: start; }
.rubrics::-webkit-scrollbar { display: none; }
.rubrics[hidden] { display: none; }

.chip {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  flex: none;
  min-height: 36px;
  padding: 0.4rem 0.75rem;
  border: 1px solid var(--rule);
  border-radius: 999px;
  background: var(--panel);
  color: var(--text-2);
  font-family: var(--sans);
  font-size: 0.82rem;
  line-height: 1.2;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
}
.chip:hover { border-color: var(--accent-2); color: var(--text); }
.chip.on {
  border-color: var(--gold);
  color: var(--sel-ink);
  background: color-mix(in srgb, var(--gold) 12%, var(--panel));
}
.chip-n {
  font-size: 0.72rem;
  font-variant-numeric: tabular-nums;
  color: var(--text-dim);
}
.chip.on .chip-n { color: inherit; opacity: 0.85; }

/* номер по оси рубрики (№3) — рядом с бейджем рубрики */
.num {
  font-family: var(--sans);
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--text-dim);
  font-variant-numeric: tabular-nums;
}

/* ——— Лента протоколов ——— */
.feed {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.9rem;
}
.feed[hidden] { display: none; }
.feed-card {
  display: block;
  padding: 1.25rem 1.25rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  box-shadow: var(--shadow);
  color: inherit;
  text-decoration: none;
  transition: transform .18s ease, border-color .18s ease;
}
.feed-card:hover { transform: translateY(-2px); border-color: var(--accent-2); }
/* маркер «новое с прошлого визита» (kv.feed.seen): класс ставит app.js,
   вид целиком отсюда — точка у заголовка, разметка карточки не меняется.
   --accent в обеих темах контрастен как не-текст (5.0:1 / 8.5:1, замерено). */
.feed-card.card-new h2::before {
  content: "";
  display: inline-block;
  width: 0.5rem;
  height: 0.5rem;
  margin-right: 0.45rem;
  border-radius: 50%;
  background: var(--accent);
}
@media (prefers-reduced-motion: reduce) {
  .feed-card, .feed-card:hover { transform: none; transition: none; }
}
.feed-top {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 0.6rem;
}
.feed-card h2 {
  font-size: 1.22rem;
  line-height: 1.25;
  margin: 0 0 0.35rem;
}
.feed-sub {
  color: var(--text-2);
  font-size: 0.95rem;
  margin: 0 0 0.55rem;
}
/* Карточка — витрина, а не текст: подзаголовок и выжимка обрезаются, чтобы
   на экране помещалось несколько материалов, а не полтора. */
.feed-sub, .feed-ex {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.feed-sub { -webkit-line-clamp: 2; line-clamp: 2; }
.feed-ex {
  color: var(--text-dim);
  font-size: 0.9rem;
  margin: 0 0 0.7rem;
  -webkit-line-clamp: 3;
  line-clamp: 3;
}
.feed-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 1rem;
  font-family: var(--sans);
  font-size: 0.78rem;
  letter-spacing: 0.04em;
  color: var(--text-dim);
  font-variant-numeric: tabular-nums;
}
.feed-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem;
  margin-top: 0.7rem;
}
.tag {
  font-family: var(--sans);
  font-size: 0.72rem;
  padding: 0.2rem 0.5rem;
  border: 1px solid var(--rule);
  border-radius: 3px;
  color: var(--text-dim);
}

/* бейдж вида: mega / razbor / map */
.kind {
  font-family: var(--sans);
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding: 0.28rem 0.6rem;
  border-radius: 3px;
  border: 1px solid var(--accent-2);
  color: var(--accent);
  white-space: nowrap;
}
.kind.k-mega {
  background: linear-gradient(180deg, var(--gold-hi), var(--gold));
  border-color: var(--gold);
  color: #241a05;
}
.kind.k-map { border-style: dashed; }

/* ——— Экран разбора ——— */
.reading[hidden] { display: none; }
.reading-head { margin-bottom: 1.4rem; }
.reading-kind {
  font-family: var(--sans);
  font-size: 0.72rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent);
  margin: 0 0 0.7rem;
}
.reading-title {
  font-size: clamp(1.6rem, 6.4vw, 2.3rem);
  line-height: 1.16;
  margin: 0 0 0.6rem;
}
.reading-sub {
  font-family: var(--serif);
  font-size: 1.08rem;
  color: var(--text-2);
  margin: 0 0 0.9rem;
  max-width: var(--tma-measure);
}
.reading-meta {
  font-family: var(--sans);
  font-size: 0.82rem;
  color: var(--text-dim);
  font-variant-numeric: tabular-nums;
  margin: 0;
}

/* оглавление — липкое и сворачиваемое */
.toc {
  position: sticky;
  top: calc(var(--tma-top-h) + var(--sa-top));
  z-index: 40;
  margin: 0 0 1.8rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  box-shadow: var(--shadow);
}
.toc[hidden] { display: none; }
.toc-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.6rem;
  width: 100%;
  min-height: 44px;
  padding: 0.75rem 1rem;
  border: none;
  border-radius: 6px;
  background: none;
  color: var(--text);
  font-family: var(--sans);
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  cursor: pointer;
}
.toc-chev { color: var(--accent); transition: transform .2s ease; }
@media (prefers-reduced-motion: reduce) { .toc-chev { transition: none; } }
.toc-toggle[aria-expanded="true"] .toc-chev { transform: rotate(180deg); }
.toc-list {
  list-style: none;
  margin: 0;
  padding: 0 1rem 0.9rem;
  max-height: 46vh;
  overflow-y: auto;
  overscroll-behavior: contain;
  border-top: 1px solid var(--rule);
}
.toc-list[hidden] { display: none; }
.toc-list li { margin: 0; }
.toc-list a {
  display: block;
  padding: 0.62rem 0.2rem;
  min-height: 44px;
  color: var(--text-2);
  text-decoration: none;
  font-size: 0.95rem;
  line-height: 1.4;
  border-bottom: 1px solid var(--rule);
}
.toc-list li:last-child a { border-bottom: none; }
.toc-list a:hover { color: var(--accent); }
.toc-list .lv-3 { padding-left: 1.1rem; font-size: 0.9rem; color: var(--text-dim); }

/* тело разбора: длинная страница, комфортная мера строки */
.reading-body {
  font-size: 1.05rem;
  line-height: 1.72;
  max-width: var(--tma-measure);
}
.reading-body > * { margin: 0 0 1.05rem; }
.reading-body h2 {
  font-size: clamp(1.3rem, 5vw, 1.65rem);
  line-height: 1.25;
  margin: 2.4rem 0 0.9rem;
  padding-top: 1.2rem;
  border-top: 1px solid var(--rule);
  scroll-margin-top: calc(var(--tma-top-h) + var(--sa-top) + 4rem);
}
.reading-body h3 {
  font-size: 1.18rem;
  margin: 1.8rem 0 0.7rem;
  scroll-margin-top: calc(var(--tma-top-h) + var(--sa-top) + 4rem);
}
.reading-body p { color: var(--text); }
.reading-body ul,
.reading-body ol { padding-left: 1.3rem; }
.reading-body li { margin: 0.45rem 0; }
.reading-body strong { font-weight: 600; }
.reading-body em { font-style: italic; }
.reading-body hr { border: none; border-top: 1px solid var(--rule); margin: 2rem 0; }

/* цитата-прамана */
.reading-body blockquote {
  margin: 1.4rem 0;
  padding: 0.2rem 0 0.2rem 1.1rem;
  border-left: 2px solid var(--rule);
  color: var(--text-2);
}
.reading-body blockquote p { color: inherit; margin: 0; }

/* ссылки в теле — переносимые (на сайте .cite nowrap, здесь это ломало бы вёрстку) */
.reading-body a,
.reading-body a.cite {
  color: var(--accent);
  text-decoration: none;
  border-bottom: 1px solid var(--accent-2);
  white-space: normal;
  overflow-wrap: anywhere;
}
.reading-body a:hover { color: var(--accent-2); }

/* широкое содержимое скроллится ВНУТРИ себя — тело страницы не ездит вбок */
.reading-body pre,
.reading-body .table-scroll {
  max-width: 100%;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
}
.reading-body pre {
  padding: 0.9rem 1rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  font-size: 0.88rem;
}
.reading-body table {
  border-collapse: collapse;
  width: 100%;
  font-size: 0.92rem;
}
.reading-body th,
.reading-body td {
  padding: 0.55rem 0.7rem;
  border: 1px solid var(--rule);
  text-align: left;
  vertical-align: top;
}
.reading-body th { color: var(--text); font-weight: 600; }
.reading-body img { max-width: 100%; height: auto; border-radius: 6px; }

/* ——— Разметка генератора (.rd-*) ————————————————————————————
   ВАЖНО: имена классов — не наш выбор, а КОНТРАКТ генератора протоколов.
   Он отдаёт один и тот же HTML в TMA (data/reading/<slug>.json → .reading-body)
   и на страницу Pages (site/reading/<slug>.html). Фактическая разметка праманы:

     <blockquote class="rd-pramana">
       <p class="rd-quote">«…дословная цитата…»</p>
       <p class="rd-src">
         <a class="cite" href="…">Источник</a>
         <span class="rd-badge rd-tier rd-tier-t1">Прабхупада / первоисточник</span>
         <span class="rd-badge rd-sri">⚖️ SRI — обе линии, движок не арбитрирует</span>
       </p>
     </blockquote>

   Стили ниже ЗЕРКАЛЯТ блок .rd-* со страницы Pages (тот же вид тир-бейджа, SRI и
   пометки «пробел корпуса») — обе поверхности должны читаться одинаково.
   Чинить руками в двух местах — плохо; правильное место для .rd-* — общий
   site/styles.css (тогда один источник правды на обе поверхности), но это чужая
   зона: см. open_issues. Пока — точная копия контракта, а не свои имена классов.
   ——————————————————————————————————————————————————————————— */

/* цитата с проверяемым источником */
.reading-body .rd-pramana { border-left-color: var(--accent-2); }
/* прамана без ссылки — честный пунктир: это пробел корпуса, а не «додумали» */
.reading-body .rd-pramana-nolink { border-left-style: dotted; }
.reading-body .rd-quote {
  font-family: var(--serif);
  line-height: 1.64;
}
.reading-body .rd-src {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem;
  margin-top: 0.6rem;
  font-family: var(--sans);
  font-size: 0.82rem;
  line-height: 1.65;
  color: var(--text-dim);
}
/* .cite общей системы — nowrap (короткие сноски); у праманы источник длинный:
   разрешаем перенос, иначе тело поедет вбок */
.reading-body .rd-src .cite {
  white-space: normal;
  overflow-wrap: anywhere;
}

/* бейдж (тир / SRI) — пилюля */
.reading-body .rd-badge {
  display: inline-block;
  font-family: var(--sans);
  font-size: 0.7rem;
  line-height: 1.5;
  padding: 0.05rem 0.55rem;
  border: 1px solid var(--rule);
  border-radius: 999px;
  color: var(--text-dim);
  white-space: nowrap;
}
/* тир: Прабхупада / ачарьи линии / справочный-серый */
.reading-body .rd-tier-t1 { color: var(--accent); border-color: var(--accent-2); }
.reading-body .rd-tier-t2 { color: var(--text-2); }
.reading-body .rd-tier-grey { border-style: dashed; opacity: 0.85; }
/* ⚖️ SRI: узел, где движок не выносит вердикт (§4.8).
   Рамку НЕ выделяем золотом: на странице Pages этот бейдж живёт на --rule, и
   расхождение вида между двумя поверхностями — та же энтропия. Знак ⚖️ и текст
   бейджа уже несут сигнал. */
.reading-body .rd-sri {
  white-space: normal;
  color: var(--text-2);
}
/* пробел корпуса: ссылки нет — говорим об этом прямо */
.reading-body .rd-gap {
  font-family: var(--sans);
  font-size: 0.76rem;
  color: var(--text-dim);
  border-bottom: 1px dotted currentColor;
}

/* таблица генератора уже приходит в своей обёртке-скроллере */
.reading-body .rd-tablewrap {
  max-width: 100%;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
  margin: 0 0 1.3rem;
}
.reading-body .rd-tablewrap table { min-width: 100%; }

/* действия под разбором */
.reading-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.7rem;
  margin: 2.6rem 0 1.2rem;
  padding-top: 1.6rem;
  border-top: 1px solid var(--rule);
}
.reading-foot { font-size: 0.9rem; max-width: var(--tma-measure); }

/* ——— Заглушки Ф1: честно, без фейковых форм ——— */
.stub {
  padding: 1.5rem 1.4rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
  max-width: var(--tma-measure);
}
/* [hidden] сам по себе даёт лишь display:none низкого приоритета — .stub{display:flex}
   его перебивает. Без этой строки скрытый гейт протекает поверх формы. */
.stub[hidden] { display: none; }
.stub p { color: var(--text-2); }
.stub-badge {
  font-family: var(--sans);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--accent);
}
.stub .btn { align-self: flex-start; }
.stub code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 0.9em;
  padding: 0.1rem 0.35rem;
  border: 1px solid var(--rule);
  border-radius: 3px;
  color: var(--text);
}

/* ——— Приёмная: форма ——— */
.form {
  display: grid;
  gap: 1.6rem;
  max-width: var(--tma-measure);
}
.form[hidden] { display: none; }
.field {
  display: block;
  margin: 0;
  padding: 0;
  border: none;
}
/* ОБЯЗАТЕЛЬНО: авторский `display: block` перебивает `[hidden] { display: none }` из
   UA-стилей — без этой строки скрытое поле продолжает рисоваться. Форма вклада одна на
   все векторы и прячет лишние поля именно атрибутом hidden (ссылка — только у книг и
   дискуссий, направление — только у компетенции), так что без правила у бага
   появлялось бы поле «Ссылка на дискуссию». Тот же приём, что у .form/.panel/.state. */
.field[hidden] { display: none; }
.field-l {
  display: block;
  padding: 0;
  margin: 0 0 0.5rem;
  font-family: var(--sans);
  font-size: 0.76rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--accent);
}
.field-t {
  display: block;
  width: 100%;
  min-height: 9.5rem;
  padding: 0.9rem 1rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  color: var(--text);
  font-family: var(--serif);
  font-size: 1rem;
  line-height: 1.6;
  resize: vertical;
}
.field-t::placeholder { color: var(--text-dim); }
.field-t:focus {
  outline: none;
  border-color: var(--gold);
}
.field-h {
  margin: 0.5rem 0 0;
  font-family: var(--sans);
  font-size: 0.8rem;
  line-height: 1.5;
  color: var(--text-dim);
  font-variant-numeric: tabular-nums;
}
.field-h.warn { color: #C0705B; }
.field-h strong { color: var(--text); }

/* ——— Голосовой ввод (Deepgram через kavacham-stt; ключ — только на сервере) ———
   Три состояния, переключает app.js:
     idle — видна только кнопка «Надиктовать»;
     rec  — статус-строка с пульсом, волной-эквалайзером, таймером и «Стоп»;
     busy — та же строка со статичной точкой и текстом «распознаю…».
   Волна — чистый CSS (5 полосок), без внешних библиотек; при
   prefers-reduced-motion анимации гаснут, остаётся статичный индикатор. */
.voice {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem;
  margin-top: 0.55rem;
}
.voice[hidden] { display: none; }
.voice-mic {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  min-height: 44px;
  padding: 0.35rem 1rem;
  background: transparent;
  border: 1px solid var(--rule);
  border-radius: 999px;
  color: var(--text-2);
  font-family: var(--sans);
  font-size: 0.88rem;
  cursor: pointer;
}
.voice-mic:hover, .voice-mic:focus-visible { border-color: var(--gold); color: var(--text); }
.voice-mic[hidden] { display: none; }
.voice-status {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  flex: 1 1 100%;
  min-width: 0;
  min-height: 44px;
  padding: 0.4rem 0.45rem 0.4rem 0.8rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  font-family: var(--sans);
  font-size: 0.88rem;
  color: var(--text-2);
}
.voice-status[hidden] { display: none; }
.voice-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #C0705B;
  flex: none;
}
.voice-status.rec .voice-dot { animation: voice-dot 1.1s infinite; }
@keyframes voice-dot { 0%, 100% { opacity: 1; } 50% { opacity: 0.25; } }
.voice-eq {
  display: none;
  gap: 3px;
  align-items: flex-end;
  height: 16px;
  flex: none;
}
.voice-status.rec .voice-eq { display: inline-flex; }
/* статичные высоты — «волна» видна даже без анимации (reduced-motion) */
.voice-eq i { width: 3px; border-radius: 2px; background: var(--accent); }
.voice-eq i:nth-child(1) { height: 6px; }
.voice-eq i:nth-child(2) { height: 11px; }
.voice-eq i:nth-child(3) { height: 15px; }
.voice-eq i:nth-child(4) { height: 11px; }
.voice-eq i:nth-child(5) { height: 6px; }
.voice-status.rec .voice-eq i { animation: voice-eq 0.9s ease-in-out infinite; }
.voice-status.rec .voice-eq i:nth-child(2) { animation-delay: 0.12s; }
.voice-status.rec .voice-eq i:nth-child(3) { animation-delay: 0.24s; }
.voice-status.rec .voice-eq i:nth-child(4) { animation-delay: 0.36s; }
.voice-status.rec .voice-eq i:nth-child(5) { animation-delay: 0.48s; }
@keyframes voice-eq { 0%, 100% { height: 4px; } 50% { height: 15px; } }
.voice-text {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.voice-timer {
  margin-left: auto;
  flex: none;
  font-family: var(--mono);
  font-size: 0.82rem;
  color: var(--text-dim);
  font-variant-numeric: tabular-nums;
}
.voice-timer[hidden] { display: none; }
.voice-stop {
  flex: none;
  min-height: 34px;
  padding: 0.2rem 0.85rem;
  background: transparent;
  border: 1px solid #C0705B;
  border-radius: 999px;
  color: #C0705B;
  font-family: var(--sans);
  font-size: 0.82rem;
  font-weight: 600;
  cursor: pointer;
}
.voice-stop[hidden] { display: none; }
.voice-note { flex: 1 1 100%; }
.voice-note[hidden] { display: none; }
@media (prefers-reduced-motion: reduce) {
  .voice-status.rec .voice-dot,
  .voice-status.rec .voice-eq i { animation: none; }
}

.chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.45rem;
  margin-top: 0.7rem;
}
.chip-check input { position: absolute; opacity: 0; width: 1px; height: 1px; }
/* чекбокс внутри скрыт — рамка чипа остаётся ЕДИНСТВЕННЫМ признаком фокуса,
   поэтому не тонкая перекраска рамки, а полноценный контрастный аутлайн */
.chip-check:focus-within {
  border-color: var(--focus);
  outline: 2px solid var(--focus);
  outline-offset: 1px;
}
.chip-disabled { opacity: 0.5; cursor: not-allowed; }
#scopeState { margin-top: 0.7rem; font-size: 0.86rem; }
#scopeState[hidden] { display: none; }

/* ── Дерево корпусов: группа → книги, как в пульте песочницы ──
   Группа: стрелка-раскрытие + чекбокс (indeterminate при частичном выборе) +
   тир-бейдж + счётчик. Книги — компактные строки с чекбоксами. */
.ctree {
  display: grid;
  gap: 0.45rem;
  margin-top: 0.7rem;
}
.ctree[hidden] { display: none; }
.cg {
  border: 1px solid var(--rule);
  border-radius: 10px;
  background: var(--panel);
  overflow: hidden;
}
.cg.on { border-color: var(--accent-2); }
.cg-off { opacity: 0.55; }
.cg-head {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.45rem 0.6rem;
  min-height: 44px; /* тач-мишень */
}
.cg-arrow {
  flex: 0 0 auto;
  width: 1.7rem;
  height: 1.7rem;
  border: 0;
  background: none;
  color: var(--text-dim);
  font-size: 0.95rem;
  line-height: 1;
  cursor: pointer;
  border-radius: 7px;
}
.cg-arrow:hover { color: var(--text); background: var(--ground); }
.cg-check {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex: 1 1 auto;
  min-width: 0;
  cursor: pointer;
}
.cg-check input,
.cl input {
  accent-color: var(--gold);
  width: 1.05rem;
  height: 1.05rem;
  flex: 0 0 auto;
  margin: 0;
}
.cg-name {
  font-weight: 600;
  font-size: 0.93rem;
  overflow-wrap: anywhere;
}
.cg-meta {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  flex: 0 0 auto;
}
.cg-cnt {
  font-size: 0.76rem;
  color: var(--text-dim);
  white-space: nowrap;
}
.ctier {
  font-size: 0.66rem;
  padding: 0.14rem 0.45rem;
  border-radius: 999px;
  border: 1px solid var(--rule);
  color: var(--text-dim);
  white-space: nowrap;
}
.ctier.t-trusted { color: var(--sel-ink); border-color: var(--gold); }
.ctier.t-grey { border-style: dashed; }
.cg-kids {
  border-top: 1px dashed var(--rule);
  padding: 0.35rem 0.6rem 0.5rem 2.55rem;
  display: grid;
  gap: 0.1rem;
}
.cg-kids[hidden] { display: none; }
.cl {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.3rem 0.25rem;
  border-radius: 7px;
  cursor: pointer;
  font-size: 0.87rem;
  min-height: 36px;
}
.cl:hover { background: var(--ground); }
.cl-nm {
  flex: 1 1 auto;
  min-width: 0;
  color: var(--text-2);
  overflow-wrap: anywhere;
}
.cl input:checked ~ .cl-nm { color: var(--text); }
.cl-cnt {
  font-size: 0.74rem;
  color: var(--text-dim);
}
/* третий уровень: раскрытие супер-раздела на книги/произведения */
.cl-arrow {
  flex: 0 0 auto;
  width: 1.4rem; height: 1.4rem;
  border: 0; background: none; color: var(--text-dim);
  font-size: 0.8rem; line-height: 1; cursor: pointer; border-radius: 6px;
}
.cl-arrow:hover { color: var(--text); background: var(--ground); }
.cl-kids {
  padding: 0.15rem 0.2rem 0.3rem 2.6rem;
  display: grid; gap: 0.05rem;
}
.cl-kids[hidden] { display: none; }
.cs {
  display: flex; align-items: center; gap: 0.45rem;
  padding: 0.25rem 0.2rem; border-radius: 6px; cursor: pointer;
  font-size: 0.82rem; min-height: 32px;
}
.cs:hover { background: var(--ground); }
.cs input { accent-color: var(--gold); width: 0.95rem; height: 0.95rem; flex: 0 0 auto; margin: 0; }
.cs-nm { flex: 1 1 auto; min-width: 0; color: var(--text-2); overflow-wrap: anywhere; }
.cs-cnt { font-size: 0.72rem; color: var(--text-dim); }
/* витрина «Не разобрано»: видна, но без чекбоксов; этап разбора */
.cg-showcase .cg-name { color: var(--text-dim); }
.cl-showcase { cursor: default; opacity: 0.85; }
.cl-stage {
  font-size: 0.64rem; padding: 0.12rem 0.4rem; border-radius: 999px;
  border: 1px dashed var(--rule); color: var(--text-dim); white-space: nowrap;
}

/* провенанс до выбора: ⓘ у листа + раскрывающаяся строка издания.
   Обязан пережить max-width:420px и тач (в отличие от .ctier) — это блочные
   строки и кнопка, медиа-квери их не прячет. */
.cl-info {
  flex: 0 0 auto;
  width: 1.5rem; height: 1.5rem;
  border: 0; background: none; color: var(--text-dim);
  font-size: 0.85rem; line-height: 1; cursor: pointer; border-radius: 50%;
}
.cl-info:hover { color: var(--text); background: var(--ground); }
.cl-prov {
  font-size: 0.74rem; color: var(--text-dim); line-height: 1.5;
  padding: 0 0.25rem 0.35rem 2.6rem;
}
.cl-prov[hidden] { display: none; }
.cg-prov {
  font-size: 0.76rem; color: var(--text-dim);
  padding: 0.25rem 0.2rem 0.35rem;
  border-bottom: 1px dashed var(--rule);
  margin-bottom: 0.2rem;
}
.cs-prov { display: block; font-size: 0.68rem; color: var(--text-dim); line-height: 1.4; }

/* супер-раздел каталога («Гуру ИСККОН») и вложенные группы */
.cg-parent {
  margin: 0.35rem 0 -0.1rem;
  font-size: 0.72rem;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--text-dim);
}
.cg-child { margin-left: 0.8rem; }

/* лист операторского контура (только у главного оператора) и права на текст */
.cl-private .cl-nm { color: var(--text-dim); }
.cl-tier { font-size: 0.6rem; flex: 0 0 auto; }
.cg-rights {
  font-size: 0.76rem;
  color: var(--text-dim);
  padding: 0.25rem 0.2rem 0.35rem;
  border-bottom: 1px dashed var(--rule);
  margin-bottom: 0.2rem;
}

/* узкие экраны: бейдж тира уходит, счётчик остаётся */
@media (max-width: 420px) {
  .ctier { display: none; }
}

.switch {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  min-height: 44px;
  font-size: 0.98rem;
  color: var(--text);
  cursor: pointer;
}
.switch input {
  width: 1.15rem;
  height: 1.15rem;
  flex: none;
  accent-color: var(--gold);
}
.form-err {
  margin: 0;
  padding: 0.75rem 0.9rem;
  border: 1px solid #C0705B;
  border-radius: 6px;
  color: #C0705B;
  font-family: var(--sans);
  font-size: 0.9rem;
  line-height: 1.5;
}
.form-err[hidden] { display: none; }
/* Светлой теме — свой красный: #C0705B на светлой панели даёт 3.43:1 при норме
   4.5:1 для мелкого текста; #9A4A33 — 5.76:1 на панели, 5.13:1 на пергаменте
   (замерено). В тёмной теме #C0705B остаётся — там он проходит (4.5:1). */
:root[data-theme="light"] .form-err {
  color: #9A4A33;
  border-color: #9A4A33;
}
/* без этого дубля светлый красный перебил бы зелёное подтверждение «отложено»
   (селектор выше специфичнее, чем .form-err.is-ok; зелёный проходит: 4.78:1) */
:root[data-theme="light"] .form-err.is-ok { color: #2e7d32; }
:root[data-theme="light"] .field-h.warn { color: #9A4A33; }
:root[data-theme="light"] .state.err { border-left-color: #9A4A33; }
.form .btn-primary { justify-self: start; }
.form .btn-primary:disabled { opacity: 0.55; cursor: default; }
/* Telegram сам рисует крупное действие — экранный дубль не нужен */
body.tma-has-mainbutton .form .btn-primary { display: none; }
#submitDone[hidden] { display: none; }

/* ——— Кабинет: мои заявки ——— */
.reqs {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.9rem;
  max-width: var(--tma-measure);
}
.reqs[hidden] { display: none; }
.req {
  padding: 1.1rem 1.2rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  box-shadow: var(--shadow);
}
.req-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 0.6rem;
}
.req-n {
  font-family: var(--sans);
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--text);
  font-variant-numeric: tabular-nums;
}
.req-d {
  margin-left: auto;
  font-family: var(--sans);
  font-size: 0.76rem;
  color: var(--text-dim);
}
.req-st {
  font-family: var(--sans);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  padding: 0.2rem 0.55rem;
  border: 1px solid var(--rule);
  border-radius: 999px;
  color: var(--text-dim);
  white-space: nowrap;
}
/* Стадии (Этап 2). Смысл цвета: ждёт — приглушённо, в работе — акцент,
   опубликовано — залитое золото (тот же жест, что у главной кнопки сайта),
   отклонено — пунктир. --accent/--accent-2 переопределяются темой, --gold-hi нет:
   бледное золото текстом по светлой бумаге не читается, поэтому «Опубликовано»
   берёт золото ФОНОМ, а текст — тёмный. */
.req-st.st-queued { color: var(--text-dim); border-color: var(--rule); }
.req-st.st-scouting,
.req-st.st-verifying { color: var(--accent); border-color: var(--accent-2); }
.req-st.st-done {
  color: #241a05;
  border-color: var(--gold-lo);
  background: linear-gradient(180deg, var(--gold-hi), var(--gold));
}
.req-st.st-rejected { border-style: dashed; }
/* v6.2: черновик — пунктир без цвета (он вне очереди и вне конвейера),
   отменена — приглушённо и перечёркнуто настроением, не текстом */
.req-st.st-draft { border-style: dashed; color: var(--text-dim); }
.req-st.st-cancelled { color: var(--text-dim); opacity: 0.75; }
/* заявка в руках движка или человека — видно по карточке, не только по бейджу */
.req.is-work { border-left: 2px solid var(--accent-2); }

/* v6.2: кнопки управления в карточке заявки */
.req-actions { display: flex; gap: 0.5rem; margin-top: 0.6rem; }
.mini-danger:hover { border-color: #c0392b; color: #c0392b; }

/* v6.2: чипы-шаблоны над полем ввода + табы кабинета */
.qm-chips { margin: 0 0 0.55rem; }
.mine-tabs { margin: 0 0 0.8rem; }

/* v6.2: кнопки формы в ряд; подтверждение «отложено» — зелёным, это не ошибка */
.form-actions { display: flex; flex-wrap: wrap; gap: 0.6rem; align-items: center; }
.form-err.is-ok { color: #2e7d32; }
.req-t {
  margin: 0 0 0.6rem;
  color: var(--text-2);
  font-size: 0.98rem;
  line-height: 1.6;
  overflow-wrap: anywhere;
}
.req-f {
  margin: 0.5rem 0 0;
  font-family: var(--sans);
  font-size: 0.8rem;
  line-height: 1.5;
  color: var(--text-dim);
  font-variant-numeric: tabular-nums;
}
.req .btn { margin-top: 0.9rem; }

/* ——— Конвейер стадий: пройдено · сейчас · предстоит ———
   Компактная вертикальная лента (экран 390×600): маркер | стадия | дата.
   Дата — моноширинно и tabular-nums, чтобы столбец не «плясал». */
.pipe {
  list-style: none;
  margin: 0.9rem 0 0.2rem;
  padding: 0.7rem 0 0.1rem;
  border-top: 1px solid var(--rule);
}
.pipe-s {
  display: grid;
  grid-template-columns: 1.05rem minmax(0, 1fr) auto;
  align-items: baseline;
  gap: 0.5rem;
  padding: 0.16rem 0;
}
.pipe-m {
  font-family: var(--mono);
  font-size: 0.78rem;
  line-height: 1.4;
  text-align: center;
  color: var(--text-dim);
}
.pipe-l {
  font-family: var(--sans);
  font-size: 0.84rem;
  line-height: 1.4;
  color: var(--text-dim);
  overflow-wrap: anywhere;
}
.pipe-d {
  font-size: 0.74rem;
  color: var(--text-dim);
  white-space: nowrap;
}
/* пройдено — факт, спокойный тон */
.pipe-s.is-past .pipe-m { color: var(--accent-2); }
.pipe-s.is-past .pipe-l { color: var(--text-2); }
/* сейчас — единственная выделенная строка */
.pipe-s.is-now .pipe-m { color: var(--accent); }
.pipe-s.is-now .pipe-l { color: var(--text); font-weight: 600; }
.pipe-s.is-now .pipe-d { color: var(--accent); }
/* предстоит — маршрут, а не обещание: тускло и без даты */
.pipe-s.is-next .pipe-m,
.pipe-s.is-next .pipe-l { opacity: 0.62; }

/* ——— О проекте ——— */
.about-p {
  color: var(--text-2);
  max-width: var(--tma-measure);
  margin: 0 0 1rem;
}
.about-cta { margin: -0.2rem 0 1.4rem; }

/* ——— Контрол сортировки списков (лента, лог, «Мои испытания»…) ——— */
.sortbar {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 0.75rem;
}
.sortctl-l {
  font-size: 0.76rem;
  color: var(--text-dim);
  white-space: nowrap;
}
.sortctl-s {
  font-family: var(--sans);
  font-size: 0.82rem;
  color: var(--text);
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 8px;
  padding: 0.32rem 0.5rem;
  max-width: 62vw;
  cursor: pointer;
}
.sortctl-s:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
body.tma .sortctl-s { min-height: 36px; }

/* ——— «Доверенный контур»: read-only дерево (тот же источник, что corpus.html) ——— */
.corp-tree { margin: 0 0 1.1rem; }
.rc-parent {
  margin: 1.5rem 0 0.5rem;
  font-family: var(--serif);
  font-size: 0.8rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-dim);
}
.rc-g { padding: 0.8rem 0; border-top: 1px solid var(--rule); }
.rc-g:first-child { border-top: 0; }
.rc-child { padding-left: 0.75rem; }
.rc-head { display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap; }
.rc-name { font-weight: 600; color: var(--text); }
.rc-cnt { margin-left: auto; font-size: 0.8rem; color: var(--text-dim); white-space: nowrap; }
.rc-sub { margin: 0.35rem 0 0; font-size: 0.84rem; line-height: 1.5; color: var(--text-2); }
.rc-src { margin: 0.3rem 0 0; font-size: 0.78rem; color: var(--text-dim); }
/* провенанс каталога «Доверенный контур» — паритет 3 поверхностей */
.rc-prov { margin: 0.3rem 0 0; font-size: 0.78rem; color: var(--sel-ink, var(--text-dim)); opacity: 0.85; }
.rc-bprov { display: block; font-size: 0.7rem; color: var(--text-dim); line-height: 1.45; margin-top: 0.1rem; }
.rc-books { list-style: none; margin: 0.5rem 0 0; padding: 0; }
.rc-book {
  display: flex;
  align-items: baseline;
  gap: 0.4rem;
  padding: 0.28rem 0;
  font-size: 0.9rem;
  color: var(--text-2);
}
.rc-bname { overflow-wrap: anywhere; }
.rc-bcnt { margin-left: auto; font-size: 0.78rem; color: var(--text-dim); white-space: nowrap; }
.rc-stage { font-size: 0.74rem; color: var(--text-dim); border-bottom: 1px dotted currentColor; }
.rc-work { width: 100%; }
.rc-work > summary {
  display: flex;
  align-items: baseline;
  gap: 0.4rem;
  cursor: pointer;
  list-style: none;
  padding: 0.28rem 0;
}
.rc-work > summary::-webkit-details-marker { display: none; }
.rc-work > summary::before { content: "▸"; color: var(--text-dim); font-size: 0.8rem; }
.rc-work[open] > summary::before { content: "▾"; }
.rc-subbooks { margin: 0.15rem 0 0.4rem 1rem; }
.rc-showcase { opacity: 0.92; }
.rc-showcase .rc-name { color: var(--text-dim); }
.rc-upd { display: block; margin-top: 0.4rem; font-size: 0.74rem; color: var(--text-dim); }
body.tma .rc-work > summary { min-height: 32px; }
.about-q {
  margin: 1.2rem 0 1.2rem;
  padding: 0.2rem 0 0.2rem 1.1rem;
  border-left: 2px solid var(--accent-2);
  max-width: var(--tma-measure);
}
.about-q p {
  margin: 0;
  font-family: var(--serif);
  color: var(--text-2);
  line-height: 1.65;
}
.about-src {
  margin-top: 0.55rem !important;
  font-family: var(--sans) !important;
  font-size: 0.84rem;
}
.about-src .cite {
  white-space: normal;
  overflow-wrap: anywhere;
  color: var(--accent);
}

.principles,
.links-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.9rem;
  max-width: var(--tma-measure);
}
.principles li {
  padding-left: 1rem;
  border-left: 2px solid var(--gold);
  color: var(--text-2);
}
.principles strong { color: var(--text); }
.links-list li {
  padding: 0.6rem 0;
  border-bottom: 1px solid var(--rule);
  color: var(--text-dim);
  font-size: 0.95rem;
}
.about-note {
  margin-top: 2rem;
  padding: 1rem 1.1rem;
  border: 1px dashed var(--rule);
  border-radius: 6px;
  color: var(--text-dim);
  font-size: 0.92rem;
  max-width: var(--tma-measure);
}

/* ——— Подвал: единая подпись ——— */
.tma-footer {
  padding: 1.8rem var(--tma-pad);
  padding-bottom: calc(var(--tma-tab-h) + var(--sa-bottom) + 1.8rem);
  border-top: 1px solid var(--rule);
  text-align: center;
}
.tma-footer .sig {
  font-family: var(--sans);
  font-size: 0.7rem;
  letter-spacing: 0.22em;
  color: var(--text-dim);
}

/* ——— Таб-бар ——— */
.tabbar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 70;
  display: grid;
  /* колонки — по числу ВИДИМЫХ вкладок: пятая («Штаб») появляется только у админа,
     скрытая вкладка не должна оставлять пустую колонку */
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  background: var(--deep);
  border-top: 1px solid var(--deep-rule);
  padding-bottom: var(--sa-bottom);
  padding-left: var(--sa-left);
  padding-right: var(--sa-right);
}
.tab {
  /* якорь для абсолютного счётчика «новое» (.bell-n) на табе Полигона */
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.15rem;
  min-height: var(--tma-tab-h);
  padding: 0.4rem 0.2rem;
  text-decoration: none;
  color: var(--deep-dim);
  font-family: var(--sans);
  font-size: 0.68rem;
  letter-spacing: 0.04em;
  border-top: 2px solid transparent;
}
/* Вторая строка таба — назначение по-русски («подать заявку», «читать разборы»):
   бренд-имя вкладки само по себе не отвечает новичку «что здесь делать».
   nowrap+ellipsis: длинная подпись не разваливает колонку узкого экрана. */
.tab-sub {
  display: block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 0.58rem;
  line-height: 1.25;
  letter-spacing: 0.02em;
  opacity: 0.85;
}
/* совсем узкий экран (5 табов у оператора): подпись прячем, имя остаётся */
@media (max-width: 340px) {
  .tab-sub { display: none; }
}
/* Глифы — не эмодзи: моноширинный стек, чтобы «▶_» держался как единый знак,
   и одинаковая высота строки, чтобы разноширокие символы не плясали по базовой. */
.tab-i {
  font-family: var(--mono);
  font-size: 1rem;
  line-height: 1;
  letter-spacing: -0.04em;
}
.tab:hover { color: var(--deep-ink); }
.tab[aria-current="page"] {
  color: var(--gold-hi);
  border-top-color: var(--gold);
}

/* ——— Кнопки: ghost на светлом фоне протоколов (на сайте он рассчитан на тёмную полосу) ——— */
body.tma .btn { font-size: 0.95rem; min-height: 44px; cursor: pointer; }
body.tma .btn-ghost {
  color: var(--text);
  border-color: var(--rule);
  background: transparent;
}
body.tma .btn-ghost:hover { border-color: var(--gold); }
@media (prefers-reduced-motion: reduce) {
  body.tma .btn:hover { transform: none; }
}

/* ——— Тост (короткое подтверждение действия) ——— */
.tma-toast {
  position: fixed;
  left: 50%;
  bottom: calc(var(--tma-tab-h) + var(--sa-bottom) + 1rem);
  z-index: 90;
  transform: translate(-50%, 0.6rem);
  max-width: min(92vw, 24rem);
  padding: 0.7rem 1.1rem;
  border-radius: 6px;
  background: var(--deep-2);
  border: 1px solid var(--deep-rule);
  color: var(--deep-ink);
  font-family: var(--sans);
  font-size: 0.9rem;
  text-align: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity .2s ease, transform .2s ease;
}
.tma-toast.on { opacity: 1; transform: translate(-50%, 0); }
@media (prefers-reduced-motion: reduce) {
  .tma-toast { transition: opacity .2s ease; transform: translate(-50%, 0); }
}

/* когда Telegram сам рисует MainButton — наш дубль на экране разбора не нужен */
body.tma-has-mainbutton .reading-actions .btn-primary { display: none; }

/* ——— Мягкая синхронизация фона с клиентом Telegram (ведущая — наша палитра) ——— */
body.tma-in-telegram .tma-top,
body.tma-in-telegram .tabbar {
  /* оставляем брендовый navy: интеграция — по теме (dark/light), не по чужому цвету */
  background: var(--deep);
}

/* ════════════════════════════════════════════════════════════════════
   ЭТАП 1 — новые узлы: Терминал, сегменты Полигона, SRI, корпуса,
   Обогащение. Палитра и гарнитуры — те же; меняется только плотность.
   ════════════════════════════════════════════════════════════════════ */

/* ——— Терминал: строка статуса оператора ——— */
.ops {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.3rem 0.9rem;
  margin: 0 0 0.9rem;
  padding: 0.5rem 0.75rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-left: 3px solid var(--gold);
  border-radius: 6px;
  font-family: var(--mono);
  font-size: 0.76rem;
  line-height: 1.35;
  font-variant-numeric: tabular-nums;
}
.ops-c {
  display: inline-flex;
  align-items: baseline;
  gap: 0.35rem;
  min-width: 0;
}
.ops-k {
  color: var(--text-dim);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.ops-v {
  color: var(--text);
  font-weight: 600;
  max-width: 14ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ops-warn .ops-v { color: var(--accent); }

/* ——— Терминал: главное действие ——— */
.cta {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  width: 100%;
  min-height: 56px;
  padding: 0.9rem 1rem;
  border: 1px solid var(--gold);
  border-radius: 6px;
  background: linear-gradient(180deg, var(--gold-hi), var(--gold));
  color: #241a05;
  font-family: var(--sans);
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: filter .18s ease;
}
.cta:hover { filter: brightness(1.06); }
.cta:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.cta-br {
  font-family: var(--mono);
  font-weight: 400;
  opacity: 0.6;
}
.cta.on {
  background: transparent;
  color: var(--text);
  border-color: var(--rule);
}
.cta.on .cta-br { opacity: 0.45; }
@media (prefers-reduced-motion: reduce) {
  .cta { transition: none; }
  .cta:hover { filter: none; }
}
.cta-h {
  margin: 0.55rem 0 1.4rem;
  color: var(--text-dim);
  font-family: var(--sans);
  font-size: 0.86rem;
  line-height: 1.5;
  max-width: var(--tma-measure);
}

/* панель заявки (раскрывается кнопкой) */
.panel {
  margin: 0 0 1.6rem;
  scroll-margin-top: calc(var(--tma-top-h) + var(--sa-top) + 0.6rem);
}
.panel[hidden] { display: none; }

/* «Векторы Лаборатории» — свёрнуты по умолчанию: не заслоняют поле ввода */
.vectors {
  margin: 0 0 1.4rem;
  padding: 0 1rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  max-width: var(--tma-measure);
}
.vectors > summary {
  min-height: 44px;
  display: flex;
  align-items: center;
  margin: 0 -1rem;
  padding: 0.7rem 1rem;
  font-family: var(--sans);
  font-size: 0.86rem;
  font-weight: 600;
  color: var(--text);
  cursor: pointer;
  list-style: none;
}
.vectors > summary::-webkit-details-marker { display: none; }
.vectors > summary::before {
  content: '▸';
  margin-right: 0.5rem;
  color: var(--accent);
  transition: transform .18s ease;
  display: inline-block;
}
.vectors[open] > summary::before { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) {
  .vectors > summary::before { transition: none; }
}
.vec-list {
  list-style: none;
  margin: 0;
  padding: 0 0 1rem;
  border-top: 1px solid var(--rule);
  display: grid;
  gap: 0.7rem;
}
.vec-list li {
  padding-top: 0.7rem;
  color: var(--text-2);
  font-size: 0.92rem;
  line-height: 1.5;
}
.vec-list strong { color: var(--text); }

/* ——— Блок экрана («Мои испытания») ——— */
.block {
  margin-top: 2rem;
  padding-top: 1.4rem;
  border-top: 1px solid var(--rule);
  scroll-margin-top: calc(var(--tma-top-h) + var(--sa-top) + 0.6rem);
}
.block-top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.8rem;
  margin-bottom: 0.9rem;
}
.block-h {
  margin: 0;
  font-size: 1.2rem;
  line-height: 1.2;
}
.mini {
  flex: none;
  min-height: 32px;
  padding: 0.3rem 0.6rem;
  border: 1px solid var(--rule);
  border-radius: 4px;
  background: transparent;
  color: var(--text-dim);
  font-family: var(--mono);
  font-size: 0.72rem;
  cursor: pointer;
}
.mini:hover { border-color: var(--gold); color: var(--text); }
.mini[hidden] { display: none; }

/* сноска-честность: чего в данных НЕТ и почему мы это не рисуем */
.foot-note {
  margin: 1rem 0 0;
  color: var(--text-dim);
  font-family: var(--sans);
  font-size: 0.82rem;
  line-height: 1.55;
  max-width: var(--tma-measure);
}
.foot-note b { color: var(--text-2); font-weight: 600; }
.tag-warn {
  display: inline-block;
  margin-right: 0.4rem;
  padding: 0.1rem 0.45rem;
  border: 1px dashed var(--rule);
  border-radius: 3px;
  font-family: var(--mono);
  font-size: 0.7rem;
  color: var(--accent);
  white-space: nowrap;
}

/* ——— Полигон: сегментированный контрол ——— */
.seg {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2px;
  margin: 0 0 0.9rem;
  padding: 2px;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
}
.seg-b {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  min-height: 44px;
  padding: 0.35rem 0.3rem;
  /* прозрачная рамка держит габарит: иначе активный сегмент «подрастал» на 2px
     и соседи ёрзали при каждом переключении */
  border: 1px solid transparent;
  border-radius: 4px;
  color: var(--text-2);
  font-family: var(--sans);
  font-size: 0.78rem;
  line-height: 1.22;
  text-decoration: none;
  cursor: pointer;
}
.seg-b:hover { color: var(--text); }
.seg-b[aria-current="true"] {
  background: color-mix(in srgb, var(--gold) 14%, var(--panel));
  border-color: var(--gold);
  color: var(--gold-hi);
  font-weight: 600;
}
/* на пергаменте светлое золото нечитаемо — берём тёмный акцент той же палитры */
:root[data-theme="light"] .seg-b[aria-current="true"] { color: var(--accent); }
.pane[hidden] { display: none; }
.pane-sub {
  margin: 0 0 1rem;
  color: var(--text-2);
  font-size: 0.92rem;
  line-height: 1.5;
  max-width: var(--tma-measure);
}
.pane-links {
  margin: 1.2rem 0 0;
  color: var(--text-dim);
  font-size: 0.9rem;
  line-height: 1.55;
  max-width: var(--tma-measure);
}

/* ——— Полигон Б: дисклеймер SRI (движок не арбитрирует) ——— */
.disclaimer {
  margin: 0 0 1.1rem;
  padding: 0.9rem 1rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-left: 3px solid var(--accent-2);
  border-radius: 6px;
  color: var(--text-2);
  font-size: 0.92rem;
  line-height: 1.55;
  max-width: var(--tma-measure);
}
.disclaimer b { color: var(--text); font-weight: 600; }
#pane-sri .btn { margin-top: 1.2rem; }

/* ——— Полигон В: объём ядра и корпуса ——— */
.kpi {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.45rem;
  margin: 0 0 0.9rem;
  padding: 0.75rem 1rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-left: 3px solid var(--gold);
  border-radius: 6px;
}
.kpi-l {
  font-family: var(--mono);
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--text-dim);
}
.kpi-v {
  font-size: 1.35rem;
  font-weight: 600;
  color: var(--gold-hi);
}
:root[data-theme="light"] .kpi-v { color: var(--accent); }
.kpi-u {
  font-family: var(--sans);
  font-size: 0.86rem;
  color: var(--text-2);
}

.corp {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.6rem;
  max-width: var(--tma-measure);
}
.corp[hidden] { display: none; }
.corp-i {
  padding: 0.85rem 1rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
}
.corp-top {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 0.35rem;
}
.corp-t {
  margin: 0;
  margin-right: auto;
  font-family: var(--serif);
  font-size: 1rem;
  color: var(--text);
}
.corp-b {
  flex: none;
  padding: 0.15rem 0.5rem;
  border: 1px solid var(--rule);
  border-radius: 999px;
  font-family: var(--mono);
  font-size: 0.66rem;
  letter-spacing: 0.04em;
  color: var(--text-dim);
  white-space: nowrap;
}
.corp-b.b-base { color: var(--gold-hi); border-color: var(--gold); }
:root[data-theme="light"] .corp-b.b-base { color: var(--accent); }
.corp-b.b-off { border-style: dashed; opacity: 0.8; }
.corp-h {
  margin: 0;
  color: var(--text-dim);
  font-size: 0.86rem;
  line-height: 1.5;
}

/* ——— Обогащение ——— */
.notice {
  margin: 0 0 1.4rem;
  padding: 0.9rem 1rem;
  border: 1px dashed var(--gold);
  border-radius: 6px;
  background: color-mix(in srgb, var(--gold) 7%, var(--panel));
  color: var(--text-2);
  font-size: 0.9rem;
  line-height: 1.55;
  max-width: var(--tma-measure);
}
.notice b { color: var(--text); font-weight: 600; }

.enr {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.9rem;
  max-width: var(--tma-measure);
}
.enr-c {
  padding: 1.1rem 1.2rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  box-shadow: var(--shadow);
}
.enr-k {
  margin: 0 0 0.35rem;
  font-family: var(--mono);
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--accent);
}
.enr-h {
  margin: 0 0 0.55rem;
  font-size: 1.15rem;
  line-height: 1.25;
}
.enr-p {
  margin: 0 0 0.7rem;
  color: var(--text-2);
  font-size: 0.94rem;
  line-height: 1.6;
}
.enr-p .cite { color: var(--accent); white-space: normal; }
.enr-a {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-top: 0.9rem;
}
.enr-a .btn { flex: 1 1 auto; justify-content: center; }
/* раскрытый вектор: кнопка держит состояние — иначе на 390 px не понять,
   какая из шести карточек породила форму, что уехала под неё */
.enr-a .btn.on {
  border-color: var(--gold);
  color: var(--sel-ink);
  background: color-mix(in srgb, var(--gold) 10%, transparent);
}
.enr-n {
  margin: 0.8rem 0 0;
  color: var(--text-dim);
  font-family: var(--sans);
  font-size: 0.8rem;
  line-height: 1.5;
}
.enr-n code {
  font-family: var(--mono);
  font-size: 0.94em;
  color: var(--accent);
  white-space: nowrap;
}

/* Форма вклада: одна на все векторы, переезжает в раскрытую карточку.
   Внутри карточки у неё уже есть паддинги — отделяем только линией сверху. */
.enr-panel {
  margin: 1.1rem 0 0;
  padding-top: 1.1rem;
  border-top: 1px solid var(--rule);
}
.enr-panel .form { gap: 1.25rem; }
.enr-panel .enr-a { margin-top: 0; }
.enr-panel .state { margin: 0; }

/* Однострочные поля формы (ссылка) и выпадающий список (направление).
   Наследуют вид .field-t — разница только в высоте и в стрелке селекта. */
.field-i,
.field-s {
  display: block;
  width: 100%;
  min-height: 44px;                 /* палец, а не курсор: не меньше 44 px */
  padding: 0.72rem 0.9rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 6px;
  color: var(--text);
  font-family: var(--sans);
  font-size: 1rem;                  /* < 16px = iOS зумит страницу на фокусе */
  line-height: 1.4;
}
.field-i::placeholder { color: var(--text-dim); }
.field-i:focus,
.field-s:focus {
  outline: none;
  border-color: var(--gold);
}
.field-s {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 2.2rem;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
                    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 1.05rem center, right 0.75rem center;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
  cursor: pointer;
}

/* статус, которого мы не знаем: показываем ключ сервера как есть */
.req-st.st-unknown {
  border-style: dotted;
  font-family: var(--mono);
  text-transform: none;
}

/* ════════════════════════════════════════════════════════════════════
   v6.0 — теги-фильтры, «Штаб», исследовательский режим.
   ════════════════════════════════════════════════════════════════════ */

/* скрытая вкладка (Штаб до ответа /api/me) не занимает колонку таб-бара */
.tab[hidden] { display: none; }

/* ——— Теги: кликабельные ———
   Тег на карточке — НЕ ссылка (карточка сама <a>), а span с ролью link:
   вид тот же, но по ховеру/фокусу видно, что он живой. */
.tag-go { cursor: pointer; }
.tag-go:hover,
.tag-go:focus-visible {
  border-color: var(--gold);
  color: var(--text);
}
/* фокус — контрастным токеном, а не «золотой рамкой»: рамка в светлой теме
   давала 2.2:1 при норме 3:1 (глобальный outline здесь раньше был снят вовсе) */
.tag-go:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
/* Тап-цель: сам чип ~27px при собственном стандарте 44px («палец, а не курсор»).
   Невидимая зона поверх — вид не меняется, а промах по тегу перестаёт
   проваливаться в карточку-ссылку под ним. Лёгкое перекрытие соседних тегов —
   осознанная цена: тап между двумя тегами всё равно осмысленнее, чем «мимо». */
.tag-go { position: relative; }
.tag-go::after {
  content: "";
  position: absolute;
  inset: -10px -6px;
}

/* строка активного тег-фильтра над лентой */
.tag-filter {
  display: flex;
  flex-wrap: wrap;
  gap: 0.45rem;
  margin: 0 0 0.9rem;
}
.tag-filter[hidden] { display: none; }
.tag-chip .tag-x {
  font-size: 0.78rem;
  opacity: 0.8;
}

/* теги на экране разбора — под метаданными шапки */
.reading-tags { margin-top: 0.7rem; }
.reading-tags[hidden] { display: none; }

/* ——— Исследовательский режим: пометка на форме ——— */
.research-note {
  margin: 0.7rem 0 0;
  padding: 0.6rem 0.8rem;
  border: 1px dashed var(--gold);
  border-radius: 6px;
  background: color-mix(in srgb, var(--gold) 7%, var(--panel));
  color: var(--text-2);
  font-family: var(--sans);
  font-size: 0.82rem;
  line-height: 1.5;
}
.research-note[hidden] { display: none; }
.research-note strong { color: var(--text); }
/* флаг режима в карточке заявки (Мои испытания / Штаб) */
.research-flag { color: var(--accent); }

/* ——— Штаб ——— */
#hqBody[hidden] { display: none; }

/* Гамбургер-навигация по блокам Штаба: кнопка в строке заголовка, меню —
   компактный выпадающий список якорей под ней. Только токены темы
   (панель/линейки/золото) — светлая и тёмная работают сами. */
.hq-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.8rem;
}
.hq-nav { position: relative; flex: none; }
.hq-nav[hidden] { display: none; }
.hq-nav-btn {
  min-width: 36px;
  min-height: 36px;
  padding: 0.25rem 0.55rem;
  border: 1px solid var(--rule);
  border-radius: 6px;
  background: var(--panel);
  color: var(--text-2);
  font-size: 1.05rem;
  line-height: 1;
  cursor: pointer;
}
.hq-nav-btn:hover { border-color: var(--gold); color: var(--text); }
.hq-nav-btn:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
.hq-nav-btn[aria-expanded="true"] { border-color: var(--gold); color: var(--gold-hi); }
.hq-nav-menu {
  position: absolute;
  top: calc(100% + 0.35rem);
  right: 0;
  z-index: 40; /* над контентом экрана, ПОД шапкой (у неё 60) */
  min-width: 13.5rem;
  max-width: min(16rem, calc(100vw - 2 * var(--tma-pad)));
  margin: 0;
  padding: 0.3rem;
  list-style: none;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-radius: 8px;
  box-shadow: var(--shadow);
}
.hq-nav-menu[hidden] { display: none; }
.hq-nav-item {
  display: block;
  width: 100%;
  padding: 0.55rem 0.7rem;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--text-2);
  font-family: var(--sans);
  font-size: 0.9rem;
  line-height: 1.3;
  text-align: left;
  white-space: nowrap;
  cursor: pointer;
}
.hq-nav-item:hover,
.hq-nav-item:focus-visible {
  background: color-mix(in srgb, var(--gold) 12%, var(--panel));
  color: var(--text);
}

/* Сводка — не .block (без своего scroll-margin), а гамбургер к ней скроллит:
   тот же отступ под фикс-шапку, что у .block */
.hq-stats { scroll-margin-top: calc(var(--tma-top-h) + var(--sa-top) + 0.6rem); }
.hq-stats {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.1rem;
  margin: 0 0 1.2rem;
  padding: 0.7rem 0.9rem;
  background: var(--panel);
  border: 1px solid var(--rule);
  border-left: 3px solid var(--gold);
  border-radius: 6px;
  font-family: var(--sans);
  font-size: 0.82rem;
  color: var(--text-2);
}
.hq-c {
  display: inline-flex;
  align-items: baseline;
  gap: 0.4rem;
}
.hq-k {
  font-family: var(--mono);
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-dim);
}
.hq-v { color: var(--text); font-weight: 600; }

.hq-meta { margin-top: 0; overflow-wrap: anywhere; }

/* текст заявки/вклада: свёрнут в 2 строки, тап разворачивает */
.hq-clip {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  cursor: pointer;
}
.hq-clip.open {
  display: block;
  -webkit-line-clamp: none;
  line-clamp: none;
}

/* длинная ссылка обязана ПЕРЕНОСИТЬСЯ: nowrap задавал карточке min-content шире
   экрана 390 px, и весь Штаб уезжал вбок */
.hq-url {
  display: block;
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
  color: var(--accent);
  font-size: 0.84rem;
}

.hq-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-top: 0.9rem;
  padding-top: 0.9rem;
  border-top: 1px solid var(--rule);
}
.hq-actions .btn { margin-top: 0; }
.hq-url-row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  flex: 1 1 100%;
}
.hq-url-inp { flex: 1 1 12rem; min-width: 0; }
.hq-url-row .btn { flex: none; }
.hq-reject { border-color: #C0705B; color: #C0705B; }
.hq-reject:hover { border-color: #C0705B; filter: brightness(1.1); }
.hq-err { margin-top: 0.7rem; }
/* умный переспрос заявителю (не выводит заявку из очереди) */
.hq-ask-row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  flex: 1 1 100%;
  align-items: flex-start;
}
.hq-ask-inp { flex: 1 1 12rem; min-width: 0; resize: vertical; }
.hq-ask-row .btn { flex: none; }
.hq-await { color: #B07A2E; font-weight: 600; }
.hq-err[hidden] { display: none; }

/* ═══ Лог событий и доски (v6.3) ═══════════════════════════════════ */

/* конверт в шапке: та же кнопка, что тема, + позиционный якорь для счётчика */
.tma-bell { position: relative; }
.bell-n {
  position: absolute;
  top: 0.1rem;
  right: 0.05rem;
  min-width: 1rem;
  padding: 0 0.2rem;
  border-radius: 0.5rem;
  background: var(--accent);
  color: var(--ground);
  font-family: var(--mono);
  font-size: 0.62rem;
  line-height: 1rem;
  text-align: center;
}
.bell-n[hidden] { display: none; }
/* тот же счётчик на табе Полигона («новое в ленте»): таб шире кнопки-конверта,
   поэтому бейдж прижимаем не к углу, а к правому плечу глифа по центру */
.tab .bell-n {
  top: 0.3rem;
  right: calc(50% - 1.7rem);
}

/* лента сообщений */
.msgs { list-style: none; margin: 0 0 1.4rem; padding: 0; }
.msg {
  border: 1px solid var(--rule);
  border-radius: 0.6rem;
  padding: 0.7rem 0.85rem;
  margin-top: 0.6rem;
  background: var(--panel);
}
.msg-mine { border-style: dashed; opacity: 0.92; }
.msg-new { border-color: var(--accent); }
.msg-meta { margin: 0 0 0.3rem; font-size: 0.72rem; opacity: 0.75; overflow-wrap: anywhere; }
.msg-t { margin: 0 0 0.4rem; white-space: pre-wrap; overflow-wrap: anywhere; }
.msg-link { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; overflow-wrap: anywhere; }
.msg-link:hover { color: var(--gold-hi); }
/* Свёрнутый длинный текст лога: 3 строки, по тапу — раскрыть. */
.msg-t.clamp { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; cursor: pointer; }
.msg-t.clamp.open { -webkit-line-clamp: unset; display: block; }
.msg-more { display: inline-block; margin: -0.1rem 0 0.4rem; padding: 0.1rem 0; font: inherit; font-size: 0.75rem; color: var(--accent); background: none; border: 0; cursor: pointer; }
.msg .mini { margin-top: 0.1rem; }

/* канбан: колонки в горизонтальном скролле — простыня из 4 колонок
   в столбик на 390 px читалась бы хуже очереди в сберкассе */
.kb-h { margin: 1.2rem 0 0.5rem; font-size: 0.95rem; }
.kb {
  display: flex;
  gap: 0.6rem;
  overflow-x: auto;
  padding-bottom: 0.6rem;
  -webkit-overflow-scrolling: touch;
}
.kb-col {
  flex: 0 0 14rem;
  min-width: 0;
  border: 1px solid var(--rule);
  border-radius: 0.6rem;
  padding: 0.6rem;
  background: var(--panel);
}
.kb-col-h { margin: 0 0 0.5rem; font-size: 0.72rem; opacity: 0.75; }
.kb-card {
  border: 1px solid var(--rule);
  border-radius: 0.5rem;
  padding: 0.5rem 0.6rem;
  margin-top: 0.45rem;
  font-size: 0.84rem;
  overflow-wrap: anywhere;
}
.kb-card:first-of-type { margin-top: 0; }
.kb-mine { border-color: var(--accent); }
.kb-kind { margin: 0; font-size: 0.7rem; opacity: 0.75; }
.kb-text { margin: 0.25rem 0 0; }
.kb-date { margin: 0.25rem 0 0; font-size: 0.72rem; opacity: 0.6; }
.kb-card .cite { display: inline-block; margin-top: 0.3rem; font-size: 0.8rem; }

/* форма личного ответа в консоли Штаба */
.hq-reply { margin-top: 0.7rem; padding-top: 0.7rem; border-top: 1px solid var(--rule); }
.hq-reply .field-t { width: 100%; }
.hq-reply .btn { margin-top: 0.5rem; }

/* ═══ Аккордеон ступеней + компактные подсказки (v6.4) ═════════════ */

/* стрелка на чипе «Учебный узел»: поворот при раскрытии */
.chip-chev { display: inline-block; margin-left: 0.2rem; transition: transform 0.18s ease; }
.chip.expanded .chip-chev { transform: rotate(180deg); }

/* вложенный ряд ступеней: анимация раскрытия + визуальная вложенность */
.qm-edu {
  margin-left: 0.8rem;
  padding-left: 0.7rem;
  border-left: 2px solid var(--rule);
  opacity: 0;
  transform: translateY(-0.3rem);
  transition: opacity 0.18s ease, transform 0.18s ease;
}
.qm-edu.open { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .qm-edu, .chip-chev { transition: none; }
}

/* счётчик + инфо-кнопка одной строкой */
.counter-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.6rem;
  flex-wrap: wrap;
}
.info-btn {
  border: 0;
  background: none;
  padding: 0;
  color: var(--accent);
  font: inherit;
  font-size: 0.8rem;
  cursor: pointer;
  text-decoration: underline;
  text-decoration-style: dotted;
}
.field-info {
  border: 1px solid var(--rule);
  border-radius: 0.6rem;
  padding: 0.15rem 0.85rem;
  margin-top: 0.4rem;
  background: var(--panel);
}
.field-info p { font-size: 0.82rem; opacity: 0.85; margin: 0.6rem 0; }
.field-info[hidden] { display: none; }

.vec-note { font-size: 0.82rem; opacity: 0.8; margin: 0.6rem 0 0; }

/* капкан [hidden] против display:flex — тот же, что у .stub/.field:
   авторский .chips { display:flex } сильнее UA-правила [hidden] */
.qm-edu[hidden] { display: none; }

/* пульт оператора на досках (v6.4) */
.kb-card { position: relative; }
.kb-hide { position: absolute; top: 0.3rem; right: 0.3rem; padding: 0 0.35rem; }
.kb-card > span { display: block; padding-right: 1.6rem; }
.kb-hidden { flex: 1 1 100%; margin-top: 0.4rem; }
.kb-hidden-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  margin: 0.3rem 0;
  font-size: 0.8rem;
  opacity: 0.85;
}

/* селектор глубины поиска (ТЗ «Мега-разборы») */
.depth-range { width: 100%; margin: 0.5rem 0 0.6rem; accent-color: var(--accent); }
.depth-presets { margin-bottom: 0.3rem; }
