@font-face {
  font-family: "Futura PT";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Book.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 400;
}

@font-face {
  font-family: "Futura PT";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Medium.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 500;
}

@font-face {
  font-family: "Futura PT";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Demi.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 600;
}

@font-face {
  font-family: "Futura PT";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Bold.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 700;
}

@font-face {
  font-family: "Futura PT";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Heavy.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 800;
}

@font-face {
  font-family: "Futura PT";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Extra%20Bold.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 900;
}

@font-face {
  font-family: "Futura PT Condensed";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Cond%20Medium.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 500;
}

@font-face {
  font-family: "Futura PT Condensed";
  src: url("/miniapp/fonts/Futura_PT/Futura%20PT%20Cond%20Bold.ttf") format("truetype");
  font-display: swap;
  font-style: normal;
  font-weight: 700;
}
:root {
  /* Палитра своя, а не из темы Telegram.
     Пока цвета приходили из `--tg-theme-*`, в тёмной теме клиента экран
     разъезжался: фон и текст брались у Telegram, а зелёный статус, тени и
     подложки оставались светлыми. Один набор цветов на всех — и макет
     выглядит одинаково у владельца и у нас.

     Тёмный вариант ниже — тоже свой, а не возвращение `--tg-theme-*`: от
     клиента берётся только сам факт «тема тёмная», цвета остаются наши, и
     разъехаться им не на чем. */
  color-scheme: light;
  --bg: #f2f4f8;
  --surface: #ffffff;
  --text: #17212b;
  /* Две роли одного серого разведены. `--muted` красит текст, и на фоне --bg
     при 13px он должен брать порог WCAG AA: прежние #707579 давали 4,23:1 при
     нужных 4,5:1, а этим цветом набрана половина объяснений в приложении.
     `--muted-line` остался светлым — он для границ и иконок, где порог другой. */
  --muted: #5b6166;
  --muted-line: #707579;
  --link: #2481cc;
  --button: #2ea6ff;
  --button-text: #ffffff;
  --danger: #df3f40;
  --success: #2a9d63;
  --warning: #d88a18;
  --border: color-mix(in srgb, var(--muted-line) 24%, transparent);
  --shadow: 0 8px 30px rgba(0, 0, 0, 0.08);
  --font-sans: "Futura PT", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-condensed: "Futura PT Condensed", "Futura PT", system-ui, sans-serif;

  /* Spacing scale. Every padding and gap below comes from here, so the
     whole Mini App keeps one rhythm instead of drifting per screen. */
  --space-1: 4px;
  --space-2: 6px;
  --space-3: 8px;
  --space-4: 10px;
  --space-5: 12px;
  --space-6: 14px;
  --space-7: 20px;

  --gutter: var(--space-6); /* page side padding */
  --nav-clearance: 96px; /* room the fixed bottom nav needs */
  --pad-card: var(--space-6); /* surface sitting on the page background */
  --pad-inset: var(--space-5); /* surface nested inside a card */
  --pad-control: var(--space-4) var(--space-5);

  --gap-stack: var(--space-5); /* blocks stacked in a view or a card */
  --gap-list: var(--space-4); /* items of a list */
  --gap-inline: var(--space-3); /* buttons and chips side by side */
  --gap-tight: var(--space-2); /* label to control, icon to text */
  --gap-micro: var(--space-1); /* title to subtitle */

  /* Radius scale. Одно скругление на все прямоугольные коробки: карточки,
     панели, поля, кнопки, плитки, шторка, нижнее меню. До этого рядом на
     одном экране стояли 8, 12, 14, 16, 18 и 20 — глазу читалось как брак
     вёрстки, а не как замысел.

     Исключений ровно два, и оба про форму, а не про радиус:
     --radius-pill  — элементы, круглые геометрически: квадрат, ставший
                      кругом (главная кнопка, аватарки, иконки плиток,
                      кнопки в шапке), тонкие полосы прогресса, тумблер.
                      Чипы и сегментные переключатели сюда не входят: это
                      прямоугольники с текстом, и они берут общий радиус —
                      при высоте до 32px он и так скругляет их по торцам;
     --radius-sm    — мелочь ниже ~40px (бейджи, тултипы, иконочные кнопки,
                      код в тексте) и вложенное в общий радиус (вариант
                      внутри сегментного переключателя): там общее
                      скругление съедает форму целиком. */
  --radius: 16px;
  --radius-sm: 8px;
  --radius-pill: 999px;

  font-family: var(--font-sans);
}

/**
 * Тёмная тема: тот же набор переменных, другие значения. Класс ставит скрипт
 * по `tg.colorScheme`, поэтому у владельца с тёмным Telegram приложение больше
 * не открывается вспышкой белого.
 *
 * Переопределяем только цвета — отступы, радиусы и шрифты общие, иначе две
 * темы начали бы расходиться по вёрстке, а не только по палитре.
 */
:root.theme-dark {
  color-scheme: dark;
  --bg: #12171d;
  --surface: #1b222b;
  --text: #e7edf4;
  --muted: #9aa7b4;
  --muted-line: #7b8794;
  --link: #62b0f0;
  --button: #2ea6ff;
  --button-text: #0b1116;
  --danger: #f0736f;
  --success: #4cbd84;
  --warning: #e2a33c;
  --shadow: 0 8px 30px rgba(0, 0, 0, 0.45);
}

* {
  box-sizing: border-box;
}

[hidden] {
  display: none !important;
}

html,
body {
  height: 100%;
  margin: 0;
  background: var(--bg);
  color: var(--text);
  letter-spacing: 0;
}

html {
  overflow: hidden;
  overscroll-behavior: none;
}

/* iOS отдаёт вертикальный жест нативному WebView, если скроллится сам
   документ: экран пружинит и ловит swipe-to-dismiss. Поэтому body
   зафиксирован по высоте вьюпорта, а скроллится только .scroll-root. */
body {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: var(--app-height, 100%);
  overflow: hidden;
  overscroll-behavior: none;
  padding: 0;
}

.scroll-root {
  height: 100%;
  overflow-y: auto;
  overflow-x: hidden;
  overscroll-behavior-y: contain;
  padding:
    max(var(--gutter), env(safe-area-inset-top))
    var(--gutter)
    calc(var(--nav-clearance) + env(safe-area-inset-bottom));
}

/* В переписке нижнего меню нет, а поле ответа прижато к самому краю: запас под
   меню оставил бы под ним полосу пустоты, в которую упирается липкое поле. */
body.chat-open .scroll-root {
  padding-bottom: 0;
}

/* Контент всегда чуть выше вьюпорта: без запаса прокрутки iOS считает
   жест «нечего скроллить» и снова тянет весь WebView. */
.scroll-root > .app {
  min-height: calc(100% + 1px);
}

body.scroll-locked .scroll-root {
  overflow: hidden;
}

button,
input,
textarea {
  font: inherit;
}

/* align-content: start — иначе запас высоты из .scroll-root (нужный iOS для
   перехвата жеста) растягивает строки грида, и на коротких подэкранах между
   панелью и кнопкой сохранения зияет дыра. */
.app {
  width: min(100%, 760px);
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-content: start;
  gap: var(--gap-stack);
}

.view {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--gap-stack);
  align-content: start;
  /* Элемент грида по умолчанию не сжимается уже своего содержимого, и любая
     широкая строка — лента разделов, ряд вкладок — растягивала экран вместо
     того, чтобы прокручиваться внутри себя. Тому, что помещается, это ничего
     не меняет. */
  min-width: 0;
}

.view > section {
  min-width: 0;
}

.view[hidden] {
  display: none;
}

/* Подстраницы заворачивают содержимое в обычный <section>: без этого
   заголовок, панели и списки внутри стояли бы вплотную друг к другу,
   пока экраны «База» и «Документы» получали ритм от .view. */
.view > section:not(.panel):not(.field-panel),
.stack {
  display: grid;
  /* Колонка объявлена явно: у неявной колонка растёт по содержимому, и широкая
     строка внутри — лента разделов, ряд вкладок — раздвигала экран вместо того,
     чтобы прокручиваться внутри себя. */
  grid-template-columns: minmax(0, 1fr);
  gap: var(--gap-stack);
  align-content: start;
}

.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-inline);
  min-height: 44px;
}

.brand {
  display: flex;
  align-items: center;
  gap: var(--gap-tight);
  min-width: 0;
  flex: 1 1 auto;
}

.topbar-actions {
  display: flex;
  align-items: center;
  gap: var(--gap-tight);
  flex: 0 0 auto;
}

/* Не .icon-button: это имя уже занято красной кнопкой удаления в списке
   документов, и она объявлена ниже по файлу. */
.topbar-button {
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: var(--radius-pill);
  padding: 0;
  background: transparent;
  color: var(--link);
  cursor: pointer;
  display: grid;
  place-items: center;
}

.topbar-button svg {
  width: 24px;
  height: 24px;
  stroke-width: 2;
}

.topbar-button:active {
  background: color-mix(in srgb, var(--button) 12%, transparent);
}

.topbar-button {
  position: relative;
}

/* Счётчик новых ответов. Сидит на иконке, а не строкой рядом: в шапке нет
   места под подпись, а кружок с числом читается одним взглядом. */
.topbar-badge {
  position: absolute;
  top: 2px;
  right: 0;
  min-width: 18px;
  height: 18px;
  border-radius: var(--radius);
  padding: 0 5px;
  background: var(--danger);
  color: #ffffff;
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 800;
  line-height: 18px;
  text-align: center;
  pointer-events: none;
}

/* Главный экран: шапка и карточка аккаунта прижаты к краям, круг забирает
   всё, что осталось между ними.

   Высота — ровно видимая область: из вьюпорта вычтены собственные отступы
   .scroll-root, теми же выражениями (max, safe-area). Разойдись формулы —
   экран станет выше области, и появится прокрутка на пустом месте. */
.home-view {
  min-height: calc(
    var(--app-height, 100vh)
    - max(var(--gutter), env(safe-area-inset-top))
    - var(--nav-clearance) - env(safe-area-inset-bottom)
  );
  grid-template-rows: auto auto 1fr auto;
  align-content: stretch;
}

.profile-picker {
  width: 100%;
  min-height: 56px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-control);
  background: var(--surface);
  color: var(--text);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-inline);
  font-family: inherit;
  font-size: 15px;
  font-weight: 700;
  text-align: left;
}

.profile-picker-value {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.profile-picker-caret {
  width: 20px;
  height: 20px;
  stroke-width: 2;
  color: var(--muted);
  flex: 0 0 auto;
}

.profile-picker:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}

.pulse {
  display: grid;
  justify-items: center;
  align-content: center;
  gap: var(--gap-list);
  /* Мягкая подложка вместо карты мира: тот же эффект «экран дышит», но без
     картинки на 200 килобайт. */
  background:
    radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--button) 7%, transparent),
    transparent 62%);
}

/* Сцена размером ровно в капсулу: нити центрируются по ней, а не по .pulse,
   где ниже лежат статус и метрика и центр уезжает вниз. */
.pulse-stage {
  position: relative;
  display: grid;
  place-items: center;
}

/* Квадрат заведомо шире экрана: нити начинаются за его краями и обрезаются
   вьюпортом — поэтому читаются как приходящие снаружи, а не нарисованные
   внутри рамки. 14 отрезков, никаких path-данных.

   Окно 600×600 вырезано из середины исходной сетки 1200×1200 (viewBox сдвинут,
   масштаб 1:1). Дальше 276 единиц от центра маска гасит нити в ноль, так что
   отрезанное всё равно не видно, зато коробка перестала свисать на две сотни
   пикселей ниже экрана — абсолютный блок этой высоты добавлялся в область
   прокрутки, и главная скроллилась вниз по пустоте. */
.pulse-threads {
  position: absolute;
  top: 50%;
  left: 50%;
  /* Ниже всей вёрстки: без отрицательного слоя абсолютный SVG рисуется поверх
     соседей по гриду — и нити проходят по карточке профиля и по шапке. */
  z-index: -1;
  width: 600px;
  height: 600px;
  transform: translate(-50%, -50%);
  pointer-events: none;
  overflow: hidden;
}

.pulse-threads-body line,
.pulse-threads-spark line {
  stroke-width: 0.75;
  stroke-linecap: butt;
  vector-effect: non-scaling-stroke;
}

.pulse-threads-body {
  stroke: var(--text);
  opacity: 0.07;
  transform-origin: 600px 600px;
  transition: opacity 0.4s ease-out, transform 0.4s ease-out;
}

/* Пока не подключено — нити отходят от капсулы. Масштаб от центра вместо
   второй геометрии: концы у нитей на разной высоте, и одним пунктиром их
   ровно не обрезать. */
.pulse-stage.offline .pulse-threads-body {
  opacity: 0.05;
  transform: scale(1.32);
}

.pulse-stage.paused .pulse-threads-body {
  opacity: 0.04;
}

.pulse-threads-spark line {
  stroke: var(--success);
  stroke-width: 1.6;
  stroke-dasharray: 7 100;
  opacity: 0;
}

@media (prefers-reduced-motion: no-preference) {
  .pulse-stage.live .pulse-threads-spark line {
    animation: thread-spark 15s linear infinite;
  }
}

@keyframes thread-spark {
  0% {
    stroke-dashoffset: 0;
    opacity: 0;
  }

  2% {
    opacity: 0.5;
  }

  10% {
    stroke-dashoffset: -100;
    opacity: 0.5;
  }

  13% {
    stroke-dashoffset: -100;
    opacity: 0;
  }

  100% {
    stroke-dashoffset: -100;
    opacity: 0;
  }
}

.pulse-dial {
  position: relative;
  z-index: 1;
  /* Размер переменными: та же капсула стоит и на экране разговора, где она
     меньше. Значения по умолчанию — те, что были у главной кнопки. */
  width: var(--pulse-size, 208px);
  height: var(--pulse-size, 208px);
  border: 0;
  border-radius: var(--radius-pill);
  padding: 0;
  background: transparent;
  cursor: pointer;
  display: grid;
  place-items: center;
  /* Android-браузеры подсвечивают тап прямоугольником по габаритам кнопки —
     вокруг круглой капсулы он выглядит голубым квадратом. Отклик на нажатие
     кнопка рисует сама, просадкой капсулы. */
  -webkit-tap-highlight-color: transparent;
  -webkit-touch-callout: none;
  user-select: none;
  -webkit-user-select: none;
}

.pulse-dial:disabled {
  cursor: not-allowed;
}

/* Клавиатурная навигация видит фокус на самой капсуле, а не на прямоугольнике
   кнопки: обводка повторяет круг. */
.pulse-dial:focus-visible {
  outline: none;
}

.pulse-dial:focus-visible .pulse-face {
  box-shadow:
    0 0 0 3px color-mix(in srgb, var(--button) 45%, transparent),
    0 12px 34px rgba(0, 0, 0, 0.1);
}

/* ---- Living Vapor Core -------------------------------------------------
   Круг — стеклянная капсула с «живым паром» внутри: сам пар, ядро, вихрь и
   частицы рисует WebGL-шейдер (vaporCore.js). CSS отвечает за стекло, мягкую
   внешнюю подсветку и логотип. Никаких бегущих колец и ripple-эффектов —
   всё движение живёт внутри капсулы. */

/* Мягкая внешняя подсветка: статичное пятно света, просачивающегося из
   капсулы наружу. */
.pulse-aura {
  position: absolute;
  inset: -4%;
  border-radius: var(--radius-pill);
  background: radial-gradient(
    circle,
    color-mix(in srgb, var(--muted-line) 16%, transparent) 48%,
    transparent 70%
  );
  opacity: 0.6;
  transform: scale(1);
  /* Тот же ease-out, что и у тени капсулы: подсветка раскрывается наружу
     заодно с ней, иначе на отпускании они расходятся по времени и эффект
     распадается на два движения. */
  transition:
    background 0.6s ease,
    opacity 0.34s cubic-bezier(0.16, 0.84, 0.44, 1),
    transform 0.34s cubic-bezier(0.16, 0.84, 0.44, 1);
  pointer-events: none;
}

/* Нажатие: подсветка втягивается под капсулу и гаснет. */
.pulse-dial:active:not(:disabled) .pulse-aura,
.pulse-dial.pressed .pulse-aura {
  opacity: 0;
  transform: scale(0.78);
  transition-timing-function: cubic-bezier(0.55, 0, 0.85, 0.35);
  transition-duration: 0.26s;
}

/* Подсветка нейтральна во всех состояниях и различается только силой: цвет
   в кнопке ровно один и живёт внутри капсулы, полосой у стекла. Зелёный
   ободок снаружи спорил с серым паром — свечение без источника внутри. */
.pulse-dial.live .pulse-aura {
  background: radial-gradient(
    circle,
    color-mix(in srgb, var(--muted-line) 26%, transparent) 46%,
    transparent 72%
  );
  opacity: 0.9;
}

/* Импульс на стекле: когда пар впервые дошёл до стенки, свет снаружи на
   мгновение вспыхивает — класс impact ставит рендерер на ~200 мс. */
.pulse-dial.impact .pulse-aura {
  opacity: 1;
  transition-duration: 0.12s;
}

/* Стеклянная капсула: глубина собрана из блика сверху и лёгкой тени у нижней
   стенки. Обрезки нет: пар выходит за стенку ореолом и растворяется, и
   именно поэтому у кнопки не остаётся видимой границы. */
.pulse-face {
  position: relative;
  width: var(--pulse-face-size, 156px);
  height: var(--pulse-face-size, 156px);
  border-radius: var(--radius-pill);
  background: var(--surface);
  display: grid;
  place-items: center;
  /* Обводки нет намеренно: тонкая статичная линия по краю живого пара
     читалась как нарисованный контур поверх него. Форму капсулы держат тень
     под ней и блик сверху, а кромку — свечение изнутри. */
  box-shadow:
    0 12px 34px rgba(0, 0, 0, 0.1),
    inset 0 1px 0 rgba(255, 255, 255, 0.55),
    inset 0 -14px 28px rgba(23, 33, 43, 0.06);
  transform: scale(1);
  /* Кривые входа и выхода разные намеренно. Отпускание — ease-out: тень
     раскрывается из-под капсулы наружу, будто она снова приподнялась.
     Нажатие переопределяет тайминг на ease-in ниже. */
  transition:
    transform 0.22s cubic-bezier(0.16, 0.84, 0.44, 1),
    background 0.6s ease,
    box-shadow 0.34s cubic-bezier(0.16, 0.84, 0.44, 1);
}

/* Нажатие. :active даёт мгновенный отклик на палец — в том числе там, где
   рендерер сжатие не запускает (кнопка ведёт на подключение Telegram, WebGL
   недоступен). Класс pressed приходит от рендерера и держит просадку дольше,
   пока летит запрос, отпуская её ровно к вспышке ядра. */
.pulse-dial:active:not(:disabled) .pulse-face {
  transform: scale(0.955);
}

.pulse-dial.pressed .pulse-face {
  transform: scale(0.97);
}

/* Тень не просто слабеет, а стягивается под капсулу и гаснет: смещение и
   размытие уходят в ноль вместе с прозрачностью. Ease-in — тень уползает к
   центру с ускорением, обратный ход у неё в базовом правиле. */
.pulse-dial:active:not(:disabled) .pulse-face,
.pulse-dial.pressed .pulse-face {
  box-shadow:
    0 0 0 rgba(0, 0, 0, 0),
    inset 0 1px 0 rgba(255, 255, 255, 0.5),
    inset 0 -10px 22px rgba(23, 33, 43, 0.07);
  transition-timing-function: cubic-bezier(0.55, 0, 0.85, 0.35);
  transition-duration: 0.26s;
}

.theme-dark .pulse-dial:active:not(:disabled) .pulse-face,
.theme-dark .pulse-dial.pressed .pulse-face {
  box-shadow:
    0 0 0 rgba(0, 0, 0, 0),
    inset 0 1px 0 rgba(255, 255, 255, 0.06),
    inset 0 -10px 22px rgba(0, 0, 0, 0.3);
}

/* Тень — признак покоя. Пока ассистент отвечает, капсула не лежит на
   поверхности, а светится сама, и тень под ней ей только мешает: она
   схлопывается при нажатии и обратно уже не раскрывается. Обратный ход —
   на выключении, когда состояние возвращается к паузе.

   Между отпусканием пальца и приходом класса live тень не успевает мигнуть:
   всё это время держится класс pressed, который рендерер снимает в том же
   кадре, где появляется live.

   Заодно снимается подложка: на сглаженном крае круга она смешивалась с
   краем канваса, и по границе заполненной капсулы шла светлая полоса. Под
   паром подложке всё равно нечего показывать. */
.pulse-dial.live .pulse-face {
  background: transparent;
  box-shadow:
    0 0 0 rgba(0, 0, 0, 0),
    inset 0 1px 0 rgba(255, 255, 255, 0.55),
    inset 0 -14px 28px rgba(23, 33, 43, 0.06);
}

.theme-dark .pulse-dial.live .pulse-face {
  box-shadow:
    0 0 0 rgba(0, 0, 0, 0),
    inset 0 1px 0 rgba(255, 255, 255, 0.07),
    inset 0 -14px 28px rgba(0, 0, 0, 0.25);
}

/* Удар пара в стекло: подсветка изнутри, тени по-прежнему нет. */
.pulse-dial.impact .pulse-face {
  box-shadow:
    0 0 0 rgba(0, 0, 0, 0),
    inset 0 1px 0 rgba(255, 255, 255, 0.55),
    inset 0 0 26px color-mix(in srgb, var(--button) 24%, transparent);
  transition-duration: 0.12s;
}

.theme-dark .pulse-dial.impact .pulse-face {
  box-shadow:
    0 0 0 rgba(0, 0, 0, 0),
    inset 0 1px 0 rgba(255, 255, 255, 0.07),
    inset 0 0 26px color-mix(in srgb, var(--button) 30%, transparent);
}

.theme-dark .pulse-face {
  box-shadow:
    0 12px 34px rgba(0, 0, 0, 0.35),
    inset 0 1px 0 rgba(255, 255, 255, 0.07),
    inset 0 -14px 28px rgba(0, 0, 0, 0.25);
}

/* Парное правило к .impact: без него светлый блик (0.55) из общего правила
   перебивал бы тёмный (0.07) по специфичности и стекло на вспышке белело. */
.theme-dark .pulse-dial.impact .pulse-face {
  box-shadow:
    0 12px 34px rgba(0, 0, 0, 0.35),
    inset 0 1px 0 rgba(255, 255, 255, 0.07),
    inset 0 0 26px color-mix(in srgb, var(--success) 30%, transparent);
}

/* Канвас с паром занимает всю капсулу; круглую форму держат и border-radius,
   и маска в самом шейдере. */
/* Канвас в полтора раза шире капсулы, и обрезки у него нет: пар доходит до
   стенки в полную плотность и дальше растворяется ореолом. Любая обрезка —
   хоть по border-radius, хоть маской — оставляла на сглаженном краю смесь
   пара с фоном, и та читалась тонкой светлой полосой по контуру кнопки.
   Доля капсулы в ширине канваса продублирована в vaporCore.js (CANVAS_EDGE). */
.pulse-vapor {
  position: absolute;
  inset: -10%;
  width: 120%;
  height: 120%;
  pointer-events: none;
}

.pulse-dial.vapor-fallback .pulse-vapor {
  display: none;
}

/* Блик стекла поверх пара: статичный, объём капсулы читается даже у спящего
   реактора. */
.pulse-gloss {
  position: absolute;
  inset: 0;
  border-radius: var(--radius-pill);
  background:
    radial-gradient(90% 60% at 30% 16%, rgba(255, 255, 255, 0.5), transparent 55%),
    radial-gradient(130% 90% at 50% 118%, rgba(23, 33, 43, 0.08), transparent 58%);
  opacity: 0.8;
  pointer-events: none;
}

.theme-dark .pulse-gloss {
  background:
    radial-gradient(90% 60% at 30% 16%, rgba(255, 255, 255, 0.1), transparent 55%),
    radial-gradient(130% 90% at 50% 118%, rgba(0, 0, 0, 0.28), transparent 58%);
}

/* Знак — одна литера, без подложки и без заливки: только штрих. Плашка
   закрывала центр капсулы, где рождается и схлопывается ядро, и меняла
   видимый вес между пустой и заполненной капсулой. Штрих тоньше и тише, пар
   виден сквозь него, а состояние показывают сам пар и полоса у стекла. */
.pulse-mark {
  position: relative;
  /* Пропорция — из самой литеры (viewBox 7328×11165), а не квадрат. */
  height: 62px;
  width: 41px;
  /* Знак отделяется от пара тенью цвета самой капсулы, а не собственной
     плашкой: на плотном тумане серая литера иначе тонет, а подложка вернула
     бы «наклейку». */
  filter: drop-shadow(0 0 5px var(--surface));
}

.pulse-mark path {
  fill: var(--muted-line);
  opacity: 0.62;
  transition: opacity 0.45s ease;
}

/* В тёмной теме пар светлее фона, и знак цвета --muted-line сливался бы с
   ним в один тон. Здесь знак работает наоборот — тёмным силуэтом: он темнее
   пара на заполненной капсуле и светлее стекла на пустой. */
.theme-dark .pulse-mark path {
  fill: color-mix(in srgb, var(--muted-line) 45%, var(--surface));
  opacity: 0.92;
}

/* Без подключения знак уходит в полутон: капсула не просто пуста — она ещё
   и не подключена к источнику. */
.pulse-dial.offline .pulse-mark path {
  opacity: 0.3;
}

/* Разомкнутое кольцо — форма, а не оттенок: единственное, что отличает «не
   подключено» от «на паузе» на одинаково пустой капсуле. Штрихи крупные, с
   разрывами, поворот на четверть ставит первый разрыв сбоку, а не сверху. */
.pulse-break {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  transform: rotate(-90deg);
  opacity: 0;
  transition: opacity 0.4s ease;
  pointer-events: none;
}

.pulse-break circle {
  fill: none;
  stroke: var(--warning);
  stroke-width: 2;
  stroke-linecap: round;
  stroke-dasharray: 34 26;
  opacity: 0.75;
}

.pulse-dial.offline .pulse-break {
  opacity: 1;
}

.pulse-status {
  font-size: 17px;
  font-weight: 800;
  line-height: 1.2;
}

.pulse-metric {
  display: flex;
  align-items: center;
  gap: var(--gap-tight);
  color: var(--muted);
  font-size: 13px;
  font-weight: 700;
}

.pulse-metric svg {
  width: 17px;
  height: 17px;
  stroke-width: 2;
}

.pulse-metric.exhausted {
  color: var(--danger);
}

/* Раздел «Сообщения»: один список диалогов. */
/*
  Уведомления на устройство. Стоит панелью над списком, а не строкой в нём:
  список — это разговоры, и настройка среди них читалась бы как первый диалог.
  Внутри Telegram строка скрыта, там уведомляет сам бот.
*/
.push-notices-row {
  min-height: 56px;
}

.push-notices-label {
  display: grid;
  gap: var(--gap-micro);
  font-size: 14px;
}

.messages-panel {
  display: grid;
  gap: var(--gap-list);
  align-content: start;
  min-height: 0;
}

/**
 * Список чатов, а не лента карточек.
 *
 * Раньше каждый ответ занимал карточку с двумя облачками во весь экран: за
 * тремя обменами не было видно, сколько вообще диалогов, и найти нужный можно
 * было только прокруткой. Строка на два ряда текста показывает десяток сразу —
 * а сам разговор целиком открывается на своей странице.
 */
.chat-list {
  display: grid;
  gap: var(--space-2);
}

.chat-row {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  width: 100%;
  min-width: 0;
  padding: var(--space-3) var(--space-2);
  border: 0;
  border-radius: var(--radius);
  background: transparent;
  color: var(--text);
  text-align: left;
  font-family: inherit;
  cursor: pointer;
}

.chat-row:active {
  background: color-mix(in srgb, var(--muted-line) 14%, transparent);
}

.chat-list > .chat-row {
  border-bottom: 1px solid var(--border);
  border-radius: 0;
}

.chat-list > .chat-row:last-child {
  border-bottom: 0;
}

/*
  Строка ленты тревог. Заимствовать .chat-row нельзя: он раскладывает
  содержимое в ряд под аватарку и подпись, а здесь нет ни того, ни другого —
  заголовок уезжал в левый столбец, а текст растекался рядом с ним.
*/
/* Возврат к списку тем: строка над перепиской, а не кнопка в шапке —
   так же, как выходят из диалога в мессенджере. */
/* Блок починки под тревогой: кнопка и одна строка о том, что произойдёт.
   Предупреждение стоит рядом, а не в отдельном окне подтверждения — читают
   его именно в момент нажатия. */
.feed-action {
  display: grid;
  gap: 6px;
  margin-top: var(--space-3);
  justify-items: start;
}

.feed-action-button {
  padding: 8px 14px;
  font-size: 14px;
}

.feed-action-note {
  /* Ответ приходит абзацами: без переносов он слипается в одну строку,
     где не видно ни результата, ни того, что делать дальше. */
  white-space: pre-wrap;
  color: var(--muted-line);
  font-size: 13px;
  line-height: 1.4;
}

.feed-back {
  display: block;
  width: 100%;
  padding: var(--space-3) var(--space-2);
  border: 0;
  border-bottom: 1px solid var(--border);
  background: transparent;
  color: var(--link);
  font: inherit;
  text-align: left;
  cursor: pointer;
}

.feed-row {
  display: grid;
  gap: 2px;
  padding: var(--space-3) var(--space-2);
  border-bottom: 1px solid var(--border);
}

.feed-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--gap-inline);
}

.feed-title {
  font-weight: 600;
  min-width: 0;
}

/* Идущая авария выделена цветом: закрытая — это уже история, и звать к ней
   так же настойчиво незачем. */
.feed-row.firing .feed-title {
  color: var(--danger, #d93025);
}

.feed-time {
  flex: 0 0 auto;
  font-size: 12px;
  color: var(--muted-line);
}

.feed-text {
  white-space: pre-wrap;
  font-size: 14px;
  line-height: 1.45;
  color: var(--text);
}

.chat-row-avatar {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--button) 18%, var(--surface));
  color: var(--link);
  font-family: var(--font-condensed);
  font-size: 14px;
  font-weight: 800;
}

.chat-row-body {
  flex: 1 1 auto;
  display: grid;
  gap: 2px;
  min-width: 0;
}

.chat-row-head {
  display: flex;
  align-items: baseline;
  gap: var(--gap-tight);
  min-width: 0;
}

.chat-row-name {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 14px;
  font-weight: 800;
}

.chat-row-tag {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--muted);
  font-size: 11px;
}

.chat-row-time {
  flex: 0 0 auto;
  margin-left: auto;
  color: var(--muted);
  font-size: 12px;
}

/* Одна строка превью: две уже спорят с соседними чатами за внимание, а сам
   текст целиком читается на странице диалога. */
.chat-row-preview {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--muted);
  font-size: 13px;
}

/**
 * Подпись «Черновик» в строке диалога.
 *
 * Строка с ждущим черновиком стоит первой в списке, но одного порядка мало:
 * сверху может оказаться и просто самый свежий ответ. Подпись говорит, что эта
 * реплика ещё не ушла и решение за владельцем, — а само решение принимается на
 * странице чата, где виден полный текст.
 */
.chat-row-badge {
  justify-self: start;
  border-radius: var(--radius-sm);
  padding: 1px var(--space-1);
  background: color-mix(in srgb, var(--warning) 16%, transparent);
  color: var(--warning);
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 800;
}

/* Текст неотправленного ответа читается как обычная реплика, но не как уже
   случившееся: приглушать его наравне с историей значило бы прятать ровно то,
   ради чего в диалог и заходят. */
.chat-row.has-draft .chat-row-preview {
  color: var(--text);
}

.draft-actions,
.reply-entry-actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--gap-tight);
  padding: 0 var(--space-2);
}

.reply-action {
  min-height: 32px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 0 var(--pad-inset);
  background: var(--bg);
  color: var(--link);
  font-family: var(--font-condensed);
  font-size: 13px;
  font-weight: 800;
  cursor: pointer;
}

/* Отправка необратима, поэтому она и выглядит иначе, чем «переписать»:
   перепутать её с соседней кнопкой стоит дороже всего на экране. */
.reply-action.primary {
  border-color: var(--button);
  background: var(--button);
  color: var(--button-text);
}

.reply-action:active {
  background: color-mix(in srgb, var(--button) 12%, transparent);
}

.reply-action:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Решение по черновику — ряд значков, а не ряд слов. Семь подписей вставали в
   три строки и хоронили под собой сам ответ; значки помещаются в одну. */
.reply-icon-action {
  position: relative;
  width: 36px;
  height: 36px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--bg);
  color: var(--link);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: border-color 0.16s ease, background 0.16s ease;
}

.reply-icon-action svg {
  width: 18px;
  height: 18px;
  stroke-width: 2;
}

/* Отправка необратима, поэтому она и выглядит иначе, чем «переписать»:
   перепутать её с соседней кнопкой стоит дороже всего на экране. */
.reply-icon-action.primary {
  border-color: var(--button);
  background: var(--button);
  color: var(--button-text);
}

.reply-icon-action:active {
  background: color-mix(in srgb, var(--button) 12%, transparent);
}

.reply-icon-action:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Подсказка та же, что у кнопок в шапке: без неё ряд значков — ребус. */
.reply-icon-action[data-tooltip]::after,
.chat-open-telegram[data-tooltip]::after {
  content: attr(data-tooltip);
  position: absolute;
  left: 50%;
  bottom: calc(100% + 8px);
  z-index: 40;
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--text) 92%, transparent);
  color: var(--bg);
  box-shadow: var(--shadow);
  font-family: var(--font-condensed);
  font-size: 12px;
  font-weight: 700;
  line-height: 1.25;
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transform: translate(-50%, 4px);
  transition: opacity 0.14s ease, transform 0.14s ease;
}

.reply-icon-action[data-tooltip]:hover::after,
.reply-icon-action[data-tooltip]:focus-visible::after,
.chat-open-telegram[data-tooltip]:hover::after,
.chat-open-telegram[data-tooltip]:focus-visible::after {
  opacity: 1;
  transform: translate(-50%, 0);
}

.chat-list-empty {
  border: 1px dashed var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  text-align: center;
}

/* Страница одного диалога: переписка, значок Telegram у имени и карточки
   черновиков.

   Значок, а не полоса «Открыть в Telegram» во всю ширину: открывают переписку в
   Telegram изредка, а полосу приходилось перешагивать взглядом на каждом заходе
   в разговор. Фона у значка нет — он стоит в строке с именем и не должен
   выглядеть вторым заголовком. */
/* «Сохранить как есть» и «Причесать» — два разных исхода одной правки, поэтому
   стоят друг под другом, а не в ряд: в ряд они читались бы как «отмена» и
   «ок». */
.own-draft-actions {
  display: grid;
  gap: var(--gap-tight);
}

.chat-thread-heading {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  min-width: 0;
}

.chat-open-telegram {
  position: relative;
  flex: 0 0 auto;
  display: inline-grid;
  place-items: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--link);
  cursor: pointer;
}

.chat-open-telegram svg {
  width: 20px;
  height: 20px;
}

.chat-thread {
  display: grid;
  gap: var(--gap-tight);
  align-content: start;
}

.chat-thread-drafts {
  display: grid;
  gap: var(--gap-list);
}

.chat-thread-drafts:empty {
  display: none;
}

/* Черновик выделен рамкой, а не фоном: он лежит среди настоящих сообщений
   диалога, и его нельзя прочитать как уже отправленное. */
.draft-card {
  display: grid;
  gap: var(--gap-tight);
  padding: var(--pad-inset);
  border: 1px solid color-mix(in srgb, var(--warning) 45%, var(--border));
  border-radius: var(--radius);
  background: var(--surface);
}

.draft-card-head {
  color: var(--warning);
  font-family: var(--font-condensed);
  font-size: 13px;
  font-weight: 800;
}

/* Заголовок реплики собеседника внутри карточки. Приглушён: главное здесь —
   решение по ответу, а вопрос стоит рядом, чтобы его было с чем сверить. */
.draft-card-head.asked {
  color: var(--muted);
}

.chat-bubble.outgoing.draft {
  border: 1px dashed color-mix(in srgb, var(--warning) 60%, transparent);
}

/*
  Поле ответа.

  Прижато к нижнему краю и стоит на месте нижнего меню — оно на этом экране
  скрыто. Липкое, а не фиксированное: фиксированное пришлось бы вычитать из
  высоты переписки вручную, и любая правка отступов ломала бы одно из двух.
*/
/*
  Экран переписки занимает всю видимую высоту, даже когда сообщений на два
  абзаца: без этого поле ответа зависало посреди страницы — липкому элементу
  некуда прилипать, пока нечего прокручивать.

  Через `:root:not(.hh-pane-open)` — этот класс ставит веб-версия, когда
  раскладывает подэкраны в слой из двух колонок (desktop.css в headhack). Там
  высоту держит сам слой, и собственная только сломала бы его сетку. В Telegram
  класса нет никогда, поэтому правило действует всегда.
*/
:root:not(.hh-pane-open) .view[data-view="chatThread"]:not([hidden]) {
  display: flex;
  flex-direction: column;
  gap: var(--gap-stack);
  min-height: calc(
    var(--app-height, 100vh) - max(var(--gutter), env(safe-area-inset-top))
  );
}

:root:not(.hh-pane-open) .view[data-view="chatThread"] .composer {
  margin-top: auto;
}

.composer {
  position: sticky;
  bottom: 0;
  z-index: 6;
  display: grid;
  gap: var(--gap-tight);
  margin: 0 calc(var(--gutter) * -1);
  padding:
    var(--space-3) var(--gutter)
    calc(var(--space-3) + env(safe-area-inset-bottom));
  border-top: 1px solid color-mix(in srgb, var(--muted-line) 18%, transparent);
  background: color-mix(in srgb, var(--surface) 94%, transparent);
  backdrop-filter: blur(18px);
  /* отдельный слой: иначе iOS пересчитывает blur на каждом кадре скролла */
  transform: translateZ(0);
}

/* Рамка одна на всё поле: текст, вложение, чипы и отправка живут внутри неё —
   так ряд под текстом читается частью ввода, а не ещё одной панелью. */
.composer-box {
  display: grid;
  gap: var(--space-2);
  padding: var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
}

.composer-box:focus-within {
  border-color: color-mix(in srgb, var(--button) 45%, var(--border));
}

/* min-width: 0 — иначе ряд, будучи ячейкой грида, растягивается под самый
   длинный чип и выталкивает поле за край экрана вместе со всей страницей. */
.composer-bar {
  min-width: 0;
  display: flex;
  align-items: center;
  gap: var(--gap-tight);
}

.composer-icon {
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--text);
  display: grid;
  place-items: center;
  cursor: pointer;
}

.composer-icon svg {
  width: 18px;
  height: 18px;
  stroke-width: 2;
}

/* Само поле рамки не имеет: она общая, у коробки. */
.composer-input {
  width: 100%;
  min-height: 26px;
  max-height: 140px;
  padding: var(--space-2) var(--space-3);
  border: 0;
  background: transparent;
  color: var(--text);
  font-size: 15px;
  line-height: 1.35;
  resize: none;
  overflow-y: auto;
  /* Полоса прокрутки внутри поля читалась вертикальной чертой у самого края
     рамки, рядом с микрофоном, и выглядела деталью вёрстки, а не прокруткой.
     Поле и так растёт под текст — прокрутка нужна ему только на пределе. */
  scrollbar-width: none;
}

.composer-input::-webkit-scrollbar {
  display: none;
}

/* Общее правило полей рисует на фокусе рамку и подсветку. Здесь фокус
   показывает коробка целиком, и второе кольцо внутри неё читалось бы полем
   внутри поля. */
.composer-input:focus {
  outline: none;
  border-color: transparent;
  box-shadow: none;
}

/* Одна кнопка на два действия. Микрофон живёт на фоне поля, самолётик —
   заливкой: отправка должна отличаться от «начать говорить» с одного взгляда. */
.composer-send {
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--text);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: background 0.16s ease, color 0.16s ease, border-color 0.16s ease;
}

/* Готовность к отправке показывает сам самолётик — голубой, на прозрачном.
   Залитый кружок был самым тяжёлым пятном на экране и перетягивал взгляд с
   переписки на кнопку. Кольцо остаётся: без него кнопка прыгала бы из круга в
   голый значок на каждое нажатие клавиши. */
.composer-send.ready {
  border-color: color-mix(in srgb, var(--button) 40%, transparent);
  background: transparent;
  color: var(--link);
}

.composer-send svg {
  width: 18px;
  height: 18px;
  stroke-width: 2;
}

/* Какой из двух значков виден, решает класс кнопки: атрибут hidden на SVG не
   работает — свойства hidden у SVGElement нет вовсе. */
.composer-send .composer-send-plane,
.composer-send.ready .composer-send-mic {
  display: none;
}

.composer-send.ready .composer-send-plane {
  display: block;
}

/* Ряд чипов между «плюсом» и отправкой. Он и только он уезжает вбок, когда
   подписи не помещаются: обе кнопки должны остаться на своих местах — по ним
   целятся не глядя. */
.composer-chips {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  gap: var(--gap-micro);
  overflow-x: auto;
  scrollbar-width: none;
}

.composer-chips::-webkit-scrollbar {
  display: none;
}

/* Чип читается частью поля: он говорит, что случится с тем, что в поле
   написано, а не предлагает настроить приложение. Переопределённый выделен —
   иначе не видно, что этот чат живёт не по общим правилам. */
.composer-chip {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  min-height: 28px;
  padding: 0 var(--space-2);
  border: 1px solid transparent;
  border-radius: var(--radius-pill);
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-family: var(--font-condensed);
  font-size: 12px;
  font-weight: 800;
  white-space: nowrap;
}

.composer-chip svg {
  width: 14px;
  height: 14px;
  stroke-width: 2;
}

/* Шеврон — тот же знак «здесь есть выбор», что у переключателя модели в
   примере: без него чип читается подписью, а не кнопкой. */
.composer-chip-caret {
  width: 12px;
  height: 12px;
  opacity: 0.7;
}

.composer-chip:active {
  background: color-mix(in srgb, var(--muted-line) 14%, transparent);
}

/* Настройка, которая сейчас ничего не решает: голос выключен на весь аккаунт,
   и обещать выбор формата было бы враньём. Чип остаётся — он и есть дорога
   туда, где голос включают. */
.composer-chip.inactive {
  opacity: 0.55;
}

.composer-chip.pinned {
  border-color: color-mix(in srgb, var(--button) 46%, transparent);
  background: color-mix(in srgb, var(--button) 10%, transparent);
  color: var(--link);
}

/* min-width: 0 — эти строки лежат ячейками грида, а ячейка растягивается под
   самое длинное содержимое. Подпись «голосовое готово…» выталкивала поле за
   край экрана вместе со всей страницей: «плюс» и отправка уезжали за границу. */
.composer-attachment,
.composer-recording,
.composer-voice {
  min-width: 0;
  display: flex;
  align-items: center;
  gap: var(--gap-tight);
  min-height: 32px;
  padding: 0 var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--bg);
  font-size: 13px;
}

/* Записанное голосовое до отправки: послушать, удалить, отправить. У Telegram
   такого нет вовсе — а услышать, что получилось, можно только до отправки. */
.composer-voice-play {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 26px;
  height: 26px;
  border: 0;
  padding: 0;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--button) 14%, transparent);
  color: var(--link);
  cursor: pointer;
}

.composer-voice-play svg {
  width: 14px;
  height: 14px;
}

/* Пока играет — та же кнопка останавливает, и значок это говорит. */
.composer-voice.playing .composer-voice-play svg {
  display: none;
}

.composer-voice.playing .composer-voice-play::before {
  content: "";
  width: 10px;
  height: 10px;
  border-radius: 2px;
  background: currentColor;
}

.composer-voice-time {
  flex: 0 0 auto;
  font-family: var(--font-condensed);
  font-size: 13px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
}

.composer-voice-hint {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--muted);
  font-size: 12px;
}

/* Запись не в формате голосовых. Предупреждение живёт в самой полоске и
   переносится по строкам: обрезанное многоточием «уйдёт аудиофайлом…» ничего
   не объясняет, а решение принимают именно здесь — до отправки. */
.composer-voice.warned {
  align-items: flex-start;
  padding-top: var(--space-2);
  padding-bottom: var(--space-2);
  border-color: color-mix(in srgb, var(--warning) 45%, var(--border));
}

.composer-voice.warned .composer-voice-hint {
  white-space: normal;
  color: var(--warning);
}

.composer-voice-drop {
  flex: 0 0 auto;
  border: 0;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-size: 20px;
  line-height: 1;
}

.composer-attachment svg {
  width: 16px;
  height: 16px;
  stroke-width: 2;
  flex: 0 0 auto;
  color: var(--muted);
}

.composer-attachment-name {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.composer-attachment-clear,
.composer-recording-cancel {
  flex: 0 0 auto;
  border: 0;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-family: var(--font-condensed);
  font-size: 13px;
  font-weight: 800;
}

.composer-attachment-clear {
  font-size: 20px;
  line-height: 1;
}

/* Пока идёт запись, смотреть надо на секунды: точка пульсирует, время растёт,
   а «Отменить» стоит рядом — выйти из записи можно, не отправляя. */
.composer-recording-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--danger);
  animation: composer-recording-pulse 1.1s ease-in-out infinite;
}

.composer-recording-time {
  font-family: var(--font-condensed);
  font-size: 14px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
}

/* Дорожка звука: пока столбики шевелятся, микрофон правда слышит. Ровная
   полоса на их месте — единственный признак немого микрофона до того, как
   голосовое уже ушло собеседнику. */
.composer-recording-wave {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 2px;
  height: 16px;
}

.composer-recording-wave i {
  flex: 1 1 auto;
  min-width: 2px;
  height: 100%;
  border-radius: 1px;
  background: color-mix(in srgb, var(--button) 55%, transparent);
  transform: scaleY(0.15);
  transition: transform 0.08s linear;
}

.composer-recording.paused .composer-recording-dot {
  animation: none;
  background: var(--muted);
}

.composer-recording.paused .composer-recording-wave i {
  background: color-mix(in srgb, var(--muted-line) 45%, transparent);
}

.composer-recording-pause {
  flex: 0 0 auto;
  position: relative;
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  border: 0;
  padding: 0;
  background: transparent;
  color: var(--link);
  cursor: pointer;
}

.composer-recording-pause svg {
  width: 16px;
  height: 16px;
  stroke-width: 2.2;
}

/* На паузе кнопка перестаёт быть паузой: тот же значок означал бы, что нажатие
   поставит на паузу ещё раз. */
.composer-recording.paused .composer-recording-pause svg {
  display: none;
}

.composer-recording.paused .composer-recording-pause::before {
  content: "";
  width: 0;
  height: 0;
  border-left: 11px solid currentColor;
  border-top: 7px solid transparent;
  border-bottom: 7px solid transparent;
}

@keyframes composer-recording-pulse {
  0%,
  100% {
    opacity: 1;
  }
  50% {
    opacity: 0.25;
  }
}

@media (prefers-reduced-motion: reduce) {
  .composer-recording-dot {
    animation: none;
  }
}

/* Голосовое или файл внутри реплики: значок и подпись, чтобы сообщение без
   текста не выглядело пропавшим. */
.chat-bubble-attachment {
  display: flex;
  align-items: center;
  gap: 4px;
  margin-bottom: 2px;
  font-size: 12px;
  font-weight: 700;
  opacity: 0.8;
}

.chat-bubble-attachment svg {
  width: 13px;
  height: 13px;
  stroke-width: 2.2;
}

/* Прослушать отправленное голосовое. Стоит в самой реплике: у неё нет ни
   текста, ни превью, и вспомнить, что ушло собеседнику, иначе неоткуда. */
.chat-bubble-play {
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  margin-left: 2px;
  border: 0;
  padding: 0;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--button) 18%, transparent);
  color: var(--link);
  cursor: pointer;
}

.chat-bubble-play svg {
  width: 11px;
  height: 11px;
}

/* Пока играет — та же кнопка останавливает. */
.chat-bubble-play.playing svg {
  display: none;
}

.chat-bubble-play.playing::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: 2px;
  background: currentColor;
}

.account-card {
  width: 100%;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-card);
  background: var(--surface);
  color: var(--text);
  box-shadow: var(--shadow);
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  text-align: left;
  font-family: inherit;
}

.account-avatar {
  position: relative;
  width: 46px;
  height: 46px;
  flex: 0 0 auto;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--button) 14%, var(--surface));
  color: var(--link);
  display: grid;
  place-items: center;
  font-size: 17px;
  font-weight: 850;
}

.account-avatar-image {
  width: 100%;
  height: 100%;
  border-radius: var(--radius-pill);
  object-fit: cover;
}

.account-avatar-initials {
  line-height: 1;
}

/* Точка подключения сидит на аватарке: раньше она стояла в шапке отдельно от
   имени, и было неясно, к чему относится. */
.connection-dot {
  position: absolute;
  right: -1px;
  bottom: -1px;
  width: 14px;
  height: 14px;
  border: 2px solid var(--surface);
  border-radius: var(--radius-pill);
  background: var(--danger);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--danger) 40%, transparent);
}

.connection-dot.connected {
  background: var(--success);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--success) 44%, transparent);
  animation: connection-pulse 1.8s ease-in-out infinite;
}

@keyframes connection-pulse {
  0%,
  100% {
    opacity: 1;
    transform: scale(1);
    box-shadow: 0 0 0 1px color-mix(in srgb, var(--success) 44%, transparent);
  }

  50% {
    opacity: 0.72;
    transform: scale(0.9);
    box-shadow: 0 0 0 5px color-mix(in srgb, var(--success) 14%, transparent);
  }
}

@media (prefers-reduced-motion: reduce) {
  .connection-dot.connected {
    animation: none;
  }

  /* Пар в капсуле сам замирает (vaporCore.js смотрит на этот же медиазапрос
     и оставляет только короткий fade между состояниями); CSS убирает
     оставшиеся переходы — ON/OFF различаются, но ничего не движется. */
  .pulse-face,
  .pulse-aura,
  .pulse-break,
  .pulse-mark path {
    transition: none;
  }

  .pulse-dial.pressed .pulse-face {
    transform: none;
  }
}

.account-copy {
  min-width: 0;
  flex: 1 1 auto;
  display: grid;
  gap: var(--gap-micro);
}

.account-name,
.account-handle {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.account-name {
  font-size: 15px;
  font-weight: 800;
  line-height: 1.2;
}

.account-handle {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.3;
}

.account-transport {
  flex: 0 0 auto;
  color: var(--link);
  font-family: var(--font-condensed);
  font-size: 12px;
  font-weight: 850;
  letter-spacing: 0.02em;
  text-transform: uppercase;
}

.account-chevron {
  width: 20px;
  height: 20px;
  stroke-width: 2;
  color: var(--link);
  flex: 0 0 auto;
}

.quick-sheet {
  text-align: left;
}

.quick-sheet .sheet-head h2 {
  font-size: 17px;
}

.quick-sheet-locked {
  text-align: center;
}

.profile-sheet-list {
  display: grid;
  gap: var(--gap-tight);
}

.profile-sheet-row {
  width: 100%;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  color: var(--text);
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  text-align: left;
  font-family: inherit;
}

.profile-sheet-row.selected {
  border-color: color-mix(in srgb, var(--button) 46%, transparent);
  background: color-mix(in srgb, var(--button) 8%, var(--surface));
}

/* Значок строки выбора. Тот же знак стоит потом в чипе поля ответа — по нему
   выбранное узнаётся, не читая подписей. */
.profile-sheet-icon {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--muted-line) 12%, transparent);
  color: var(--muted);
}

.profile-sheet-icon svg {
  width: 18px;
  height: 18px;
  stroke-width: 2;
}

.profile-sheet-icon img {
  width: 20px;
  height: 20px;
  object-fit: contain;
}

/* У выбранной строки знак подхватывает её же цвет: галочка справа далеко от
   значка, и без этого связь между ними теряется. */
.profile-sheet-row.selected .profile-sheet-icon {
  background: color-mix(in srgb, var(--button) 14%, transparent);
  color: var(--link);
}

.profile-sheet-copy {
  min-width: 0;
  flex: 1 1 auto;
  display: grid;
  gap: var(--gap-micro);
}

.profile-sheet-title {
  font-size: 15px;
  font-weight: 800;
  line-height: 1.2;
}

.profile-sheet-description {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.3;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.profile-sheet-check {
  flex: 0 0 auto;
  color: var(--link);
  font-size: 17px;
  font-weight: 850;
  opacity: 0;
}

.profile-sheet-row.selected .profile-sheet-check {
  opacity: 1;
}

.settings-head h2 {
  font-size: 22px;
}

.mark {
  width: 38px;
  height: 38px;
  border-radius: var(--radius-sm);
  display: block;
  object-fit: cover;
  box-shadow: 0 6px 20px color-mix(in srgb, var(--button) 24%, transparent);
  flex: 0 0 auto;
}

h1,
h2,
p {
  margin: 0;
}

h1 {
  font-size: 17px;
  font-weight: 800;
  line-height: 1.2;
  white-space: nowrap;
}

h2 {
  font-size: 15px;
  font-weight: 800;
  line-height: 1.25;
}

/* 13px, а не 12: этим стилем набраны все объяснения под полями и подзаголовки
   настроек — то есть слой, который рассказывает, что вообще происходит. */
.status {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.35;
  overflow-wrap: anywhere;
}

.plan-badge {
  min-height: 22px;
  border: 1px solid color-mix(in srgb, var(--button) 28%, transparent);
  border-radius: var(--radius);
  padding: 2px var(--space-3);
  background: color-mix(in srgb, var(--button) 10%, var(--surface));
  color: var(--link);
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 850;
  line-height: 1.2;
  white-space: nowrap;
}

.panel {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: var(--pad-card);
  display: grid;
  gap: var(--gap-stack);
}

.panel-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
}

/* Без бокового padding: заголовок раздела встаёт по одной вертикали
   с карточками под ним. */
.section-head {
  min-height: 34px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
}

.subpage-head {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
}

.subpage-head h2,
.subpage-head .status {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.meta {
  color: var(--muted);
  font-size: 12px;
  white-space: nowrap;
}

.field-panel {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: var(--pad-card);
  display: grid;
  gap: var(--gap-stack);
}

.field-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: var(--gap-stack);
}

.field-title {
  display: flex;
  align-items: center;
  gap: var(--gap-tight);
  min-width: 0;
}

.field-actions {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
}

.mini-icon-button {
  position: relative;
  width: 34px;
  height: 34px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--bg);
  color: var(--text);
  display: grid;
  place-items: center;
  cursor: pointer;
  font-size: 14px;
  font-weight: 850;
  line-height: 1;
  transition: opacity 0.16s ease, transform 0.16s ease, border-color 0.16s ease;
}

.mini-icon-button[data-tooltip]::after {
  content: attr(data-tooltip);
  position: absolute;
  right: 0;
  bottom: calc(100% + 8px);
  z-index: 40;
  max-width: min(260px, calc(100vw - var(--gutter) * 2));
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--text) 92%, transparent);
  color: var(--bg);
  box-shadow: var(--shadow);
  font-size: 12px;
  font-weight: 700;
  line-height: 1.25;
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity 0.14s ease, transform 0.14s ease;
}

.mini-icon-button[data-tooltip]:hover::after,
.mini-icon-button[data-tooltip]:focus-visible::after {
  opacity: 1;
  transform: translateY(0);
}

.mini-icon-button svg {
  width: 18px;
  height: 18px;
  stroke-width: 2;
}

.mini-icon-button.ai {
  color: var(--link);
  border-color: color-mix(in srgb, var(--button) 30%, transparent);
  background: color-mix(in srgb, var(--button) 10%, var(--surface));
}

/* Остаток AI-генераций видно до нажатия: на Free их всего три за месяц,
   и упираться в лимит по факту клика — худший способ об этом узнать. */
.mini-icon-button.ai[data-quota]::before {
  content: attr(data-quota);
  position: absolute;
  top: -6px;
  right: -6px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: var(--radius);
  background: var(--button);
  color: var(--surface);
  font-family: var(--font-condensed);
  font-size: 10px;
  font-weight: 800;
  line-height: 16px;
  text-align: center;
}

.mini-icon-button.ai.exhausted {
  color: var(--muted);
  border-color: var(--border);
  background: var(--bg);
}

.mini-icon-button.ai.exhausted[data-quota]::before {
  background: var(--danger);
}

.dropzone.locked {
  opacity: 0.5;
  border-style: solid;
}

.mini-icon-button:active {
  transform: translateY(1px);
}

.mini-icon-button:disabled {
  opacity: 0.48;
  cursor: not-allowed;
  transform: none;
}

.field-textarea.small {
  min-height: 132px;
  max-height: 36vh;
}

/* Подэкран одной настройки: слева кнопка назад, справа «?» и генерация. */
.field-panel-page .field-head {
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
}

.assistant-summary {
  gap: var(--gap-list);
}

.assistant-summary-head {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: var(--gap-stack);
}

.assistant-summary-copy {
  min-width: 0;
  display: grid;
  gap: var(--gap-micro);
}

.readiness {
  display: grid;
  gap: var(--gap-tight);
}

/* display обязателен: внутри .plan-pressure полоса собрана из span-ов
   (в <button> нельзя класть div), а инлайновый элемент игнорирует высоту. */
.readiness-track {
  display: block;
  height: 6px;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--muted-line) 18%, transparent);
  overflow: hidden;
}

.readiness-fill {
  display: block;
  width: 0;
  height: 100%;
  border-radius: var(--radius-pill);
  background: var(--button);
  transition: width 0.24s ease, background 0.24s ease;
}

.readiness-fill.ready {
  background: var(--success);
}

/* Полоса расхода читается наоборот полосы готовности: полная — это плохо. */
.readiness-fill.warn {
  background: var(--warning);
}

.readiness-fill.exhausted {
  background: var(--danger);
}

.plan-pressure {
  display: grid;
  gap: var(--gap-tight);
  width: 100%;
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  text-align: left;
  cursor: pointer;
}

.plan-pressure:active {
  transform: translateY(1px);
}

.plan-pressure-line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--gap-inline);
}

.usage-meter-list {
  display: grid;
  gap: var(--gap-list);
}

/* Значение настройки в строке списка: одна строка с многоточием, чтобы
   длинный промпт не растягивал плитку на пол-экрана. */
.tile-subtitle.tile-preview {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow-wrap: normal;
}

.tile-subtitle.empty-value {
  color: color-mix(in srgb, var(--muted) 72%, transparent);
}

/* Список остаётся кликабельным — заглянуть внутрь можно и без подключения,
   просто видно, что он ещё не в работе. */
.tile-list.locked .tile-row {
  opacity: 0.6;
}

.assistant-summary-what {
  padding-bottom: var(--space-1);
}

.replies-toggle {
  align-items: center;
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
}

.replies-toggle-title {
  display: block;
  font-size: 15px;
  font-weight: 800;
  line-height: 1.2;
}

.replies-controls {
  display: grid;
  gap: var(--gap-list);
}

/* Переключатель вместо галочки: положение видно издалека, и это привычный
   для мобильных жест, а не «поставить крестик». */
input.switch {
  appearance: none;
  -webkit-appearance: none;
  position: relative;
  flex: 0 0 auto;
  width: 46px;
  height: 28px;
  margin: 0;
  border: 0;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--muted-line) 34%, transparent);
  cursor: pointer;
  transition: background 0.18s ease;
}

input.switch::after {
  content: "";
  position: absolute;
  top: 3px;
  left: 3px;
  width: 22px;
  height: 22px;
  border-radius: var(--radius-pill);
  background: #fff;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.28);
  transition: transform 0.18s ease;
}

input.switch:checked {
  background: var(--success);
}

input.switch:checked::after {
  transform: translateX(18px);
}

input.switch:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

input.switch:focus-visible {
  outline: 3px solid color-mix(in srgb, var(--button) 28%, transparent);
  outline-offset: 2px;
}

.segmented-field {
  display: grid;
  gap: var(--gap-tight);
}

.segmented {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: var(--space-1);
  padding: var(--space-1);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--muted-line) 14%, transparent);
}

/* Сроки ответа — ряд чипов в одну прокручиваемую строку: все значения видны,
   и ни одно не прячется за раскрывашкой, которая притворялась режимом. */
.delay-chips {
  display: flex;
  gap: var(--gap-tight);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  padding-bottom: var(--space-1);
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}

.delay-chips::-webkit-scrollbar {
  display: none;
}

.delay-chip {
  flex: 0 0 auto;
  min-height: 38px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 0 var(--pad-inset);
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-condensed);
  font-size: 13px;
  font-weight: 800;
  cursor: pointer;
  transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease;
}

.delay-chip.selected {
  border-color: var(--button);
  background: var(--button);
  color: var(--button-text);
}

.delay-chip:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

.segmented-option {
  min-height: 38px;
  padding: 0 var(--space-3);
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--text);
  font-family: var(--font-condensed);
  font-size: 13px;
  font-weight: 800;
  line-height: 1.1;
  cursor: pointer;
  transition: background 0.16s ease, color 0.16s ease;
}

.segmented-option.selected {
  background: var(--surface);
  color: var(--link);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.14);
}

.segmented-option:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Переключатель языка в шапке настроек. Оформление общее с остальными
   сегментами, но ширина — по содержимому: он стоит рядом с заголовком, а не
   занимает строку целиком. */
.lang-switch {
  grid-auto-columns: auto;
  flex: 0 0 auto;
}

.lang-switch .segmented-option {
  min-height: 30px;
  padding: 0 var(--space-3);
  font-size: 12px;
  letter-spacing: 0.04em;
}

/* Единственное действие на экране — оно должно читаться как действие,
   а не как ещё одна строка списка. */
.primary-action {
  width: 100%;
  min-height: 52px;
  font-size: 16px;
}

.chat-sample {
  display: grid;
  gap: var(--gap-tight);
}

.chat-bubble {
  max-width: 88%;
  padding: var(--space-3) var(--pad-inset);
  border-radius: var(--radius);
  font-size: 14px;
  line-height: 1.35;
}

.chat-bubble.incoming {
  justify-self: start;
  border-bottom-left-radius: 4px;
  background: color-mix(in srgb, var(--muted-line) 16%, var(--surface));
}

/**
 * Метка под исходящим: ушло само или после решения владельца.
 *
 * Раньше согласованный ответ стоял в переписке дважды — сообщением и карточкой
 * «Отправлено» под ней. Здесь тот же факт занимает строку в самом сообщении,
 * поэтому чат остаётся чатом: значок и слово приглушены и читаются вторыми.
 */
.chat-bubble-origin {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 4px;
  margin-top: 4px;
  color: var(--muted);
  font-size: 11px;
}

.chat-bubble-origin svg {
  width: 12px;
  height: 12px;
  stroke-width: 2.4;
}

.chat-bubble.outgoing {
  justify-self: end;
  border-bottom-right-radius: 4px;
  background: color-mix(in srgb, var(--button) 16%, var(--surface));
}

.slots-preview {
  display: grid;
  gap: var(--gap-tight);
}

.slots-list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--gap-inline);
}

.slot-chip {
  padding: var(--space-2) var(--space-4);
  border: 1px solid color-mix(in srgb, var(--success) 32%, transparent);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--success) 12%, var(--surface));
  font-size: 13px;
  font-weight: 700;
}

.preview-answer-text {
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  padding: var(--pad-inset);
  border-radius: var(--radius);
  border: 1px solid var(--border);
  background: var(--bg);
  font-size: 15px;
  line-height: 1.4;
}

.knowledge-lock-note {
  padding: var(--pad-inset);
  border: 1px dashed color-mix(in srgb, var(--warning) 48%, var(--border));
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--warning) 8%, var(--surface));
}

.knowledge-save-row {
  min-height: 34px;
}

/* Кнопок в строке может стоять две — отмена пресета и проверка. Без общей
   обёртки они переносятся вразнобой: одна остаётся справа от статуса, вторая
   падает под него к левому краю. */
.knowledge-save-row > .status {
  flex: 1 1 12ch;
  min-width: 0;
}

.knowledge-save-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--gap-inline);
}

.knowledge-save-actions:empty,
.knowledge-save-actions:not(:has(.button:not([hidden]))) {
  display: none;
}

.status.save-error {
  color: var(--danger);
}

.connection-onboarding {
  border-color: color-mix(in srgb, var(--warning) 34%, var(--border));
  background:
    linear-gradient(
    180deg,
    color-mix(in srgb, var(--warning) 10%, var(--surface)),
    var(--surface)
  );
}

.connection-onboarding.connected {
  border-color: color-mix(in srgb, var(--success) 28%, var(--border));
  background:
    linear-gradient(
    180deg,
    color-mix(in srgb, var(--success) 8%, var(--surface)),
    var(--surface)
  );
}

.connection-steps {
  display: grid;
  gap: var(--gap-tight);
  margin: 0;
  padding-left: var(--space-7);
  color: var(--text);
  font-size: 13px;
  line-height: 1.36;
}

.connection-path {
  display: grid;
  gap: var(--gap-stack);
}

.connection-path[hidden],
.mtproto-stage[hidden],
.mtproto-controls[hidden] {
  display: none;
}

.connection-divider {
  height: 1px;
  background: var(--border);
}

.consent-row,
.toggle-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--gap-stack);
  color: var(--text);
  font-size: 13px;
  line-height: 1.36;
}

/* :not(.switch) обязателен: правило идёт ниже стилей переключателя и с той
   же специфичностью, поэтому иначе сплющивало бы его до размера галочки. */
.consent-row input,
.toggle-row input:not(.switch) {
  width: 20px;
  height: 20px;
  accent-color: var(--button);
}

/* Рамка держит место под код: размер и пропорция на ней, а картинка с
   каркасом лежат внутри друг на друге. Поэтому готовый код не сдвигает ни
   подпись под ним, ни кнопку — меняется только содержимое рамки. */
.mtproto-qr-frame {
  position: relative;
  width: min(280px, 100%);
  aspect-ratio: 1;
  justify-self: center;
}

.mtproto-qr {
  display: block;
  width: 100%;
  height: 100%;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #fff;
  object-fit: contain;
}

.mtproto-status {
  min-height: 36px;
}

/* Единственный путь без премиума выключен: текст и кнопка поддержки под ним. */
.mtproto-unavailable {
  display: grid;
  gap: var(--gap-stack);
  justify-items: start;
}

.mtproto-controls {
  display: grid;
  gap: var(--gap-stack);
}

.inline-copy-button {
  min-height: 24px;
  border: 1px solid color-mix(in srgb, var(--button) 26%, transparent);
  border-radius: var(--radius-sm);
  padding: 2px var(--space-3);
  background: color-mix(in srgb, var(--button) 9%, var(--surface));
  color: var(--link);
  cursor: pointer;
  font: inherit;
  font-weight: 850;
  line-height: 1.2;
}

.inline-copy-button:active {
  transform: translateY(1px);
}

.profile-select-panel {
  order: -2;
}

.profile-select-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: var(--gap-inline);
  align-items: center;
}

.profile-select {
  width: 100%;
  min-height: 44px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 0 var(--space-5);
  background: var(--bg);
  color: var(--text);
  font: inherit;
  font-weight: 750;
}

.assistant-profile-list {
  display: grid;
  gap: var(--gap-list);
}

.assistant-profile-card {
  width: 100%;
  min-height: 96px;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--gap-stack);
  padding: var(--pad-card);
  border: 1px solid color-mix(in srgb, var(--muted-line) 14%, transparent);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--text);
  text-align: left;
  box-shadow: var(--shadow);
}

.assistant-profile-card.button-card {
  cursor: pointer;
}

.assistant-profile-card.button-card:active {
  transform: translateY(1px);
}

.assistant-profile-copy {
  min-width: 0;
  display: grid;
  gap: var(--gap-micro);
}

.assistant-profile-title {
  color: var(--text);
  font-size: 15px;
  font-weight: 850;
  line-height: 1.2;
  overflow-wrap: anywhere;
}

.assistant-profile-description {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.32;
  overflow-wrap: anywhere;
}

.assistant-profile-badges {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  flex-wrap: wrap;
}

.assistant-profile-badge {
  min-height: 22px;
  display: inline-flex;
  align-items: center;
  border-radius: var(--radius);
  padding: 2px var(--space-3);
  background: color-mix(in srgb, var(--button) 10%, var(--surface));
  color: var(--link);
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 800;
  line-height: 1.2;
}

.assistant-profile-badge.muted {
  background: color-mix(in srgb, var(--muted-line) 10%, var(--surface));
  color: var(--muted);
}

.personality-test-progress {
  height: 6px;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--muted-line) 16%, transparent);
  overflow: hidden;
}

.personality-test-progress-fill {
  height: 100%;
  width: 0%;
  background: var(--button);
  transition: width 0.2s ease;
}

.personality-test-question {
  gap: var(--gap-stack);
}

.personality-test-prompt {
  font-size: 17px;
  font-weight: 800;
  line-height: 1.3;
}

.personality-test-options {
  display: grid;
  gap: var(--gap-list);
}

.personality-option {
  width: 100%;
  min-height: 48px;
  text-align: left;
  padding: var(--pad-inset);
  border: 1px solid color-mix(in srgb, var(--muted-line) 20%, transparent);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  font: inherit;
  font-weight: 650;
  line-height: 1.3;
  cursor: pointer;
}

.personality-option.selected {
  border-color: var(--button);
  background: color-mix(in srgb, var(--button) 14%, var(--surface));
  color: var(--link);
  font-weight: 800;
}

.personality-option-custom {
  font-style: italic;
  color: var(--muted);
}

.personality-test-custom-input {
  min-height: 88px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-control);
  background: var(--bg);
  color: var(--text);
  font: inherit;
  resize: vertical;
}

.personality-test-result {
  text-align: center;
  gap: var(--gap-stack);
}

.personality-test-code {
  font-family: var(--font-condensed);
  font-size: 20px;
  font-weight: 850;
  color: var(--link);
  letter-spacing: 0.02em;
}

.personality-test-traits {
  display: grid;
  gap: var(--gap-list);
  text-align: left;
}

.personality-trait-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 2fr;
  align-items: center;
  gap: var(--gap-inline);
  font-size: 13px;
  color: var(--muted);
}

.personality-trait-bar {
  height: 8px;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--muted-line) 16%, transparent);
  overflow: hidden;
}

.personality-trait-fill {
  height: 100%;
  background: var(--button);
}

.voice-form {
  display: grid;
  gap: var(--gap-stack);
}

.voice-form label {
  display: grid;
  gap: var(--gap-tight);
  color: var(--muted);
  font-size: 12px;
  font-weight: 750;
}

/* Подпись и её элемент управления лежат в общей обёртке: без неё между
   «Как отвечать» и вариантами не было ни одного пикселя. */
.voice-field {
  display: grid;
  gap: var(--gap-tight);
}

.voice-mode-options {
  display: grid;
  gap: var(--gap-list);
}

.voice-mode-option {
  display: flex;
  align-items: flex-start;
  gap: var(--gap-stack);
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  text-align: left;
  cursor: pointer;
  font: inherit;
}

.voice-mode-option.selected {
  border-color: var(--button);
  background: color-mix(in srgb, var(--button) 10%, var(--bg));
}

.voice-mode-option-icon {
  font-size: 18px;
  line-height: 1.2;
}

.voice-mode-option-title {
  display: block;
  font-weight: 750;
  font-size: 14px;
}

.voice-mode-option-subtitle {
  display: block;
  margin-top: var(--space-1);
  color: var(--muted);
  font-size: 12px;
  font-weight: 500;
}

.voice-preview-row {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  flex-wrap: wrap;
}

.voice-preview-row audio {
  flex: 1 1 180px;
  min-width: 160px;
  height: 36px;
}

.voice-slider-row {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: var(--gap-inline);
}

.voice-slider-value {
  min-width: 44px;
  text-align: right;
  font-variant-numeric: tabular-nums;
  color: var(--text);
  font-size: 13px;
  font-weight: 750;
}

.voice-list {
  display: grid;
  gap: var(--gap-list);
  max-height: 320px;
  overflow-y: auto;
}

.voice-card {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: var(--gap-stack);
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  text-align: left;
  cursor: pointer;
  font: inherit;
}

.voice-card.selected {
  border-color: var(--button);
  background: color-mix(in srgb, var(--button) 10%, var(--bg));
}

.voice-card-title {
  display: block;
  font-weight: 750;
  font-size: 14px;
}

.voice-card-tagline {
  display: block;
  margin-top: var(--space-1);
  color: var(--muted);
  font-size: 12px;
  font-weight: 500;
}

.voice-card-price {
  white-space: nowrap;
  font-size: 12px;
  font-weight: 750;
  color: var(--muted);
}

.voice-card-price.premium {
  color: #d88a18;
}

.voice-balance-panel {
  display: grid;
  gap: var(--gap-stack);
}

.voice-balance-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
}

.voice-balance-value {
  font-size: 20px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.voice-quota-bar {
  height: 8px;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--muted-line) 16%, transparent);
  overflow: hidden;
}

.voice-quota-fill {
  height: 100%;
  width: 0%;
  background: var(--button);
  transition: width 0.2s ease;
}

.voice-quota-fill.exhausted {
  background: var(--danger);
}

.voice-explainer {
  display: grid;
  gap: var(--gap-stack);
}

.voice-explainer-list {
  margin: 0;
  padding-left: var(--space-7);
  display: grid;
  gap: var(--gap-tight);
  color: var(--muted);
  font-size: 13px;
  line-height: 1.45;
}

.voice-explainer-list b {
  color: var(--text);
}

.voice-explainer-calc {
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  font-size: 13px;
  line-height: 1.5;
}

.voice-packs {
  display: grid;
  gap: var(--gap-list);
}

.voice-pack {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: var(--gap-stack);
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  text-align: left;
  cursor: pointer;
  font: inherit;
}

.voice-pack-title {
  display: block;
  font-weight: 750;
  font-size: 14px;
}

.voice-pack-description {
  display: block;
  margin-top: var(--space-1);
  color: var(--muted);
  font-size: 12px;
  font-weight: 500;
}

.voice-unavailable {
  padding: var(--pad-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--danger) 8%, var(--bg));
  color: var(--muted);
  font-size: 12px;
  line-height: 1.5;
}

.assistant-profile-edit-form {
  display: grid;
  gap: var(--gap-stack);
}

.assistant-profile-edit-form label {
  display: grid;
  gap: var(--gap-tight);
  color: var(--muted);
  font-size: 12px;
  font-weight: 750;
}

.assistant-profile-edit-form .toggle-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
  min-height: 44px;
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  font-size: 14px;
}

/* Рамка, радиус и padding приходят из общего правила для полей ниже. */
.assistant-profile-edit-form input[type="text"],
.assistant-profile-edit-form textarea {
  font-weight: 650;
}

.assistant-profile-edit-form textarea {
  min-height: 96px;
  resize: vertical;
  line-height: 1.35;
}

.assistant-profile-help {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.38;
}

.assistant-profile-help strong {
  color: var(--text);
}

.assistant-profile-actions {
  display: flex;
  gap: var(--gap-inline);
  flex-wrap: wrap;
  justify-content: flex-end;
}

.response-style-presets {
  display: flex;
  gap: var(--gap-inline);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  padding: 2px 0 var(--space-1);
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}

.response-style-presets::-webkit-scrollbar {
  display: none;
}

.style-preset-button {
  min-width: 68px;
  min-height: 62px;
  border: 1px solid color-mix(in srgb, var(--muted-line) 14%, transparent);
  border-radius: var(--radius);
  padding: var(--space-3);
  background: var(--bg);
  color: var(--text);
  cursor: pointer;
  display: grid;
  justify-items: center;
  align-content: center;
  gap: var(--gap-micro);
  transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease, transform 0.16s
    ease;
}

.style-preset-button:active {
  transform: translateY(1px);
}

.style-preset-button[aria-pressed="true"] {
  border-color: color-mix(in srgb, var(--button) 34%, transparent);
  background: color-mix(in srgb, var(--button) 14%, var(--surface));
  color: var(--link);
}

/* «Взято за основу»: шаблон подставили и потом правили руками. Раньше
   подсветка гасла от первого же исправленного символа, и было не видно, от
   чего отталкивались. */
.style-preset-button.basis {
  border-style: dashed;
  border-color: color-mix(in srgb, var(--button) 40%, transparent);
  color: var(--link);
}

.style-preset-button:disabled {
  opacity: 0.48;
  cursor: not-allowed;
  transform: none;
}

.style-preset-icon {
  font-size: 19px;
  line-height: 1;
}

.style-preset-label {
  max-width: 58px;
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 800;
  line-height: 1.1;
  text-align: center;
  overflow-wrap: anywhere;
}

textarea,
input[type="url"],
input[type="text"],
input[type="password"],
input[type="number"],
input[type="time"] {
  width: 100%;
  border: 1px solid var(--border);
  background: var(--bg);
  color: var(--text);
  border-radius: var(--radius);
  outline: none;
  transition: border-color 0.16s ease, box-shadow 0.16s ease;
}

textarea:focus,
input[type="url"]:focus,
input[type="text"]:focus,
input[type="password"]:focus,
input[type="number"]:focus,
input[type="time"]:focus {
  border-color: var(--button);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--button) 20%, transparent);
}

textarea {
  min-height: 230px;
  max-height: 54vh;
  resize: vertical;
  padding: var(--pad-control);
  line-height: 1.45;
}

input[type="url"],
input[type="text"],
input[type="password"],
input[type="number"],
input[type="time"] {
  min-height: 44px;
  padding: 0 var(--space-5);
}

.calendar-availability-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--gap-list);
}

.compact-field {
  display: grid;
  gap: var(--gap-tight);
  font-size: 12px;
  font-weight: 700;
  color: var(--muted);
}

.calendar-days {
  display: grid;
  gap: var(--gap-list);
}

.calendar-day-row {
  display: grid;
  grid-template-columns: 76px minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  gap: var(--gap-inline);
  min-height: 44px;
}

.calendar-day-toggle {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  min-width: 0;
  font-weight: 800;
}

.calendar-day-toggle input {
  width: 18px;
  height: 18px;
  accent-color: var(--button);
}

.calendar-day-separator {
  color: var(--muted);
  font-weight: 700;
}

@media (min-width: 560px) {
  .calendar-availability-grid {
    grid-template-columns: 1.4fr 0.8fr 0.6fr;
  }
}

.row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
  flex-wrap: wrap;
}

.actions {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--gap-inline);
}

@media (min-width: 560px) {
  .actions {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.button {
  min-height: 44px;
  border: 0;
  border-radius: var(--radius);
  padding: 0 var(--space-6);
  background: var(--button);
  color: var(--button-text);
  font-weight: 700;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--gap-inline);
  transition: opacity 0.16s ease, transform 0.16s ease;
}

.button.secondary {
  background: color-mix(in srgb, var(--button) 12%, var(--surface));
  color: var(--link);
  border: 1px solid color-mix(in srgb, var(--button) 26%, transparent);
}

.button:active {
  transform: translateY(1px);
}

.button:disabled {
  opacity: 0.48;
  cursor: not-allowed;
  transform: none;
}

.spinner {
  width: 16px;
  height: 16px;
  border-radius: var(--radius-pill);
  border: 2px solid color-mix(in srgb, currentColor 30%, transparent);
  border-top-color: currentColor;
  display: none;
  animation: spin 0.8s linear infinite;
}

.button.busy .spinner {
  display: inline-block;
}

@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

.dropzone {
  border: 1.5px dashed var(--border);
  border-radius: var(--radius);
  min-height: 112px;
  display: grid;
  place-items: center;
  gap: var(--gap-inline);
  padding: var(--pad-card);
  background: color-mix(in srgb, var(--button) 5%, var(--surface));
  text-align: center;
}

.upload-card {
  min-height: 132px;
  border-style: dashed;
  box-shadow: var(--shadow);
}

.dropzone.active {
  border-color: var(--button);
  background: color-mix(in srgb, var(--button) 12%, var(--surface));
}

.file-input {
  display: none;
}

.file-list {
  display: grid;
  gap: var(--gap-list);
  min-height: 40px;
}

.tile-list {
  display: grid;
  gap: var(--gap-list);
}

.tile-row {
  min-height: 78px;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--gap-stack);
  padding: var(--pad-card);
  border: 1px solid color-mix(in srgb, var(--muted-line) 14%, transparent);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--text);
  box-shadow: var(--shadow);
}

/*
  Строка без иконки: слева текст, справа число или кнопка. У обычной плитки
  первая колонка отдана значку, и без этой поправки число прижималось бы к
  подписи вместо правого края.
*/
.tile-row.tile-row-plain {
  grid-template-columns: minmax(0, 1fr) auto;
}

.tile-button {
  width: 100%;
  border: 1px solid color-mix(in srgb, var(--muted-line) 14%, transparent);
  text-align: left;
  cursor: pointer;
}

.tile-button:active {
  transform: translateY(1px);
}

.tile-icon {
  width: 46px;
  height: 46px;
  border-radius: var(--radius-pill);
  display: grid;
  place-items: center;
  background: color-mix(in srgb, var(--tile-accent, var(--button)) 14%, var(--surface));
  color: var(--tile-accent, var(--link));
  font-size: 11px;
  font-weight: 850;
  flex: 0 0 auto;
}

.tile-icon svg {
  width: 23px;
  height: 23px;
  stroke-width: 2;
}

.tile-icon img {
  width: 30px;
  height: 30px;
  object-fit: cover;
  border-radius: var(--radius-sm);
}

.tile-title {
  display: block;
  font-size: 16px;
  font-weight: 800;
  line-height: 1.2;
  overflow-wrap: anywhere;
}

.tile-subtitle {
  display: block;
  margin-top: var(--space-1);
  color: var(--muted);
  font-size: 13px;
  line-height: 1.25;
  overflow-wrap: anywhere;
}

.tile-value {
  color: var(--text);
  font-size: 16px;
  font-weight: 800;
  white-space: nowrap;
}

.tile-chevron {
  color: color-mix(in srgb, var(--muted) 70%, transparent);
  font-size: 28px;
  line-height: 1;
}

.stats-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--gap-list);
}

.stat-card {
  min-height: 104px;
  display: grid;
  align-content: space-between;
  gap: var(--gap-inline);
  padding: var(--pad-card);
  border: 1px solid color-mix(in srgb, var(--muted-line) 14%, transparent);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: var(--shadow);
}

.stat-card .status {
  font-family: var(--font-condensed);
}

.stat-value {
  color: var(--link);
  font-size: 28px;
  font-weight: 850;
  line-height: 1;
}

.back-button {
  width: 42px;
  height: 34px;
  min-width: 42px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text);
  cursor: pointer;
  display: grid;
  place-items: center;
}

.back-button svg {
  width: 18px;
  height: 18px;
}

.icon-button {
  width: 38px;
  height: 38px;
  border: 1px solid color-mix(in srgb, var(--danger) 30%, transparent);
  border-radius: var(--radius-sm);
  color: var(--danger);
  background: color-mix(in srgb, var(--danger) 8%, var(--surface));
  display: grid;
  place-items: center;
  cursor: pointer;
}

.icon-button svg {
  width: 18px;
  height: 18px;
}

.calendar-frame {
  width: 100%;
  min-height: 360px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
}

.calendar-frame[hidden],
.empty[hidden] {
  display: none;
}

.empty {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.4;
  border: 1px dashed var(--border);
  border-radius: var(--radius);
  padding: var(--pad-card);
}

.bottom-nav {
  position: fixed;
  left: var(--gutter);
  right: var(--gutter);
  bottom: max(var(--space-5), env(safe-area-inset-bottom));
  z-index: 10;
  width: min(calc(100% - var(--gutter) * 2), 720px);
  margin: 0 auto;
  min-height: 70px;
  border: 1px solid color-mix(in srgb, var(--muted-line) 18%, transparent);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--surface) 92%, transparent);
  backdrop-filter: blur(18px);
  box-shadow: 0 10px 38px rgba(0, 0, 0, 0.16);
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--gap-micro);
  padding: var(--space-2);
  /* отдельный слой: иначе iOS пересчитывает blur на каждом кадре скролла */
  transform: translateZ(0);
  contain: layout paint;
}

.nav-item {
  min-width: 0;
  min-height: 56px;
  border: 0;
  border-radius: var(--radius);
  background: transparent;
  color: var(--text);
  display: grid;
  justify-items: center;
  align-content: center;
  gap: var(--gap-micro);
  cursor: pointer;
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 700;
}

/* Подложка активной вкладки обнимает иконку, а не всю кнопку: подпись под ней
   остаётся на фоне панели, как в макете. */
.nav-item svg {
  width: 22px;
  height: 22px;
  stroke-width: 2;
  box-sizing: content-box;
  padding: var(--space-1) var(--space-7);
  border-radius: var(--radius-pill);
  transition: background 0.18s ease;
}

.nav-item.active {
  color: var(--link);
}

.nav-item.active svg {
  background: color-mix(in srgb, var(--button) 16%, var(--surface));
}

/* Над нижним меню, а не под ним. Пока тост был запасным путём, а успех
   показывался модалкой, промах было не видно: у меню z-index: 10 и своя
   позиция у нижнего края, и тост уезжал ровно под него. Теперь тостом
   подтверждается каждое сохранение, и прятаться ему нельзя. */
.toast {
  position: fixed;
  left: var(--gutter);
  right: var(--gutter);
  bottom: calc(var(--nav-clearance) + env(safe-area-inset-bottom));
  z-index: 20;
  max-width: 720px;
  margin: 0 auto;
  padding: var(--pad-inset) var(--pad-card);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--text) 90%, transparent);
  color: var(--bg);
  font-size: 14px;
  box-shadow: var(--shadow);
  opacity: 0;
  transform: translateY(10px);
  pointer-events: none;
  transition: opacity 0.18s ease, transform 0.18s ease;
}

.toast.visible {
  opacity: 1;
  transform: translateY(0);
}

/* Тост показывает и ошибку — там, где Telegram не дал открыть модалку.
   Цветом отделяем «не сохранилось» от «сохранено». */
.toast.toast-error {
  background: color-mix(in srgb, var(--danger) 92%, var(--text));
  color: #ffffff;
}

.sheet-backdrop {
  position: fixed;
  inset: 0;
  z-index: 20;
  background: rgba(0, 0, 0, 0);
  display: grid;
  align-items: end;
  padding: 0;
  pointer-events: none;
  transition: background 0.24s ease;
  will-change: background;
}

.sheet-backdrop[hidden] {
  display: none;
}

.sheet-backdrop.open {
  background: rgba(0, 0, 0, 0.34);
  pointer-events: auto;
}

.sheet {
  width: min(100%, 720px);
  margin: 0 auto;
  border: 1px solid var(--border);
  border-radius: var(--radius) var(--radius) 0 0;
  background: var(--surface);
  color: var(--text);
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.24);
  padding: var(--space-7) var(--space-7) calc(var(--space-7) + env(safe-area-inset-bottom));
  display: grid;
  gap: var(--gap-stack);
  max-height: min(74vh, 620px);
  overflow: auto;
  overscroll-behavior: contain;
  transform: translateY(104%);
  transition: transform 0.28s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: transform;
}

.sheet-backdrop.open .sheet {
  transform: translateY(0);
}

.sheet-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
}

/*
  Подсказка у кнопок в шапке уходит вниз, а не вверх.

  Вверх её не видно: и лист, и прокручиваемый экран режут всё, что вылезло за
  их верхний край, а шапка стоит первой строкой — над ней места нет. Вниз
  подсказка ложится поверх содержимого и видна всегда.
*/
.sheet-head .mini-icon-button[data-tooltip]::after,
.section-head .mini-icon-button[data-tooltip]::after {
  top: calc(100% + 8px);
  bottom: auto;
  transform: translateY(-4px);
}

.sheet-head .mini-icon-button[data-tooltip]:hover::after,
.sheet-head .mini-icon-button[data-tooltip]:focus-visible::after,
.section-head .mini-icon-button[data-tooltip]:hover::after,
.section-head .mini-icon-button[data-tooltip]:focus-visible::after {
  transform: translateY(0);
}

/* Значок Telegram стоит в той же шапке — его подсказке вверх тоже некуда. */
.chat-open-telegram[data-tooltip]::after {
  top: calc(100% + 8px);
  bottom: auto;
  transform: translate(-50%, -4px);
}

.chat-open-telegram[data-tooltip]:hover::after,
.chat-open-telegram[data-tooltip]:focus-visible::after {
  transform: translate(-50%, 0);
}

.sheet-head .mini-icon-button {
  width: 42px;
  height: 42px;
  border: 0;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--muted-line) 12%, var(--surface));
  color: var(--muted);
  font-size: 26px;
  font-weight: 450;
}

.help-sheet {
  text-align: center;
  justify-items: center;
}

.help-sheet .sheet-head {
  width: 100%;
  justify-content: flex-end;
}

.help-sheet h2 {
  max-width: 520px;
  font-size: 28px;
  line-height: 1.12;
}

.help-sheet .sheet-body {
  max-width: 520px;
  color: var(--muted);
  font-size: 18px;
  line-height: 1.35;
}

.help-sheet .sheet-example {
  width: 100%;
  max-width: 560px;
  text-align: left;
}

.sheet-body {
  color: var(--text);
  font-size: 14px;
  line-height: 1.45;
  white-space: pre-line;
}

.sheet-example {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.4;
  white-space: pre-line;
  border: 1px dashed var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--bg);
}

/* Полный доступ к Telegram: вход по QR и выбор отвечающего в одном окне. */
.full-access-sheet {
  display: grid;
  gap: var(--gap-stack);
  text-align: left;
}

.full-access-connect,
.full-access-answering {
  display: grid;
  gap: var(--gap-stack);
}

.full-access-connect[hidden],
.full-access-answering[hidden] {
  display: none;
}

.full-access-answering {
  border-top: 1px solid var(--border);
  padding-top: var(--gap-stack);
}

.gifts-summary {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-3);
  width: 100%;
}

.gifts-stat {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  padding: var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
}

.gifts-stat strong {
  font-size: 20px;
  line-height: 1.1;
}

.gifts-stat span {
  color: var(--muted);
  font-size: 12px;
  text-align: center;
}

.gifts-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  width: 100%;
}

.gift-card {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  text-align: left;
}

.gift-title {
  font-size: 15px;
  font-weight: 600;
}

.gift-traits,
.gift-facts {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
}

.gift-actions {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex-wrap: wrap;
  margin-top: 4px;
}

.gift-transfer {
  display: flex;
  gap: var(--space-3);
  flex-wrap: wrap;
  margin-top: 4px;
}

.gift-transfer input {
  flex: 1 1 160px;
  min-width: 0;
}

.support-view {
  min-height: calc(var(--app-height, 100vh) - var(--gutter) * 2 - env(safe-area-inset-top));
  grid-template-rows: auto minmax(0, 1fr) auto;
  gap: var(--gap-stack);
}

.support-messages {
  display: grid;
  gap: var(--gap-list);
  align-content: start;
  min-height: 360px;
  overflow: auto;
  overscroll-behavior: contain;
  /* 2px по бокам, чтобы скроллер не срезал тени пузырей */
  padding: 2px 2px var(--space-4);
}

.support-bubble {
  width: fit-content;
  max-width: min(86%, 560px);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  font-size: 15px;
  line-height: 1.45;
  overflow-wrap: anywhere;
  background: var(--bg);
  color: var(--text);
  box-shadow: 0 3px 14px rgba(0, 0, 0, 0.05);
  white-space: pre-wrap;
}

.support-bubble.user {
  justify-self: end;
  background: color-mix(in srgb, var(--button) 16%, var(--surface));
  border-color: color-mix(in srgb, var(--button) 30%, transparent);
}

.support-bubble.assistant {
  justify-self: start;
  background: var(--surface);
  border: 1px solid color-mix(in srgb, var(--muted-line) 14%, transparent);
}

.support-bubble.rendered {
  white-space: normal;
}

.support-bubble.rendered p,
.support-bubble.rendered ul,
.support-bubble.rendered ol,
.support-bubble.rendered pre {
  margin: 0 0 var(--space-3);
}

.support-bubble.rendered p:last-child,
.support-bubble.rendered ul:last-child,
.support-bubble.rendered ol:last-child,
.support-bubble.rendered pre:last-child {
  margin-bottom: 0;
}

.support-bubble.rendered ul,
.support-bubble.rendered ol {
  padding-left: var(--space-7);
}

.support-bubble.rendered code {
  border-radius: var(--radius-sm);
  padding: 2px var(--space-2);
  background: color-mix(in srgb, var(--muted-line) 12%, var(--surface));
  font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
  font-size: 0.92em;
}

.support-bubble.rendered pre {
  overflow: auto;
  border-radius: var(--radius-sm);
  padding: var(--pad-inset);
  background: color-mix(in srgb, var(--text) 8%, var(--surface));
}

.support-form {
  position: sticky;
  bottom: 0;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--gap-inline);
  padding: var(--space-4) 0 calc(var(--space-4) + env(safe-area-inset-bottom));
  background: var(--bg);
}

@media (min-width: 460px) {
  .support-form {
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: end;
  }
}

.support-input {
  min-height: 44px;
  max-height: 120px;
  padding: var(--pad-control);
}

.support-send {
  min-width: 132px;
}

.support-send svg {
  width: 18px;
  height: 18px;
}

.support-footer {
  display: flex;
  justify-content: center;
  padding: 2px 0 var(--space-3);
}

.support-admin-button {
  border: 0;
  background: transparent;
  color: var(--button);
  font-size: 14px;
  padding: var(--space-3) var(--space-5);
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.support-bubble.error {
  border: 1px solid color-mix(in srgb, #d64545 45%, transparent);
}

.support-rating {
  display: flex;
  gap: var(--gap-inline);
  margin-top: var(--space-3);
}

.support-rating button {
  border: 1px solid color-mix(in srgb, var(--muted-line) 24%, transparent);
  background: var(--surface);
  border-radius: var(--radius-sm);
  min-width: 36px;
  height: 28px;
  font-size: 14px;
  line-height: 1;
  cursor: pointer;
  opacity: 0.75;
}

.support-rating button.selected {
  border-color: color-mix(in srgb, var(--button) 60%, transparent);
  background: color-mix(in srgb, var(--button) 14%, var(--surface));
  opacity: 1;
}

.support-rating button:disabled {
  cursor: default;
}

.billing-summary {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--gap-stack);
}

.usage-meter {
  display: grid;
  gap: var(--gap-tight);
}

.usage-bar {
  height: 8px;
  border-radius: var(--radius-pill);
  overflow: hidden;
  background: color-mix(in srgb, var(--muted-line) 16%, var(--surface));
}

.usage-fill {
  width: var(--usage, 0%);
  height: 100%;
  border-radius: inherit;
  background: var(--button);
}

.usage-fill.warn {
  background: var(--warning);
}

.usage-fill.exhausted {
  background: var(--danger);
}

/* Запас под фиксированную навигацию уже заложен в .scroll-root,
   собственный padding-bottom добавлял вторую пустую полосу. */
.plans-grid {
  display: grid;
  gap: var(--gap-list);
}

@media (min-width: 640px) {
  .plans-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.plan-card {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-card);
  background: var(--surface);
  display: grid;
  gap: var(--gap-stack);
  align-content: start;
}

@media (max-width: 380px) {
  .mark {
    width: 36px;
    height: 36px;
  }

  .plan-badge {
    padding-inline: var(--space-2);
  }

  /* На узком экране круг не должен съедать карточку аккаунта. */
  .pulse-dial {
    width: 176px;
    height: 176px;
  }

  .pulse-face {
    width: 132px;
    height: 132px;
  }

  .pulse-mark {
    height: 52px;
    width: 34px;
  }
}

.plan-card.current {
  border-color: color-mix(in srgb, var(--button) 44%, transparent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--button) 12%, transparent);
}

.plan-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
}

.plan-price {
  display: flex;
  align-items: baseline;
  gap: var(--gap-tight);
  font-size: 28px;
  font-weight: 850;
  line-height: 1;
}

.plan-price span {
  color: var(--muted);
  font-size: 12px;
  font-weight: 700;
}

.plan-features {
  display: grid;
  gap: var(--gap-inline);
  margin: 0;
  padding: 0;
  list-style: none;
}

.plan-features li {
  color: var(--text);
  font-size: 13px;
  line-height: 1.3;
}

.plan-feature-muted {
  color: var(--muted);
}

/* Экран «Где отвечать»: список чатов с тумблером у каждого.

   Строка намеренно не одна кнопка: нажатие по телу открывает карточку чата,
   а включение живёт в своём тумблере — промахнуться мимо включения ответов
   в чужой группе дороже, чем сделать лишний тап. */
.scope-mode {
  display: grid;
  gap: var(--gap-inline);
}

.scope-surfaces {
  display: grid;
  gap: var(--gap-stack);
}

.scope-surfaces-hint {
  margin-bottom: var(--gap-tight);
}

.scope-actions {
  flex-wrap: wrap;
}

.scope-search input {
  width: 100%;
  padding: var(--space-2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--text);
  font-family: inherit;
  font-size: 14px;
}

.scope-list {
  display: grid;
  gap: 2px;
}

.scope-group-head {
  padding: var(--space-3) var(--space-2) var(--space-1);
  color: var(--muted);
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 800;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.scope-row {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  min-width: 0;
  padding-right: var(--space-2);
  border-radius: var(--radius);
  background: var(--surface);
}

.scope-row.enabled {
  background: color-mix(in srgb, var(--button) 10%, var(--surface));
}

.scope-row-body {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  min-width: 0;
  padding: var(--space-3) var(--space-2);
  border: 0;
  border-radius: var(--radius);
  background: transparent;
  color: var(--text);
  text-align: left;
  font-family: inherit;
  cursor: pointer;
}

.scope-row-copy {
  display: grid;
  gap: 2px;
  min-width: 0;
}

.scope-row-name {
  overflow: hidden;
  font-size: 14px;
  font-weight: 700;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.scope-row-meta {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.3;
}

.scope-row-switch {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
}

.scope-empty {
  padding: var(--space-3) var(--space-2);
}

.scope-trigger {
  display: grid;
  gap: var(--gap-inline);
}

.scope-note {
  padding: var(--space-2) 0;
}

/* Строка про тариф под кнопками: сколько групп занято из скольких. */
.scope-limit {
  padding: 0 var(--space-2);
}

.scope-limit-reached {
  color: var(--danger);
}

/* Предупреждение в карточке группы. База знаний в общем чате перестаёт быть
   личной, и об этом надо сказать до включения, а не после. */
.scope-warning {
  display: flex;
  align-items: flex-start;
  gap: var(--gap-tight);
  padding: var(--space-3);
  border-radius: var(--radius);
  background: color-mix(in srgb, #d88a18 12%, var(--surface));
  color: var(--text);
  font-size: 13px;
  line-height: 1.36;
}

.scope-warning-icon {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  border-radius: var(--radius-pill);
  background: #d88a18;
  color: #fff;
  font-size: 13px;
  font-weight: 800;
}

/* Приглашение подключить аккаунт: показываем всем, у кого его нет. Без него
   список чатов ограничен теми, кто уже написал. */
.scope-invite {
  display: grid;
  gap: var(--gap-inline);
  padding: var(--space-4);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--button) 10%, var(--surface));
}

.scope-invite-title {
  font-size: 15px;
  font-weight: 800;
}

.scope-invite-text {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.36;
}

/* Ожидание кода.

   Источник картинки всё это время — прозрачный пиксель, а не пустота: у <img>
   без src браузер рисует значок битого изображения, и его не убрать ни
   размером шрифта, ни цветом. Поверх пикселя ложится каркас.

   Каркас нарисован как настоящий код: белый лист, три «глаза» по углам, поле
   модулей в тихой зоне и пробегающий блик. Смысл не в украшении — совпадают
   геометрия, размер и цвет фона, поэтому подмена готовым кодом читается как
   проявление одного и того же, а не как смена одной картинки другой.

   Пустой рамкой это место было раньше, и разница видна: ровный серый
   прямоугольник ничем не отличается от сломанной загрузки, а каркас сразу
   говорит, что именно готовится. */
.qr-skeleton {
  position: absolute;
  inset: 0;
  overflow: hidden;
  border-radius: var(--radius);
  opacity: 0;
  pointer-events: none;
  transition: opacity 240ms ease;
  /* Цвет каркаса не из темы: лист под кодом белый в любой теме, значит и
     призрак модулей должен быть светло-серым, а не «по фону приложения». */
  --qr-ghost: #d8dde5;
  /* Блик подсвечивает модули цветом кнопки — тем же, каким набрано всё
     действующее в приложении, поэтому читается как работа, а не как дефект. */
  --qr-glow: color-mix(in srgb, var(--button) 52%, transparent);
  --qr-quiet: 11%; /* тихая зона по краям — та же, что у настоящего кода */
  --qr-modules: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 22' shape-rendering='crispEdges'%3E%3Cpath fill='%23000' d='M8 0h1v1h-1zM10 0h3v1h-3zM9 1h2v1h-2zM12 1h2v1h-2zM8 2h1v1h-1zM10 2h1v1h-1zM12 2h2v1h-2zM11 3h1v1h-1zM13 3h1v1h-1zM8 4h1v1h-1zM10 4h1v1h-1zM12 4h1v1h-1zM9 5h5v1h-5zM8 6h1v1h-1zM10 6h1v1h-1zM12 6h1v1h-1zM8 7h1v1h-1zM11 7h1v1h-1zM13 7h1v1h-1zM0 8h1v1h-1zM3 8h2v1h-2zM6 8h2v1h-2zM11 8h1v1h-1zM13 8h4v1h-4zM0 9h1v1h-1zM3 9h1v1h-1zM9 9h4v1h-4zM14 9h1v1h-1zM16 9h1v1h-1zM21 9h1v1h-1zM2 10h2v1h-2zM5 10h2v1h-2zM11 10h1v1h-1zM4 11h2v1h-2zM8 11h5v1h-5zM14 11h3v1h-3zM18 11h2v1h-2zM0 12h1v1h-1zM2 12h2v1h-2zM5 12h5v1h-5zM14 12h2v1h-2zM20 12h2v1h-2zM0 13h1v1h-1zM3 13h1v1h-1zM5 13h1v1h-1zM8 13h2v1h-2zM12 13h1v1h-1zM15 13h3v1h-3zM19 13h3v1h-3zM8 14h2v1h-2zM12 14h2v1h-2zM21 14h1v1h-1zM9 16h5v1h-5zM21 16h1v1h-1zM11 17h1v1h-1zM13 17h1v1h-1zM21 17h1v1h-1zM9 18h1v1h-1zM11 18h1v1h-1zM13 18h1v1h-1zM8 19h3v1h-3zM13 19h1v1h-1zM8 20h3v1h-3zM12 20h2v1h-2zM11 21h2v1h-2zM17 21h1v1h-1zM19 21h1v1h-1z'/%3E%3C/svg%3E");
}

/* Задержка перед показом. Если код успел прийти за первые доли секунды,
   мелькнувший и тут же пропавший каркас читается как подёргивание экрана —
   лучше в такой ситуации не показывать его вовсе. */
.mtproto-qr-frame.is-loading .qr-skeleton {
  opacity: 1;
  transition-delay: 180ms;
}

/* Поле модулей — не шахматка: ровная сетка читается как «прозрачность» из
   графического редактора, то есть как отсутствие картинки. Здесь маска с
   заранее просчитанной раскладкой на 22 модуля — с полосами синхронизации и
   без углов, где стоят «глаза». Раскладка постоянная, а не случайная: код
   готовится секунду, и мельтешение разных узоров тут ни к чему.

   Рисунок задан маской, а не цветом внутри картинки, чтобы цвет остался один
   и правился в `--qr-ghost`. */
.qr-skeleton-field {
  position: absolute;
  inset: var(--qr-quiet);
  background: var(--qr-ghost);
  opacity: 0.72;
  -webkit-mask: var(--qr-modules) center / 100% 100% no-repeat;
  mask: var(--qr-modules) center / 100% 100% no-repeat;
}

/* «Глаз» — квадрат в квадрате. Все размеры в процентах от него самого, чтобы
   на узком экране рамка ужалась целиком и пропорции не поехали. */
.qr-skeleton-eye {
  position: absolute;
  width: 25%;
  aspect-ratio: 1;
  border-radius: 14%;
  background: var(--qr-ghost);
  animation: qr-skeleton-eye 1.8s ease-in-out infinite;
}

.qr-skeleton-eye::before,
.qr-skeleton-eye::after {
  content: "";
  position: absolute;
  border-radius: 12%;
}

.qr-skeleton-eye::before {
  inset: 14.3%;
  background: #fff;
}

.qr-skeleton-eye::after {
  inset: 28.6%;
  background: var(--qr-ghost);
}

.qr-skeleton-eye.at-top-left {
  top: var(--qr-quiet);
  left: var(--qr-quiet);
}

.qr-skeleton-eye.at-top-right {
  top: var(--qr-quiet);
  right: var(--qr-quiet);
  animation-delay: 0.2s;
}

.qr-skeleton-eye.at-bottom-left {
  bottom: var(--qr-quiet);
  left: var(--qr-quiet);
  animation-delay: 0.4s;
}

/* Метка выравнивания в четвёртом углу: у настоящего кода такой плотности она
   есть, и без неё каркас выглядит как код, у которого угол не дорисовался. */
.qr-skeleton-eye.is-alignment {
  right: 18.1%;
  bottom: 18.1%;
  width: 17.7%;
  animation-delay: 0.6s;
}

.qr-skeleton-eye.is-alignment::before {
  inset: 20%;
}

.qr-skeleton-eye.is-alignment::after {
  inset: 40%;
}

/* Блик идёт наискось и быстро: медленное движение само по себе читается как
   медленная загрузка, даже когда ждать ровно столько же.

   Светлая полоса поверх светло-серого поля почти не видна, поэтому блик не
   гасит модули, а зажигает: та же маска, что у поля, и через неё проезжает
   цветная полоса. Получается, что код проявляется модуль за модулем. */
.qr-skeleton-sweep {
  position: absolute;
  inset: var(--qr-quiet);
  overflow: hidden;
  -webkit-mask: var(--qr-modules) center / 100% 100% no-repeat;
  mask: var(--qr-modules) center / 100% 100% no-repeat;
}

.qr-skeleton-sweep::before {
  content: "";
  position: absolute;
  inset: -40% -25%;
  background: linear-gradient(
    105deg,
    transparent 34%,
    var(--qr-glow) 50%,
    transparent 66%
  );
  /* Равномерно и без пауз на краях: с ease-in-out полоса подолгу стоит за
     кадром, и подсветка выглядит не бегущей, а мигающей. */
  animation: qr-skeleton-sweep 1.5s linear infinite;
}

@keyframes qr-skeleton-eye {
  0%,
  100% {
    opacity: 0.74;
  }

  50% {
    opacity: 1;
  }
}

@keyframes qr-skeleton-sweep {
  from {
    transform: translateX(-53%);
  }

  to {
    transform: translateX(53%);
  }
}

/* Готовый код не подставляется, а проявляется — иначе на месте каркаса
   мгновенно возникает плотная чёрно-белая сетка, и это заметный рывок.
   Тот же кадр играет при обновлении кода: движение подсказывает, что перед
   глазами уже другой код и наводить камеру надо заново. */
.mtproto-qr.qr-appear {
  animation: qr-appear 360ms cubic-bezier(0.2, 0.8, 0.2, 1);
}

@keyframes qr-appear {
  from {
    opacity: 0;
    transform: scale(0.96);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

/* Срок кода вышел, новый ещё не пришёл. Прежний остаётся на месте, чтобы не
   мигать пустотой, но приглушён: наводить на него камеру уже бесполезно. */
.mtproto-qr-frame.is-stale .mtproto-qr {
  opacity: 0.4;
  transition: opacity 200ms ease;
}

/* Отказ или истёкшая попытка. Здесь ничего не готовится, поэтому ни каркаса,
   ни движения — пунктир и пустота честнее. */
.mtproto-qr-frame.is-empty .mtproto-qr {
  border-style: dashed;
  background: color-mix(in srgb, var(--muted-line) 12%, var(--surface));
}

/* Просьбу убрать движение выполняем, но не выбрасываем сам приём: каркас
   остаётся на месте, вместо блика и пульсации — медленное затухание поля. */
@media (prefers-reduced-motion: reduce) {
  .qr-skeleton-sweep {
    display: none;
  }

  .qr-skeleton-eye {
    animation: none;
  }

  .qr-skeleton-field {
    animation: qr-skeleton-breathe 2.4s ease-in-out infinite;
  }

  .mtproto-qr.qr-appear {
    animation: none;
  }

  @keyframes qr-skeleton-breathe {
    0%,
    100% {
      opacity: 0.62;
    }

    50% {
      opacity: 0.3;
    }
  }
}

/* Поле пароля стоит одно в своём шаге, и подпись к нему нужна отдельной
   строкой — иначе она склеивается с рамкой. */
.mtproto-password-field {
  display: grid;
  gap: var(--gap-tight);
  font-size: 13px;
}

.scope-sync-note {
  padding: 0 var(--space-2);
}

/* Снятое право отвечать — не предупреждение, а полная остановка: ассистент
   молчит везде. Красный, а не жёлтый. */
.scope-blocker {
  background: color-mix(in srgb, var(--danger) 12%, var(--surface));
}

.scope-blocker .scope-warning-icon {
  background: var(--danger);
}

.scope-gate-note {
  color: var(--muted);
}

/* Список тем: по строке на слово или фразу. */
.scope-topics {
  display: grid;
  gap: var(--gap-tight);
  font-size: 13px;
}

.scope-topics textarea {
  min-height: 96px;
}

/* Группа, ждущая подтверждения: заметна, но не выдаёт себя за работающую. */
.scope-row.pending {
  border-color: color-mix(in srgb, var(--warning) 30%, var(--border));
}

/* Кто написал реплику: только в групповой переписке, где говорящих много. */
.chat-bubble-author {
  display: block;
  font-size: 12px;
  font-weight: 600;
  opacity: 0.65;
  margin-bottom: 2px;
}

/* Фотография чата ложится поверх инициалов, а не вместо них: аватарки может не
   быть, и тогда кружок должен остаться таким же, каким был. */
.chat-row-avatar {
  position: relative;
  overflow: hidden;
}

.chat-row-photo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
}

.chat-row-avatar.has-photo .chat-row-photo {
  opacity: 1;
}

/* Карточка подключённого бота владельца: статус, имя и факты о работе. */
.own-bot-card {
  display: grid;
  gap: var(--gap-tight);
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
}

.own-bot-head {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
}

.own-bot-dot {
  flex: 0 0 auto;
  width: 10px;
  height: 10px;
  border-radius: var(--radius-pill);
  background: var(--muted);
}

.own-bot-dot.ok {
  background: var(--success);
}

.own-bot-dot.warn {
  background: var(--warning);
}

.own-bot-dot.bad {
  background: var(--danger);
}

.own-bot-name {
  display: block;
  font-weight: 700;
}

.own-bot-facts {
  display: grid;
  gap: 2px;
}

/* Список собственных ботов: у каждого своя карточка со статусом и профилем. */
.own-bot-list {
  display: grid;
  gap: var(--gap-list);
}

.own-bot-actions {
  display: flex;
  gap: var(--gap-inline);
  flex-wrap: wrap;
}

.own-bot-actions .ghost-button {
  flex: 1 1 auto;
  text-align: center;
}

.referral-link-row {
  display: flex;
  gap: var(--space-3);
  align-items: center;
  flex-wrap: wrap;
}

.referral-link-row input {
  flex: 1 1 200px;
  min-width: 0;
}

.referral-form-choice {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-3);
}

.referral-form-option {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--text);
  text-align: left;
  cursor: pointer;
}

/* Выбранная форма обведена цветом кнопки: галочку сюда не поставить — обе
   плитки одного размера, и любая иконка съедает место у подписи. */
.referral-form-option.selected {
  border-color: var(--button);
  box-shadow: inset 0 0 0 1px var(--button);
}

.referral-form-option span {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
}

.referral-table {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.referral-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--space-3);
  font-size: 14px;
}

.referral-row span {
  color: var(--muted);
}

.billing-periods {
  display: flex;
  gap: var(--space-3);
  flex-wrap: wrap;
}

.billing-period {
  display: flex;
  align-items: baseline;
  gap: 6px;
  padding: var(--space-3) var(--space-5);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--text);
  cursor: pointer;
}

.billing-period.selected {
  border-color: var(--button);
  box-shadow: inset 0 0 0 1px var(--button);
}

.billing-period span {
  color: var(--button);
  font-size: 12px;
  font-weight: 600;
}

.plan-saving {
  color: var(--button);
  font-size: 12px;
  font-weight: 600;
}

/* Плашка распродажи. Отсчёт крупнее повода: до дедлайна человеку есть дело,
   до названия акции — нет. */
.launch-banner {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: var(--pad-inset);
  border: 1px solid var(--button);
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--button) 10%, var(--surface));
}

.launch-banner strong {
  font-size: 15px;
}

.launch-banner .launch-countdown {
  font-variant-numeric: tabular-nums;
  font-size: 13px;
  color: var(--button);
  font-weight: 600;
}

/* Кошелёк на главной: сумма крупно, перевод тарифа в звёзды — мелко под
   заголовком, чтобы не спутать с балансом. */
.wallet-card {
  display: grid;
  gap: var(--gap-list);
  padding: var(--pad-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: var(--shadow);
}

.wallet-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-stack);
}

.wallet-title {
  font-weight: 750;
  font-size: 14px;
}

.wallet-note {
  margin-top: var(--space-1);
  color: var(--muted);
  font-size: 12px;
}

.wallet-value {
  font-size: 22px;
  font-weight: 850;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Старая цена зачёркнута рядом с новой: без неё скидка — это просто цена. */
.plan-price-old {
  margin-left: 6px;
  font-size: 14px;
  font-weight: 500;
  color: var(--muted);
  text-decoration: line-through;
}

.avatar-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-3);
  align-items: stretch;
}

.avatar-card {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: var(--pad-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
}

/* Установленный аватар обведён цветом кнопки — так видно, что уже стоит,
   не читая надпись на самой кнопке. */
.avatar-card.installed {
  border-color: var(--button);
}

.avatar-head {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
}

.avatar-head h2 {
  font-size: 16px;
  margin: 0;
  line-height: 1.25;
}

.avatar-titles {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

/* Кружок с буквой вместо картинки: у восьмидесяти карточек картинок не будет,
   а без опоры для глаза сетка читается как столбик одинакового текста. Цвет
   задаётся тоном раздела — сама карточка только подставляет число. */
.avatar-face {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: hsl(var(--face-hue, 214) 58% 46%);
  color: #fff;
  font-size: 15px;
  font-weight: 600;
  line-height: 1;
  user-select: none;
}

.avatar-card-hero {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex-wrap: wrap;
}

.avatar-card-hero .avatar-face {
  width: 44px;
  height: 44px;
  font-size: 19px;
}

/* Подписи под описанием: раздел, голос, «стоит у вас». Это не кнопки — по ним
   не нажимают, они отвечают на вопрос «что это за карточка и откуда». */
.avatar-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}

.avatar-chip {
  padding: 2px 8px;
  border: 1px solid var(--border);
  border-radius: 999px;
  color: var(--muted);
  font-size: 11px;
  line-height: 1.5;
  white-space: nowrap;
}

.avatar-chip.done {
  border-color: var(--button);
  color: var(--button);
}

/* Правила карточки. Список, а не абзац: у всех карточек промпт начинается
   одинаковыми общими правилами, и сплошным текстом отличия не видно. */
.avatar-rules {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin: 0;
  padding-left: 18px;
  color: var(--text);
  font-size: 13px;
  line-height: 1.4;
}

.avatar-rules li::marker {
  color: var(--button);
}

.avatar-price {
  color: var(--button);
  font-size: 13px;
  font-weight: 600;
  white-space: nowrap;
}

.avatar-meta {
  color: var(--muted);
  font-size: 12px;
}

.avatar-preview {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.4;
  border-left: 2px solid var(--border);
  padding-left: var(--space-3);
}

.avatar-filters {
  display: flex;
  gap: var(--space-3);
  flex-wrap: wrap;
}

/* Разделов витрины стало двенадцать, и переносом строк они съедали пол-экрана
   до первой карточки. Один ряд с горизонтальной прокруткой — как лента
   категорий в любом каталоге: видно, что список длинный, и он не растёт вниз. */
.avatar-filters-row {
  flex-wrap: nowrap;
  overflow-x: auto;
  /* Полоса прокрутки поверх кнопок в Telegram выглядит поломкой. */
  scrollbar-width: none;
}

.avatar-filters-row::-webkit-scrollbar {
  display: none;
}

.avatar-filters-row > * {
  /* Иначе длинные названия сжимаются в столбик из букв. */
  flex: 0 0 auto;
}

.catalog-tabs {
  display: flex;
  gap: var(--space-3);
}

.catalog-tab,
.catalog-language {
  padding: var(--space-3) var(--space-5);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--text);
  cursor: pointer;
  font-size: 14px;
}

.catalog-tab.selected,
.catalog-language.selected {
  border-color: var(--button);
  box-shadow: inset 0 0 0 1px var(--button);
}

.avatar-card {
  /* Кнопки прижаты к низу: в двух колонках карточки разной высоты, и без
     этого ряд иконок гуляет по вертикали. */
  justify-content: space-between;
  transition: border-color 0.2s ease, transform 0.2s ease;
}

.avatar-card.current {
  box-shadow: inset 0 0 0 1px var(--button);
}

.avatar-tagline {
  color: var(--text);
  font-size: 13px;
  line-height: 1.3;
}

/* Описание обрезается тремя строками: в две колонки полный текст делал карточки
   разной высоты, и ряд кнопок гулял по вертикали. Целиком оно на своём экране. */
.avatar-description {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
}

/* ─── Поиск по витрине ────────────────────────────────────────────────────────

   Разделов четырнадцать, и тому, кто знает своё занятие, быстрее написать
   «ремонт», чем найти нужную вкладку. Поле поэтому стоит выше вкладок.        */

.catalog-search {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: 0 var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
}

.catalog-search-icon {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  color: var(--muted);
  stroke-width: 2;
}

.catalog-search input {
  flex: 1;
  min-width: 0;
  padding: var(--space-3) 0;
  border: 0;
  background: transparent;
  color: var(--text);
  font: inherit;
  font-size: 15px;
}

.catalog-search input:focus {
  outline: none;
}

/* Крестик системного поиска в WebKit дублировал бы нашу кнопку. */
.catalog-search input::-webkit-search-cancel-button {
  display: none;
}

.catalog-search-clear {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
}

.catalog-search-clear svg {
  width: 16px;
  height: 16px;
  stroke-width: 2;
}

.avatar-search-hints {
  flex-wrap: wrap;
}

.catalog-empty {
  padding: var(--space-5) var(--space-4);
  color: var(--muted);
  font-size: 13px;
  line-height: 1.4;
  text-align: center;
}

/* ─── Лента разделов ──────────────────────────────────────────────────────────

   Заголовок раздела и его карточки строкой вбок. Пришла на место сплошной
   сетки из восьмидесяти карточек, в которой не было видно, где кончается один
   раздел и начинается другой.                                                 */

.avatar-rails {
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
}

.avatar-rail {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  /* Без этого строка карточек растягивает раздел по своему содержимому и
     уезжает за край экрана вместо того, чтобы прокручиваться внутри себя. */
  min-width: 0;
  max-width: 100%;
}

.avatar-rail-head {
  display: flex;
  align-items: baseline;
  gap: var(--space-3);
  padding: 0;
  border: 0;
  background: none;
  color: var(--text);
  cursor: pointer;
  text-align: left;
}

.avatar-rail-title {
  font-size: 15px;
  font-weight: 600;
}

.avatar-rail-count {
  color: var(--muted);
  font-size: 12px;
}

.avatar-rail-row {
  display: flex;
  gap: var(--space-3);
  min-width: 0;
  max-width: 100%;
  overflow-x: auto;
  scrollbar-width: none;
  /* Прокрутка останавливается на карточке, а не между ними. */
  scroll-snap-type: x proximity;
  /* Тень выделенной карточки не срезается краем прокрутки. */
  padding: 2px;
  margin: -2px;
}

.avatar-rail-row::-webkit-scrollbar {
  display: none;
}

.avatar-rail-row > .avatar-card {
  flex: 0 0 min(78vw, 260px);
  scroll-snap-align: start;
}

.card-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 6px;
  margin-top: 4px;
}

.card-actions .avatar-price {
  margin-right: auto;
  font-size: 12px;
}

.card-icon-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: 50%;
  background: var(--bg);
  color: var(--button);
  cursor: pointer;
  transition: transform 0.15s ease, background 0.2s ease, color 0.2s ease;
}

.card-icon-button svg {
  width: 18px;
  height: 18px;
  stroke-width: 2;
}

.card-icon-button:active {
  transform: scale(0.9);
}

.card-icon-button.done {
  background: var(--button);
  border-color: var(--button);
  color: #fff;
}

.card-icon-button:disabled {
  cursor: default;
  opacity: 1;
}

/* Красный только на взаимодействии — по умолчанию корзина не должна выглядеть
   тревожнее соседней кнопки правки. */
.card-icon-button.danger:active {
  color: var(--danger);
  border-color: color-mix(in srgb, var(--danger) 45%, var(--border));
}

@media (hover: hover) {
  .card-icon-button.danger:hover {
    color: var(--danger);
    border-color: color-mix(in srgb, var(--danger) 45%, var(--border));
  }
}

/* Вспышка после установки: подтверждение, которое видно боковым зрением и не
   требует читать уведомление. */
@keyframes card-installed {
  0% {
    transform: scale(1);
    box-shadow: inset 0 0 0 0 var(--button);
  }
  40% {
    transform: scale(1.03);
    box-shadow: inset 0 0 0 2px var(--button);
  }
  100% {
    transform: scale(1);
    box-shadow: inset 0 0 0 1px var(--button);
  }
}

.avatar-card.just-installed {
  animation: card-installed 0.45s ease;
}

@media (prefers-reduced-motion: reduce) {
  .avatar-card.just-installed,
  .card-icon-button:active {
    animation: none;
    transform: none;
  }
}

/* Цена есть у каждой карточки, даже когда она нулевая: «бесплатно» словами и
   «11 ★» цифрами читались как разные сущности, хотя это одна шкала. */
.price-chip {
  margin-right: auto;
  padding: 4px 10px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--bg);
  color: var(--muted);
  font-size: 12px;
  font-weight: 600;
  white-space: nowrap;
  cursor: pointer;
  transition: border-color 0.2s ease, color 0.2s ease;
}

.price-chip.paid {
  border-color: var(--button);
  color: var(--button);
}

.price-chip:active {
  transform: scale(0.96);
}

/* ─── Полоса каталога ─────────────────────────────────────────────────────────

   Своих аватаров у нового владельца один-два, и под ними экран кончался ничем:
   каталог был вкладкой наверху, мимо которой легко пройти. Полоса кричит
   намеренно — это единственное место, откуда каталог виден, не переключая
   вкладку, и тише она бы не сработала.                                        */

/*
  Фон — снимок ночного бульвара, а не градиент: полоса обещает восемьдесят с
  лишним готовых помощников, и картинка обещает это убедительнее заливки.

  Лежит в стиле, а не в разметке: документ вендорится в двух копиях, русской и
  английской, а стиль один — иначе одна и та же картинка уехала бы в репозиторий
  сайта дважды.

  Поверх снимка — своя пелена, и без неё нельзя: солнце в кадре светлее белого
  текста. Пелена идёт сверху вниз, а не слева направо: полоса узкая, и по
  горизонтали затемнение съедало почти весь кадр — оставалась тёмная плашка с
  неоном у края. Сверху кадр открыт, внизу глухой, надписи стоят на глухом.

  Отсюда и высота: на телефоне полоса в сто пикселей не оставляет снимку места
  вовсе. Сто сорок — тот минимум, на котором видно и солнце, и пальмы, и текст
  не наезжает на них.
*/
.catalog-banner {
  position: relative;
  grid-column: 1 / -1;
  display: grid;
  align-content: end;
  gap: 4px;
  justify-items: start;
  min-height: 140px;
  padding: var(--space-5);
  padding-right: 46px;
  border: 0;
  border-radius: var(--radius);
  background-color: #1b0938;
  background-image:
    linear-gradient(
    180deg,
    rgba(20, 5, 38, 0.06) 0%,
    rgba(20, 5, 38, 0.34) 38%,
    rgba(18, 4, 34, 0.86) 72%,
    rgba(16, 4, 30, 0.95) 100%
  ),
    url("data:image/webp;base64,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");
  background-position: center 46%;
  background-size: cover;
  color: #fff;
  cursor: pointer;
  font: inherit;
  text-align: left;
}

.catalog-banner-title {
  font-size: 21px;
  font-style: italic;
  font-weight: 900;
  letter-spacing: -0.02em;
  line-height: 1.05;
  text-transform: uppercase;
  text-shadow: 0 2px 0 rgba(0, 0, 0, 0.26);
}

.catalog-banner-subtitle {
  color: rgba(255, 255, 255, 0.88);
  font-size: 12px;
  font-weight: 700;
  line-height: 1.3;
}

/* Имена карточек одной строкой. Переносов нет намеренно: полоса должна остаться
   полосой, а не вырасти в панель. Затухание у самого края — страховка на случай
   длинных имён в другом языке: два имени помещаются и на телефоне, и на широком
   экране, а если однажды перестанут — край растворится, а не отрежет слово. */
.catalog-banner-names {
  display: flex;
  gap: 6px;
  max-width: 100%;
  overflow: hidden;
  margin: 2px 0 1px;
  -webkit-mask-image: linear-gradient(90deg, #000 94%, transparent);
  mask-image: linear-gradient(90deg, #000 94%, transparent);
}

.catalog-banner-chip {
  flex: 0 0 auto;
  padding: 3px 9px;
  border: 1px solid rgba(255, 255, 255, 0.42);
  border-radius: 999px;
  background: rgba(0, 0, 0, 0.16);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  line-height: 1.4;
  white-space: nowrap;
}

/* Стрелка нарисована текстом, а не иконкой: она здесь не значок действия, а
   часть надписи — «дальше туда».

   Стоит по строке заголовка, а не по центру полосы: по центру она оказывалась
   ровно на ряду имён и срезала третье из них так, что оно читалось как поломка,
   а не как «дальше есть ещё». */
.catalog-banner::after {
  content: "→";
  position: absolute;
  top: var(--space-5);
  right: var(--space-5);
  font-size: 22px;
  font-weight: 900;
  line-height: 1.05;
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.55);
}

.catalog-banner:active {
  transform: scale(0.99);
}

/* Тумблер на карточке меньше, чем в настройках: в две колонки на строку кнопок
   остаётся сантиметр, и полноразмерный переключатель выдавил бы карандаш. */
.avatar-card-switch {
  margin-right: auto;
  width: 38px;
  height: 22px;
}

.avatar-card-switch::after {
  top: 3px;
  left: 3px;
  width: 16px;
  height: 16px;
}

.avatar-card-switch:checked::after {
  transform: translateX(16px);
}

/* Выключенный аватар выцветает целиком: подписи «выключен» издалека не видно,
   а отличать его от включённого нужно именно издалека — по всей сетке сразу. */
.avatar-card.avatar-off > *:not(.card-actions) {
  opacity: 0.5;
}

/* Карточка «создать» отличается пунктиром: это не товар, а действие. */
.avatar-card.create-card {
  border-style: dashed;
  background: var(--bg);
}

/* Четыре числовых поля в две колонки: по одному на строку они растягивают
   карточку аватара вдвое, а вместе читаются как один блок «звучание». */
.avatar-tuning {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-3);
}

/* ─── Подэкраны настроек аватара ──────────────────────────────────────────────

   Голос, «как отвечать» и запись живут на своих экранах и выглядят как все
   остальные подэкраны: те же подписи над полем, что у системной инструкции.
*/
.avatar-setting-form {
  display: grid;
  gap: var(--gap-stack);
}

.avatar-setting-form label {
  display: grid;
  gap: var(--gap-tight);
  color: var(--muted);
  font-size: 12px;
  font-weight: 750;
}

/* Строка ползунка: подпись со значением сверху, сам ползунок и возврат к
   общему — снизу. В одну строку это не собирается: на телефоне ползунку
   остаётся полсантиметра, и попасть в него пальцем нельзя. */
.tuning-row {
  display: grid;
  gap: var(--gap-tight);
}

.tuning-head {
  display: flex;
  align-items: baseline;
  gap: var(--gap-inline);
}

.tuning-label {
  flex: 1 1 auto;
  min-width: 0;
  color: var(--muted);
  font-size: 12px;
  font-weight: 750;
}

.tuning-value {
  font-variant-numeric: tabular-nums;
  color: var(--text);
  font-size: 13px;
  font-weight: 750;
}

/* Пометка «как в общих» — вместо значения по смыслу, но рядом с ним: цифра
   на ползунке при этом остаётся видна, иначе непонятно, что унаследовано. */
.tuning-inherited {
  color: var(--muted);
  font-size: 12px;
  font-weight: 700;
}

.tuning-control {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--gap-inline);
}

.tuning-control input[type="range"] {
  width: 100%;
  min-height: 28px;
  margin: 0;
  accent-color: var(--button);
}

/* Кнопка возврата к общему появляется только у своего значения: у общего
   возвращать нечего, и постоянная кнопка выглядела бы сломанной. Место под
   неё держится всегда — иначе ползунки в столбце разной длины, и строка со
   своим значением дёргается вбок ровно в момент, когда её тянут пальцем. */
.tuning-reset {
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--muted);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
}

.tuning-reset:active {
  transform: translateY(1px);
}

.tuning-reset.tuning-reset-off {
  visibility: hidden;
}

/* ─── Аккаунты профиля ────────────────────────────────────────────────────────

   Форма списка взята у аккаунтов Google: наверху текущий аккаунт, остальные
   свёрнуты за одной строкой. Причина та же, что и у них — у большинства людей
   аккаунт один, и постоянно показывать пустой список незачем.

   Раскрытие анимируется по фактической высоте списка: она проставляется из
   скрипта (`syncOtherAccountsHeight`). Пределом «на глаз» короткий список
   раскрывался бы рывком в конце, а длинный обрезался бы.                     */

.accounts-current {
  display: grid;
  gap: var(--gap-list);
}

.account-row {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  text-align: left;
  min-width: 0;
}

.account-row-current {
  background: color-mix(in srgb, var(--button) 8%, var(--surface));
  border-color: color-mix(in srgb, var(--button) 32%, var(--border));
}

.account-row-other {
  padding: 0;
  border-color: transparent;
  background: transparent;
}

.account-row-pick {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  min-width: 0;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  color: var(--text);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
}

.account-row-pick:active {
  transform: scale(0.985);
}

.account-row-pick:hover {
  border-color: color-mix(in srgb, var(--button) 45%, var(--border));
}

/* Выбранный аккаунт на миг подбирается: переключение меняет весь экран, и без
   этого движения оно читалось бы как случайная перезагрузка. */
.account-row.switching .account-row-pick {
  transform: scale(0.97);
  border-color: var(--button);
  background: color-mix(in srgb, var(--button) 12%, var(--surface));
}

.account-row-badge {
  flex: 0 0 auto;
  border-radius: var(--radius-sm);
  padding: 2px var(--space-2);
  background: color-mix(in srgb, var(--button) 16%, var(--surface));
  color: var(--link);
  font-size: 11px;
  font-weight: 700;
  white-space: nowrap;
}

.account-row-remove {
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--muted);
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
  transition: color 0.18s ease, border-color 0.18s ease;
}

.account-row-remove:hover {
  color: var(--danger);
  border-color: color-mix(in srgb, var(--danger) 45%, var(--border));
}

.accounts-alert {
  border: 1px solid color-mix(in srgb, var(--warning) 45%, var(--border));
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: color-mix(in srgb, var(--warning) 10%, var(--surface));
  color: var(--text);
  font-size: 13px;
  line-height: 1.4;
}

/* Строка «Показать другие аккаунты»: стопка аватарок слева, стрелка справа —
   она и говорит, что за строкой что-то есть. */
.accounts-toggle {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  width: 100%;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-control);
  background: var(--surface);
  color: var(--text);
  font-family: inherit;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  transition: border-color 0.18s ease, background 0.18s ease;
}

.accounts-toggle:hover {
  border-color: color-mix(in srgb, var(--button) 45%, var(--border));
}

.accounts-toggle-label {
  flex: 1 1 auto;
  text-align: left;
}

.accounts-toggle-avatars {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
}

/* Аватарки в стопке заходят друг на друга — так их видно все три, не съедая
   строку целиком. */
.accounts-toggle-avatars .account-avatar + .account-avatar {
  margin-left: -10px;
}

.accounts-toggle-avatars .account-avatar {
  border: 2px solid var(--surface);
}

.accounts-toggle-caret {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  stroke-width: 2;
  transition: transform 0.28s cubic-bezier(0.22, 1, 0.36, 1);
}

.accounts-toggle.open .accounts-toggle-caret {
  transform: rotate(180deg);
}

.account-avatar-small {
  width: 28px;
  height: 28px;
  font-size: 11px;
}

.account-avatar-rest {
  color: var(--muted);
  font-weight: 700;
}

.accounts-others {
  overflow: hidden;
  max-height: 0;
  opacity: 0;
  transition: max-height 0.32s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.24s ease;
}

.accounts-others.open {
  opacity: 1;
}

/* Мгновенное схлопывание при открытии шторки: анимировать нечего, список
   ещё не показывали. */
.accounts-others.instant {
  transition: none;
}

.accounts-list {
  display: grid;
  gap: var(--gap-list);
  padding-top: var(--gap-list);
}

/* Строки въезжают по очереди — сверху вниз, за раскрытием. Задержка растёт с
   номером строки: пять аккаунтов это максимум, поэтому лесенка не затягивается. */
.accounts-others .account-row-other {
  opacity: 0;
  transform: translateY(-6px);
  transition: opacity 0.24s ease, transform 0.24s cubic-bezier(0.22, 1, 0.36, 1);
}

.accounts-others.open .account-row-other {
  opacity: 1;
  transform: translateY(0);
  transition-delay: calc(var(--row-index, 0) * 45ms + 60ms);
}

.accounts-menu {
  display: grid;
  gap: var(--gap-list);
}

.accounts-menu-item {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  width: 100%;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  color: var(--text);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: border-color 0.18s ease, transform 0.18s ease;
}

.accounts-menu-item:hover {
  border-color: color-mix(in srgb, var(--button) 45%, var(--border));
}

.accounts-menu-item:active {
  transform: scale(0.985);
}

.accounts-menu-item:disabled {
  opacity: 0.55;
  cursor: default;
  transform: none;
}

.accounts-menu-item > svg {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  stroke-width: 1.7;
  color: var(--link);
}

.accounts-menu-copy {
  flex: 1 1 auto;
  min-width: 0;
  display: grid;
  gap: var(--gap-micro);
}

.accounts-menu-title {
  font-size: 14px;
  font-weight: 650;
}

.accounts-menu-note {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
}

/* Почта в шторке аккаунтов: ряд ящиков-плиток. Плитка уже строки коннектора —
   здесь важен обзор «что подключено», действия живут на экране коннекторов. */
.accounts-mail {
  display: grid;
  gap: var(--gap-list);
}

/* Лента писем во вкладке «Почта»: конверт одной строкой — тема, кто и когда. */
/* Строка письма — кнопка: письмо открывается, и палец должен это знать. */
.mail-row {
  display: flex;
  align-items: baseline;
  gap: var(--gap-inline);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  width: 100%;
  text-align: left;
  font: inherit;
  color: inherit;
  cursor: pointer;
}

.mail-row:active {
  background: var(--surface-active, var(--surface));
}

.mail-bar {
  display: flex;
  gap: var(--gap-inline);
}

.mail-select {
  flex: 1 1 0;
  min-width: 0;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  color: inherit;
  font: inherit;
}

.mail-search {
  width: 100%;
}

/*
  Текст письма показываем как есть — переносами строк, которыми его написал
  человек. Единственное, что здесь нужно от разметки: длинное слово или ссылка
  не должны разъезжать лист вширь.
*/
.mail-letter-text {
  max-height: 40vh;
  overflow-y: auto;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  font-size: 13px;
  line-height: 1.5;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
}

.mail-letter-actions {
  display: flex;
  gap: var(--gap-inline);
}

.mail-letter-actions > .button {
  flex: 1 1 0;
}

.mail-reply-text {
  width: 100%;
  resize: vertical;
}

.mail-row-copy {
  flex: 1 1 auto;
  min-width: 0;
  display: grid;
  gap: var(--gap-micro);
}

.mail-row-subject {
  font-size: 14px;
  font-weight: 650;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.mail-row-meta {
  color: var(--muted);
  font-size: 12px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.mail-row-date {
  color: var(--muted);
  font-size: 12px;
  flex: 0 0 auto;
}

.accounts-mail-head {
  font-size: 12px;
  font-weight: 650;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

.accounts-mail-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--gap-list);
}

.accounts-mail-item {
  display: grid;
  justify-items: center;
  gap: var(--gap-micro);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  color: var(--text);
  font-family: inherit;
  cursor: pointer;
  transition: border-color 0.18s ease, transform 0.18s ease;
  min-width: 0;
}

.accounts-mail-item:hover {
  border-color: color-mix(in srgb, var(--button) 45%, var(--border));
}

.accounts-mail-item:active {
  transform: scale(0.985);
}

.accounts-mail-item:disabled {
  opacity: 0.55;
  cursor: default;
  transform: none;
}

.accounts-mail-icon {
  position: relative;
  width: 46px;
  height: 46px;
  border-radius: var(--radius-pill);
  display: grid;
  place-items: center;
  background: color-mix(in srgb, var(--tile-accent, var(--button)) 14%, var(--surface));
  color: var(--tile-accent, var(--link));
}

.accounts-mail-icon svg {
  width: 23px;
  height: 23px;
  stroke-width: 2;
}

.accounts-mail-icon img {
  width: 28px;
  height: 28px;
  object-fit: contain;
}

.accounts-mail-dot {
  position: absolute;
  right: 1px;
  bottom: 1px;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--success);
  border: 2px solid var(--surface);
  display: none;
}

.accounts-mail-item.connected .accounts-mail-dot {
  display: block;
}

.accounts-mail-name {
  font-size: 12.5px;
  font-weight: 650;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.accounts-mail-state {
  font-size: 11px;
  color: var(--muted);
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.accounts-menu-chevron {
  flex: 0 0 auto;
  width: 16px;
  height: 16px;
  stroke-width: 2;
  color: var(--muted-line);
}

.accounts-steps {
  margin: 0;
  padding-left: var(--space-7);
  display: grid;
  gap: var(--gap-tight);
  color: var(--text);
  font-size: 13px;
  line-height: 1.45;
}

.accounts-link-box {
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--bg);
}

.accounts-link-url {
  flex: 1 1 auto;
  min-width: 0;
  overflow-wrap: anywhere;
  font-size: 12px;
  line-height: 1.4;
  color: var(--text);
  user-select: all;
}

/* ─── Доступы ассистента ─────────────────────────────────────────────────────

   Раздел только показывает: галочки живут в настройках Telegram Business, и
   притворяться, что их можно двигать отсюда, нечестно. Поэтому строки — не
   переключатели, а факты с последствиями.                                    */

.rights-alert {
  border: 1px solid color-mix(in srgb, var(--danger) 45%, var(--border));
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: color-mix(in srgb, var(--danger) 8%, var(--surface));
  color: var(--text);
  font-size: 13px;
  line-height: 1.4;
}

.rights-groups {
  display: grid;
  gap: var(--gap-stack);
}

.rights-group {
  display: grid;
  gap: var(--gap-tight);
}

.rights-group-title {
  color: var(--muted);
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.rights-row {
  display: flex;
  align-items: flex-start;
  gap: var(--gap-inline);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--pad-inset);
  background: var(--surface);
  animation: rights-row-in 0.26s cubic-bezier(0.22, 1, 0.36, 1) both;
  animation-delay: calc(var(--row-index, 0) * 30ms);
}

@keyframes rights-row-in {
  from {
    opacity: 0;
    transform: translateY(-4px);
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.rights-mark {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  border-radius: var(--radius-pill);
  display: grid;
  place-items: center;
  font-size: 13px;
  font-weight: 800;
  line-height: 1;
  background: color-mix(in srgb, var(--muted-line) 16%, var(--surface));
  color: var(--muted);
}

.rights-row.granted .rights-mark {
  background: color-mix(in srgb, var(--success) 16%, var(--surface));
  color: var(--success);
}

/* Снятое обязательное право — единственное, что здесь красное: без него
   ассистент не работает вовсе, а не частично. */
.rights-row.essential:not(.granted) {
  border-color: color-mix(in srgb, var(--danger) 45%, var(--border));
}

.rights-row.essential:not(.granted) .rights-mark {
  background: color-mix(in srgb, var(--danger) 14%, var(--surface));
  color: var(--danger);
}

.rights-copy {
  flex: 1 1 auto;
  min-width: 0;
  display: grid;
  gap: var(--gap-micro);
}

.rights-title {
  font-size: 14px;
  font-weight: 650;
}

.rights-note {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
}

.rights-status {
  flex: 0 0 auto;
  color: var(--muted);
  font-size: 11px;
  font-weight: 700;
  white-space: nowrap;
}

.rights-row.granted .rights-status {
  color: var(--success);
}

.rights-row.essential:not(.granted) .rights-status {
  color: var(--danger);
}

@media (prefers-reduced-motion: reduce) {
  .accounts-others,
  .accounts-others .account-row-other,
  .accounts-toggle-caret,
  .account-row-pick {
    transition: none;
  }

  .rights-row {
    animation: none;
  }
}

/* ── Что приложить к реплике ────────────────────────────────────────────────
   Три источника стоят плитками в ряд, а не строками списка: они равнозначны и
   выбираются взглядом, а не чтением. Всё, что ниже, — списком: там источников
   может быть сколько угодно, и у каждого есть подпись. */
.attach-tiles {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--gap-tight);
}

.attach-tile {
  display: grid;
  justify-items: center;
  gap: var(--gap-micro);
  padding: 14px 8px;
  border: 1px solid color-mix(in srgb, var(--muted-line) 16%, transparent);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--text);
  font-family: inherit;
  cursor: pointer;
}

.attach-tile:active {
  transform: translateY(1px);
}

.attach-tile-icon {
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--muted-line) 12%, transparent);
  color: var(--text);
}

.attach-tile-icon svg {
  width: 21px;
  height: 21px;
  stroke-width: 1.8;
}

.attach-tile-label {
  font-size: 13px;
  font-weight: 800;
}

.attach-sources[hidden] {
  display: none;
}

.attach-connectors {
  min-height: 64px;
}

/* ── Файлы подключённого сервиса ─────────────────────────────────────────── */
.connector-files-bar {
  display: flex;
  align-items: center;
  gap: var(--gap-tight);
}

.connector-files-up {
  flex: 0 0 auto;
}

.connector-files-search {
  flex: 1 1 auto;
  min-width: 0;
}

/* Список ограничен по высоте: лист вложения не должен вырастать во весь экран
   и утаскивать за собой переписку, ради которой его открыли. */
.connector-file-list {
  display: grid;
  gap: var(--gap-tight);
  max-height: 46vh;
  overflow-y: auto;
  overscroll-behavior: contain;
}

.connector-file-row {
  width: 100%;
  display: flex;
  align-items: center;
  gap: var(--gap-inline);
  padding: 10px 12px;
  border: 1px solid color-mix(in srgb, var(--muted-line) 14%, transparent);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text);
  text-align: left;
  font-family: inherit;
  cursor: pointer;
}

.connector-file-icon {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 30px;
  height: 30px;
  color: var(--muted);
}

.connector-file-row.folder .connector-file-icon {
  color: var(--link);
}

.connector-file-icon svg {
  width: 19px;
  height: 19px;
  stroke-width: 1.8;
}

.connector-file-copy {
  min-width: 0;
  flex: 1 1 auto;
  display: grid;
  gap: 2px;
}

.connector-file-name {
  font-size: 14px;
  font-weight: 700;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.connector-file-note {
  color: var(--muted);
  font-size: 11px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ── Экран коннекторов ──────────────────────────────────────────────────── */
.connector-row {
  grid-template-columns: auto minmax(0, 1fr) auto;
}

.connector-row .connector-action {
  min-height: 36px;
  padding: 0 14px;
  font-size: 13px;
  white-space: nowrap;
}

/* Подключённое отличается от неподключённого рамкой, а не только надписью на
   кнопке: список читают сверху вниз, а кнопки стоят справа. */
.connector-row.connected {
  border-color: color-mix(in srgb, var(--success) 34%, transparent);
}

.connectors-locked {
  padding: var(--pad-inset);
  border: 1px solid color-mix(in srgb, var(--muted-line) 16%, transparent);
  border-radius: var(--radius);
  background: var(--surface);
}

.connector-password-link {
  color: var(--link);
  font-size: 13px;
}

.connector-password-link[hidden] {
  display: none;
}

/* Кнопка «с другого устройства» стоит рядом с «Подключить» и намеренно уже её:
   основной путь один, а этот — выручалочка для тех, у кого в почту заходили
   не с этого телефона. */
.connector-row {
  grid-template-columns: auto minmax(0, 1fr) auto auto;
}

.connector-row .connector-qr-button {
  min-height: 36px;
  padding: 0 10px;
  margin-left: 6px;
}

.connector-row .connector-qr-button svg {
  width: 18px;
  height: 18px;
}

.connector-row .connector-qr-button[hidden] {
  display: none;
}

/* Код печатается на белом и без скруглений по краям картинки: камера ищет
   белое поле вокруг, и цветная подложка темы его съедает. */
.connector-qr-image {
  width: min(240px, 70vw);
  margin: 0 auto;
  padding: 10px;
  border-radius: var(--radius);
  background: #fff;
}

.connector-qr-image svg {
  display: block;
  width: 100%;
  height: auto;
}

/* Восемь знаков кода — второй способ пройти тот же путь, поэтому набор
   крупный и с разрядкой: его переписывают глазами с одного экрана на другой. */
.connector-qr-code {
  margin-top: 10px;
  font-size: 22px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-align: center;
  text-transform: uppercase;
}

.connector-qr-code[hidden] {
  display: none;
}

/* ── Поддержка внутри «Сообщений» ───────────────────────────────────────────
   Обращения — такой же список разговоров, как переписки собеседников, поэтому
   строка у них общая (.chat-row). Своего здесь только то, чего у переписок
   нет: переключатель разделов, счётчик на нём и шапка со «Создать». */
.messages-sections {
  margin-bottom: var(--gap-list);
}

.section-badge {
  display: inline-grid;
  place-items: center;
  min-width: 18px;
  height: 18px;
  margin-left: 6px;
  padding: 0 5px;
  border-radius: var(--radius-pill);
  background: var(--danger);
  color: #fff;
  font-size: 11px;
  font-weight: 850;
}

.section-badge[hidden] {
  display: none;
}

.support-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--gap-inline);
  margin-bottom: var(--gap-list);
}

.support-head[hidden] {
  display: none;
}

.support-create {
  flex: 0 0 auto;
  min-height: 36px;
  padding: 0 14px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
}

/* Служебная реплика — не сообщение: это подпись посреди переписки, и пузырём
   она читалась бы как чей-то ответ. */
.support-system-note {
  text-align: center;
  padding: var(--gap-tight) 0;
  white-space: pre-line;
}

/* Превью разметки над полем ответа: как реплика уйдёт собеседнику. Читается
   частью поля, а не отдельной карточкой, — это ещё не сообщение, а то, что в
   поле написано, показанное иначе. */
.composer-format {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--gap-micro) var(--gap-tight);
  padding: var(--gap-tight);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--link) 8%, transparent);
}

.composer-format-head {
  flex: 0 0 auto;
  color: var(--muted);
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 800;
  text-transform: uppercase;
}

.composer-format-body {
  flex: 1 1 100%;
  min-width: 0;
}

.composer-format-drop {
  flex: 0 0 auto;
  margin-left: auto;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-family: var(--font-condensed);
  font-size: 11px;
  font-weight: 800;
  text-decoration: underline;
}

/* Ряд под полем ответа в обращении. Чип занимает ровно свою ширину, подсказка
   забирает остаток, отправка стоит у правого края — иначе при скрытом чипе
   самолётик уезжал бы к подсказке и переставал быть краем поля. */
#supportTicketChips {
  flex: 0 0 auto;
}

#supportTicketHint {
  flex: 1 1 auto;
  min-width: 0;
}

/* Реплика, которая ещё пишется. Курсор-полоска в конце строки — единственный
   способ отличить «ассистент думает» от «ассистент закончил на полуслове». */
.chat-bubble.streaming .chat-bubble-text::after {
  content: "";
  display: inline-block;
  width: 2px;
  height: 1em;
  margin-left: 2px;
  vertical-align: text-bottom;
  background: currentColor;
  animation: chat-caret 1s steps(2, start) infinite;
}

@keyframes chat-caret {
  to {
    visibility: hidden;
  }
}

@media (prefers-reduced-motion: reduce) {
  .chat-bubble.streaming .chat-bubble-text::after {
    animation: none;
  }
}

/* Разметка внутри реплики. Ассистент пишет списками и абзацами, и без этих
   правил они слипались в одну строку: у пузыря нет своих отступов. */
.chat-bubble-text p {
  margin: 0 0 var(--gap-tight);
}

.chat-bubble-text p:last-child,
.chat-bubble-text ul:last-child,
.chat-bubble-text ol:last-child {
  margin-bottom: 0;
}

.chat-bubble-text ul,
.chat-bubble-text ol {
  margin: 0 0 var(--gap-tight);
  padding-left: 1.2em;
}

/* Форматирование внутри реплики. Ассистент выделяет сумму, срок и условие, и
   выделения должны читаться выделениями — в пузыре, а не в отдельном блоке. */
.chat-bubble-text strong {
  font-weight: 800;
}

.chat-bubble-text code {
  padding: 0 3px;
  border-radius: 4px;
  background: color-mix(in srgb, currentColor 10%, transparent);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 0.92em;
}

.chat-bubble-text pre {
  margin: var(--gap-micro) 0;
  padding: var(--gap-tight);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, currentColor 8%, transparent);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 0.92em;
  /* Длинная команда не должна растягивать пузырь на весь экран. */
  overflow-x: auto;
  white-space: pre;
}

/* Цитата — полоской слева, как в самом Telegram: рамка вокруг читалась бы
   вставленной карточкой, а это часть той же реплики. */
.chat-bubble-text blockquote {
  /* Отступ сверху и снизу — вместо пустой строки, которую убрал рендер: без
     него цитата слипается с абзацем и читается его продолжением. */
  margin: var(--gap-micro) 0;
  padding-left: var(--gap-tight);
  border-left: 2px solid color-mix(in srgb, currentColor 35%, transparent);
  opacity: 0.85;
}

/* Скрытый текст: закрашен, пока по нему не нажали. Курсор-указатель нужен,
   иначе непонятно, что это вообще можно открыть. */
.chat-bubble-text .rich-spoiler {
  border-radius: 3px;
  background: currentColor;
  color: transparent;
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
}

.chat-bubble-text .rich-spoiler.revealed {
  background: transparent;
  color: inherit;
  cursor: auto;
}

.chat-bubble-author {
  display: block;
  font-size: 11px;
  font-weight: 800;
  opacity: 0.7;
  margin-bottom: 2px;
}

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

/* ── Живой разговор ─────────────────────────────────────────────────────────
   Экран без списков и полей. Пока человек говорит, читать ему нечего, и всё,
   что должно быть на виду, — слышат ли его сейчас и как это закончить. Отсюда
   вертикаль: круг занимает середину, кнопки прижаты к низу, под большой палец. */
.voice-live-view {
  /* Экран разговора занимает всё окно: поле ответа должно стоять у нижнего
     края, а не висеть посреди пустоты. Запас снизу здесь не нужен — нижнего
     меню на этом экране нет, его место и занимает поле.

     vh запасным: dvh считает панель браузера, но есть не везде. */
  min-height: calc(100vh - var(--gutter));
  min-height: calc(100dvh - var(--gutter));
  align-content: stretch;
  grid-template-rows: 1fr auto;
}

.voice-live-stage {
  display: grid;
  /* Пока в разговоре ни слова — капсула стоит в центре экрана, как при
     дозвоне. Первая реплика переключает верстку в начало: иначе у пустой
     ленты снизу оставалась дыра ровно в её высоту. */
  align-content: center;
  justify-items: center;
  gap: var(--space-7);
  text-align: center;
}

.voice-live-stage:has(.voice-live-log:not(:empty)) {
  align-content: start;
}

/* Круг и статус — свой слой поверх ленты, а не растущий с ней элемент грида:
   зажатый на .voice-live-view скролл-контейнер (.scroll-root) удерживает их
   у нижнего края, пока лента сверху набирает реплики.

   Снизу, а не сверху. Пока разговор короткий, разницы нет, но на длинном
   капсула уезжала за верхний край: человек говорил, глядя в текст, и живого
   отклика на свой голос не видел вовсе. Теперь она стоит там же, куда падает
   взгляд перед тем, как написать, — прямо над полем ответа. */
.voice-live-orb-row {
  position: sticky;
  bottom: 0;
  z-index: 3;
  display: grid;
  justify-items: center;
  gap: var(--space-7);
  width: 100%;
  padding-top: var(--space-5);
  padding-bottom: var(--space-5);
  background: var(--bg);
}
/* Без своего грида реплики лежали обычными блоками во всю ширину: у
   .chat-bubble выравнивание задано через justify-self, а оно работает только
   в грид- или флекс-контейнере. Ширина на всю ленту — по той же причине:
   в узком, по контенту, контейнере «слева» и «справа» не отличить. */
.voice-live-log {
  display: grid;
  gap: var(--gap-tight);
  width: 100%;
  /* .voice-live-stage центрирует статус и подпись под кругом — реплики в
     ленте к ним не относятся и читаются как обычная переписка. */
  text-align: left;
}

/* Капсула здесь — не картинка состояния, а голос: пар внутри гуще и быстрее
   ровно настолько, насколько громко звучит речь. Уровень подаётся в шейдер
   каждый кадр (vaporCore.setLevel), поэтому «эквалайзер» живёт в самой материи
   и ему не нужны полоски.

   Размер — с логотип в середине экрана, а не с кнопку на главной: разговор
   занимает весь экран, и капсула во всю ширину давила бы на реплики. */
.voice-live-orb {
  --pulse-size: 148px;
  --pulse-face-size: 112px;
  cursor: default;
  transition: transform 0.34s cubic-bezier(0.34, 1.2, 0.64, 1), opacity 0.34s ease;
}

/* Разговор кончился — капсула сворачивается обратно в маленькую кнопку в
   середине экрана и уводит взгляд туда, откуда её и вызвали. Без этого экран
   просто исчезал, и связь между кругом на главной и разговором приходилось
   держать в голове. */
.voice-live-view.collapsing .voice-live-orb {
  transform: scale(0.38);
}

.voice-live-view.collapsing .voice-live-log,
.voice-live-view.collapsing .voice-live-status,
.voice-live-view.collapsing /* Полоса ввода занимает место нижнего меню: пока идёт разговор, вкладки не
   нужны, а сказать что-то текстом — нужно. Поле то же самое, что в переписке,
   поэтому и правил своих у него почти нет. */ .voice-live-composer {
  margin-top: var(--space-5);
}

/* Красная кнопка отбоя стоит в одном ряду с остальными и по размеру равна им:
   выпадая из ряда, она читалась бы предупреждением, а не концом разговора. */
.voice-live-end {
  flex: none;
  width: 38px;
  height: 38px;
  border: 0;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--danger);
  color: #ffffff;
  cursor: pointer;
}

.voice-live-end svg {
  width: 20px;
  height: 20px;
  stroke-width: 2.2;
}

/* Выключенный микрофон красится тревожным, а не гаснет: погасшая кнопка среди
   соседних читается как «недоступна», а не как «микрофон выключен». */
.composer-send.muted {
  background: color-mix(in srgb, var(--danger) 16%, var(--surface));
  color: var(--danger);
}

/* Главная гаснет перед разговором. Уходит всё, кроме круга: он и есть то, во
   что превращается экран, и мигать вместе с остальным ему нельзя. */
.home-view.leaving > *:not(.pulse) {
  opacity: 0;
  transition: opacity 0.26s ease;
}

.home-view.leaving {
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  .home-view.leaving > * {
    transition: none;
  }
}

/* Запись реплики разговора. Стоит под текстом, а не вместо него: сначала
   читают, и только если хочется услышать интонацию — нажимают. */
.assistant-clip {
  margin-top: var(--space-2);
}

/* Ряд действий под репликой разговора: переслушать, забрать текст, передать
   дальше. Значки блеклые до наведения — реплику читают, а не разглядывают
   кнопки под ней. */
.assistant-actions {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-top: var(--space-2);
}

.assistant-action {
  border: 0;
  padding: 0;
  background: none;
  color: var(--muted);
  cursor: pointer;
  display: grid;
  place-items: center;
}

.assistant-action svg {
  width: 17px;
  height: 17px;
  stroke-width: 1.9;
}

.assistant-action:hover,
.assistant-action:focus-visible {
  color: var(--text);
}

/* Внутри ряда у записи своего отступа сверху уже нет: его держит сам ряд. */
.assistant-actions .assistant-clip {
  margin-top: 0;
}

/* Распорка между настройками и отправкой: без неё шестерёнка липнет к
   микрофону, и ряд читается четырьмя одинаковыми кнопками подряд. */
.composer-spacer {
  flex: 1 1 auto;
}

/* ── Свои ключи к моделям ───────────────────────────────────────────────── */
.provider-key {
  display: grid;
  gap: var(--space-3);
}

.provider-key-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-3);
}

.provider-key-title {
  font-weight: 800;
}

/* Состояние подписью, а не цветной точкой: «сохранён», «работает» и текст
   отказа провайдера — три разных сообщения, и точкой их не разделить. */
.provider-key-state {
  font-size: 12px;
  color: var(--muted);
  text-align: right;
}

.provider-key-state.saved {
  color: var(--success);
}

.provider-key-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3);
}

.provider-key-link {
  margin-left: auto;
  font-size: 13px;
  color: var(--link);
}

/* Черновик сообщения из разговора: пунктирная рамка та же, что у черновиков в
   переписке — это одно и то же обещание «ещё не ушло». */
.voice-live-draft {
  display: grid;
  gap: var(--space-2);
}

.voice-live-draft-to {
  font-size: 12px;
  font-weight: 800;
  opacity: 0.7;
}

.voice-live-draft-actions {
  display: flex;
  gap: var(--space-3);
}

.voice-live-draft-actions .button {
  flex: 1 1 auto;
  min-height: 34px;
  font-size: 13px;
}

.voice-live-draft-state {
  font-size: 12px;
  color: var(--muted);
}
