/* ══════════════════════════════════════════════════════════════════
 * Палитра: две темы, переключаются атрибутом data-theme на <html>.
 *
 * Раньше цвета тянулись напрямую из --tg-theme-*, из-за чего тема
 * Telegram-клиента перебивала любой выбор пользователя, а светлый
 * фон приходил вместе с невидимыми на нём белыми разделителями.
 * Теперь theme_params не участвует: режим «авто» читает
 * Telegram.WebApp.colorScheme и сам ставит data-theme (см. app.js).
 *
 * --ov-* — полупрозрачные оверлеи (подложки, границы, hover).
 * В тёмной теме осветляют, в светлой затемняют. Число в имени —
 * альфа исходного белого оверлея, чтобы маппинг читался глазами.
 * Контейнеры, которые остаются тёмными в обеих темах (режим
 * вождения, орб), переопределяют --ov-* обратно на белые ниже.
 * ══════════════════════════════════════════════════════════════════ */

/* Шрифт сайта 1do — Onest Variable (OFL, vendor/fonts/OFL-Onest.txt). Только
 * кириллица и латиница: остальные наборы приложению не нужны. */
@font-face {
  font-family: 'Onest Variable';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('vendor/fonts/onest-cyrillic-wght-normal.woff2') format('woff2-variations');
  unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;
}
@font-face {
  font-family: 'Onest Variable';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('vendor/fonts/onest-latin-wght-normal.woff2') format('woff2-variations');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}

:root,
[data-theme="dark"] {
  color-scheme: dark;
  /* Палитра 1do (07.10.2026): те же значения, что у тёмной темы сайта
   * prototype/coder-landing/src/index.css (.dark) — фон #0a0d14, карточки
   * #121722, бренд #2f5bea, интерактив #7b97ff. Сайт и приложение одним
   * продуктом. */
  --bg: #0a0d14;
  --text: #e8ebf3;
  --hint: #98a2b8;
  --link: #7b97ff;
  --button: #2f5bea;
  --button-text: #ffffff;
  --secondary-bg: #121722;
  --section-header: #98a2b8;
  --destructive: #f28b84;
  --success: #4cc683;
  /* Янтарь только для «внимания» (вопрос агента, прервано) и только чистым:
   * заливка янтарём на тёмной карточке смешивается в коричневый. */
  --warning: #fbbf24;
  --on-warning: #1a1300;

  /* Вторичный акцент. Раньше файловые иконки и кнопки скачивания красились
   * в #a06eff, соседние кнопки — в #6c9bff, и два синих стояли рядом в одной
   * карточке. Теперь фиолетовый остаётся только там, где он брендовый
   * (свечение агента, градиенты), а интерактив берёт --accent. */
  --violet: #b39af5;
  /* Текст поверх насыщенной заливки. В тёмной теме заливки яркие, и белый
   * на них не читается (2.15-2.70 при норме 4.5), а тёмный даёт 5-8.7. */
  --on-accent: #0a0d14;
  /* Кнопка отправки и рамка композера — бренд 1do. Раньше тут стояла
   * терракота Claude (#c26440): единственный тёплый элемент на сине-чёрном
   * экране, с бренд-синим 1do не сочеталась. */
  --send: #2f5bea;
  --send-bg: rgba(47, 91, 234, 0.16);
  --send-line: rgba(123, 151, 255, 0.50);
  /* Светлый акцент для ТЕКСТА на тёмной подложке: обычный --accent там
   * проваливается по контрасту (сюда сведён бывший #aac8ff). */
  --accent-soft: #b4c4ff;

  /* Ступени подсветки. До этого каждая подсветка акцента подбиралась на
   * глаз заново: rgba(108,155,255,…) встречалась с ОДИННАДЦАТЬЮ разными
   * альфами (0.06 … 0.45), всего 140 уникальных цветных rgba на файл.
   * Три ступени на семантику: заливка, заливка под hover, граница. */
  --accent-bg: rgba(123, 151, 255, 0.10);
  --accent-bg-strong: rgba(123, 151, 255, 0.18);
  --accent-line: rgba(123, 151, 255, 0.32);
  --success-bg: rgba(30, 158, 90, 0.18);
  --success-line: rgba(76, 198, 131, 0.32);
  --danger-bg: rgba(210, 70, 62, 0.18);
  --danger-line: rgba(242, 139, 132, 0.32);
  --warning-bg: rgba(251, 191, 36, 0.10);
  --warning-line: rgba(251, 191, 36, 0.40);

  /* Статусы (07.10.2026). «На паузе» — нейтральный slate: агент закончил ход
   * и ждёт, это норма, а не тревога. Цвет — только тому, что требует
   * внимания: работает (бренд), вопрос (янтарь), ошибка (красный), закрыто
   * человеком (зелёный). *-fg — текст пилюли, *-bg — её подложка. */
  --st-run: #7b97ff;   --st-run-fg: #9fb2ff;  --st-run-bg: rgba(47, 91, 234, 0.18);  --st-run-line: rgba(123, 151, 255, 0.45);
  --st-idle: #7d879c;  --st-idle-fg: #b4bccd; --st-idle-bg: rgba(152, 162, 184, 0.12);
  --st-ask: #fbbf24;   --st-ask-fg: #fcd34d;  --st-ask-fill: #fbbf24; --st-ask-line: rgba(251, 191, 36, 0.55);
  --st-err: #f26b62;   --st-err-fg: #ff9a92;  --st-err-bg: rgba(242, 100, 90, 0.14); --st-err-line: rgba(242, 139, 132, 0.40);
  --st-done: #4cc683;  --st-done-fg: #5fd69a; --st-done-bg: rgba(76, 198, 131, 0.12);
  --pin: #b39af5;
  --focus-ring: 0 0 0 3px rgba(123, 151, 255, 0.45);
  --violet-bg: rgba(138, 99, 232, 0.18);

  --ov-02: rgba(255, 255, 255, 0.02);
  --ov-03: rgba(255, 255, 255, 0.03);
  --ov-04: rgba(255, 255, 255, 0.04);
  --ov-05: rgba(255, 255, 255, 0.05);
  --ov-06: rgba(255, 255, 255, 0.06);
  --ov-07: rgba(255, 255, 255, 0.07);
  --ov-08: rgba(255, 255, 255, 0.08);
  --ov-10: rgba(255, 255, 255, 0.10);
  --ov-12: rgba(255, 255, 255, 0.12);
  --ov-14: rgba(255, 255, 255, 0.14);
  --ov-15: rgba(255, 255, 255, 0.15);
  /* --ov-16 и --ov-24 использовались в 5 местах, но НИКОГДА не были
   * объявлены: var() без fallback не резолвится, и эти свойства просто
   * не применялись. Ступени добавлены, места ожили. */
  --ov-16: rgba(255, 255, 255, 0.16);
  --ov-20: rgba(255, 255, 255, 0.20);
  --ov-24: rgba(255, 255, 255, 0.24);

  --border: var(--ov-08);
  --input-bg: var(--ov-08);
  /* Подложки под код и вложенные плашки: в тёмной теме углубляют,
   * в светлой дают серую заливку вместо чёрного пятна. */
  --sunk-20: rgba(0, 0, 0, 0.20);
  --sunk-25: rgba(0, 0, 0, 0.25);
  --sunk-30: rgba(0, 0, 0, 0.30);
  --sunk-35: rgba(0, 0, 0, 0.35);
  /* Цвет теней тремя ступенями: на светлом фоне те же альфы выглядят
   * грязными, поэтому в светлой теме они втрое мягче. */
  --sh-soft: rgba(0, 0, 0, 0.20);
  --sh-mid: rgba(0, 0, 0, 0.30);
  --sh-strong: rgba(0, 0, 0, 0.45);
}

[data-theme="light"] {
  color-scheme: light;
  /* Палитра 1do (07.10.2026), подача как на сайте: голубоватый холст
   * #eef2f9, на нём белые карточки с тонкой рамкой #e3e8f1 и мягкой тенью,
   * бренд #2f5bea в акцентах. Серый #5f6b85 — 5:1 на холсте; ссылки
   * #2448c9 темнее бренда (≥ 7:1). Оверлеи — slate rgba(15,23,42,…), а не
   * чистый чёрный: на голубоватом фоне чёрный давал грязно-серые пятна. */
  --bg: #eef2f9;
  --text: #0f172a;
  --hint: #5f6b85;
  --link: #2448c9;
  --button: #2f5bea;
  --button-text: #ffffff;
  --secondary-bg: #ffffff;
  --section-header: #5f6b85;
  --destructive: #b91c1c;
  --success: #177a45;
  /* Янтарный ТЕКСТ, проходящий 4.5:1 на белом, неизбежно коричневый
   * (#96490a). «Внимание» текстом — оранжевый, янтарь — только заливкой
   * пилюли с тёмным текстом. */
  --warning: #c2410c;
  --on-warning: #1f1300;

  /* Те же роли, но от светлотемных базовых цветов. Альфы выше, чем в тёмной:
   * цветная заливка на белом читается слабее, чем на тёмном фоне. */
  --violet: #7a52d9;
  /* В светлой теме заливки тёмные — поверх них белый. */
  --on-accent: #ffffff;
  --send: #2f5bea;
  --send-bg: rgba(47, 91, 234, 0.12);
  --send-line: rgba(47, 91, 234, 0.45);
  /* На светлой теме «светлый акцент на тёмной подложке» смысла не имеет —
   * подложка светлая, поэтому берётся обычный акцентный синий. */
  --accent-soft: #2448c9;

  --accent-bg: rgba(47, 91, 234, 0.08);
  --accent-bg-strong: rgba(47, 91, 234, 0.14);
  --accent-line: rgba(47, 91, 234, 0.28);
  --success-bg: rgba(30, 158, 90, 0.12);
  --success-line: rgba(21, 128, 61, 0.30);
  --danger-bg: rgba(239, 68, 68, 0.14);
  --danger-line: rgba(204, 32, 32, 0.30);
  --warning-bg: rgba(251, 191, 36, 0.16);
  --warning-line: rgba(217, 119, 6, 0.40);

  --st-run: #2f5bea;   --st-run-fg: #2448c9;  --st-run-bg: #e8eefe; --st-run-line: rgba(47, 91, 234, 0.35);
  --st-idle: #7f8ba3;  --st-idle-fg: #4b5670; --st-idle-bg: #eef1f6;
  --st-ask: #d97706;   --st-ask-fg: #c2410c;  --st-ask-fill: #fbbf24; --st-ask-line: #f0b44c;
  --st-err: #dc2626;   --st-err-fg: #b91c1c;  --st-err-bg: #fdeceb; --st-err-line: rgba(204, 32, 32, 0.30);
  --st-done: #1e9e5a;  --st-done-fg: #177a45; --st-done-bg: #e4f5ec;
  --pin: #7a52d9;
  --focus-ring: 0 0 0 3px rgba(47, 91, 234, 0.30);
  --violet-bg: rgba(122, 82, 217, 0.12);

  /* Чёрный оверлей на белом читается сильнее белого на тёмном,
   * поэтому альфа не зеркальная, а подобранная на глаз. */
  --ov-02: rgba(15, 23, 42, 0.02);
  --ov-03: rgba(15, 23, 42, 0.025);
  --ov-04: rgba(15, 23, 42, 0.03);
  --ov-05: rgba(15, 23, 42, 0.04);
  --ov-06: rgba(15, 23, 42, 0.045);
  --ov-07: rgba(15, 23, 42, 0.055);
  --ov-08: rgba(15, 23, 42, 0.07);
  --ov-10: rgba(15, 23, 42, 0.09);
  --ov-12: rgba(15, 23, 42, 0.11);
  --ov-14: rgba(15, 23, 42, 0.13);
  --ov-15: rgba(15, 23, 42, 0.14);
  --ov-16: rgba(15, 23, 42, 0.15);
  --ov-20: rgba(15, 23, 42, 0.18);
  --ov-24: rgba(15, 23, 42, 0.21);

  --border: #e3e8f1;
  --input-bg: #ffffff;
  --sunk-20: rgba(15, 23, 42, 0.035);
  --sunk-25: rgba(15, 23, 42, 0.045);
  --sunk-30: rgba(15, 23, 42, 0.055);
  --sunk-35: rgba(15, 23, 42, 0.065);
  --sh-soft: rgba(15, 23, 42, 0.06);
  --sh-mid: rgba(15, 23, 42, 0.10);
  --sh-strong: rgba(15, 23, 42, 0.16);
}

/* ── Светлая тема 1do: подача ───────────────────────────────────────
 * Токены выше дают цвета, а этот слой — то, чем светлая отличается на глаз:
 * белые карточки с тенью на холсте, белые панели десктопа, активные чипы
 * залиты брендом, активный пункт меню — бренд на мягко-синем. Только для
 * [data-theme="light"]: тёмная тема держится на контрасте фона, тени ей не
 * нужны. */
[data-theme="light"] {
  --card-shadow: 0 1px 2px rgba(15, 23, 42, 0.04), 0 6px 16px -8px rgba(15, 23, 42, 0.12);
}
[data-theme="light"] .agent-card,
[data-theme="light"] .st-group,
[data-theme="light"] .project-card,
[data-theme="light"] .nt-project-card,
[data-theme="light"] .tpl-card,
[data-theme="light"] .cost-card,
[data-theme="light"] .costs-section,
[data-theme="light"] .invite-card,
[data-theme="light"] .lfs-card,
[data-theme="light"] .queue-item {
  border-color: var(--border);
  box-shadow: var(--card-shadow);
}
[data-theme="light"] .composer {
  border-color: var(--border);
  box-shadow: 0 2px 4px rgba(15, 23, 42, 0.04), 0 14px 32px -14px rgba(47, 91, 234, 0.22);
}
[data-theme="light"] #desktop-sidebar,
[data-theme="light"] #desktop-list-panel {
  background: #ffffff;
}
[data-theme="light"] .sidebar-btn.active {
  color: var(--button);
  background: #eef2fe;
}
[data-theme="light"] .st-chip.active,
[data-theme="light"] .nt-chip.active {
  background: var(--button);
  border-color: var(--button);
  color: #ffffff;
}
[data-theme="light"] #nt-autonomy .nt-chip.active { color: #ffffff; }
/* Заголовок главной — градиентом знака, как слово в заголовке сайта. */
[data-theme="light"] .home-greet {
  background: linear-gradient(90deg, #2f5bea, #8a63e8 60%, #e0896a);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
[data-theme="light"] #mobile-tab-bar {
  background: #ffffff;
  box-shadow: 0 -1px 0 var(--border), 0 -8px 24px -16px rgba(15, 23, 42, 0.18);
}

/* Алиасы. Эти имена уже использовались по всему файлу, но нигде не были
 * определены: 24 объявления с var(--accent) и 26 с var(--text-secondary)
 * шли без fallback, то есть просто не применялись. Задаются один раз —
 * var() резолвится в момент использования, поэтому ссылки на --link/--hint
 * автоматически берут значение активной темы. */
:root {
  /* Единицы экрана через переменные — этого требует масштаб интерфейса
     (фаза 169). На десктопе масштаб делается свойством zoom на <html>, а
     vh/vw при этом считаются от НЕзумированного viewport: 100vh при 160%
     даёт 1.6 высоты экрана, и раскладка вылезает за край. Поэтому все vh/vw
     в файле идут через эти переменные, а JS делит их на масштаб. На
     телефоне путь другой (meta viewport), там масштаб нативный и
     переменные остаются равны 1vh/1vw — делить не нужно. */
  --vh: 1vh;
  --vw: 1vw;
  /* Фолбэк в vh — обязателен. Парные объявления «height: 100vh; height: 100dvh»
     раньше давали старому WebView (iOS < 15.4, Android < 108) откат на первое:
     непонятную строку он просто отбрасывал. С переменными так НЕ работает:
     если `1dvh` не парсится, переменная не задаётся, а calc(var(--dvh) * 100)
     становится невалидным «на этапе вычисленного значения» — свойство уходит
     в unset, а не к предыдущей строке, и высота превращается в auto. Поэтому
     dvh включается отдельно, через @supports. */
  --dvh: 1vh;

  /* Высота мобильного таб-бара и потолок ширины композера. Числа были
     захардкожены в четырёх местах, из-за чего расходились между собой. */
  --tabbar-h: 60px;
  --composer-max: 720px;
  --accent: var(--link);
  --text-primary: var(--text);
  --text-secondary: var(--hint);
  --text-muted: var(--hint);
  --text-2: var(--hint);
  --hint-color: var(--hint);
  --card: var(--secondary-bg);
  --card-bg: var(--secondary-bg);
  --bg-secondary: var(--secondary-bg);
  --bg-2: var(--secondary-bg);
  --section-bg: var(--ov-06);
  --bg-hover: var(--ov-06);
  --separator: var(--border);
  --danger: var(--destructive);

  /* ── Шкала скруглений ─────────────────────────────────────────────
   * В файле встречалось 24 разных значения border-radius: 2, 3, 4, 5, 6,
   * 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 24px и так далее. Соседние блоки
   * отличались на пиксель — глазом это читается не как «чуть другое», а
   * как «собрано из разных мест». Пять ступеней плюс таблетка. */
  --r-xs: 4px;    /* точки статуса, микробейджи */
  --r-sm: 6px;    /* теги, кнопки внутри строк, блоки кода */
  --r-md: 8px;    /* кнопки, инпуты, вложенные плашки */
  --r-lg: 10px;   /* чипы, бейджи, плашки режимов */
  --r-xl: 14px;   /* карточки, меню, панели */
  --r-2xl: 18px;  /* модалки, поповеры, крупные оверлеи */
  --r-card: 16px; /* карточки ленты, проектов, групп настроек — мягче, как на сайте */
  --r-pill: 999px;

  /* Старые имена сохранены: на них уже завязано 38 объявлений. */
  --radius: var(--r-xl);
  --radius-sm: var(--r-md);

  /* ── Шкала кеглей ─────────────────────────────────────────────────
   * Было 24 значения, включая дробные 10.5, 11.5, 12.5, 13.5, 14.5px —
   * они появлялись при подгонке отдельного элемента и накапливались. */
  /* Под Onest мелкие ступени на пиксель крупнее: 10px в нём рассыпается. */
  --fs-xs: 11px;    /* подписи под иконками, мелкие метки */
  --fs-sm: 12px;    /* второстепенные подписи, таймкоды */
  --fs-base: 12px;  /* базовый мелкий текст интерфейса */
  --fs-md: 13px;    /* основной текст списков и карточек */
  --fs-lg: 14px;    /* текст сообщений, заметные подписи */
  --fs-xl: 15px;    /* подзаголовки, крупные подписи */
  --fs-2xl: 18px;   /* заголовки блоков */
  --fs-3xl: 20px;   /* заголовки экранов */
  /* Ровно 16px: меньший кегль в поле ввода заставляет iOS зумить страницу
   * при фокусе, и вернуть масштаб потом нечем. Отдельное имя, чтобы это
   * значение никто не «причесал» до 15px. */
  --fs-input: 16px;

  /* ── Шкала отступов ───────────────────────────────────────────────
   * Сетка 4px с двумя половинными ступенями для плотных мест. */
  --sp-1: 2px;
  --sp-2: 4px;
  --sp-3: 6px;
  --sp-4: 8px;
  --sp-5: 12px;
  --sp-6: 16px;
  --sp-7: 20px;
  --sp-8: 24px;

  /* ── Палитра категорий ────────────────────────────────────────────
   * Цвет иконки по типу файла. Намеренно ОТДЕЛЬНАЯ от семантики: если
   * акцент интерфейса поменяется, иконка Word-документа не должна ехать
   * следом. Одна насыщенность на весь ряд, одна на обе темы — поверх
   * заливки всегда светлый глиф. */
  --cat-red: #e5484d;     /* pdf */
  --cat-blue: #3b82f6;    /* документы */
  --cat-green: #16a34a;   /* таблицы */
  --cat-orange: #f59e0b;  /* презентации */
  --cat-violet: #8b5cf6;  /* архивы */
  --cat-teal: #14b8a6;    /* изображения */
  --cat-pink: #ec4899;    /* медиа */
  --cat-slate: #64748b;   /* прочее */
  --cat-gray: #94a3b8;    /* без типа */

  --font-sans: 'Onest Variable', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --font-mono: 'SF Mono', 'Fira Code', 'Consolas', monospace;
}

/* Динамическая высота вьюпорта — только там, где браузер её понимает
   (см. комментарий к --dvh выше). */
@supports (height: 1dvh) {
  :root { --dvh: 1dvh; }
}

/* Всегда тёмные поверхности: режим вождения и орб рисуются поверх
 * собственного тёмного фона, поэтому оверлеи там осветляют в любой теме. */


[data-theme="light"] .orb-container {
  --ov-02: rgba(255, 255, 255, 0.02);
  --ov-03: rgba(255, 255, 255, 0.03);
  --ov-04: rgba(255, 255, 255, 0.04);
  --ov-05: rgba(255, 255, 255, 0.05);
  --ov-06: rgba(255, 255, 255, 0.06);
  --ov-07: rgba(255, 255, 255, 0.07);
  --ov-08: rgba(255, 255, 255, 0.08);
  --ov-10: rgba(255, 255, 255, 0.10);
  --ov-12: rgba(255, 255, 255, 0.12);
  --ov-14: rgba(255, 255, 255, 0.14);
  --ov-15: rgba(255, 255, 255, 0.15);
  --ov-16: rgba(255, 255, 255, 0.16);
  --ov-20: rgba(255, 255, 255, 0.20);
  --ov-24: rgba(255, 255, 255, 0.24);
  --text: #e8ebf3;
  --hint: #98a2b8;
  --border: var(--ov-08);
}

* { margin: 0; padding: 0; box-sizing: border-box; }
html { overscroll-behavior-y: contain; }

body {
  font-family: var(--font-sans);
  letter-spacing: -0.005em;
  text-rendering: optimizeLegibility;
  background: var(--bg);
  color: var(--text);
  min-height: calc(var(--vh) * 100);
  min-height: calc(var(--dvh) * 100);
  overflow-x: hidden;
  overscroll-behavior-y: contain;
  -webkit-font-smoothing: antialiased;
}

/* ── Pull-to-refresh ──────────────────── */

.ptr-indicator {
  position: fixed;
  top: 0;
  left: 50%;
  transform: translateX(-50%) translateY(-50px);
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--secondary-bg);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 200;
  transition: transform 0.25s ease, opacity 0.25s ease;
  opacity: 0;
  box-shadow: 0 2px 12px var(--sh-mid);
}
.ptr-indicator.pulling {
  opacity: 1;
}
.ptr-indicator.refreshing {
  opacity: 1;
  transform: translateX(-50%) translateY(16px);
}
.ptr-spinner {
  width: 20px;
  height: 20px;
  border: 2.5px solid var(--hint);
  border-top-color: var(--link);
  border-radius: 50%;
}
.ptr-indicator.pulling .ptr-spinner {
  animation: none;
}
.ptr-indicator.refreshing .ptr-spinner {
  animation: ptr-spin 0.7s linear infinite;
}
@keyframes ptr-spin {
  to { transform: rotate(360deg); }
}

/* ── Connection bar ────────────────────── */

.conn-bar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  z-index: 100;
  transition: background 0.3s, opacity 0.5s;
  opacity: 0;
}
.conn-bar.connected { background: var(--success); opacity: 1; }
.conn-bar.connecting { background: var(--warning); opacity: 1; }
.conn-bar.disconnected { background: var(--destructive); opacity: 1; }

/* ── Header ────────────────────────────── */

.header {
  padding: calc(16px + env(safe-area-inset-top, 0px)) 16px 16px;
  display: flex;
  align-items: center;
  gap: 12px;
  border-bottom: 1px solid var(--ov-06);
}
.header h1 { font-size: var(--fs-2xl); font-weight: 600; }
.header .badge {
  background: var(--success);
  color: var(--on-accent);
  font-size: var(--fs-sm);
  font-weight: 600;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: var(--r-lg);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  animation: pulse 1.5s infinite;
}

/* ── Projects bar ──────────────────────── */

.projects-bar {
  display: flex;
  gap: 8px;
  padding: 12px 16px;
  overflow-x: auto;
  scrollbar-width: none;
}
.projects-bar::-webkit-scrollbar { display: none; }

/* ── Tab bar ─────────────────────────────────────── */
.tab-bar {
  display: flex;
  gap: 0;
  padding: 0 16px;
  margin-bottom: 4px;
  border-bottom: 1px solid var(--border);
}
.tab {
  flex: 1;
  padding: 10px 0;
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  color: var(--hint);
  font-size: var(--fs-lg);
  font-weight: 500;
  cursor: pointer;
  transition: all 0.15s;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}
.tab:hover { color: var(--text); }
.tab.active {
  color: var(--link);
  border-bottom-color: var(--link);
}
.tab .badge {
  font-size: var(--fs-sm);
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
}
.tab-content { min-height: 100px; }

/* ── Date group headers ──────────────────────────── */
.history-date-group { margin-bottom: 4px; }
.date-header {
  padding: 8px 16px 4px;
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--hint);
  text-transform: uppercase;
  letter-spacing: 0.5px;
  position: sticky;
  top: 0;
  background: var(--bg);
  z-index: 1;
}

.project-chip {
  flex-shrink: 0;
  padding: 6px 14px;
  border-radius: 20px;
  background: var(--secondary-bg);
  color: var(--hint);
  font-size: var(--fs-md);
  border: 1px solid transparent;
  cursor: pointer;
  transition: all 0.15s;
}
.project-chip:hover, .project-chip.active {
  background: var(--button);
  color: var(--button-text);
  border-color: var(--button);
}
.project-chip.chip-projects {
  color: var(--link);
  border: 1px solid var(--accent-line);
}

/* ── Agent cards ───────────────────────── */

.agents-list {
  padding: 0 12px 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.agent-card {
  background: var(--secondary-bg);
  border-radius: var(--radius-sm);
  padding: 10px 12px;
  cursor: pointer;
  transition: transform 0.15s ease, box-shadow 0.25s ease, border-color 0.25s ease;
  border: 1px solid var(--ov-04);
  /* Фаза 134: content-visibility: auto здесь ПРОБОВАЛИ и убрали. Замер на
     развёрнутой ленте (502 карточки, 375px): 84 FPS без него против 32-35 с
     ним, воспроизводимо в обе стороны. Карточка слишком лёгкая — пересчёт
     пересечений и запоминание intrinsic-size стоят дороже пропущенного
     paint'а. Длинный список держит оконный рендер в app.js (feedWindow). */
}
.agent-card:hover {
  transform: scale(1.015);
  box-shadow: 0 4px 16px var(--sh-soft), 0 0 0 1px var(--ov-06);
}
.agent-card:active { transform: scale(0.98); }
.agent-card .top-row {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 3px;
}
.agent-card .agent-id { font-weight: 600; font-size: var(--fs-sm); font-family: 'SF Mono', 'Menlo', monospace; letter-spacing: 0.3px; }
.agent-card .agent-project {
  font-size: var(--fs-xs);
  padding: 1px 6px;
  border-radius: var(--r-xs);
  background: var(--accent-bg-strong);
  color: var(--link);
  text-transform: none;
  font-weight: 600;
  letter-spacing: 0.3px;
}
.agent-card .agent-time { font-size: var(--fs-sm); color: var(--hint); margin-left: auto; }
.agent-card .agent-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 6px;
  margin-top: 2px;
}
.agent-card .agent-meta {
  font-size: var(--fs-xs);
  color: var(--hint);
  margin-left: auto;
  white-space: nowrap;
  /* Защита от выхода за край — БЕЗУСЛОВНАЯ, а не внутри @media (max-width: 340px),
     как было до 15.09. Причина: при масштабе интерфейса (фаза 169) на десктопном
     zoom-пути медиазапросы масштаб НЕ видят — окно 375px при 140% даёт layout
     268px, но matchMedia('(max-width: 340px)') остаётся false. Метастрока
     («410h 0m · $9999.9999 · 23:22») с nowrap и без ellipsis вылезала за карточку.
     При 100% правило ничего не меняет: текст помещается, обрезать нечего. */
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
.agent-card .agent-task {
  font-size: var(--fs-base);
  color: var(--hint);
  line-height: 1.3;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* ── Complex task progress ── */
.agent-badge-cx { font-size: var(--fs-base); margin-left: 2px; }
.cx-bar { margin: 6px 0 2px; }
.cx-track {
  height: 4px;
  background: var(--separator);
  border-radius: 2px;
  overflow: hidden;
}
.cx-fill {
  height: 100%;
  background: var(--success);
  border-radius: 2px;
  transition: width 0.3s ease;
}
.cx-steps {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-top: 4px;
  font-size: var(--fs-sm);
}
.cx-step { opacity: 0.5; }
.cx-step.cx-done { opacity: 1; }
.cx-step.cx-running { opacity: 1; animation: pulse 1.5s infinite; }
.cx-step.cx-failed { opacity: 1; }
.cx-step-pill {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-size: var(--fs-sm);
  padding: 2px 6px;
  border-radius: var(--r-md);
  background: var(--accent-bg);
  opacity: 0.5;
  white-space: nowrap;
}
.cx-step-pill.cx-done { opacity: 1; background: var(--success-bg); }
.cx-step-pill.cx-running { opacity: 1; background: var(--accent-bg-strong); animation: pulse 1.5s infinite; }
.cx-step-pill.cx-failed { opacity: 1; background: var(--danger-bg); }
.cx-step-pill-label { max-width: 80px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Complex task child agents list in card */
.cx-children-spoiler { margin: 6px 0 2px; }
.cx-children-summary {
  font-size: var(--fs-sm);
  color: var(--hint);
  cursor: pointer;
  padding: 2px 0;
  user-select: none;
}
.cx-children-summary:hover { color: var(--text); }
.cx-child-row {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 0;
  font-size: var(--fs-base);
  border-top: 1px solid var(--separator);
  cursor: pointer;
}
.cx-child-row:hover { background: var(--accent-bg); border-radius: var(--r-sm); }
.cx-child-icon { flex-shrink: 0; font-size: var(--fs-sm); }
.cx-child-id {
  flex-shrink: 0;
  font-family: 'SF Mono', 'Menlo', monospace;
  font-size: var(--fs-sm);
  color: var(--link);
  opacity: 0.8;
}
.cx-child-task {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text);
}
.cx-child-meta {
  flex-shrink: 0;
  font-size: var(--fs-xs);
  color: var(--hint);
}

/* Complex task step navigator in chat */
.cx-nav {
  background: var(--card);
  border: 1px solid var(--separator);
  border-radius: var(--r-xl);
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.cx-nav .cx-step-block { margin: 0; }
.cx-nav-header {
  font-weight: 600;
  font-size: var(--fs-md);
  margin-bottom: 8px;
}
.cx-nav-step {
  padding: 4px 0;
  font-size: var(--fs-md);
  border-bottom: 1px solid var(--separator);
}
.cx-nav-step:last-child { border-bottom: none; }
.cx-nav-step.cx-nav-running { color: var(--accent); }
.cx-nav-step.cx-nav-done { opacity: 0.7; }
.cx-nav-step.cx-nav-failed { color: var(--destructive); }
.cx-child-link {
  font-size: var(--fs-sm);
  color: var(--accent);
  text-decoration: none;
  margin-left: 4px;
}

/* Research phase badge */
.cx-research { font-size: var(--fs-base); color: var(--text-secondary, var(--text-2, var(--hint))); padding: 4px 0; }
.cx-research-done { color: var(--accent); }

/* Structured plan: files & verify in step nav */
.cx-files { font-size: var(--fs-sm); color: var(--text-secondary, var(--text-2, var(--hint))); margin-top: 2px; }
.cx-files code { background: var(--bg-secondary, var(--bg-2, #2a2a2a)); padding: 1px 4px; border-radius: 3px; font-size: var(--fs-xs); }
.cx-verify { font-size: var(--fs-sm); color: var(--text-secondary, var(--text-2, var(--hint))); margin-top: 2px; font-style: italic; }
.cx-verify::before { content: '\2713 '; }

/* Context usage bar */
.ctx-meter { display: flex; align-items: center; gap: 8px; margin: 4px 0 2px; }
.ctx-bar { flex: 0 1 120px; min-width: 60px; height: 3px; background: color-mix(in srgb, var(--hint) 22%, transparent); border-radius: 2px; overflow: hidden; }
.ctx-fill { height: 100%; border-radius: 2px; background: var(--hint); opacity: .7; transition: width 0.3s ease; }
.ctx-meter-label { flex: none; font-size: 11.5px; color: var(--hint); white-space: nowrap; font-variant-numeric: tabular-nums; }
.ctx-meter.warn .ctx-fill { background: var(--warning); opacity: 1; }
.ctx-meter.warn .ctx-meter-label { color: var(--warning); }
.ctx-meter.crit .ctx-fill { background: var(--danger); opacity: 1; }
.ctx-meter.crit .ctx-meter-label { color: var(--danger); }
.cx-child-link:hover { text-decoration: underline; }

/* Preset role tag in step navigator */
.cx-preset-tag {
  display: inline-block;
  font-size: var(--fs-sm);
  background: var(--accent-bg);
  color: var(--accent);
  padding: 1px 6px;
  border-radius: var(--r-xs);
  font-weight: 500;
  margin-right: 2px;
}

/* Step separator in complex task chat — full agent role block */
.cx-step-sep {
  padding: 8px 20px;
  font-size: var(--fs-base);
  color: var(--accent);
  border-top: 1px solid var(--accent-bg-strong);
  margin-top: 8px;
  letter-spacing: 0.02em;
}
.cx-step-block {
  margin: 12px 0 4px;
  border: 1px solid var(--accent-bg-strong);
  border-radius: var(--r-xl);
  overflow: hidden;
  background: var(--card, #1a1a2e);
}
.cx-step-block.cx-step-running {
  border-color: var(--accent);
  box-shadow: 0 0 12px var(--accent-bg);
}
.cx-step-block.cx-step-done {
  border-color: var(--success);
}
.cx-step-block.cx-step-failed {
  border-color: var(--destructive);
}
.cx-step-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  background: var(--accent-bg);
  border-bottom: 1px solid var(--accent-bg);
}
.cx-step-icon {
  font-size: 22px;
  flex-shrink: 0;
  line-height: 1;
}
.cx-step-info {
  flex: 1;
  min-width: 0;
}
.cx-step-role {
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--text);
  display: flex;
  align-items: center;
  gap: 6px;
}
.cx-step-role-tag {
  font-size: var(--fs-sm);
  font-weight: 500;
  background: var(--accent-bg-strong);
  color: var(--accent);
  padding: 2px 8px;
  border-radius: var(--r-lg);
  white-space: nowrap;
}
.cx-step-title {
  font-size: var(--fs-base);
  color: var(--hint);
  margin-top: 2px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cx-step-right {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 2px;
  flex-shrink: 0;
  max-width: 90px;
}
.cx-step-status {
  font-size: var(--fs-sm);
  font-weight: 500;
  padding: 2px 8px;
  border-radius: var(--r-lg);
}
.cx-step-status.running {
  background: var(--accent-bg-strong);
  color: var(--accent);
  animation: pulse 1.5s infinite;
}
.cx-step-status.done {
  background: var(--success-line);
  color: var(--success);
}
.cx-step-status.failed {
  background: var(--danger-line);
  color: var(--destructive);
}
.cx-step-meta {
  font-size: var(--fs-sm);
  color: var(--hint);
}
.cx-step-body {
  padding: 8px 14px 10px;
  font-size: var(--fs-base);
  color: var(--hint);
  display: flex;
  align-items: center;
  gap: 8px;
}
.cx-step-child-link {
  color: var(--accent);
  text-decoration: none;
  font-family: 'SF Mono', 'Menlo', monospace;
  font-size: var(--fs-sm);
}
.cx-step-child-link:hover { text-decoration: underline; }
.cx-step-summary {
  padding: 6px 14px 10px;
  font-size: var(--fs-base);
  color: var(--text);
  border-top: 1px solid var(--accent-bg);
  line-height: 1.5;
}
.cx-step-summary-label {
  font-size: var(--fs-sm);
  color: var(--hint);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-bottom: 4px;
}
.cx-step-body code {
  background: var(--accent-bg);
  color: var(--accent);
  padding: 1px 5px;
  border-radius: var(--r-xs);
  font-size: var(--fs-sm);
}
@media (prefers-reduced-motion: reduce) {
  .cx-step-status.running,
  .cx-step-pill.cx-running {
    animation: none;
  }
}
.cx-parent-link {
  font-size: var(--fs-md);
  padding: 6px 0;
}

/* ── Orchestrator Decision Block ── */
.orch-decision {
  margin: 8px 0;
  border: 1px solid var(--accent-line);
  border-radius: var(--r-lg);
  padding: 10px 14px;
  background: var(--accent-bg);
  font-size: var(--fs-base);
  line-height: 1.7;
  color: var(--text);
}
.orch-decision .orch-title {
  font-size: var(--fs-sm);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--accent);
  margin-bottom: 4px;
}
.orch-decision b { color: var(--hint); font-weight: 500; }

/* ── Pipeline Timeline (dashboard card) ── */
.cx-timeline {
  margin: 6px 0 2px;
  font-size: var(--fs-sm);
  color: var(--hint);
}
.cx-timeline-row {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 2px 0;
}
.cx-timeline-icon { width: 16px; text-align: center; flex-shrink: 0; }
.cx-timeline-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cx-timeline-meta { flex-shrink: 0; color: var(--hint); font-family: 'SF Mono', 'Menlo', monospace; font-size: var(--fs-xs); }
.cx-timeline-row.active .cx-timeline-label { color: var(--accent); font-weight: 500; }
.cx-timeline-row.done .cx-timeline-icon { color: var(--success); }
.cx-timeline-row.failed .cx-timeline-icon { color: var(--destructive); }

/* ── Workflow phase tracker (live, in chat) ── */
.cx-tracker {
  background: var(--card);
  border: 1px solid var(--separator, var(--ov-08));
  border-radius: var(--r-xl);
  padding: 12px 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.cx-tracker-live {
  border-color: var(--accent-line);
  box-shadow: 0 0 14px var(--accent-bg);
}
.cx-tracker-finished { opacity: 0.92; }
.cx-tracker-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.cx-tracker-title { font-weight: 600; font-size: var(--fs-md); color: var(--text); }
.cx-tracker-state {
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--accent);
  background: var(--accent-bg);
  padding: 2px 10px;
  border-radius: var(--r-lg);
  white-space: nowrap;
}
.cx-tracker-finished .cx-tracker-state {
  color: var(--success);
  background: var(--success-bg);
}
.cx-tracker-failed .cx-tracker-state {
  color: var(--destructive);
  background: var(--danger-bg);
}
.cx-tracker-stopped .cx-tracker-state {
  color: var(--hint);
  background: rgba(136,136,136,0.14);
}
/* A finished workflow never pulses, even if a phase was mid-flight when it halted */
.cx-tracker-finished .cx-phase-active .cx-phase-icon { animation: none; }
.cx-tracker-phases { display: flex; flex-direction: column; gap: 2px; }
.cx-phase {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 5px 0;
  font-size: var(--fs-md);
}
.cx-phase-icon { width: 20px; text-align: center; flex-shrink: 0; font-size: var(--fs-lg); }
.cx-phase-name { flex: 1; min-width: 0; color: var(--text); }
.cx-phase-meta {
  flex-shrink: 0;
  font-size: var(--fs-sm);
  color: var(--hint);
  font-family: 'SF Mono', 'Menlo', monospace;
}
.cx-phase-pending { opacity: 0.45; }
.cx-phase-pending .cx-phase-name { color: var(--hint); }
.cx-phase-active .cx-phase-name { color: var(--accent); font-weight: 600; }
.cx-phase-active .cx-phase-icon { animation: pulse 1.5s infinite; }
.cx-phase-done .cx-phase-meta { color: var(--success); }
.cx-tracker-steps {
  display: flex;
  flex-direction: column;
  border-top: 1px solid var(--separator, var(--ov-08));
  padding-top: 6px;
}

/* ── Resume Warning ── */
.resume-warning {
  margin: 8px 0;
  padding: 10px 14px;
  border: 1px solid var(--warning-line);
  border-radius: var(--r-lg);
  background: var(--warning-bg);
  font-size: var(--fs-base);
  color: var(--text);
  line-height: 1.5;
}
.resume-warning-title {
  font-weight: 600;
  color: var(--warning);
  margin-bottom: 4px;
}
.resume-warning .btn-rerun {
  display: inline-block;
  margin-top: 6px;
  padding: 4px 12px;
  font-size: var(--fs-sm);
  border: 1px solid var(--accent);
  border-radius: var(--r-md);
  color: var(--accent);
  background: transparent;
  cursor: pointer;
}
.resume-warning .btn-rerun:hover { background: var(--accent-bg); }

/* ── Files Touched per Step ── */
.cx-step-files {
  padding: 6px 14px 8px;
  font-size: var(--fs-sm);
  border-top: 1px solid var(--accent-bg);
}
.cx-step-file-row {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 1px 0;
  color: var(--hint);
}
.cx-step-file-row .file-action {
  font-size: var(--fs-xs);
  padding: 1px 5px;
  border-radius: var(--r-xs);
  font-weight: 500;
}
.cx-step-file-row .file-action.created {
  background: var(--success-line);
  color: var(--success);
}
.cx-step-file-row .file-action.modified {
  background: var(--accent-bg-strong);
  color: var(--accent);
}
.cx-step-file-row .file-path {
  font-family: 'SF Mono', 'Menlo', monospace;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ── Sub-agent Groups ── */
.subagent-group {
  margin: 4px 0 4px 12px;
  border-left: 2px solid var(--accent-bg-strong);
  padding-left: 10px;
}
.subagent-group-header {
  font-size: var(--fs-sm);
  color: var(--accent);
  font-weight: 500;
  padding: 4px 0;
  cursor: pointer;
  user-select: none;
}
.subagent-group-header::before {
  content: '▶';
  display: inline-block;
  font-size: var(--fs-xs);
  margin-right: 4px;
  transition: transform 0.15s;
}
.subagent-group.expanded .subagent-group-header::before {
  transform: rotate(90deg);
}
.subagent-group-body {
  display: none;
}
.subagent-group.expanded .subagent-group-body {
  display: block;
}
.subagent-group-footer {
  font-size: var(--fs-xs);
  color: var(--hint);
  padding: 2px 0 4px;
}

/* ── Status SVG icons ── */
.si {
  display: inline-block;
  width: 16px; height: 16px;
  vertical-align: -2px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  margin-right: 4px;
  flex-shrink: 0;
}
.si-pulse { animation: pulse 1.5s infinite; }
.agent-id .si, .hi-status .si, .dl-item-top .si { color: var(--hint); }
.agent-card.agent-running .si { color: var(--success); }
.agent-card.agent-paused .si { color: var(--warning); }
.agent-card.agent-error .si { color: var(--destructive); }
.agent-card.agent-draft .si { color: var(--link); }
.status-tag-completed .si, .status-tag-stopped .si { color: var(--warning); }
.status-tag-failed .si { color: var(--destructive); }
.s-done .si { color: var(--success); }
.s-cancelled .si { color: var(--hint); }
.s-deferred .si { color: var(--warning); }

/* ── Drafts spoiler ── */
.drafts-spoiler {
  margin-bottom: 4px;
}
.drafts-summary {
  display: flex; align-items: center; gap: 5px;
  padding: 6px 12px;
  font-size: var(--fs-base); font-weight: 600;
  color: var(--link);
  cursor: pointer;
  user-select: none;
  list-style: none;
}
.drafts-summary::-webkit-details-marker { display: none; }
.drafts-summary::before {
  content: '▸'; font-size: var(--fs-base); transition: transform .2s;
}
details.drafts-spoiler[open] > .drafts-summary::before {
  transform: rotate(90deg);
}
.drafts-badge {
  background: var(--accent-bg-strong); color: var(--link);
  font-size: var(--fs-sm); padding: 1px 7px; border-radius: var(--r-lg); font-weight: 600;
}

/* ── Agent card variants ── */
.agent-card.agent-draft {
  border-left: 3px solid var(--link);
  opacity: 0.85;
}
.agent-card.agent-paused {
  border-color: var(--warning-line);
  background: var(--warning-bg);
  opacity: 0.8;
}
.agent-card.agent-paused:hover {
  opacity: 1;
  box-shadow: 0 4px 16px var(--sh-soft), 0 0 8px var(--warning-bg);
}
.agent-card.agent-interrupted {
  border-color: var(--warning-line);
  background: var(--warning-bg);
  border-left: 3px solid var(--warning);
}
.agent-card.agent-interrupted:hover {
  box-shadow: 0 4px 16px var(--sh-soft), 0 0 8px var(--warning-bg);
}
.agent-bottom-interrupted {
  display: flex; align-items: center; gap: 8px;
}
.agent-bottom-interrupted .qa-resume {
  background: var(--warning-line); color: var(--warning); border: 1px solid var(--warning-line);
  font-weight: 600;
}
.agent-bottom-interrupted .qa-resume:hover { background: var(--warning-line); }
.agent-bottom-interrupted .qa-dismiss {
  background: transparent; color: var(--hint); border: 1px solid var(--ov-10);
  padding: 4px 8px; min-width: auto;
}
.agent-bottom-interrupted .qa-dismiss:hover { color: var(--destructive); border-color: var(--danger-line); }
.agent-card.agent-error {
  border-color: var(--danger-line);
  background: var(--danger-bg);
  opacity: 0.8;
}
.agent-card.agent-error:hover {
  opacity: 1;
  box-shadow: 0 4px 16px var(--sh-soft), 0 0 8px var(--danger-bg);
}
.agent-card.agent-running:hover {
  box-shadow: 0 4px 20px var(--sh-soft), 0 0 12px var(--success-line);
}

/* ── Pinned agents + actions menu (Фаза 45) ─────────────────────────────── */
/* Закреплённого метит значок булавки в строке заголовка (.ac-pin), а не
   боковая полоса: толстая левая граница при скруглённых углах карточки
   рисовалась дугой «(» (10.10.2026). */
.agent-card.agent-pinned {
  opacity: 1;
}
.agent-card.agent-pinned:hover {
  box-shadow: 0 4px 16px var(--sh-soft), 0 0 10px var(--warning-line);
}
/* Pinned block sits at the very top of the list; cards keep the list's spacing. */
.pinned-agents { display: flex; flex-direction: column; gap: 8px; margin-bottom: 8px; }

/* ⋮ actions button on a card (right-aligned in the flex top-row) */
.agent-menu-btn {
  margin-left: auto;
  flex: 0 0 auto;
  background: transparent;
  border: none;
  color: var(--hint);
  font-size: var(--fs-2xl);
  line-height: 1;
  padding: 2px 4px;
  border-radius: var(--r-sm);
  cursor: pointer;
}
.agent-menu-btn:hover { color: var(--text); background: var(--ov-06); }
/* Палец промахивался: «⋮» был 13×22px. Зона нажатия 40px, а строку карточки
   отрицательные поля не раздувают. */
.agent-card .agent-menu-btn {
  min-width: 40px;
  min-height: 40px;
  margin: -10px -10px -10px auto;
}
.dl-menu-btn { font-size: var(--fs-xl); padding: 2px; }

/* popover actions menu (appended to body, fixed-positioned in JS) */
.agent-menu {
  position: fixed;
  z-index: 1100;
  min-width: 180px;
  padding: 6px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  background: var(--card);
  border: 1px solid var(--border, var(--ov-10));
  border-radius: var(--r-xl);
  box-shadow: 0 8px 28px var(--sh-strong);
  animation: agentMenuIn 0.12s ease;
}
@keyframes agentMenuIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.agent-menu-item {
  width: 100%;
  text-align: left;
  background: transparent;
  border: none;
  color: var(--text);
  font-size: var(--fs-lg);
  padding: 9px 12px;
  border-radius: var(--r-md);
  cursor: pointer;
  white-space: nowrap;
}
.agent-menu-item:hover { background: var(--ov-07); }
.agent-menu-item:active { background: var(--ov-12); }

/* drag reorder (SortableJS) */
.agent-card-ghost { opacity: 0.4; }
.agent-card-chosen { box-shadow: 0 8px 24px var(--sh-mid); cursor: grabbing; }

@keyframes pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.4; }
}

/* ── Section title + filter ────────────── */

.section-title-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 16px 4px;
}
.section-title {
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--section-header);
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.filter-chips { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.filter-chips::-webkit-scrollbar { display: none; }
.filter-chip {
  padding: 3px 10px;
  border-radius: var(--r-xl);
  background: transparent;
  color: var(--hint);
  font-size: var(--fs-base);
  border: 1px solid var(--ov-10);
  cursor: pointer;
  transition: all 0.15s;
  flex-shrink: 0;
  white-space: nowrap;
}
.filter-chip.active {
  background: var(--button);
  color: var(--button-text);
  border-color: var(--button);
}

/* ── Search bar ────────────────────────── */

.search-bar {
  padding: 4px 16px 8px;
}
.search-bar input {
  width: 100%;
  padding: 8px 12px;
  border-radius: 20px;
  border: 1px solid var(--ov-08);
  background: var(--secondary-bg);
  color: var(--text);
  font-size: var(--fs-md);
  outline: none;
}
.search-bar input::placeholder { color: var(--hint); }
.search-bar input:focus { border-color: var(--ov-15); }

/* ── History list ──────────────────────── */

.history-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--ov-04);
  cursor: pointer;
}
.history-item:active { background: var(--ov-03); }
.history-item .hi-status { flex-shrink: 0; display: flex; align-items: center; }
.history-item .hi-status .si { width: 18px; height: 18px; margin-right: 0; }
.history-item[data-status="done"] .hi-status { color: var(--success); }
.history-item[data-status="cancelled"] .hi-status { color: var(--hint); }
.history-item[data-status="deferred"] .hi-status { color: var(--warning); }
.history-item .hi-body { flex: 1; min-width: 0; }
.history-item .hi-project { font-size: var(--fs-sm); color: var(--link); }
.history-item .hi-task {
  font-size: var(--fs-md);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.history-item .hi-meta {
  font-size: var(--fs-sm);
  color: var(--hint);
  flex-shrink: 0;
  text-align: right;
}

.load-more {
  text-align: center;
  padding: 12px;
  color: var(--link);
  font-size: var(--fs-md);
  cursor: pointer;
}

/* Хвост ленты (фаза 134): и якорь для догрузки при скролле, и честная надпись
   «показано не всё» — молчаливая обрезка списка была исходной болезнью. */
.feed-more {
  text-align: center;
  padding: 14px 12px 20px;
  color: var(--hint);
  font-size: var(--fs-base);
}

/* ── Queue items ──────────────────────── */

#queue-list {
  padding: 0 16px 8px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.queue-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  background: var(--secondary-bg);
  border-radius: var(--radius-sm);
  border: 1px solid var(--warning-line);
}
.queue-item .qi-pos {
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--warning);
  flex-shrink: 0;
  width: 20px;
  text-align: center;
}
.queue-item .qi-body { flex: 1; min-width: 0; }
.queue-item .qi-project { font-size: var(--fs-sm); color: var(--link); }
.queue-item .qi-task {
  font-size: var(--fs-md);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.queue-item .qi-cancel {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: none;
  background: var(--danger-bg);
  color: var(--destructive);
  font-size: var(--fs-lg);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.15s;
}
.queue-item .qi-cancel:active { background: var(--danger-line); }

.queue-badge {
  background: var(--warning) !important;
  font-size: var(--fs-sm);
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: var(--r-md);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--on-accent);
  font-weight: 600;
}

/* ── FAB ───────────────────────────────── */

.fab {
  position: fixed;
  bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
  right: 20px;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--button);
  color: var(--button-text);
  font-size: 28px;
  border: none;
  cursor: pointer;
  box-shadow: 0 4px 12px var(--sh-mid);
  z-index: 50;
  transition: transform 0.15s;
  display: flex;
  align-items: center;
  justify-content: center;
}
.fab:active { transform: scale(0.9); }
/* Круглая «+» на главной дублировала композер «Что нужно сделать?» и вкладку
   «Задача» и закрывала текст карточек ленты — третий вход в одно действие. */
#fab-new-task { display: none; }

/* ── Chat header ───────────────────────── */

.chat-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: calc(12px + env(safe-area-inset-top, 0px)) 16px 12px;
  border-bottom: 1px solid var(--ov-06);
  position: relative;
}
.chat-header-info { flex: 1; min-width: 0; }
.chat-title { font-size: var(--fs-xl); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.chat-meta { font-size: var(--fs-base); color: var(--hint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.chat-meta-project { color: var(--text); font-weight: 500; }
.chat-meta .model-tag, .chat-meta .effort-tag { font-size: var(--fs-base); }
.chat-agent-id { font-size: var(--fs-base); font-weight: 400; color: var(--hint); margin-left: 4px; }
/* Узкий экран: «проект · модель · усилие · #id» — это ~316px против 189px
   доступных, и ellipsis съедал ВСЁ кроме имени проекта. Пускаем в две строки. */
@media (max-width: 600px) {
  .chat-title {
    white-space: normal;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-height: 1.3;
  }
  /* Подпись с описанием задачи не ограничена ничем и разворачивалась в четыре
     строки — вместе с заголовком шапка съедала ~15% экрана. Держим в двух. */
  .chat-meta {
    white-space: normal;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
  }
}

.btn-icon {
  background: none;
  border: none;
  color: var(--link);
  font-size: var(--fs-2xl);
  cursor: pointer;
  padding: 4px 8px;
  border-radius: var(--r-md);
}
.btn-icon:active { background: var(--ov-05); }

/* ── Chat dropdown menu ────────────────── */

.chat-menu-dropdown {
  display: none;
  position: absolute;
  top: 100%;
  right: 16px;
  background: var(--secondary-bg);
  border: 1px solid var(--ov-10);
  border-radius: var(--radius-sm);
  z-index: 60;
  box-shadow: 0 4px 16px var(--sh-mid);
  overflow: hidden;
}
.chat-menu-dropdown.open { display: block; }
.chat-menu-dropdown button {
  display: block;
  width: 100%;
  padding: 10px 16px;
  background: none;
  border: none;
  color: var(--text);
  font-size: var(--fs-lg);
  text-align: left;
  cursor: pointer;
}
.chat-menu-dropdown button:hover { background: var(--ov-05); }

/* ── Chat messages ─────────────────────── */

#screen-chat {
  display: flex;
  flex-direction: column;
  height: calc(var(--vh) * 100);
  height: calc(var(--dvh) * 100);
  overflow-x: hidden;
  max-width: calc(var(--vw) * 100);
}

.chat-messages {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 0;
  /* scroll-behavior: smooth removed — causes visible scroll on chat open.
     Smooth scrolling is applied via JS only for incremental new messages. */
}

/* Base event */
.chat-messages .msg {
  padding: 4px 20px;
  animation: fadeIn 0.15s ease;
  word-break: break-word;
  overflow-wrap: break-word;
  user-select: text;
  -webkit-user-select: text;
  min-width: 0;
  max-width: 100%;
  overflow: hidden;
}
.chat-messages .msg-step-block {
  padding: 2px 12px;
  background: none;
}

/* User message - right bubble */
.chat-messages .msg-user {
  padding: 10px 20px;
  margin: 8px 16px 8px 60px;
  background: var(--accent-bg-strong);
  color: var(--text);
  border: 1px solid var(--accent-bg-strong);
  border-radius: 18px 18px 4px 18px;
  font-size: var(--fs-lg);
  line-height: 1.5;
  overflow-wrap: break-word;
  word-break: break-word;
}

/* Agent text */
.chat-messages .msg-text {
  padding: 10px 20px;
  font-size: var(--fs-lg);
  line-height: 1.7;
  white-space: pre-wrap;
}
/* Visual gap between different block types */
.chat-messages .msg-text + .msg-tool_use,
.chat-messages .msg-tool_result + .msg-text,
.chat-messages .msg-thinking + .msg-text {
  margin-top: 8px;
}

/* Фаза 182: живой текст ответа (кадр agent_delta). С 182.4 пузырь несёт и
   класс .msg-text — всё оформление реплики (отступы, шрифт, pre-wrap, зазоры
   между блоками) берётся оттуда, и готовый блок встаёт на его место без
   единого сдвига; .msg-live — только для исключений (разметка итогов и режим
   «только результат» его не трогают). Здесь то, чем пузырь отличается. */
.chat-messages .msg-live {
  white-space: pre-wrap;
}
/* 182.5: реплика из исходного markdown (marked) — и живой пузырь, и готовый
   блок. Блоки со своими отступами вместо pre-wrap: между тегами marked ставит
   переводы строк, под pre-wrap они рисовались бы пустыми строками. */
.chat-messages .msg-text .md-body {
  white-space: normal;
}
.chat-messages .msg-text .md-body p,
.chat-messages .msg-text .md-body ul,
.chat-messages .msg-text .md-body ol,
.chat-messages .msg-text .md-body pre,
.chat-messages .msg-text .md-body table,
.chat-messages .msg-text .md-body blockquote {
  margin: 0 0 8px;
}
.chat-messages .msg-text .md-body > :last-child {
  margin-bottom: 0;
}
.chat-messages .msg-text .md-body ul,
.chat-messages .msg-text .md-body ol {
  padding-left: 22px;
}
.chat-messages .msg-text .md-body li {
  margin: 2px 0;
}
.chat-messages .msg-text .md-body li > p {
  margin: 0;
}
.chat-messages .msg-text .md-body h1,
.chat-messages .msg-text .md-body h2,
.chat-messages .msg-text .md-body h3,
.chat-messages .msg-text .md-body h4 {
  margin: 10px 0 6px;
  font-size: 1.05em;
  line-height: 1.4;
}
.chat-messages .msg-text .md-body blockquote {
  border-left: 2px solid var(--ov-08);
  padding: 2px 0 2px 10px;
  color: var(--hint);
}
.chat-messages .msg-text .md-body hr {
  border: 0;
  border-top: 1px solid var(--ov-08);
  margin: 8px 0;
}
/* 182.6: реплика саб-агента из исходника — стрелка, как у html-строки «↳ …». */
.chat-messages .msg-text[data-subagent] .md-body {
  position: relative;
  padding-left: 18px;
}
.chat-messages .msg-text[data-subagent] .md-body::before {
  content: '\21B3';
  position: absolute;
  left: 0;
  top: 0;
  color: var(--hint);
}
/* 182.6: строка состояния на карточке списка — «думает · 32 с · 2.4k знаков». */
.dl-item-live {
  display: block;
  margin-top: 3px;
  font-size: var(--fs-xs, 11px);
  color: var(--hint);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.dl-item-live:empty { display: none; }
.agent-card .agent-card-live { margin: 2px 0 4px; }
/* 182.1: живое размышление — сворачиваемый блок, пока модель думает. */
.chat-messages .msg-live-think {
  margin: 4px 16px;
  padding: 4px 12px;
  border-left: 2px solid var(--ov-08);
  color: var(--hint);
  font-size: var(--fs-base);
  line-height: 1.5;
}
.chat-messages .msg-live-think .lt-head {
  cursor: pointer;
  user-select: none;
  padding: 2px 0;
  opacity: 0.85;
}
.chat-messages .msg-live-think .lt-head::before { content: '\25BE '; opacity: 0.6; }
.chat-messages .msg-live-think.collapsed .lt-head::before { content: '\25B8 '; }
.chat-messages .msg-live-think .lt-body {
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  font-style: italic;
  max-height: 220px;
  overflow-y: auto;
  margin-top: 2px;
}
.chat-messages .msg-live-think.collapsed .lt-body { display: none; }
/* 182.2: живые элементы обновляются по нескольку раз в секунду — анимация
   появления сообщения на них перезапускалась и выглядела мерцанием. */
.chat-messages .msg-live,
.chat-messages .msg-live-think {
  animation: none;
}
/* Курсор — внутри последнего блока текста, а не отдельной строкой под ним
   (C8): тонкая черта бренда; пока текст бежит — горит ровно, мягко дышит
   только в паузе модели (.lt-idle). Под таблицей, кодом, схемой — нет. */
.chat-messages .msg-live:not(.msg-live-final) .md-body > :last-child::after {
  content: ''; display: inline-block; width: 2px; height: 1.05em; margin-left: 3px; vertical-align: -0.15em;
  border-radius: 2px; background: var(--link); opacity: .7; animation: none;
}
.chat-messages .msg-live.lt-idle:not(.msg-live-final) .md-body > :last-child::after { animation: lt-caret 1.1s ease-in-out infinite; }
.chat-messages .msg-live .md-body > :is(table, pre, hr, .dgm, ul, ol):last-child::after { display: none; }
.chat-messages .msg-live .md-body > :is(ul, ol):last-child > li:last-child::after {
  content: ''; display: inline-block; width: 2px; height: 1.05em; margin-left: 3px; vertical-align: -0.15em;
  border-radius: 2px; background: var(--link); opacity: .7;
}
.chat-messages .msg-live.msg-live-final .md-body > :is(ul, ol):last-child > li:last-child::after { display: none; }
.chat-messages .msg-live.lt-idle .md-body > :is(ul, ol):last-child > li:last-child::after { animation: lt-caret 1.1s ease-in-out infinite; }
@keyframes lt-caret { 0%, 100% { opacity: .75; } 50% { opacity: .1; } }
/* C7: свежие знаки живого текста проявляются (отрицательная задержка ведёт
   fade дальше через пересборку innerHTML — уже показанное не мигает). */
.chat-messages .msg-live .lt-f { animation: lt-ink 320ms cubic-bezier(.25,.6,.3,1) both; }
@keyframes lt-ink { from { opacity: 0; } to { opacity: 1; } }
/* C9.3: колонки таблицы не пляшут, пока ячейки дописываются. */
.chat-messages .msg-live:not(.msg-live-final) table { table-layout: fixed; width: 100%; }
@media (prefers-reduced-motion: reduce) {
  .chat-messages .msg-live .lt-f,
  .chat-messages .msg-live.lt-idle .md-body > :last-child::after,
  .chat-messages .msg-live.lt-idle .md-body > :is(ul, ol):last-child > li:last-child::after { animation: none; }
}

/* C3: проявление готовой реплики — раскладка финальная с первого кадра,
   анимируются только opacity и transform (modules/reveal.js). */
.chat-messages .rv-run .rv-w { opacity: 0; animation: rv-word 380ms cubic-bezier(.25,.6,.3,1) var(--rv-d, 0ms) forwards; }
.chat-messages .rv-run .rv-b { animation: rv-rise 420ms cubic-bezier(.16,1,.3,1) var(--rv-d, 0ms) both; }
.chat-messages .rv-run .rv-r { animation: rv-glide 620ms cubic-bezier(.16,1,.3,1) var(--rv-d, 0ms) both; }
.chat-messages .rv-run .rv-row { animation: rv-word 360ms cubic-bezier(.25,.6,.3,1) var(--rv-d, 0ms) both; }
@keyframes rv-word { from { opacity: 0; } to { opacity: 1; } }
@keyframes rv-rise { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: none; } }
@keyframes rv-glide { from { opacity: 0; transform: translateY(10px) scale(.985); } to { opacity: 1; transform: none; } }
.chat-messages .rv-flush .rv-w, .chat-messages .rv-flush .rv-b,
.chat-messages .rv-flush .rv-r, .chat-messages .rv-flush .rv-row { animation: none !important; opacity: 1 !important; transform: none !important; }
.chat-messages .rv-hold .dgm-canvas { opacity: 0; }
/* C6: то, что идёт после ответа (итог, файлы, кнопки), — после его последнего слова. */
/* !important: у строк ленты своя анимация появления, а анимация перебивает
   обычное объявление. .rv-pend — итог, который проявится в следующем кадре. */
.chat-messages.rv-tail > .rv-run ~ *, .chat-messages.rv-tail > .rv-pend ~ *,
.chat-messages .rv-run .msg-actions { opacity: 0 !important; }
.chat-messages .rv-after-in { animation: rv-word 320ms cubic-bezier(.25,.6,.3,1) both; }
#quick-actions { transition: opacity .32s cubic-bezier(.25,.6,.3,1); }
body.rv-busy #quick-actions { opacity: 0 !important; pointer-events: none; transition: none; }
@media (prefers-reduced-motion: reduce) {
  .chat-messages .rv-run .rv-w, .chat-messages .rv-run .rv-b, .chat-messages .rv-run .rv-r,
  .chat-messages .rv-run .rv-row, .chat-messages .rv-after-in { animation: none; opacity: 1; transform: none; }
  #quick-actions { transition: none; }
}
/* 182.3: готовый блок, вставший на место пузыря, не проявляется заново. */
.chat-messages .msg.msg-no-anim {
  animation: none;
}

/* Tool use/result */
.chat-messages .msg-tool_use {
  padding: 6px 20px;
  font-size: var(--fs-base);
  color: var(--hint);
  border-left: 2px solid var(--accent-line);
  margin-left: 16px;
  margin-top: 2px;
  margin-bottom: 2px;
  overflow-wrap: break-word;
  word-break: break-word;
}
.chat-messages .msg-tool_result {
  padding: 4px 20px 8px;
  font-size: var(--fs-base);
  color: var(--hint);
  border-left: 2px solid var(--success-line);
  margin-left: 16px;
  margin-bottom: 4px;
  overflow-wrap: break-word;
  word-break: break-word;
}

/* Thinking */
.chat-messages .msg-thinking {
  padding: 4px 20px;
  font-size: var(--fs-sm);
  color: var(--hint);
  opacity: 0.5;
  font-style: italic;
  border-left: 2px solid var(--ov-08);
  margin-left: 16px;
}

/* Links in messages */
.chat-messages a {
  color: var(--link);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.chat-messages a:hover { opacity: 0.8; }
.chat-messages .file-ref {
  color: var(--link);
  font-family: var(--font-mono);
  font-size: 0.9em;
  opacity: 0.85;
}

/* Status divider — thin line + pill label + thin line */
.chat-messages .msg-status {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 0;
  margin: 0;
  background: none;
  --_c: var(--hint);
}
.chat-messages .msg-status::before,
.chat-messages .msg-status::after {
  content: '';
  flex: 1;
  height: 1px;
  opacity: 0.15;
}
.chat-messages .msg-status::before { background: linear-gradient(90deg, transparent, var(--_c)); }
.chat-messages .msg-status::after  { background: linear-gradient(90deg, var(--_c), transparent); }
.chat-messages .msg-status .status-label {
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.4px;
  text-transform: uppercase;
  color: var(--_c);
  /* 0.55 давало 3.8:1 в тёмной и 2.5:1 в светлой — подпись не читалась. */
  opacity: 0.85;
  white-space: nowrap;
  padding: 2px 8px;
  border-radius: 20px;
  border: 1px solid color-mix(in srgb, var(--_c) 25%, transparent);
}
.chat-messages .status-running .status-label {
  opacity: 1;
  animation: status-pulse 2s ease-in-out infinite;
}
@keyframes status-pulse {
  0%, 100% { opacity: 0.6; }
  50%       { opacity: 1; }
}
.chat-messages .status-running   { --_c: var(--link); }
.chat-messages .status-completed { --_c: var(--warning); }
.chat-messages .status-done      { --_c: var(--success); }
/* Итог хода — фраза с числами («Готово │ 3 хода · 3 с»), а не метка:
   капсом «3 С» читалось как опечатка. */
.chat-messages .status-result .status-label { text-transform: none; letter-spacing: 0; }
.chat-messages .status-failed    { --_c: var(--destructive); }
.chat-messages .status-stopped   { --_c: var(--warning); }

/* Действие коллеги над агентом (фаза 159, В4) — разделитель того же вида,
   что и статусная строка, но цветом «внимание, это не автоматика»: строку
   породил человек. Текст приходит с сервера уже с именем внутри
   (`<b>@olga_k</b>: остановка`), поэтому вся раскраска — на обёртке. */
.chat-messages .msg-team_action {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 0;
  margin: 0;
  background: none;
  font-size: var(--fs-sm);
  line-height: 1.4;
  color: color-mix(in srgb, var(--link) 75%, var(--hint));
  white-space: normal;
  overflow-wrap: anywhere;
}
.chat-messages .msg-team_action::before,
.chat-messages .msg-team_action::after {
  content: '';
  flex: 1 1 12px;
  height: 1px;
  opacity: 0.18;
  background: currentColor;
}
.chat-messages .msg-team_action .team-line {
  flex: 0 1 auto;
  min-width: 0;
}
.chat-messages .msg-team_action b {
  font-weight: 600;
  color: var(--link);
}

/* Inline code */
.chat-messages .msg code {
  font-family: var(--font-mono);
  font-size: var(--fs-base);
  padding: 2px 6px;
  background: var(--sunk-25);
  border-radius: var(--r-xs);
  color: var(--text);
  word-break: break-all;
}

/* Pre blocks (fenced code) */
.chat-messages .msg pre {
  display: block;
  white-space: pre-wrap;
  word-break: break-all;
  overflow-wrap: break-word;
  font-family: var(--font-mono);
  font-size: var(--fs-base);
  margin-top: 8px;
  margin-bottom: 8px;
  padding: 10px 14px;
  background: var(--sunk-30);
  border-radius: var(--r-md);
  color: var(--text);
  border: 1px solid var(--ov-06);
  max-width: 100%;
  overflow-x: auto;
  line-height: 1.5;
}

/* Code inside pre inherits pre styling */
.chat-messages .msg pre code {
  display: block;
  padding: 0;
  background: none;
  border-radius: 0;
  border: none;
  font-size: inherit;
  white-space: pre-wrap;
}

/* Code inside tool messages is block-level */
.chat-messages .msg-tool_use code,
.chat-messages .msg-tool_result code {
  display: block;
  padding: 6px 10px;
  margin-top: 4px;
  background: var(--sunk-20);
  border-radius: var(--r-sm);
  white-space: pre-wrap;
  word-break: break-word;
}
/* ── Раскрытие инструментов в ленте (фаза 143) ──────────────────────────
   Вывод команд и diff правок раньше не показывались вовсе: результат
   инструмента не доезжал до ленты, а Edit рисовался одной строкой с путём.
   Разворот делается нативным <details> — фронт вставляет HTML события через
   innerHTML, поэтому JS для этого не нужен. */

.chat-messages .msg details.tool-details {
  margin-top: 4px;
}

.chat-messages .msg summary.tool-summary {
  cursor: pointer;
  list-style: none;
  display: block;
}

.chat-messages .msg summary.tool-summary::-webkit-details-marker {
  display: none;
}

/* Треугольник рисуем сами: у нативного маркера нет управления отступом,
   и он ломает выравнивание иконки инструмента. */
.chat-messages .msg summary.tool-summary::after {
  content: '▸';
  display: inline-block;
  margin-left: 6px;
  color: var(--text-secondary);
  font-size: var(--fs-sm);
  transition: transform 0.15s ease;
}

.chat-messages .msg details.tool-details[open] > summary.tool-summary::after {
  transform: rotate(90deg);
}

/* Короткое значение в шапке (путь, паттерн, URL, аргумент MCP). Общее
   правило .msg-tool_use code делает код блочным — это верно для команды
   Bash и ломает всё остальное, растягивая путь на всю ширину. */
.chat-messages .msg-tool_use code.ti,
.chat-messages .msg-tool_result code.ti {
  display: inline;
  padding: 1px 6px;
  margin-top: 0;
  background: var(--sunk-20);
  border-radius: var(--r-xs);
  word-break: break-all;
}

/* Счётчик правок в шапке Edit/Write: «+12 −3». */
.chat-messages .msg .diff-stat {
  font-family: var(--font-mono);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  white-space: nowrap;
}

.chat-messages .msg .tool-more {
  font-size: var(--fs-base);
  color: var(--text-secondary);
}

/* Тело diff и вывода команды. word-break наследуется агрессивный
   (break-all) — для кода это рвёт идентификаторы посреди слова, поэтому
   здесь возвращаем нормальный перенос. */
.chat-messages .msg pre.diff-block,
.chat-messages .msg pre.tool-output {
  word-break: normal;
  overflow-x: auto;
  margin-top: 6px;
}

.chat-messages .msg pre.diff-block code,
.chat-messages .msg pre.tool-output code {
  display: block;
  padding: 8px 10px;
  background: var(--sunk-20);
  border-radius: var(--r-sm);
}

.chat-messages .msg pre.diff-block .diff-add,
.chat-messages .msg pre.diff-block .diff-del,
.chat-messages .msg pre.diff-block .diff-at,
.chat-messages .msg pre.diff-block .diff-ctx {
  display: block;
  padding: 0 4px;
  margin: 0 -4px;
}

.chat-messages .msg pre.diff-block .diff-add {
  background: color-mix(in srgb, var(--success) 16%, transparent);
  color: var(--success);
}

.chat-messages .msg pre.diff-block .diff-del {
  background: color-mix(in srgb, var(--danger) 14%, transparent);
  color: var(--danger);
}

.chat-messages .msg pre.diff-block .diff-at {
  color: var(--text-secondary);
  opacity: 0.75;
}

/* На узком экране вывод команды не должен занимать пол-ленты. */
@media (max-width: 960px) {
  .chat-messages .msg pre.diff-block,
  .chat-messages .msg pre.tool-output {
    font-size: var(--fs-sm);
    max-height: 320px;
    overflow-y: auto;
  }
}


.chat-messages .msg b { font-weight: 600; }
.chat-messages .msg i { font-style: italic; }

.chat-messages .msg table {
  width: 100%;
  border-collapse: collapse;
  margin: 8px 0;
  font-size: var(--fs-md);
}
.chat-messages .msg th,
.chat-messages .msg td {
  padding: 6px 10px;
  border: 1px solid var(--ov-10);
  text-align: left;
}
.chat-messages .msg th {
  background: var(--ov-05);
  font-weight: 600;
}

@keyframes fadeIn {
  from { opacity: 0; transform: translateY(4px); }
  to { opacity: 1; transform: translateY(0); }
}

/* ── Quick actions ─────────────────────── */

.quick-actions {
  display: flex;
  gap: 8px;
  padding: 8px 16px;
  overflow-x: auto;
  scrollbar-width: none;
}
.quick-actions::-webkit-scrollbar { display: none; }

/* ── Primary action button (filled, prominent) ── */
.qa-primary {
  flex-shrink: 0;
  padding: 8px 20px;
  border-radius: 20px;
  font-size: var(--fs-lg);
  font-weight: 600;
  font-family: inherit;
  /* Заливку задают модификаторы (--green / --accent), поэтому цвет текста
   * берётся из токена: на ярких заливках тёмной темы белый давал 2.28-2.70
   * при норме 4.5, --on-accent даёт 6.9-8.2. В светлой теме заливки тёмные
   * и токен разворачивается в белый. */
  color: var(--on-accent);
  border: none;
  cursor: pointer;
  transition: filter 0.15s, box-shadow 0.15s, transform 0.1s;
  -webkit-tap-highlight-color: transparent;
}
.qa-primary:active { transform: scale(0.96); }
.qa-primary:hover { filter: brightness(1.12); }
.qa-primary--green {
  background: var(--success);
  box-shadow: 0 2px 8px var(--success-line);
}
.qa-primary--accent {
  background: var(--link);
  box-shadow: 0 2px 8px var(--accent-line);
}

.qa-chip {
  flex-shrink: 0;
  padding: 6px 14px;
  border-radius: var(--r-2xl);
  background: transparent;
  color: var(--link);
  font-size: var(--fs-md);
  border: 1px solid var(--accent-bg-strong);
  cursor: pointer;
  font-family: inherit;
  transition: all 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.qa-chip:hover { background: var(--accent-bg); border-color: var(--accent-line); }
.qa-chip:active { transform: scale(0.95); }
.qa-chip--muted {
  color: rgba(255,255,255,0.55);
  border-color: var(--ov-10);
  background: transparent;
}
.qa-chip--muted:hover { color: rgba(255,255,255,0.7); border-color: var(--ov-20); }

/* Touch-friendly sizing on mobile */
@media (pointer: coarse) {
  .qa-primary { padding: 10px 22px; }
  .qa-chip { padding: 8px 16px; }
}
.qa-chip.qa-done {
  background: var(--success-line);
  color: var(--success);
  border-color: var(--success-line);
}
.quick-actions.poll-mode {
  flex-direction: column;
  overflow-x: visible;
  padding: 8px 16px 4px;
}

/* ── Chat input bar ────────────────────── */

.chat-input-bar {
  padding: 8px 12px calc(12px + env(safe-area-inset-bottom, 0px));
  background: var(--bg);
}
.chat-pending-banner {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-bottom: 8px;
  padding: 6px 10px;
  border-radius: var(--r-xl);
  font-size: var(--fs-md);
  color: var(--accent);
  background: var(--accent-bg);
  border: 1px solid var(--accent-line);
}
/* Лимиты подписки на исходе / исчерпаны (фаза 117). */
.chat-pool-banner {
  margin-bottom: 8px;
  /* справа сверху висит FAB ассистента — оставляем ему место, иначе длинный
     текст уезжает под кнопку */
  padding: 6px 56px 6px 10px;
  border-radius: var(--r-xl);
  font-size: var(--fs-md);
  color: var(--warning);
  background: var(--warning-bg);
  border: 1px solid var(--warning-line);
}
.chat-pool-banner.cpb-exhausted {
  color: var(--danger);
  background: var(--danger-bg);
  border-color: var(--danger-line);
}
/* Строка очереди: иконка, текст и кнопки правки/снятия (фаза 117). */
.chat-pending-banner .cpb-row {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}
.chat-pending-banner .cpb-row.cpb-error {
  color: var(--danger);
}
/* Автор чужого сообщения в очереди (фаза 159): компактно, чтобы строка
   осталась одной строкой и на 375px. */
.chat-pending-banner .cpb-author {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  flex: 0 1 auto;
  min-width: 0;
  max-width: 45%;
  overflow: hidden;
}
.chat-pending-banner .cpb-author .msg-author {
  margin-bottom: 0;
  font-size: var(--fs-sm);
  opacity: 1;
}
.chat-pending-banner .cpb-author .agent-avatar {
  width: 16px;
  height: 16px;
  font-size: var(--fs-xs);
}
.chat-pending-banner .cpb-author .user-ident {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Имя профиля рядом с логином здесь лишнее — места нет. */
.chat-pending-banner .cpb-author .user-realname { display: none; }

/* Подпись статуса («В очереди 2-е:»). Сокращается только когда места не
   осталось совсем — обрезать положено текст реплики, а не статус. */
.chat-pending-banner .cpb-label {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Свёрнутый хвост очереди (фаза 159): четыре сообщения занимали треть
   экрана телефона, поэтому показываем три, остальные — одной строкой. */
.chat-pending-banner .cpb-more {
  cursor: pointer;
  color: var(--link);
  font-size: var(--fs-base);
  min-height: 40px;
  align-items: center;
  justify-content: flex-start;
  gap: 6px;
}
/* Стрелка отдельным узлом: в тексте строки она выглядит точкой и не
   подсказывает, что по строке можно нажать. */
.chat-pending-banner .cpb-more::before {
  content: '\25BE';
  font-size: var(--fs-xl);
  line-height: 1;
}
.chat-pending-banner .cpb-more.is-open::before { content: '\25B4'; }

.chat-pending-banner .cpb-text {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.chat-pending-banner .cpb-cancel {
  background: none;
  border: none;
  color: var(--accent);
  cursor: pointer;
  font-size: var(--fs-lg);
  line-height: 1;
  padding: 2px 4px;
  opacity: 0.8;
}
.chat-pending-banner .cpb-cancel:hover { opacity: 1; }
.chat-pending-banner .cpb-row.cpb-error .cpb-cancel { color: inherit; }
/* Узкий экран и палец. На 375px в одну строку влезали подпись автора,
   «В очереди 2-е:» и десяток символов самой реплики — от неё оставалось
   «Добавь, п…», и что именно стоит в очереди, человек не видел. */
@media (max-width: 600px), (pointer: coarse) {
  .chat-pending-banner .cpb-row {
    flex-wrap: wrap;
    row-gap: 2px;
    min-height: 40px;
  }
  /* Разрыв строки внутри flex-ряда: иконка, автор и статус остаются сверху,
     реплика уходит на свою строку. Без него на 375px от неё оставалось
     «Добавь, п…» — подпись автора, статус и две кнопки съедали всю ширину. */
  .chat-pending-banner .cpb-row::after {
    content: '';
    flex-basis: 100%;
    height: 0;
    order: 1;
  }
  .chat-pending-banner .cpb-label { flex: 1 1 auto; }
  /* Ряд занимает две строки, и без волоска граница между соседними
     сообщениями на глаз не читается. */
  .chat-pending-banner .cpb-row + .cpb-row {
    border-top: 1px solid var(--accent-bg-strong);
    padding-top: 4px;
  }
  .chat-pending-banner .cpb-text {
    order: 2;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    white-space: normal;
    line-height: 1.25;
  }
  /* 22×18 промахиваются пальцем, а промах здесь удаляет чужое сообщение.
     Высота ряда поднята до тех же 40px, иначе увеличенные области нажатия
     соседних строк наложились бы друг на друга. */
  .chat-pending-banner .cpb-cancel {
    order: 3;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    min-width: 40px;
    min-height: 40px;
    padding: 0;
  }
}
/* Card composer (фаза 55 redesign): textarea on top, toolbar at the bottom. */
.composer {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 8px;
  background: var(--secondary-bg);
  border-radius: 24px;
  padding: 12px 14px 10px;
  border: 1px solid var(--ov-08);
  box-shadow: 0 6px 22px var(--sh-soft);
  transition: border-color 0.15s, box-shadow 0.15s;
}
.composer-text { position: relative; width: 100%; }
.composer-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
/* Левая группа — неразжимаемые иконки: сжимать ЕЁ бессмысленно, содержимое
   всё равно вылезет за границу (так и появлялось наложение). Сжимается
   правая группа, у неё есть чип режима с многоточием. */
.ct-left { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
/* Правая группа обязана сжиматься. С flex-shrink: 0 при нехватке места
   сжималась ЛЕВАЯ группа (у неё min-width: 0), но кнопки внутри неё
   неразжимаемые — и они вылезали за её границу поверх правой группы: на 375px
   третья иконочная кнопка полностью накрывалась чипом языка и переставала
   нажиматься. Теперь сжимается чип режима (у него уже flex: 0 1 auto). */
.ct-right { display: flex; align-items: center; gap: 6px; flex-shrink: 1; min-width: 0; }

/* Масштаб интерфейса (фаза 169) сужает layout, НЕ меняя ширину, которую видят
   медиазапросы: на десктопе при 160% в распоряжении остаётся 800 CSS-px, а
   `@media` всё ещё считает 1280 и «узких» правил не включает — ряд тулбара не
   переносился, и чипы налезали друг на друга (замер: «Opus · Extra» на «Авто»
   на 113px). Поэтому перенос включает сам факт масштаба, а не ширина.
   Селектор требует, чтобы атрибут ПРИСУТСТВОВАЛ: если инлайн-скрипт почему-то
   не выполнился, правило не должно сработать «на всякий случай». */
html[data-ui-zoom]:not([data-ui-zoom="100"]) .composer-toolbar {
  flex-wrap: wrap;
  row-gap: 6px;
}
html[data-ui-zoom]:not([data-ui-zoom="100"]) .ct-left,
html[data-ui-zoom]:not([data-ui-zoom="100"]) .ct-right {
  flex-wrap: wrap;
  min-width: 0;
}
html[data-ui-zoom]:not([data-ui-zoom="100"]) .ct-right { margin-left: auto; }
.ct-divider { width: 1px; height: 20px; background: var(--ov-12); flex-shrink: 0; }

/* Issue 5: Links in code blocks must be clickable */
.chat-messages .msg pre a,
.chat-messages .msg code a,
.chat-messages a {
  pointer-events: auto;
  color: var(--link);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.composer:focus-within {
  border-color: var(--send-line);
  box-shadow: 0 0 0 3px var(--send-bg);
}

/* Поле композера. Селектор по классу, а не по #chat-input: узел один и тот же,
   но живёт то на главной, то в чате, и правила не должны зависеть от места. */
.composer-text textarea {
  width: 100%;
  flex: 1;
  background: transparent;
  border: none;
  color: var(--text);
  font-size: var(--fs-input); /* 16px обязателен: на меньшем iOS зумит страницу при фокусе */
  font-family: inherit;
  resize: none;
  outline: none;
  max-height: 200px;
  min-height: 24px;
  line-height: 1.5;
  padding: 2px 2px 0;
}
.composer-text textarea::placeholder { color: var(--hint); }
.composer-text textarea.voice-processing {
  opacity: 0.5;
  animation: shimmer 1.5s infinite;
}

.btn-send, .btn-voice, .btn-stop-agent, .btn-queue {
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: opacity 0.15s, transform 0.1s, background 0.15s;
}
/* Inline SVGs without width/height attrs collapse to 0 on iOS/Telegram WebView —
   size them explicitly so the send arrow / stop icon always render on mobile. */
.btn-send svg, .btn-stop-agent svg, .btn-queue svg { width: 20px; height: 20px; display: block; }
.btn-send {
  width: 38px;
  height: 38px;
  border-radius: var(--r-lg);        /* terracotta rounded square (native Claude) */
  background: var(--send);
  color: #fff;
}
.btn-send:disabled { background: var(--send-line); color: rgba(255,255,255,0.6); cursor: not-allowed; }
/* Фаза 191: «В очередь» — второй путь для сообщения во время хода. Того же
   размера, что и отправка, но второстепенный: без заливки, с рамкой. */
.btn-queue {
  width: 38px;
  height: 38px;
  border-radius: var(--r-lg);
  background: transparent;
  color: var(--hint);
  border: 1px solid var(--ov-12);
}
.btn-queue:hover { color: var(--text); border-color: var(--ov-24); }
.btn-queue:active { transform: scale(0.93); }
/* Фаза 191: метка подсказки, ушедшей в идущий ход (внутри пузыря человека). */
.msg-user .msg-hint-tag {
  display: block;
  font-size: var(--fs-xs);
  letter-spacing: 0.02em;
  text-transform: uppercase;
  opacity: 0.65;
  margin-bottom: 2px;
}
/* Сообщение человека из markdown (как реплика модели) и вставленный текст
   сворачиваемым блоком вместо пометок «[Начало/Конец вставленного текста]». */
.chat-messages .msg-user .md-body {
  white-space: normal;
}
.chat-messages .msg-user .md-body p,
.chat-messages .msg-user .md-body ul,
.chat-messages .msg-user .md-body ol,
.chat-messages .msg-user .md-body pre,
.chat-messages .msg-user .md-body table,
.chat-messages .msg-user .md-body blockquote {
  margin: 0 0 8px;
}
.chat-messages .msg-user .md-body > :last-child {
  margin-bottom: 0;
}
.chat-messages .msg-user .md-body ul,
.chat-messages .msg-user .md-body ol {
  padding-left: 22px;
}
.chat-messages .msg-user .md-body li {
  margin: 2px 0;
}
.chat-messages .msg-user .md-body li > p {
  margin: 0;
}
.chat-messages .msg-user .md-body h1,
.chat-messages .msg-user .md-body h2,
.chat-messages .msg-user .md-body h3,
.chat-messages .msg-user .md-body h4,
.chat-messages .msg-user .md-body h5,
.chat-messages .msg-user .md-body h6 {
  margin: 10px 0 6px;
  font-size: 1.05em;
  line-height: 1.4;
}
.chat-messages .msg-user .md-body > h1:first-child,
.chat-messages .msg-user .md-body > h2:first-child,
.chat-messages .msg-user .md-body > h3:first-child {
  margin-top: 0;
}
.chat-messages .msg-user .md-body blockquote {
  border-left: 2px solid var(--ov-08);
  padding: 2px 0 2px 10px;
  color: var(--hint);
}
.chat-messages .msg-user .md-body hr {
  border: 0;
  border-top: 1px solid var(--ov-08);
  margin: 8px 0;
}
.chat-messages .msg-user .md-body + .msg-paste,
.chat-messages .msg-user .msg-paste + .md-body,
.chat-messages .msg-user .msg-paste + .msg-paste {
  margin-top: 8px;
}
.chat-messages .msg-user .msg-paste {
  border: 1px solid var(--ov-08);
  border-radius: 12px;
  background: var(--ov-04, rgba(127, 127, 127, 0.06));
  overflow: hidden;
}
.chat-messages .msg-user .msg-paste-head {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 6px 12px;
  cursor: pointer;
  user-select: none;
  list-style: none;
  font-size: var(--fs-sm, 13px);
  color: var(--hint);
}
.chat-messages .msg-user .msg-paste-head::-webkit-details-marker { display: none; }
.chat-messages .msg-user .msg-paste-head::before {
  content: '\25B8';
  flex: none;
  opacity: 0.7;
}
.chat-messages .msg-user .msg-paste[open] > .msg-paste-head::before { content: '\25BE'; }
.chat-messages .msg-user .msg-paste-title {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  color: var(--text);
  font-weight: 560;
}
.chat-messages .msg-user .msg-paste-size {
  flex: none;
  font-size: var(--fs-xs, 11px);
}
.chat-messages .msg-user .msg-paste-body {
  padding: 4px 12px 10px;
  border-top: 1px solid var(--ov-08);
}
.btn-send:not(:disabled):hover { filter: brightness(1.08); }
.btn-send:active { transform: scale(0.93); }

.btn-voice {
  background: transparent;
  color: var(--hint);
}
.voice-lang-select {
  flex-shrink: 0;
  align-self: center;
  height: 32px;
  padding: 0 4px;
  border-radius: var(--r-md);
  border: 1px solid var(--border, var(--ov-12));
  background: transparent;
  color: var(--hint);
  font-size: var(--fs-base);
  font-weight: 600;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  text-align: center;
  transition: color 0.15s, border-color 0.15s;
}
.voice-lang-select:hover {
  color: var(--text, #fff);
  border-color: var(--accent);
}
/* Forced (non-auto) language: make it obvious so a stuck wrong language stands out */
.voice-lang-select.voice-lang-forced {
  color: var(--accent);
  border-color: var(--accent);
  background: var(--accent-bg-strong);
}
.btn-voice.recording {
  background: var(--destructive);
  color: var(--on-accent);
  animation: none;
}
.btn-voice-cancel {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: none;
  background: var(--ov-08);
  color: var(--hint);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.btn-voice-cancel:active {
  background: var(--danger-line);
  color: var(--destructive);
}

/* ── Voice recording bar (WhatsApp-style) ── */
.voice-recording-bar {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 4px;
}

.voice-rec-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--destructive);
  flex-shrink: 0;
  animation: voice-blink 1s ease-in-out infinite;
}

@keyframes voice-blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.2; }
}

.voice-waveform {
  flex: 1;
  height: 36px;
  overflow: hidden;
  position: relative;
}
.voice-waveform canvas {
  display: block;
  width: 100%;
  height: 100%;
}

/* ── Voice processing indicator ── */
.voice-processing-bar {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 8px;
}
.voice-processing-text {
  font-size: var(--fs-md);
  color: var(--link);
  font-weight: 500;
}
.voice-dots span {
  animation: dot-bounce 1.4s ease-in-out infinite;
  display: inline-block;
}
.voice-dots span:nth-child(1) { animation-delay: 0s; }
.voice-dots span:nth-child(2) { animation-delay: 0.2s; }
.voice-dots span:nth-child(3) { animation-delay: 0.4s; }
@keyframes dot-bounce {
  0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
  30% { opacity: 1; transform: translateY(-3px); }
}

/* ── Voice done flash ── */
.voice-done-bar {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 0 8px;
  animation: voice-done-flash 1.5s ease-out forwards;
}
.voice-done-icon { font-size: var(--fs-lg); }
.voice-done-text { font-size: var(--fs-md); color: var(--success); font-weight: 500; }
@keyframes voice-done-flash {
  0% { opacity: 0; transform: scale(0.9); }
  20% { opacity: 1; transform: scale(1); }
  80% { opacity: 1; }
  100% { opacity: 0; }
}

.composer.is-processing {
  border-color: var(--accent-line);
  box-shadow: 0 0 0 2px var(--accent-bg);
}

.voice-timer {
  font-size: var(--fs-md);
  color: var(--destructive);
  font-family: var(--font-mono, monospace);
  min-width: 36px;
  text-align: right;
  flex-shrink: 0;
  font-weight: 500;
}

/* (voice-timer-form removed — now in fixed input bar) */

.composer.is-recording {
  border-color: var(--danger-line);
  box-shadow: 0 0 0 2px var(--danger-bg);
}

.btn-stop-agent {
  background: var(--destructive);
  color: var(--on-accent);
}
.btn-stop-agent:active { transform: scale(0.93); }

/* ── Form screens ──────────────────────── */

.form-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: calc(12px + env(safe-area-inset-top, 0px)) 16px 12px;
  border-bottom: 1px solid var(--ov-06);
}
.form-header h2 { flex: 1; font-size: var(--fs-input); font-weight: 600; }

.form-body {
  padding: 16px;
}
.form-body label {
  display: block;
  font-size: var(--fs-md);
  font-weight: 500;
  color: var(--hint);
  margin-bottom: 6px;
  margin-top: 14px;
}
.form-body label:first-child { margin-top: 0; }
.form-body label .hint { font-weight: 400; opacity: 0.6; }

.form-body input,
.form-body select,
.form-body textarea {
  width: 100%;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--ov-10);
  background: var(--secondary-bg);
  color: var(--text);
  font-size: var(--fs-lg);
  font-family: inherit;
  outline: none;
  transition: border-color 0.15s;
}
.form-body input:focus,
.form-body select:focus,
.form-body textarea:focus {
  border-color: var(--link);
}
.form-body textarea { resize: vertical; min-height: 60px; }

.form-body input.invalid,
.form-body textarea.invalid {
  border-color: var(--destructive);
}

/* ══════════════════════════════════════════════════════════
   SETTINGS
   ══════════════════════════════════════════════════════════ */

#screen-settings .form-body {
  padding: 8px 16px 100px;
  overflow-y: auto;
}

/* ── Section groups (iOS-style cards) ── */
.st-group {
  background: var(--secondary-bg);
  border-radius: var(--radius);
  border: 1px solid var(--border);
  margin-bottom: 24px;
  overflow: hidden;
}
.st-group-title {
  font-size: var(--fs-base);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  color: var(--section-header);
  padding: 0 4px 8px;
}

/* ── Setting row (label left, control right) ── */
.st-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 14px;
  gap: 12px;
  min-height: 46px;
}
.st-row + .st-row {
  border-top: 1px solid var(--border);
}
.st-row-label {
  font-size: var(--fs-lg);
  color: var(--text);
  flex-shrink: 1;
  min-width: 0;
}
.st-row-hint {
  font-size: var(--fs-sm);
  color: var(--hint);
  margin-top: 2px;
}
/* label/hint прямыми детьми карточки (вне .st-row — чипы автономности/усилия,
   «Ввод в чате») — без этого прилипают к краям и режутся overflow:hidden */
.st-group > .st-row-label { padding: 12px 14px 0; }
.st-group > .st-row-hint { padding: 0 14px 12px; line-height: 1.45; }
.st-group > .st-row-hint:empty { display: none; }

/* ── Boolean toggle row ── */
.st-bool-row {
  align-items: flex-start;
}
.st-row-text {
  flex: 1 1 auto;
  min-width: 0;
}
.st-bool-row .st-row-hint {
  max-width: 100%;
}
.st-toggle {
  flex-shrink: 0;
  position: relative;
  width: 46px;
  height: 26px;
  border-radius: var(--r-xl);
  border: 1px solid var(--border);
  background: var(--bg);
  cursor: pointer;
  padding: 0;
  transition: background 0.18s, border-color 0.18s;
  -webkit-tap-highlight-color: transparent;
  margin-top: 2px;
}
.st-toggle-knob {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--hint);
  transition: transform 0.18s, background 0.18s;
}
.st-toggle.on {
  background: var(--accent-bg-strong);
  border-color: var(--link);
}
.st-toggle.on .st-toggle-knob {
  transform: translateX(20px);
  background: var(--link);
}
.st-toggle:active .st-toggle-knob { width: 23px; }
/* Фаза 145: «звук при запуске» бессмыслен без живого сообщения — строка
   гасится, а не прячется, чтобы связь двух настроек была видна. */
.st-toggle[disabled] { opacity: 0.4; cursor: default; }
.st-row-muted .st-row-text { opacity: 0.5; }

/* ── Compact number input ── */
.st-number-wrap {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
}
.st-number {
  width: 72px;
  padding: 6px 8px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--bg);
  color: var(--text);
  font-size: var(--fs-lg);
  font-family: var(--font-mono);
  text-align: center;
  outline: none;
  transition: border-color 0.15s;
  -moz-appearance: textfield;
}
.st-number::-webkit-inner-spin-button,
.st-number::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.st-number:focus {
  border-color: var(--link);
}
.st-number.changed {
  border-color: var(--link);
  background: var(--accent-bg);
}
.st-unit {
  font-size: var(--fs-base);
  color: var(--hint);
  white-space: nowrap;
}

/* ── Chip selector (model) ── */
.st-chips-row {
  display: flex;
  gap: 8px;
  padding: 12px 14px;
  flex-wrap: wrap;
}
.st-chips {
  display: flex;
  gap: 6px;
  flex-shrink: 0;
}
.st-chip {
  padding: 8px 14px;
  min-height: 36px;   /* было 29px — мимо пальца (аудит профиля 1.9) */
  border-radius: var(--r-2xl);
  border: 1.5px solid var(--border);
  background: transparent;
  color: var(--hint);
  cursor: pointer;
  transition: all 0.15s;
  font-family: inherit;
  font-size: var(--fs-md);
  font-weight: 500;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
}
.st-chip:active { transform: scale(0.97); }
.st-chip.active {
  border-color: var(--link);
  background: var(--accent-bg);
  color: var(--text);
}

/* ── Map group (turns, budgets) ── */
.st-map-rows {
  display: flex;
  flex-direction: column;
}
.st-map-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 14px;
  gap: 12px;
}
.st-map-row + .st-map-row {
  border-top: 1px solid var(--border);
}
.st-map-label {
  font-size: var(--fs-lg);
  color: var(--text);
}
.st-map-input {
  width: 80px;
  padding: 6px 8px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--bg);
  color: var(--text);
  font-size: var(--fs-lg);
  font-family: var(--font-mono);
  text-align: center;
  outline: none;
  transition: border-color 0.15s;
  -moz-appearance: textfield;
}
.st-map-input::-webkit-inner-spin-button,
.st-map-input::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.st-map-input:focus {
  border-color: var(--link);
}

/* ── Actions ── */
.st-actions {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 4px;
}
.st-save {
  width: 100%;
  padding: 12px;
  border-radius: var(--radius);
  border: none;
  background: var(--button);
  color: var(--button-text);
  font-size: var(--fs-xl);
  font-weight: 600;
  font-family: inherit;
  cursor: pointer;
  transition: opacity 0.15s, transform 0.1s;
}
.st-save:active { transform: scale(0.98); }
.st-save:disabled {
  opacity: 0.5;
  cursor: default;
  transform: none;
}
.st-reset {
  background: none;
  border: none;
  cursor: pointer;
  font-size: var(--fs-md);
  font-family: inherit;
  padding: 10px 0;
  text-align: center;
  width: 100%;
  color: var(--hint);
  transition: color 0.15s;
}
.st-reset:hover { color: var(--destructive); }

/* ── Mobile settings gear in header ── */
.header-settings-btn {
  margin-left: auto;
  color: var(--hint);
  padding: 4px;
  min-width: 40px;
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: color 0.15s;
  cursor: pointer;
}
.header-settings-btn:hover { color: var(--text); }

@media (min-width: 960px) {
  .header-settings-btn { display: none; }
  /* 820px: таблице пула токенов нужно ~730px минимум (колонки+gaps+padding) —
     в старые 520px она не влезала и обрезалась overflow:hidden */
  #screen-settings .form-body {
    max-width: 820px;
    margin: 0 auto;
  }
  /* Center form screens on desktop when list panel hidden */
  .nt-body,
  .nt-input-bar {
    max-width: 720px;
    margin-left: auto;
    margin-right: auto;
  }
  .nt-project-grid {
    grid-template-columns: repeat(3, 1fr);
  }
  #screen-project-edit .form-body,
  .projects-grid {
    max-width: 600px;
    margin-left: auto;
    margin-right: auto;
  }
  #screen-costs .form-body {
    max-width: 720px;
    margin: 0 auto;
  }
  #screen-team-edit .form-body, #screen-teams .form-body, #screen-inbox .form-body, #screen-learn .form-body {
    max-width: 720px;
    margin: 0 auto;
  }
}

/* ══════════════════════════════════════════════════════════
   NEW TASK — COMPACT BOTTOM-ALIGNED
   ══════════════════════════════════════════════════════════ */

.nt-body {
  padding: 12px 16px;
  padding-bottom: calc(90px + env(safe-area-inset-bottom, 0px));
  display: flex;
  flex-direction: column;
  gap: 10px;
  overflow-y: auto;
}

/* ── Top bar: search + options ────────── */

.nt-topbar {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.nt-search {
  width: 100%;
  padding: 8px 12px;
  border-radius: var(--r-2xl);
  border: 1px solid var(--ov-08);
  background: var(--secondary-bg);
  color: var(--text);
  font-size: var(--fs-md);
  font-family: inherit;
  outline: none;
}
.nt-search::placeholder { color: var(--hint); }
.nt-search:focus { border-color: var(--ov-15); }

.nt-options {
  display: flex;
  align-items: center;
  gap: 10px 16px;
  flex-wrap: wrap;
}
/* Группы разделяет зазор. Палочки-разделители при переносе ряда повисали в
   конце строки («Haiku |», «Max |») и ничего не отделяли. */
.nt-sep { display: none; }
.nt-chips {
  display: flex;
  gap: 4px;
  flex-wrap: wrap;
}
.nt-chip {
  padding: 5px 10px;
  border-radius: var(--r-2xl);
  border: 1.5px solid var(--ov-08);
  background: var(--secondary-bg);
  color: var(--hint);
  cursor: pointer;
  transition: all 0.15s;
  font-family: inherit;
  font-size: var(--fs-base);
  font-weight: 500;
  white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
}
.nt-chip:active { transform: scale(0.97); }
.nt-chip.active {
  border-color: var(--link);
  background: var(--accent-bg);
  color: var(--text);
}
/* Effort field on "Новая задача": caption + chips + dynamic description */
.nt-effort-field { display: flex; flex-direction: column; gap: 6px; }
.nt-field-head { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; }
.nt-field-label { font-size: var(--fs-base); font-weight: 600; color: var(--text); }
.nt-field-hint { font-size: var(--fs-sm); color: var(--hint); }
.nt-field-desc { font-size: var(--fs-sm); color: var(--hint); min-height: 15px; line-height: 1.3; }

/* ── Project cards grid ──────────────── */

.nt-project-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 8px;
}
.nt-project-card {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 12px;
  border-radius: var(--r-xl);
  border: 1.5px solid var(--ov-06);
  background: var(--secondary-bg);
  cursor: pointer;
  transition: all 0.15s;
  -webkit-tap-highlight-color: transparent;
  overflow: hidden;
}
.nt-project-card:active { transform: scale(0.97); }
.nt-project-card.active {
  border-color: var(--link);
  background: var(--accent-bg);
}
.nt-project-card .nt-pc-icon {
  font-size: var(--fs-2xl);
  line-height: 1;
  flex-shrink: 0;
}
.nt-project-card .nt-pc-info {
  flex: 1;
  min-width: 0;
}
.nt-project-card .nt-pc-name {
  font-size: var(--fs-md);
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.nt-project-card .nt-pc-desc {
  font-size: var(--fs-sm);
  color: var(--hint);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin-top: 1px;
}

/* ── New Task: fixed bottom input bar (Telegram-style) ── */

.chat-input-bar.drag-over,
.nt-input-bar.drag-over,
#screen-chat.drag-over,
#screen-new-task.drag-over {
  outline: 2px dashed var(--accent);
  outline-offset: -8px;
  background: var(--accent-bg);
}
.nt-input-bar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 8px 12px calc(12px + env(safe-area-inset-bottom, 0px));
  background: var(--bg);
  border-top: 1px solid var(--ov-06);
  z-index: 200;
}

.nt-input-wrapper {
  position: relative;
  display: flex;
  align-items: center;
  gap: 6px;
  background: var(--secondary-bg);
  border-radius: 24px;
  padding: 8px 8px 8px 14px;
  border: 1px solid var(--ov-08);
  transition: border-color 0.15s, box-shadow 0.15s;
  position: relative;
}
.nt-input-wrapper:focus-within {
  border-color: var(--ov-15);
  box-shadow: 0 0 0 2px var(--accent-bg);
}
.nt-input-wrapper.is-recording {
  border-color: var(--danger-line);
  box-shadow: 0 0 0 2px var(--danger-bg);
}
.nt-input-wrapper.is-processing {
  border-color: var(--accent-line);
  box-shadow: 0 0 0 2px var(--accent-bg);
}

#screen-new-task #nt-task {
  flex: 1;
  background: transparent;
  border: none;
  color: var(--text);
  font-size: var(--fs-xl);
  font-family: inherit;
  resize: none;
  outline: none;
  max-height: 120px;
  min-height: 22px;
  line-height: 1.5;
}
#screen-new-task #nt-task::placeholder { color: var(--hint); }
#screen-new-task #nt-task.invalid {
  color: var(--destructive);
}

.btn-nt-attach {
  flex-shrink: 0;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: none;
  background: transparent;
  color: var(--hint);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: color 0.15s;
  -webkit-tap-highlight-color: transparent;
  align-self: center;
}
.btn-nt-attach:active { color: var(--link); }

.btn-nt-action {
  flex-shrink: 0;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: opacity 0.15s, transform 0.1s, background 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.btn-nt-action:active { transform: scale(0.93); }

.btn-nt-mic {
  background: transparent;
  color: var(--hint);
}
.btn-nt-mic.recording {
  background: var(--destructive);
  color: var(--on-accent);
}

.btn-nt-send {
  background: var(--text);
  color: var(--bg);
}
.btn-nt-send:disabled { opacity: 0.3; cursor: not-allowed; }

/* Voice recording overlay inside new task input bar */
.nt-voice-recording {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 4px;
}
.nt-voice-recording .voice-waveform {
  flex: 1;
  height: 36px;
}

/* Voice processing overlay inside new task input bar */
.nt-voice-processing {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 8px;
}

/* ── Legacy selectors (kept for JS compat, styled via .nt-chip) ── */

/* (nt-submit removed — now uses fixed bottom input bar) */

/* Plan approval now uses .qa-primary--green */

.btn-primary {
  display: block;
  width: 100%;
  padding: 12px;
  margin-top: 20px;
  border: none;
  border-radius: var(--radius-sm);
  background: var(--button);
  color: var(--button-text);
  font-size: var(--fs-xl);
  font-weight: 500;
  cursor: pointer;
  transition: opacity 0.15s;
}
.btn-primary:active { opacity: 0.7; }
.btn-primary:disabled { opacity: 0.4; cursor: not-allowed; }

/* Prominent save/create CTA — the muted flat button blended into the dark form
   and read as not-clickable. Brighter accent + glow + weight makes it the clear
   primary action. */
.btn-save-cta {
  margin-top: 24px;
  padding: 15px;
  font-size: var(--fs-input);
  font-weight: 600;
  letter-spacing: 0.2px;
  background: linear-gradient(135deg, var(--link), var(--button));
  color: #fff;
  box-shadow: 0 6px 18px var(--accent-line);
  transition: box-shadow 0.15s, transform 0.1s, opacity 0.15s;
}
.btn-save-cta:hover {
  box-shadow: 0 8px 22px var(--accent-line);
  transform: translateY(-1px);
}
.btn-save-cta:active { transform: translateY(0); opacity: 0.85; }
.btn-save-cta:disabled { transform: none; box-shadow: none; }

/* Prominent "+ Новый проект" in the Projects header — the old bare "+" icon
   button was nearly invisible. Bright pill with a label. */
.btn-add-cta {
  border: none;
  /* Сплошной бренд: градиент начинался со светлого --link, и белая
     надпись на нём давала 2.7:1. На --button — 5.5:1. */
  background: var(--button);
  color: var(--button-text);
  font-size: var(--fs-lg);
  font-weight: 600;
  padding: 8px 14px;
  border-radius: var(--r-pill);
  cursor: pointer;
  white-space: nowrap;
  box-shadow: 0 2px 10px var(--accent-line);
  transition: filter 0.15s, transform 0.1s, box-shadow 0.15s;
}
.btn-add-cta:hover { filter: brightness(1.08); box-shadow: 0 4px 14px var(--accent-line); }
.btn-add-cta:active { transform: scale(0.97); }

.btn-secondary {
  display: block;
  width: 100%;
  padding: 12px;
  margin-top: 20px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--text);
  font-size: var(--fs-xl);
  font-weight: 500;
  cursor: pointer;
  transition: opacity 0.15s, background 0.15s;
}
.btn-secondary:hover { background: var(--ov-05); }
.btn-secondary:active { opacity: 0.7; }
.btn-secondary:disabled { opacity: 0.4; cursor: not-allowed; }

.btn-danger {
  display: block;
  width: 100%;
  padding: 12px;
  margin-top: 10px;
  border: none;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--destructive);
  font-size: var(--fs-lg);
  cursor: pointer;
  border: 1px solid var(--danger-line);
}

/* ── Project info card ─────────────────── */

.project-info-card {
  margin-top: 8px;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  background: var(--accent-bg);
  border: 1px solid var(--accent-bg-strong);
  font-size: var(--fs-base);
  color: var(--hint);
  line-height: 1.4;
}

/* ── Projects grid ─────────────────────── */

.projects-grid {
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.project-card {
  background: var(--secondary-bg);
  border-radius: var(--radius);
  padding: 14px 16px;
  cursor: pointer;
  border: 1px solid var(--ov-05);
  transition: transform 0.1s, border-color 0.15s, box-shadow 0.15s;
}
.project-card:hover {
  border-color: var(--ov-10);
  box-shadow: 0 2px 8px var(--sh-soft);
}
.project-card:active { transform: scale(0.98); }
.project-card .pc-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
.project-card .pc-name { font-weight: 600; font-size: var(--fs-lg); }
.project-card .pc-path {
  font-size: var(--fs-sm); color: var(--hint); font-family: var(--font-mono);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  margin-top: 2px;
}
.project-card .pc-desc {
  font-size: var(--fs-base); color: var(--hint); margin-top: 6px; line-height: 1.4;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.project-card .pc-model {
  display: inline-block;
  margin-top: 6px;
  font-size: var(--fs-sm);
  padding: 2px 8px;
  border-radius: var(--r-sm);
  background: var(--accent-bg-strong);
  color: var(--link);
}

/* ── Author badge ──────────────────────── */

.author-badge {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px 2px 2px;
  background: var(--secondary-bg);
  border: 1px solid var(--ov-06);
  border-radius: var(--r-2xl);
  text-decoration: none;
  font-size: var(--fs-xs);
  color: var(--hint);
  opacity: 0.5;
  transition: opacity 0.2s;
  flex-shrink: 0;
}
.author-badge:hover { opacity: 0.8; }
.author-logo { width: 16px; height: 16px; border-radius: 50%; }

/* ── Toast ─────────────────────────────── */

.toast-container {
  position: fixed;
  bottom: calc(80px + env(safe-area-inset-bottom, 0px));
  left: 50%;
  transform: translateX(-50%);
  z-index: 999;
  display: flex;
  flex-direction: column-reverse;
  align-items: center;
  gap: 8px;
  /* Контейнер центрирован через left:50%, поэтому shrink-to-fit ограничил бы
     его половиной вьюпорта. width:max-content снимает это, max-width держит
     длинные тосты в границах экрана. */
  width: max-content;
  max-width: min(calc(var(--vw) * 92), 560px);
  pointer-events: none;
}
.toast {
  padding: 10px 20px;
  border-radius: var(--r-xl);
  font-size: var(--fs-lg);
  opacity: 0;
  transition: opacity 0.3s, transform 0.3s;
  transform: translateY(10px);
  /* Без переноса длинный тост (имя файла, текст ошибки) уезжал за края экрана
     на мобилке — nowrap растягивал контейнер до 800+px. Ширину держит
     .toast-container; break-word не влияет на его intrinsic-размер. */
  max-width: 100%;
  white-space: normal;
  word-break: break-word;
  text-align: center;
  pointer-events: auto;
}
.toast.show {
  opacity: 1;
  transform: translateY(0);
}
.toast-success { background: var(--success); color: var(--on-accent); }
.toast-error { background: var(--destructive); color: var(--on-accent); }
.toast-info { background: var(--button); color: var(--button-text); }

/* ── Empty state ───────────────────────── */

.empty-state {
  text-align: center;
  padding: 50px 20px;
  color: var(--hint);
}
.empty-state .icon { font-size: 40px; margin-bottom: 12px; }
.empty-state p { font-size: var(--fs-lg); line-height: 1.5; }

/* ── Loading skeleton ──────────────────── */

.skeleton {
  background: linear-gradient(90deg, var(--secondary-bg) 25%, var(--ov-05) 50%, var(--secondary-bg) 75%);
  background-size: 200% 100%;
  animation: shimmer 1.5s infinite;
  border-radius: var(--radius-sm);
}
.skeleton-card { height: 80px; margin-bottom: 10px; }
.skeleton-line { height: 14px; margin-bottom: 8px; }

@keyframes shimmer {
  0% { background-position: -200% 0; }
  100% { background-position: 200% 0; }
}

/* ── Load more events ─────────────────── */

.load-more-events {
  padding: 10px 20px;
  text-align: center;
  font-size: var(--fs-md);
  color: var(--link);
  cursor: pointer;
  border-bottom: 1px solid var(--border);
  user-select: none;
}
.load-more-events:hover { background: var(--accent-bg); }
.load-more-events:active { background: var(--accent-bg-strong); }

/* ── Tool group collapsing ────────────── */

.tool-group-collapsed { display: none; }
.tool-group-collapsed.expanded { display: block; }
.tool-group-toggle {
  padding: 6px 20px;
  font-size: var(--fs-base);
  color: var(--link);
  cursor: pointer;
  border-left: 2px solid var(--accent-bg-strong);
  margin-left: 16px;
}
.tool-group-toggle:hover {
  background: var(--accent-bg);
}

/* ── Plan block ───────────────────────── */

.msg-plan-container {
  margin: 12px 16px;
  background: var(--accent-bg);
  border-left: 3px solid var(--link);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
.msg-plan-header {
  padding: 8px 14px;
  background: var(--accent-bg-strong);
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--link);
}
.msg-plan {
  padding: 14px 16px;
  font-size: var(--fs-lg);
  line-height: 1.7;
  white-space: pre-wrap;
}
.msg-plan pre {
  display: block;
  white-space: pre-wrap;
  word-break: break-all;
  overflow-wrap: break-word;
  font-family: var(--font-mono);
  font-size: var(--fs-base);
  margin-top: 8px;
  margin-bottom: 8px;
  padding: 10px 14px;
  background: var(--sunk-30);
  border-radius: var(--r-md);
  color: var(--text);
  border: 1px solid var(--ov-06);
  max-width: 100%;
  overflow-x: auto;
  line-height: 1.5;
}
.msg-plan code {
  font-family: var(--font-mono);
  font-size: var(--fs-base);
  padding: 2px 6px;
  background: var(--sunk-25);
  border-radius: var(--r-xs);
  color: var(--text);
}
.msg-plan pre code {
  display: block;
  padding: 0;
  background: none;
  border-radius: 0;
  border: none;
  font-size: inherit;
  white-space: pre-wrap;
}

/* ── Cancel chip ──────────────────────── */

.qa-chip.qa-cancel {
  background: var(--danger-bg);
  color: var(--destructive);
  border-color: var(--danger-line);
}

/* ── Blockquote (copyable) ────────────── */

.chat-messages .msg pre.quote-block,
.msg-plan pre.quote-block {
  font-family: inherit;
  font-size: var(--fs-md);
  line-height: 1.6;
  border-left: 3px solid var(--link);
  background: var(--accent-bg);
}

/* ── Copy button on code blocks ───────── */

.code-wrapper {
  position: relative;
}
.copy-btn {
  position: absolute;
  top: 6px;
  right: 6px;
  padding: 3px 10px;
  font-size: var(--fs-sm);
  font-family: inherit;
  background: var(--ov-08);
  color: var(--hint);
  border: 1px solid var(--ov-12);
  border-radius: var(--r-xs);
  cursor: pointer;
  opacity: 0.5;
  transition: opacity 0.2s, color 0.2s, border-color 0.2s;
  z-index: 2;
  line-height: 1.2;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
}
.copy-btn:active {
  opacity: 1;
  background: var(--ov-15);
}
.copy-btn.copied {
  color: var(--success);
  border-color: var(--success-line);
  opacity: 1;
}
/* Desktop: show on hover */
@media (hover: hover) {
  .copy-btn { opacity: 0; }
  .code-wrapper:hover .copy-btn { opacity: 0.7; }
  .copy-btn:hover { opacity: 1; }
  .copy-btn.copied { opacity: 1; }
}

/* ── Modal ─────────────────────────────── */

.modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,0.7);
  z-index: 200;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  animation: fadeIn 0.15s ease;
}
.modal-content {
  background: var(--bg);
  border-radius: 16px 16px 0 0;
  width: 100%;
  max-width: 600px;
  max-height: calc(var(--vh) * 85);
  display: flex;
  flex-direction: column;
  animation: slideUp 0.2s ease;
}
.modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 18px;
  border-bottom: 1px solid var(--ov-08);
  font-size: var(--fs-xl);
  font-weight: 600;
}
.modal-close {
  background: none;
  border: none;
  color: var(--hint);
  font-size: 22px;
  cursor: pointer;
  padding: 4px 8px;
  /* Было 28×36 — в крестик промахивались по краю шторки. */
  min-width: 40px; min-height: 40px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--r-sm);
}
.modal-close:hover { background: var(--ov-08); }
.modal-body {
  padding: 16px 18px;
  overflow-y: auto;
  font-size: var(--fs-lg);
  line-height: 1.7;
}
/* Plan modal body renders server HTML — don't use pre-wrap (Issue 11) */
#plan-modal-body {
  white-space: normal;
}
/* Location / other modals may have text content */
.location-modal-body {
  white-space: normal;
}
.modal-body pre {
  background: var(--sunk-30);
  border-radius: var(--r-md);
  padding: 10px 14px;
  font-family: var(--font-mono);
  font-size: var(--fs-base);
  overflow-x: auto;
  margin: 8px 0;
  border: 1px solid var(--ov-06);
}
.modal-body code {
  font-family: var(--font-mono);
  font-size: var(--fs-base);
  padding: 2px 6px;
  background: var(--sunk-25);
  border-radius: var(--r-xs);
}
.modal-body pre code {
  padding: 0;
  background: none;
}
.modal-body table {
  width: 100%;
  border-collapse: collapse;
  margin: 8px 0;
  font-size: var(--fs-md);
}
.modal-body th, .modal-body td {
  padding: 6px 10px;
  border: 1px solid var(--ov-10);
  text-align: left;
}
.modal-body th { background: var(--ov-04); font-weight: 600; }

/* Issue 11: Plan modal markdown-like heading/list styles */
#plan-modal-body h1, #plan-modal-body h2, #plan-modal-body h3,
#plan-modal-body h4, #plan-modal-body h5, #plan-modal-body h6 {
  margin: 14px 0 6px;
  color: var(--text);
  line-height: 1.4;
}
#plan-modal-body h1 { font-size: var(--fs-2xl); }
#plan-modal-body h2 { font-size: var(--fs-input); border-bottom: 1px solid var(--ov-08); padding-bottom: 4px; }
#plan-modal-body h3 { font-size: var(--fs-xl); }
#plan-modal-body p { margin: 6px 0; }
#plan-modal-body ul, #plan-modal-body ol { padding-left: 20px; margin: 6px 0; }
#plan-modal-body li { margin: 3px 0; }
#plan-modal-body strong { font-weight: 600; }
#plan-modal-body em { font-style: italic; opacity: 0.9; }
#plan-modal-body blockquote {
  margin: 8px 0;
  padding: 6px 12px;
  border-left: 3px solid var(--link);
  background: var(--accent-bg);
  border-radius: 0 4px 4px 0;
  opacity: 0.9;
}
#plan-modal-body hr { border: none; border-top: 1px solid var(--ov-10); margin: 12px 0; }

@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes slideUp { from { transform: translateY(40px); } to { transform: translateY(0); } }

/* ── Login modal ──────────────────────── */

/* Первый экран продукта. Фон сплошной: из-под полупрозрачной подложки
   просвечивала пустая оболочка приложения и выглядела как поломка. */
#login-modal {
  background: var(--bg);
  backdrop-filter: none;
  align-items: center;
}
.login-brand {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: 26px 18px 4px;
  text-align: center;
}
.login-wordmark { height: 40px; margin-bottom: 14px; }
.login-brand-title { font-size: var(--fs-2xl); font-weight: 650; letter-spacing: -0.015em; color: var(--text); }
.login-brand-sub { font-size: var(--fs-md); color: var(--hint); }

.login-modal-content {
  border-radius: var(--r-2xl);
  max-width: 360px;
  margin: auto;
}
.login-modal-body {
  padding: 20px 18px 24px;
}
.login-modal-body p {
  font-size: var(--fs-md);
  color: var(--hint);
  margin-bottom: 14px;
  line-height: 1.5;
}
.login-input {
  width: 100%;
  padding: 10px 12px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--ov-10);
  background: var(--secondary-bg);
  color: var(--text);
  font-size: var(--fs-lg);
  font-family: var(--font-mono);
  outline: none;
  transition: border-color 0.15s;
}
.login-input:focus { border-color: var(--link); }
.login-input.invalid { border-color: var(--destructive); }
.login-error {
  font-size: var(--fs-base);
  color: var(--destructive);
  margin-top: 8px;
}
.login-modal-body .btn-primary {
  margin-top: 14px;
}
.tg-widget-wrap {
  display: flex;
  justify-content: center;
  min-height: 44px;
  margin-bottom: 4px;
}
.login-divider {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 12px 0;
  color: var(--hint);
  font-size: var(--fs-base);
}
.login-divider::before,
.login-divider::after {
  content: '';
  flex: 1;
  height: 1px;
  background: var(--ov-10);
}
.login-hint {
  font-size: var(--fs-md);
  color: var(--hint);
  margin-bottom: 8px !important;
}

/* Settings → row-link (например «Запросы доступа») */
.st-link-row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  background: var(--ov-03);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  text-decoration: none;
  color: var(--text, #fff);
  cursor: pointer;
  transition: background 0.15s;
}
.st-link-row:hover { background: var(--ov-06); }
.st-link-row-text { flex: 1; }
.st-link-row-label { font-weight: 600; font-size: var(--fs-lg); }
.st-link-row-hint { font-size: var(--fs-base); color: var(--hint); margin-top: 2px; }
.st-link-row-badge {
  background: var(--accent);
  color: var(--on-accent);
  font-size: var(--fs-base);
  font-weight: 600;
  padding: 2px 8px;
  border-radius: var(--r-lg);
  min-width: 22px;
  text-align: center;
}
.st-link-row-arrow { color: var(--hint); font-size: var(--fs-3xl); line-height: 1; }

/* ── Admin: access requests ──────────────────── */
.admin-access-list {
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.access-card {
  background: var(--card);
  border: 1px solid var(--ov-08);
  border-radius: var(--r-xl);
  padding: 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
}
.access-info { flex: 1; min-width: 0; }
.access-name {
  font-weight: 600;
  font-size: var(--fs-xl);
  color: var(--text);
}
.access-meta {
  font-size: var(--fs-md);
  color: var(--hint);
  margin-top: 2px;
  word-break: break-word;
}
.access-meta code {
  font-family: var(--font-mono, monospace);
  font-size: var(--fs-base);
}
.access-time {
  font-size: var(--fs-sm);
  color: var(--hint);
  margin-top: 4px;
}
.access-actions {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex-shrink: 0;
}
.access-actions button {
  padding: 6px 14px;
  font-size: var(--fs-md);
  border-radius: var(--r-sm);
  cursor: pointer;
  border: none;
}
.access-actions .btn-deny {
  background: transparent;
  color: var(--destructive);
  border: 1px solid var(--destructive);
}
.access-actions .btn-deny:hover { background: var(--danger-bg); }
.access-actions button:disabled { opacity: 0.5; cursor: default; }
@media (max-width: 600px) {
  .access-card {
    flex-direction: column;
    align-items: stretch;
  }
  .access-actions { flex-direction: row; }
  .access-actions button { flex: 1; }
}

/* ── Users management ──────────────── */
.users-section-title {
  padding: 14px 12px 6px;
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--hint);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.users-list {
  padding: 0 12px 12px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.user-card {
  background: var(--card);
  border: 1px solid var(--ov-08);
  border-radius: var(--r-xl);
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.user-card.is-disabled { opacity: 0.55; }
.user-info { min-width: 0; }
.user-name {
  font-weight: 600;
  font-size: var(--fs-xl);
  color: var(--text);
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.user-meta {
  font-size: var(--fs-md);
  color: var(--hint);
  margin-top: 3px;
  word-break: break-word;
}
.user-meta code { font-family: var(--font-mono, monospace); font-size: var(--fs-base); }
.user-role {
  font-size: var(--fs-sm);
  font-weight: 600;
  padding: 2px 8px;
  border-radius: var(--r-sm);
}
.user-role.role-owner { background: var(--warning-bg); color: var(--warning); }
.user-role.role-admin { background: var(--accent-bg-strong); color: var(--accent); }
.user-role.role-user  { background: rgba(148,163,184,0.18); color: #94a3b8; }
.user-status.user-disabled {
  font-size: var(--fs-sm);
  color: var(--destructive);
  border: 1px solid var(--destructive);
  padding: 1px 7px;
  border-radius: var(--r-sm);
}
.user-controls {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  align-items: center;
}
.user-controls select {
  padding: 6px 10px;
  border-radius: var(--r-sm);
  background: var(--secondary-bg);
  color: var(--text);
  border: 1px solid var(--ov-12);
  font-size: var(--fs-md);
}
.user-controls button {
  padding: 6px 12px;
  font-size: var(--fs-md);
  border-radius: var(--r-sm);
  cursor: pointer;
  border: none;
}
.user-controls .btn-danger {
  background: transparent;
  color: var(--destructive);
  border: 1px solid var(--destructive);
}
.user-controls .btn-danger:hover { background: var(--danger-bg); }
.user-controls button:disabled { opacity: 0.5; cursor: default; }
.user-controls .user-tag-input {
  padding: 6px 10px;
  border-radius: var(--r-sm);
  background: var(--secondary-bg);
  color: var(--text);
  border: 1px solid var(--ov-12);
  font-size: var(--fs-md);
  width: 110px;
  max-width: 110px;
}
.user-tag-badge {
  font-size: var(--fs-sm);
  font-weight: 600;
  padding: 2px 8px;
  border-radius: var(--r-sm);
  background: rgba(20,184,166,0.16);
  color: #14b8a6;
  white-space: nowrap;
}

/* ── Project context card ──────────────── */
#nt-project-info {
  background: var(--secondary-bg);
  border-radius: var(--radius-sm);
  padding: 10px 12px;
  margin-bottom: 12px;
  font-size: var(--fs-md);
}
.ctx-section { margin-bottom: 8px; }
.ctx-section:last-child { margin-bottom: 0; }
.ctx-label {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--section-header);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-bottom: 5px;
}
details.ctx-section summary.ctx-label {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  gap: 4px;
}
details.ctx-section summary.ctx-label::before { content: '▸'; font-size: var(--fs-xs); }
details.ctx-section[open] summary.ctx-label::before { content: '▾'; }
.ctx-session {
  font-size: var(--fs-base);
  color: var(--hint);
  padding: 2px 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ctx-md {
  font-family: var(--font-mono);
  font-size: var(--fs-sm);
  color: var(--hint);
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 160px;
  overflow-y: auto;
  margin-top: 6px;
  padding: 6px;
  background: var(--sunk-20);
  border-radius: var(--r-xs);
}

/* ── Context: browse files button ──────── */
.ctx-files-btn {
  background: none;
  border: 1px solid var(--ov-15);
  border-radius: var(--radius-sm);
  color: var(--link);
  font-size: var(--fs-base);
  padding: 5px 10px;
  cursor: pointer;
  transition: background 0.15s;
}
.ctx-files-btn:hover { background: var(--ov-05); }

/* ── File Browser ────────────────────────── */
.breadcrumb {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 2px;
  padding: 8px 16px 4px;
  font-size: var(--fs-base);
  color: var(--hint);
  border-bottom: 1px solid var(--ov-06);
}
.bc-item {
  cursor: pointer;
  color: var(--link);
  padding: 2px 4px;
  border-radius: var(--r-xs);
  transition: background 0.15s;
}
.bc-item:hover { background: var(--ov-06); }
.bc-sep { color: var(--hint); padding: 0 2px; }

.files-list {
  padding: 8px 0;
  overflow-y: auto;
  flex: 1;
}
.file-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  cursor: pointer;
  transition: background 0.1s;
  border-bottom: 1px solid var(--ov-04);
}
.file-item:hover { background: var(--ov-04); }
.file-item:active { background: var(--ov-08); }
.fi-icon { font-size: var(--fs-2xl); flex-shrink: 0; }
.fi-name { flex: 1; font-size: var(--fs-lg); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fi-size { font-size: var(--fs-sm); color: var(--hint); flex-shrink: 0; font-family: var(--font-mono); }

/* ── Context window bar (#019) ──────────── */
/* ── Живой план агента (фаза 97) — на месте бывшей контекст-полосы ── */
.plan-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 28px;
  padding: 0 10px 0 12px;
  background: var(--secondary-bg);
  border-bottom: 1px solid var(--ov-06);
  cursor: pointer;
  user-select: none;
  flex-shrink: 0;
  position: relative;
}
.pb-pill {
  font-size: var(--fs-xs);
  font-weight: 600;
  color: var(--warning);
  background: var(--warning-bg);
  border: 1px solid var(--warning-line);
  border-radius: var(--r-pill);
  padding: 1px 7px;
  white-space: nowrap;
  flex-shrink: 0;
}
.pb-title {
  flex: 1;
  min-width: 0;
  font-size: var(--fs-base);
  opacity: 0.92;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.pb-dots { display: flex; align-items: center; gap: 5px; flex-shrink: 0; }
.pb-dot {
  display: inline-block;
  width: 8px; height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}
.pb-dot.done { background: var(--success); }
.pb-dot.run {
  border: 1.5px solid var(--warning);
  background: linear-gradient(90deg, var(--warning) 50%, transparent 50%);
  animation: pb-breathe 1.6s ease-out infinite;
}
.pb-dot.plan { border: 1.5px solid var(--ov-20); }
.pb-dot.blocked { background: var(--destructive); }
.pb-more { font-size: var(--fs-xs); color: var(--hint); }
.pb-count { font-size: var(--fs-xs); font-family: var(--font-mono); color: var(--hint); flex-shrink: 0; }
.pb-chev { color: var(--hint); flex-shrink: 0; transition: transform 0.18s; }
.plan-bar[aria-expanded="true"] .pb-chev { transform: rotate(180deg); }
@keyframes pb-breathe {
  0% { box-shadow: 0 0 0 0 var(--warning-line); }
  70%, 100% { box-shadow: 0 0 0 5px var(--warning-bg); }
}

/* контекст-точка: скрыта <60%, серая 60-80, оранжевая 80-90, красная >90 */
.ctx-dot {
  position: relative;
  display: inline-block;
  width: 6px; height: 6px;
  border-radius: 50%;
  flex-shrink: 0;
  vertical-align: 1px;
}
.ctx-dot.mid { background: var(--hint); }
.ctx-dot.warn { background: var(--warning); }
.ctx-dot.crit {
  background: var(--destructive);
  animation: pb-breathe-red 1.2s ease-out infinite;
}
@keyframes pb-breathe-red {
  0% { box-shadow: 0 0 0 0 var(--danger-line); }
  70%, 100% { box-shadow: 0 0 0 4px var(--danger-bg); }
}

/* панель плана — поповер под баром */
.plan-panel {
  position: absolute;
  top: 100%;
  left: 8px;
  right: 8px;
  max-height: calc(var(--dvh) * 60);
  background: var(--secondary-bg);
  border: 1px solid var(--ov-08);
  border-radius: var(--r-xl);
  box-shadow: 0 14px 36px var(--sh-strong);
  display: flex;
  flex-direction: column;
  z-index: 60;
  animation: pp-drop 0.18s ease;
}
@keyframes pp-drop {
  from { opacity: 0; transform: translateY(-8px); }
  to { opacity: 1; transform: none; }
}
.pp-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border-bottom: 1px solid var(--ov-08);
}
.pp-title { font-size: var(--fs-base); font-weight: 600; }
.pp-progress { flex: 1; text-align: right; font-size: var(--fs-xs); font-family: var(--font-mono); color: var(--hint); }
.pp-close { background: none; border: 0; color: var(--hint); font-size: var(--fs-lg); cursor: pointer; padding: 2px 4px; }
.pp-body { overflow-y: auto; padding: 4px 0 6px; }
.pp-item {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  padding: 6px 14px;
  font-size: var(--fs-base);
  line-height: 1.35;
  cursor: default;
}
.pp-item.has-detail { cursor: pointer; }
.pp-item .pb-dot { width: 10px; height: 10px; margin-top: 3px; }
.pp-item-txt { flex: 1; min-width: 0; }
.pp-item-title { overflow: hidden; text-overflow: ellipsis; }
.pp-item.done .pp-item-title { color: var(--hint); }
.pp-item-detail {
  display: none;
  margin-top: 3px;
  font-size: var(--fs-sm);
  color: var(--hint);
  white-space: pre-wrap;
}
.pp-item.open .pp-item-detail { display: block; }
.pp-item-chev { color: var(--hint); font-size: var(--fs-xs); margin-top: 4px; flex-shrink: 0; transition: transform 0.15s; }
.pp-item.open .pp-item-chev { transform: rotate(90deg); }

/* ── Location Picker ─────────────────────── */
.location-modal-body {
  padding: 0;
  display: flex;
  flex-direction: column;
  max-height: calc(var(--vh) * 70);
}
.location-modal-body .breadcrumb {
  border-bottom: 1px solid var(--ov-08);
  padding: 8px 12px;
}
.loc-list {
  flex: 1;
  overflow-y: auto;
  min-height: 200px;
}
.loc-current {
  font-size: var(--fs-sm);
  color: var(--hint);
  font-family: var(--font-mono);
  padding: 6px 12px;
  background: var(--sunk-20);
  border-top: 1px solid var(--ov-06);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.location-modal-body .btn-primary {
  margin: 10px 12px 12px;
  width: calc(100% - 24px);
}

/* ── Path input with browse button ─────── */
.path-input-row {
  display: flex;
  gap: 6px;
  align-items: center;
}
.path-input-row input { flex: 1; }
.btn-browse-path {
  width: 36px;
  height: 36px;
  flex-shrink: 0;
  font-size: var(--fs-2xl);
  border-radius: var(--radius-sm);
  border: 1px solid var(--ov-10);
  background: var(--secondary-bg);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.15s;
}
.btn-browse-path:hover { background: var(--ov-08); }

/* ── Event timestamp badge ──────────────── */
.msg-ts {
  font-size: var(--fs-xs);
  color: var(--hint);
  opacity: 0.6;
  float: right;
  margin-left: 8px;
  margin-top: 2px;
  font-family: var(--font-mono);
}

/* ── Multi-file attachments list ─────────────── */
.attachments-list {
  display: none;          /* shown via JS when files exist */
  flex-wrap: nowrap;
  align-items: flex-end;
  gap: 10px;
  padding: 10px 14px 6px;
  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.attachments-list::-webkit-scrollbar { display: none; }
#chat-attachments {
  margin-bottom: 4px;
}
#nt-attachments {
  margin-top: 6px;
  padding: 10px 6px 4px;
  flex-shrink: 0;
}
/* ── Plus button (attach + model selector) ── */
.chat-plus-wrap {
  position: relative;
  flex-shrink: 0;
  display: flex;
  align-items: center;
}
.btn-plus-chat {
  background: none;
  border: none;
  color: var(--hint);
  cursor: pointer;
  width: 32px;
  height: 32px;
  border-radius: var(--r-md);
  padding: 0;
  line-height: 1;
  transition: color 0.15s, transform 0.2s, background 0.12s;
  display: flex;
  align-items: center;
  justify-content: center;
}
.btn-plus-chat:hover { color: var(--link); background: var(--ov-06); }
.btn-plus-chat.has-file { color: var(--link); }

.plus-dropdown {
  display: none;
  position: absolute;
  bottom: calc(100% + 8px);
  left: 0;
  min-width: 230px;
  background: var(--card);
  border: 1px solid var(--ov-10);
  border-radius: var(--r-2xl);
  padding: 6px;
  box-shadow: 0 10px 30px var(--sh-strong);
  z-index: 100;
}
.plus-dropdown.open { display: block; }

.plus-item {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  text-align: left;
  padding: 9px 12px;
  background: none;
  border: none;
  border-radius: var(--r-lg);
  color: var(--text);
  font-size: var(--fs-lg);
  cursor: pointer;
  transition: background 0.1s;
}
.plus-item:hover { background: var(--ov-06); }
.plus-item .plus-ico { width: 18px; height: 18px; flex: 0 0 auto; color: var(--hint); }

.plus-dd-label {
  display: block;
  padding: 4px 12px 6px;
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: 0.5px;
  color: var(--hint);
}

/* ── Model tag in chat header ─────────── */
.model-tag {
  font-size: var(--fs-sm);
  font-weight: 400;
  color: var(--link);
  opacity: 0.7;
}
/* Effort badge next to the model (chat header). Dimmer than the model tag. */
.effort-tag {
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--hint);
  margin-left: 4px;
}
.agent-effort { font-size: var(--fs-xs); color: var(--hint); opacity: 0.85; }
/* Фаза 94: бейдж фоновой фазы — ход завершён, сессия ждёт свои фоновые
   Bash-задачи (проект и слот при этом свободны). Янтарная пилюля, чтобы
   отличаться и от синего model-tag, и от статусных цветов. */
.bg-phase-tag {
  display: inline-block;
  font-size: var(--fs-xs);
  font-weight: 500;
  color: var(--warning);
  background: var(--warning-bg);
  border: 1px solid var(--warning-line);
  border-radius: var(--r-pill);
  padding: 1px 7px;
  vertical-align: 1px;
  white-space: nowrap;
}

/* ── Autonomy mode switcher in the INPUT BAR (фаза 55, native-style) ───────── */
/* Lives at the input line (like the native client's Shift+Tab), not the header. */
/* ── Composer toolbar — native Claude-style (фаза 55) ───────────────── */
.composer-divider { height: 1px; background: var(--ov-07); margin: 2px 0; }

/* mic lives in the bottom toolbar, не в правом верхнем углу */
.ct-right .btn-voice {
  width: 32px;
  height: 32px;
  border-radius: var(--r-md);
  background: transparent;
  color: var(--hint);
}
.ct-right .btn-voice:hover { color: var(--text); background: var(--ov-06); }
.ct-right .btn-voice svg { width: 19px; height: 19px; }

/* toolbar icon buttons (+ and /) */
.ct-icon-btn {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px;
  padding: 0;
  background: transparent; border: none; border-radius: var(--r-md);
  color: var(--hint); cursor: pointer;
  transition: color 0.12s, background 0.12s, transform 0.1s;
  -webkit-tap-highlight-color: transparent;
}
.ct-icon-btn:hover { color: var(--text); background: var(--ov-07); }
.ct-icon-btn:active { transform: scale(0.92); }
.ct-icon-btn svg { width: 20px; height: 20px; display: block; }

/* mode button + "Режимы" popover */
/* flex: 0 0 auto держал обёртку нерастяжимой, поэтому чип режима не мог сжаться
   и тулбар вылезал за край на 375px. */
.mode-wrap { position: relative; flex: 0 1 auto; min-width: 0; }
/* Подпись режима на телефоне прячем целиком: при сжатии она превращалась
   в «А..», что не несёт смысла — иконки достаточно, полное имя есть в
   поповере режимов. */
@media (max-width: 480px) {
  .mode-btn-name { display: none; }
}
.mode-btn-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.mode-btn {
  display: inline-flex; align-items: center; gap: 6px;
  height: 32px; padding: 0 10px 0 8px;
  background: transparent; border: none; border-radius: var(--r-md);
  color: var(--text); font-size: var(--fs-md); font-weight: 500;
  cursor: pointer; white-space: nowrap;
  transition: background 0.12s;
  -webkit-tap-highlight-color: transparent;
  /* Чип обязан сжиматься: без min-width: 0 его минимальная ширина равна
   * содержимому, и на 375px тулбар вылезал за край. */
  min-width: 0;
  overflow: hidden;
}
.mode-btn:hover { background: var(--ov-07); }
.mode-btn-ico { display: inline-flex; color: var(--hint); }
.mode-btn-ico svg { width: 17px; height: 17px; display: block; }
.modes-popover {
  position: absolute; bottom: calc(100% + 8px); right: 0;
  width: 300px; max-width: calc(var(--vw) * 78); padding: 6px;
  background: var(--card);
  border: 1px solid var(--border, var(--ov-10));
  border-radius: var(--r-2xl);
  box-shadow: 0 10px 30px var(--sh-strong);
  z-index: 1100; animation: agentMenuIn 0.12s ease;
}
.modes-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 6px 10px 8px; font-size: var(--fs-base); color: var(--hint);
}
.modes-hint { font-size: var(--fs-sm); opacity: 0.7; }
.modes-rows { display: flex; flex-direction: column; gap: 2px; }
.modes-row {
  display: flex; align-items: flex-start; gap: 10px;
  width: 100%; text-align: left; padding: 9px 10px;
  background: transparent; border: none; border-radius: var(--r-lg);
  color: var(--text); cursor: pointer; transition: background 0.12s;
}
.modes-row:hover { background: var(--ov-06); }
.modes-row.active { background: var(--accent-bg-strong); }
.modes-row-ico { flex: 0 0 auto; margin-top: 1px; color: var(--hint); }
.modes-row.active .modes-row-ico { color: var(--link); }
.modes-row-ico svg { width: 18px; height: 18px; display: block; }
.modes-row-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.modes-row-title { font-size: var(--fs-md); font-weight: 600; }
.modes-row-desc { font-size: var(--fs-sm); color: var(--hint); line-height: 1.3; }
.modes-row-check { flex: 0 0 auto; color: var(--link); opacity: 0; margin-top: 2px; }
.modes-row.active .modes-row-check { opacity: 1; }
.modes-row-check svg { width: 16px; height: 16px; display: block; }

/* New Task autonomy chips keep SVG icons */
#nt-autonomy .nt-chip svg { width: 16px; height: 16px; display: block; }
#nt-autonomy .nt-chip.active { color: var(--link); }
.qa-perm-lock { width: 13px; height: 13px; vertical-align: -2px; opacity: 0.8; }

/* command palette (/) — фаза 55 / P2 */
.cmd-wrap { position: relative; flex: 0 0 auto; }
.cmd-palette {
  position: absolute; bottom: calc(100% + 8px); left: 0;
  width: 320px; max-width: calc(var(--vw) * 80);
  /* dvh (dynamic viewport) учитывает клавиатуру на iOS — vh там считается от
     полного экрана и не сжимается, из-за чего палитра оказывалась выше видимой
     области и список не скроллился внутри (скроллилось всё приложение). */
  max-height: min(380px, calc(var(--vh) * 60));
  max-height: min(380px, calc(var(--dvh) * 60));
  display: flex; flex-direction: column;
  background: var(--card);
  border: 1px solid var(--border, var(--ov-10));
  border-radius: var(--r-2xl);
  box-shadow: 0 10px 30px var(--sh-strong);
  z-index: 1100; overflow: hidden;
  animation: agentMenuIn 0.12s ease;
}
.cmd-filter {
  flex: 0 0 auto;
  margin: 6px; padding: 9px 12px;
  background: var(--secondary-bg, var(--ov-05));
  border: 1px solid var(--ov-08);
  border-radius: var(--r-lg);
  color: var(--text); font-size: var(--fs-md); outline: none;
}
.cmd-filter::placeholder { color: var(--hint); }
/* flex:1 + min-height:0 let the list shrink below content height inside the
   max-height palette so its own overflow-y actually scrolls (the classic flex
   scroll gotcha — without min-height:0 it just clips, no scrollbar). */
.cmd-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; padding: 0 6px 6px; }
.cmd-section-label { padding: 8px 8px 4px; font-size: var(--fs-sm); color: var(--hint); font-weight: 600; }
.cmd-row {
  display: flex; align-items: center; gap: 10px;
  width: 100%; text-align: left; padding: 8px 10px;
  background: transparent; border: none; border-radius: var(--r-md);
  color: var(--text); font-size: var(--fs-md); cursor: pointer;
  transition: background 0.1s;
}
.cmd-row:hover { background: var(--ov-06); }
.cmd-row.active { background: var(--accent-bg-strong); }
.cmd-row.active .cmd-row-ico, .cmd-row.active .cmd-row-title { color: var(--link); }
.cmd-row-ico { flex: 0 0 auto; color: var(--hint); display: inline-flex; }
.cmd-row-ico svg { width: 17px; height: 17px; display: block; }
.cmd-row-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.cmd-row-title { min-width: 0; }
.cmd-row-desc { font-size: var(--fs-sm); color: var(--hint); line-height: 1.25; }
.cmd-row-check { flex: 0 0 auto; color: var(--link); display: inline-flex; }
.cmd-row-check svg { width: 16px; height: 16px; display: block; }
.cmd-empty { padding: 16px; text-align: center; color: var(--hint); font-size: var(--fs-md); }

/* @-саджест файлов в композере (фаза 72) — та же анатомия строк, что у
   палитры "/", но якорится в .composer-text (position:relative) и растянут
   на всю ширину поля ввода; выпадает НАД полем, как палитра и slash-скилы. */
.cmd-palette.file-suggest {
  left: 0; right: 0;
  width: auto; max-width: none;
  max-height: min(320px, calc(var(--vh) * 50));
  max-height: min(320px, calc(var(--dvh) * 50));
}
.cmd-palette.file-suggest .cmd-list { padding-top: 6px; }
.cfs-row { gap: 8px; }
.cfs-ico { font-size: var(--fs-xl); line-height: 1; }
.cfs-name { flex: 0 1 auto; min-width: 24px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cmd-row.active .cfs-name { color: var(--link); }
.cfs-path {
  margin-left: auto; flex: 0 1 auto; min-width: 0; max-width: 60%;
  font-size: var(--fs-sm); color: var(--hint);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  /* rtl-направление даёт ellipsis СЛЕВА (виден хвост пути, как в нативном
     клиенте); <bdi> внутри сохраняет нормальный LTR-порядок символов пути */
  direction: rtl; text-align: right;
}

/* ── Нативная карточка AskUserQuestion (фаза 73) ─────────────────────────
   VS Code-style: табы по вопросам, опции с label+description (радио/чекбокс),
   «Другое…» со свободным вводом, «Ответить» одним сабмитом. Живёт в зоне
   .quick-actions.poll-mode (docked над полем ввода). */
.sdkq-card {
  width: 100%;
  background: var(--secondary-bg);
  /* --border — белая альфа: в светлой теме Telegram давала 1.01:1. */
  border: 1px solid color-mix(in srgb, var(--text) 13%, transparent);
  border-radius: var(--r-2xl);
  padding: 12px 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  max-height: calc(var(--vh) * 48);
  overflow-y: auto;
  box-sizing: border-box;
}
.sdkq-tabs {
  display: flex;
  gap: 4px;
  flex-wrap: wrap;
  border-bottom: 1px solid color-mix(in srgb, var(--text) 12%, transparent);
  padding-bottom: 7px;
}
.sdkq-tab {
  background: transparent;
  border: none;
  color: var(--hint);
  font-family: inherit;
  font-size: var(--fs-md);
  padding: 5px 10px;
  border-radius: var(--r-md);
  cursor: pointer;
  transition: color 0.15s, background 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.sdkq-tab.active {
  color: var(--text);
  background: var(--accent-bg-strong);
  font-weight: 500;
}
.sdkq-tab.done {
  color: color-mix(in srgb, var(--success) 82%, var(--text));
}
.sdkq-tab.done::after {
  content: '✓';
  margin-left: 5px;
  color: var(--success);
  font-size: var(--fs-base);
  font-weight: 700;
}
.sdkq-tab.done.active { color: var(--text); }
.sdkq-question {
  font-size: var(--fs-lg);
  /* 500, а не 600: раньше жирным было всё — заголовок, чипы, вопрос,
     каждый вариант — и иерархии не оставалось (12.09.2026). Вопрос —
     единственный акцент карточки, варианты идут обычным весом. */
  font-weight: 500;
  color: var(--text);
  line-height: 1.4;
  overflow-wrap: anywhere;
  /* Модель нередко пишет вопрос в несколько строк (контекст, потом сам
     вопрос) — без этого всё схлопывалось в одну простыню. */
  white-space: pre-line;
}
.sdkq-opts {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.sdkq-opt {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  width: 100%;
  text-align: left;
  background: transparent;
  border: 1px solid color-mix(in srgb, var(--text) 15%, transparent);
  border-radius: var(--r-lg);
  padding: 9px 12px;
  cursor: pointer;
  font-family: inherit;
  color: var(--text);
  transition: border-color 0.15s, background 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.sdkq-opt:hover { border-color: var(--accent-line); background: var(--accent-bg); }
.sdkq-opt.selected { border-color: var(--link); background: var(--accent-bg); }
.sdkq-mark {
  flex: 0 0 16px;
  width: 16px;
  height: 16px;
  margin-top: 1px;
  border: 1.6px solid var(--hint);
  border-radius: 50%;
  position: relative;
  transition: border-color 0.15s;
}
.sdkq-mark.sq { border-radius: var(--r-xs); }
.sdkq-opt.selected .sdkq-mark { border-color: var(--link); }
.sdkq-opt.selected .sdkq-mark::after {
  content: '';
  position: absolute;
  inset: 3px;
  border-radius: 50%;
  background: var(--link);
}
.sdkq-opt.selected .sdkq-mark.sq {
  background: var(--link);
  border-color: var(--link);
}
.sdkq-opt.selected .sdkq-mark.sq::after {
  /* Галочка, а не заливка: с квадратной точкой множественный выбор
     визуально не отличался от одиночного (проверка 108). */
  inset: 0;
  background: none;
  border: 2px solid #fff;
  border-top: none;
  border-right: none;
  border-radius: 1px;
  width: 8px;
  height: 4px;
  margin: 4px auto 0;
  transform: rotate(-45deg);
}
.sdkq-opt-text {
  display: flex;
  flex-direction: column;
  gap: 3px;
  flex: 1 1 auto;
  min-width: 0;
}
/* Подпись переносится целиком, длинный идентификатор (gtokens-withdraw,
   URL) рвётся только когда не влезает; никакой обрезки на клиенте нет. */
.sdkq-opt-label { font-size: var(--fs-lg); font-weight: 400; line-height: 1.4; overflow-wrap: anywhere; }
.sdkq-opt.selected .sdkq-opt-label { font-weight: 500; }
.sdkq-opt-desc { font-size: var(--fs-md); color: var(--hint); line-height: 1.4; overflow-wrap: anywhere; }
.sdkq-other-input {
  width: 100%;
  box-sizing: border-box;
  resize: vertical;
  min-height: 44px;
  background: var(--bg);
  color: var(--text);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: 8px 10px;
  font-family: inherit;
  font-size: var(--fs-md);
}
.sdkq-other-input:focus { outline: none; border-color: var(--link); }
.sdkq-footer {
  display: flex;
  align-items: center;
  /* wrap + nowrap на кнопках: с «Пропустить» и «Стоп» в строке multiSelect-
     подсказка вылезала за край карточки, а «Ответить (1/3)» ломался на две
     строки (визуальная проверка 105). Теперь переносится подсказка, а не текст. */
  flex-wrap: wrap;
  gap: 10px;
  /* Sticky внутри скроллящейся карточки: кнопка «Ответить» и счётчик всегда
     видны, даже когда опции выше max-height (bottom компенсирует padding). */
  position: sticky;
  bottom: -12px;
  margin: 0 -14px -12px;
  padding: 8px 14px 12px;
  background: var(--secondary-bg);
  border-top: 1px solid color-mix(in srgb, var(--text) 14%, transparent);
}
.sdkq-submit {
  background: var(--link);
  color: #fff;
  border: none;
  border-radius: var(--r-lg);
  padding: 8px 18px;
  font-family: inherit;
  font-size: var(--fs-md);
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
  flex-shrink: 0;
  transition: filter 0.15s, opacity 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.sdkq-submit:hover:not(:disabled) { filter: brightness(1.12); }
.sdkq-submit:disabled { opacity: 0.45; cursor: default; }
.sdkq-hint { font-size: var(--fs-base); color: color-mix(in srgb, var(--text) 68%, transparent); }
/* permission variant (tool_permission, фаза 55 → карточка в фазе 73) */
.sdkq-perm-head {
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--text);
  display: flex;
  align-items: center;
  gap: 6px;
}
.sdkq-perm-head code {
  background: var(--accent-bg);
  border-radius: var(--r-sm);
  padding: 1px 7px;
  color: var(--link);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-base);
}
.sdkq-perm-detail {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-base);
  color: var(--hint);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 8px 10px;
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 120px;
  overflow-y: auto;
}
.sdkq-perm-btns {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.sdkq-perm-btn {
  display: flex;
  flex-direction: column;
  gap: 2px;
  text-align: left;
  border-radius: var(--r-lg);
  padding: 9px 12px;
  cursor: pointer;
  font-family: inherit;
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text);
  transition: background 0.15s, border-color 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.sdkq-perm-btn.allow {
  background: var(--success);
  border-color: var(--success);
  color: var(--on-accent);
}
.sdkq-perm-btn.allow .sdkq-opt-desc { color: rgba(255,255,255,0.75); }
.sdkq-perm-btn.allow:hover { background: var(--success); border-color: var(--success); }
.sdkq-perm-btn.all {
  color: var(--warning);
  border-color: var(--warning-line);
}
.sdkq-perm-btn.all .sdkq-opt-desc { color: var(--hint); }
.sdkq-perm-btn.all:hover { background: var(--warning-bg); }
.sdkq-perm-btn.reject {
  color: rgba(255,255,255,0.55);
  border-color: var(--ov-10);
}
.sdkq-perm-btn.reject .sdkq-opt-desc { color: rgba(255,255,255,0.35); }
.sdkq-perm-btn.reject:hover { color: rgba(255,255,255,0.8); }
@media (max-width: 480px) {
  .sdkq-card { max-height: calc(var(--vh) * 52); padding: 10px 12px; }
  .sdkq-opt { padding: 10px 12px; }
  /* Тач-таргеты: табы и сабмит ближе к 44px */
  .sdkq-tab { padding: 8px 12px; }
  .sdkq-submit { padding: 10px 18px; }
  .sdkq-footer { margin: 0 -12px -10px; padding: 8px 12px 10px; bottom: -10px; }
}

/* ── Model label in agent cards ───────── */
.agent-model {
  font-size: var(--fs-xs);
  color: var(--hint);
}

/* ── Model change event in chat ───────── */
.msg-model-change {
  display: flex;
  justify-content: center;
  padding: 2px 0;
}
.msg-model-change .msg-system {
  font-size: var(--fs-sm);
  color: var(--hint);
  background: transparent;
  padding: 2px 8px;
}

/* ── File Attachment Badge ─────────────── */
.nt-attach-row {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 6px;
}
.attachment-badge {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 10px;
  background: var(--secondary-bg);
  border-radius: var(--r-lg);
  font-size: var(--fs-base);
  color: var(--text);
  margin-top: 0;
  max-width: 200px;
  overflow: hidden;
  flex-shrink: 0;
}
.attachment-badge span {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.attachment-badge .btn-icon {
  background: none;
  border: none;
  cursor: pointer;
  font-size: var(--fs-lg);
  padding: 0 2px;
  color: var(--hint);
  line-height: 1;
  flex-shrink: 0;
}

/* ── Карточка приложенного файла (не-изображение) + загрузка ── */
.attachment-badge.file-card {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 6px 8px;
  flex: 0 0 auto;
  width: auto;
  max-width: 230px;
  min-width: 0;
  cursor: default;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
}
.file-card .fc-icon {
  width: 38px;
  height: 38px;
  border-radius: var(--r-md);
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-xs);
  font-weight: 700;
  letter-spacing: 0.3px;
  color: #fff;
}
.fc-icon.fc-red { background: var(--cat-red); }
.fc-icon.fc-blue { background: var(--cat-blue); }
.fc-icon.fc-green { background: var(--cat-green); }
.fc-icon.fc-orange { background: var(--cat-orange); }
.fc-icon.fc-violet { background: var(--cat-violet); }
.fc-icon.fc-teal { background: var(--cat-teal); }
.fc-icon.fc-pink { background: var(--cat-pink); }
.fc-icon.fc-slate { background: var(--cat-slate); }
.fc-icon.fc-gray { background: var(--cat-gray); }
.file-card .fc-body {
  flex: 0 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.file-card .fc-name {
  font-size: var(--fs-md);
  font-weight: 600;
  max-width: 150px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text);
}
.file-card .fc-meta {
  font-size: var(--fs-sm);
  font-variant-numeric: tabular-nums;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--hint);
}
.file-card .fc-bar {
  height: 4px;
  margin-top: 5px;
  border-radius: 2px;
  background: var(--secondary-bg);
  overflow: hidden;
}
.file-card .fc-fill {
  height: 100%;
  border-radius: 2px;
  background: var(--link);
  transition: width 0.15s ease;
}
/* Миниатюра изображения / превью документа на месте иконки типа */
.file-card .fc-thumb {
  object-fit: cover;
  background: var(--secondary-bg);
}
/* Превью документа (PDF) — показываем верх страницы (заголовок), не центр */
.file-card .fc-doc-thumb {
  object-position: top center;
  background: #fff;
}
/* Кликабельная миниатюра — курсор-лупа + лёгкий hover */
.file-card .fc-icon.fc-clickable { cursor: zoom-in; }
.file-card .fc-icon.fc-clickable:hover { filter: brightness(0.92); }

/* ── Лайтбокс превью вложения (картинка/PDF/DOCX) ── */
.preview-lightbox { position: fixed; inset: 0; z-index: 9000; display: none; }
.preview-lightbox.open { display: block; }
.preview-lightbox .lb-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.7);
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
}
.preview-lightbox .lb-panel {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: min(920px, calc(var(--vw) * 94));
  max-height: calc(var(--vh) * 92);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border-radius: var(--r-2xl);
  background: var(--bg);
  box-shadow: 0 12px 48px var(--sh-strong);
}
.preview-lightbox .lb-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 10px 14px;
  flex-shrink: 0;
  border-bottom: 1px solid var(--border);
}
.preview-lightbox .lb-title {
  font-size: var(--fs-lg);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text);
}
.preview-lightbox .lb-close {
  flex-shrink: 0;
  background: none;
  border: none;
  cursor: pointer;
  font-size: var(--fs-2xl);
  line-height: 1;
  padding: 4px 8px;
  color: var(--hint);
}
.preview-lightbox .lb-close:hover { color: var(--text); }
.preview-lightbox .lb-content {
  flex: 1;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  padding: 14px;
  background: var(--secondary-bg);
}
.preview-lightbox .lb-image {
  max-width: 100%;
  height: auto;
  display: block;
  margin: 0 auto;
  border-radius: var(--r-sm);
}
.preview-lightbox .lb-page {
  max-width: 100%;
  height: auto;
  display: block;
  margin: 0 auto 12px;
  background: #fff;
  box-shadow: 0 1px 8px var(--sh-soft);
}
.preview-lightbox .lb-loading,
.preview-lightbox .lb-note {
  text-align: center;
  color: var(--hint);
  padding: 32px 12px;
  font-size: var(--fs-md);
}
.preview-lightbox .lb-note { padding: 10px; font-size: var(--fs-base); }
/* docx-preview: убрать его серый фон-обёртку, оставить страницы-листы */
.preview-lightbox .docx-wrapper {
  background: transparent !important;
  padding: 0 !important;
}
.preview-lightbox .docx-wrapper > section.docx {
  margin: 0 auto 12px !important;
  box-shadow: 0 1px 8px var(--sh-soft);
}
/* Порядок: иконка/миниатюра → тело → кнопка. У изображения кнопка идёт первой
   в DOM (legacy-разметка) — order выравнивает её вправо, как у файлов. */
.file-card .fc-icon,
.file-card .fc-thumb { order: 0; }
.file-card .fc-body { order: 1; }
.file-card .fc-remove,
.file-card .attach-remove { order: 2; }
.file-card .fc-remove,
.file-card .attach-remove {
  align-self: flex-start;
  flex-shrink: 0;
  position: static;
  width: auto;
  height: auto;
  border-radius: 0;
  background: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: none;
  cursor: pointer;
  padding: 2px 4px;
  font-size: var(--fs-lg);
  line-height: 1;
  color: var(--hint);
}
.file-card .fc-remove:hover,
.file-card .attach-remove:hover { color: var(--text); }
.file-card .fc-spin {
  display: inline-block;
  width: 9px;
  height: 9px;
  margin-right: 3px;
  vertical-align: -1px;
  border: 1.5px solid var(--link);
  border-top-color: transparent;
  border-radius: 50%;
  animation: fc-spin 0.7s linear infinite;
}
@keyframes fc-spin { to { transform: rotate(360deg); } }

/* ── Attachment image preview ────────────── */
.attach-preview {
  width: 40px;
  height: 40px;
  border-radius: var(--r-sm);
  object-fit: cover;
  flex-shrink: 0;
}

/* ── Pasted content cards (override .attachment-badge base) ── */
.attachment-badge.attach-pasted-text,
.attachment-badge.attach-image-card {
  position: relative;
  flex-direction: column;
  align-items: stretch;
  gap: 0;
  margin-top: 0;
  padding: 0;
  border-radius: var(--r-2xl);
  border: 1px solid var(--ov-08);
  background: var(--secondary-bg);
  overflow: hidden;
  flex-shrink: 0;
}
/* ── Pasted long text card ── */
.attachment-badge.attach-pasted-text {
  width: 260px;
  max-width: 100%;
  flex-direction: row;
  align-items: flex-start;
  gap: 8px;
  padding: 9px 8px 9px 10px;
}
.attach-pasted-clickable { cursor: pointer; }
.attach-pasted-clickable:hover { border-color: var(--border); }
.attach-pasted-icon {
  flex-shrink: 0;
  width: 24px;
  height: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--r-md);
  color: var(--link);
  background: color-mix(in srgb, var(--link) 12%, transparent);
}
.attach-pasted-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.attach-pasted-title {
  font-size: var(--fs-md);
  font-weight: 600;
  line-height: 1.3;
  color: var(--text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.attach-pasted-expand {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 0;
  border: none;
  background: none;
  font: inherit;
  font-size: var(--fs-base);
  line-height: 1.3;
  color: var(--hint);
  text-decoration: underline;
  text-underline-offset: 2px;
  cursor: pointer;
  max-width: 100%;
  /* Перенос, а не обрезка: на узком layout (375px при масштабе 140% — это 268)
     подпись не влезала в строку и срезалась посередине слова, без многоточия,
     потому что ellipsis во flex-строке с иконкой не отрабатывает. */
  white-space: normal;
  text-align: left;
}
.attach-pasted-expand:hover { color: var(--text); }
.attach-pasted-chevron { text-decoration: none; }
.attach-pasted-text .attach-remove {
  position: static;
  flex-shrink: 0;
  align-self: flex-start;
  width: auto;
  height: auto;
  padding: 0 2px;
  border: none;
  border-radius: var(--r-sm);
  font-size: var(--fs-md);
  line-height: 1.3;
  background: transparent;
  color: var(--hint);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
.attach-pasted-text .attach-remove:hover {
  color: var(--text);
  background: var(--ov-08);
}

/* Редактор вставленного текста */
.modal-card.pasted-text-modal {
  width: 100%;
  max-width: 760px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.pasted-text-modal .pt-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.pasted-text-modal .pt-head h3 { margin: 0; }
.pasted-text-modal .pt-close {
  flex-shrink: 0;
  background: none;
  border: none;
  color: var(--hint);
  font-size: var(--fs-xl);
  cursor: pointer;
}
.pasted-text-modal .pt-close:hover { color: var(--text); }
.pasted-text-modal .pt-text {
  width: 100%;
  min-height: 240px;
  height: calc(var(--vh) * 46);
  height: calc(var(--dvh) * 46);
  resize: vertical;
  padding: 10px 12px;
  border: 1px solid var(--ov-08);
  border-radius: var(--r-lg);
  background: var(--secondary-bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size: var(--fs-md);
  line-height: 1.5;
  white-space: pre-wrap;
}
.pasted-text-modal .pt-text:focus {
  outline: none;
  border-color: var(--link);
}
.pasted-text-modal .pt-count {
  font-size: var(--fs-base);
  color: var(--hint);
}
/* У .btn-secondary глобально width: 100% (как и у .btn-primary), поэтому три
   действия вставали столбиком — .confirm-modal лечит это тем же способом.
   На десктопе строим их в строку: «Отмена» слева, подтверждающие — справа. */
.pasted-text-modal .pt-actions {
  margin-top: 6px;
  align-items: center;
}
.pasted-text-modal .pt-actions button {
  width: auto;
  padding: 9px 16px;
  font-size: var(--fs-lg);
}
.pasted-text-modal .pt-actions .pt-cancel { margin-right: auto; }
@media (max-width: 600px) {
  .pasted-text-modal .pt-text { height: calc(var(--vh) * 42); min-height: 180px; }
  .pasted-text-modal .pt-text { height: calc(var(--dvh) * 42); }
  .pasted-text-modal .pt-actions { flex-wrap: wrap; }
  .pasted-text-modal .pt-actions button { flex: 1 1 auto; }
  .pasted-text-modal .pt-actions .pt-cancel { margin-right: 0; }
  /* На телефоне подтверждающая кнопка должна быть под большим пальцем — она
     идёт первой строкой, «Отмена» уходит вниз. */
  .pasted-text-modal .pt-actions .pt-save { order: -1; flex-basis: 100%; }
}

/* ── Pasted image card ── */
.attachment-badge.attach-image-card {
  width: 72px;
  height: 72px;
  padding: 0;
  border-radius: var(--r-xl);
}
.attach-image-card .attach-preview {
  width: 100%;
  height: 100%;
  border-radius: var(--r-lg);
  object-fit: cover;
}
/* ── Remove button (shared for absolute-positioned cards) ── */
.attach-remove {
  position: absolute;
  top: 5px;
  right: 5px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: rgba(0,0,0,0.55);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  border: none;
  color: rgba(255,255,255,0.85);
  font-size: var(--fs-sm);
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 2;
  padding: 0;
  transition: background 0.15s, transform 0.1s, color 0.15s;
}
.attach-remove:hover { background: rgba(0,0,0,0.8); }
.attach-remove:active { transform: scale(0.9); }

/* ── Chat image preview (in user messages) ── */
.chat-img-preview {
  margin-top: 8px;
}
.chat-img-preview img {
  max-width: 240px;
  max-height: 200px;
  border-radius: var(--r-lg);
  cursor: pointer;
  transition: opacity 0.15s;
}
.chat-img-preview img:hover {
  opacity: 0.85;
}
.chat-file-badge {
  display: inline-block;
  padding: 2px 8px;
  background: var(--accent-bg);
  border-radius: var(--r-sm);
  font-size: var(--fs-base);
  color: var(--link);
  margin-top: 4px;
}

/* ── File content viewer ───────────────── */
.file-content-header {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: var(--secondary-bg);
  border-radius: var(--radius-sm);
  margin-bottom: 8px;
}
.file-content-name {
  flex: 1;
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--text);
  font-family: var(--font-mono);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.file-size-badge {
  font-size: var(--fs-sm);
  color: var(--hint);
  white-space: nowrap;
}
.file-content-pre {
  background: var(--secondary-bg);
  border-radius: var(--radius-sm);
  padding: 12px 12px 12px 0;
  overflow-x: auto;
  font-size: var(--fs-base);
  line-height: 1.5;
  font-family: var(--font-mono);
  color: var(--text);
  white-space: pre;
  max-height: calc(var(--vh) * 72);
  overflow-y: auto;
  counter-reset: line;
}
/* Issue 18: line numbers */
.file-content-pre .code-line {
  display: block;
  padding-left: 12px;
  counter-increment: line;
}
.file-content-pre .code-line::before {
  content: counter(line);
  display: inline-block;
  width: 3.5ch;
  margin-right: 16px;
  padding-right: 8px;
  color: var(--hint);
  text-align: right;
  user-select: none;
  opacity: 0.4;
  border-right: 1px solid var(--ov-06);
}
.file-content-pre .code-line:hover {
  background: var(--ov-03);
}
/* Ensure file lines don't wrap unexpectedly */
.file-content-pre code {
  display: block;
  white-space: pre;
}
/* highlight.js: transparent bg so our <pre> controls background */
.file-content-pre code.hljs {
  background: transparent;
  padding: 0;
}

/* Шапка главной (её видно только на телефоне): знак 1do + имя. Версия
   сборки — в «Настройках», в шапке она была первым, что видел человек. */
/* Словесный знак «1do.» — как в шапке сайта: «1» и точка брендом, «do» цветом
   текста (в тёмной теме — светлым). Плитка остаётся в узком сайдбаре. */
:root { --wordmark-accent: #2f5bea; }
[data-theme="dark"] { --wordmark-accent: #5b7cf0; }
.wordmark { display: block; height: 24px; width: auto; color: var(--text); flex-shrink: 0; }
.brand-title { display: flex; align-items: center; min-height: 40px; }
#screen-dashboard .header .version-tag { display: none; }

/* ══════════════════════════════════════════════════════════
   VERSION TAG
   ══════════════════════════════════════════════════════════ */

.version-tag {
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--link);
  background: var(--accent-bg);
  border: 1px solid var(--accent-bg-strong);
  padding: 2px 8px;
  border-radius: var(--r-lg);
  white-space: nowrap;
}

/* ══════════════════════════════════════════════════════════
   Workspace selector (shared) — фаза 126.7
   Стили общие для сайдбара (десктоп) и шапок экранов (телефон).
   Держать их ВНЕ @media (min-width:960px): раньше они лежали внутри, и
   на телефоне чип отрисовался бы голой системной кнопкой.
   ══════════════════════════════════════════════════════════ */
.ws-mount {
  position: relative;
  display: flex;
  align-items: center;
}
/* Прижимает чип к правому краю шапки — по решению владельца он стоит
   вплотную слева от шестерёнки, а не болтается у заголовка. */
.header .ws-mount-header,
.form-header .ws-mount-header { margin-left: auto; }
/* У кнопки настроек свой margin-left:auto; если оставить оба, свободное место
   поделится между ними пополам и шестерёнка уедет от чипа на пол-экрана. */
.header .ws-mount-header + .header-settings-btn { margin-left: 0; }

.ws-trigger {
  height: 28px;
  max-width: 132px;
  padding: 0 10px;
  border-radius: var(--r-md);
  background: var(--ov-06);
  border: 1px solid var(--border);
  color: var(--text-secondary);
  font-size: var(--fs-sm);
  font-weight: 500;
  cursor: pointer;
  transition: all 0.15s;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ws-trigger:hover {
  background: var(--ov-10);
  color: var(--text);
}
/* fixed, а не absolute: сайдбар шириной 56px стоит с overflow:hidden, и
   абсолютный дропдаун шириной 190px обрезался им целиком — список вех не
   было видно вообще. Координаты проставляет JS по позиции триггера. */
.ws-dropdown {
  position: fixed;
  min-width: 190px;
  max-width: calc(var(--vw) * 100 - 16px);
  max-height: calc(var(--vh) * 60);
  overflow-y: auto;
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: 4px;
  z-index: 1000;
  box-shadow: 0 8px 24px var(--sh-mid);
}
.ws-option {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  width: 100%;
  padding: 6px 12px;
  border: none;
  background: none;
  color: var(--text-secondary);
  font-size: var(--fs-base);
  text-align: left;
  cursor: pointer;
  border-radius: var(--r-sm);
  transition: all 0.1s;
}
.ws-option:hover {
  background: var(--ov-06);
  color: var(--text);
}
.ws-option.active {
  color: var(--link);
  background: var(--accent-bg);
}
.ws-count {
  flex: 0 0 auto;
  font-size: var(--fs-sm);
  opacity: 0.55;
  font-variant-numeric: tabular-nums;
}
.ws-manage {
  margin-top: 4px;
  border-top: 1px solid var(--border);
  border-radius: 0 0 6px 6px;
  padding-top: 8px;
  font-size: var(--fs-sm);
}

/* Палец против курсора: на телефоне строки списка ниже 40px промахиваются */
@media (max-width: 959px) {
  .ws-option { padding: 10px 12px; font-size: var(--fs-md); }
  .ws-trigger { height: 30px; font-size: var(--fs-base); }
}

/* ══════════════════════════════════════════════════════════
   ANIMATED ORB — EMPTY STATE (canvas-based)
   ══════════════════════════════════════════════════════════ */

.empty-state-orb {
  padding: 40px 20px 30px;
}

.orb-container {
  /* 280 — желаемый размер, но не обязательный: масштаб интерфейса (фаза 169)
     делает layout реально узким (375 → 234 CSS-px при 160%), и фиксированный
     квадрат вылезал за край, давая горизонтальный скролл. Канва берёт размер
     у контейнера через getBoundingClientRect, поэтому ей всё равно. */
  width: min(280px, 100%);
  aspect-ratio: 1 / 1;
  height: auto;
  margin: 0 auto 16px;
}
/* Канва орба — инлайновый элемент: под `height: auto` у контейнера он
   добавляет базлайновый зазор, и блок пустой ленты стал выше на 3px даже при
   масштабе 100% (поймано сравнением с чистым HEAD). display:block убирает
   зазор, ничего больше не меняя. */
.orb-container canvas { display: block; }

.orb-text {
  font-size: var(--fs-lg);
  color: var(--hint);
  opacity: 0.7;
  animation: orb-text-pulse 3s ease-in-out infinite;
}
@keyframes orb-text-pulse {
  0%, 100% { opacity: 0.5; }
  50% { opacity: 0.8; }
}

/* ══════════════════════════════════════════════════════════
   SCREEN TRANSITIONS
   ══════════════════════════════════════════════════════════ */

.screen {
  animation: screen-enter 0.25s ease-out;
}
.screen-exit {
  animation: screen-exit 0.2s ease-in forwards;
}

@keyframes screen-enter {
  from { opacity: 0; transform: translateX(20px); }
  to { opacity: 1; transform: translateX(0); }
}
@keyframes screen-exit {
  from { opacity: 1; transform: translateX(0); }
  to { opacity: 0; transform: translateX(-20px); }
}
.screen-back {
  animation: screen-enter-back 0.25s ease-out;
}
@keyframes screen-enter-back {
  from { opacity: 0; transform: translateX(-20px); }
  to { opacity: 1; transform: translateX(0); }
}

/* ══════════════════════════════════════════════════════════
   AGENT CARD ANIMATIONS
   ══════════════════════════════════════════════════════════ */

/* Появление карточки — ТОЛЬКО для реально новых (класс agent-card-fresh его
   ставит JS, сверяясь с прошлым рендером). Лента перерисовывается целиком
   (`list.innerHTML`), поэтому раньше `card-in` висел на всех карточках сразу:
   каждый ре-рендер заново проигрывал translateY(12px)→0 и opacity 0→1 у ВСЕЙ
   ленты — она «спускалась на пару пикселей и мерцала». Фаза 158. */
.agent-card.agent-card-fresh {
  animation: card-in 0.3s ease-out both;
}
.agent-card.agent-card-fresh:nth-child(1) { animation-delay: 0s; }
.agent-card.agent-card-fresh:nth-child(2) { animation-delay: 0.06s; }
.agent-card.agent-card-fresh:nth-child(3) { animation-delay: 0.12s; }
.agent-card.agent-card-fresh:nth-child(4) { animation-delay: 0.18s; }
.agent-card.agent-card-fresh:nth-child(5) { animation-delay: 0.24s; }

@keyframes card-in {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Running agent glow */
.agent-card.agent-running {
  border-color: var(--success-line);
  box-shadow: 0 0 0 1px var(--success-bg);
  animation: agent-glow 3s ease-in-out infinite;
}
/* Свежая работающая карточка: выезд + пульс. Специфичность 0-3-0 выше обоих
   правил выше, поэтому шорткат не съедает ни того, ни другого. */
.agent-card.agent-running.agent-card-fresh {
  animation: card-in 0.3s ease-out both, agent-glow 3s ease-in-out infinite;
}

@keyframes agent-glow {
  0%, 100% { box-shadow: 0 0 0 1px var(--success-bg), 0 0 12px var(--success-bg); }
  50% { box-shadow: 0 0 0 1px var(--success-line), 0 0 20px var(--success-bg); }
}

.agent-status-tag {
  display: inline-flex; align-items: center; gap: 2px;
  margin-top: 0;
  font-size: var(--fs-xs);
  font-weight: 500;
  padding: 1px 6px;
  border-radius: var(--r-xs);
  flex-shrink: 0;
}
.agent-bottom .agent-status-tag { margin-top: 0; }
.status-tag-completed, .status-tag-stopped { background: var(--warning-bg); color: var(--warning); }
.status-tag-failed { background: var(--danger-bg); color: var(--destructive); }
.status-tag-done { background: var(--success-bg); color: var(--success); }
.status-tag-cancelled { background: rgba(113,113,122,0.12); color: var(--hint); }
.status-tag-deferred { background: var(--accent-bg); color: var(--link); }

/* ── Costs dashboard ── */
.costs-cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  margin-bottom: 16px;
}
.cost-card {
  background: var(--secondary-bg);
  border-radius: var(--radius);
  padding: 14px 12px;
  text-align: center;
}
.cost-card-label {
  font-size: var(--fs-sm);
  color: var(--hint);
  margin-bottom: 4px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.cost-card-value {
  font-size: var(--fs-3xl);
  font-weight: 700;
  color: var(--text);
}
.cost-card-accent { color: var(--link); }
.costs-section {
  background: var(--secondary-bg);
  border-radius: var(--radius);
  padding: 14px;
  margin-bottom: 12px;
}
.costs-section-title {
  font-size: var(--fs-base);
  color: var(--hint);
  margin-bottom: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.3px;
}

/* Bar chart */
.costs-chart {
  display: flex;
  align-items: flex-end;
  gap: 2px;
  height: 120px;
  padding-bottom: 20px;
  position: relative;
}
.chart-bar-col {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  height: 100%;
  justify-content: flex-end;
  position: relative;
  cursor: default;
}
.chart-bar {
  width: 100%;
  min-width: 4px;
  max-width: 14px;
  background: var(--link);
  border-radius: 2px 2px 0 0;
  opacity: 0.7;
  transition: opacity 0.15s;
}
.chart-bar-col:hover .chart-bar { opacity: 1; }
.chart-bar-col.chart-today .chart-bar { opacity: 1; background: var(--success); }
.chart-day {
  font-size: var(--fs-xs);
  color: var(--hint);
  position: absolute;
  bottom: -16px;
}
.chart-bar-col:nth-child(5n) .chart-day,
.chart-bar-col.chart-today .chart-day,
.chart-bar-col:first-child .chart-day { display: block; }
.chart-day { display: none; }

/* Breakdown rows */
.breakdown-row {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
}
.breakdown-row:last-child { margin-bottom: 0; }
.breakdown-label {
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--text);
  min-width: 70px;
  flex-shrink: 0;
}
/* Каналы входа (фаза 171): подпись фиксированной ширины.
   У .breakdown-label только min-width, поэтому длинная подпись отъедает трек —
   и одинаковые доли рисуются полосками разной длины (на 375px замер дал 37px
   против 53px при равных 33%). Там, где строки сравнивают глазом, треки обязаны
   начинаться в одной колонке. */
.breakdown-row--fixed .breakdown-label {
  width: 104px;
  min-width: 104px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.breakdown-note {
  font-size: var(--fs-sm);
  line-height: 1.4;
  margin-top: 8px;
}
/* На узком экране фиксированные 104px съедали бы 28% ширины, и доля в 4%
   рисовалась бы полоской в 5px (на 320px — 2.8px, то есть исчезала бы). */
@media (max-width: 400px) {
  .breakdown-row--fixed .breakdown-label { width: 84px; min-width: 84px; }
}
.breakdown-bar-track {
  flex: 1;
  height: 6px;
  background: var(--ov-06);
  border-radius: 3px;
  overflow: hidden;
}
.breakdown-bar-fill {
  height: 100%;
  background: var(--link);
  border-radius: 3px;
  min-width: 2px;
}
.breakdown-bar-fill.breakdown-model { background: var(--warning); }
.breakdown-bar-fill.breakdown-tag { background: #14b8a6; }
.breakdown-value {
  font-size: var(--fs-base);
  color: var(--text);
  font-weight: 600;
  min-width: 65px;
  text-align: right;
  flex-shrink: 0;
  white-space: nowrap;
}
.breakdown-runs {
  font-weight: 400;
  color: var(--hint);
  font-size: var(--fs-sm);
}
.stats-muted { color: var(--hint); opacity: 0.6; }

/* Идентификатор человека: @логин основной, имя профиля рядом серым. */
.user-ident { display: inline; min-width: 0; }
.user-ident strong { font-weight: 600; }
.user-realname {
  color: var(--hint);
  font-weight: 400;
  font-size: 0.92em;
  margin-left: 5px;
  word-break: break-word;
}

/* Автор чужой реплики в чате (фаза 159). Рисуется только у сообщений других
   людей, поэтому в одноавторном чате разметка не меняется вообще. */
.msg-author {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 4px;
  font-size: var(--fs-base);
  line-height: 1.2;
  opacity: 0.85;
  min-width: 0;
}
.msg-author .agent-avatar {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  font-size: var(--fs-xs);
}
/* Длинный логин не должен распирать пузырь и рвать раскладку на 375px. */
.msg-author .user-ident {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}


/* Quick-actions slide-up animation */
.quick-actions[data-animate] {
  animation: qaSlideUp 200ms ease-out;
}
@keyframes qaSlideUp {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}

/* 3-dot menu separator */
.chat-menu-dropdown .menu-sep {
  padding: 6px 16px 4px;
  font-size: var(--fs-xs);
  text-transform: uppercase;
  letter-spacing: 1px;
  color: var(--hint);
  opacity: 0.5;
  cursor: default;
  border-top: 1px solid var(--ov-06);
  margin-top: 2px;
}
/* ── Message action icons (ChatGPT-style) ── */
/* «Копировать» — только у итоговой реплики хода (turn-tail, _markTurnHeads):
 * под каждой промежуточной строкой кнопка была мусором. */
.chat-messages > .msg-text:not(.turn-tail) > .msg-actions { display: none; }
.msg-actions {
  display: flex;
  gap: 4px;
  padding: 4px 0 2px;
  margin-top: 4px;
}
.msg-action-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border: none;
  border-radius: var(--r-sm);
  background: transparent;
  color: var(--hint);
  cursor: pointer;
  transition: color 0.15s, background 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.msg-action-btn:active {
  background: var(--ov-08);
}
.msg-action-btn.copied {
  color: var(--success);
}
@media (hover: hover) {
  .msg-action-btn:hover {
    color: var(--text);
    background: var(--ov-06);
  }
}

/* History item stagger — только новым строкам: экран истории тоже
   перерисовывается целиком, и на всех строках анимация давала тот же «выезд»
   при каждом обновлении (фаза 158). */
.history-item.history-item-fresh {
  animation: card-in 0.2s ease-out both;
}

/* ══════════════════════════════════════════════════════════
   FAB GLOW
   ══════════════════════════════════════════════════════════ */

.fab {
  animation: fab-glow 3s ease-in-out infinite;
  transition: transform 0.2s, box-shadow 0.2s;
}

@keyframes fab-glow {
  0%, 100% { box-shadow: 0 4px 12px var(--sh-mid), 0 0 0 0 rgba(91,110,174,0); }
  50% { box-shadow: 0 4px 12px var(--sh-mid), 0 0 20px 4px var(--accent-line); }
}

.fab:hover {
  transform: scale(1.08);
}
.fab:active { transform: scale(0.92); }

.fab .fab-icon {
  transition: transform 0.2s;
}
.fab:hover .fab-icon {
  transform: rotate(90deg);
}

/* ══════════════════════════════════════════════════════════
   MESSAGE SEND FEEDBACK
   ══════════════════════════════════════════════════════════ */

.btn-send.sent {
  background: var(--success);
  animation: send-pop 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.btn-send.sent svg path {
  stroke-dasharray: 24;
  stroke-dashoffset: 24;
  animation: check-draw 0.35s ease-out 0.1s forwards;
}
@keyframes send-pop {
  0% { transform: scale(0.8); opacity: 0.6; }
  50% { transform: scale(1.15); }
  100% { transform: scale(1); opacity: 1; }
}
@keyframes check-draw {
  to { stroke-dashoffset: 0; }
}

.msg-user {
  animation: msg-slide-up 0.35s cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes msg-slide-up {
  from { opacity: 0; transform: translateY(16px) scale(0.97); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

/* Status pill bounce */
.msg-status {
  animation: status-bounce 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes status-bounce {
  0% { opacity: 0; transform: translateY(8px) scale(0.85); }
  60% { opacity: 1; transform: translateY(-2px) scale(1.03); }
  100% { opacity: 1; transform: translateY(0) scale(1); }
}

/* ══════════════════════════════════════════════════════════
   AGENT WORKING — CRISP NEON PERIMETER BORDER (5-6px)
   ══════════════════════════════════════════════════════════ */

.agent-glow-border {
  position: fixed;
  inset: 0;
  pointer-events: none;
  /* Выше #mobile-tab-bar и .conn-bar (оба 100), иначе нижнюю линию рамки
     съедает тулбар — а её там как раз и ждут. Ниже дропдаунов (1100),
     тостов (999) и модалок. Кликам не мешает: pointer-events: none. */
  z-index: 150;
  opacity: 0;
  transition: opacity 0.6s ease, background 0.6s ease;
  overflow: hidden;
  border-radius: var(--screen-radius-tl, 0px) var(--screen-radius-tr, 0px) var(--screen-radius-br, 0px) var(--screen-radius-bl, 0px);
}
/* Rotating conic gradient masked to a 5px border — JS drives --glow-angle */
.agent-glow-border::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: conic-gradient(
    from var(--glow-angle, 0deg),
    var(--button),
    var(--accent),
    #8a63e8,
    #e0896a,
    var(--accent),
    var(--button)
  );
  mask:
    linear-gradient(#fff 0 0) content-box,
    linear-gradient(#fff 0 0);
  mask-composite: exclude;
  -webkit-mask:
    linear-gradient(#fff 0 0) content-box,
    linear-gradient(#fff 0 0);
  -webkit-mask-composite: xor;
  padding: 5px;
}
/* Subtle inner glow for depth */
.agent-glow-border::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  box-shadow:
    inset 0 0 20px var(--accent-bg),
    inset 0 0 40px var(--violet-bg);
  opacity: 0;
  transition: opacity 0.6s;
}

/* SVG-маска контура видимой области (со скруглениями и вырезом, если он в
   кадре) — заменяет маску на padding. Строится в app.js по фактическому
   размеру элемента, поэтому 100% 100% ничего не растягивает. */
.agent-glow-border.has-shape-mask::before {
  mask: var(--glow-border-mask) center / 100% 100% no-repeat;
  -webkit-mask: var(--glow-border-mask) center / 100% 100% no-repeat;
  padding: 0;
}
.agent-glow-border.has-shape-mask::after {
  mask: var(--glow-border-mask) center / 100% 100% no-repeat;
  -webkit-mask: var(--glow-border-mask) center / 100% 100% no-repeat;
}

.agent-glow-border.active {
  opacity: 1;
  animation: glow-dim 30s ease forwards;
}
/* 182.3: на время живого набора рамка гаснет — см. _liveGlowHold в app.js.
   Именно opacity, а не пауза анимаций: и неподвижный слой с маской на весь
   экран удорожает каждую перерисовку ленты. */
.agent-glow-border.live-typing,
.agent-glow-border.active.live-typing {
  opacity: 0;
}
/* TEMPORARILY DISABLED: screen dimming behind glow border
@keyframes glow-dim {
  0%      { background: rgba(0, 0, 0, 0); }
  0.1%   { background: rgba(0, 0, 0, 0.1); }
  33%     { background: rgba(0, 0, 0, 0.1); }
  34%     { background: rgba(0, 0, 0, 0.3); }
  99%     { background: rgba(0, 0, 0, 0.3); }
  100%    { background: rgba(0, 0, 0, 0.7); }
} */
@keyframes glow-dim {
  0%   { background: transparent; }
  100% { background: transparent; }
}
.agent-glow-border.active::before {
  animation: glow-breathe 2.5s ease-in-out infinite;
}
.agent-glow-border.active::after {
  opacity: 1;
  animation: glow-inner-breathe 3s ease-in-out infinite;
}

@keyframes glow-breathe {
  0%, 100% { opacity: 0.6; filter: brightness(0.9); }
  50%      { opacity: 1;   filter: brightness(1.2); }
}
@keyframes glow-inner-breathe {
  0%, 100% { box-shadow: inset 0 0 15px var(--accent-bg), inset 0 0 30px var(--violet-bg); }
  50%      { box-shadow: inset 0 0 30px var(--accent-bg-strong), inset 0 0 60px var(--violet-bg); }
}

/* Вспышка по исходу: зелёная — завершился, красная — упал, янтарная — остановлен */
.agent-glow-border.flash-done    { --flash-color: #4caf50; --flash-rgb: 76,175,80; }
.agent-glow-border.flash-failed  { --flash-color: #ef4444; --flash-rgb: 239,68,68; }
.agent-glow-border.flash-stopped { --flash-color: #f59e0b; --flash-rgb: 245,158,11; }

.agent-glow-border.flash-done,
.agent-glow-border.flash-failed,
.agent-glow-border.flash-stopped {
  opacity: 1;
  animation: none;
}
.agent-glow-border.flash-done::before,
.agent-glow-border.flash-failed::before,
.agent-glow-border.flash-stopped::before {
  background: var(--flash-color);
  filter: none;
  opacity: 1;
  animation: flash-done-fade 1.2s ease-out forwards;
}
.agent-glow-border.flash-done::after,
.agent-glow-border.flash-failed::after,
.agent-glow-border.flash-stopped::after {
  opacity: 1;
  box-shadow:
    inset 0 0 30px rgba(var(--flash-rgb), 0.3),
    inset 0 0 60px rgba(var(--flash-rgb), 0.1);
  animation: flash-done-fade 1.2s ease-out forwards;
}
@keyframes flash-done-fade {
  0%   { opacity: 1; }
  40%  { opacity: 0.7; }
  100% { opacity: 0; }
}

/* Question flash — accent/amber pulse */
.agent-glow-border.flash-question {
  opacity: 1;
  animation: none;
}
.agent-glow-border.flash-question::before {
  background: linear-gradient(135deg, var(--accent), var(--warning));
  filter: none;
  opacity: 1;
  animation: flash-question-pulse 2s ease-in-out 3;
}
.agent-glow-border.flash-question::after {
  opacity: 1;
  box-shadow:
    inset 0 0 30px var(--violet-bg),
    inset 0 0 60px var(--warning-bg);
  animation: flash-question-pulse 2s ease-in-out 3;
}
@keyframes flash-question-pulse {
  0%, 100% { opacity: 0.4; }
  50%      { opacity: 1; }
}

/* ══════════════════════════════════════════════════════════
   REDUCED MOTION
   ══════════════════════════════════════════════════════════ */

/* ══════════════════════════════════════════════════════════
   MOBILE BOTTOM TAB BAR
   ══════════════════════════════════════════════════════════ */

#mobile-tab-bar {
  display: flex;
  position: fixed;
  bottom: 0; left: 0; right: 0;
  background: var(--secondary-bg);
  border-top: 1px solid var(--ov-10);
  padding: 6px 0 calc(6px + env(safe-area-inset-bottom, 0px));
  z-index: 100;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
}
#mobile-tab-bar .tab-btn {
  flex: 1;
  display: flex; flex-direction: column; align-items: center;
  gap: 2px;
  font-size: var(--fs-xs);
  color: var(--hint);
  background: none; border: none;
  cursor: pointer;
  padding: 2px 0;
  -webkit-tap-highlight-color: transparent;
  transition: color 0.15s;
}
#mobile-tab-bar .tab-btn.active { color: var(--link); }
#mobile-tab-bar .tab-btn svg { width: 22px; height: 22px; }
#mobile-tab-bar .tab-btn span { font-weight: 500; }

/* ── Mobile: chat view compact spacing ── */
@media (max-width: 959px) {
  /* Reduce horizontal padding on all messages */
  .chat-messages .msg {
    padding: 4px 12px;
  }

  /* User bubble — less left margin = wider bubble */
  .chat-messages .msg-user {
    padding: 8px 14px;
    margin: 8px 12px 8px 40px;
  }

  /* Agent text — tighter padding */
  .chat-messages .msg-text {
    padding: 8px 12px;
  }

  /* Tool use/result — reduce indentation */
  .chat-messages .msg-tool_use {
    padding: 6px 12px;
    margin-left: 12px;
  }
  .chat-messages .msg-tool_result {
    padding: 4px 12px 8px;
    margin-left: 12px;
  }

  /* Thinking — match tool indentation */
  .chat-messages .msg-thinking {
    padding: 4px 12px;
    margin-left: 12px;
  }

  /* Code blocks — smaller font, tighter padding */
  .chat-messages .msg code {
    font-size: var(--fs-sm);
  }
  .chat-messages .msg pre {
    font-size: var(--fs-sm);
    padding: 8px 10px;
  }

  /* Quick actions — tighter padding */
  .quick-actions {
    padding: 8px 12px;
  }
}

/* ═══════════════ Главная: hero с композером (фаза 139) ═══════════════ */

.home-hero {
  display: flex;
  flex-direction: column;
  justify-content: safe center;   /* safe: при нехватке места не режет верх */
  align-items: center;
  padding: 24px 16px;
  box-sizing: border-box;
}
.home-col {
  width: 100%;
  max-width: var(--composer-max);
  display: flex;
  flex-direction: column;
}
.home-greet {
  margin: 0 0 36px;
  font-size: 24px;
  font-weight: 400;            /* обычное начертание: не заголовок, а обращение */
  text-align: center;
  color: var(--text);
}
.composer-resume {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  margin-bottom: 10px;
  padding: 12px 14px;
  background: var(--secondary-bg);
  border: 1px solid var(--ov-08);
  border-radius: var(--r-2xl);
  color: var(--text);
  font-size: var(--fs-lg);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: border-color 0.15s;
}
.composer-resume:hover { border-color: var(--ov-16); }

.home-slot { margin-top: 28px; }
.home-suggest {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.home-running { display: flex; flex-direction: column; gap: 8px; }
.home-foot {
  margin: 14px 0 0;
  font-size: var(--fs-base);
  color: var(--hint);
  text-align: center;
}

/* Композер на главной: отступ под таб-бар уже держит #screen-dashboard, а узел
   приезжает со своим таким же (мобильный override .chat-input-bar). Без этого
   правила они складываются и карточка повисает в 60-94px над таб-баром. */
body[data-screen="dashboard"] #chat-input-bar {
  padding: 0;
  background: transparent;
}

/* Телефон: hero пока живёт под старой лентой (она уедет на 139.5), поэтому
   нижний отступ под таб-бар нужен ему самому - иначе карточка композера
   налезает на таб-бар на 8px. */
@media (max-width: 959px) {
  .home-hero {
    padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px) + 8px);
  }
}

/* Чипы параметров запуска в тулбаре композера (фаза 139). */
.cmp-chip-wrap { position: relative; display: inline-flex; }
.cmp-chip {
  display: inline-flex; align-items: center; gap: 6px;
  height: 30px; padding: 0 10px;
  background: transparent; border: none; border-radius: var(--r-md);
  color: var(--hint); font-size: var(--fs-md); font-family: inherit; cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.cmp-chip:hover { background: var(--ov-04); color: var(--text); }
.cmp-chip svg { width: 15px; height: 15px; flex-shrink: 0; }
.cmp-chip-eff { color: var(--hint); white-space: nowrap; }
.cmp-chip-label { white-space: nowrap; max-width: 160px; overflow: hidden; text-overflow: ellipsis; }
#cmp-project-wrap .cmp-chip-label { color: var(--text); font-weight: 500; }
/* Проект не выбран — это блокирует запуск, поэтому чип не молчит. */
#cmp-project-wrap.is-empty .cmp-chip-label { color: var(--warning, #d08c3f); font-weight: 600; }
/* Отход от дефолта стенда видно, не открывая поповер. */
#cmp-model-wrap.is-custom .cmp-chip-label { color: var(--text); }

.cmp-popover {
  position: absolute; bottom: calc(100% + 8px); left: 0; z-index: 60;
  min-width: 260px; max-width: 320px; max-height: min(calc(var(--vh) * 52), 420px);
  overflow-y: auto; padding: 6px;
  background: var(--secondary-bg); border: 1px solid var(--ov-08);
  border-radius: var(--r-2xl); box-shadow: 0 12px 32px var(--sh-soft);
}
/* На главной поле ввода по центру экрана: вверх поповеру не хватает места,
   и заголовок «Модель» с верхними строками уходил за край окна. */
@media (min-width: 960px) {
  #home-hero .cmp-popover { bottom: auto; top: calc(100% + 8px); }
}
.cmp-filter {
  width: 100%; box-sizing: border-box; margin-bottom: 6px;
  padding: 8px 10px; font-size: var(--fs-lg); font-family: inherit;
  background: var(--bg); color: var(--text);
  border: 1px solid var(--ov-08); border-radius: var(--r-lg); outline: none;
}
.cmp-pop-head { padding: 8px 10px 4px; font-size: var(--fs-sm); text-transform: uppercase; color: var(--hint); letter-spacing: 0.04em; }
.cmp-list { display: flex; flex-direction: column; gap: 2px; }
.cmp-row {
  display: flex; flex-direction: column; gap: 2px; align-items: flex-start;
  width: 100%; padding: 8px 10px; text-align: left;
  background: transparent; border: none; border-radius: var(--r-lg);
  color: var(--text); font-size: var(--fs-lg); font-family: inherit; cursor: pointer;
}
.cmp-row:hover { background: var(--ov-04); }
/* Выбранное — фирменным цветом: --ov-08 в светлой теме давал ~1,15:1 к фону,
   и выбранную модель было не отличить (WCAG 1.4.11, UX-аудит, круг 2). */
.cmp-row.active { background: var(--accent-bg); color: var(--link); font-weight: 600; }
.cmp-row-title { font-weight: 500; }
.cmp-row-desc { font-size: var(--fs-base); color: var(--hint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.cmp-empty { padding: 12px 10px; color: var(--hint); font-size: var(--fs-md); }
.cmp-create {
  width: 100%; margin-top: 6px; padding: 9px 10px;
  background: transparent; border: 1px dashed var(--ov-16); border-radius: var(--r-lg);
  color: var(--hint); font-size: var(--fs-md); font-family: inherit; cursor: pointer;
}
.cmp-create:hover { color: var(--text); border-color: var(--ov-24, var(--ov-16)); }
.cmp-effort-row { display: flex; gap: 4px; padding: 2px 4px 4px; }
.cmp-effort {
  flex: 1; padding: 7px 4px; font-size: var(--fs-base); font-family: inherit;
  background: transparent; border: 1px solid var(--ov-08); border-radius: var(--r-md);
  color: var(--hint); cursor: pointer;
}
.cmp-effort:hover { color: var(--text); }
.cmp-effort.active { background: var(--accent-bg); color: var(--link); border-color: color-mix(in srgb, var(--link) 50%, transparent); font-weight: 600; }
.cmp-pop-note { text-transform: none; letter-spacing: 0; font-weight: 400; color: var(--hint); }

/* Телефон: в тулбаре 375px четыре подписи не помещаются и налезают друг на
   друга («Playground», «Авто», «Haiku · Medium», «План» в одной каше).
   Режим оставляем иконкой, остальное ужимаем. */
/* Слой затемнения под листами композера. Виден только на телефоне: на
   десктопе меню остаются обычными поповерами у кнопки. */
.sheet-scrim {
  position: fixed;
  inset: 0;
  z-index: 110;
  background: rgba(0, 0, 0, 0.45);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  animation: scrimIn 0.16s ease-out;
}
.sheet-scrim[hidden] { display: none; }
@keyframes scrimIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes sheetUp { from { transform: translateY(12px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }

@media (min-width: 960px) {
  /* Десктоп остаётся как был: затемнение не показываем. */
  .sheet-scrim { display: none !important; }
}

@media (max-width: 959px) {
  /* Телефон: меню композера открывались ВВЕРХ от кнопки, а кнопка стоит у низа
     экрана - список уезжал за верхний край, часть строк было физически не
     нажать (жалобы 30.08 на проект, модель и «+»). Единый лист снизу: удобно
     большому пальцу, ничего не уезжает, задний фон затемнён и размыт. */
  .cmp-popover,
  #chat-input-bar .modes-popover,
  #plus-dropdown.open,
  #chat-cmd-palette {
    position: fixed;
    left: 0;
    right: 0;
    top: auto;
    bottom: 0;
    width: auto;
    min-width: 0;
    max-width: none;
    max-height: calc(var(--vh) * 70);
    overflow-y: auto;
    z-index: 120;
    border-radius: 18px 18px 0 0;
    padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
    box-shadow: 0 -12px 40px rgba(0, 0, 0, 0.35);
    animation: sheetUp 0.18s ease-out;
    -webkit-overflow-scrolling: touch;
  }
  /* Пункты листа крупнее: попасть пальцем, а не курсором. */
  .cmp-popover .cmp-row,
  .cmp-popover .cmp-create,
  #chat-cmd-palette .cmd-row,
  #plus-dropdown.open .plus-item { min-height: 48px; }
  /* Палитра «/» шире 320px не нужна, но на телефоне она лист во всю ширину. */
  #chat-cmd-palette { width: auto; }
  .cmp-effort { min-height: 44px; }
  /* Строка выросла до 48px, а текст оставался прижат к верху. */
  .cmp-popover .cmp-row { justify-content: center; }
  /* Пять кнопок в 366px: «Очень глубоко» ломалось на две строки — делим 3+2. */
  .cmp-effort-row { flex-wrap: wrap; }
  .cmp-effort { flex: 1 1 calc(33.333% - 4px); white-space: nowrap; }
  .cmp-chip-label { max-width: 56px; }
  .cmp-chip { padding: 0 5px; gap: 3px; }
  /* Иконки в тулбаре главной: 32px не влезают семь штук в 375px - «/» наезжала
     на кнопку режима. 28px дают запас и на 360px. */
  body[data-screen="dashboard"] .ct-icon-btn,
  body[data-screen="dashboard"] .btn-voice { width: 28px; height: 28px; }
  body[data-screen="dashboard"] .ct-left,
  body[data-screen="dashboard"] .ct-right { gap: 2px; }
  /* Усилие на телефоне не показываем: с ним тулбар переполнялся на 17px и
     элементы налезали друг на друга. Значение видно в поповере. */
  .cmp-chip-eff { display: none; }
  /* Обе половины тулбара обязаны уметь сжиматься, иначе flex их не разведёт. */
  body[data-screen="dashboard"] .composer-toolbar { gap: 4px; }
  body[data-screen="dashboard"] .ct-left,
  body[data-screen="dashboard"] .ct-right { min-width: 0; flex-shrink: 1; }
  body[data-screen="dashboard"] .ct-left { overflow: hidden; }
  body[data-screen="dashboard"] .mode-btn-name { display: none; }
  body[data-screen="dashboard"] .voice-lang-select { display: none !important; }
}

/* ── Очень узкий layout (фаза 169) ───────────────────────────────────────
   Масштаб интерфейса впервые делает layout уже 340px: на 375-м телефоне при
   130% это 288 CSS-px, при 160% — 234. Устройств такой ширины не бывает,
   поэтому места, свёрстанные «всё в одну строку», раньше с ней не
   сталкивались — при зуме они вылезали за край и давали горизонтальный
   скролл ВСЕЙ страницы (замер: главная при 160% скроллилась до 328px).
   Здесь ровно то, что упиралось: тулбар композера и метастрока карточки. */
@media (max-width: 340px) {
  /* Тулбар композера переносится на две строки, а не обрезается: восемь
     элементов (чип проекта, чип модели, «+», улучшатель, команды, режим,
     голос, отправка) в 234px не влезают ни при каких размерах, а спрятать
     их через overflow значило бы сделать кнопки недоступными — они остаются
     в потоке, просто не видны. Перенос сохраняет всё. */
  .composer-toolbar { flex-wrap: wrap; gap: 3px; row-gap: 4px; }
  .ct-left,
  .ct-right { min-width: 0; flex-shrink: 1; flex-wrap: wrap; }
  .ct-icon-btn { width: 28px; height: 28px; }
  .btn-send, .btn-voice, .btn-stop-agent, .btn-queue { width: 32px; height: 32px; }
  .btn-send svg, .btn-stop-agent svg, .btn-queue svg { width: 18px; height: 18px; }
  /* Микрофон на экране «Задача» — единственная кнопка шире стандартных 36px. */
  #btn-nt-mic { width: 36px; height: 36px; }
  /* Таб-бар: при 130% подписи «Проекты|Рутины» сходятся почти вплотную, а
     «Настройки» упираются в кромку экрана. */
  #mobile-tab-bar { padding-left: 2px; padding-right: 2px; }
  .tab-btn span { font-size: var(--fs-xs); letter-spacing: -0.01em; }
  .tab-btn svg { width: 19px; height: 19px; }

  /* Выбор проекта на экране «Задача»: в две колонки названия вырождались в
     «Алм…», «Ауд…», «Дир…» — проект становилось не выбрать. */
  .nt-project-grid { grid-template-columns: 1fr; }

  /* Поле задачи не должно сжиматься до строчки в 30px из-за иконок рядом. */
  .nt-input-wrapper { flex-wrap: wrap; }
  .nt-input-wrapper textarea,
  .nt-input-wrapper .nt-input { flex: 1 1 100%; min-width: 0; }

  /* Селект языка распознавания (58px) — самый крупный элемент строки ввода, и
     без него «скрепка», «вставить», улучшатель и микрофон складываются в
     доступные 210px. В композере чата он на телефоне скрыт тем же приёмом;
     язык распознавания при этом определяется автоматически. */
  #voice-lang-nt { display: none !important; }

  /* Метастрока карточки уезжает на свою строку, когда рядом со статусом ей
     тесно. Сама обрезка многоточием живёт в базовом правиле .agent-meta —
     здесь её держать нельзя: при масштабе интерфейса медиазапрос не
     срабатывает, а защита нужна (см. комментарий у .agent-card .agent-meta). */
  .agent-card .agent-bottom { flex-wrap: wrap; }
  /* Бейдж усилия уходит: в строке карточки семь элементов (аватар, номер,
     точка непрочитанного, проект, модель, усилие, «⋯») просят 240px при
     доступных 234, а усилие из них — самое второстепенное. Оно остаётся
     видно внутри карточки, когда её открыли. Тот же приём уже применён к
     чипу усилия в тулбаре композера на телефоне. */
  .agent-card .agent-effort { display: none; }

  /* Кнопки карточки рутины («Запуски», «Запустить сейчас», «Удалить») стоят в
     одну строку и просят ~300px — на 234px переносим их на вторую строку. */
  .sched-actions { flex-wrap: wrap; gap: 8px 10px; }

  /* Шапка главной: заголовок с версией, чип вехи и две кнопки просят ~360px.
     Заголовок обрезается многоточием, чип вехи сжимается, кнопки держат
     размер, версия уходит совсем. */
  .header { flex-wrap: nowrap; }
  .header h1 { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .header .ws-mount-header { min-width: 0; }
  .header .btn-icon { flex-shrink: 0; }
  .header .version-tag { display: none; }

  /* Шапка формы: у «Проектов» это «←», заголовок, чип вехи, «Команды» и
     «+ Новый проект» — на узком layout переносим вторую половину на свою
     строку. Тесно ей и на 375px (кнопка вылезает и без масштаба — дефект
     старый, базовое поведение здесь не меняем), но масштаб не должен его
     усугублять. */
  .form-header { flex-wrap: wrap; row-gap: 8px; }
  .form-header h2 { flex: 1 1 auto; min-width: 0; }
}

/* ── Совсем узкий layout (масштаб 150-160% на 375px) ─────────────────────
   Шесть подписей таб-бара в 234 CSS-px стоят вплотную и режутся кромкой —
   иконок здесь достаточно, название раздела остаётся в aria-label. */
@media (max-width: 264px) {
  .tab-btn span:not(.tab-badge) { display: none; }
  .tab-btn svg { width: 22px; height: 22px; }
}

/* Элементы, уместные только на главной или только в чате. */
.home-only { display: none; }
body[data-screen="dashboard"] .home-only { display: inline-flex; }
body[data-screen="dashboard"] #btn-stop-inline { display: none !important; }

/* Mobile: offset content above tab bar */
@media (max-width: 959px) {
  /* Chat input bar — sits above tab bar */
  .chat-input-bar {
    padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
  }
  /* Chat action buttons (Выполнено, Отложить, etc.) */
  .chat-action-bar {
    padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
  }
  /* Scrollable screen content — add bottom padding so last items aren't hidden */
  #screen-projects,
  #screen-settings,
  #screen-files,
  #screen-admin-access {
    padding-bottom: calc(56px + env(safe-area-inset-bottom, 0px));
  }
  /* Главная вынута из общего селектора: композер стоит внизу и отступ ей нужен
     по реальной высоте таб-бара, а не по 56px, которые тут стояли исторически. */
  #screen-dashboard {
    padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
  }
  /* New task: панель ввода стоит НАД таб-баром. Раньше поднимался только
     отступ, а сама панель (z 200) накрывала таб-бар (z 100): внизу пустая
     полоса, уйти с экрана можно было лишь стрелкой «←». */
  .nt-input-bar {
    bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px));
    padding-bottom: 12px;
  }
  .nt-body {
    padding-bottom: calc(140px + env(safe-area-inset-bottom, 0px));
  }
  /* Toast — above tab bar */
  .toast-container {
    bottom: calc(80px + env(safe-area-inset-bottom, 0px));
  }
}

/* ══════════════════════════════════════════════════════════
   DESKTOP 3-PANEL LAYOUT (Beacon-style)
   ══════════════════════════════════════════════════════════ */

/* ── Mobile: hide desktop-only elements ── */
@media (max-width: 959px) {
  #desktop-sidebar { display: none !important; }
  #desktop-list-panel { display: none !important; }
  #desktop-layout { display: block; }
}

/* ── Desktop layout ── */
@media (min-width: 960px) {

  /* 3-column grid */
  #desktop-layout {
    display: grid;
    grid-template-columns: 56px 300px 1fr;
    height: calc(var(--vh) * 100);
    overflow: hidden;
  }

  /* ── Sidebar ── */
  #desktop-sidebar {
    display: flex;
    flex-direction: column;
    align-items: center;
    /* Рельс в тон карточек, а не «фон на 15% темнее»: в светлой теме это был
       тяжёлый серый #d9d9d9 рядом с белой панелью. */
    background: var(--secondary-bg);
    border-right: 1px solid var(--border);
    padding: 12px 0;
    overflow: hidden;
    /* min-height: 0 — иначе grid-элемент растёт по содержимому и выходит за
       строку грида (замер при 160%: сетка 562px, рейка 797px), а кнопки
       уезжают под кромку экрана вместе с «Настройками». С нулём рейка
       принимает высоту строки, и её кнопки начинают отдавать высоту. */
    min-height: 0;
  }

  .sidebar-logo {
    margin-bottom: 20px;
    padding: 4px;
  }

  .sidebar-nav {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    flex: 1;
    /* min-height: 0 — без него колонка не отдаёт своим кнопкам разрешение
       сжиматься, и при масштабе интерфейса (фаза 169) нижние просто уезжали
       под кромку: на экране 900px при 160% полезной высоты остаётся 562
       CSS-px, а четырнадцать кнопок по 40px в них не встают. Скролл тут не
       годится — ниже в файле тултипы требуют overflow:visible. */
    min-height: 0;
  }

  .sidebar-btn {
    width: 40px;
    height: 40px;
    /* Кнопка отдаёт высоту, когда рейка не вмещает весь список (масштаб
       интерфейса): 28px — предел, после которого иконка становится нечитаемой.
       Там, где места хватает, сжатия не происходит вовсе. */
    flex: 0 1 auto;
    min-height: 28px;
    border-radius: var(--r-lg);
    border: none;
    background: transparent;
    color: var(--hint);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.15s;
  }
  .sidebar-btn:hover {
    color: var(--text);
    background: var(--ov-06);
  }
  .sidebar-btn.active {
    color: var(--link);
    background: var(--accent-bg);
  }

  .sidebar-bottom {
    margin-top: auto;
    padding: 8px 0 12px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
  }
  .sidebar-avatar-wrap { position: relative; display: flex; }
  .sidebar-btn.sidebar-learn { color: var(--hint); }
  .sidebar-btn.sidebar-learn:hover, .sidebar-btn.sidebar-learn.active { color: var(--link); }
  /* Подсказки при наведении: своя плашка справа от иконки. Нативный title
     появляется с секундной задержкой и не у всех кнопок — люди не понимали,
     что за иконки (владелец, 06.09). Плашки не обрезаем: сайдбар без overflow. */
  #desktop-sidebar, #desktop-sidebar .sidebar-nav, #desktop-sidebar .sidebar-bottom { overflow: visible; }
  #desktop-sidebar [data-tip]::after {
    content: attr(data-tip); position: absolute; left: calc(100% + 12px); top: 50%;
    transform: translate(-6px, -50%); background: var(--text); color: var(--bg);
    font-size: var(--fs-md); font-weight: 500; line-height: 1; padding: 8px 11px; border-radius: var(--r-md);
    white-space: nowrap; opacity: 0; pointer-events: none; z-index: 1300;
    box-shadow: 0 6px 20px rgba(0,0,0,.25); transition: opacity .12s ease, transform .12s ease; }
  #desktop-sidebar [data-tip]::before {
    content: ''; position: absolute; left: calc(100% + 6px); top: 50%;
    transform: translate(-6px, -50%); border: 6px solid transparent; border-right-color: var(--text);
    opacity: 0; pointer-events: none; z-index: 1300; transition: opacity .12s ease, transform .12s ease; }
  #desktop-sidebar [data-tip]:hover::after, #desktop-sidebar [data-tip]:focus-visible::after,
  #desktop-sidebar [data-tip]:hover::before, #desktop-sidebar [data-tip]:focus-visible::before {
    opacity: 1; transform: translate(0, -50%); transition-delay: .08s; }
  .sidebar-author {
    display: block;
  }
  .sidebar-avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    object-fit: cover;
    opacity: 0.7;
    transition: opacity 0.2s;
    cursor: default;
  }
  .sidebar-avatar:hover { opacity: 1; }
  .sidebar-avatar-initials {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: var(--accent-bg-strong);
    color: var(--link);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--fs-md);
    font-weight: 600;
    opacity: 0.7;
    transition: opacity 0.2s;
  }
  .sidebar-avatar-initials:hover { opacity: 1; }

  /* Workspace selector (базовые стили — вне этого медиа, см. «Workspace
     selector (shared)»: на телефоне селектор живёт в шапках экранов) */
  .sidebar-workspaces {
    padding: 6px 8px;
    position: relative;
    display: flex;
    justify-content: center;
  }
  /* В сайдбаре ширина фиксированная: колонка 56px, чип обязан быть предсказуем */
  .sidebar-workspaces .ws-trigger {
    width: 64px;
    padding: 0;
  }
  /* Дубль селектора в шапке был бы лишним — на десктопе он в сайдбаре */
  .ws-mount-header { display: none !important; }

  /* ── List Panel ── */
  #desktop-list-panel {
    display: flex;
    flex-direction: column;
    background: var(--bg);
    border-right: 1px solid var(--border);
    overflow: hidden;
  }

  .dl-header-title {
    font-size: var(--fs-input);
    font-weight: 600;
    flex: 1;
  }
  .dl-badge {
    background: var(--success);
    color: var(--on-accent);
    font-size: var(--fs-sm);
    font-weight: 600;
    min-width: 20px;
    height: 20px;
    padding: 0 6px;
    border-radius: var(--r-lg);
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  .dl-tabs {
    display: flex;
    border-bottom: 1px solid var(--border);
    padding: 0 16px;
    flex-shrink: 0;
  }
  .dl-tab {
    flex: 1;
    padding: 8px 0;
    text-align: center;
    font-size: var(--fs-md);
    font-weight: 500;
    color: var(--hint);
    cursor: pointer;
    border: none;
    background: none;
    border-bottom: 2px solid transparent;
    transition: all 0.15s;
  }
  .dl-tab:hover { color: var(--text); }
  .dl-tab.active {
    color: var(--link);
    border-bottom-color: var(--link);
  }

  .dl-projects {
    display: flex;
    gap: 6px;
    padding: 8px 16px;
    overflow-x: auto;
    scrollbar-width: none;
    -webkit-mask-image: linear-gradient(to right, #000 85%, transparent);
    mask-image: linear-gradient(to right, #000 85%, transparent);
    flex-shrink: 0;
  }
  .dl-projects::-webkit-scrollbar { display: none; }
  .dl-projects:empty { display: none; }

  .dl-project-chip {
    flex-shrink: 0;
    padding: 4px 10px;
    border-radius: var(--r-xl);
    background: var(--secondary-bg);
    color: var(--hint);
    font-size: var(--fs-sm);
    border: 1px solid transparent;
    cursor: pointer;
    transition: all 0.15s;
    white-space: nowrap;
  }
  .dl-project-chip:hover,
  .dl-project-chip.active {
    background: var(--button);
    color: var(--button-text);
    border-color: var(--button);
  }

  .dl-search {
    padding: 4px 12px 8px;
    flex-shrink: 0;
  }
  .dl-search input {
    width: 100%;
    padding: 7px 12px;
    border-radius: var(--r-2xl);
    border: 1px solid var(--ov-08);
    background: var(--secondary-bg);
    color: var(--text);
    font-size: var(--fs-base);
    outline: none;
    font-family: inherit;
  }
  .dl-search input::placeholder { color: var(--hint); }
  .dl-search input:focus { border-color: var(--ov-15); }

  .dl-list {
    flex: 1;
    overflow-y: auto;
    overflow-x: hidden;
  }

  /* ── List items ── */
  .dl-item {
    padding: 10px 16px;
    cursor: pointer;
    border-bottom: 1px solid var(--ov-05);
    transition: background 0.15s;
    border-left: 3px solid transparent;
  }
  .dl-item:hover { background: var(--ov-06); }
  .dl-item.active {
    background: var(--accent-bg);
    border-left-color: var(--link);
  }
  .dl-item-top {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 3px;
  }
  .dl-item-project {
    font-size: var(--fs-sm);
    font-weight: 600;
    color: var(--link);
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .dl-item-model {
    font-size: var(--fs-xs);
    color: var(--hint);
  }
  .dl-item-time {
    font-size: var(--fs-xs);
    color: var(--hint);
    flex-shrink: 0;
  }
  .dl-item-task {
    font-size: var(--fs-base);
    color: var(--text);
    opacity: 0.85;
    line-height: 1.4;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
  .dl-item-bottom {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-top: 4px;
  }
  .dl-item-status {
    font-size: var(--fs-xs);
    font-weight: 600;
    padding: 2px 7px;
    border-radius: var(--r-xs);
    letter-spacing: 0.02em;
  }
  .dl-item-status.s-running { background: var(--success-bg); color: var(--success); }
  .dl-item-status.s-waiting_input { background: var(--accent-bg); color: var(--link); }
  .dl-item-status.s-completed { background: var(--warning-bg); color: var(--warning); }
  .dl-item-status.s-done { background: var(--success-bg); color: var(--success); }
  .dl-item-status.s-failed { background: var(--danger-bg); color: var(--destructive); }
  .dl-item-status.s-stopped { background: var(--warning-bg); color: var(--warning); }
  .dl-item-status.s-cancelled { background: var(--danger-bg); color: var(--destructive); }
  .dl-item-status.s-deferred { background: var(--warning-bg); color: var(--warning); }
  .dl-item-cost {
    font-size: var(--fs-xs);
    color: var(--hint);
    margin-left: auto;
    font-family: var(--font-mono);
  }
  /* Без opacity: она перемножалась с приглушением карточки на паузе, и id
     уходил в 2.6:1. Серого --hint достаточно. */
  .dl-item-id {
    font-size: var(--fs-xs);
    color: var(--hint);
    font-family: var(--font-mono);
  }
  .dl-item-children {
    font-size: var(--fs-xs);
    color: var(--link);
    margin-left: auto;
    opacity: 0.8;
  }

  /* ── Status dots ── */
  .dl-status-dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    flex-shrink: 0;
    background: var(--hint);
    opacity: 0.5;
  }
  .dl-running .dl-status-dot {
    background: var(--success);
    opacity: 1;
    box-shadow: 0 0 6px var(--success-line);
    animation: dot-pulse 1.5s ease-in-out infinite;
  }
  .dl-paused .dl-status-dot {
    background: var(--warning);
    opacity: 0.8;
  }
  .dl-error .dl-status-dot {
    background: var(--destructive);
    opacity: 1;
  }
  .dl-interrupted .dl-status-dot {
    background: var(--warning);
    opacity: 1;
    box-shadow: 0 0 6px var(--warning-line);
  }
  .dl-draft .dl-status-dot {
    background: var(--link);
    opacity: 0.6;
  }

  @keyframes dot-pulse {
    0%, 100% { opacity: 1; box-shadow: 0 0 6px var(--success-line); }
    50% { opacity: 0.5; box-shadow: 0 0 2px var(--success-line); }
  }

  /* ── Running item glow ── */
  .dl-item.dl-running {
    border-left-color: var(--success);
    background: var(--success-bg);
    animation: dl-item-glow 3s ease-in-out infinite;
  }
  @keyframes dl-item-glow {
    0%, 100% { box-shadow: inset 3px 0 8px -4px var(--success-line); }
    50% { box-shadow: inset 3px 0 12px -4px var(--success-line); }
  }
  .dl-item.dl-running:hover {
    background: var(--success-bg);
  }

  /* ── Interrupted item styling ── */
  .dl-item.dl-interrupted {
    border-left-color: var(--warning);
    background: var(--warning-bg);
  }
  .dl-item.dl-interrupted:hover {
    background: var(--warning-bg);
  }

  /* ── Paused/error item styling ── */
  /* Без opacity: приглушение прозрачностью роняло серые подписи карточки
     (id, цена) ниже 4.5:1 в светлой теме. Статус и так виден по бейджу. */
  .dl-item.dl-paused {
    opacity: 1;
  }
  .dl-item.dl-paused:hover {
    opacity: 1;
    background: var(--warning-bg);
  }
  .dl-item.dl-error {
    border-left-color: transparent;
    opacity: 1;
  }
  .dl-item.dl-error:hover {
    opacity: 1;
    background: var(--danger-bg);
  }
  .dl-item.dl-draft {
    opacity: 0.6;
  }
  .dl-item.dl-draft:hover {
    opacity: 1;
  }
  /* Pinned (Фаза 45) — gold left stripe + full opacity, overrides status. */
  .dl-item.agent-pinned {
    border-left-color: var(--warning);
    opacity: 1;
  }

  /* ── Section separator for paused group ── */
  .dl-item.dl-paused:first-of-type,
  .dl-item.dl-error:first-of-type {
    margin-top: 2px;
    border-top: 1px solid var(--ov-06);
  }

  .dl-empty {
    padding: 40px 20px;
    text-align: center;
    color: var(--hint);
    font-size: var(--fs-md);
  }

  /* ── Main Panel ── */
  #desktop-main-panel {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    position: relative;
    background: var(--bg);
  }

  /* Dashboard hidden on desktop — list panel replaces it */
  #screen-dashboard { display: none !important; }

  /* FABs and mobile tab bar hidden on desktop */

  
  .fab { display: none !important; }
  #mobile-tab-bar { display: none !important; }

  /* Screens fill main panel — instant, no animation */
  #desktop-main-panel > .screen,
  #desktop-main-panel > .home-hero {
    height: 100%;
    overflow-y: auto;
    animation: none !important;
    transition: none !important;
    opacity: 1 !important;
    transform: none !important;
  }

  /* Chat fills main panel properly */
  #desktop-main-panel #screen-chat {
    height: 100%;
  }

  /* Fix position:fixed elements inside main panel */
  .nt-input-bar {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
  }

  /* Hide back buttons on desktop — sidebar handles navigation */
  #desktop-main-panel .form-header > .btn-icon:first-child { display: none; }
  #desktop-main-panel .chat-header > #btn-back { display: none; }

  /* Screen transitions disabled on desktop */
  .screen-exit,
  .screen-back {
    animation: none !important;
  }

  /* Pull-to-refresh disabled on desktop */
  .ptr-indicator { display: none !important; }

  /* Modals: center on desktop, not bottom-sheet */
  .modal-overlay {
    align-items: center;
  }
  .modal-content {
    border-radius: var(--r-2xl);
    max-width: 600px;
  }

  /* Glow border stays full-viewport */

  /* Thin styled scrollbar for desktop */
  .dl-list,
  #desktop-main-panel > .screen {
    scrollbar-width: thin;
    scrollbar-color: var(--ov-12) transparent;
  }
  .dl-list::-webkit-scrollbar,
  #desktop-main-panel > .screen::-webkit-scrollbar {
    width: 6px;
  }
  .dl-list::-webkit-scrollbar-track,
  #desktop-main-panel > .screen::-webkit-scrollbar-track {
    background: transparent;
  }
  .dl-list::-webkit-scrollbar-thumb,
  #desktop-main-panel > .screen::-webkit-scrollbar-thumb {
    background: var(--ov-12);
    border-radius: 3px;
  }
  .dl-list::-webkit-scrollbar-thumb:hover,
  #desktop-main-panel > .screen::-webkit-scrollbar-thumb:hover {
    background: var(--ov-20);
  }
}

/* ══════════════════════════════════════════════════════════ */

/* ── MCP Servers ─────────────────────────────────── */

.mcp-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: 12px 14px;
  margin-bottom: 8px;
  cursor: pointer;
  transition: border-color 0.15s;
}
.mcp-card:hover { border-color: var(--accent); }
.mcp-card.mcp-disabled { opacity: 0.5; }
.mcp-card-header {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 4px;
}
.mcp-type-badge {
  font-size: var(--fs-sm);
  padding: 1px 6px;
  border-radius: var(--r-xs);
  background: var(--bg-secondary, #1a1a1a);
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.mcp-card-desc {
  color: var(--text-secondary);
  font-size: var(--fs-md);
  line-height: 1.3;
}
.mcp-card-detail {
  font-size: var(--fs-base);
  margin-top: 4px;
  font-family: monospace;
}

/* Project edit: "Дополнительно" accordion — hides all optional fields behind a
   single tappable row so the create form shows only the required basics. */
.pe-advanced {
  margin-top: 18px;
  border-top: 1px solid var(--border);
}
.pe-advanced > summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 14px 2px;
  font-size: var(--fs-lg);
  color: var(--text);
  user-select: none;
  -webkit-user-select: none;
}
.pe-advanced > summary::-webkit-details-marker { display: none; }
.pe-advanced > summary::before {
  content: '\25B8'; /* ▸ */
  color: var(--hint);
  font-size: var(--fs-md);
  transition: transform 0.15s;
}
.pe-advanced[open] > summary::before { transform: rotate(90deg); }
.pe-advanced > summary .pe-advanced-title { font-weight: 600; }
.pe-advanced > summary .hint { font-weight: 400; opacity: 0.6; font-size: var(--fs-md); }
.pe-advanced-body { padding-bottom: 4px; }
.pe-advanced-body > label:first-child { margin-top: 4px; }

/* Make sure the save CTA clears the mobile bottom tab bar on the edit screen. */
#screen-project-edit .form-body { padding-bottom: 88px; }

/* Project edit: MCP checkboxes */
.pe-section { margin-top: 16px; }
.pe-checkbox-label {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  padding: 6px 0;
  font-size: var(--fs-md);
  line-height: 1.4;
  cursor: pointer;
}
.pe-checkbox-label.muted { opacity: 0.5; }
.pe-checkbox-label input[type="checkbox"] {
  margin-top: 2px;
  flex-shrink: 0;
}

/* Project edit: Skills */
.pe-skill-pkg {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 0;
  font-size: var(--fs-md);
}
.btn-sm {
  font-size: var(--fs-base);
  padding: 3px 10px;
  border-radius: var(--r-sm);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text-secondary);
  cursor: pointer;
}
.btn-sm:hover { border-color: var(--accent); color: var(--text); }
.btn-sm.btn-danger { color: var(--danger); border-color: var(--danger); }
.btn-sm.btn-secondary { color: var(--accent); border-color: var(--accent); }

/* New task: MCP chips bar */
.nt-mcp-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 16px;
  margin-top: 4px;
}
.nt-mcp-label {
  font-size: var(--fs-base);
  color: var(--text-secondary);
  flex-shrink: 0;
}

/* ── Advanced SDK Settings (new task) ── */
.nt-advanced {
  padding: 0 16px;
  margin-top: 6px;
}
.nt-advanced-header {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--fs-base);
  color: var(--hint);
  cursor: pointer;
  user-select: none;
  padding: 4px 0;
}
.nt-advanced-arrow {
  font-size: var(--fs-xs);
  display: inline-block;
  transition: transform 0.15s;
}
.nt-advanced.expanded .nt-advanced-arrow {
  transform: rotate(90deg);
}
.nt-advanced-body {
  display: none;
  padding: 8px 0 4px;
}
.nt-advanced.expanded .nt-advanced-body {
  display: block;
}
.nt-adv-row {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
}
.nt-adv-label {
  font-size: var(--fs-base);
  color: var(--text-secondary);
  min-width: 90px;
  flex-shrink: 0;
}
.nt-adv-input {
  width: 100px;
  padding: 5px 8px;
  border-radius: var(--r-md);
  border: 1.5px solid var(--ov-08);
  background: var(--secondary-bg);
  color: var(--text);
  font-size: var(--fs-base);
  font-family: inherit;
  outline: none;
}
.nt-adv-input:focus {
  border-color: var(--link);
}
.nt-adv-input::placeholder {
  color: var(--hint);
}
/* Number input spinner styling */
.nt-adv-input::-webkit-inner-spin-button {
  opacity: 0.5;
}

/* Settings: link row */
.st-row-link {
  display: flex;
  align-items: center;
  justify-content: space-between;
  cursor: pointer;
  padding: 10px 0;
}
.st-row-link:hover .st-row-label { color: var(--accent); }
.st-row-arrow { color: var(--text-secondary); font-size: var(--fs-input); }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* ── Skills Dropdown ─────────────────────────────── */
.skills-dropdown {
  position: absolute;
  bottom: 100%;
  left: 0;
  right: 0;
  max-height: 420px;
  overflow-y: auto;
  background: #1a1d2e;
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  margin-bottom: 6px;
  box-shadow: 0 -8px 30px var(--sh-strong);
  z-index: 300;
}
.sd-section-label {
  padding: 8px 14px 4px;
  font-size: .7rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .05em;
  color: var(--text-muted);
  opacity: .7;
}
.skills-dropdown-item {
  padding: 9px 14px;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 10px;
  transition: background .15s;
}
.skills-dropdown-item:hover,
.skills-dropdown-item.active {
  background: var(--bg-hover);
}
.skills-dropdown-item.selected {
  opacity: .6;
}
.skills-dropdown-item .sd-icon {
  font-size: 1.1rem;
  width: 24px;
  text-align: center;
  flex-shrink: 0;
}
.skills-dropdown-item .sd-body {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
  flex: 1;
}
.skills-dropdown-item .sd-name {
  font-weight: 600;
  font-size: .88rem;
  color: var(--text);
}
.skills-dropdown-item .sd-desc {
  font-size: .76rem;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.skills-dropdown-item .sd-check {
  color: var(--accent);
  font-weight: 700;
  font-size: .9rem;
  margin-left: auto;
  flex-shrink: 0;
}
.skills-dropdown-empty {
  padding: 14px;
  text-align: center;
  color: var(--text-muted);
  font-size: .85rem;
}

/* Skills bar (selected skill tags) */
.nt-skills-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 6px 16px;
}
.nt-skill-tag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  background: var(--accent);
  color: var(--on-accent);
  font-size: .78rem;
  font-weight: 600;
  padding: 3px 8px 3px 8px;
  border-radius: var(--r-xl);
  white-space: nowrap;
}
.nt-skill-tag-icon {
  font-size: .85rem;
}
.nt-skill-tag-x {
  cursor: pointer;
  opacity: .7;
  font-size: .85rem;
  line-height: 1;
  padding: 0 2px;
  transition: opacity .15s;
}
.nt-skill-tag-x:hover { opacity: 1; }

/* Download button per file in list */
.fi-download {
  margin-left: 8px;
  background: transparent;
  border: 1px solid var(--border);
  color: var(--hint);
  width: 28px;
  height: 28px;
  border-radius: var(--r-sm);
  cursor: pointer;
  font-size: var(--fs-lg);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  transition: background 0.15s, color 0.15s;
}
.fi-download:hover { background: var(--violet-bg); color: var(--accent); border-color: var(--accent); }

/* Финальная сводка вложений в конце чата (агрегат всех файлов агента) */
.agent-attachments-summary {
  /* Боковые поля как у живой строки: без них рамка блока шла от края до края
     колонки и упиралась в список агентов (202.9). */
  margin: 16px 12px 8px;
  padding: 12px;
  background: var(--ov-02);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.aas-title {
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--hint);
  text-transform: uppercase;
  letter-spacing: 0.5px;
  margin-bottom: 4px;
}
.agent-attachments-summary .agent-attachment-card { margin: 0; max-width: 100%; }

/* Файлы прошлых ходов сессии — свёрнуты в строку, чтобы длинный чат не
   превращался в стопку из 20-30 карточек (фаза 102) */
.aas-history { display: flex; flex-direction: column; gap: 8px; }
.aas-history-toggle {
  display: flex;
  align-items: center;
  gap: 6px;
  width: 100%;
  min-height: 36px;            /* тап-таргет: 22px на телефоне вдвое ниже нормы */
  padding: 8px 8px 8px 0;
  background: none;
  border: none;
  border-top: 1px solid var(--border);
  color: var(--hint);
  font-size: var(--fs-md);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
}
/* Заголовка текущего хода нет → рамка кнопки шла второй волосяной линией
   в 12px под рамкой самого блока. Паддинг симметричный (иначе подпись висит
   выше оптического центра), но min-height НЕ трогаем: это самый частый кадр
   фичи — сразу после нового промпта, — и тап-таргет тут нужен не меньше. */
.aas-history:first-child .aas-history-toggle {
  border-top: none;
  padding: 0 8px 0 0;
}
.aas-history-toggle:hover { color: var(--text); }
.aas-history-toggle .aas-chevron { flex: 0 0 auto; transition: transform 0.15s ease; }
.aas-history-toggle.open .aas-chevron { transform: rotate(90deg); }
/* 30 карточек — это ~2000px, две с половиной высоты телефона: раскрытая
   история прокручивается внутри себя, а не уносит ленту чата. Высота
   намеренно НЕ кратна шагу карточки (68px): половина следующей в срезе —
   единственный намёк, что список продолжается (overlay-скроллбар на macOS
   невидим). overscroll-behavior — чтобы докрутка не уносила ленту чата. */
.aas-history-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: 298px;
  overflow-y: auto;
  overscroll-behavior: contain;
}
.aas-history-list::-webkit-scrollbar { width: 6px; }
.aas-history-list::-webkit-scrollbar-track { background: transparent; }
.aas-history-list::-webkit-scrollbar-thumb {
  background: var(--border);
  border-radius: 3px;
}
/* Без этого правила свёртка не работает вовсе: авторский display перебивает
   UA-правило [hidden]{display:none}. */
.aas-history-list[hidden] { display: none; }

/* Attachment-card (claude.ai-style) для файлов созданных агентом */
/* 189.2: агент сам пометил итог как «без результата» (блок ```outcome). */
/* 189.3: вердикт code-reviewer'а (блок ```review в итоге субагента). */
/* 189.3: кнопки в шапке карточки проекта держатся вместе справа. */
.pc-btns { display: flex; gap: 6px; flex-shrink: 0; align-items: center; }

.agent-review {
  margin-top: 8px;
  padding: 6px 10px;
  border-left: 3px solid #5b8def;
  background: rgba(91, 141, 239, 0.10);
  border-radius: 6px;
  font-size: 0.94em;
}
.agent-review-approved { border-left-color: #3bb273; background: rgba(59, 178, 115, 0.10); }
.agent-review-blocked { border-left-color: #d9534f; background: rgba(217, 83, 79, 0.10); }

.agent-outcome {
  margin-top: 8px;
  padding: 6px 10px;
  border-left: 3px solid #e0a030;
  background: rgba(224, 160, 48, 0.10);
  border-radius: 6px;
  font-size: 0.94em;
}

.agent-attachment-card {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 10px 0 4px;
  padding: 10px 12px;
  background: var(--card, var(--ov-04));
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  max-width: 520px;
  box-shadow: 0 2px 8px var(--sh-soft);
}
.aac-icon {
  width: 38px; height: 38px;
  background: var(--violet-bg);
  color: var(--accent);
  border-radius: var(--r-md);
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}
.aac-info {
  flex: 1; min-width: 0;
  display: flex; flex-direction: column;
}
.aac-name {
  font-weight: 600;
  font-size: var(--fs-lg);
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.aac-meta {
  font-size: var(--fs-base);
  color: var(--hint);
  margin-top: 2px;
}
/* Файл вне рабочей папки агента (/tmp, чужой сервер): штатные кнопки сняты
   JS-ом, вместо них «Принести в проект» (фаза 110). Гасим текст и иконку
   точечно, а не opacity всей карточки — иначе кнопка тоже поблёкла бы. */
.agent-attachment-card.aac-offlimits {
  border-style: dashed;
  box-shadow: none;
}
.agent-attachment-card.aac-offlimits .aac-name { color: var(--hint); }
.agent-attachment-card.aac-offlimits .aac-icon {
  background: rgba(140,140,140,0.15);
  color: var(--hint);
}
.aac-btn {
  width: 34px; height: 34px;
  border-radius: var(--r-md);
  border: 1px solid var(--border);
  background: var(--ov-04);
  color: var(--text);
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  transition: background 0.15s, transform 0.1s, border-color 0.15s;
}
.aac-btn:hover { background: var(--violet-bg); border-color: var(--violet-bg); }
.aac-btn:active { transform: scale(0.96); }
.aac-btn.aac-primary {
  background: var(--accent);
  border-color: transparent;
  color: var(--on-accent);
}
.aac-btn.aac-primary:hover {
  background: #7c6cff;
  transform: translateY(-1px);
  box-shadow: 0 4px 12px var(--accent-line);
}
.aac-prev.active {
  background: var(--accent);
  color: var(--on-accent);
  border-color: transparent;
}

/* DEPRECATED — оставлен для совместимости со старыми событиями из БД */
.agent-file-dl {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  margin-left: 6px;
  padding: 0;
  border: 1px solid var(--border);
  background: var(--violet-bg);
  color: var(--accent);
  border-radius: var(--r-xs);
  font-size: var(--fs-base);
  cursor: pointer;
  vertical-align: middle;
  transition: background 0.15s, transform 0.1s;
}
.agent-file-dl:hover {
  background: var(--violet-bg);
  transform: translateY(-1px);
}
.agent-file-dl:active { transform: translateY(0); }

/* Inline buttons next to agent-created files (Write/Edit/Bash) */
.agent-file-prev {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  margin-left: 4px;
  padding: 0;
  border: 1px solid var(--border);
  background: var(--violet-bg);
  color: var(--accent);
  border-radius: var(--r-xs);
  font-size: var(--fs-sm);
  cursor: pointer;
  vertical-align: middle;
  transition: background 0.15s, transform 0.1s;
  font-family: var(--font-mono, monospace);
}
.agent-file-prev:hover { background: var(--violet-bg); transform: translateY(-1px); }
.agent-file-prev.active { background: var(--accent); color: var(--on-accent); }

.agent-bash-artifacts {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-top: 6px;
  align-items: center;
}
.agent-bash-artifacts code {
  font-size: var(--fs-base);
  padding: 2px 6px;
  background: var(--ov-04);
  border-radius: var(--r-xs);
}

.agent-file-preview-box {
  margin-top: 8px;
  padding: 8px;
  background: var(--sunk-25);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  max-height: 320px;
  overflow: auto;
}
.agent-file-preview-pre {
  margin: 0;
  font-size: var(--fs-base);
  line-height: 1.45;
  font-family: var(--font-mono, monospace);
  white-space: pre;
  color: var(--text);
}
.agent-file-preview-empty {
  color: var(--hint);
  font-size: var(--fs-md);
  padding: 4px;
}

/* ── User attribution: avatar + ownership filter (Phase 1+2) ── */

.agent-avatar {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  flex: 0 0 auto;
  object-fit: cover;
  background: var(--secondary-bg);
  display: inline-block;
  vertical-align: middle;
}
.agent-avatar-fallback {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: #fff;
  letter-spacing: 0.3px;
  user-select: none;
}

/* ── Присутствие и непрочитанное (фаза 159, часть II) ──
   Зелёная точка значит ровно одно: человек сейчас в Coder. Всё точечными
   патчами DOM, без анимаций и тяжёлых теней (память coder-frontend-battery-drain). */
.agent-avatar { position: relative; }
.agent-avatar.is-online { box-shadow: 0 0 0 2px color-mix(in srgb, var(--success) 55%, transparent); }
/* картинка не умеет ::after — обводка выше и есть признак; у fallback-кружка
   дополнительно точка, чтобы читалось и на цветном фоне */
.agent-avatar-fallback.is-online::after {
  content: '';
  position: absolute;
  right: -1px;
  bottom: -1px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--success);
  border: 2px solid var(--bg);
}

.presence-stack {
  display: inline-flex;
  align-items: center;
  margin-left: 8px;
  vertical-align: middle;
  gap: 0;
}
.presence-stack .agent-avatar {
  width: 18px;
  height: 18px;
  font-size: var(--fs-xs);
  margin-left: -5px;
  border: 1.5px solid var(--bg);
}
.presence-stack .agent-avatar:first-child { margin-left: 0; }
.presence-stack .presence-more {
  font-size: var(--fs-xs);
  font-weight: 600;
  margin-left: 2px;
  color: var(--hint);
}
.presence-stack .presence-eye {
  font-size: var(--fs-sm);
  margin-left: 5px;
  color: var(--hint);
}

.typing-line {
  font-size: var(--fs-base);
  color: var(--hint);
  padding: 2px 16px 4px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* «Есть непрочитанное» — фиолетовая точка у времени в заголовке. Синяя у
   названия проекта путалась со статусом «В работе». */
.unread-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  vertical-align: middle;
  background: var(--violet, #b39af5);
  flex: 0 0 auto;
}
.agent-card-2l .ac-head .unread-dot { align-self: center; margin-right: -2px; }
.dl-item-2l .dl-item-head .unread-dot { margin: 6px -2px 0 0; }

.agent-card.agent-mine,
.agent-card.agent-foreign {
  /* без боковой полосы: чужого агента выдают аватар автора и значок общего
     проекта, а полоса на скруглённой карточке рисовалась дугой */
}

.history-item .agent-avatar { width: 24px; height: 24px; margin-right: 4px; }
.history-item .agent-avatar-fallback { font-size: var(--fs-xs); }

/* Признак общего проекта на карточке (фаза 159). Намеренно тихий: это
   пояснение, а не статус — статус читается цветом карточки. */
/* Плашка про новое поведение общих проектов (фаза 159). Показывается один
   раз тому, кто сам выдал доступ; живёт до нажатия «Понятно». */
.shared-notice {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  margin: 8px 12px 12px;
  padding: 12px 14px;
  border-radius: var(--r-xl);
  background: color-mix(in srgb, var(--accent) 12%, var(--bg));
  border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent);
  font-size: var(--fs-lg);
  line-height: 1.35;
}
.shared-notice-text { flex: 1; min-width: 0; }
.shared-notice-sub {
  margin-top: 4px;
  font-size: var(--fs-md);
  color: var(--hint);
}
.shared-notice-ok {
  flex: 0 0 auto;
  min-height: 40px;
  padding: 0 14px;
  border: 0;
  border-radius: var(--r-lg);
  background: var(--accent);
  color: var(--on-accent);
  font-size: var(--fs-lg);
  cursor: pointer;
}
@media (max-width: 600px) {
  /* На телефоне кнопка уходит под текст — иначе она сжимает его до трёх слов. */
  .shared-notice { flex-wrap: wrap; }
  .shared-notice-ok { width: 100%; }
}

.agent-shared {
  flex: 0 0 auto;
  font-size: var(--fs-base);
  opacity: 0.65;
  line-height: 1;
}

/* Верхняя строка карточки после фазы 159 несёт на 18px больше (значок общего
   проекта плюс отступ), и сжимался в ней ТОЛЬКО автор — у него единственного
   стоял overflow:hidden. На 375px имя схлопывалось до «Ольг…». Место отдаёт
   ярлык проекта: он читается и обрезанным («TEAMSH…»), а имя человека — нет.
   Вес сжатия (2 против 1), а не min-width у автора: с min-width короткое имя
   тянуло бы за собой пустую коробку, а вес делит нехватку между ярлыком и
   именем пропорционально — оба остаются читаемыми. */
.agent-card .agent-project {
  min-width: 0;
  flex-shrink: 2;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.agent-card .agent-author { flex-shrink: 1; }

/* Значок в истории стоит вплотную к названию проекта — там строка своя и
   ничего не сжимает. */
.hi-project .agent-shared { margin-left: 4px; }

.agent-author {
  font-size: var(--fs-sm);
  color: var(--hint);
  margin-left: 4px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 120px;
  display: inline-block;
  vertical-align: middle;
}

.owner-filter {
  display: inline-flex;
  gap: 2px;
  padding: 3px;
  background: var(--secondary-bg);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  margin: 6px 16px 10px;
  width: fit-content;
}
.owner-chip {
  appearance: none;
  background: transparent;
  border: 0;
  color: var(--hint);
  font-size: var(--fs-md);
  font-weight: 500;
  padding: 6px 14px;
  border-radius: var(--r-pill);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  transition: background 0.18s ease, color 0.18s ease, transform 0.08s ease, box-shadow 0.18s ease;
  -webkit-tap-highlight-color: transparent;
}
.owner-chip:hover { color: var(--text); }
.owner-chip:active { transform: scale(0.97); }
.owner-chip.active {
  background: var(--button, #2563eb);
  color: var(--button-text, #fff);
  box-shadow: 0 1px 4px var(--sh-soft);
}
.owner-chip-count {
  font-size: var(--fs-sm);
  font-weight: 600;
  padding: 1px 7px;
  border-radius: var(--r-pill);
  background: rgba(127, 127, 127, 0.18);
  color: inherit;
  line-height: 1.4;
  min-width: 18px;
  text-align: center;
}
.owner-chip.active .owner-chip-count {
  background: rgba(255, 255, 255, 0.22);
}

@media (max-width: 480px) {
  .agent-avatar { width: 24px; height: 24px; }
  .agent-avatar-fallback { font-size: var(--fs-xs); }
  .agent-author { max-width: 90px; font-size: var(--fs-xs); }
  .history-item .agent-avatar { width: 20px; height: 20px; }
}

/* Desktop list panel — compact avatar in dl-item rows */
#desktop-agent-list .dl-item .agent-avatar,
.dl-ghosts .dl-item .agent-avatar { width: 18px; height: 18px; flex: 0 0 18px; }
#desktop-agent-list .dl-item .agent-avatar-fallback,
.dl-ghosts .dl-item .agent-avatar-fallback { font-size: var(--fs-xs); letter-spacing: 0.2px; }
/* Автор и значок общего проекта переехали в нижнюю строку элемента списка
   (см. _renderDlItem): там свободно, поэтому имя можно не душить до 60px. */
#desktop-agent-list .dl-item .agent-author,
.dl-ghosts .dl-item .agent-author { font-size: var(--fs-xs); max-width: 130px; margin-left: 2px; }
#desktop-agent-list .dl-item .dl-item-bottom .agent-shared,
.dl-ghosts .dl-item .dl-item-bottom .agent-shared { font-size: var(--fs-sm); }

/* Preview tabs: Превью / Код */
.agent-file-preview-tabs {
  display: flex;
  gap: 4px;
  padding: 6px 8px;
  border-bottom: 1px solid var(--border);
  background: var(--ov-02);
}
.afp-tab {
  padding: 4px 12px;
  border-radius: var(--r-sm);
  border: 1px solid transparent;
  background: transparent;
  color: var(--hint);
  font-size: var(--fs-base);
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.afp-tab:hover { background: var(--violet-bg); color: var(--text); }
.afp-tab.active {
  background: var(--accent);
  color: var(--on-accent);
  border-color: transparent;
}
.agent-file-preview-iframe {
  width: 100%;
  height: 360px;
  border: none;
  background: #fff;
  border-radius: 0 0 8px 8px;
}
.agent-file-preview-svg {
  padding: 12px;
  background: #fff;
  text-align: center;
}
.agent-file-preview-svg svg { max-width: 100%; height: auto; }
.agent-file-preview-svg img { max-width: 100%; height: auto; }
.agent-file-preview-md { padding: 12px; }

/* ── Rendered Markdown (.md preview; reusable .md-rendered) ─────────── */
.md-rendered {
  color: var(--text);
  font-size: var(--fs-lg);
  line-height: 1.6;
  word-wrap: break-word;
  overflow-wrap: anywhere;
}
.md-rendered > *:first-child { margin-top: 0; }
.md-rendered > *:last-child { margin-bottom: 0; }

.md-rendered h1, .md-rendered h2, .md-rendered h3,
.md-rendered h4, .md-rendered h5, .md-rendered h6 {
  margin: 20px 0 10px;
  line-height: 1.3;
  font-weight: 650;
  color: var(--text);
}
.md-rendered h1 { font-size: 1.55em; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
.md-rendered h2 { font-size: 1.32em; padding-bottom: 5px; border-bottom: 1px solid var(--border); }
.md-rendered h3 { font-size: 1.15em; }
.md-rendered h4 { font-size: 1.02em; }
.md-rendered h5 { font-size: 0.95em; }
.md-rendered h6 { font-size: 0.9em; color: var(--hint); }

.md-rendered p { margin: 10px 0; }
.md-rendered a { color: var(--link); text-decoration: none; }
.md-rendered a:hover { text-decoration: underline; }
.md-rendered strong { font-weight: 680; }
.md-rendered em { font-style: italic; }
.md-rendered del { opacity: 0.65; }

.md-rendered ul, .md-rendered ol { margin: 10px 0; padding-left: 26px; }
.md-rendered li { margin: 4px 0; }
.md-rendered li > ul, .md-rendered li > ol { margin: 4px 0; }
.md-rendered li::marker { color: var(--hint); }
/* GFM task lists: drop the bullet, align the checkbox */
.md-rendered li:has(> input[type="checkbox"]) { list-style: none; margin-left: -20px; }
.md-rendered input[type="checkbox"] { margin-right: 7px; vertical-align: middle; }

/* Inline code; fenced blocks carry their own box (atom-one-dark когда подсвечены) */
.md-rendered code {
  font-family: var(--font-mono, monospace);
  font-size: 0.86em;
  background: var(--secondary-bg);
  padding: 1.5px 5px;
  border-radius: var(--r-xs);
  word-break: break-word;
}
.md-rendered pre { margin: 12px 0; border-radius: var(--radius-sm); overflow: auto; }
.md-rendered pre code {
  display: block;
  padding: 12px 14px;
  background: var(--secondary-bg);
  color: var(--text);
  border-radius: var(--radius-sm);
  font-size: var(--fs-base);
  line-height: 1.5;
  white-space: pre;
  overflow-x: auto;
  word-break: normal;
}

.md-rendered blockquote {
  margin: 12px 0;
  padding: 4px 14px;
  border-left: 3px solid var(--link);
  background: rgba(127, 127, 127, 0.06);
  color: var(--hint);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.md-rendered blockquote p { margin: 6px 0; }

.md-rendered table {
  border-collapse: collapse;
  margin: 12px 0;
  max-width: 100%;
  display: block;
  overflow-x: auto;
  font-size: var(--fs-md);
}
.md-rendered th, .md-rendered td { border: 1px solid var(--border); padding: 6px 11px; text-align: left; }
.md-rendered th { background: var(--secondary-bg); font-weight: 650; }
.md-rendered tr:nth-child(even) td { background: rgba(127, 127, 127, 0.05); }

.md-rendered hr { margin: 18px 0; border: none; border-top: 1px solid var(--border); }
.md-rendered img { max-width: 100%; height: auto; border-radius: var(--radius-sm); }

.md-rendered .md-fallback {
  margin: 0;
  white-space: pre-wrap;
  word-break: break-word;
  font-family: var(--font-mono, monospace);
  font-size: var(--fs-base);
  line-height: 1.5;
}

/* ── Side preview panel (Claude Code-style artifacts) ───────────── */
.afp-side-panel {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  width: 600px;
  max-width: calc(var(--vw) * 95);
  background: var(--bg);
  border-left: 1px solid var(--border);
  box-shadow: -8px 0 24px var(--sh-mid);
  display: flex;
  flex-direction: column;
  transform: translateX(100%);
  transition: transform 0.22s cubic-bezier(0.2, 0.8, 0.2, 1);
  z-index: 8800;
  overflow: hidden;
}
.afp-side-panel.open { transform: translateX(0); }
.afp-side-resize {
  position: absolute;
  left: -3px;
  top: 0;
  bottom: 0;
  width: 6px;
  cursor: col-resize;
  background: transparent;
  z-index: 2;
  transition: background 0.15s;
}
.afp-side-resize:hover { background: var(--accent); }
.afp-side-header {
  display: flex;
  align-items: center;
  gap: 10px;
  /* env(safe-area-inset-top): на iPhone панель открывается на весь экран (top:0),
     без этого крестик закрытия уходит под Dynamic Island / строку состояния и не нажимается */
  padding: calc(12px + env(safe-area-inset-top, 0px)) 14px 12px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
  background: var(--card, var(--ov-02));
}
.afp-side-title {
  flex: 1;
  font-size: var(--fs-lg);
  font-weight: 600;
  color: var(--text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.afp-side-close,
.afp-side-collapse {
  width: 30px; height: 30px;
  border-radius: var(--r-sm);
  border: none;
  background: transparent;
  color: var(--hint);
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background 0.15s, color 0.15s;
}
.afp-side-close:hover,
.afp-side-collapse:hover { background: var(--ov-06); color: var(--text); }
/* ── Свёрнутая панель: корешок у правого края ────────────────────── */
.afp-side-rail {
  display: none;
  position: absolute;
  inset: 0;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  padding: calc(14px + env(safe-area-inset-top, 0px)) 0 14px;
  border: none;
  background: var(--card, var(--ov-02));
  color: var(--hint);
  cursor: pointer;
  z-index: 3;
  transition: color 0.15s, background 0.15s;
}
.afp-side-rail:hover { color: var(--text); background: var(--ov-04); }
.afp-side-rail-ico { flex-shrink: 0; }
.afp-side-rail-label {
  /* Подпись вдоль корешка: имя проекта/файла, чтобы свёрнутая полоска не была безымянной */
  writing-mode: vertical-rl;
  font-size: var(--fs-base);
  font-weight: 600;
  letter-spacing: 0.03em;
  max-height: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.afp-side-panel.afp-collapsed .afp-side-rail { display: flex; }
.afp-side-panel.afp-collapsed .afp-side-header,
.afp-side-panel.afp-collapsed .afp-side-body,
.afp-side-panel.afp-collapsed .afp-side-resize { display: none; }
.afp-side-body {
  flex: 1;
  overflow: auto;
  padding: 0;
}
/* Внутри side-panel preview занимает всё пространство */
.afp-side-body .agent-file-preview-tabs { padding: 10px 14px; }
.afp-side-body .agent-file-preview-iframe { height: 100%; min-height: calc(var(--vh) * 70); }
.afp-side-body .agent-file-preview-pre {
  margin: 0;
  padding: 16px;
  font-size: var(--fs-md);
  line-height: 1.5;
  white-space: pre;
  font-family: var(--font-mono, monospace);
  background: transparent;
}
.afp-side-body .agent-file-preview-md { padding: 16px; }
.afp-side-body .agent-file-preview-svg { padding: 24px; min-height: calc(var(--vh) * 50); }
.afp-side-body .afp-iframe {
  width: 100%;
  height: 100%;
  min-height: calc(var(--vh) * 80);
  border: 0;
  background: var(--secondary-bg);
}
.afp-side-body .afp-image-wrap {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding: 16px;
}
.afp-side-body .afp-image-wrap img {
  max-width: 100%;
  height: auto;
  border-radius: var(--r-sm);
  box-shadow: 0 2px 12px var(--sh-mid);
}

@media (max-width: 768px) {
  .afp-side-panel {
    width: 100% !important;
    max-width: 100%;
  }
  .afp-side-resize { display: none; }
}

/* Сворачивание в корешок — только там, где панель не занимает весь экран.
   JS гейтит то же условие (_afpCanCollapse), CSS страхует от залипшего класса
   при переходе с широкого окна на узкое. */
@media (max-width: 959px) {
  .afp-side-collapse,
  .afp-side-panel.afp-collapsed .afp-side-rail { display: none !important; }
  .afp-side-panel.afp-collapsed .afp-side-header { display: flex; }
  .afp-side-panel.afp-collapsed .afp-side-body { display: block; }
}

/* На десктопе превью-панель не наезжает на контент, а «отодвигает» весь
   layout влево (как выезжающий sidebar). Ширина берётся из --afp-side-width,
   которую JS держит в синхроне с реальной шириной панели (в т.ч. при ресайзе). */
@media (min-width: 960px) {
  #desktop-layout {
    transition: margin-right 0.22s cubic-bezier(0.2, 0.8, 0.2, 1);
  }
  body.side-preview-open #desktop-layout {
    margin-right: var(--afp-side-width, 600px);
  }
  /* Во время перетаскивания ручки ресайза убираем transition, чтобы
     layout следовал за курсором 1:1 без лага. */
  body.afp-resizing #desktop-layout { transition: none; }
  /* Панель больше не перекрывает контент → тень-разделитель уводим мягче. */
  body.side-preview-open .afp-side-panel { box-shadow: -1px 0 0 var(--border); }
}

/* FAB помощника висел поверх открытой side-панели и закрывал дерево файлов. */
body.side-preview-open .fab { display: none; }

/* ── Project file explorer in side panel (фаза 71, .afx-) ───────── */
.afx-wrap {
  display: flex;
  height: 100%;
  min-height: 0;
  position: relative;
}
.afx-tree {
  width: var(--afx-tree-w, 240px);
  min-width: 0;
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  min-height: 0;
  background: transparent;
  border-right: 1px solid var(--border);
}
.afx-tree-head {
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 7px 8px 7px 12px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.afx-tree-title {
  flex: 1;
  min-width: 0;
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--hint);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.afx-hbtn {
  min-width: 26px;
  height: 26px;
  padding: 0 5px;
  border: none;
  border-radius: var(--radius-sm, 6px);
  background: transparent;
  color: var(--hint);
  font-size: var(--fs-lg);
  line-height: 1;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  transition: background 0.15s, color 0.15s;
}
.afx-hbtn:hover { background: var(--ov-06); color: var(--text); }
.afx-hbtn.active { color: var(--link); background: var(--accent-bg); }
.afx-tree-body {
  flex: 1;
  overflow: auto;
  padding: 4px 0;
}
.afx-row {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 26px;
  padding-right: 10px;
  font-size: var(--fs-md);
  color: var(--text);
  cursor: pointer;
  white-space: nowrap;
  user-select: none;
  -webkit-user-select: none;
}
.afx-row:hover { background: var(--ov-05); }
.afx-row.active {
  background: var(--accent-bg);
  box-shadow: inset 2px 0 0 var(--link);
}
.afx-chev {
  width: 12px;
  flex-shrink: 0;
  text-align: center;
  font-size: var(--fs-xs);
  color: var(--hint);
  transition: transform 0.15s;
}
.afx-dir.open .afx-chev { transform: rotate(90deg); }
.afx-ico { flex-shrink: 0; font-size: var(--fs-md); }
.afx-name {
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}
.afx-size {
  margin-left: auto;
  font-size: var(--fs-sm);
  color: var(--hint);
  flex-shrink: 0;
}
.afx-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--warning);
  flex-shrink: 0;
}
.afx-hint {
  color: var(--hint);
  font-size: var(--fs-base);
  cursor: default;
}
.afx-hint:hover { background: transparent; }
.afx-err { cursor: pointer; color: var(--destructive); }
.afx-err:hover { background: var(--ov-05); }
.afx-note {
  padding: 16px 14px;
  font-size: var(--fs-md);
  line-height: 1.5;
  color: var(--hint);
}
.afx-view {
  flex: 1;
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
/* ── Лента вкладок открытых файлов (фаза 128) ────────────────────── */
.afx-tabs {
  display: flex;
  align-items: stretch;
  flex-shrink: 0;
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: thin;
  border-bottom: 1px solid var(--border);
  background: var(--ov-02);
}
.afx-tabs::-webkit-scrollbar { height: 4px; }
.afx-tabs::-webkit-scrollbar-thumb { background: var(--ov-10); border-radius: 2px; }
.afx-tab {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
  max-width: 190px;
  padding: 6px 6px 6px 10px;
  border-right: 1px solid var(--border);
  font-size: var(--fs-base);
  color: var(--hint);
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
  transition: background 0.12s, color 0.12s;
}
.afx-tab:hover { background: var(--ov-04); color: var(--text); }
.afx-tab.active {
  background: var(--bg);
  color: var(--text);
  /* Активная вкладка «срастается» с содержимым — подчёркиванием сверху, как в IDE */
  box-shadow: inset 0 2px 0 var(--link);
}
.afx-tab.preview .afx-tab-name { font-style: italic; }
.afx-tab-ico { flex-shrink: 0; font-size: var(--fs-base); }
.afx-tab-name { overflow: hidden; text-overflow: ellipsis; }
.afx-tab-close {
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  border: none;
  border-radius: var(--r-xs);
  background: transparent;
  color: inherit;
  font-size: var(--fs-sm);
  line-height: 1;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.12s, background 0.12s;
}
.afx-tab:hover .afx-tab-close,
.afx-tab.active .afx-tab-close { opacity: 0.7; }
.afx-tab-close:hover { opacity: 1; background: var(--ov-10); }
/* Несохранённые правки: точка вместо крестика, пока на вкладку не навели */
.afx-tab.dirty .afx-tab-close {
  opacity: 1;
  color: transparent;
  background: radial-gradient(circle at 50% 50%, var(--warning) 3.5px, transparent 4px);
}
.afx-tab.dirty:hover .afx-tab-close,
.afx-tab.dirty .afx-tab-close:hover { color: inherit; background: var(--ov-10); }
.afx-tab-menu {
  position: fixed;
  z-index: 9200;
  min-width: 176px;
  padding: 4px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm, 8px);
  background: var(--card);
  box-shadow: 0 8px 24px var(--sh-mid);
  display: flex;
  flex-direction: column;
}
.afx-tab-menu-item {
  padding: 7px 10px;
  border: none;
  border-radius: var(--r-sm);
  background: transparent;
  color: var(--text);
  font-size: var(--fs-md);
  text-align: left;
  cursor: pointer;
}
.afx-tab-menu-item:hover { background: var(--ov-06); }
.afx-view-head {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 5px 10px;
  border-bottom: 1px solid var(--border);
  background: var(--card, var(--ov-02));
  flex-shrink: 0;
}
.afx-view-name {
  /* Имя файла теперь на вкладке, здесь — путь внутри проекта (не дублируем) */
  flex: 1;
  min-width: 0;
  font-size: var(--fs-base);
  color: var(--hint);
  direction: rtl;          /* длинный путь режется слева, имя файла всегда видно */
  text-align: left;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.afx-view-body {
  flex: 1;
  overflow: auto;
  min-height: 0;
}
.afx-view-body .agent-file-preview-iframe { height: 100%; min-height: calc(var(--vh) * 60); }
.afx-view-body .agent-file-preview-pre {
  margin: 0;
  padding: 14px;
  font-size: var(--fs-md);
  line-height: 1.5;
  white-space: pre;
  font-family: var(--font-mono, monospace);
  background: transparent;
}
.afx-view-body .agent-file-preview-md { padding: 14px; }
.afx-view-body .agent-file-preview-svg { padding: 20px; min-height: calc(var(--vh) * 40); }
.afx-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: 100%;
  min-height: 160px;
  padding: 24px;
  text-align: center;
  color: var(--hint);
  font-size: var(--fs-md);
}
.afx-empty-ico { font-size: 28px; opacity: 0.6; }
/* Плашка дозагрузки под содержимым большого файла (порционное чтение). */
.afx-more-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  border-top: 1px solid var(--border);
  background: var(--bg-secondary);
  position: sticky;
  bottom: 0;
}
.afx-more-info {
  flex: 1 1 100px;
  min-width: 0;
  font-size: var(--fs-base);
  color: var(--hint);
}
.afx-more-bar .afx-btn { flex: 0 0 auto; }
/* Editor */
.afx-edit-wrap {
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
}
.afx-editor {
  flex: 1;
  width: 100%;
  min-height: 0;
  border: none;
  outline: none;
  resize: none;
  padding: 12px 14px;
  box-sizing: border-box;
  background: var(--secondary-bg);
  color: var(--text);
  font-family: var(--font-mono, monospace);
  font-size: var(--fs-md);
  line-height: 1.5;
  tab-size: 4;
  -moz-tab-size: 4;
}
.afx-edit-bar {
  position: sticky;
  bottom: 0;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  border-top: 1px solid var(--border);
  background: var(--bg);
  flex-shrink: 0;
}
.afx-edit-name {
  margin-left: auto;
  min-width: 0;
  font-size: var(--fs-base);
  color: var(--hint);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.afx-btn {
  padding: 6px 14px;
  font-size: var(--fs-md);
  border: 1px solid var(--ov-08);
  border-radius: var(--radius-sm, 6px);
  background: var(--secondary-bg);
  color: var(--text);
  cursor: pointer;
  transition: background 0.15s;
}
.afx-btn:hover { background: var(--ov-08); }
.afx-btn:disabled { opacity: 0.6; cursor: default; }
.afx-btn-primary {
  background: var(--button);
  border-color: transparent;
  color: var(--button-text);
  font-weight: 600;
}
.afx-btn-primary:hover { background: var(--button); filter: brightness(1.1); }
/* Back button lives only in narrow single-pane mode */
.afx-back {
  display: none;
  width: auto;
  font-size: var(--fs-md);
  gap: 4px;
  white-space: nowrap;
}
/* ── Свёрнутая колонка дерева + ручка ширины ─────────────────────── */
.afx-tree-resize {
  width: 6px;
  margin: 0 -3px 0 -3px; /* тянущаяся зона шире видимой границы, но layout не двигает */
  flex-shrink: 0;
  cursor: col-resize;
  background: transparent;
  z-index: 3;
  transition: background 0.15s;
}
.afx-tree-resize:hover { background: var(--accent); }
.afx-rail {
  display: none;
  width: 30px;
  flex-shrink: 0;
  flex-direction: column;
  align-items: center;
  padding: 7px 0;
  border-right: 1px solid var(--border);
}
.afx-wrap.afx-tree-hidden .afx-rail { display: flex; }
.afx-wrap.afx-tree-hidden .afx-tree,
.afx-wrap.afx-tree-hidden .afx-tree-resize { display: none; }
.afx-rail-label {
  writing-mode: vertical-rl;
  margin-top: 8px;
  font-size: var(--fs-xs);
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--hint);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Narrow mode: tree takes the full panel, the open file overlays it */
.afx-wrap.afx-narrow .afx-tree { width: 100%; border-right: none; }
.afx-wrap.afx-narrow .afx-tree-resize,
.afx-wrap.afx-narrow .afx-tree-fold,
.afx-wrap.afx-narrow .afx-rail { display: none; }
.afx-wrap.afx-narrow .afx-view { display: none; }
.afx-wrap.afx-narrow.afx-show-view .afx-view {
  display: flex;
  position: absolute;
  inset: 0;
  background: var(--bg);
  z-index: 2;
}
.afx-wrap.afx-narrow .afx-back { display: inline-flex; }
@media (prefers-reduced-motion: reduce) {
  .afx-chev, .afx-hbtn, .afx-btn { transition: none; }
}

/* ── Admin Stats ─────────────────────────────── */
.admin-stats-table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.admin-stats-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-md);
  white-space: nowrap;
}
.admin-stats-table th,
.admin-stats-table td {
  padding: 8px 10px;
  text-align: left;
  border-bottom: 1px solid var(--section-bg, var(--ov-06));
}
.admin-stats-table th {
  color: var(--hint);
  font-weight: 500;
  font-size: var(--fs-sm);
  text-transform: uppercase;
  letter-spacing: .5px;
}
.admin-stats-table td {
  color: var(--text);
}
.admin-stats-table tr:hover td {
  background: var(--section-bg, var(--ov-04));
}
.status-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  margin-right: 4px;
}
.status-dot.status-completed { background: var(--success); }
.status-dot.status-failed { background: #f44336; }
.status-dot.status-running { background: #2196f3; }
.status-dot.status-stopped { background: #9e9e9e; }

/* ── Local Workspace screen ──────────────────────── */
#screen-local-fs .form-body { padding: 16px; display: flex; flex-direction: column; gap: 14px; }
.lfs-header-row {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
}
.lfs-intro { flex: 1; font-size: var(--fs-md); color: var(--hint-color); line-height: 1.45; min-width: 200px; }
.lfs-btn-add { white-space: nowrap; }
.lfs-pwa-hint {
  background: var(--warning-bg);
  border: 1px solid var(--warning-line);
  border-radius: var(--r-md);
  padding: 10px 12px;
  font-size: var(--fs-base);
  color: #e9b34a;
}
.lfs-folders { display: flex; flex-direction: column; gap: 10px; }
.lfs-launched {
  background: rgba(33, 150, 243, 0.08);
  border: 1px solid rgba(33, 150, 243, 0.25);
  border-radius: var(--radius);
  padding: 10px 12px;
  margin-bottom: 10px;
  display: flex; flex-direction: column; gap: 8px;
}
.lfs-launched-header {
  display: flex; align-items: center; justify-content: space-between;
  font-size: var(--fs-md); font-weight: 600; color: #7bb8ff;
}
.lfs-launched-header .btn-secondary {
  background: var(--ov-08); color: var(--text);
  border: 0; padding: 4px 10px; font-size: var(--fs-base); border-radius: var(--r-sm); cursor: pointer;
}
.lfs-launched-list { display: flex; flex-direction: column; gap: 6px; }
.lfs-launched-item {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 8px;
  background: var(--sunk-20);
  border-radius: var(--r-sm);
  font-size: var(--fs-md);
}
.lfs-launched-name { flex: 1; word-break: break-all; }
.lfs-launched-time { font-size: var(--fs-sm); color: var(--hint-color); }
.lfs-launched-btn { padding: 4px 10px; font-size: var(--fs-base); border-radius: var(--r-sm); border: 0; cursor: pointer; }
.lfs-empty {
  text-align: center; padding: 28px 16px;
  background: var(--secondary-bg);
  border: 1px dashed var(--ov-10);
  border-radius: var(--radius);
}
.lfs-empty-icon { font-size: 32px; margin-bottom: 6px; }
.lfs-empty p { margin: 4px 0; }
.lfs-empty-hint { font-size: var(--fs-base); color: var(--hint-color); }
.lfs-card {
  background: var(--secondary-bg);
  border: 1px solid var(--ov-06);
  border-radius: var(--radius);
  padding: 12px 14px;
  display: flex; flex-direction: column; gap: 8px;
}
.lfs-card-active {
  border-color: var(--success-line);
  box-shadow: 0 0 0 1px var(--success-line);
}
.lfs-card-top { display: flex; align-items: center; gap: 8px; }
.lfs-card-icon { font-size: var(--fs-2xl); }
.lfs-card-name { font-weight: 600; font-size: var(--fs-lg); flex: 1; word-break: break-all; }
.lfs-badge-active {
  background: var(--success-line);
  color: var(--success);
  font-size: var(--fs-sm);
  padding: 2px 8px;
  border-radius: var(--r-lg);
  font-weight: 600;
}
.lfs-card-meta { font-size: var(--fs-sm); color: var(--hint-color); }
.lfs-card-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.lfs-card-actions .btn-primary,
.lfs-card-actions .btn-secondary,
.lfs-card-actions .btn-danger {
  padding: 6px 12px;
  font-size: var(--fs-md);
  border-radius: var(--r-sm);
  cursor: pointer;
  border: 0;
}
.lfs-card-actions .btn-secondary {
  background: var(--ov-08);
  color: var(--text);
}
.lfs-btn-remove { padding: 6px 10px; }
.lfs-btn-launch { font-weight: 600; }
.lfs-footer-note {
  font-size: var(--fs-sm);
  color: var(--hint-color);
  padding: 8px 4px;
  line-height: 1.5;
}
.lfs-unsupported {
  background: var(--secondary-bg);
  border-radius: var(--radius);
  padding: 24px;
  text-align: center;
}
.lfs-unsupported-icon { font-size: 36px; margin-bottom: 8px; }
.lfs-unsupported h3 { margin: 4px 0 12px; }
.lfs-unsupported p { font-size: var(--fs-md); color: var(--hint-color); line-height: 1.5; }
.lfs-tips {
  text-align: left;
  margin: 14px auto;
  max-width: 460px;
  font-size: var(--fs-md);
  line-height: 1.6;
  color: var(--hint-color);
}
.lfs-fallback { margin-top: 14px; font-size: var(--fs-md); }
.lfs-fallback a { color: var(--link); text-decoration: underline; }

/* New-task screen: badge об активной локальной папке */
.nt-local-ws-badge {
  display: flex; align-items: center; gap: 8px;
  background: var(--success-bg);
  border: 1px solid var(--success-line);
  border-radius: var(--r-md);
  padding: 8px 12px;
  margin: 0 0 10px;
  font-size: var(--fs-md);
  color: var(--success);
}
.nt-lws-text { flex: 1; }
.nt-lws-text b { color: #fff; font-weight: 600; }
.nt-lws-clear {
  background: transparent; border: 0; color: var(--success);
  font-size: var(--fs-2xl); line-height: 1; cursor: pointer;
  padding: 0 4px;
}
.nt-lws-clear:hover { color: #fff; }

/* ── Project source toggle (server path / local folder) ──────────── */
/* Source selector — equal-width segmented cards (flex:1) with real theme vars.
   The old rules referenced undefined --bg-secondary/--accent/--text-secondary,
   so cards rendered transparent + uneven width + a stray currentcolor border. */
.pe-source-toggle { display: flex; gap: 8px; margin-bottom: 8px; align-items: stretch; }
/* Селектор намеренно специфичнее `.form-body label` (0,1,1), иначе то правило
   навязывает карточкам display:block + вертикальные margin и ломает равную высоту. */
.pe-source-toggle .pe-source-opt {
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: 6px;
  margin: 0;
  min-height: 62px;
  padding: 10px 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--secondary-bg);
  color: var(--text);
  font-size: var(--fs-md);
  font-weight: 500;
  line-height: 1.25;
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
.pe-source-opt input[type="radio"] { margin: 0; accent-color: var(--link); }
.pe-source-opt:has(input:checked) {
  border-color: var(--link);
  background: var(--accent-bg);
}
.pe-source-hint { color: var(--hint); font-size: var(--fs-base); line-height: 1.4; margin-bottom: 8px; }

.pe-local-row { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; }
.pe-local-status { flex: 1; padding: 8px 12px; border-radius: var(--r-md);
  background: var(--bg-secondary); color: var(--text-secondary); font-size: var(--fs-md); }
.pe-local-status.lfs-status-ok { color: var(--success); }
.pe-local-warning { color: var(--warning); font-size: var(--fs-md); padding: 8px 12px;
  border: 1px solid var(--warning-line); border-radius: var(--r-md); background: var(--warning-bg); }

/* ── Local-workspace badges on project cards ─────────────────────── */
.nt-pc-local, .pc-local-badge { display: inline-flex; align-items: center;
  gap: 4px; font-size: var(--fs-sm); padding: 2px 6px; border-radius: var(--r-xs);
  background: var(--bg-secondary); color: var(--text-secondary); margin-left: 6px; }
.pc-local-badge.lfs-ok, .nt-pc-local.lfs-ok { color: var(--success); background: var(--success-bg); }
.pc-local-badge.lfs-warn, .nt-pc-local.lfs-warn { color: var(--warning); background: var(--warning-bg); }
.pc-local-badge.lfs-bad, .nt-pc-local.lfs-bad { color: var(--destructive); background: var(--danger-bg); }

/* ── Multi-runner badge on project cards ─────────────────────── */
.pc-runner-badge { display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--fs-sm); padding: 2px 6px; border-radius: var(--r-xs); margin-left: 6px;
  background: var(--bg-secondary); color: var(--text-secondary); cursor: default; }
.pc-runner-badge.rb-ok { color: var(--success); background: var(--success-bg); }
.pc-runner-badge.rb-bad { color: var(--text-secondary); background: var(--bg-secondary); }

/* ── Доступ: «shared with me» badge + collaborators section (phase 50) ── */
/* --card/--separator aren't in :root (Telegram doesn't inject them), so new
   rules carry inline fallbacks, mirroring .cx-tracker. */
.pc-shared-badge { display: inline-flex; align-items: center; gap: 4px;
  font-size: var(--fs-sm); padding: 2px 6px; border-radius: var(--r-xs); margin-left: 6px;
  color: var(--link); background: var(--accent-bg-strong); cursor: default; }

.pe-share-list { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.pe-share-row { display: flex; align-items: center; gap: 10px;
  padding: 8px 10px; border-radius: var(--r-lg);
  background: var(--secondary-bg);
  border: 1px solid var(--separator, var(--border, var(--ov-08))); }
.pe-share-avatar { width: 32px; height: 32px; border-radius: 50%;
  flex: 0 0 32px; object-fit: cover; }
.pe-share-avatar-fb { display: inline-flex; align-items: center;
  justify-content: center; color: #fff; font-size: var(--fs-md); font-weight: 600; }
.pe-share-meta { flex: 1; min-width: 0; }
.pe-share-name { font-size: var(--fs-lg); font-weight: 500; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pe-share-sub { font-size: var(--fs-base); color: var(--hint, #8a8a9a);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pe-share-remove { flex: 0 0 auto; color: var(--destructive); }

.pe-share-warn { margin-top: 8px; font-size: var(--fs-base); line-height: 1.45;
  color: var(--warning); }

/* ── Project secrets (phase 93) ─────────────────────────────── */
.pe-secrets-list { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
.pe-secret-row { display: flex; align-items: center; gap: 10px;
  padding: 6px 10px; border-radius: var(--radius-sm, 8px);
  background: var(--secondary-bg, var(--ov-04)); }
.pe-secret-row-name { font-size: var(--fs-md); overflow-wrap: anywhere; }
.pe-secret-row .hint { flex: 1; }
.pe-secret-del { flex: 0 0 auto; }
.pe-secret-add { display: flex; gap: 8px; margin-top: 10px; align-items: center;
  flex-wrap: wrap; }
.pe-secret-add .btn-secondary { width: auto; margin-top: 0; flex: 0 0 auto; }
.pe-secret-name { flex: 1 1 38%; min-width: 0; }
.pe-secret-value { flex: 1 1 auto; min-width: 0; }
/* On narrow phones (Android ~360px) name+value+button in one row squeeze the
   value input until its placeholder truncates — give value its own full row. */
@media (max-width: 430px) {
  .pe-secret-add .pe-secret-value { flex: 1 1 100%; order: 3; }
}

/* ── Активные сессии (фаза 115.2) ──────────────────────────── */
.st-sessions-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
.st-session-row { display: flex; align-items: center; gap: 10px;
  padding: 8px 10px; border-radius: var(--radius-sm, 8px);
  background: var(--secondary-bg, var(--ov-04)); }
.st-session-main { flex: 1; min-width: 0; font-size: var(--fs-lg); }
.st-session-main .hint { font-size: var(--fs-base); color: var(--hint); }

/* ── Опубликованные страницы (фаза 115) ────────────────────── */
.pe-publish-me { display: flex; align-items: center; gap: 6px; margin-bottom: 8px;
  font-size: var(--fs-md); color: var(--hint); }
.pe-publish-list { display: flex; flex-direction: column; gap: 8px; }
.pe-publish-row { display: flex; align-items: flex-start; gap: 10px;
  padding: 8px 10px; border-radius: var(--radius-sm, 8px);
  background: var(--secondary-bg, var(--ov-04)); }
.pe-publish-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pe-publish-title { font-size: var(--fs-lg); font-weight: 500; }
/* Мета-строка карточки наследовала базовый кегль и цвет: на мобильном занимала
   три строки крупным текстом и спорила яркостью с названием публикации. */
.pe-publish-main .hint { font-size: var(--fs-base); line-height: 1.35; color: var(--hint); }
/* Ссылка длинная и её надо уметь прочитать глазами, поэтому переносим по
   любому символу, а не прячем в многоточие. */
.pe-publish-url { font-size: var(--fs-base); color: var(--link); overflow-wrap: anywhere; }
.pe-publish-err { font-size: var(--fs-base); color: var(--destructive); }
.pe-publish-actions { flex: 0 0 auto; display: flex; gap: 4px; }
.pe-publish-add { display: flex; gap: 8px; margin-top: 10px; align-items: center;
  flex-wrap: wrap; }
.pe-publish-add .btn-secondary { width: auto; margin-top: 0; flex: 0 0 auto; }
.pe-publish-dir { flex: 1 1 40%; min-width: 0; }
.pe-publish-access { flex: 1 1 auto; min-width: 0; }
@media (max-width: 430px) {
  .pe-publish-add .pe-publish-access { flex: 1 1 100%; order: 3; }
}

/* ── Project invites (phase 55) ─────────────────────────────── */
.pe-invite-block { margin-top: 18px; padding-top: 14px;
  border-top: 1px solid var(--separator, var(--border, var(--ov-08))); }
.pe-invite-list { display: flex; flex-direction: column; gap: 8px; margin: 8px 0; }
/* Пустое состояние/загрузка в обоих списках: глобального правила .hint нет
   (оно везде скоупится по контейнеру), и подсказка рисовалась основным
   текстом 17px — тяжелее самих строк списка. */
.pe-share-list > .hint, .pe-invite-list > .hint {
  font-size: var(--fs-md); line-height: 1.35; color: var(--hint, #8a8a9a); }
.pe-invite-row { display: flex; align-items: center; gap: 10px;
  padding: 8px 10px; border-radius: var(--r-lg);
  background: var(--secondary-bg);
  border: 1px solid var(--separator, var(--border, var(--ov-08))); }
.pe-invite-meta { flex: 1; min-width: 0; }
.pe-invite-who { font-size: var(--fs-lg); font-weight: 500; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pe-invite-sub { font-size: var(--fs-base); color: var(--hint, #8a8a9a); }
.pe-invite-revoke { flex: 0 0 auto; color: var(--destructive); }
.pe-invite-addr-row { display: flex; gap: 8px; margin-top: 10px; align-items: center;
  /* Три элемента в ряду (поле + две кнопки) на 375px не помещаются:
     кнопки переносятся под поле, а не сжимают его до нечитаемого. */
  flex-wrap: wrap; }
/* ЕДИНСТВЕННОЕ правило flex для поля: второе объявление ниже по файлу
   перебивало basis и возвращало поле в одну строку с кнопками (122px на 375). */
.pe-invite-addr { flex: 1 1 100%; min-width: 0; min-height: 40px; }
.pe-invite-addr-row .btn-secondary { width: auto; margin-top: 0; flex: 0 0 auto;
  /* display:block у .btn-secondary даёт разную высоту у «Пригласить» (43px)
     и «🔗 Ссылка» (46px) — эмодзи тянет строку. inline-flex равняет обе. */
  display: inline-flex; align-items: center; justify-content: center;
  min-height: 40px; line-height: 1.2; }
.pe-invite-result { display: flex; gap: 8px; margin-top: 10px; align-items: center;
  /* Как и ряд приглашения: длинный домен стенда иначе поджимает поле
     со ссылкой, и «Копировать» встаёт впритык. */
  flex-wrap: wrap; }
.pe-invite-result .btn-secondary { width: auto; margin-top: 0; flex: 0 0 auto; }
.pe-invite-link-val { flex: 1 1 100%; min-width: 0; min-height: 40px;
  font-size: var(--fs-base); color: var(--text); }

/* Pending-invite banner on the dashboard (path B) */
.invite-banner { display: flex; align-items: center; gap: 10px;
  margin: 10px 12px; padding: 10px 12px; border-radius: var(--r-lg);
  background: var(--accent-bg);
  border: 1px solid var(--link); }
.invite-banner-text { flex: 1; min-width: 0; font-size: var(--fs-md); color: var(--text); }
.invite-banner-open { flex: 0 0 auto; padding: 6px 12px; border-radius: var(--r-md);
  border: none; cursor: pointer; font-size: var(--fs-md); font-weight: 600;
  background: var(--link); color: #fff; }
.invite-banner-x { flex: 0 0 auto; background: none; border: none; cursor: pointer;
  color: var(--hint, #8a8a9a); font-size: var(--fs-xl); padding: 4px; line-height: 1; }

/* Standalone fullscreen accept screen — works before login (a brand-new invitee)
   and after (an authenticated user). Backdrop + card, like a modal. */
.invite-screen { position: fixed; inset: 0; z-index: 1200;
  display: flex; align-items: center; justify-content: center;
  padding: calc(24px + env(safe-area-inset-top, 0px)) 24px
           calc(24px + env(safe-area-inset-bottom, 0px));
  background: rgba(0,0,0,0.6); }
.invite-card { width: 100%; max-width: 420px; text-align: center;
  padding: 28px 22px; border-radius: var(--r-2xl);
  background: var(--secondary-bg);
  border: 1px solid var(--separator, var(--border, var(--ov-08))); }
.invite-icon { font-size: 40px; line-height: 1; margin-bottom: 8px; }
.invite-card h2 { margin: 0 0 12px; font-size: var(--fs-3xl); color: var(--text); }
.invite-project { font-size: var(--fs-2xl); font-weight: 600; color: var(--link);
  margin-bottom: 4px; word-break: break-word; }
.invite-inviter { font-size: var(--fs-md); color: var(--hint, #8a8a9a); margin-bottom: 14px; }
.invite-note { font-size: var(--fs-md); line-height: 1.5; color: var(--hint, #8a8a9a); margin: 0 0 18px; }
.invite-msg { font-size: var(--fs-md); color: var(--destructive); margin-bottom: 12px; }
.invite-card .btn-primary { margin-bottom: 8px; }

/* ── Runners screen ─────────────────────────────────────────── */
/* ── Входящие (фаза 161) ── */
.header-bell-btn { position: relative; }
.header .ws-mount-header + .header-bell-btn { margin-left: 0; }
/* число — «ждут действия», точка — «есть что посмотреть» */
.inbox-badge.is-num { background: var(--warning); }
.inbox-badge.is-dot { min-width: 8px; width: 8px; height: 8px; padding: 0; border-radius: 50%;
  background: var(--link); top: 6px; right: 8px; }
#mobile-tab-bar .tab-btn .inbox-badge { top: 4px; right: calc(50% - 22px); }
/* Кнопка в шапке телефона — ровно по иконке (18px + padding 4px), поэтому бейдж
   с дефолтными top:4/right:6 ложился точно на колокольчик и закрывал его
   целиком: при непустых входящих человек видел только оранжевый кружок.
   Выносим бейдж в правый верхний угол за контур иконки и уменьшаем. */
.header-bell-btn .inbox-badge { top: -3px; right: -4px; min-width: 14px; height: 14px;
  line-height: 14px; font-size: 9.5px; padding: 0 3.5px; }
.header-bell-btn .inbox-badge.is-dot { top: -1px; right: -1px; min-width: 8px; width: 8px;
  height: 8px; padding: 0; }
.inbox-section { margin-bottom: 18px; }
.inbox-section > label { display: block; font-size: var(--fs-sm); font-weight: 600; letter-spacing: .4px;
  text-transform: uppercase; color: var(--hint); margin-bottom: 8px; }
.inbox-item { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: var(--r-xl);
  border: 1px solid var(--separator); background: var(--bg-secondary); margin-bottom: 8px; cursor: pointer; }
.inbox-item.static { cursor: default; }
.inbox-item .ii-body { flex: 1 1 200px; min-width: 0; }
.inbox-item .ii-title { font-size: var(--fs-lg); color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.inbox-item .ii-sub { font-size: var(--fs-base); color: var(--hint); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.inbox-item .ii-sub .dl-resolved-by { max-width: none; }
.inbox-item .ii-icon { font-size: var(--fs-2xl); flex: 0 0 auto; width: 28px; text-align: center; }
.form-body .inbox-item .btn-primary, .form-body .inbox-item .btn-secondary { width: auto; flex: 0 0 auto; margin: 0; padding: 8px 12px; font-size: var(--fs-md); }
.inbox-item.need-question { border-color: var(--link); }
.inbox-item.need-colleague { border-color: var(--warning); }
.inbox-empty { text-align: center; color: var(--hint); padding: 48px 20px; font-size: var(--fs-lg); line-height: 1.5; }
.inbox-empty .icon { font-size: 40px; margin-bottom: 10px; }

/* ── Команды (фаза 159, часть II, П2) ── */
/* Карточка адреса для приглашений: всегда тёмная, независимо от темы —
   это «визитка», её ищут глазами. Подпись капителью, значение моноширинное. */
.form-body .id-card { display: flex; align-items: center; justify-content: space-between; gap: 18px;
  padding: 22px 26px; margin: 4px 0 18px; border-radius: var(--r-2xl);
  background: #0e1014; color: #fff; border: 1px solid rgba(255,255,255,0.06);
  box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset; }
.form-body .id-card:empty { display: none; }
.id-card-body { min-width: 0; flex: 1 1 auto; }
.id-card-label { font-size: var(--fs-sm); letter-spacing: .14em; text-transform: uppercase;
  color: rgba(255,255,255,0.55); margin-bottom: 8px; }
.id-card-value { font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, "JetBrains Mono", "Roboto Mono", Consolas, monospace;
  font-size: 28px; font-weight: 700; line-height: 1.15; letter-spacing: -0.01em;
  color: #fff; overflow-wrap: anywhere; user-select: all; }
.id-card-text { font-size: var(--fs-lg); line-height: 1.5; color: rgba(255,255,255,0.72); margin-top: 12px; max-width: 640px; }
.form-body .id-card-btn { flex: 0 0 auto; width: auto; margin: 0; padding: 12px 20px; border-radius: var(--r-pill);
  border: none; cursor: pointer; font-size: var(--fs-lg); font-weight: 600;
  background: var(--link, #4d7cf3); color: #fff; }
.form-body .id-card-btn:hover { filter: brightness(1.08); }
@media (max-width: 600px) {
  .form-body .id-card { flex-direction: column; align-items: stretch; padding: 18px; gap: 14px; }
  .id-card-value { font-size: 24px; }
  .form-body .id-card-btn { width: 100%; }
}
/* Приглашён, но ещё не принял: пунктирный аватар, как «ещё не с нами» */
.team-invite-pending .pe-share-avatar { outline: 1.5px dashed var(--hint); outline-offset: 2px; opacity: .85; }

/* Строка создания: `.btn-primary` в форме по умолчанию во всю ширину (0,1,1),
   а поле от этого сжимается до полоски. Перебиваем через `.form-body`. */
.form-body .team-create-row { display: flex; gap: 8px; margin-bottom: 12px; }
.form-body .team-create-row .team-create-name { flex: 1 1 auto; width: auto; min-width: 0;
  padding: 11px 12px; border-radius: var(--r-lg); border: 1px solid var(--border);
  background: var(--bg-secondary); color: var(--text); font-size: var(--fs-xl); margin: 0; }
.form-body .team-create-row .btn-primary { width: auto; flex: 0 0 auto; margin: 0; padding: 11px 18px; }
/* Пустое состояние: кнопка по содержимому, а не на всю ширину экрана 1280 */
.form-body .teams-list .empty-state .btn-primary { width: auto; display: inline-block; padding: 11px 24px; margin: 6px 0 0; }
.form-body .teams-list .empty-state p { max-width: 560px; margin: 6px auto; }
/* телефон: последняя карточка не должна уходить под таб-бар */
@media (max-width: 959px) {
  #screen-learn .form-body, #screen-inbox .form-body, #screen-teams .form-body, #screen-team-edit .form-body { padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)); }
}
.learn-intro { font-size: var(--fs-md); line-height: 1.5; color: var(--hint); margin-bottom: 14px; }
.learn-list { display: flex; flex-direction: column; gap: 12px; }
.learn-card { border: 1px solid var(--border); border-radius: var(--r-xl); padding: 14px 16px; background: var(--bg-secondary); }
.learn-card-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.learn-card-title { font-size: var(--fs-xl); font-weight: 600; color: var(--text); }
.learn-card-sub { font-size: var(--fs-md); line-height: 1.5; color: var(--text); opacity: .85; margin-top: 6px; }
.learn-card-bottom { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 12px; flex-wrap: wrap; }
.learn-card-meta { font-size: var(--fs-base); color: var(--hint); }
.learn-card.is-locked { opacity: .7; }
.learn-card.is-locked .btn-primary[disabled] { opacity: .5; cursor: default; }
.form-body .learn-card .btn-primary.learn-start { width: auto; padding: 9px 18px; font-size: var(--fs-lg); flex: 0 0 auto; }
.teams-list { display: flex; flex-direction: column; gap: 10px; }
.team-card { border: 1px solid var(--border); border-radius: var(--r-xl); padding: 14px 16px;
  background: var(--bg-secondary); cursor: pointer; transition: border-color .15s; }
.team-card:hover { border-color: var(--accent-line); }
.team-card-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.team-card-name { font-size: var(--fs-xl); font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-card-sub { font-size: var(--fs-md); color: var(--hint); margin-top: 4px; }
.team-role { font-size: var(--fs-sm); padding: 2px 8px; border-radius: var(--r-sm); flex: 0 0 auto;
  color: var(--hint); background: var(--sunk-25, rgba(127,127,127,0.12)); }
.team-role.owner { color: var(--link); background: var(--accent-bg-strong); }
.team-role.pending { color: var(--warning); background: color-mix(in srgb, var(--warning) 14%, transparent); }
.team-member-menu { flex: 0 0 auto; width: 32px; height: 32px; font-size: var(--fs-3xl); line-height: 1; color: var(--hint); border-radius: var(--r-md); }
.team-member-menu:hover, .team-member-menu.is-open { color: var(--text); background: var(--ov-05); }
.agent-menu.team-menu { min-width: 220px; }
.agent-menu.team-menu .agent-menu-item.danger { color: var(--destructive); }
.team-hint { margin-top: 14px; font-size: var(--fs-base); line-height: 1.5; }
.team-section { margin-top: 18px; }
.team-section > label { display: block; font-size: var(--fs-sm); font-weight: 600; letter-spacing: .4px;
  text-transform: uppercase; color: var(--hint); margin-bottom: 8px; }
.team-member-row .pe-share-you { font-size: var(--fs-sm); color: var(--hint); margin-left: 6px; }
.team-member-row .pe-share-avatar.is-online { box-shadow: 0 0 0 2px color-mix(in srgb, var(--success) 55%, transparent); }
.team-invite-pending { opacity: .85; }
.team-invite-pending .pe-share-sub { color: var(--warning); }
.team-invite-row { display: flex; gap: 8px; margin-top: 10px; }
/* Глобальное правило формы растягивает кнопки на всю ширину — в строке поиска
   и передачи кнопка обязана оставаться по содержимому, а поле — тянуться. */
.team-invite-row .btn-secondary, .pe-team-attach .btn-secondary,
.pe-team-row .btn-secondary, .team-found .btn-primary {
  width: auto; flex: 0 0 auto; margin: 0; padding: 8px 12px; font-size: var(--fs-md); }
.team-actions .hint { font-size: var(--fs-base); line-height: 1.45; }
.team-invite-row .team-invite-input, .pe-team-attach select { flex: 1 1 auto; width: auto; }
.team-invite-input { flex: 1; min-width: 0; padding: 11px 12px; border-radius: var(--r-lg);
  border: 1px solid var(--border); background: var(--bg-secondary); color: var(--text); font-size: var(--fs-xl); }
.team-found { display: flex; align-items: center; gap: 10px; margin-top: 8px; padding: 8px 10px;
  border-radius: var(--r-lg); border: 1px dashed var(--link); }
.team-found .btn-primary { padding: 8px 12px; font-size: var(--fs-md); }
/* Специфичность: строка проекта — <label>, а `.form-body label` (0,1,1)
   делает её блоком с серым мелким текстом. Перебиваем через `.form-body`. */
.form-body .team-project-row, .form-body label.team-project-row { display: flex; align-items: center; gap: 10px;
  padding: 10px 6px; margin: 0; border-bottom: 1px solid var(--separator);
  font-size: var(--fs-lg); font-weight: 400; color: var(--text); cursor: pointer; }
.form-body .team-project-row input[type=checkbox] { width: 20px; height: 20px; flex: 0 0 auto; margin: 0; }
.form-body .team-project-row .tp-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.form-body .team-project-row .tp-owner { font-size: var(--fs-base); color: var(--hint); flex: 0 0 auto; }
.form-body .team-project-row.foreign { color: var(--hint); cursor: default; }
.team-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 22px; padding-top: 16px;
  border-top: 1px solid var(--separator); }
.team-actions .btn-secondary, .team-actions .btn-danger { width: 100%; padding: 11px; }
/* десктоп: кнопки по содержимому, а не полосой во всю ширину (правило ниже базового, иначе проигрывает по порядку) */
@media (min-width: 960px) {
  .team-actions { flex-direction: row; flex-wrap: wrap; align-items: center; }
  .team-actions .btn-secondary, .team-actions .btn-danger { width: auto; padding: 10px 18px; }
  .team-actions .hint { flex-basis: 100%; }
}
/* строка передачи внутри .team-actions: кнопка по содержимому, селект тянется */
.btn-danger { background: color-mix(in srgb, var(--destructive) 14%, transparent); color: var(--destructive);
  border: 1px solid color-mix(in srgb, var(--destructive) 40%, transparent); border-radius: var(--r-lg); cursor: pointer; font-size: var(--fs-lg); }
.pe-team-row { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: var(--r-lg);
  background: var(--accent-bg); border: 1px solid var(--accent-line); margin-bottom: 8px; }
.pe-team-row .pe-team-icon { font-size: var(--fs-2xl); flex: 0 0 auto; }
.pe-team-attach { display: flex; gap: 8px; margin: 6px 0 10px; }
.pe-team-attach select { flex: 1; min-width: 0; padding: 9px; border-radius: var(--r-lg); border: 1px solid var(--border); background: var(--bg-secondary); color: var(--text); }
.pc-team-badge { display: inline-flex; align-items: center; gap: 4px; font-size: var(--fs-sm); padding: 2px 6px;
  border-radius: var(--r-xs); margin-left: 6px; color: var(--link); background: var(--accent-bg-strong); cursor: default;
  max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Общий контейнер баннеров: фиксирован сверху, поверх любого экрана. Сам он
   клики не ловит (pointer-events: none), чтобы не перекрывать шапку там,
   где баннеров нет. */
#global-banners { position: fixed; top: calc(env(safe-area-inset-top, 0px) + 8px); left: 50%;
  transform: translateX(-50%); width: min(720px, calc(var(--vw) * 100 - 24px)); z-index: 450;
  display: flex; flex-direction: column; gap: 8px; pointer-events: none; }
#global-banners .invite-banner { pointer-events: auto; margin: 0;
  background: var(--bg); box-shadow: 0 8px 24px var(--sh-mid, rgba(0,0,0,0.25)); }
#global-banners .invite-banner:not(.team-invite-banner) { background: color-mix(in srgb, var(--link) 12%, var(--bg)); }
@media (min-width: 960px) { #global-banners { left: calc(50% + 28px); } }
/* На телефоне — снизу, над таб-баром: сверху баннер накрывал бы шапку экрана
   и кнопку «назад», а низ у всех экранов свободен. */
@media (max-width: 959px) {
  /* слева, не по центру: справа внизу живёт кнопка «+», её не накрываем */
  #global-banners { top: auto; bottom: calc(72px + env(safe-area-inset-bottom, 0px));
    left: 8px; transform: none; width: calc(var(--vw) * 100 - 88px); }
  body[data-screen="chat"] #global-banners { bottom: calc(140px + env(safe-area-inset-bottom, 0px)); width: calc(var(--vw) * 100 - 16px); }
  /* строка приглашения на узком экране: заголовок в две строки, кнопки рядом */
  .inbox-item.team-inbox-row { flex-wrap: wrap; }
  .inbox-item.team-inbox-row .ii-title { white-space: normal; }
  .inbox-item.team-inbox-row .ii-body { flex-basis: 100%; }
}
/* На экранах, где приглашения уже перечислены, баннер их не дублирует */
body[data-screen="inbox"] #global-banners, body[data-screen="teams"] #global-banners { display: none; }
.team-invite-banner { border-color: var(--success); background: color-mix(in srgb, var(--success) 14%, var(--bg)) !important; }
/* Входящие приглашения на экране «Команды» */
.team-inbox { margin-bottom: 14px; }
.team-inbox-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 12px 14px;
  border-radius: var(--r-xl); margin-bottom: 8px; border: 1px solid var(--success);
  background: color-mix(in srgb, var(--success) 12%, transparent); }
.team-inbox-row .ti-text { flex: 1 1 240px; min-width: 0; font-size: var(--fs-lg); line-height: 1.4; }
.team-inbox-row .ti-sub { font-size: var(--fs-base); color: var(--hint); margin-top: 2px; }
.form-body .team-inbox-row .btn-primary, .form-body .team-inbox-row .btn-secondary { width: auto; flex: 0 0 auto; margin: 0; padding: 8px 14px; font-size: var(--fs-md); }
.form-body .team-inbox-row .btn-primary { background: var(--success); }
.sidebar-btn { position: relative; }
.team-badge { background: var(--success); }
/* точка на кнопках «Команды» телефона (шапка «Проектов», настройки) */
#btn-projects-teams, #btn-settings-teams { position: relative; }
#btn-projects-teams.has-badge::after, #btn-settings-teams.has-badge::after {
  content: ''; position: absolute; top: 6px; right: 6px; width: 8px; height: 8px;
  border-radius: 50%; background: var(--success); border: 2px solid var(--bg); }
.team-invite-banner .invite-banner-open { background: var(--success); }
.team-invite-banner .invite-banner-decline { flex: 0 0 auto; background: none; border: 1px solid var(--border);
  border-radius: var(--r-md); padding: 5px 10px; font-size: var(--fs-md); color: var(--text); cursor: pointer; }

.runners-intro { color: var(--text-secondary); font-size: var(--fs-md);
  padding: 14px 16px; border-radius: var(--r-lg); background: var(--bg-secondary);
  margin-bottom: 14px; line-height: 1.55; }
.runners-intro code { background: var(--sunk-25); padding: 1px 6px; border-radius: var(--r-xs); font-size: var(--fs-base); }
.runners-list { display: flex; flex-direction: column; gap: 10px; margin-top: 14px; }

/* Card */
.runner-card { border: 1px solid var(--border); border-radius: var(--r-xl);
  padding: 14px 16px; background: var(--bg-secondary);
  transition: border-color .15s, box-shadow .15s; }
.runner-card:hover { border-color: var(--accent-line); }

.rc-header { display: flex; justify-content: space-between; align-items: flex-start;
  gap: 12px; }
.rc-title { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rc-name { font-size: var(--fs-xl); font-weight: 600; color: var(--text); }
.rc-id { font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-sm); color: var(--text-secondary); opacity: 0.7;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Pill */
.rc-pill { display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 10px; border-radius: var(--r-pill); font-size: var(--fs-base); font-weight: 500;
  flex-shrink: 0; }
.rc-pill-online { background: var(--success-line); color: var(--success); }
.rc-pill-offline { background: rgba(170,170,170,0.12); color: var(--text-secondary); }
.rc-dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
.rc-pill-online .rc-dot { box-shadow: 0 0 6px var(--success-line); animation: rc-pulse 2s infinite; }
@keyframes rc-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } }

/* Tag chips */
.rc-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.rc-tag { display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 9px; border-radius: var(--r-sm); font-size: var(--fs-sm);
  background: var(--ov-05); color: var(--text-secondary); }
.rc-tag-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
.rc-tag-update { background: var(--warning-bg); color: var(--warning); font-weight: 600; }

.rc-update { margin-top: 10px; padding: 10px 12px; border-radius: var(--r-md);
  background: var(--warning-bg); border: 1px solid var(--warning-line); }
.rc-update-text { display: block; font-size: var(--fs-base); color: var(--text-secondary); margin-bottom: 6px; }
.rc-update-cmd { display: flex; align-items: center; gap: 8px; }
.rc-update-cmd code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-base); background: var(--sunk-25); padding: 4px 8px; border-radius: var(--r-sm);
  color: var(--text-primary); user-select: all; }
.rc-copy { padding: 2px 6px; }

/* Meta */
.rc-meta { margin-top: 8px; font-size: var(--fs-base); display: flex; gap: 6px; align-items: baseline; }
.rc-meta-label { color: var(--text-secondary); }
.rc-meta-value { color: var(--text); }

/* Actions */
.rc-actions { display: flex; gap: 4px; margin-top: 12px; padding-top: 12px;
  border-top: 1px solid var(--ov-06); }
/* На 375px подпись «Порядок: 10» ломалась на две строки и распирала строку
   действий — держим её одной строкой. */
.ws-order-btn { white-space: nowrap; }
.btn-link { background: transparent; border: none; color: var(--text-secondary);
  padding: 6px 10px; border-radius: var(--r-sm); cursor: pointer; font-size: var(--fs-md);
  display: inline-flex; align-items: center; gap: 6px; transition: background .15s, color .15s; }
.btn-link:hover { background: var(--ov-06); color: var(--text); }
.btn-link.rc-act-danger:hover { background: rgba(215,92,92,0.12); color: #ff8888; }
.rc-act-icon { font-size: var(--fs-md); }

/* ── Modals ────────────────────────────────────────────────── */
.modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.7);
  backdrop-filter: blur(4px);
  display: flex; align-items: center; justify-content: center; z-index: 1000;
  padding: 16px; }
.modal-card { background: var(--bg); border: 1px solid var(--border);
  border-radius: var(--r-2xl); padding: 22px; max-width: 580px; width: 100%;
  max-height: calc(var(--vh) * 100 - 32px); overflow-y: auto;
  box-shadow: 0 20px 60px var(--sh-strong); }
.modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 18px; }
.confirm-modal { max-width: 440px; }
.confirm-modal-text { margin: 0; font-size: var(--fs-xl); line-height: 1.5; color: var(--text); }
.confirm-modal .modal-actions .btn-secondary, .confirm-modal .modal-actions .btn-danger, .confirm-modal .modal-actions .btn-primary {
  width: auto; padding: 9px 16px; font-size: var(--fs-lg); }

/* Сетка, а не столбик во всю ширину: на десктопе кнопки тянулись на 1350px,
   а блок настроек под ними — 820px, края не совпадали. */
.settings-quick-row {
  padding: 0 16px 4px;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 8px;
}
.settings-quick-row .btn-secondary { width: 100%; padding: 11px; font-size: var(--fs-lg); margin: 0; }
.settings-quick-row [hidden] { display: none; }
@media (min-width: 960px) {
  .settings-quick-row { max-width: 820px; margin: 0 auto; }
}

/* ── Voice recordings hub (download / retry) ── */
.voice-rec-modal { max-width: 560px; }
.voice-rec-modal .vr-section { margin-top: 14px; }
.voice-rec-modal .vr-section-title {
  font-size: var(--fs-base); text-transform: uppercase; letter-spacing: 0.04em;
  color: var(--hint, #8a8a8a); margin-bottom: 8px; font-weight: 600;
}
.vr-list { display: flex; flex-direction: column; gap: 8px; }
.vr-empty { color: var(--hint, #8a8a8a); font-size: var(--fs-md); padding: 6px 2px; }
.vr-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding: 10px; border: 1px solid var(--border); border-radius: var(--r-lg);
  background: var(--secondary-bg, rgba(127,127,127,0.06));
}
.vr-meta { flex: 1 1 140px; min-width: 0; }
.vr-when { font-size: var(--fs-md); font-weight: 500; }
.vr-sub { font-size: var(--fs-base); color: var(--hint, #8a8a8a); }
.vr-actions { display: flex; gap: 6px; flex-wrap: wrap; }
.vr-actions .btn-secondary, .vr-actions .btn-primary {
  /* Reset the base .btn-secondary block-button styles (width:100% + margin-top)
     so actions render as a compact wrapping row of pills, not stacked full-width bars. */
  width: auto; margin: 0; flex: 0 0 auto;
  padding: 6px 10px; font-size: var(--fs-base); text-decoration: none; line-height: 1.2;
  display: inline-flex; align-items: center;
}
.vr-result { flex-basis: 100%; font-size: var(--fs-md); color: var(--hint, #8a8a8a); margin-top: 4px; }
.vr-text {
  width: 100%; box-sizing: border-box; margin: 6px 0; padding: 8px;
  border: 1px solid var(--border); border-radius: var(--r-md);
  background: var(--bg); color: var(--text, inherit); font: inherit; resize: vertical;
}

/* Runner setup modal */
.runner-setup-modal { max-width: 600px; }
.rsm-header { display: flex; gap: 14px; align-items: center; margin-bottom: 16px; }
.rsm-icon { font-size: 36px; line-height: 1; flex-shrink: 0; }
.rsm-header h3 { margin: 0; font-size: var(--fs-3xl); }
.rsm-subtitle { color: var(--text-secondary); font-size: var(--fs-md); margin-top: 3px; }

.rsm-warning { display: flex; gap: 10px; align-items: flex-start;
  padding: 11px 14px; background: rgba(220,170,40,0.10);
  border: 1px solid rgba(220,170,40,0.3); border-radius: var(--r-md);
  font-size: var(--fs-md); line-height: 1.45; margin-bottom: 18px; }
.rsm-warn-icon { flex-shrink: 0; }

.rsm-step { margin-bottom: 18px; }
.rsm-step-head { display: flex; gap: 12px; margin-bottom: 10px; align-items: flex-start; }
.rsm-step-num { display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 50%;
  background: var(--accent-bg-strong); color: var(--accent-soft);
  font-size: var(--fs-md); font-weight: 600; flex-shrink: 0; margin-top: 2px; }
.rsm-step-text { flex: 1; min-width: 0; }
.rsm-step-title { font-weight: 600; font-size: var(--fs-lg); color: var(--text); }
.rsm-step-hint { font-size: var(--fs-base); color: var(--text-secondary); margin-top: 4px; line-height: 1.5; }
.rsm-step-hint code { background: var(--sunk-25); padding: 1px 6px; border-radius: var(--r-xs); font-size: var(--fs-sm); }
.rsm-step-next .rsm-step-num { background: var(--ov-06); color: var(--text-secondary); }

.rsm-cmd { position: relative; margin-left: 38px; }
.rsm-cmd pre { background: #000; color: #c4f5c9; padding: 12px 44px 12px 14px;
  border-radius: var(--r-md); font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-base); white-space: pre-wrap; word-break: break-all; margin: 0;
  border: 1px solid var(--success-line); }
.rsm-copy { position: absolute; top: 8px; right: 8px;
  background: var(--ov-08); border: none; color: #c4f5c9;
  width: 30px; height: 30px; border-radius: var(--r-sm); cursor: pointer;
  font-size: var(--fs-lg); transition: background .15s; }
.rsm-copy:hover { background: var(--ov-15); }
.rsm-altline { margin: 8px 0 0 38px; font-size: var(--fs-base); color: var(--text-secondary); }
.rsm-altline code { background: var(--sunk-25); padding: 1px 6px; border-radius: var(--r-xs); }

.rsm-oknote { display: flex; gap: 8px; align-items: flex-start; margin: 8px 0 0 38px;
  padding: 8px 10px; font-size: var(--fs-base); line-height: 1.45; color: var(--text);
  background: rgba(52,199,89,0.12); border: 1px solid rgba(52,199,89,0.35); border-radius: var(--r-sm); }
.rsm-oknote .rsm-ok-icon { flex: 0 0 auto; }
.rsm-oknote code { background: var(--sunk-25); padding: 1px 6px; border-radius: var(--r-xs); }

.rsm-trouble { margin-top: 18px; padding: 12px 14px; font-size: var(--fs-base); line-height: 1.5;
  background: var(--bg-secondary, var(--ov-04));
  border: 1px solid var(--border); border-radius: var(--r-md); }
.rsm-trouble-title { font-weight: 600; margin-bottom: 8px; }
.rsm-trouble ul { margin: 0; padding-left: 18px; }
.rsm-trouble li { margin-bottom: 6px; color: var(--text-secondary); }
.rsm-trouble li:last-child { margin-bottom: 0; }
.rsm-trouble code { background: var(--sunk-25); padding: 1px 6px; border-radius: var(--r-xs); }

/* OS tabs inside the runner-setup modal */
.rsm-tabs { display: flex; gap: 4px; margin-bottom: 16px;
  border-bottom: 1px solid var(--border); }
.rsm-tab { background: none; border: none; cursor: pointer;
  padding: 9px 14px; font-size: var(--fs-md); color: var(--text-secondary);
  border-bottom: 2px solid transparent; margin-bottom: -1px;
  transition: color .15s, border-color .15s; }
.rsm-tab:hover { color: var(--text); }
.rsm-tab.active { color: var(--text); border-bottom-color: var(--accent-soft); font-weight: 600; }
.rsm-panel { display: none; }
.rsm-panel.active { display: block; }

/* Runner name modal */
.runner-name-modal { max-width: 440px; }
.runner-name-modal h3 { margin: 0 0 6px; font-size: var(--fs-2xl); }
.rnm-hint { color: var(--text-secondary); font-size: var(--fs-md); line-height: 1.5; margin: 0 0 16px; }
.rnm-label { display: block; font-size: var(--fs-base); color: var(--text-secondary); margin-bottom: 6px; }
.rnm-input { width: 100%; padding: 10px 12px; font-size: var(--fs-lg);
  background: var(--ov-04); color: var(--text);
  border: 1px solid var(--border); border-radius: var(--r-md); box-sizing: border-box; }
.rnm-input:focus { outline: none; border-color: var(--accent-soft); }
.rnm-input-error { border-color: #e5534b; }

.pe-runner-hint { color: var(--text-secondary); font-size: var(--fs-base); margin: 4px 0 8px 0; }

/* ── Multi-runner bindings (project form) ─────────────────────── */
#pe-runner-bindings { display: flex; flex-direction: column; gap: 10px; margin-bottom: 10px; }
.pe-rb-row { display: flex; align-items: center; gap: 8px;
  padding: 10px; border: 1px solid var(--border); border-radius: var(--r-lg);
  background: var(--bg-secondary); }
.pe-rb-row .pe-rb-select { flex: 0 0 200px; min-width: 0; }
.pe-rb-row .path-input-row { flex: 1; margin: 0; }
.pe-rb-remove { flex: 0 0 auto; color: var(--destructive); }
.pe-rb-remove:hover { background: var(--danger-bg); }
.btn-add-runner { width: 100%; }
@media (max-width: 640px) {
  .pe-rb-row { flex-wrap: wrap; }
  .pe-rb-row .pe-rb-select { flex: 1 1 100%; }
  .pe-rb-row .path-input-row { flex: 1 1 auto; }
}

/* ── Runner folder picker ─────────────────────────────────── */
.runner-browser-modal { max-width: 640px; }
.rb-path { font-family: monospace; font-size: var(--fs-base); padding: 8px 12px;
  background: var(--bg-secondary); border-radius: var(--r-sm); margin: 8px 0;
  overflow-x: auto; white-space: nowrap; }
.rb-list { max-height: calc(var(--vh) * 50); overflow-y: auto; border: 1px solid var(--border);
  border-radius: var(--r-sm); }
.rb-item { padding: 10px 12px; cursor: pointer; user-select: none;
  border-bottom: 1px solid var(--border); }
.rb-item:hover { background: var(--bg-secondary); }
.rb-item:last-child { border-bottom: none; }

/* ── Auth-провайдеры: табы Telegram/CRM в login-модалке ───────────── */
.auth-tabs {
  display: flex;
  gap: 4px;
  background: var(--bg-secondary);
  border-radius: var(--r-md);
  padding: 4px;
  margin-bottom: 12px;
}
.auth-tab {
  flex: 1;
  padding: 8px 12px;
  background: transparent;
  border: none;
  color: var(--hint);
  font-size: var(--fs-md);
  font-weight: 500;
  border-radius: var(--r-sm);
  cursor: pointer;
  transition: background .15s, color .15s;
}
.auth-tab:hover { color: var(--text); }
.auth-tab.active {
  background: var(--bg);
  color: var(--text);
}
.auth-pane { display: flex; flex-direction: column; gap: 10px; }

/* ══ Task templates: галерея + инлайн-слоты (фаза 71) ══ */

/* Лента «начните с шаблона…» на «Новой задаче» */
.nt-templates-bar { margin: 10px 0 2px; }
.nt-templates-scroll {
  display: flex; gap: 8px; overflow-x: auto;
  padding-bottom: 4px; scrollbar-width: none;
  /* Затухание у края: обрезанная на полуслове карточка («служебк») читалась
     как поломка, а не как «листается вбок». */
  -webkit-mask-image: linear-gradient(to right, #000 88%, transparent);
  mask-image: linear-gradient(to right, #000 88%, transparent);
}
.nt-templates-scroll::-webkit-scrollbar { display: none; }

.tpl-card {
  background: var(--secondary-bg); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text);
  cursor: pointer; text-align: left; font: inherit;
  transition: border-color 0.15s;
}
.tpl-card:hover { border-color: var(--link); }
.tpl-card-mini {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 8px 12px; white-space: nowrap; flex: 0 0 auto; font-size: var(--fs-md);
}
.tpl-card-all { color: var(--link); }
.tpl-card-icon { font-size: var(--fs-xl); line-height: 1; }
.tpl-card-title { font-weight: 500; }

/* Панель активного шаблона: текст промпта со слотами */
.tpl-panel {
  margin: 10px 0; border: 1px solid var(--border);
  border-radius: var(--radius); background: var(--secondary-bg);
  overflow: hidden;
}
.tpl-panel-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 12px; border-bottom: 1px solid var(--border);
  font-weight: 600; font-size: var(--fs-md);
}
.tpl-panel-close { font-size: var(--fs-md); color: var(--hint); }
.tpl-editor {
  padding: 12px 14px; min-height: 80px; font-size: var(--fs-lg); line-height: 2;
  outline: none; white-space: pre-wrap; word-break: break-word;
  caret-color: var(--link);
}
.tpl-line { min-height: 1em; }
.tpl-slot {
  display: inline; padding: 2px 7px; margin: 0 1px;
  border-radius: var(--r-sm); border: 1px dashed var(--link);
  background: var(--accent-bg);
}
.tpl-slot:empty::before { content: attr(data-label); color: var(--hint); }
.tpl-slot-select { cursor: pointer; user-select: none; }
.tpl-slot-select:empty::before { content: attr(data-label) " ▾"; color: var(--link); }
.tpl-slot-missing { border-color: var(--destructive); }
.tpl-slot-missing:empty::before { color: var(--destructive); }
.nt-chips.tpl-slot-missing { outline: 1px dashed var(--destructive); border-radius: var(--radius-sm); }

/* Слоты вне текста: файлы + переключатели режима */
.tpl-extras {
  padding: 8px 12px 12px; border-top: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 8px;
}
.tpl-extras:empty { display: none; }
.tpl-extra-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.tpl-extra-label { font-size: var(--fs-md); color: var(--hint); }
.tpl-extra-hint { font-size: var(--fs-base); color: var(--hint); }
.tpl-file-btn {
  background: var(--bg); border: 1px dashed var(--border);
  border-radius: var(--radius-sm); color: var(--text);
  padding: 7px 12px; font-size: var(--fs-md); cursor: pointer;
}
.tpl-file-btn:hover { border-color: var(--link); }

/* Попап-селектор инлайн-слота */
.tpl-slot-menu {
  position: fixed; z-index: 9000; min-width: 180px; max-width: 320px;
  background: var(--secondary-bg); border: 1px solid var(--border);
  border-radius: var(--radius-sm); box-shadow: 0 8px 24px var(--sh-mid);
  padding: 4px; display: flex; flex-direction: column;
}
.tpl-slot-menu-item {
  background: none; border: none; color: var(--text); text-align: left;
  padding: 8px 10px; font-size: var(--fs-md); border-radius: var(--r-sm); cursor: pointer;
}
.tpl-slot-menu-item:hover { background: var(--accent-bg); }

/* Чип активного шаблона в баре поля ввода */
.nt-tpl-chip {
  flex: 1; display: flex; align-items: center;
  padding: 10px 12px; font-size: var(--fs-lg); color: var(--hint);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Экран галереи */
.tpl-gallery-body { padding: 12px 16px 24px; }
.tpl-cat-chips { flex-wrap: wrap; margin-bottom: 14px; }
.tpl-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 10px;
}
.tpl-card-full { padding: 12px 14px; display: flex; flex-direction: column; gap: 6px; }
.tpl-card-head { display: flex; align-items: center; gap: 8px; }
.tpl-card-desc { font-size: var(--fs-base); color: var(--hint); line-height: 1.4; }
.tpl-card-badges { display: flex; gap: 6px; flex-wrap: wrap; }
.tpl-badge {
  font-size: var(--fs-sm); color: var(--hint); background: var(--bg);
  border: 1px solid var(--border); border-radius: var(--r-sm); padding: 2px 7px;
}

/* ═══ Рутины (schedules, фаза 86.2) ═══ */
/* ══════════════════════════════════════════════════════════
   ФОРМА РУТИНЫ — модальное окно (стиль UI-кита Meeting Platform)
   Поля: мелкий серый лейбл, контрол 44px с заполненным фоном, hint под
   полем. Выбор расписания — сегментированный переключатель, а не радио:
   `.form-body input { width: 100% }` растягивал радио-кнопку, из-за чего
   точка уезжала в центр строки, а подпись переносилась вниз.
   ══════════════════════════════════════════════════════════ */

/* Пока открыта модалка — фон не скроллится (на телефоне список уезжал
   под шторкой вместе с ней), а плавающие кнопки прячутся: FAB помощника
   висел поверх поля и подсказки. */
body.modal-open { overflow: hidden; }
body.modal-open .fab { display: none !important; }

/* Шторка формы на телефоне выше стандартных 85vh: у рутины восемь полей,
   и последняя секция (галочка автоудаления) иначе прячется за краем. */
@media (max-width: 520px) {
  .sched-modal-content { max-height: calc(var(--vh) * 92); }
}

.sched-modal-content { max-width: 480px; }
.sched-modal-body {
  display: flex;
  flex-direction: column;
  gap: 14px;
  line-height: 1.45;
  padding-bottom: 4px;
}

/* ── Поле: лейбл + контрол + подсказка ── */
.fld { display: flex; flex-direction: column; gap: 6px; }
.fld-label {
  font-size: var(--fs-base);
  font-weight: 500;
  color: var(--hint);
}
.fld-hint {
  font-size: var(--fs-base);
  color: var(--hint);
  opacity: 0.85;
}
.fld-control {
  width: 100%;
  min-height: 44px;
  padding: 10px 13px;
  box-sizing: border-box;
  font-family: inherit;
  font-size: var(--fs-lg);
  color: var(--text, #fff);
  background: var(--ov-06);
  border: 1px solid var(--ov-10);
  border-radius: var(--r-lg);
  outline: none;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.fld-control::placeholder { color: var(--hint); opacity: 0.7; }
.fld-control:focus {
  border-color: var(--link);
  background: var(--ov-04);
}
.fld-textarea { resize: vertical; min-height: 92px; line-height: 1.5; }
.fld-narrow { max-width: 160px; }
.fld-num { max-width: 110px; }
.fld-inline { display: flex; align-items: center; gap: 10px; }
.fld-unit { font-size: var(--fs-lg); color: var(--hint); }
.fld-divider {
  height: 1px;
  background: var(--ov-10);
  margin: 2px 0;
}

/* Чекбокс: галочка + заголовок и подсказка справа (как в референсе) */
.fld-check {
  display: flex;
  align-items: flex-start;
  gap: 11px;
  cursor: pointer;
  user-select: none;
}
.fld-check input[type="checkbox"] {
  width: 18px;
  height: 18px;
  min-height: 0;
  margin: 2px 0 0;
  flex: 0 0 auto;
  accent-color: var(--link);
  cursor: pointer;
}
.fld-check-body { display: flex; flex-direction: column; gap: 3px; }
.fld-check-title { font-size: var(--fs-lg); font-weight: 500; color: var(--text, #fff); }

/* ── Сегментированный переключатель ── */
.seg {
  display: flex;
  gap: 4px;
  padding: 4px;
  background: var(--ov-06);
  border: 1px solid var(--ov-10);
  border-radius: var(--r-xl);
}
.seg-btn {
  flex: 1 1 0;
  min-width: 0;
  padding: 9px 8px;
  font-family: inherit;
  font-size: var(--fs-md);
  font-weight: 500;
  color: var(--hint);
  background: none;
  border: none;
  border-radius: var(--r-md);
  cursor: pointer;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: background 0.15s ease, color 0.15s ease;
}
.seg-btn:hover { color: var(--text, #fff); }
.seg-btn.active {
  color: #fff;
  background: var(--link);
}

/* ── Футер модалки: кнопки в ряд справа ── */
.modal-footer {
  display: flex;
  gap: 10px;
  justify-content: flex-end;
  padding: 14px 18px;
  border-top: 1px solid var(--ov-08);
}
.modal-footer .btn-primary,
.modal-footer .btn-secondary {
  min-width: 128px;
  margin: 0;
}
@media (max-width: 520px) {
  /* На узком экране кнопки делят ширину пополам — тянуться до края удобнее
     большим пальцем, чем целиться в короткую кнопку у правого края. */
  .modal-footer { padding: 12px 14px; }
  .modal-footer .btn-primary,
  .modal-footer .btn-secondary { flex: 1 1 0; min-width: 0; }
  .sched-modal-body { padding-left: 14px; padding-right: 14px; }
}

/* Радио и чекбоксы не должны растягиваться правилом `.form-body input`
   (ширина 100% превращала точку радио в полосу на всю строку). */
.form-body input[type="radio"],
.form-body input[type="checkbox"] {
  width: auto;
  min-width: 0;
}

.sched-card {
  background: var(--secondary-bg);
  border: 1px solid var(--ov-08);
  border-radius: var(--r-xl);
  padding: 12px 14px;
  margin-top: 10px;
}
.sched-card.sched-off { opacity: 0.65; }
.sched-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.sched-name { font-weight: 600; word-break: break-word; }
.sched-task {
  color: var(--hint);
  font-size: var(--fs-md);
  margin-top: 4px;
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 60px;
  overflow: hidden;
}
/* Кнопка раскрытия под обрезанным текстом. Показывается только если текст не
   влез (проверка в _wireSchedTaskMore), поэтому у коротких задач её нет и
   карточка выглядит как раньше. */
.sched-task-more {
  background: none;
  border: 0;
  padding: 2px 0;
  margin-top: 2px;
  font-size: var(--fs-base);
  color: var(--link, #2f80ed);
  cursor: pointer;
}
.sched-task-more:hover { text-decoration: underline; }

/* На экране самой рутины текст задачи показываем ЦЕЛИКОМ. В списке обрезка на
   60px уместна (карточек много), а здесь она резала задачу на третьей строке и
   раскрыть её было нечем: ни кнопки, ни клика. Автор панели отчётов так и не
   смог прочитать собственную рутину — «видно текст выполни ровно одну команду и
   ниже не видно» (03.09.2026). Место на этом экране есть, страница скроллится. */
.sched-task-full {
  max-height: none;
  overflow: visible;
}
.sched-meta { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.sched-tag { font-size: var(--fs-base); background: var(--ov-06); border-radius: var(--r-sm); padding: 2px 8px; }
.sched-times { font-size: var(--fs-base); color: var(--hint); margin-top: 6px; }
.sched-error { font-size: var(--fs-base); color: var(--destructive); margin-top: 6px; word-break: break-word; }
/* 189.3: рутина отложена планировщиком (окно подписки — людям), не ошибка. */
.sched-defer { color: var(--muted, #8a8f98); font-size: 0.9em; margin-top: 4px; }
.sched-actions { display: flex; gap: 14px; margin-top: 8px; }

/* ── Фаза 146: режим доставки итога рутины в Telegram ──────────────────────
   Сегмент на странице рутины: три состояния читаются целиком, без открытия
   формы редактирования — переключатель тут и есть настройка. */
.sched-delivery { margin-top: 14px; }
.sched-delivery-label {
  display: block;
  margin-bottom: 6px;
  font-size: var(--fs-base);
  color: var(--hint);
}
.seg-sm { border-radius: var(--r-lg); padding: 3px; }
.seg-sm .seg-btn { padding: 7px 6px; font-size: var(--fs-base); border-radius: var(--r-md); }
.sched-owner-seg { max-width: 360px; margin-bottom: 12px; }

/* ── Фаза 113: строка-сводка рутин в ленте дашборда ──────────────────────
   Прогоны рутин больше не лежат карточками в общей ленте — вместо десятков
   служебных запусков одна кликабельная строка «сколько рутин работает». */
.sched-feed-row {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 10px;
  padding: 9px 12px;
  border-radius: var(--r-lg);
  background: rgba(127, 127, 127, 0.08);
  border: 1px solid rgba(127, 127, 127, 0.16);
  font-size: var(--fs-md);
  cursor: pointer;
  transition: background 0.15s ease;
}
.sched-feed-row:hover { background: rgba(127, 127, 127, 0.14); }
.sched-feed-icon { flex: 0 0 auto; font-size: var(--fs-xl); }
.sched-feed-text { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sched-feed-go { flex: 0 0 auto; color: var(--hint); font-size: var(--fs-2xl); line-height: 1; }

/* Фаза 166: сломанная рутина. Упавший прогон в ленту больше не выходит
   отдельной карточкой, поэтому сигнал о поломке должен читаться сразу —
   красная рамка строки-сводки и красный бейдж на вкладке «Рутины». */
.sched-feed-row.sched-feed-alarm {
  background: var(--danger-bg);
  border-color: var(--danger-line);
  color: var(--destructive);
}
.sched-feed-row.sched-feed-alarm:hover { background: var(--danger-line); }
.sched-feed-row.sched-feed-alarm .sched-feed-go { color: inherit; }
.tab-badge.sched-fail-badge { background: var(--destructive); }
/* Бейдж у имени рутины в списке — тот же сигнал в самой карточке. */
.sched-fail-pill {
  flex: 0 0 auto;
  /* .sched-head — space-between: без auto-отступа справа бейдж встал бы
     ровно посередине между именем и кнопкой, а не рядом с именем. */
  margin: 0 auto 0 6px;
  padding: 1px 7px;
  border-radius: var(--r-md);
  background: var(--destructive);
  color: var(--on-accent);
  font-size: var(--fs-sm);
  font-weight: 700;
  white-space: nowrap;
}
.sched-attention-now { font-weight: 600; }
.sched-last-fail { color: var(--hint); }
/* В десктопной панели строка стоит между поиском и списком — своё поле. */
#sched-feed-summary-desktop { margin: 0 12px 8px; }
.sched-fail-total { opacity: 0.7; font-weight: 400; }

/* ── Фаза 113: прогоны рутины (карточка + страница рутины) ──────────────── */
.sched-name.sched-open { cursor: pointer; }
.sched-name.sched-open:hover { text-decoration: underline; }
.sched-runs-box {
  margin-top: 8px;
  padding: 8px 10px;
  border-radius: var(--r-md);
  background: rgba(127, 127, 127, 0.08);
  font-size: var(--fs-base);
  display: flex;
  flex-direction: column;
  gap: 3px;
}
.sched-run-now { color: var(--link); font-weight: 600; }
.sched-last-run { color: var(--text, inherit); }
.sched-cost { color: var(--hint); }
.sched-attention { color: var(--destructive); }

.sched-page-head {
  padding: 12px 14px;
  border-radius: var(--r-xl);
  background: var(--secondary-bg);
  border: 1px solid rgba(127, 127, 127, 0.16);
}
.sched-runs-title {
  margin: 18px 0 6px;
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--hint);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.sched-run-row {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 10px 12px;
  margin-bottom: 8px;
  border-radius: var(--r-lg);
  background: var(--secondary-bg);
  border: 1px solid rgba(127, 127, 127, 0.14);
  cursor: pointer;
  transition: border-color 0.15s ease;
}
.sched-run-row:hover { border-color: rgba(127, 127, 127, 0.35); }
.srr-icon { flex: 0 0 auto; font-size: var(--fs-xl); line-height: 1.4; }
.srr-main { flex: 1 1 auto; min-width: 0; }
.srr-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: var(--fs-base); }
.srr-when { font-weight: 600; }
.srr-status { font-size: var(--fs-sm); opacity: 0.85; }
.srr-meta { color: var(--hint); }
.srr-promoted { font-size: var(--fs-sm); }
.srr-text {
  margin-top: 3px;
  font-size: var(--fs-md);
  color: var(--hint);
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
.srr-go { flex: 0 0 auto; color: var(--hint); font-size: var(--fs-2xl); line-height: 1.2; }

/* ── Фаза 113: разрез трат «рутины / руками» на экране затрат ───────────── */
.cost-split { padding: 4px 0; }
.cost-split-bar {
  height: 10px;
  border-radius: var(--r-xs);
  background: rgba(127, 127, 127, 0.25);
  overflow: hidden;
}
.cost-split-sched { height: 100%; background: var(--link); }
.cost-split-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 16px;
  margin-top: 8px;
  font-size: var(--fs-base);
  color: var(--hint);
}
.csl-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  margin-right: 6px;
}
.csl-sched { background: var(--link); }
.csl-manual { background: rgba(127, 127, 127, 0.45); }
.breakdown-sched { background: var(--link); }
.breakdown-clickable { cursor: pointer; }
.breakdown-clickable:hover .breakdown-label { text-decoration: underline; }

/* Бейдж «сейчас работает N прогонов рутин» на кнопке «Рутины» (фаза 113).
   Абсолютное позиционирование — кнопки таб-бара и сайдбара уже relative. */
.tab-badge {
  position: absolute;
  top: 4px;
  right: 6px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: var(--r-md);
  background: var(--link);
  /* Модификаторы ниже меняют только заливку (--warning у входящих и доступа,
   * --destructive у упавшей рутины), поэтому цвет текста обязан быть токеном:
   * белый на жёлтом давал 2.15. */
  color: var(--on-accent);
  font-size: var(--fs-xs);
  font-weight: 700;
  line-height: 16px;
  text-align: center;
}
#mobile-tab-bar .tab-btn, .sidebar-btn { position: relative; }

/* Заявки на доступ (фаза 142): тот же бейдж, другой цвет — здесь ждут решения
   владельца, а не просто идёт работа. */
.access-badge { background: var(--warning); }

/* Плашка прогона рутины в чате (фаза 113) */
.sched-run-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 12px;
  font-size: var(--fs-base);
  background: rgba(127, 127, 127, 0.1);
  border-bottom: 1px solid rgba(127, 127, 127, 0.16);
}
.srb-icon { flex: 0 0 auto; }
.srb-text {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--hint);
}
.srb-link { color: var(--link); cursor: pointer; }
.srb-link:hover { text-decoration: underline; }
.srb-btn {
  flex: 0 0 auto;
  background: none;
  border: 1px solid rgba(127, 127, 127, 0.35);
  border-radius: var(--r-sm);
  padding: 3px 9px;
  font-size: var(--fs-base);
  color: inherit;
  cursor: pointer;
}
.srb-btn:hover { background: rgba(127, 127, 127, 0.16); }
.srb-btn:disabled { opacity: 0.5; cursor: default; }

/* Галочка «удалить после выполнения» у разовой рутины (фаза 113) */
.sched-check {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 10px;
  font-size: var(--fs-md);
  color: var(--hint);
  cursor: pointer;
}
.sched-check input { margin: 0; }

/* ── Фаза 91: индикатор «агент работает» при тихом стриме ── */
/* Фаза 151: живой прогресс фоновой Bash-команды в ленте чата. */
/* Боковые поля как у карточки «1do работает» (.live-did): с нулём плашка
   тянулась на всю колонку 880px и торчала за края ленты и поля ввода. */
.bg-progress-note {
  margin: 8px 20px 4px;
  min-width: 0;
  padding: 8px 10px;
  border: 1px solid var(--ov-06);
  border-radius: var(--r-lg);
  background: var(--sunk-20);
  font-size: var(--fs-base);
  color: var(--hint);
}
.bgp-head {
  display: flex;
  align-items: baseline;
  gap: 8px;
  color: var(--text);
  font-weight: 500;
}
.bgp-meta {
  margin: 3px 0 0 16px;
  opacity: 0.8;
}
/* Описание команды и имя лога — одна «строка» без пробелов (пути, &&, флаги):
   без переноса где угодно на телефоне они уходили за правый край плашки. */
.bgp-head, .bgp-meta { min-width: 0; overflow-wrap: anywhere; }
/* Хвост лога ведёт себя как вывод инструмента в ленте: длинная строка
   скроллится вбок, а не расползается на пол-экрана. Обрезки по высоте нет
   намеренно — она срезала бы низ блока, то есть САМУЮ СВЕЖУЮ строку. */
.bgp-tail {
  margin: 6px 0 0;
  padding: 6px 8px;
  border-radius: var(--r-md);
  background: var(--sunk-30);
  font-family: var(--font-mono);
  font-size: var(--fs-sm);
  line-height: 1.45;
  color: var(--text);
  white-space: pre;
  word-break: normal;
  overflow-x: auto;
}

/* Поля как у карточки «1do работает»: точка встаёт под её значок, а не
   на край колонки 880px левее ленты. */
.stream-idle-note {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 6px 20px 2px;
  padding: 6px 14px;
  font-size: var(--fs-base);
  color: var(--hint);
  opacity: 0.9;
}
.sin-pulse {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--link);
  flex: 0 0 auto;
  animation: sin-pulse 1.4s ease-in-out infinite;
}
@keyframes sin-pulse {
  0%, 100% { opacity: 0.35; transform: scale(0.85); }
  50% { opacity: 1; transform: scale(1.15); }
}
@media (prefers-reduced-motion: reduce) {
  .sin-pulse { animation: none; opacity: 0.8; }
}

/* ── Style picker (phase 100) ─────────────────────────────────────────────
   First login asks how the agent should talk to this person. Cards are the
   whole control (icon + description + a real example of the same answer in
   that style), so the choice is made by reading, not by guessing a label.
   Colours are theme-neutral (currentColor / grey alphas): the Mini App runs
   in the user's Telegram theme, and white alphas vanished in the light one. */

.style-picker-overlay {
  align-items: center;
  padding: 16px;
  /* Above modals (1000) and menus (1100). */
  z-index: 9200;
}

.style-picker {
  border-radius: var(--r-2xl);
  max-width: 560px;
  max-height: min(calc(var(--vh) * 88), 720px);
  border: 1px solid color-mix(in srgb, var(--text) 14%, transparent);
  box-shadow: 0 24px 60px var(--sh-strong);
  overflow: hidden;
}

.style-picker-head { padding: 20px 22px 4px; position: relative; }
.style-picker-title {
  font-size: var(--fs-3xl);
  font-weight: 650;
  letter-spacing: -0.01em;
  padding-right: 34px;   /* место под крестик */
}
.style-picker-sub {
  margin-top: 6px;
  font-size: var(--fs-md);
  line-height: 1.5;
  color: var(--hint);
  padding-right: 34px;   /* как у заголовка: иначе строка подходит к крестику вплотную */
}

.style-picker-close {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: color-mix(in srgb, var(--text) 8%, transparent);
  color: var(--hint);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
}
.style-picker-close:hover {
  background: color-mix(in srgb, var(--text) 16%, transparent);
  color: var(--text);
}

/* Fade at the bottom = the only affordance that more cards follow (overlay
   scrollbars are invisible on macOS/iOS — the visual pass found users could
   miss the third option entirely). */
.style-picker-body {
  position: relative;
  padding: 14px 18px 14px;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 10px;
  --mask-top: 20px;
  --mask-bottom: 26px;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 var(--mask-top),
    #000 calc(100% - var(--mask-bottom)), transparent 100%);
  mask-image: linear-gradient(to bottom, transparent 0, #000 var(--mask-top),
    #000 calc(100% - var(--mask-bottom)), transparent 100%);
}
.style-picker-body.at-top { --mask-top: 0px; }
.style-picker-body.at-end { --mask-bottom: 0px; }

.style-card {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  width: 100%;
  padding: 13px;
  text-align: left;
  background: var(--secondary-bg);
  border: 1.5px solid transparent;
  border-radius: var(--radius);
  color: var(--text);
  font: inherit;
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s, transform 0.1s;
}
.style-card:hover { border-color: color-mix(in srgb, var(--text) 16%, transparent); }
.style-card:active { transform: scale(0.995); }
.style-card.selected {
  border-color: var(--button);
  background: color-mix(in srgb, var(--button) 12%, var(--secondary-bg));
}

.style-card-icon {
  flex: 0 0 36px;
  height: 36px;
  border-radius: var(--r-lg);
  display: flex;
  align-items: center;
  justify-content: center;
  background: color-mix(in srgb, var(--link) 14%, transparent);
  color: var(--link);
}
.style-card-icon svg { width: 20px; height: 20px; }
.style-card.selected .style-card-icon {
  background: color-mix(in srgb, var(--button) 26%, transparent);
}

.style-card-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; flex: 1; }
.style-card-name { font-size: var(--fs-xl); font-weight: 600; }
/* --hint on 13px sits below AA; --text at 82% keeps the hierarchy and passes. */
.style-card-desc { font-size: var(--fs-md); line-height: 1.45; color: var(--text); opacity: 0.82; }

.style-card-example {
  display: block;
  margin-top: 3px;
  padding: 8px 10px;
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--text) 7%, transparent);
  border-left: 2px solid color-mix(in srgb, var(--text) 22%, transparent);
  font-size: var(--fs-base);
  line-height: 1.5;
  color: var(--text);
  opacity: 0.9;
}
.style-card-example-label {
  display: block;
  margin-bottom: 2px;
  font-size: var(--fs-sm);
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  /* Родитель .style-card-example уже полупрозрачен — задаём цвет напрямую,
     иначе прозрачности перемножаются и заявленные 0.78 превращаются в 0.70. */
  color: color-mix(in srgb, var(--text) 85%, transparent);
  opacity: 1;
}
.style-card.selected .style-card-example { border-left-color: var(--button); }

.style-card-check {
  flex: 0 0 20px;
  height: 20px;
  margin-top: 8px;
  border-radius: 50%;
  /* --border is a white alpha → invisible on the light Telegram theme.
     45% keeps the ring above the 3:1 floor for UI elements (WCAG 1.4.11). */
  border: 1.5px solid color-mix(in srgb, var(--text) 45%, transparent);
  display: flex;
  align-items: center;
  justify-content: center;
  color: transparent;
  transition: border-color 0.15s, background 0.15s, color 0.15s;
}
.style-card-check svg { width: 12px; height: 12px; }
.style-card.selected .style-card-check {
  background: var(--button);
  border-color: var(--button);
  color: var(--button-text);
}

.style-picker-foot {
  padding: 12px 18px calc(14px + env(safe-area-inset-bottom, 0px));
  border-top: 1px solid color-mix(in srgb, var(--text) 14%, transparent);
  background: var(--bg);
}
.style-picker-save { margin-top: 0; }

@media (max-width: 600px) {
  .style-picker-overlay { padding: 0; align-items: flex-end; }
  .style-picker { border-radius: 18px 18px 0 0; max-height: calc(var(--vh) * 92); max-width: none; }
  .style-picker-head { padding: 16px 15px 2px; }
  .style-picker-title { font-size: 17.5px; }
  .style-picker-body { padding: 12px 14px; }
  .style-card { padding: 11px; gap: 10px; }
  .style-card-example { font-size: var(--fs-base); }
}

/* Short viewports (mobile landscape, small laptops): the examples are the
   first thing to give up space, not the third card. */
@media (max-height: 720px) {
  .style-card-example {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
}

@media (prefers-reduced-motion: reduce) {
  .style-card { transition: none; }
}

/* «Показать примеры ответов» — открывает тот же пикер из настроек */
.st-inline-link {
  display: inline-block;
  margin: 0 14px 6px;
  padding: 6px 0;     /* 16px по высоте мало для пальца (аудит профиля 1.9) */
  background: none;
  border: none;
  color: var(--link);
  font-size: var(--fs-base);
  font-family: inherit;
  cursor: pointer;
  text-align: left;
}
.st-inline-link:active { opacity: 0.6; }

/* ── Масштаб интерфейса (фаза 169) ────────────────────────────────────────
   Ползунок 80–160% в секции «Оформление». Трек рисуется через
   ::-webkit-slider-runnable-track/::-moz-range-track, а сам input держит
   высоту 26px: на телефоне палец должен попадать в бегунок, а не в полоску
   толщиной 4px. Подписи под ползунком — границы диапазона и «100%» ровно
   посередине, чтобы дефолт было видно, не двигая бегунок. */
.st-zoom-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  padding: 14px 14px 0;
}
.st-zoom-value {
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--link);
  font-variant-numeric: tabular-nums;   /* 95% и 160% не дёргают строку */
}
/* Селектор двойной: `.form-body input` (рамка, padding 10px 12px, ширина
   100%) специфичнее одного класса и перебивал ползунок — он вылезал за
   карточку на 13px и рисовался в рамке поля ввода. */
.st-zoom-range,
.form-body .st-zoom-range {
  -webkit-appearance: none;
  appearance: none;
  display: block;
  width: calc(100% - 28px);
  margin: 8px 14px 0;
  box-sizing: border-box;
  padding: 0;
  border: 0;
  height: 26px;
  background: transparent;
  cursor: pointer;
}
.st-zoom-range:focus-visible { outline: 2px solid var(--link); outline-offset: 4px; }
.st-zoom-range::-webkit-slider-runnable-track {
  height: 4px;
  border-radius: 2px;
  background: var(--ov-12);
}
.st-zoom-range::-moz-range-track {
  height: 4px;
  border-radius: 2px;
  background: var(--ov-12);
}
.st-zoom-range::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 20px;
  height: 20px;
  margin-top: -8px;                     /* центр бегунка на линии трека */
  border-radius: 50%;
  background: var(--link);
  border: 2px solid var(--secondary-bg);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.28);
}
.st-zoom-range::-moz-range-thumb {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--link);
  border: 2px solid var(--secondary-bg);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.28);
}
.st-zoom-range:active::-webkit-slider-thumb { transform: scale(1.12); }
.st-zoom-scale {
  position: relative;
  height: 13px;
  margin: 2px 15px 0;
  font-size: var(--fs-xs);
  color: var(--hint);
  font-variant-numeric: tabular-nums;
}
/* Подписи стоят там, где стоит сам бегунок. «100%» на шкале 80–160 — это 25%
   трека, а не середина: при space-between метка врала на четверть ширины. */
.st-zoom-scale span { position: absolute; top: 0; transform: translateX(-50%); }
.st-zoom-scale span:nth-child(1) { left: 0; transform: none; }
.st-zoom-scale span:nth-child(2) { left: 25%; }
.st-zoom-scale span:nth-child(3) { right: 0; transform: none; }

/* Тихая лента (фаза 100): в стиле «просто и понятно» механика работы скрыта,
   но не удалена — пункт меню «Технические детали» возвращает её мгновенно. */
.chat-messages.feed-quiet .msg-tech { display: none; }
.chat-messages.feed-quiet .tool-group-toggle { display: none; }

/* ── Минимальная лента (фаза 170) ──────────────────────────────
   Люди жаловались, что поток «рассуждений» отвлекает от ответа. В минимуме
   остаются запрос, план, вопросы агента, статусы и ИТОГ; промежуточные
   реплики модели уходят вместе с инструментами. Итог — последняя реплика,
   она помечена .msg-final и поэтому переживает фильтр. */
.chat-messages.feed-minimal .msg-text:not(.msg-final):not(.msg-live) { display: none; }
.chat-messages.feed-minimal .tool-group-collapsed { display: none; }

/* Живая строка: одна строка вместо потока событий, обновляется на месте. */
.chat-live {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 14px;
  margin: 0 12px 6px;
  border-radius: var(--r-lg);
  background: var(--secondary-bg);
  color: var(--hint);
  font-size: var(--fs-md);
  line-height: 1.3;
}
.chat-live-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--link);
  flex: 0 0 auto;
  animation: chat-live-pulse 1.4s ease-in-out infinite;
}
.chat-live-what { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.chat-live-time { flex: 0 0 auto; opacity: 0.7; font-variant-numeric: tabular-nums; }
@keyframes chat-live-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.35; transform: scale(0.8); }
}
@media (prefers-reduced-motion: reduce) {
  .chat-live-dot { animation: none; }
}

/* «↓ К результату» — появляется, только если человек листал переписку в
   момент, когда агент договорил (тогда ленту ему не дёргают); «↓ Вниз» —
   лента отпущена и низ далеко (фаза 204). Якорь нулевой высоты: кнопка висит
   поверх низа ленты и раскладку не двигает. */
.chat-jump-anchor {
  position: relative;
  height: 0;
  flex: 0 0 auto;
  z-index: 6;
}
.chat-jump {
  position: absolute;
  left: 50%;
  bottom: 10px;
  transform: translateX(-50%);
  white-space: nowrap;
  padding: 7px 14px;
  border: none;
  border-radius: var(--r-pill);
  background: var(--link);
  color: #fff;
  font-size: var(--fs-md);
  font-weight: 500;
  cursor: pointer;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.18);
}
.chat-jump:active { transform: translateX(-50%) scale(0.97); }

/* ── Улучшатель промпта (фаза 102) ─────────────────────────────
   Кнопка ✨ рядом с полем ввода + модалка с редактируемым превью. */
.btn-improve:disabled { opacity: 0.35; cursor: default; }
.btn-improve:not(:disabled) { color: var(--link); }
.btn-improve.is-busy { opacity: 0.5; pointer-events: none; }

.improve-modal { max-width: 620px; display: flex; flex-direction: column; }
.imp-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.imp-title { margin: 0; font-size: var(--fs-2xl); font-weight: 600; }
.imp-close {
  flex-shrink: 0; width: 32px; height: 32px; border-radius: 50%;
  border: none; background: transparent; color: var(--hint);
  display: flex; align-items: center; justify-content: center; cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.imp-close:active { color: var(--text); }

.imp-body { margin-top: 14px; }

.imp-loading {
  display: flex; align-items: center; gap: 10px;
  color: var(--hint); font-size: var(--fs-lg); padding: 6px 0 12px;
}
.imp-spinner {
  width: 16px; height: 16px; flex-shrink: 0; border-radius: 50%;
  border: 2px solid rgba(127,127,127,0.25); border-top-color: var(--link);
  animation: imp-spin 0.7s linear infinite;
}
@keyframes imp-spin { to { transform: rotate(360deg); } }
.imp-orig-preview {
  font-size: var(--fs-md); line-height: 1.5; color: var(--hint);
  white-space: pre-wrap; word-break: break-word;
  max-height: 160px; overflow-y: auto;
  padding: 10px 12px; border-radius: var(--r-lg);
  background: var(--secondary-bg, rgba(127,127,127,0.06));
}

.imp-result {
  width: 100%; box-sizing: border-box;
  background: var(--secondary-bg, rgba(127,127,127,0.06));
  border: 1px solid var(--border); border-radius: var(--r-lg);
  color: var(--text); font-size: var(--fs-lg); font-family: inherit; line-height: 1.55;
  padding: 12px; resize: none; outline: none;
  min-height: 120px; max-height: 320px; overflow-y: auto;
}
.imp-result:focus { border-color: var(--accent-line); }

.imp-orig { margin-top: 12px; }
.imp-orig summary {
  cursor: pointer; font-size: var(--fs-md); color: var(--hint);
  list-style: none; padding: 4px 0;
}
.imp-orig summary::-webkit-details-marker { display: none; }
.imp-orig summary::before { content: '▸ '; }
.imp-orig[open] summary::before { content: '▾ '; }
.imp-orig-text {
  margin-top: 6px; font-size: var(--fs-md); line-height: 1.5; color: var(--hint);
  white-space: pre-wrap; word-break: break-word;
  max-height: 200px; overflow-y: auto;
  padding: 10px 12px; border-radius: var(--r-lg);
  background: var(--secondary-bg, rgba(127,127,127,0.06));
}

.imp-error { padding: 4px 0 8px; }
.imp-error-msg { font-size: var(--fs-lg); color: var(--destructive); line-height: 1.5; }
.imp-retry { width: auto; margin-top: 12px; padding: 8px 16px; }

@media (max-width: 960px) {
  /* На телефоне модалка прижата вниз: под большим пальцем и не прыгает,
     когда экранная клавиатура поднимается под редактируемым превью. */
  .improve-overlay { align-items: flex-end; padding: 0; }
  .improve-modal {
    border-radius: 16px 16px 0 0; border-bottom: none;
    max-height: calc(var(--vh) * 88); padding: 18px 16px calc(16px + env(safe-area-inset-bottom, 0px));
  }
  .imp-result { max-height: calc(var(--vh) * 40); }
}

/* Выходы из карточки вопроса (фаза 105): «Пропустить» — агент решает сам,
   «Стоп» — прекратить ран. Раньше единственной кнопкой была «Ответить», и
   вопрос оказывался тупиком: ни пропустить, ни остановить. */
.sdkq-skip,
.sdkq-stop {
  background: none;
  border: 1px solid color-mix(in srgb, var(--text) 28%, transparent);
  border-radius: var(--r-lg);
  /* Вровень с «Ответить»: у него 8px на десктопе и 11px на мобиле (медиа
     ниже). Минус 1px компенсирует рамку, которой у submit нет. */
  padding: 7px 13px;
  font-family: inherit;
  font-size: var(--fs-md);
  font-weight: 500;
  white-space: nowrap;
  flex-shrink: 0;
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s, color 0.15s;
  -webkit-tap-highlight-color: transparent;
}
.sdkq-skip { color: var(--text); opacity: 0.85; }
.sdkq-skip:hover { background: color-mix(in srgb, var(--text) 8%, transparent); opacity: 1; }
.sdkq-stop {
  color: color-mix(in srgb, var(--destructive) 82%, var(--text));
  border-color: color-mix(in srgb, var(--destructive) 55%, transparent);
}
.sdkq-stop:hover { background: color-mix(in srgb, var(--destructive) 12%, transparent); }

@media (max-width: 600px) {
  .sdkq-skip, .sdkq-stop { padding: 10px 11px; font-size: var(--fs-base); }
  /* На узком экране подсказка уезжает на свою строку, чтобы не выдавливать
     кнопки; на десктопе места хватает и лишний перенос не нужен. */
  .sdkq-hint { flex-basis: 100%; }
}

/* ── Поздний ответ на вопрос (фаза 106) ───────────────────────────────────
   Агент спросил, человек не успел — ран закрылся по таймауту. Вопрос не
   должен просто исчезать: показываем его текст и скруглённую кнопку
   «Ответить», которая открывает ту же карточку с вариантами. */

.uaq-banner {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  padding: 11px 12px 11px 14px;
  border-radius: var(--r-2xl);
  background: color-mix(in srgb, var(--link) 10%, var(--secondary-bg));
  /* 32% давали рамку 1.27:1 — граница баннера почти не читалась. */
  border: 1px solid color-mix(in srgb, var(--link) 48%, transparent);
}
.uaq-text { flex: 1; min-width: 0; }
.uaq-title {
  font-size: var(--fs-base);
  font-weight: 600;
  letter-spacing: 0.01em;
  color: color-mix(in srgb, var(--text) 70%, transparent);
}
.uaq-question {
  margin-top: 2px;
  white-space: pre-line;
  font-size: var(--fs-md);
  line-height: 1.35;
  color: var(--text);
  /* Длинный вопрос не должен растягивать панель на пол-экрана. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.uaq-btn {
  flex-shrink: 0;
  padding: 9px 18px;
  border: none;
  border-radius: var(--r-pill);          /* скруглённая, как просил владелец */
  background: var(--button);
  color: var(--button-text);
  font-family: inherit;
  font-size: var(--fs-md);
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
  transition: filter 0.15s, transform 0.1s;
  -webkit-tap-highlight-color: transparent;
}
/* Счётчик остальных вопросов пакета (фаза 135): в баннер помещается только
   первый, а их бывает до десяти — без этой пометки кнопка «Ответить» открывает
   неожиданно длинную карточку. */
.uaq-more {
  font-size: var(--fs-base);
  color: color-mix(in srgb, var(--text) 55%, transparent);
  white-space: nowrap;
}
.uaq-btn:hover { filter: brightness(1.1); }
.uaq-btn:active { transform: scale(0.97); }

/* То же в десктопной панели — там строка компактнее, поэтому подпись короче. */
.dl-ask-wait {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--link);
  white-space: nowrap;
}

/* Задачу закрыл КОЛЛЕГА (фаза 159, В4). Тон предупреждающий, а не тревожный:
   это не сбой, а чужое решение — но узнать о нём владелец обязан, иначе
   карточка для него просто исчезает из «Активных». */
.dl-resolved-by {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--warning);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 190px;
}
.agent-resolved-by {
  margin-top: 6px;
  padding: 4px 9px;
  display: inline-block;
  max-width: 100%;
  border-radius: var(--r-md);
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--warning);
  background: color-mix(in srgb, var(--warning) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--warning) 35%, transparent);
  overflow-wrap: anywhere;
}

/* Плашка на карточке ленты: агент встал на паузу и ждёт ответа (фаза 135).
   Без неё припаркованный агент неотличим от обычного завершённого. */
.agent-ask-wait {
  margin-top: 6px;
  padding: 4px 9px;
  display: inline-block;
  border-radius: var(--r-md);
  font-size: var(--fs-base);
  font-weight: 600;
  color: var(--link);
  background: color-mix(in srgb, var(--link) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--link) 35%, transparent);
}

@media (max-width: 600px) {
  .uaq-banner { padding: 10px; gap: 10px; }
  /* Три строки: на узком экране уже 80 символов вопроса резались до двух. */
  .uaq-question { font-size: var(--fs-md); -webkit-line-clamp: 3; }
  /* 33px были ниже комфортного тапа. */
  .uaq-btn { padding: 11px 15px; font-size: var(--fs-md); }
}

/* ── Постоянно работающие приложения (фаза 115.3) ──────────── */
.pe-apps-list { display: flex; flex-direction: column; gap: 8px; }
.pe-app-row { display: flex; align-items: flex-start; gap: 10px;
  padding: 8px 10px; border-radius: var(--radius-sm, 8px);
  background: var(--secondary-bg, var(--ov-04)); }
.pe-app-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.pe-app-title { font-size: var(--fs-lg); font-weight: 500; display: flex;
  align-items: center; gap: 8px; flex-wrap: wrap; }
/* Статус словами, а не цветной точкой: «падает — перезапуск остановлен»
   человек поймёт без легенды. */
.pe-app-state { font-size: var(--fs-sm); font-weight: 400; color: var(--hint); }
.pe-app-state.ok { color: var(--success); }
.pe-app-state.warn { color: var(--warning); }
.pe-app-state.bad { color: var(--destructive); }
.pe-app-cmd-text { font-size: var(--fs-base); color: var(--hint); overflow-wrap: anywhere; }
.pe-app-main .hint { font-size: var(--fs-base); color: var(--hint); }
.pe-apps-add { display: flex; gap: 8px; margin-top: 10px; align-items: center;
  flex-wrap: wrap; }
.pe-apps-add .btn-secondary { width: auto; margin-top: 0; flex: 0 0 auto; }
.pe-app-name { flex: 1 1 32%; min-width: 0; }
.pe-app-cmd { flex: 1 1 40%; min-width: 0; }
@media (max-width: 430px) {
  .pe-apps-add .pe-app-cmd { flex: 1 1 100%; order: 3; }
}

/* Галка «это сайт» в форме приложения (фаза 116Б) */
.pe-app-web-row { display: flex; align-items: flex-start; gap: 8px; margin-top: 8px;
  font-size: var(--fs-md); }
.pe-app-web-row input { margin-top: 2px; flex: 0 0 auto; }

/* Кому виден сайт (фаза 151.1): в форме и в карточке приложения */
.pe-app-access-row { display: flex; align-items: center; gap: 8px; margin-top: 6px;
  font-size: var(--fs-md); }
.pe-app-access { font: inherit; font-size: var(--fs-md); padding: 4px 8px; border-radius: var(--r-md);
  border: 1px solid var(--border, rgba(128,128,128,.35)); background: var(--bg-secondary, transparent);
  color: inherit; flex: 1 1 auto; min-width: 0; max-width: 360px; }
/* В карточке строка доступа идёт под названием и кнопками, на всю ширину */
.pe-app-row { flex-wrap: wrap; }
.pe-app-row > .pe-app-access-row { flex: 1 1 100%; margin-top: 2px; }

/* ══════════════════════════════════════════════════════════════════
 * Вопрос агента в ленте (фаза 118)
 *
 * Было: событие вопроса уезжало в ленту тем же plain-текстом, что и в
 * Telegram, а правила white-space у .msg-question не существовало —
 * восемь вопросов с тридцатью двумя вариантами схлопывались в один
 * абзац. Теперь в ленту едет структурная карточка (.qsum), а сам
 * вопрос человек отвечает карточкой .sdkq-card прямо в потоке чата.
 * ══════════════════════════════════════════════════════════════════ */

/* Исторические события (до 118) остались абзацем с \n — чиним их тем же
   правилом; внутри новой карточки перенос возвращаем в normal. */
.chat-messages .msg-question { white-space: pre-line; }
.chat-messages .msg-question .qsum { white-space: normal; }

.qsum {
  border: 1px solid var(--ov-12);
  border-radius: var(--r-2xl);
  background: var(--ov-04);
  overflow: hidden;
}
.qsum-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 12px;
  font-size: var(--fs-md);
  border-bottom: 1px solid var(--ov-06);
}
.qsum-head b { font-weight: 600; }
.qsum-ic { font-size: var(--fs-md); line-height: 1; }
.qsum-n { margin-left: auto; font-size: var(--fs-base); color: var(--hint); }
.qsum-list { display: flex; flex-direction: column; gap: 10px; padding: 10px 12px; }
.qsum-row {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding-left: 10px;
  border-left: 2px solid var(--ov-12);
}
.qsum-topic {
  font-size: var(--fs-xs);
  font-weight: 700;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: var(--link);
}
.qsum-q { font-size: var(--fs-md); color: var(--hint); line-height: 1.4; }
.qsum-a { font-size: var(--fs-md); line-height: 1.4; }
.qsum-a::before { content: '→ '; color: var(--link); }
.qsum-a.qsum-wait, .qsum-a.qsum-none { color: var(--hint); font-style: italic; }
.qsum[data-qsum-state="answered"] .qsum-row { border-left-color: color-mix(in srgb, var(--success) 55%, transparent); }
.qsum[data-qsum-state="timeout"] .qsum-row { border-left-color: color-mix(in srgb, var(--warning) 45%, transparent); }

/* ── Вопрос агента на месте поля ввода (фаза 202) ───────────────── */
/* Как в нативном клиенте: карточка стоит там, где обычно поле ввода, и
   видна при любой прокрутке переписки. Прокручивается сам док, а не
   карточка: карточку перерисовывает каждый клик по варианту, и её
   собственная прокрутка сбрасывалась бы наверх (ревью). */
.ask-dock {
  flex-shrink: 0;
  max-height: calc(var(--dvh) * 60);
  overflow-y: auto;
  overscroll-behavior: contain;
  /* Снизу без отступа: липкие кнопки встают на край области прокрутки
     С УЧЁТОМ паддинга, и в щели под ними просвечивали бы варианты. */
  padding: 6px 12px 0;
  margin-bottom: 8px;
}
.ask-dock[hidden] { display: none !important; }
#ask-dock .sdkq-card {
  max-height: none;
  /* clip, а не hidden: обрезает липкие кнопки по скруглению и не делает
     карточку прокручиваемой — иначе sticky прилип бы к ней, а не к доку. */
  overflow: clip;
  border-color: color-mix(in srgb, var(--link) 32%, transparent);
  box-shadow: 0 -4px 18px var(--sh-soft);
}
/* Кнопки ответа прибиты к низу дока; углы прямые — у прилипших посреди
   карточки скругление открывало бы текст вариантов. */
#ask-dock .sdkq-footer {
  position: sticky;
  bottom: 0;
  z-index: 1;
  margin: 0 -14px -12px;
  padding: 10px 14px 12px;
  background: var(--secondary-bg);
  border-top: 1px solid color-mix(in srgb, var(--text) 12%, transparent);
}
/* Футер липкий и при наборе в «Другое…»: пока он становился static на
   фокусе, blur на mousedown по «Далее» возвращал sticky, кнопка прыгала
   из-под курсора и первый клик терялся (25.09). Поле над кнопками держит
   _askRevealField. */
/* Поле ввода на время вопроса уходит — на его месте карточка. Селектор от
   #screen-chat: _mountComposer переносит панель ввода на главную, там
   правило не действует. Панель остаётся ради отступа под таб-бар. */
#screen-chat > #chat-input-bar.ask-docked #chat-input-wrapper { display: none; }
#screen-chat > #chat-input-bar.ask-docked { padding-top: 0; }
@media (max-width: 959px) {
  /* Баннер приглашений в чате стоит над полем ввода — накрыл бы вопрос. */
  body[data-screen="chat"]:has(#ask-dock:not([hidden])) #global-banners { display: none; }
}
@media (min-width: 961px) {
  .ask-dock { max-height: calc(var(--dvh) * 70); }
}

/* «Ответить своими словами» — как «Chat about this»: отдельно от вариантов. */
.sdkq-words {
  margin-top: 6px;
  /* Снизу тоже поле: ссылка стояла вплотную к рамке блока кнопок (202.9). */
  padding: 12px 2px 6px;
  border: none;
  border-top: 1px solid color-mix(in srgb, var(--text) 12%, transparent);
  background: none;
  color: var(--link);
  font-family: inherit;
  font-size: var(--fs-md);
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.sdkq-words:hover { text-decoration: underline; }

/* Свёрнутый вопрос, пока человек пишет ответ своими словами. */
.ask-words {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 12px;
  border: 1px solid color-mix(in srgb, var(--link) 32%, transparent);
  border-radius: var(--r-xl);
  background: var(--secondary-bg);
}
.ask-words-text { flex: 1; min-width: 0; }
.ask-words-ttl { font-size: var(--fs-sm); color: var(--hint); }
.ask-words-q {
  font-size: var(--fs-md);
  line-height: 1.35;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.ask-words-more { color: var(--hint); }
.ask-words-back {
  flex-shrink: 0;
  border: none;
  background: none;
  color: var(--link);
  font-family: inherit;
  font-size: var(--fs-md);
  cursor: pointer;
  white-space: nowrap;
}

/* Клавиши на компьютере (фаза 202): номер у варианта и строка подсказки. */
.sdkq-key {
  flex-shrink: 0;
  margin-left: auto;
  align-self: center;
  min-width: 20px;
  height: 20px;
  padding: 0 5px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid color-mix(in srgb, var(--text) 18%, transparent);
  border-radius: 5px;
  font-size: 11px;
  font-variant-numeric: tabular-nums;
  color: var(--hint);
}
.sdkq-keys { font-size: 11.5px; color: var(--hint); text-align: center; }
.sdkq-opt:focus-visible, .sdkq-review-row:focus-visible, .sdkq-words:focus-visible {
  outline: 2px solid var(--link);
  outline-offset: 1px;
}

/* Экран проверки перед отправкой («Review your answers» в нативном). */
.sdkq-review { display: flex; flex-direction: column; gap: 6px; }
.sdkq-review-warn {
  font-size: var(--fs-sm);
  color: color-mix(in srgb, var(--warning) 80%, var(--text));
}
.sdkq-review-row {
  display: flex;
  flex-direction: column;
  gap: 2px;
  width: 100%;
  padding: 8px 12px;
  text-align: left;
  border: 1px solid color-mix(in srgb, var(--text) 13%, transparent);
  border-radius: var(--r-lg);
  background: transparent;
  color: var(--text);
  font-family: inherit;
  cursor: pointer;
  overflow-wrap: anywhere;
}
.sdkq-review-row:hover { border-color: var(--accent-line); background: var(--accent-bg); }
.sdkq-review-q { font-size: 13px; color: var(--hint); line-height: 1.35; }
.sdkq-review-a { font-size: 15px; line-height: 1.4; font-weight: 600; }
.sdkq-review-row.empty .sdkq-review-a { color: var(--hint); font-style: italic; }
.sdkq-review-row.empty { border-style: dashed; }

.sdkq-top { display: flex; align-items: center; gap: 8px; }
.sdkq-top-ttl {
  font-size: var(--fs-base);
  font-weight: 500;
  color: var(--hint);
  letter-spacing: 0.2px;
}
/* Метки темы (.sdkq-topic) больше нет: она дублировала активный чип. */
#ask-dock .sdkq-question { font-size: 15.5px; line-height: 1.42; letter-spacing: -0.1px; margin-top: 2px; }
.sdkq-opt-rec {
  /* inline-block внутри колоночного flex растягивался во всю ширину карточки
     зелёной полосой — бейджу нужен свой размер (визуальная проверка 118). */
  display: inline-flex;
  align-self: flex-start;
  width: fit-content;
  font-size: var(--fs-xs);
  font-weight: 700;
  letter-spacing: 0.4px;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--success) 80%, var(--text));
  background: color-mix(in srgb, var(--success) 16%, transparent);
  border-radius: var(--r-xs);
  padding: 2px 6px;
  margin-bottom: 3px;
}
/* Рекомендованный вариант выделяет только бейдж: жирная подпись сверху
   делала его вторым заголовком. */
.sdkq-opt.rec { border-color: color-mix(in srgb, var(--success) 30%, transparent); }

/* Неактивная главная кнопка: градиент под opacity превращался в блёклое
   пятно с нечитаемой подписью — пока ответа нет, она просто нейтральная. */
#ask-dock .sdkq-submit:disabled {
  background: var(--ov-08);
  color: var(--hint);
  opacity: 1;
}
.sdkq-accept {
  font-family: inherit;
  font-weight: 500;
  color: var(--link);   /* цвет бейджа «совет агента», а не зелёный --success */
  cursor: pointer;
  border-radius: var(--r-md);
  -webkit-tap-highlight-color: transparent;
}
.sdkq-accept:hover { background: var(--accent-bg); }
.sdkq-accept[hidden] { display: none; }
.sdkq-sent {
  padding: 12px;
  text-align: center;
  font-size: var(--fs-md);
  color: var(--hint);
}

/* «❓ Ожидает ответа» отдельной строкой ленты — тот же вопрос третьим
   голосом: рядом стоит карточка, а после ответа строка ей прямо
   противоречила («Вы ответили» / «Ожидает ответа»). Прячем в обоих путях
   сразу — и в живом потоке, и в истории при перезагрузке. */
.chat-messages .msg-waiting_input { display: none; }

/* Пока висит живая карточка, сводка «ждёт ответа» — это тот самый дубль,
   ради которого всё затевалось: прячем её, пока на вопрос не ответили. */
.chat-messages.has-live-ask .msg-question .qsum[data-qsum-state="pending"] { display: none; }


@media (max-width: 480px) {
  #ask-dock .sdkq-card { padding: 12px 13px; }
  #ask-dock .sdkq-footer { margin: 0 -13px -12px; padding: 10px 13px 12px; }
  /* Поля те же 12px, что у живой строки и поля ввода: при 8px карточка
     торчала за их край на 4px с каждой стороны. */
  .ask-dock { margin-bottom: 6px; }
  .qsum-list { padding: 9px 11px; }
}

/* ── Гейт платных моделей (фаза 165) ─────────────────────────── */
/* Замок на чипе модели: сама кнопка остаётся кликабельной — клик открывает
   заявку, а не «ничего не происходит» (иначе человек думает, что сломалось). */
.nt-chip.model-locked, .cmd-row.model-locked { opacity: 0.72; }
/* Замок и остаток пакета рисуются текстом внутри кнопки (не ::after): чипы
   перерисовываются из JS, и разметка честнее псевдоэлемента. */
.model-lock-badge { font-size: var(--fs-sm); margin-left: 5px; }
.model-runs-left { font-size: var(--fs-sm); opacity: 0.95; margin-left: 5px; font-weight: 600; }

.modal-head { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-bottom: 12px; }
.modal-head h3 { margin: 0; font-size: var(--fs-2xl); }
.modal-text { margin: 0 0 12px; font-size: var(--fs-lg); line-height: 1.5; color: var(--text); }
.modal-textarea { width: 100%; box-sizing: border-box; padding: 10px 12px;
  border-radius: var(--r-lg); border: 1px solid var(--border); background: var(--bg-secondary);
  color: var(--text); font-size: var(--fs-lg); font-family: inherit; resize: vertical; }
.modal-note { margin-top: 10px; padding: 9px 12px; border-radius: var(--r-lg);
  background: rgba(120,160,255,0.10); font-size: var(--fs-md); line-height: 1.45; }

/* Карточка заявки на модель — на базе .access-card, но со счётчиком запусков. */
.model-req-runs { display: flex; gap: 6px; align-items: center; margin-top: 8px; }
.model-req-runs .runs-chip { padding: 5px 11px; border-radius: var(--r-pill); cursor: pointer;
  border: 1px solid var(--border); background: transparent; color: var(--text); font-size: var(--fs-md); }
.model-req-runs .runs-chip.active { background: var(--link); color: #fff;
  border-color: transparent; }
.model-req-reason { margin-top: 6px; font-size: var(--fs-md); opacity: 0.85; font-style: italic; }

/* Часовой пояс в настройках (фаза 175). Отдельного стиля для select в
   настройках не было — берём тот же вид, что у полей формы проекта. */
.st-select {
  width: 100%; padding: 9px 10px; border-radius: var(--r-lg);
  border: 1px solid var(--border); background: var(--bg-secondary);
  color: var(--text); font-size: var(--fs-lg); cursor: pointer;
}
.st-tz-now { font-variant-numeric: tabular-nums; }

/* Вход по логину и паролю в настройках (фаза 178) */
.st-pwd-form { display: flex; flex-direction: column; gap: 8px; }
.st-pwd-form input {
  padding: 10px 12px;
  border-radius: var(--r-md);
  border: 1px solid var(--border);
  background: var(--bg-secondary);
  color: var(--text);
  font-size: var(--fs-lg);
}
.st-pwd-form input[readonly] { opacity: .65; }

/* ═══════════════════════════════════════════════════════════════════════
 * Схемы и графики в реплике агента (фаза 185; 185.3 — стиль, анимации,
 * посадка без прокрутки, полноэкранный вид)
 * Блок ```mermaid → SVG-схема, ```chart → график. Цвета и размеры берутся
 * из токенов фазы 184, поэтому схема выглядит частью интерфейса в обеих
 * темах и переживает масштаб (фаза 169).
 * ═══════════════════════════════════════════════════════════════════════ */

.dgm {
  position: relative;
  margin: var(--sp-5) 0;
  padding: var(--sp-5);
  background: var(--secondary-bg);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  overflow: hidden;
}

/* Холст. Содержимое НИКОГДА не прокручивается внутри чата: рисунок
 * вписывается по месту (fitInto в diagrams.js), детали смотрят во весь экран.
 * Размер svg ставит JS явно, поэтому здесь ни width, ни height: auto — CSS
 * перебил бы посадку. flex-shrink: 0 обязателен: флекс-контейнер иначе ужимал
 * бы сам рисунок. Внутренние поля (8px) учтены в FRAME_PAD модуля. */
.dgm-canvas {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  padding: var(--sp-4);
  overflow: hidden;
  border-radius: var(--r-md);
  cursor: zoom-in;
}
.dgm-canvas svg { display: block; max-width: 100%; flex-shrink: 0; }
/* Схема ужата больше чем в полтора раза (gantt на телефоне): подсказываем,
 * что детали — во весь экран. Клик по подписи идёт в холст. */
.dgm-canvas { position: relative; }
.dgm-tiny .dgm-canvas::after {
  content: 'открыть крупнее ⤢';
  position: absolute;
  right: var(--sp-3);
  bottom: var(--sp-3);
  padding: var(--sp-1) var(--sp-4);
  background: var(--accent-bg-strong);
  color: var(--link);
  border-radius: var(--r-pill);
  font-size: var(--fs-xs);
  pointer-events: none;
}

/* Точечный холст под схемой — «миллиметровка» интерфейса. Только у схем:
 * у графика своя сетка, и точки спорили бы с ней. */
.dgm-mermaid .dgm-canvas {
  background-image: radial-gradient(var(--border) 1px, transparent 1.4px);
  background-size: 18px 18px;
  background-position: center;
}

/* ── Стиль схем mermaid. Цвета приходят из темы (themeVariables в модуле),
 * скругления — атрибутами (уезжают в файл). Здесь — то, что mermaid задаёт
 * своим <style> внутри svg по id диаграммы: его специфичность выше любого
 * нашего правила по классу, поэтому !important обязателен. */
.dgm-mermaid .node rect, .dgm-mermaid .node polygon, .dgm-mermaid .node circle,
.dgm-mermaid .node path, .dgm-mermaid rect.actor, .dgm-mermaid rect.actor-top,
.dgm-mermaid rect.actor-bottom, .dgm-mermaid rect.note,
.dgm-mermaid .statediagram-state rect, .dgm-mermaid .classGroup rect {
  stroke-width: 1.25px !important;
  transition: stroke-width .12s ease;
}
.dgm-mermaid .node:hover rect, .dgm-mermaid .node:hover polygon,
.dgm-mermaid .node:hover circle, .dgm-mermaid .node:hover path { stroke-width: 2px !important; }
.dgm-mermaid path.flowchart-link, .dgm-mermaid path.transition, .dgm-mermaid path.relation,
.dgm-mermaid path.relationshipLine, .dgm-mermaid .messageLine0, .dgm-mermaid .messageLine1,
.dgm-mermaid line.loopLine {
  stroke-width: 1.6px !important;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.dgm-mermaid .cluster rect { stroke-dasharray: 4 4 !important; stroke-width: 1px !important; }
.dgm-mermaid .edgeLabel text { font-size: 12px; }
.dgm-mermaid rect.task { stroke-width: 0 !important; }

/* Подписи, которые mermaid рисует ПОВЕРХ собственных заливок. Их фон он
 * задаёт сам и не всегда из темы: у секции journey плашка жёстко прибита к
 * #191970, а проценты круговой диаграммы вылетают за пределы сектора на фон
 * карточки. Ни один одиночный цвет текста не читается в обоих случаях
 * (контраст был 1.00 и 1.09), поэтому подписи получают обводку цветом фона:
 * paint-order рисует её ПОД глифом, и текст остаётся читаемым на чём угодно. */
.dgm-mermaid text.journey-section,
.dgm-mermaid text.slice,
.dgm-viewer text.journey-section,
.dgm-viewer text.slice {
  fill: var(--text) !important;
  stroke: var(--bg) !important;
  stroke-width: 3px;
  paint-order: stroke;
  stroke-linejoin: round;
}

/* ── Графики: отклик на наведение. Transform для марок занят анимацией
 * (её конечное состояние держится и после конца), поэтому подсветка идёт
 * через filter и геометрию. */
.dgm-mark-bar { transition: filter .12s ease; }
.dgm-mark-bar:hover { filter: brightness(1.15); }
.dgm-slice { transition: stroke-width .15s ease; }
.dgm-slice:hover { stroke-width: calc(var(--sw, 40) * 1px + 6px); }
.dgm-dot { transition: r .12s ease; }
.dgm-dot:hover { r: 6px; }

/* ── Анимации. Стартуют, когда карточка попадает в кадр (класс dgm-anim
 * ставит IntersectionObserver), до этого холст спрятан (dgm-pending):
 * история чата рисуется целиком за один проход, и без этого десять схем
 * отыграли бы появление хором за экраном. dgm-still — перерисовка без
 * анимации (смена темы, ширины). Рёбра и линия прорисовываются штрихом на
 * всю длину, который стягивается к нулю; длину ставит JS. */
.dgm-pending .dgm-canvas { opacity: 0; }
@keyframes dgm-in   { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@keyframes dgm-pop  { from { opacity: 0; transform: scale(.92); } to { opacity: 1; transform: none; } }
@keyframes dgm-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes dgm-draw { to { stroke-dashoffset: 0; } }
@keyframes dgm-grow { from { transform: scaleY(0); } to { transform: none; } }
@keyframes dgm-sweep { from { stroke-dasharray: 0 var(--c); } to { stroke-dasharray: var(--len) var(--c); } }

.dgm-anim .dgm-canvas { animation: dgm-in .32s cubic-bezier(.2, .8, .2, 1) both; }
/* Узлу — только прозрачность: mermaid позиционирует g.node АТРИБУТОМ
 * transform="translate(…)", а CSS-свойство transform из анимации его
 * перебивает — узлы собирались в начале координат и оставались там после
 * конца анимации (fill-mode держит конечное transform: none). «Всплывает»
 * фигура внутри: у rect/circle координаты в x/y, transform у них нет. */
.dgm-anim .dgm-node {
  animation: dgm-fade .42s ease both;
  animation-delay: calc(80ms + var(--i, 0) * 45ms);
}
.dgm-anim g.node.dgm-node > rect, .dgm-anim g.node.dgm-node > circle,
.dgm-anim g.node.dgm-node > ellipse {
  transform-box: fill-box;
  transform-origin: center;
  animation: dgm-pop .42s cubic-bezier(.2, .8, .2, 1) both;
  animation-delay: calc(80ms + var(--i, 0) * 45ms);
}
.dgm-anim .dgm-edge {
  animation: dgm-draw .55s ease-out both;
  animation-delay: calc(200ms + var(--i, 0) * 40ms);
}
.dgm-anim marker path, .dgm-anim marker polygon, .dgm-anim marker circle {
  animation: dgm-fade .25s ease both;
  animation-delay: .5s;
}
.dgm-anim .dgm-grid, .dgm-anim .dgm-ttl { animation: dgm-fade .4s ease both; }
.dgm-anim .dgm-mark-bar {
  transform-box: fill-box;
  transform-origin: 50% 100%;
  animation: dgm-grow .55s cubic-bezier(.2, .8, .2, 1) both;
  animation-delay: calc(60ms + var(--i, 0) * 28ms);
}
.dgm-anim .dgm-mark-bar-neg { transform-origin: 50% 0%; }
.dgm-anim .dgm-val {
  animation: dgm-fade .3s ease both;
  animation-delay: calc(360ms + var(--i, 0) * 28ms);
}
.dgm-anim .dgm-line {
  animation: dgm-draw .9s ease-out both;
  animation-delay: calc(var(--i, 0) * 150ms);
}
.dgm-anim .dgm-dot {
  transform-box: fill-box;
  transform-origin: center;
  animation: dgm-pop .28s cubic-bezier(.2, .8, .2, 1) both;
  animation-delay: calc(250ms + var(--i, 0) * 22ms);
}
.dgm-anim .dgm-slice {
  animation: dgm-sweep calc(var(--f, 1) * 900ms) linear both;
  animation-delay: calc(120ms + var(--a, 0) * 900ms);
}
.dgm-anim .dgm-total { animation: dgm-fade .35s ease both; animation-delay: .95s; }
.dgm-anim .dgm-leg {
  animation: dgm-fade .3s ease both;
  animation-delay: calc(300ms + var(--i, 0) * 60ms);
}
.dgm-still, .dgm-still * { animation: none !important; }

/* ── Анимация процесса (185.4): поток по рёбрам, состояние узла, сценарий.
 * Крутится только пока схема в кадре (класс dgm-live ставит наблюдатель) —
 * и во вьюере. Штрих потока — АТРИБУТОМ через класс, а не inline: mermaid
 * кладёт свой `edge-animation-*` с !important в <style> внутри svg, поэтому
 * и здесь !important, иначе штатный `animate: true` перебил бы наш темп. */
@keyframes dgm-flow { to { stroke-dashoffset: -28; } }
@keyframes dgm-pulse {
  0%, 100% { stroke-width: 1.5px; filter: drop-shadow(0 0 0 transparent); }
  50% { stroke-width: 2.5px; filter: drop-shadow(0 0 6px var(--link)); }
}
@keyframes dgm-blink { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
.dgm-flow {
  stroke-dasharray: 8 6 !important;
  stroke-dashoffset: 0;
  stroke-linecap: round !important;
}
.dgm-live .dgm-flow, .dgm-viewer.dgm-live .dgm-flow {
  animation: dgm-flow 1.1s linear infinite !important;
}
/* Состояние узла — по классам из исходника (`:::active` и т. д.). Цвета из
 * токенов, поэтому читаются в обеих темах; !important — против <style>
 * mermaid по id диаграммы. */
g.node.active > rect,
g.node.active :not(.label) > rect,
g.node.active > polygon,
g.node.active :not(.label) > polygon,
g.node.active > circle,
g.node.active :not(.label) > circle,
g.node.active > path,
g.node.active :not(.label) > path,
g.node.active > ellipse,
g.node.active :not(.label) > ellipse {
  stroke: var(--link) !important;
  fill: var(--accent-bg-strong) !important;
}
.dgm-live g.node.active > rect,
.dgm-live g.node.active :not(.label) > rect,
.dgm-live g.node.active > polygon,
.dgm-live g.node.active :not(.label) > polygon,
.dgm-live g.node.active > circle,
.dgm-live g.node.active :not(.label) > circle,
.dgm-live g.node.active > path,
.dgm-live g.node.active :not(.label) > path,
.dgm-live g.node.active > ellipse,
.dgm-live g.node.active :not(.label) > ellipse {
  animation: dgm-pulse 1.4s ease-in-out infinite !important;
}
g.node.done > rect,
g.node.done :not(.label) > rect,
g.node.done > polygon,
g.node.done :not(.label) > polygon,
g.node.done > circle,
g.node.done :not(.label) > circle,
g.node.done > path,
g.node.done :not(.label) > path,
g.node.done > ellipse,
g.node.done :not(.label) > ellipse {
  stroke: var(--success) !important;
  fill: var(--success-bg) !important;
}
g.node.error > rect,
g.node.error :not(.label) > rect,
g.node.error > polygon,
g.node.error :not(.label) > polygon,
g.node.error > circle,
g.node.error :not(.label) > circle,
g.node.error > path,
g.node.error :not(.label) > path,
g.node.error > ellipse,
g.node.error :not(.label) > ellipse {
  stroke: var(--destructive) !important;
  fill: var(--danger-bg) !important;
}
.dgm-live g.node.error > rect,
.dgm-live g.node.error :not(.label) > rect,
.dgm-live g.node.error > polygon,
.dgm-live g.node.error :not(.label) > polygon,
.dgm-live g.node.error > circle,
.dgm-live g.node.error :not(.label) > circle,
.dgm-live g.node.error > path,
.dgm-live g.node.error :not(.label) > path {
  animation: dgm-blink 1s ease-in-out infinite !important;
}
g.node.wait > rect,
g.node.wait :not(.label) > rect,
g.node.wait > polygon,
g.node.wait :not(.label) > polygon,
g.node.wait > circle,
g.node.wait :not(.label) > circle,
g.node.wait > path,
g.node.wait :not(.label) > path,
g.node.wait > ellipse,
g.node.wait :not(.label) > ellipse {
  stroke: var(--warning) !important;
  fill: var(--warning-bg) !important;
  stroke-dasharray: 4 3 !important;
}
/* Сценарий: текущий шаг светится, пройденные — отмечены, остальные приглушены.
 * Приглушаем opacity на g.node/path — transform у них не трогаем (см. выше). */
.dgm-playing g.node:not(.dgm-play-on):not(.dgm-play-done) { opacity: .45; }
.dgm-playing path.flowchart-link:not(.dgm-play-on):not(.dgm-play-done),
.dgm-playing path.transition:not(.dgm-play-on):not(.dgm-play-done) { opacity: .35; }
.dgm-playing g.node, .dgm-playing path.flowchart-link, .dgm-playing path.transition {
  transition: opacity .3s ease;
}
g.node.dgm-play-on > rect, g.node.dgm-play-on > polygon, g.node.dgm-play-on > circle,
g.node.dgm-play-on > path, g.node.dgm-play-on > ellipse,
g.node.dgm-play-on :not(.label) > rect, g.node.dgm-play-on :not(.label) > polygon,
g.node.dgm-play-on :not(.label) > circle, g.node.dgm-play-on :not(.label) > path {
  stroke: var(--link) !important;
  fill: var(--accent-bg-strong) !important;
}
.dgm-live g.node.dgm-play-on > rect, .dgm-live g.node.dgm-play-on > polygon,
.dgm-live g.node.dgm-play-on > circle, .dgm-live g.node.dgm-play-on > path,
.dgm-live g.node.dgm-play-on > ellipse {
  animation: dgm-pulse 1.2s ease-in-out infinite !important;
}
g.node.dgm-play-done > rect, g.node.dgm-play-done > polygon, g.node.dgm-play-done > circle,
g.node.dgm-play-done > path, g.node.dgm-play-done :not(.label) > rect, g.node.dgm-play-done :not(.label) > polygon,
g.node.dgm-play-done :not(.label) > circle, g.node.dgm-play-done :not(.label) > path {
  stroke: var(--success) !important;
  fill: var(--success-bg) !important;
}
path.dgm-play-on {
  stroke: var(--link) !important;
  stroke-width: 2.4px !important;
  stroke-dasharray: 8 6 !important;
  animation: dgm-flow .8s linear infinite !important;
}
path.dgm-play-done { stroke: var(--success) !important; stroke-dasharray: none !important; }
.dgm-play-btn.active, .dgm-playing .dgm-play-btn { background: var(--accent-bg-strong); color: var(--link); }

@media (prefers-reduced-motion: reduce) {
  .dgm, .dgm *, .dgm-viewer, .dgm-viewer * { animation: none !important; transition: none !important; }
  .dgm-pending .dgm-canvas { opacity: 1; }
  /* Настройку могли включить ПОСЛЕ отрисовки: inline-штрих на рёбрах уже
   * стоит, анимации нет — без этого правила все рёбра пропадали (16/16). */
  .dgm-edge, .dgm-line { stroke-dasharray: none !important; stroke-dashoffset: 0 !important; }
  /* Поток и пульс без движения: штрих остаётся как знак направления. Правила
   * ниже — с !important и большей специфичностью, поэтому общее
   * `.dgm * {animation:none}` их не берёт: гасим адресно. */
  .dgm-playing g.node, .dgm-playing path { opacity: 1 !important; }
  .dgm-live .dgm-flow, .dgm-viewer.dgm-live .dgm-flow, path.dgm-play-on,
  .dgm-live g.node.active > rect, .dgm-live g.node.active > polygon,
  .dgm-live g.node.active > circle, .dgm-live g.node.active > path,
  .dgm-live g.node.error > rect, .dgm-live g.node.error > polygon,
  .dgm-live g.node.error > circle, .dgm-live g.node.error > path,
  g.node.dgm-play-on > rect, g.node.dgm-play-on > polygon, g.node.dgm-play-on > circle,
  g.node.dgm-play-on > path { animation: none !important; }
}

.dgm-loading {
  padding: var(--sp-6) 0;
  text-align: center;
  color: var(--hint);
  font-size: var(--fs-md);
}

/* Панель действий: появляется на наведение, на узких экранах видна всегда
 * (наведения там нет, и кнопки иначе недостижимы). */
.dgm-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
  margin-top: var(--sp-4);
  opacity: 0;
  transition: opacity .15s ease;
}
.dgm:hover .dgm-bar, .dgm:focus-within .dgm-bar { opacity: 1; }
@media (hover: none) { .dgm-bar { opacity: 1; } }

.dgm-title {
  font-size: var(--fs-md);
  color: var(--hint);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.dgm-bar-btns { display: flex; gap: var(--sp-2); margin-left: auto; flex-shrink: 0; }

.dgm-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  background: var(--ov-06);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  color: var(--text);
  cursor: pointer;
  transition: background .15s ease, color .15s ease;
}
.dgm-btn:hover { background: var(--accent-bg-strong); }
.dgm-btn.active { background: var(--accent-bg-strong); color: var(--link); }

/* Неразобранная схема: причина + исходник. Прятать нельзя — модель считает,
 * что показала схему, и человек должен видеть, что именно сломалось. */
.dgm-failed { border-color: var(--warning-line); background: var(--warning-bg); }
.dgm-fail-head {
  margin-bottom: var(--sp-4);
  color: var(--warning);
  font-size: var(--fs-md);
  font-weight: 500;
}
.dgm-fail-src, .dgm-src {
  margin: var(--sp-4) 0 0;
  padding: var(--sp-4);
  max-height: 320px;
  overflow: auto;
  background: var(--sunk-20);
  border-radius: var(--r-sm);
  font-size: var(--fs-base);
  white-space: pre-wrap;
  word-break: break-word;
}

/* Вид таблицей — «подстраховка» к палитре: три её слота в светлой теме не
 * дотягивают до 3:1 на белом, и читаемость держат подписи и эта таблица. */
.dgm-table-wrap { margin-top: var(--sp-4); overflow-x: auto; }
.dgm-table { width: 100%; border-collapse: collapse; font-size: var(--fs-base); }
.dgm-table th, .dgm-table td {
  padding: var(--sp-3) var(--sp-4);
  border-bottom: 1px solid var(--border);
  text-align: right;
  white-space: nowrap;
}
.dgm-table th:first-child, .dgm-table td:first-child { text-align: left; }
.dgm-table thead th { color: var(--hint); font-weight: 500; }

/* ── Полноэкранный просмотр ─────────────────────────────────────────── */

/* z-index выше всех слоёв приложения: боковая панель превью 8800, лайтбокс
 * вложений 9000, тосты 999. На 1200 вьюер оказывался ПОД панелью. */
.dgm-viewer {
  position: fixed;
  inset: 0;
  z-index: 9500;
  visibility: hidden;
  opacity: 0;
  transition: opacity .18s ease, visibility 0s linear .18s;
}
.dgm-viewer.open { visibility: visible; opacity: 1; transition: opacity .18s ease; }
/* Пока вьюер гаснет (180мс), он ещё видим для hit-test и глотал клик по
 * следующей схеме — вторая не открывалась. Закрытый — прозрачен для событий. */
.dgm-viewer:not(.open) { pointer-events: none; }
.dgm-viewer-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, .72); }
/* Отступы панели считают и вырезы экрана, и шапку Telegram Mini App
 * (--tg-content-safe-area-inset-* ставит сам Telegram) — иначе кнопка
 * «закрыть» уходила под элементы Telegram. */
.dgm-viewer-panel {
  position: absolute;
  top: max(var(--sp-3), env(safe-area-inset-top, 0px), var(--tg-content-safe-area-inset-top, 0px));
  right: max(var(--sp-3), env(safe-area-inset-right, 0px));
  bottom: max(var(--sp-3), env(safe-area-inset-bottom, 0px), var(--tg-content-safe-area-inset-bottom, 0px));
  left: max(var(--sp-3), env(safe-area-inset-left, 0px));
  display: flex;
  flex-direction: column;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-2xl);
  box-shadow: 0 24px 64px var(--sh-strong);
  overflow: hidden;
  transform: scale(.97);
  transition: transform .2s cubic-bezier(.2, .8, .2, 1);
}
.dgm-viewer.open .dgm-viewer-panel { transform: none; }
@media (min-width: 960px) {
  .dgm-viewer-panel {
    top: max(var(--sp-5), env(safe-area-inset-top, 0px), var(--tg-content-safe-area-inset-top, 0px));
    right: max(var(--sp-5), env(safe-area-inset-right, 0px));
    bottom: max(var(--sp-5), env(safe-area-inset-bottom, 0px), var(--tg-content-safe-area-inset-bottom, 0px));
    left: max(var(--sp-5), env(safe-area-inset-left, 0px));
  }
}
.dgm-viewer-head {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-4) var(--sp-5);
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.dgm-viewer-title {
  font-size: var(--fs-lg);
  font-weight: 500;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.dgm-viewer-tools { display: flex; align-items: center; gap: var(--sp-2); margin-left: auto; }
.dgm-viewer-zoom {
  min-width: 46px;
  text-align: center;
  font-size: var(--fs-sm);
  color: var(--hint);
  font-variant-numeric: tabular-nums;
}
.dgm-viewer-close:hover { background: var(--danger-bg); color: var(--destructive); }

.dgm-viewer-stage {
  position: relative;
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  cursor: grab;
  touch-action: none;
  background: var(--secondary-bg);
}
.dgm-viewer[data-kind="mermaid"] .dgm-viewer-stage {
  background-image: radial-gradient(var(--border) 1px, transparent 1.4px);
  background-size: 18px 18px;
  background-position: center;
}
.dgm-viewer-stage.dragging { cursor: grabbing; }
.dgm-viewer-inner {
  transform-origin: center center;
  will-change: transform;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform .16s ease;
}
.dgm-viewer-stage.dragging .dgm-viewer-inner { transition: none; }
/* Размер содержимого ставит JS (layoutViewer): у svg с одним viewBox нет
 * собственных размеров, и во флексе он схлопывался в 0×0 — «модалка пуста». */
.dgm-viewer-inner svg, .dgm-viewer-img {
  display: block;
  user-select: none;
  -webkit-user-drag: none;
}
.dgm-viewer-hint {
  padding: var(--sp-2) var(--sp-5);
  border-top: 1px solid var(--border);
  font-size: var(--fs-xs);
  color: var(--hint);
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
@media (hover: none) { .dgm-viewer-hint { display: none; } }
body.dgm-viewer-open { overflow: hidden; }
/* Кнопки шапки — иконки (11.10.2026, вместо глифов «− + ⤢ ↓ ✕»). На
 * десктопе «закрыть» справа, как было; в разметке она первая — ради телефона. */
.dgm-viewer-head .dgm-btn { width: 32px; height: 32px; }
.dgm-viewer-head .dgm-btn svg { display: block; }
.dgm-viewer-head .dgm-viewer-close { order: 3; }
.dgm-viewer-head .dgm-viewer-tools { order: 2; }

/* Телефон и планшет (класс ставит JS по устройству ввода): просмотр во весь
 * экран, как в ChatGPT и Claude. Сверху поверх картинки — «закрыть» слева,
 * имя, «скачать» справа; масштаб щипком и двойным тапом, закрытие — свайпом
 * вниз или тапом мимо картинки, тап по картинке прячет шапку. */
.dgm-viewer.is-touch .dgm-viewer-backdrop {
  background: #000;
  opacity: var(--dgm-dismiss-fade, 1);
}
.dgm-viewer.is-touch .dgm-viewer-panel {
  inset: 0;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  background: transparent;
  transform: none;
}
.dgm-viewer.is-touch .dgm-viewer-head {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  z-index: 2;
  gap: var(--sp-3);
  padding: calc(max(env(safe-area-inset-top, 0px), var(--tg-content-safe-area-inset-top, 0px)) + 8px)
           max(12px, env(safe-area-inset-right, 0px)) 20px max(12px, env(safe-area-inset-left, 0px));
  border: 0;
  background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
  color: #fff;
  opacity: var(--dgm-dismiss-fade, 1);
  transition: opacity .2s ease;
}
/* Именно visibility: pointer-events здесь не работает — правило ниже про
 * обучение возвращает события всем потомкам вьюера через !important, и
 * невидимые «закрыть» и «скачать» продолжали ловить тапы. */
.dgm-viewer.is-touch.dgm-chrome-off .dgm-viewer-head {
  opacity: 0;
  visibility: hidden;
  transition: opacity .2s ease, visibility 0s linear .2s;
}
.dgm-viewer.is-touch .dgm-viewer-head .dgm-viewer-close { order: 0; }
.dgm-viewer.is-touch .dgm-viewer-title {
  order: 1;
  flex: 1;
  min-width: 0;
  text-align: center;
  font-size: 15px;
  font-weight: 600;
  color: #fff;
  text-shadow: 0 1px 6px rgba(0, 0, 0, .5);
}
.dgm-viewer.is-touch .dgm-viewer-tools { order: 2; margin-left: 0; }
.dgm-viewer.is-touch .dgm-viewer-zbtn,
.dgm-viewer.is-touch .dgm-viewer-zoom { display: none; }
.dgm-viewer.is-touch .dgm-viewer-head .dgm-btn {
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: 50%;
  background: rgba(28, 28, 32, .62);
  color: #fff;
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
}
/* Без пары к кнопке «закрыть» имя уезжало бы вправо от центра. */
.dgm-viewer.is-touch .dgm-viewer-tools:not(:has([data-act="dl"]:not([hidden])))::before {
  content: '';
  display: block;
  width: 40px;
}
.dgm-viewer.is-touch .dgm-viewer-stage { padding-bottom: env(safe-area-inset-bottom, 0px); }
.dgm-viewer.is-touch[data-kind="image"] .dgm-viewer-stage,
.dgm-viewer.is-touch.dgm-dismissing .dgm-viewer-stage { background: transparent; }
.dgm-viewer.is-touch.dgm-dismissing .dgm-viewer-stage { background-image: none; }
.dgm-viewer.dgm-dismiss-anim .dgm-viewer-stage:not(.dragging) .dgm-viewer-inner { transition: transform .22s ease; }
/* У виджета шапка не поверх: она закрыла бы верх его содержимого. */
.dgm-viewer.is-touch[data-kind="widget"] .dgm-viewer-head { position: relative; background: #000; }

/* Подсказка обучения (driver.js) живёт на z-index 10000 и 10⁹ и глушит
 * pointer-events всему, кроме себя, — открытая поверх неё картинка была
 * накрыта её затемнением. Пока вьюер открыт, подсказка прячется, а сам
 * вьюер получает события обратно. */
body.dgm-viewer-open .driver-overlay,
body.dgm-viewer-open .driver-popover { visibility: hidden !important; }
body.dgm-viewer-open .dgm-viewer,
body.dgm-viewer-open .dgm-viewer * { pointer-events: auto !important; }

/* ── Превью картинки в карточке файла ───────────────────────────────── */

.agent-attachment-card.aac-with-thumb { flex-wrap: wrap; }
.aac-thumb {
  flex-basis: 100%;
  margin-top: var(--sp-4);
  padding-top: var(--sp-4);
  border-top: 1px solid var(--border);
}
.aac-thumb img {
  display: block;
  max-width: 100%;
  max-height: 260px;
  margin: 0 auto;
  border-radius: var(--r-md);
  background: var(--bg);
  cursor: zoom-in;
}

@media (max-width: 960px) {
  .dgm { padding: var(--sp-4); }
}

/* ── Живой HTML-виджет в реплике (фаза 188) ─────────────────────────────
 * Блок ```widget → sandbox-iframe. Холст без полей и точек: содержимое
 * рисует сам виджет, рамка растёт по его высоте (сообщение из шима), выше
 * потолка прокручивается внутри себя и подсказывает про полный экран той же
 * плашкой, что и мелкая схема (.dgm-tiny). */
.dgm-widget .dgm-canvas {
  display: block;
  padding: 0;
  cursor: default;
  background: var(--bg);
}
.dgm-widget-frame {
  display: block;
  width: 100%;
  border: 0;
  background: transparent;
  transition: height .18s ease;
}
.dgm-widget.dgm-pending .dgm-canvas { min-height: 80px; }
/* Ошибка скрипта внутри рамки: показываем над виджетом, сам виджет не
 * прячем — часть могла отрисоваться. */
.dgm-widget-err {
  margin-bottom: var(--sp-4);
  padding: var(--sp-3) var(--sp-4);
  color: var(--warning);
  background: var(--warning-bg);
  border: 1px solid var(--warning-line);
  border-radius: var(--r-md);
  font-size: var(--fs-md);
  word-break: break-word;
}
.dgm-widget-err[hidden] { display: none; }
/* Во весь экран: рамке отдана вся сцена, масштаб и сдвиг не нужны —
 * колесо и пальцы принадлежат содержимому. */
.dgm-viewer-frame {
  display: block;
  border: 0;
  border-radius: var(--r-md);
  background: var(--bg);
}
.dgm-viewer[data-kind="widget"] .dgm-viewer-stage { cursor: default; touch-action: auto; }
.dgm-viewer[data-kind="widget"] .dgm-viewer-zoom,
.dgm-viewer[data-kind="widget"] [data-act="in"],
.dgm-viewer[data-kind="widget"] [data-act="out"],
.dgm-viewer[data-kind="widget"] [data-act="fit"],
.dgm-viewer[data-kind="widget"] .dgm-viewer-hint { display: none; }

/* ── Картинка по ссылке в тексте реплики (фаза 188) ─────────────────────
 * `![подпись](путь)` из markdown: грузится авторизованно (blob), вписывается
 * по ширине, по высоте не выше 60% экрана — детали во весь экран по клику. */
.md-body .md-img {
  display: block;
  margin: var(--sp-4) 0;
  padding: 0;
  max-width: 100%;
}
.md-body .md-img img {
  display: block;
  max-width: 100%;
  max-height: calc(var(--vh) * 60);
  height: auto;
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  background: var(--secondary-bg);
  cursor: zoom-in;
}
.md-body .md-img-loading img { min-height: 48px; min-width: 96px; }
.md-body .md-img figcaption {
  margin-top: var(--sp-2);
  font-size: var(--fs-sm);
  color: var(--hint);
}
.md-body .md-img-missing {
  padding: var(--sp-3) var(--sp-4);
  color: var(--hint);
  background: var(--sunk-20);
  border-radius: var(--r-md);
  font-size: var(--fs-md);
}
/* Рамка виджета видна сразу, не дожидаясь первого сообщения о высоте:
 * документ отрисовывается постепенно (внешняя библиотека может грузиться
 * секунды), а общее правило .dgm-pending прячет холст до появления в кадре. */
.dgm-widget.dgm-pending .dgm-canvas { opacity: 1; }
/* Виджет выше потолка: прокрутка внутри рамки, а во весь экран — кнопкой
 * поверх (клик в холст ушёл бы в iframe; подсказка схем с pointer-events:none
 * здесь была бы мёртвой). */
.dgm-widget-more {
  display: none;
  position: absolute;
  right: var(--sp-3);
  bottom: var(--sp-3);
  padding: var(--sp-1) var(--sp-4);
  background: var(--accent-bg-strong);
  color: var(--link);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  font-size: var(--fs-xs);
  cursor: pointer;
  z-index: 1;
}
.dgm-widget-capped .dgm-widget-more { display: inline-block; }
.dgm-widget .dgm-canvas { position: relative; }

/* ```html в реплике (фаза 211): код остаётся кодом, над ним кнопка —
 * отрисовать тем же виджетом. Видна всегда, без hover: на телефоне наведения
 * нет, а смысл кнопки в том, чтобы её заметили. */
.dgm-html-bar {
  display: flex;
  justify-content: flex-end;
  margin: var(--sp-3) 0 var(--sp-3);
}
.dgm-html-show {
  min-height: 28px;
  padding: 0 var(--sp-5);
  background: var(--accent-bg-strong);
  color: var(--link);
  border: 1px solid var(--border);
  border-radius: var(--r-pill);
  font-family: inherit;
  font-size: var(--fs-md);
  cursor: pointer;
  transition: background .15s ease;
}
.dgm-html-show:hover { background: var(--accent-bg); }

/* ═══ Фаза 203: браузер сервера — окно входа и список входов ═══
   Окно поверх всего, включая вьюер схем (9500) и подсказки обучения.
   Escape окно не закрывает: пока фокус в экране, клавиши уходят в
   удалённый браузер. */
.bl-overlay {
  position: fixed;
  inset: 0;
  z-index: 9600;
  background: rgba(0, 0, 0, .62);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
  /* Телефон боком в PWA: вырез и статус-бар шире 16px. */
  padding: max(16px, env(safe-area-inset-top, 0px)) max(16px, env(safe-area-inset-right, 0px))
           max(16px, env(safe-area-inset-bottom, 0px)) max(16px, env(safe-area-inset-left, 0px));
}
.bl-panel {
  width: min(1320px, 100%);
  height: min(900px, 100%);
  display: flex;
  flex-direction: column;
  background: var(--bg);
  color: var(--text);
  border: 1px solid var(--ov-12, rgba(128,128,128,.25));
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 18px 60px rgba(0, 0, 0, .45);
}
.bl-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px 10px 16px;
  border-bottom: 1px solid var(--ov-08, rgba(128,128,128,.18));
  min-width: 0;
}
.bl-title {
  font-size: 16px;
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
  flex: 1 1 auto;
}
.bl-status {
  font-size: var(--fs-md);
  color: var(--hint);
  white-space: nowrap;
  flex: 0 0 auto;
}
.bl-status.ok::before { content: '● '; color: #2fb36f; }
.bl-status.bad { color: var(--destructive, #e5484d); }
.bl-fit, .bl-x {
  flex: 0 0 auto;
  border: 1px solid var(--ov-12, rgba(128,128,128,.25));
  background: transparent;
  color: var(--text);
  border-radius: 8px;
  height: 36px;
  min-width: 36px;
  padding: 0 10px;
  cursor: pointer;
  font-size: var(--fs-lg);
}
.bl-x { font-size: 20px; line-height: 1; padding: 0 8px; }
.bl-screen {
  flex: 1 1 auto;
  min-height: 0;
  background: #0d0d0f;
  overflow: hidden;
  outline: none;
}
.bl-foot {
  border-top: 1px solid var(--ov-08, rgba(128,128,128,.18));
  padding: 10px 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.bl-type {
  display: flex;
  gap: 6px;
  min-width: 0;
}
.bl-type-input {
  flex: 1 1 auto;
  min-width: 0;
  height: 36px;
  border-radius: 8px;
  border: 1px solid var(--ov-12, rgba(128,128,128,.25));
  background: var(--secondary-bg);
  color: var(--text);
  padding: 0 10px;
  font-size: 16px; /* меньше 16px — iOS зумит страницу на фокусе */
}
.bl-key {
  flex: 0 0 auto;
  height: 36px;
  min-width: 36px;
  padding: 0 10px;
  border-radius: 8px;
  border: 1px solid var(--ov-12, rgba(128,128,128,.25));
  background: var(--secondary-bg);
  color: var(--text);
  cursor: pointer;
}
.bl-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.bl-note {
  flex: 1 1 260px;
  font-size: var(--fs-md);
  color: var(--hint);
}
.bl-btn {
  height: 36px;
  padding: 0 14px;
  border-radius: 9px;
  border: 1px solid transparent;
  cursor: pointer;
  font-size: var(--fs-lg);
  font-weight: 500;
  white-space: nowrap;
}
.bl-btn-primary { background: var(--btn, var(--link)); color: var(--btn-text, #fff); }
.bl-btn-ghost {
  background: transparent;
  color: var(--text);
  border-color: var(--ov-12, rgba(128,128,128,.25));
}
.bl-btn-ghost.bl-confirm { color: var(--destructive, #e5484d); border-color: currentColor; }

/* Список входов */
.bl-panel-list { width: min(640px, 100%); height: auto; max-height: min(760px, 100%); }
.bl-list-body { padding: 14px 16px 16px; overflow-y: auto; display: flex; flex-direction: column; gap: 12px; }
.bl-lead { margin: 0; font-size: var(--fs-lg); color: var(--hint); line-height: 1.45; }
.bl-empty { color: var(--hint); font-size: var(--fs-lg); padding: 6px 0; }
.bl-prof {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 12px;
  border-radius: 10px;
  background: var(--secondary-bg);
  flex-wrap: wrap;
}
.bl-prof + .bl-prof { margin-top: 8px; }
.bl-prof-main { flex: 1 1 220px; min-width: 0; }
.bl-prof-title { font-weight: 500; overflow-wrap: anywhere; }
.bl-prof-title code { font-size: 12px; color: var(--hint); margin-left: 4px; }
.bl-prof-sub { font-size: 12.5px; color: var(--hint); margin-top: 2px; overflow-wrap: anywhere; }
.bl-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #2fb36f; margin-left: 6px; vertical-align: middle; }
.bl-new { display: flex; flex-direction: column; gap: 8px; padding-top: 4px; border-top: 1px solid var(--ov-08, rgba(128,128,128,.18)); }
.bl-new[hidden] { display: none; }
.bl-new-title { font-weight: 500; font-size: var(--fs-lg); padding-top: 10px; }
.bl-new input {
  height: 38px;
  border-radius: 8px;
  border: 1px solid var(--ov-12, rgba(128,128,128,.25));
  background: var(--secondary-bg);
  color: var(--text);
  padding: 0 10px;
  font-size: 16px;
}
.bl-new .bl-btn { align-self: flex-start; }

/* Кнопка окна в карточке вопроса агента */
.sdkq-browser {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 10px 0 4px;
  height: 38px;
  padding: 0 14px;
  border-radius: 10px;
  border: none;
  justify-content: center;
  background: var(--btn, var(--link));
  color: var(--btn-text, #fff);
  font-size: var(--fs-lg);
  font-weight: 500;
  cursor: pointer;
}

/* Тост «Вход сохранён» всплывает, пока открыт список входов (9600). */
body:has(.bl-overlay) .toast-container { z-index: 9700; }

@media (max-width: 640px) {
  .bl-overlay { padding: 0; }
  /* На телефоне от статуса остаётся точка: иначе имя входа режется в «Google с т…». */
  .bl-status { font-size: 0; }
  .bl-status.ok::before, .bl-status.bad::before { font-size: 14px; }
  .bl-status.bad::before { content: '●'; }
  .bl-panel { border-radius: 0; height: 100%; border: none; }
  .bl-panel-list { height: 100%; max-height: none; }
  /* Окно на весь экран: в PWA на iPhone (status-bar black-translucent) шапка
     уходила под часы и батарею вместе с кнопками «1:1» и «×», а низ — под
     полоску «домой». Фон шапки продолжается под статус-бар, как у панелей выше. */
  .bl-head { padding-top: calc(10px + env(safe-area-inset-top, 0px)); }
  .bl-foot { padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px)); }
  .bl-note { flex-basis: 100%; }
  .bl-actions .bl-btn { flex: 1 1 0; }
}
/* .btn-secondary задаёт display сам и перебивает [hidden] браузера. */
#btn-settings-browser[hidden] { display: none; }
.sdkq-browser-note { margin: 10px 0 4px; font-size: var(--fs-md); color: var(--hint); }


/* ── Интеграции (фаза 207): ключи приложений и подключение по коду ── */
.ig-panel { width: min(720px, 100%); }
.ig-card { display: flex; flex-direction: column; gap: 10px; padding: 12px 14px; border-radius: 12px; background: var(--secondary-bg); }
.ig-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.ig-actions[hidden] { display: none; }
.ig-list-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; border-top: 1px solid var(--ov-08, rgba(128,128,128,.18)); }
.ig-all { font-size: var(--fs-md); color: var(--hint); display: flex; gap: 8px; align-items: center; min-height: 32px; cursor: pointer; }
.ig-all input, .ig-switch input { width: 18px; height: 18px; flex: 0 0 auto; }
.ig-all[hidden] { display: none; }
.ig-hint { font-size: 12.5px; color: var(--hint); line-height: 1.45; overflow-wrap: anywhere; }
.ig-note { font-size: var(--fs-lg); line-height: 1.45; padding: 10px 12px; border-radius: 10px; }
.ig-warn { background: rgba(229, 72, 77, .1); color: var(--text); border: 1px solid rgba(229, 72, 77, .35); }
.ig-field { display: flex; flex-direction: column; gap: 6px; font-size: var(--fs-lg); }
.ig-field > span { font-weight: 500; }
.ig-field input[type=text], .ig-field select, .ig-code {
  height: 38px; border-radius: 8px; border: 1px solid var(--ov-12, rgba(128,128,128,.25));
  background: var(--bg); color: var(--text); padding: 0 10px; font-size: 16px; max-width: 100%;
}
.ig-overlay { align-items: flex-start; overflow-y: auto; }
.ig-check { display: flex; gap: 10px; align-items: flex-start; font-weight: 400; cursor: pointer; min-height: 32px; padding: 5px 0; }
.ig-check[hidden] { display: none; }
.ig-check input { margin-top: 1px; flex: 0 0 auto; width: 18px; height: 18px; }
.ig-check span { min-width: 0; overflow-wrap: anywhere; }
.ig-check small { display: block; color: var(--hint); font-size: 12px; margin-top: 2px; }
.ig-check code, .ig-hint code, .bl-prof-title code { font-size: 12px; color: var(--hint); }
.ig-switch { display: flex; gap: 10px; align-items: center; font-weight: 500; font-size: var(--fs-lg); cursor: pointer; min-height: 36px; }
.ig-proj-box { display: flex; flex-direction: column; gap: 6px; }
.ig-proj-box[hidden] { display: none; }
.ig-proj-search { height: 36px; border-radius: 8px; border: 1px solid var(--ov-12, rgba(128,128,128,.25)); background: var(--bg); color: var(--text); padding: 0 10px; font-size: 16px; }
.ig-proj-list .ig-check { flex-shrink: 0; }
.ig-proj-list[hidden] { display: none; }
.ig-proj-list { display: flex; flex-direction: column; max-height: 260px; overflow-y: auto; padding: 4px 10px; border: 1px solid var(--ov-12, rgba(128,128,128,.25)); border-radius: 8px; background: var(--bg); }
.ig-chips { display: flex; flex-wrap: wrap; gap: 4px; margin: 4px 0 2px; }
.ig-chip { font-size: 11.5px; padding: 2px 7px; border-radius: 999px; background: var(--ov-08, rgba(128,128,128,.18)); color: var(--text); }
.ig-badge { display: inline-block; font-size: 11.5px; padding: 2px 8px; border-radius: 999px; background: rgba(245, 165, 36, .18); color: var(--text); font-weight: 500; }
.ig-badge-off { background: var(--ov-08, rgba(128,128,128,.18)); color: var(--hint); }
.ig-badge-danger { background: rgba(229, 72, 77, .15); color: var(--destructive, #e5484d); }
.ig-badge-ok { background: rgba(48, 164, 108, .18); color: var(--text); }
.ig-badge-bad { background: rgba(229, 72, 77, .18); color: var(--text); }
.ig-nowrap { white-space: nowrap; }
.ig-input-bad { border-color: var(--destructive, #e5484d) !important; }
.ig-log-table th { text-align: left; font-weight: 500; color: var(--hint); font-size: 12px; padding: 4px 6px; }
.ig-danger { border: 1px solid rgba(229, 72, 77, .35); border-radius: 8px; padding: 8px 10px; }
.ig-danger small { color: var(--hint); }
.ig-key { align-items: flex-start; }
.ig-key-btns { display: flex; gap: 6px; flex-wrap: wrap; }
.ig-key .bl-btn { height: 32px; padding: 0 10px; font-size: var(--fs-md); }
.ig-log { flex: 1 1 100%; overflow-x: auto; font-size: 12px; }
.ig-log[hidden] { display: none; }
.ig-log-table { border-collapse: collapse; width: 100%; }
.ig-log-table td { padding: 3px 6px; border-bottom: 1px solid var(--ov-08, rgba(128,128,128,.18)); white-space: nowrap; }
.ig-log-table td.ig-path { white-space: normal; overflow-wrap: anywhere; }
.ig-log-table tr.ig-bad td { color: var(--destructive, #e5484d); }
.ig-secret-value { display: block; padding: 10px; border-radius: 8px; background: var(--bg); font-size: 13px; overflow-wrap: anywhere; user-select: all; }
.ig-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 24px; letter-spacing: .12em; text-align: center; height: 52px; width: 100%; text-transform: uppercase; }
.ig-app { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.ig-app-label { font-size: 12.5px; color: var(--hint); }
.ig-app-name { font-size: 20px; font-weight: 600; overflow-wrap: anywhere; }
.ig-hooks { flex: 1 1 100%; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
.ig-hooks[hidden] { display: none; }
.ig-hook { padding: 8px 10px; border-radius: 8px; background: var(--bg); display: flex; flex-direction: column; gap: 4px; min-width: 0; }
/* Журнал доставок прокручивается сам, не растягивая раздел; колонка ошибки не сжимается в столбик. */
.ig-hook .ig-log { max-width: 100%; }
.ig-hook .ig-log-table td.ig-path { min-width: 160px; }
.ig-hook .bl-prof-title span[data-f="url"] { overflow-wrap: anywhere; }
.ig-events { display: flex; flex-direction: column; }
.ig-events[hidden] { display: none; }
.ig-bad-text { color: var(--destructive, #e5484d); }

/* ══════════════════════════════════════════════════════════════════
 * Полировка 1do (07.10.2026): подача как у сайта 1do.ai — шрифт Onest,
 * мягкие карточки, бренд-синий в активном, статусы без коричневого.
 * Токены (--st-*, --pin, --focus-ring, --on-warning) — в блоках тем вверху.
 * Раздел в конце файла намеренно: правила перекрывают исторические стили
 * компонентов, разбросанные по файлу, тем же весом селектора.
 * ══════════════════════════════════════════════════════════════════ */
button, input, textarea, select { font-family: inherit; letter-spacing: inherit; }
:where(button, a, [role="button"], summary, select):focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }

/* ── Карточки ленты: статусы без коричневого ──
   «На паузе» — обычная карточка без подложки и прозрачности; ошибка — рамка
   и пилюля без розовой заливки; работает — бренд-синий (было зелёным, как
   «готово»); ждёт ответа — чистый янтарь, единственное громкое место. */
.agent-card { border-radius: var(--r-card); padding: 12px 14px; border-color: var(--border); }
.agent-card:hover { transform: none; box-shadow: 0 6px 18px -10px var(--sh-mid); border-color: var(--ov-14); }
.agent-card:active { transform: scale(0.99); }
.agent-card.agent-paused,
[data-theme="light"] .agent-card.agent-paused { background: var(--secondary-bg); border-color: var(--border); border-left: 1px solid var(--border); opacity: 1; }
.agent-card.agent-paused:hover { opacity: 1; box-shadow: 0 6px 18px -10px var(--sh-mid); }
.agent-card.agent-error { background: var(--secondary-bg); border-color: var(--st-err-line); opacity: 1; }
.agent-card.agent-error:hover { box-shadow: 0 6px 18px -10px var(--sh-mid); }
/* border целиком: базовое правило «прерван» (выше по файлу) держит левую
   границу 3px — одной сменой цвета дуга оставалась. Светлая тема перебивает
   рамку карточки общим `border` (раздел холста ниже) — поэтому селектор с ней. */
.agent-card.agent-interrupted,
[data-theme="light"] .agent-card.agent-interrupted { background: var(--secondary-bg); border: 1px solid var(--st-ask); }
.agent-card.agent-interrupted:hover { box-shadow: 0 6px 18px -10px var(--sh-mid); }
.agent-bottom-interrupted .qa-resume { background: var(--st-ask-fill); color: var(--on-warning); border-color: transparent; }
.agent-bottom-interrupted .qa-resume:hover { background: var(--st-ask-fill); filter: brightness(1.05); }
.agent-card.agent-running { border-color: var(--st-run-line); box-shadow: 0 0 0 1px var(--st-run-bg); animation: agent-glow-run 3s ease-in-out infinite; }
.agent-card.agent-running.agent-card-fresh { animation: card-in 0.3s ease-out both, agent-glow-run 3s ease-in-out infinite; }
@keyframes agent-glow-run { 0%,100% { box-shadow: 0 0 0 1px var(--st-run-bg), 0 0 10px var(--st-run-bg); } 50% { box-shadow: 0 0 0 1px var(--st-run-line), 0 0 18px var(--st-run-bg); } }
.agent-card.agent-running:hover { box-shadow: 0 0 0 1px var(--st-run-line), 0 8px 20px -10px var(--st-run-line); }
.agent-card.agent-draft { border: 1px dashed var(--ov-20); opacity: 1; background: transparent; }
/* Сигналы карточки — цветом всей рамки и значком, без боковых полос: толстая
   левая граница (или inset-тень) на скруглённой карточке рисовалась дугой «(». */
.agent-card:has(.agent-ask-wait),
[data-theme="light"] .agent-card:has(.agent-ask-wait) { border-color: var(--st-ask); }
.agent-card-2l .ac-pin { flex: none; display: inline-flex; color: var(--pin); }
.agent-card-2l .ac-pin .ico { width: 14px; height: 14px; }
.agent-card.agent-pinned:hover { box-shadow: 0 6px 18px -10px var(--sh-mid); }

.agent-card.agent-running .si { color: var(--st-run); }
.agent-card.agent-paused .si { color: var(--st-idle); }
.agent-card.agent-error .si { color: var(--st-err); }
.agent-card.agent-draft .si { color: var(--hint); }
.status-tag-completed .si, .status-tag-stopped .si { color: var(--st-idle); }
.status-tag-failed .si { color: var(--st-err); }
.s-done .si, .status-tag-done .si { color: var(--st-done); }
.s-deferred .si { color: var(--hint); }
.agent-card.agent-paused .top-row .agent-id,
.agent-card.agent-error .top-row .agent-id { display: none; }

.agent-status-tag { gap: 4px; font-size: var(--fs-sm); font-weight: 500; padding: 2px 8px 2px 6px; border-radius: var(--r-pill); }
.agent-status-tag .si { width: 13px; height: 13px; margin-right: 0; vertical-align: -2px; }
.status-tag-completed, .status-tag-stopped { background: var(--st-idle-bg); color: var(--st-idle-fg); }
.status-tag-failed { background: var(--st-err-bg); color: var(--st-err-fg); }
.status-tag-done { background: var(--st-done-bg); color: var(--st-done-fg); }
.status-tag-cancelled, .status-tag-deferred { background: var(--ov-06); color: var(--hint); }

.agent-ask-wait { color: var(--on-warning); background: var(--st-ask-fill); border: none; border-radius: var(--r-pill); padding: 3px 10px; }
.dl-ask-wait { color: var(--st-ask-fg); }

.agent-card .agent-project { font-size: var(--fs-sm); padding: 1px 8px; border-radius: var(--r-pill); background: var(--ov-06); color: var(--text); font-weight: 500; letter-spacing: 0; }
.agent-card .agent-task { font-size: var(--fs-md); color: var(--text); line-height: 1.4; }
.agent-card .agent-meta { font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.agent-model, .agent-effort { font-size: var(--fs-sm); }
.agents-list { gap: 8px; }

/* ── Десктопный список агентов: выбранная строка — бренд, hover нейтральный ── */
.dl-item { padding: 12px 16px; border-bottom-color: var(--border); }
.dl-item.active { background: var(--accent-bg); border-left-color: var(--button); }
.dl-item.dl-paused:hover, .dl-item.dl-error:hover, .dl-item.dl-interrupted:hover { background: var(--ov-04); }
.dl-item.active:hover, .dl-item.dl-paused.active, .dl-item.dl-error.active, .dl-item.dl-running.active, .dl-item.dl-interrupted.active { background: var(--accent-bg); }
.dl-item.dl-running { border-left-color: var(--st-run); background: var(--st-run-bg); animation: none; }
.dl-item.dl-running:hover { background: var(--st-run-bg); }
.dl-item.dl-interrupted { border-left-color: var(--st-ask); background: transparent; }
.dl-item.agent-pinned { border-left-color: var(--pin); }
.dl-item:has(.dl-ask-wait) { border-left-color: var(--st-ask); }
.dl-status-dot { width: 8px; height: 8px; opacity: 1; background: var(--st-idle); }
.dl-running .dl-status-dot { background: var(--st-run); opacity: 1; animation: dot-pulse-run 1.6s ease-in-out infinite; }
@keyframes dot-pulse-run { 0%,100% { box-shadow: 0 0 0 0 var(--st-run-line); } 50% { box-shadow: 0 0 0 4px transparent; } }
.dl-paused .dl-status-dot { background: var(--st-idle); opacity: 1; }
.dl-error .dl-status-dot { background: var(--st-err); }
.dl-interrupted .dl-status-dot { background: var(--st-ask); box-shadow: none; }
.dl-draft .dl-status-dot { background: transparent; border: 1.5px solid var(--hint); opacity: 1; }
.dl-item-status { font-size: var(--fs-xs); font-weight: 500; padding: 2px 8px; border-radius: var(--r-pill); letter-spacing: 0; }
.dl-item-status.s-running, .dl-item-status.s-waiting_input, .dl-item-status.s-planning { background: var(--st-run-bg); color: var(--st-run-fg); }
.dl-item-status.s-completed, .dl-item-status.s-stopped { background: var(--st-idle-bg); color: var(--st-idle-fg); }
.dl-item-status.s-done { background: var(--st-done-bg); color: var(--st-done-fg); }
.dl-item-status.s-failed { background: var(--st-err-bg); color: var(--st-err-fg); }
.dl-item-status.s-cancelled, .dl-item-status.s-deferred { background: var(--ov-06); color: var(--hint); }
.dl-item-task { font-size: var(--fs-md); opacity: 1; line-height: 1.4; }
.dl-item-id { display: none; }
.dl-item-project { font-weight: 500; color: var(--text); }
.dl-item-cost { font-variant-numeric: tabular-nums; font-family: inherit; }
.dl-badge { background: var(--accent-bg-strong); color: var(--link); animation: none; }
.tab .badge { display: inline-flex; align-items: center; justify-content: center; border-radius: var(--r-pill); background: var(--accent-bg-strong); color: var(--link); font-weight: 600; }

/* ── Чат: статус-разделители без капса, пузырь как на сайте, «Выполнено» не кричит ── */
.chat-messages .status-running   { --_c: var(--st-run); }
.chat-messages .status-completed, .chat-messages .status-stopped { --_c: var(--hint); }
.chat-messages .status-done      { --_c: var(--st-done-fg); }
.chat-messages .status-failed    { --_c: var(--st-err-fg); }
.chat-messages .msg-status .status-label { text-transform: none; letter-spacing: 0; font-size: var(--fs-sm); font-weight: 500; opacity: 1; padding: 3px 10px; border-radius: var(--r-pill); background: var(--secondary-bg); border-color: var(--border); }
.chat-messages .msg-status::before, .chat-messages .msg-status::after { opacity: 0.25; }
.chat-messages .msg-user { background: var(--st-run-bg); border-color: rgba(123,151,255,0.18); border-radius: 20px 20px 6px 20px; padding: 10px 16px; }
[data-theme="light"] .chat-messages .msg-user { background: #e8eefe; border-color: rgba(47, 91, 234, 0.15); }
.chat-title { font-weight: 600; letter-spacing: -0.01em; }
.qa-primary { border-radius: var(--r-pill); font-size: var(--fs-md); padding: 8px 18px; }
@media (pointer: coarse) { .qa-primary { padding: 10px 22px; } }
.qa-primary--green { background: var(--secondary-bg); color: var(--st-done-fg); border: 1px solid var(--success-line); box-shadow: none; }
.qa-primary--green:hover { background: var(--st-done-bg); filter: none; }
.qa-primary--accent { background: var(--button); color: #fff; box-shadow: 0 6px 16px -8px rgba(47,91,234,0.6); }
.qa-chip { border-radius: var(--r-pill); border-color: var(--border); color: var(--text); background: var(--secondary-bg); }
.qa-chip:hover { border-color: var(--accent-line); color: var(--link); background: var(--accent-bg); }
.qa-chip--muted { color: var(--hint); }
.qa-chip--muted:hover { color: var(--text); }

/* ── Композер ── */
.composer { border-radius: 22px; }
.btn-send { border-radius: 12px; }
.btn-send:disabled { background: var(--ov-08); color: var(--hint); }
.voice-lang-select.voice-lang-forced { border-color: var(--accent-line); background: var(--accent-bg); }

/* ── Заголовки и вкладки: полужирные с минус-трекингом, без капса ── */
.header h1, .form-header h2 { font-weight: 650; letter-spacing: -0.015em; }
.form-header h2 { font-size: var(--fs-2xl); }
.dl-header-title { font-size: var(--fs-2xl); font-weight: 650; letter-spacing: -0.015em; }
.tab.active, .dl-tab.active { color: var(--text); border-bottom-color: var(--button); font-weight: 600; }
.home-greet { font-size: 28px; font-weight: 600; letter-spacing: -0.025em; }
.section-title, .st-group-title, .costs-section-title, .cost-card-label, .date-header { text-transform: none; letter-spacing: 0; font-size: var(--fs-md); font-weight: 600; }
.st-group-title { color: var(--text); font-size: var(--fs-lg); padding: 0 4px 10px; }
.costs-section-title { color: var(--text); }

/* ── Чипы: активный — сплошной бренд в обеих темах ── */
.project-chip { border-color: var(--border); font-weight: 500; }
.project-chip:hover { background: var(--ov-06); color: var(--text); border-color: var(--border); }
.project-chip.active { background: var(--button); color: #fff; border-color: var(--button); }
.st-chip, .nt-chip { border-width: 1px; border-radius: var(--r-pill); }
.st-chip.active, .nt-chip.active { background: var(--button); border-color: var(--button); color: #fff; }

/* ── Карточки, переключатели, поля, кнопки ── */
.project-card, .st-group, .cost-card, .costs-section, .nt-project-card { border-radius: var(--r-card); }
.project-card, .cost-card, .costs-section { border: 1px solid var(--border); }
.st-toggle { background: var(--ov-14); border-color: transparent; border-radius: var(--r-pill); }
.st-toggle-knob { background: #fff; box-shadow: 0 1px 3px rgba(15,23,42,0.25); }
.st-toggle.on { background: var(--button); border-color: var(--button); }
.st-toggle.on .st-toggle-knob { background: #fff; }
.settings-quick-row { padding-top: 16px; }
.settings-quick-row .btn-secondary { background: var(--secondary-bg); border-color: var(--border); border-radius: var(--r-xl); text-align: left; padding: 12px 14px; font-size: var(--fs-md); font-weight: 500; }
.breakdown-bar-fill.breakdown-model { background: var(--violet); }
.chart-bar-col.chart-today .chart-bar { background: var(--button); }
.form-body input, .form-body select, .form-body textarea { border-radius: var(--r-lg); border-color: var(--border); }
.form-body input:focus, .form-body select:focus, .form-body textarea:focus { border-color: var(--link); box-shadow: var(--focus-ring); }
.btn-primary, .btn-secondary { border-radius: var(--r-lg); font-weight: 600; font-size: var(--fs-lg); }
.inbox-item { border-color: var(--border); }

.chat-messages .msg-text, .chat-messages .msg-user { font-size: var(--fs-xl); }
.chat-messages .msg-text { line-height: 1.6; }

/* ══════════════════════════════════════════════════════════════════
 * Микро-полировка (08.10.2026): один набор линейных значков вместо
 * эмодзи в «хроме», шапка чата без шума, строка итога по-русски.
 * Значки — ico() / data-ico из modules/format.js (24×24, stroke 2).
 * ══════════════════════════════════════════════════════════════════ */
.ico { width: 1.15em; height: 1.15em; flex-shrink: 0; vertical-align: -0.2em; }
.qa-chip, .qa-primary { display: inline-flex; align-items: center; justify-content: center; gap: 6px; }
.qa-chip .ico, .qa-primary .ico { width: 16px; height: 16px; }

/* Кнопки «назад» и «ещё» — значок по центру своей зоны нажатия (44px). */
.btn-back-ico, #btn-chat-menu, #btn-chat-files { display: inline-flex; align-items: center; justify-content: center; min-width: 40px; min-height: 40px; padding: 0; }
.btn-back-ico svg { display: block; }
#btn-chat-menu { color: var(--hint); }
#btn-chat-menu:hover { color: var(--text); }

/* ── Шапка чата ── */
.chat-title { display: flex; align-items: center; gap: 8px; }
.chat-title-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chat-status-dot { position: relative; flex-shrink: 0; width: 8px; height: 8px; border-radius: 50%; background: var(--st-idle); }
/* Кружки 8px и 6px объясняют себя по нажатию, но пальцем в них не попасть:
   область нажатия шире вида (UX-аудит, круг 2). */
.chat-status-dot::after, .ctx-dot::after { content: ''; position: absolute; inset: -14px; }
.chat-status-dot.st-running, .chat-status-dot.st-waiting_input, .chat-status-dot.st-planning { background: var(--st-run); animation: dot-pulse-run 1.6s ease-in-out infinite; }
.chat-status-dot.st-failed { background: var(--st-err); }
/* У агента статус «completed» — без него завершённый кружок падал в серый. */
.chat-status-dot.st-done, .chat-status-dot.st-completed { background: var(--st-done); }
.chat-status-dot.st-draft { background: transparent; border: 1.5px solid var(--hint); }
.chat-status-dot.st-cancelled, .chat-status-dot.st-deferred { background: transparent; border: 1.5px solid var(--st-idle); }
.chat-header .bg-phase-tag, .chat-header .ctx-dot { flex-shrink: 0; }
.chat-meta { font-size: var(--fs-sm); margin-top: 1px; }
.chat-meta .model-tag { color: var(--hint); opacity: 1; font-size: inherit; }
.chat-meta .effort-tag, .agent-card .effort-tag { display: inline-block; margin-left: 4px; padding: 0 6px; border: 1px solid var(--border); border-radius: var(--r-pill); font-size: var(--fs-xs); line-height: 1.5; color: var(--hint); font-weight: 500; vertical-align: 1px; }
.meta-sep { margin: 0 6px; color: var(--hint); opacity: 0.6; }
@media (max-width: 600px) {
  /* Заголовок в две строки, как раньше, но точка статуса — у первой строки. */
  .chat-title { display: flex; align-items: flex-start; }
  .chat-title .chat-status-dot { margin-top: 0.5em; }
  .chat-title-text { white-space: normal; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-height: 1.3; }
}

/* ── Меню «⋮» в чате: значок + подпись на одной оси, значки приглушены ── */
.chat-menu-dropdown { min-width: 232px; padding: 4px 0; border-radius: var(--r-lg, 12px); }
.chat-menu-dropdown button { display: flex; align-items: center; gap: 10px; font-size: var(--fs-md); padding: 9px 16px; }
.chat-menu-dropdown button .ico { width: 17px; height: 17px; color: var(--hint); }
.chat-menu-dropdown button:hover .ico { color: var(--text); }
.chat-menu-dropdown .menu-sep { text-transform: none; letter-spacing: 0; font-size: var(--fs-xs); opacity: 1; padding: 8px 16px 4px; margin-top: 4px; }
.chat-menu-dropdown .menu-id { border-top: 1px solid var(--ov-06); margin-top: 4px; color: var(--hint); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
@media (pointer: coarse) { .chat-menu-dropdown button { padding: 12px 16px; } }

/* ── Разделители статуса и строка итога хода ── */
.chat-messages .msg-status .status-label { display: inline-flex; align-items: center; gap: 6px; }
.chat-messages .msg-status .status-label .si { margin-right: 0; width: 14px; height: 14px; vertical-align: 0; }
.chat-messages .status-result .status-label { color: var(--text); }
.chat-messages .status-result .status-label .si { color: var(--st-done); }
.chat-messages .status-result.status-failed .status-label .si { color: var(--st-err); }
.chat-messages .status-label .sl-title { font-weight: 600; }
.chat-messages .status-label .sl-stats { color: var(--hint); font-weight: 400; font-variant-numeric: tabular-nums; }
.chat-messages .status-label .sl-stats::before { content: '·'; margin-right: 6px; opacity: 0.7; }
/* «Готово» сразу за ним «На паузе» — одно и то же дважды: вторую строку прячем. */
.chat-messages .status-result + .msg-status.status-agent { display: none; }
/* S2-3: остановка приходит тремя событиями — показываем одну строку. */
.chat-messages .msg-status.status-stopped + .msg-status.status-stopped { display: none; }
@media (max-width: 420px) { .chat-messages .msg-status .status-label { white-space: normal; text-align: center; } }
@media (pointer: coarse) { .modes-hint { display: none; } }

/* ── Лента: значки в карточках и строках списка ── */
.agent-menu-btn { display: inline-flex; align-items: center; justify-content: center; }
.agent-menu-btn .ico { width: 18px; height: 18px; }
.dl-menu-btn .ico { width: 16px; height: 16px; }
.agent-shared, .agent-badge-cx { display: inline-flex; align-items: center; color: var(--hint); opacity: 1; }
.agent-shared .ico, .agent-badge-cx .ico { width: 15px; height: 15px; }
.agent-ask-wait, .dl-ask-wait, .bg-phase-tag { display: inline-flex; align-items: center; gap: 5px; }
.agent-ask-wait .ico, .dl-ask-wait .ico, .bg-phase-tag .ico { width: 14px; height: 14px; }
.cx-timeline-icon .si, .cx-child-icon .si, .cx-step-pill .si { margin-right: 0; width: 14px; height: 14px; }
.cx-timeline-row.done .si, .cx-step-pill.cx-done .si { color: var(--st-done); }
.cx-timeline-row.active .si, .cx-step-pill.cx-running .si { color: var(--st-run); }
.cx-timeline-row.failed .si, .cx-step-pill.cx-failed .si { color: var(--st-err); }
.agent-menu-item { display: flex; align-items: center; gap: 10px; }
.agent-menu-item .ico { width: 16px; height: 16px; color: var(--hint); }

/* ── Чат: плашки рутины/приложения, план, вложение ── */
.srb-icon { display: inline-flex; color: var(--hint); }
.srb-icon .ico { width: 16px; height: 16px; }
.srb-btn { display: inline-flex; align-items: center; gap: 5px; }
.srb-btn .ico { width: 14px; height: 14px; }
.msg-plan-header { display: flex; align-items: center; gap: 6px; }
.msg-plan-header .ico { width: 16px; height: 16px; }
.chat-file-badge { display: inline-flex; align-items: center; gap: 5px; }
.chat-file-badge .ico { width: 14px; height: 14px; }
.voice-done-icon { display: inline-flex; color: var(--st-done); }

/* ── Новая задача ── */
#nt-autonomy .nt-chip { display: inline-flex; align-items: center; gap: 6px; }
#nt-autonomy .nt-mode-label { display: none; }
#nt-autonomy .nt-chip.active .nt-mode-label { display: inline; }
#nt-grill-toggle { display: inline-flex; align-items: center; gap: 6px; }
#nt-grill-toggle .ico { width: 16px; height: 16px; }
.nt-advanced-header { display: inline-flex; align-items: center; gap: 6px; }
.nt-advanced-arrow { font-size: inherit; display: inline-flex; }
.nt-advanced-arrow .ico { width: 14px; height: 14px; }
.plan-modal-title { display: inline-flex; align-items: center; gap: 6px; }

/* ── Проекты ── */
.pc-btns { display: inline-flex; gap: 6px; }
.pc-local-badge .ico, .pc-runner-badge .ico, .pc-shared-badge .ico, .pc-team-badge .ico, .nt-pc-local .ico, .cmp-row-local .ico { width: 13px; height: 13px; }
.cmp-row-local { display: inline-flex; vertical-align: -1px; color: var(--hint); }
.project-chip.chip-projects { display: inline-flex; align-items: center; gap: 6px; }
.project-chip.chip-projects .ico { width: 15px; height: 15px; }
/* Кнопка-значок в шапке экрана (data-ico) — линия в цвет ссылки, зона 40px. */
.btn-icon.btn-ico { display: inline-flex; align-items: center; justify-content: center; min-width: 40px; min-height: 40px; padding: 0; }
.btn-icon.btn-ico .ico { width: 20px; height: 20px; }
#btn-pe-invite-link { display: inline-flex; align-items: center; gap: 6px; }

/* ── Настройки и голосовые записи ── */
.settings-quick-row .btn-secondary { display: inline-flex; align-items: center; gap: 10px; }
.settings-quick-row .btn-secondary[hidden] { display: none; }
.settings-quick-row .btn-secondary .ico { width: 18px; height: 18px; color: var(--hint); }
.vr-actions .btn-secondary { gap: 6px; }
.vr-actions .ico { width: 15px; height: 15px; }
[data-session-revoke] { display: inline-flex; align-items: center; justify-content: center; min-width: 40px; min-height: 40px; }
[data-session-revoke] .ico { width: 18px; height: 18px; }

/* ── Поправки после первого прогона ── */
.chat-meta .meta-part { white-space: nowrap; }
@media (max-width: 600px) { .chat-title .chat-status-dot { margin-top: calc(0.65em - 4px); } }
/* Пункт «Остановить» скрыт у агента на паузе — тогда разделитель «Завершение»
   становится первым и его верхняя линия висела над пустотой. */
#menu-chat-stop[style*="none"] + .menu-sep { border-top: 0; margin-top: 0; }
#nt-autonomy .nt-chip.active, [data-theme="light"] #nt-autonomy .nt-chip.active { color: #fff; }
/* Плитка проекта — первая буква имени в мягком квадрате (было «HO»/«PL»
   из технического ключа крупным шрифтом, не по оси с названием). */
.nt-project-card .nt-pc-icon { width: 34px; height: 34px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-md); font-weight: 600; background: var(--ov-06); color: var(--text); }
.nt-project-card.active .nt-pc-icon { background: var(--button); color: #fff; }

/* ── Рутины ── */
.sched-tag, .sched-actions .btn-link, .sched-head .btn-link, .sched-run-now, .sched-attention, .sched-error, .sched-defer, .sched-fail-pill, .sched-last-run { display: inline-flex; align-items: center; gap: 5px; }
.sched-error, .sched-defer, .sched-run-now, .sched-attention, .sched-last-run { display: flex; }
.sched-tag .ico, .sched-actions .ico, .sched-error .ico, .sched-defer .ico, .sched-attention .ico, .sched-fail-pill .ico { width: 14px; height: 14px; flex-shrink: 0; }
.sched-run-now .si, .sched-last-run .si { margin-right: 0; width: 14px; height: 14px; }
.sched-run-now .si { color: var(--st-run); }
.srr-promoted { display: inline-flex; color: var(--hint); }
.srr-promoted .ico { width: 13px; height: 13px; }

/* ── Входящие ── */
.inbox-item .ii-icon { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 10px; background: var(--ov-06); color: var(--hint); font-size: inherit; }
.inbox-item .ii-icon .ico { width: 17px; height: 17px; }
.inbox-item.need-question .ii-icon { background: color-mix(in srgb, var(--st-ask) 16%, transparent); color: var(--st-ask-fg); }
.inbox-section > label { text-transform: none; letter-spacing: 0; font-size: var(--fs-md); color: var(--text); }
.inbox-item .ii-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--st-run); }
.inbox-empty .icon { display: flex; justify-content: center; color: var(--hint); opacity: 0.7; }
.inbox-empty .icon .ico { width: 36px; height: 36px; stroke-width: 1.6; }

/* ── Команды и приглашения ── */
.invite-banner-text .ico { width: 16px; height: 16px; margin-right: 6px; color: var(--link); vertical-align: -3px; }
.empty-state .icon .ico { width: 36px; height: 36px; stroke-width: 1.6; color: var(--hint); }
.pe-team-row .pe-team-icon { display: inline-flex; color: var(--hint); }
.pe-team-row .pe-team-icon .ico { width: 18px; height: 18px; }
.team-project-row .tp-name .ico { width: 15px; height: 15px; margin-right: 6px; vertical-align: -2px; color: var(--hint); }

/* ── Файлы проекта (панель и экран) ── */
.afx-hbtn .ico { width: 16px; height: 16px; }
.afx-hbtn.afx-back { gap: 4px; padding: 0 8px 0 4px; font-size: var(--fs-md); }
.afx-chev { display: inline-flex; align-items: center; justify-content: center; }
.afx-chev .ico { width: 12px; height: 12px; }
.afx-ico, .afx-tab-ico, .cfs-ico { display: inline-flex; color: var(--hint); }
.afx-dir .afx-ico { color: var(--link); }
.afx-ico .ico, .afx-tab-ico .ico { width: 15px; height: 15px; }
.cfs-ico .ico { width: 16px; height: 16px; }
.afx-empty-ico { display: flex; justify-content: center; }
.afx-empty-ico .ico { width: 30px; height: 30px; stroke-width: 1.6; }
.fi-icon { display: inline-flex; color: var(--hint); }
.file-dir .fi-icon { color: var(--link); }
.fi-icon .ico { width: 20px; height: 20px; }
.fi-download { display: inline-flex; align-items: center; justify-content: center; }
.fi-download .ico { width: 16px; height: 16px; }
.bc-item { display: inline-flex; align-items: center; gap: 4px; }
.bc-item .ico { width: 15px; height: 15px; }
.sched-runs-title { text-transform: none; letter-spacing: 0; color: var(--text); }

/* ── Очередь сообщений в чате ── */
.chat-pending-banner .cpb-icon { display: inline-flex; flex: 0 0 auto; color: var(--hint); }
.chat-pending-banner .cpb-icon .ico { width: 14px; height: 14px; }
.chat-pending-banner .cpb-row.cpb-error .cpb-icon { color: inherit; }
.chat-pending-banner .cpb-cancel { display: inline-flex; align-items: center; justify-content: center; }
.chat-pending-banner .cpb-cancel .ico { width: 15px; height: 15px; }
.chat-pool-banner > .ico { width: 15px; height: 15px; margin-right: 6px; vertical-align: -3px; }

/* ── Задача по шагам: значки фаз и шагов из набора статусов ── */
.cx-phase-icon .si, .cx-nav-step .si { margin-right: 0; width: 14px; height: 14px; vertical-align: -2px; }
.cx-phase-done .cx-phase-icon, .cx-nav-done .si { color: var(--st-done); }
.cx-phase-active .cx-phase-icon, .cx-nav-running .si { color: var(--st-run); }
.cx-nav-failed .si { color: var(--st-err); }
.cx-tracker-title { display: inline-flex; align-items: center; gap: 6px; }
.cx-tracker-title .ico { width: 15px; height: 15px; }

/* ── Прочие метки и кнопки со значками ── */
.model-lock-badge { display: inline-flex; vertical-align: -2px; }
.model-lock-badge .ico { width: 13px; height: 13px; }
.sdkq-browser, .sdkq-tab-review, .ws-manage, .user-tag-badge, .user-meta { display: inline-flex; align-items: center; gap: 6px; }
.sdkq-browser .ico, .sdkq-tab-review .ico, .ws-manage .ico { width: 15px; height: 15px; }
.user-tag-badge .ico, .user-meta .ico { width: 13px; height: 13px; }
.ws-manage, .user-meta { display: flex; width: 100%; }

/* ── Раннеры, вехи, обзор папок ── */
.rc-act-icon { display: inline-flex; color: var(--hint); }
.rc-act-icon .ico, .rc-copy .ico { width: 15px; height: 15px; }
.rsm-copy { display: inline-flex; align-items: center; justify-content: center; }
.rsm-copy .ico { width: 15px; height: 15px; }
.rb-item { display: flex; align-items: center; gap: 8px; }
.rb-item .ico { width: 16px; height: 16px; color: var(--link); flex-shrink: 0; }
.pp-item-chev { display: inline-flex; }
.pp-item-chev .ico { width: 12px; height: 12px; }
.sched-feed-icon { display: inline-flex; color: var(--hint); }
.sched-feed-icon.sched-feed-bad { color: var(--st-err); }
.sched-feed-icon .ico { width: 17px; height: 17px; }
.shared-notice-text > .ico { width: 16px; height: 16px; margin-right: 6px; vertical-align: -3px; color: var(--link); }
.tpl-file-btn { display: inline-flex; align-items: center; gap: 6px; }
.tpl-file-btn .ico { width: 15px; height: 15px; }
.invite-icon { display: flex; justify-content: center; color: var(--link); }
.invite-icon .ico { width: 40px; height: 40px; stroke-width: 1.6; }

/* ── Палитра «/» и метки выбранных команд ── */
.skills-dropdown-item .sd-icon { display: inline-flex; align-items: center; justify-content: center; color: var(--hint); }
.skills-dropdown-item .sd-icon .ico { width: 17px; height: 17px; }
.nt-skill-tag-icon { display: inline-flex; vertical-align: -2px; }
.nt-skill-tag-icon .ico { width: 13px; height: 13px; }

.sched-actions { flex-wrap: wrap; }
.sched-actions .btn-link { white-space: nowrap; }

/* ══════════════════════════════════════════════════════════════════
 * Подача сайта 1do (08.10.2026): приложение в том же визуальном языке,
 * что и 1do.ai — точечный фон со светлыми пятнами бренда и персика,
 * белые (#121722 в тёмной) карточки радиусом 20px с мягкой слоистой
 * тенью и тонкой рамкой, тяжёлые плотные заголовки Onest, кнопки-
 * таблетки с тенью бренда, строки шагов как в демо сайта.
 * Раздел последний в файле намеренно: перекрывает исторические стили тем
 * же весом селектора. Только оформление — разметка, id и data-* те же.
 * Токены --s-* — только этого слоя; статусная палитра --st-* не тронута.
 * ══════════════════════════════════════════════════════════════════ */
:root,
[data-theme="dark"] {
  --s-page: #0a0d14;
  --s-card: #121722;
  --s-surface: #0f1520;
  --s-line: #232b3b;
  --s-line-strong: #2e384c;
  --s-dots: #243049;
  --s-glow-a: rgba(47, 91, 234, 0.17);
  --s-glow-b: rgba(138, 99, 232, 0.12);
  --s-glow-c: rgba(255, 150, 110, 0.06);
  --s-glass: rgba(13, 17, 26, 0.86);
  --s-brand-soft: rgba(47, 91, 234, 0.20);
  --s-brand-line: rgba(123, 151, 255, 0.34);
  --s-brand-ink: #9fb2ff;
  --s-sh-xs: 0 1px 2px rgba(0, 0, 0, 0.35);
  --s-sh-card: 0 1px 2px rgba(0, 0, 0, 0.30), 0 12px 30px -20px rgba(0, 0, 0, 0.75);
  --s-sh-lift: 0 18px 40px -22px rgba(0, 0, 0, 0.85), 0 0 0 1px rgba(123, 151, 255, 0.10);
  --s-sh-window: 0 30px 70px -30px rgba(0, 0, 0, 0.85), 0 2px 8px rgba(0, 0, 0, 0.35);
  --s-sh-brand: 0 10px 24px -10px rgba(47, 91, 234, 0.80), inset 0 1px 0 rgba(255, 255, 255, 0.16);
  --s-sh-composer: 0 2px 4px rgba(0, 0, 0, 0.30), 0 18px 40px -26px rgba(47, 91, 234, 0.38);
  --s-tint-green: rgba(30, 158, 90, 0.18);  --s-on-green: #5fd69a;
  --s-tint-red: rgba(210, 70, 62, 0.18);    --s-on-red: #f28b84;
  --s-tint-violet: rgba(122, 82, 217, 0.22); --s-on-violet: #b39af5;
  --s-tint-sky: rgba(27, 139, 194, 0.20);   --s-on-sky: #6cc6ee;
  --s-tint-amber: rgba(201, 130, 9, 0.18);  --s-on-amber: #f0b44c;
  --s-tint-blue: rgba(47, 91, 234, 0.20);   --s-on-blue: #9fb2ff;
  --s-r-card: 20px;
  --s-r-row: 14px;
  --border: var(--s-line);
  --r-card: 20px;
}
[data-theme="light"] {
  --bg: #f6f8fc;
  --s-page: #f6f8fc;
  --s-card: #ffffff;
  --s-surface: #f3f6fb;
  --s-line: #e6eaf2;
  --s-line-strong: #d7deea;
  --s-dots: #c3cee6;
  --s-glow-a: rgba(47, 91, 234, 0.11);
  --s-glow-b: rgba(138, 99, 232, 0.10);
  --s-glow-c: rgba(255, 160, 115, 0.16);
  --s-glass: rgba(255, 255, 255, 0.84);
  --s-brand-soft: #eef2fe;
  --s-brand-line: rgba(47, 91, 234, 0.22);
  --s-brand-ink: #2448c9;
  --s-sh-xs: 0 1px 2px rgba(15, 23, 42, 0.04);
  --s-sh-card: 0 1px 2px rgba(15, 23, 42, 0.04), 0 8px 22px -14px rgba(15, 23, 42, 0.16);
  --s-sh-lift: 0 18px 40px -24px rgba(47, 91, 234, 0.38), 0 2px 6px rgba(15, 23, 42, 0.05);
  --s-sh-window: 0 24px 60px -20px rgba(15, 23, 42, 0.18), 0 2px 6px rgba(15, 23, 42, 0.05);
  --s-sh-brand: 0 10px 22px -10px rgba(47, 91, 234, 0.62), inset 0 1px 0 rgba(255, 255, 255, 0.22);
  --s-sh-composer: 0 2px 4px rgba(15, 23, 42, 0.04), 0 22px 44px -22px rgba(47, 91, 234, 0.30);
  --s-tint-green: #e4f5ec;  --s-on-green: #177a45;
  --s-tint-red: #fdeceb;    --s-on-red: #c0352d;
  --s-tint-violet: #f0eafd; --s-on-violet: #6b45cf;
  --s-tint-sky: #e3f4fb;    --s-on-sky: #12719f;
  --s-tint-amber: #fdf3e1;  --s-on-amber: #8a5800;
  --s-tint-blue: #e8eefe;   --s-on-blue: #2448c9;
  --border: var(--s-line);
  --card-shadow: var(--s-sh-card);
}

/* ── Холст: точки и мягкие пятна бренда/персика, как фон сайта ── */
body {
  background-color: var(--s-page);
  background-image:
    radial-gradient(62rem 42rem at 102% -12%, var(--s-glow-a), transparent 62%),
    radial-gradient(48rem 34rem at -8% 108%, var(--s-glow-c), transparent 62%),
    radial-gradient(44rem 30rem at 58% 118%, var(--s-glow-b), transparent 62%);
  background-attachment: fixed;
  background-repeat: no-repeat;
}
body::before {
  content: '';
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background-image: radial-gradient(color-mix(in srgb, var(--s-dots) 72%, transparent) 1px, transparent 1.3px);
  background-size: 14px 14px;
  /* Точки гуще у краёв и сверху, к середине тают: текст ленты не ложится на узор. */
  -webkit-mask-image: radial-gradient(130% 95% at 50% 0%, rgba(0,0,0,.9) 0%, rgba(0,0,0,.45) 48%, rgba(0,0,0,.18) 100%);
  mask-image: radial-gradient(130% 95% at 50% 0%, rgba(0,0,0,.9) 0%, rgba(0,0,0,.45) 48%, rgba(0,0,0,.18) 100%);
}
::selection { background: color-mix(in srgb, #2f5bea 26%, transparent); }

/* Полосы прокрутки — тонкие и спокойные, как в системе. */
* { scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--hint) 40%, transparent) transparent; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--hint) 34%, transparent); border-radius: 10px; border: 3px solid transparent; background-clip: content-box; }
::-webkit-scrollbar-thumb:hover { background-color: color-mix(in srgb, var(--hint) 55%, transparent); }

:where(button, a, [role="button"], summary, select):focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }

/* ── Десктоп: стеклянные рельс и список поверх холста, главная панель прозрачна ── */
@media (min-width: 960px) {
  #desktop-layout { grid-template-columns: 64px 316px 1fr; }
  #desktop-sidebar,
  [data-theme="light"] #desktop-sidebar,
  #desktop-list-panel,
  [data-theme="light"] #desktop-list-panel {
    /* Полупрозрачная заливка без backdrop-filter: размытие сделало бы панели
       контейнером для position:fixed — выпадающий список вех и подсказки
       рельса уезжали бы под панель списка. */
    background: var(--s-glass);
    border-right: 1px solid var(--s-line);
  }

  #desktop-main-panel { background: transparent; }
  .sidebar-logo { margin-bottom: 18px; }
  .sidebar-btn { width: 42px; height: 42px; border-radius: 13px; }
  .sidebar-btn:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
  .sidebar-btn.active,
  [data-theme="light"] .sidebar-btn.active {
    color: var(--link);
    background: var(--s-brand-soft);
    box-shadow: inset 0 0 0 1px var(--s-brand-line);
  }
  #desktop-sidebar [data-tip]::after { border-radius: 10px; font-weight: 600; box-shadow: var(--s-sh-window); }

  /* Шапка списка: тяжёлый заголовок */
  .dl-header-title { font-size: 20px; font-weight: 750; letter-spacing: -0.025em; }
  .dl-tabs { margin: 2px 14px 4px; padding: 3px; gap: 2px; border: 1px solid var(--s-line); border-radius: 999px; background: color-mix(in srgb, var(--s-surface) 80%, transparent); }
  .dl-tab { padding: 6px 0; border: 0; border-radius: 999px; font-weight: 550; }
  .dl-tab.active { color: var(--text); background: var(--s-card); box-shadow: var(--s-sh-xs), 0 0 0 1px var(--s-line); border-bottom: 0; }
  .dl-projects { padding: 8px 16px 6px; }
  .dl-project-chip { padding: 5px 11px; border-radius: 999px; border: 1px solid var(--s-line); background: var(--s-card); color: var(--hint); font-weight: 500; box-shadow: var(--s-sh-xs); }
  .dl-project-chip:hover { background: var(--s-card); color: var(--text); border-color: var(--s-line-strong); }
  .dl-project-chip.active { background: var(--button); border-color: var(--button); color: #fff; box-shadow: var(--s-sh-brand); }
  .dl-search { padding: 4px 14px 10px; }
  .dl-search input { padding: 9px 14px; border-radius: 999px; border-color: var(--s-line); background: var(--s-card); box-shadow: var(--s-sh-xs); font-size: var(--fs-md); }
  .dl-search input:focus { border-color: var(--link); box-shadow: var(--focus-ring); }

  /* Строки агентов — мягкие карточки с промежутком, выбранная — бренд и полоска слева */
  .dl-list { padding: 2px 10px 14px; }
  .dl-item {
    position: relative;
    margin: 0 0 6px;
    padding: 11px 12px 11px 14px;
    border: 1px solid transparent;
    border-left: 1px solid transparent;
    border-bottom: 1px solid transparent;
    border-radius: 16px;
    transition: background 0.15s, border-color 0.15s, box-shadow 0.15s;
  }
  .dl-item:hover,
  .dl-item.dl-paused:hover, .dl-item.dl-error:hover, .dl-item.dl-interrupted:hover {
    background: var(--s-card);
    border-color: var(--s-line);
    box-shadow: var(--s-sh-xs);
  }
  .dl-item.active,
  .dl-item.active:hover,
  .dl-item.dl-paused.active, .dl-item.dl-error.active, .dl-item.dl-running.active, .dl-item.dl-interrupted.active {
    background: var(--s-brand-soft);
    border-color: var(--s-brand-line);
    box-shadow: none;
  }
  .dl-item::before {
    content: '';
    position: absolute;
    left: -1px; top: 14px; bottom: 14px;
    width: 3px;
    border-radius: 0 3px 3px 0;
    background: transparent;
  }
  .dl-item.active::before { background: var(--button); }
  .dl-item.dl-interrupted, .dl-item.agent-pinned, .dl-item:has(.dl-ask-wait), .dl-item.dl-running, .dl-item.dl-error { border-left-color: transparent; }
  .dl-item.active.dl-interrupted, .dl-item.active.agent-pinned, .dl-item.active:has(.dl-ask-wait), .dl-item.active.dl-running, .dl-item.active.dl-error, .dl-item.active { border-left-color: var(--s-brand-line); }
  .dl-item.dl-running { background: color-mix(in srgb, var(--s-brand-soft) 55%, transparent); border-color: transparent; }
  .dl-item.dl-running::before { background: var(--st-run); }
  .dl-item.dl-interrupted::before, .dl-item:has(.dl-ask-wait)::before { background: var(--st-ask); }
  .dl-item.agent-pinned::before { background: var(--pin); }
  .dl-item.dl-paused:first-of-type, .dl-item.dl-error:first-of-type { margin-top: 0; border-top: 1px solid transparent; }
  .dl-item.active.dl-paused:first-of-type, .dl-item.active.dl-error:first-of-type { border-top-color: var(--s-brand-line); }
  .dl-item-top { margin-bottom: 4px; }
  .dl-item-task { font-size: 13.5px; font-weight: 500; letter-spacing: -0.005em; }
  .dl-item-bottom { margin-top: 6px; }
}

/* ── Шапки экранов: полупрозрачные, как навигация сайта ──
   Без backdrop-filter и без смены позиционирования: в шапках живут
   выпадающий список вех (position:fixed) и меню чата — размытие стало бы
   для них контейнером и сдвинуло бы их. */
.header,
.form-header,
.chat-header {
  background: color-mix(in srgb, var(--s-page) 80%, transparent);
  border-bottom: 1px solid var(--s-line);
}
.form-header h2, .header h1 { font-weight: 750; letter-spacing: -0.025em; }
.form-header h2 { font-size: 20px; }
.chat-title { font-size: 16px; font-weight: 700; letter-spacing: -0.02em; }

/* ── Кнопки: таблетки, главная — бренд с тенью, вторичная — белая с рамкой ── */
.btn-primary,
.btn-save-cta {
  border-radius: 999px;
  background: var(--button);
  color: #fff;
  font-weight: 600;
  letter-spacing: -0.005em;
  box-shadow: var(--s-sh-brand);
  transition: transform 0.15s, filter 0.15s, box-shadow 0.15s;
}
.btn-primary:hover:not(:disabled), .btn-save-cta:hover:not(:disabled) { filter: brightness(1.07); transform: translateY(-1px); }
.btn-primary:active:not(:disabled), .btn-save-cta:active:not(:disabled) { transform: translateY(0) scale(0.99); opacity: 1; }
.btn-primary:disabled, .btn-save-cta:disabled { box-shadow: none; }
.btn-secondary,
.settings-quick-row .btn-secondary {
  border-radius: 999px;
  background: var(--s-card);
  border: 1px solid var(--s-line);
  box-shadow: var(--s-sh-xs);
  font-weight: 600;
}
.btn-secondary:hover { background: var(--s-card); border-color: var(--s-line-strong); box-shadow: var(--s-sh-card); }
.settings-quick-row .btn-secondary { border-radius: 16px; }
.btn-danger { border-radius: 999px; background: var(--s-card); }
.btn-add-cta { box-shadow: var(--s-sh-brand); padding: 9px 16px; }
.btn-icon { border-radius: 10px; }
.btn-icon:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }

/* ── Поля ввода ── */
.form-body input,
.form-body select,
.form-body textarea,
.modal-textarea,
.cmp-filter {
  border-radius: 12px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  box-shadow: var(--s-sh-xs);
}
.form-body input:focus,
.form-body select:focus,
.form-body textarea:focus,
.cmp-filter:focus { border-color: var(--link); box-shadow: var(--focus-ring); }
.form-body label { color: var(--text); font-weight: 600; }

/* ── Чипы: белые таблетки с рамкой, активный — бренд с тенью ── */
.project-chip,
.filter-chip,
.st-chip,
.nt-chip,
.owner-chip {
  border-radius: 999px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  box-shadow: var(--s-sh-xs);
  font-weight: 500;
}
.project-chip:hover, .filter-chip:hover, .st-chip:hover, .nt-chip:hover, .owner-chip:hover { border-color: var(--s-line-strong); background: var(--s-card); color: var(--text); }
.project-chip.active,
.filter-chip.active,
.st-chip.active,
.nt-chip.active,
.owner-chip.active,
[data-theme="light"] .st-chip.active,
[data-theme="light"] .nt-chip.active {
  background: var(--button);
  border-color: var(--button);
  color: #fff;
  box-shadow: 0 6px 14px -8px rgba(47, 91, 234, 0.7);
}

/* ── Карточки: радиус 20, тонкая рамка, мягкая слоистая тень ── */
.agent-card,
.project-card,
.st-group,
.cost-card,
.costs-section,
.nt-project-card,
.tpl-card,
.sched-card,
.inbox-item,
.invite-card,
.lfs-card,
.queue-item,
.team-card,
.runner-card,
[data-theme="light"] .agent-card,
[data-theme="light"] .st-group,
[data-theme="light"] .project-card,
[data-theme="light"] .nt-project-card,
[data-theme="light"] .tpl-card,
[data-theme="light"] .cost-card,
[data-theme="light"] .costs-section,
[data-theme="light"] .invite-card,
[data-theme="light"] .lfs-card,
[data-theme="light"] .queue-item {
  background: var(--s-card);
  border: 1px solid var(--s-line);
  border-radius: var(--s-r-card);
  box-shadow: var(--s-sh-card);
}
.project-card:hover,
.tpl-card:hover,
.nt-project-card:hover,
.sched-card:hover,
.inbox-item:hover {
  border-color: var(--s-brand-line);
  box-shadow: var(--s-sh-lift);
}
.agent-card:hover { border-color: var(--s-line-strong); box-shadow: var(--s-sh-lift); }
.st-group-title, .section-title, .costs-section-title { font-weight: 700; letter-spacing: -0.015em; }

/* ── Пилюли статусов как StatusPill сайта: точка + слово на мягкой подложке ── */
.dl-item-status,
.agent-status-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 22px;
  padding: 0 9px 0 8px;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 550;
  letter-spacing: 0;
}
.dl-item-status::before {
  content: '';
  width: 6px; height: 6px;
  border-radius: 50%;
  background: currentColor;
  flex-shrink: 0;
}
.dl-item-status.s-running::before, .dl-item-status.s-planning::before { animation: s-pulse-dot 1.6s ease-in-out infinite; }
@keyframes s-pulse-dot { 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, currentColor 45%, transparent); } 50% { box-shadow: 0 0 0 4px transparent; } }

/* ── Тосты: карточка с цветной точкой, как уведомление на сайте ── */
.toast {
  /* Точка — абсолютом, а не флексом с gap: iOS Safari не учитывал gap при
     расчёте ширины тоста (контейнер width: max-content), тексту не хватало
     нескольких пикселей, и «Сохранено» ломалось на «Сохранен / о» (11.10.2026). */
  display: block;
  position: relative;
  width: max-content;
  max-width: 100%;
  box-sizing: border-box;
  padding: 11px 16px 11px 32px;
  border-radius: 16px;
  font-size: var(--fs-lg);
  font-weight: 500;
  text-align: left;
  background: var(--s-card);
  color: var(--text);
  border: 1px solid var(--s-line);
  box-shadow: var(--s-sh-window);
}
.toast::before { content: ''; position: absolute; left: 14px; top: 50%; width: 8px; height: 8px; margin-top: -4px; border-radius: 50%; background: var(--link); }
.toast-success, .toast-error, .toast-info { background: var(--s-card); color: var(--text); }
.toast-success::before { background: var(--st-done); }
.toast-error { border-color: var(--st-err-line); }
.toast-error::before { background: var(--st-err); }

/* ── Модалки и листы: окно сайта — радиус 22, глубокая тень, размытая подложка ── */
.modal-overlay {
  background: color-mix(in srgb, #0a0d14 46%, transparent);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
}
.modal-content, .modal-card {
  background: var(--s-card);
  border: 1px solid var(--s-line);
  border-radius: 22px 22px 0 0;
  box-shadow: var(--s-sh-window);
}
@media (min-width: 960px) {
  .modal-content { border-radius: 22px; margin-bottom: auto; margin-top: auto; }
  .modal-overlay { align-items: center; }
}
.modal-card { border-radius: 22px; }
.modal-header { font-weight: 700; letter-spacing: -0.015em; border-bottom-color: var(--s-line); }
.chat-menu-dropdown,
.cmp-popover,
.plus-dropdown,
.agent-menu,
.skills-dropdown,
.cmd-palette {
  border-radius: 16px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  box-shadow: var(--s-sh-window);
}

/* ── Переключатель как на сайте: бренд с белой ручкой ── */

.st-toggle.on { box-shadow: 0 4px 10px -4px rgba(47, 91, 234, 0.7); }

/* ══ Чат: ритм и типографика демо сайта ══ */
/* Колонка ленты по центру и не шире 860px — на широком экране строки не
   растягиваются на всю панель, как окно чата на сайте. */
.chat-messages { padding: 10px max(0px, calc((100% - 880px) / 2)) 18px; }
#screen-chat > .quick-actions,
#screen-chat > .ask-dock,
#screen-chat > .chat-live,
#screen-chat > #chat-input-bar {
  width: 100%;
  max-width: 880px;
  margin-left: auto;
  margin-right: auto;
  box-sizing: border-box;
}
.chat-input-bar { background: transparent; }
body[data-screen="chat"] .chat-input-bar { padding-top: 6px; }

/* Реплика человека: светло-синий пузырь справа, по ширине текста */
.chat-messages .msg-user,
[data-theme="light"] .chat-messages .msg-user {
  width: fit-content;
  max-width: min(80%, 640px);
  margin: 14px 20px 10px auto;
  padding: 10px 16px;
  background: var(--s-brand-soft);
  border: 1px solid var(--s-brand-line);
  border-radius: 20px 20px 6px 20px;
  color: var(--text);
  line-height: 1.55;
}
.chat-messages .msg-user .msg-author { font-size: 11.5px; color: var(--hint); margin-bottom: 4px; }

/* Подпись хода «1do» со знаком над первой репликой агента (класс ставит JS) */
.chat-messages .msg-text.turn-head::before,
.chat-messages.feed-minimal .msg-text.msg-final::before,
.chat-messages.feed-minimal .msg-text.msg-live::before { /* C2: пузырь в «Минимуме» подписан как итог */
  content: '1do';
  display: flex;
  align-items: center;
  height: 24px;
  margin: 1px 0 6px;
  padding-left: 32px;
  background: url('img/avatar-1do.png') no-repeat left center / 24px 24px;
  font-size: 13px;
  font-weight: 650;
  letter-spacing: -0.01em;
  color: var(--text);
  white-space: nowrap;
}
/* C9: живой пузырь в «Минимуме» подписан всегда — иначе подпись появлялась
   в кадре замены пузыря готовым ответом, и ответ съезжал на её высоту. */
.chat-messages.feed-minimal .msg-text.turn-head:not(.msg-final):not(.msg-live)::before { display: none; }
.chat-messages .msg-text { padding: 8px 20px; line-height: 1.65; }
.chat-messages .msg-text.turn-head { padding-top: 14px; }
.chat-messages .msg-text .md-body h1,
.chat-messages .msg-text .md-body h2,
.chat-messages .msg-text .md-body h3 { font-weight: 750; letter-spacing: -0.02em; }

/* Шаги работы — строки как ToolCard сайта: значок в мягком квадрате,
   заголовок, путь моноширинным ниже, справа ✓ и время */
.chat-messages .msg-tool_use.msg-step,
.chat-messages .msg-thinking.msg-step {
  position: relative;
  margin: 6px 20px;
  padding: 10px 76px 10px 54px;
  min-height: 50px;
  border: 1px solid var(--s-line);
  border-left: 1px solid var(--s-line);
  border-radius: var(--s-r-row);
  background: var(--s-card);
  box-shadow: var(--s-sh-xs);
  color: var(--text);
  font-size: 13px;
  line-height: 1.45;
}
.chat-messages .msg-step .step-ico {
  position: absolute;
  left: 11px;
  top: 10px;
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
  border-radius: 9px;
  background: var(--s-surface);
  color: var(--hint);
  box-shadow: inset 0 0 0 1px var(--s-line);
}
.chat-messages .msg-step .step-ico .ico { width: 16px; height: 16px; stroke-width: 1.7; vertical-align: 0; }
.chat-messages .msg-tool_use.msg-step > b:first-of-type,
.chat-messages .msg-tool_use.msg-step summary > b:first-of-type { font-weight: 600; color: var(--text); }
.chat-messages .msg-tool_use.msg-step code.ti {
  padding: 0 4px;
  background: color-mix(in srgb, var(--text) 5%, transparent);
  border-radius: 5px;
  font-size: 11.5px;
  color: var(--hint);
  word-break: break-all;
}
/* Путь сразу за именем инструмента — подзаголовком строки, без подложки */
.chat-messages .msg-tool_use.msg-step b + code.ti,
.chat-messages .msg-tool_use.msg-step b + .code-wrapper > code.ti {
  display: block;
  width: fit-content;
  max-width: 100%;
  margin-top: 2px;
  padding: 0;
  background: none;
  border-radius: 0;
}
.chat-messages .msg-tool_use.msg-step > i { color: var(--hint); font-size: 12px; }
.chat-messages .msg-tool_use.msg-step > code:not(.ti) { margin-top: 6px; border-radius: 10px; background: var(--s-surface); border: 1px solid var(--s-line); font-size: 12px; }
.chat-messages .msg-step .msg-ts {
  position: absolute;
  right: 14px;
  top: 15px;
  float: none;
  margin: 0;
  opacity: 1;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-family: inherit;
  font-size: 11.5px;
  font-variant-numeric: tabular-nums;
  color: var(--hint);
}
/* Готовый шаг: за ним пришёл результат — ✓ перед временем, как на сайте */
.chat-messages .msg-tool_use.msg-step:has(+ .msg-tool_result .step-ok) .msg-ts::before {
  content: '';
  width: 14px; height: 14px;
  background: var(--st-done);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center / contain no-repeat;
}
.chat-messages .msg-tool_use.msg-step:has(+ .msg-tool_result .step-err) .step-ico { background: var(--s-tint-red); color: var(--s-on-red); box-shadow: none; }
/* Идёт прямо сейчас: последний шаг работающего агента (точка статуса в шапке
   чата — «работает») — бренд и вертушка */
#screen-chat:has(.chat-status-dot.st-running) .chat-messages > .msg-tool_use.msg-step:not(.step-has-result):last-child,
#screen-chat:has(.chat-status-dot.st-running) .chat-messages > .msg-tool_use.msg-step:not(.step-has-result):has(+ .msg-live:last-child) {
  border-color: var(--s-brand-line);
}
#screen-chat:has(.chat-status-dot.st-running) .chat-messages > .msg-tool_use.msg-step:not(.step-has-result):last-child .step-ico {
  background: var(--s-brand-soft);
  color: var(--link);
  box-shadow: none;
}
#screen-chat:has(.chat-status-dot.st-running) .chat-messages > .msg-tool_use.msg-step:not(.step-has-result):last-child::after {
  content: '';
  position: absolute;
  right: 14px;
  top: 17px;
  width: 13px; height: 13px;
  border-radius: 50%;
  border: 2px solid var(--s-brand-line);
  border-top-color: var(--link);
  animation: s-spin 0.8s linear infinite;
}
#screen-chat:has(.chat-status-dot.st-running) .chat-messages > .msg-tool_use.msg-step:not(.step-has-result):last-child .msg-ts { right: 34px; }
@keyframes s-spin { to { transform: rotate(360deg); } }

/* Результат шага — продолжение той же карточки снизу */
.chat-messages .msg-tool_result.msg-step {
  margin: -7px 20px 6px;
  padding: 2px 14px 10px 54px;
  border: 1px solid var(--s-line);
  border-top: 0;
  border-left: 1px solid var(--s-line);
  border-radius: 0 0 var(--s-r-row) var(--s-r-row);
  background: var(--s-card);
  color: var(--hint);
  font-size: 12px;
}
.chat-messages .msg-tool_use.msg-step:has(+ .msg-tool_result.msg-step) { border-bottom-left-radius: 0; border-bottom-right-radius: 0; box-shadow: none; }
.chat-messages .msg-tool_result.msg-step .step-ico { display: none; }
.chat-messages .msg-tool_result.msg-step .msg-ts { display: none; }
.chat-messages .msg-tool_result.msg-step pre.tool-output,
.chat-messages .msg-tool_result.msg-step pre {
  margin: 0;
  max-height: 168px;
  overflow: auto;
  border-radius: 10px;
  background: var(--s-surface);
  border: 1px solid var(--s-line);
  font-size: 11.5px;
}
.chat-messages .msg-tool_use.msg-step pre.diff-block { border-radius: 10px; border-color: var(--s-line); }

/* ── Компактный шаг (11.10.2026): вызов и результат — одна строка ─────────
   «⚡ Читает 3 файла ··· ✓ 139 строк › +4 мин». Команда и вывод — в теле,
   которое раскрывается кликом по строке (app.js, _compactStep). */
.chat-messages .msg-step.step-compact {
  margin: 4px 20px;
  padding: 6px 76px 6px 46px;
  min-height: 42px;
  border: 1px solid var(--s-line);
  border-radius: var(--s-r-row);
  background: var(--s-card);
  box-shadow: var(--s-sh-xs);
  color: var(--text);
  font-size: 13px;
}
.chat-messages .msg-step.step-compact .step-ico { display: grid; left: 8px; top: 6px; width: 28px; height: 28px; }
.chat-messages .msg-step.step-compact .msg-ts { top: 12px; }
.chat-messages .msg-step.step-compact .msg-ts::before { display: none; }
.chat-messages .msg-step.step-compact > .step-row {
  display: flex;
  align-items: center;
  gap: 8px;
  min-height: 28px;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  outline: none;
}
.chat-messages .msg-step.step-compact > .step-row:focus-visible { box-shadow: var(--focus-ring); border-radius: 6px; }
.chat-messages .step-row .step-label {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 550;
}
.chat-messages .step-row .diff-stat { flex: none; font-size: 11.5px; }
/* Итог не сжимается раньше подписи: «2 стр…» на телефоне ничего не говорит. */
.chat-messages .step-row .step-meta {
  flex: none;
  max-width: 45%;
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  color: var(--hint);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.chat-messages .step-row .step-meta span { overflow: hidden; text-overflow: ellipsis; }
.chat-messages .step-row .step-meta .ico { flex: none; width: 13px; height: 13px; stroke-width: 2.4; vertical-align: 0; color: var(--st-done); }
.chat-messages .msg-step.step-failed .step-row .step-meta,
.chat-messages .msg-step.step-failed .step-row .step-meta .ico { color: var(--danger); }
.chat-messages .msg-step.step-failed .step-ico { background: var(--s-tint-red); color: var(--s-on-red); box-shadow: none; }
.chat-messages .step-row .step-chev { flex: none; display: inline-flex; color: var(--hint); transition: transform 0.15s ease; }
.chat-messages .step-row .step-chev .ico { width: 14px; height: 14px; vertical-align: 0; }
.chat-messages .msg-step.step-open .step-row .step-chev { transform: rotate(90deg); }
.chat-messages .step-row:hover .step-label,
.chat-messages .step-row:hover .step-chev { color: var(--link); }

.chat-messages .msg-step.step-compact > .step-body { display: none; }
/* Справа у строки место под время и вертушку; телу оно не нужно. */
.chat-messages .msg-step.step-compact.step-open > .step-body { display: block; margin: 6px -62px 2px 0; color: var(--hint); }
.chat-messages .msg-step.step-compact > .step-body > b:first-of-type { font-weight: 600; color: var(--text); }
.chat-messages .msg-step.step-compact > .step-body > i { font-size: 12px; }
.chat-messages .msg-step.step-compact > .step-body > code:not(.ti),
.chat-messages .msg-step.step-compact > .step-body > .code-wrapper > code:not(.ti) {
  margin-top: 6px;
  border-radius: 10px;
  background: var(--s-surface);
  border: 1px solid var(--s-line);
  font-size: 12px;
}
.chat-messages .msg-step.step-compact .step-out { margin-top: 8px; }
.chat-messages .msg-step.step-compact .step-out pre,
.chat-messages .msg-tool_result.msg-step.step-compact pre {
  margin: 0;
  padding: 0;
  max-height: 320px;
  overflow: auto;
  border-radius: 10px;
  background: var(--s-surface);
  border: 1px solid var(--s-line);
  font-size: 11.5px;
}
.chat-messages .msg-step.step-compact .step-out pre code,
.chat-messages .msg-tool_result.msg-step.step-compact pre code { background: none; padding: 8px 10px; border-radius: 0; }
/* Сосед-результат без пары — отдельная строка, а не «хвост» карточки выше. */
.chat-messages .msg-tool_use.msg-step.step-compact:has(+ .msg-tool_result.msg-step) {
  border-radius: var(--s-r-row);
  box-shadow: var(--s-sh-xs);
}
/* Размышление — тише: без рамки, курсив серым, значок-лампочка */
.chat-messages .msg-thinking.msg-step {
  background: transparent;
  border-color: transparent;
  box-shadow: none;
  color: var(--hint);
  opacity: 1;
  font-size: 12.5px;
  padding-top: 13px;
  padding-bottom: 8px;
  min-height: 46px;
}
.chat-messages .msg-thinking.msg-step .step-ico { background: var(--s-tint-violet); color: var(--s-on-violet); box-shadow: none; }
.chat-messages .tool-group-toggle { margin: 4px 20px; padding: 6px 12px; width: fit-content; border-radius: 999px; border: 1px solid var(--s-line); background: var(--s-card); color: var(--hint); font-size: 12px; cursor: pointer; }
.chat-messages .tool-group-toggle:hover { color: var(--text); border-color: var(--s-line-strong); }
/* Старые вложенные уровни (субагент) — та же строка, но уже */
.chat-messages .subagent-group .msg-step { margin-left: 34px; }

/* Разделители статуса — аккуратные таблетки по центру */
.chat-messages .msg-status { padding: 12px 20px; }
.chat-messages .msg-status::before, .chat-messages .msg-status::after { opacity: 1; background: var(--s-line); height: 1px; }
.chat-messages .msg-status .status-label {
  height: 26px;
  padding: 0 11px;
  border-radius: 999px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  box-shadow: var(--s-sh-xs);
  color: color-mix(in srgb, var(--_c) 70%, var(--text));
  font-weight: 550;
}
.chat-messages .status-running .status-label { background: var(--s-brand-soft); border-color: var(--s-brand-line); color: var(--s-brand-ink); }
/* Итог хода — строка «✓ Готово · время» как DoneLine сайта */
.chat-messages .status-result .status-label { background: var(--s-tint-green); border-color: color-mix(in srgb, var(--st-done) 30%, transparent); color: var(--s-on-green); box-shadow: none; }
.chat-messages .status-result .status-label .sl-stats { color: color-mix(in srgb, var(--s-on-green) 70%, var(--hint)); }
.chat-messages .status-result.status-failed .status-label { background: var(--s-tint-red); border-color: var(--st-err-line); color: var(--s-on-red); }

/* Решение оркестратора — тихая техническая карточка */
.orch-decision {
  margin: 6px 8px;
  padding: 10px 14px;
  background: var(--s-card);
  border: 1px solid var(--s-line);
  border-radius: var(--s-r-row);
  box-shadow: var(--s-sh-xs);
  color: var(--hint);
  font-size: 12.5px;
  line-height: 1.6;
}
.orch-decision .orch-title { text-transform: none; letter-spacing: -0.005em; font-size: 13px; font-weight: 650; color: var(--text); margin-bottom: 2px; }
.orch-decision b { color: var(--text); font-weight: 550; }

/* Код, таблицы, план — карточки сайта */
.chat-messages .msg pre { border-radius: 12px; border-color: var(--s-line); background: var(--s-surface); }
.chat-messages .msg :not(pre) > code:not(.ti) { border-radius: 6px; background: color-mix(in srgb, var(--text) 6%, transparent); }
.chat-messages .msg table {
  border-collapse: separate;
  border-spacing: 0;
  border: 1px solid var(--s-line);
  border-radius: 14px;
  overflow: hidden;
  background: var(--s-card);
  box-shadow: var(--s-sh-xs);
}
.chat-messages .msg th,
.chat-messages .msg td { border: 0; border-bottom: 1px solid var(--s-line); padding: 8px 12px; }
.chat-messages .msg tr:last-child td { border-bottom: 0; }
.chat-messages .msg th { background: var(--s-surface); font-weight: 650; color: var(--text); }
.msg-plan-container {
  margin: 12px 20px;
  background: var(--s-card);
  border: 1px solid var(--s-line);
  border-left: 1px solid var(--s-line);
  border-radius: var(--s-r-card);
  box-shadow: var(--s-sh-card);
}
.msg-plan-header { padding: 12px 16px 4px; background: transparent; color: var(--text); font-size: 14px; font-weight: 700; letter-spacing: -0.01em; }
.msg-plan-header .ico { color: var(--link); }
.msg-plan { padding: 6px 16px 14px; }

/* Схемы, графики, виджеты — белая карточка сайта */
.chat-messages .dgm,
.chat-messages .dgm-widget {
  border-radius: var(--s-r-card);
  border: 1px solid var(--s-line);
  background: var(--s-card);
  box-shadow: var(--s-sh-card);
}

/* Файлы результата — список «Создано файлов: 3» с цветными значками по типу */
.agent-attachments-summary {
  margin: 14px 20px 10px;
  padding: 16px;
  gap: 8px;
  background: var(--s-card);
  border: 1px solid var(--s-line);
  border-radius: var(--s-r-card);
  box-shadow: var(--s-sh-card);
}
.aas-title { text-transform: none; letter-spacing: -0.015em; font-size: 15px; font-weight: 750; color: var(--text); margin: 0 2px 4px; }
.agent-attachment-card,
.agent-attachments-summary .agent-attachment-card {
  border-radius: 14px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  box-shadow: var(--s-sh-xs);
  padding: 9px 10px;
}
.agent-attachment-card:hover { border-color: var(--s-line-strong); }
.aac-icon { width: 36px; height: 36px; border-radius: 10px; background: var(--s-tint-blue); color: var(--s-on-blue); }
.aac-icon svg { width: 18px; height: 18px; stroke-width: 1.8; }
.agent-attachment-card[data-ext="xlsx"] .aac-icon, .agent-attachment-card[data-ext="xls"] .aac-icon, .agent-attachment-card[data-ext="csv"] .aac-icon { background: var(--s-tint-green); color: var(--s-on-green); }
.agent-attachment-card[data-ext="pdf"] .aac-icon { background: var(--s-tint-red); color: var(--s-on-red); }
.agent-attachment-card[data-ext="png"] .aac-icon, .agent-attachment-card[data-ext="jpg"] .aac-icon, .agent-attachment-card[data-ext="jpeg"] .aac-icon, .agent-attachment-card[data-ext="webp"] .aac-icon, .agent-attachment-card[data-ext="svg"] .aac-icon, .agent-attachment-card[data-ext="gif"] .aac-icon { background: var(--s-tint-violet); color: var(--s-on-violet); }
.agent-attachment-card[data-ext="html"] .aac-icon, .agent-attachment-card[data-ext="htm"] .aac-icon { background: var(--s-tint-amber); color: var(--s-on-amber); }
.agent-attachment-card[data-ext="zip"] .aac-icon, .agent-attachment-card[data-ext="md"] .aac-icon, .agent-attachment-card[data-ext="txt"] .aac-icon { background: var(--s-tint-sky); color: var(--s-on-sky); }
.aac-name { font-weight: 600; font-size: 13.5px; }
.aac-meta { font-size: 11.5px; }
.aac-btn { width: 32px; height: 32px; border-radius: 10px; border-color: var(--s-line); background: var(--s-card); color: var(--hint); }
.aac-btn:hover { background: var(--s-surface); border-color: var(--s-line-strong); color: var(--text); }
.aac-btn.aac-primary { background: var(--button); color: #fff; border-color: transparent; box-shadow: 0 6px 14px -8px rgba(47, 91, 234, 0.8); }
.aac-btn.aac-primary:hover { background: var(--button); filter: brightness(1.08); }

/* Быстрые ответы под чатом — таблетки сайта, «Выполнено» зелёной пилюлей */
.quick-actions { padding: 8px 20px 4px; gap: 8px; }
.qa-chip {
  height: 34px;
  padding: 0 14px;
  border-radius: 999px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  color: var(--text);
  box-shadow: var(--s-sh-xs);
  font-weight: 500;
}
.qa-chip:hover { border-color: var(--s-brand-line); background: var(--s-brand-soft); color: var(--s-brand-ink); }
.qa-chip.qa-done { background: var(--s-tint-green); color: var(--s-on-green); border-color: color-mix(in srgb, var(--st-done) 28%, transparent); }
.qa-primary { border-radius: 999px; box-shadow: var(--s-sh-brand); }

/* ── Композер: большой радиус, мягкая тень бренда, отправка — круглая таблетка ── */
.composer,
[data-theme="light"] .composer {
  border-radius: 24px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  box-shadow: var(--s-sh-composer);
  padding: 14px 14px 10px 16px;
}
.composer:focus-within { border-color: var(--s-brand-line); box-shadow: var(--s-sh-composer), 0 0 0 4px color-mix(in srgb, #2f5bea 9%, transparent); }
.composer-divider { opacity: 0; height: 2px; }
.composer textarea::placeholder, #chat-input::placeholder { color: color-mix(in srgb, var(--hint) 88%, transparent); }
.ct-icon-btn { border-radius: 999px; }
.cmp-chip { border-radius: 999px; height: 32px; padding: 0 12px; }
#cmp-project-wrap .cmp-chip { background: var(--s-surface); box-shadow: inset 0 0 0 1px var(--s-line); }
#cmp-project-wrap .cmp-chip:hover { background: var(--s-surface); box-shadow: inset 0 0 0 1px var(--s-line-strong); }
.btn-send,
.btn-stop-agent {
  width: 40px;
  height: 40px;
  border-radius: 999px;
}
.btn-send { background: var(--button); color: #fff; box-shadow: var(--s-sh-brand); }
.btn-send:disabled { background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--hint); box-shadow: none; }
.btn-stop-agent { background: var(--text); color: var(--s-page); }
/* «В очередь» — того же круга, что отправка, но второстепенная: без заливки, с рамкой. */
.btn-queue { width: 40px; height: 40px; border-radius: 999px; color: var(--text); border-color: var(--s-line-strong, var(--ov-24)); }

/* ── Вопрос агента на месте поля: карточка «1do спрашивает» ── */
#ask-dock .sdkq-card,
.ask-dock .sdkq-card {
  border-radius: 22px;
  border: 1px solid var(--s-brand-line);
  background: var(--s-card);
  box-shadow: 0 4px 16px -8px rgba(47, 91, 234, 0.35), var(--s-sh-window);
}
.sdkq-top-ttl { color: var(--link); font-weight: 650; letter-spacing: 0; }
#ask-dock .sdkq-question { font-weight: 700; letter-spacing: -0.015em; }
.sdkq-opt {
  border-radius: 14px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  transition: border-color 0.15s, background 0.15s;
}
.sdkq-opt:hover { border-color: var(--s-brand-line); background: color-mix(in srgb, var(--s-brand-soft) 55%, var(--s-card)); }
.sdkq-opt.selected, .sdkq-opt.active, .sdkq-opt:has(input:checked) { border-color: color-mix(in srgb, #2f5bea 50%, transparent); background: var(--s-brand-soft); }
.sdkq-opt-rec { text-transform: none; letter-spacing: 0; font-weight: 600; color: var(--s-brand-ink); background: var(--s-brand-soft); border-radius: 999px; padding: 2px 8px; }
.sdkq-key { border-radius: 6px; border-color: var(--s-line); }
.sdkq-submit { border-radius: 999px; box-shadow: var(--s-sh-brand); }

/* Плашки над полем ввода и строка «агент работает» */
.chat-pending-banner, .chat-pool-banner { border-radius: 16px; }
.chat-jump { border-radius: 999px; box-shadow: var(--s-sh-brand); }

/* ══ Главная: тяжёлый заголовок с градиентным словом, композер героя, шаблоны ══ */
/* Акцент — переливом знака 1do, как глагол в заголовке сайта: начало фразы
   цветом текста, «запускаем?» уходит в бренд → фиолет → персик. */
.home-greet,
[data-theme="light"] .home-greet {
  margin: 0 0 28px;
  font-size: clamp(30px, calc(var(--vw) * 4.2), 44px);
  font-weight: 800;
  letter-spacing: -0.035em;
  line-height: 1.08;
  color: transparent;
  background-image: linear-gradient(100deg, var(--text) 0%, var(--text) 36%, #2f5bea 56%, #7a52d9 80%, #c9674a 100%);
  -webkit-background-clip: text;
  background-clip: text;
}
[data-theme="dark"] .home-greet,
:root:not([data-theme="light"]) .home-greet {
  background-image: linear-gradient(100deg, var(--text) 0%, var(--text) 36%, #7b97ff 56%, #b39af5 78%, #f0a98c 100%);
}
.home-col { max-width: 760px; }
.home-greet { width: fit-content; max-width: 100%; align-self: center; padding: 0 2px 4px; }
#home-hero .composer { border-radius: 26px; padding: 16px 16px 12px 18px; }
#home-hero .composer textarea { font-size: 16px; }
.home-slot { margin-top: 26px; }
.home-suggest { display: block; }
.home-suggest .hs-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 4px 10px; font-size: 13px; color: var(--hint); }
.home-suggest .hs-all { display: inline-flex; align-items: center; gap: 2px; border: 0; background: none; color: var(--link); font: inherit; font-weight: 550; cursor: pointer; padding: 4px 2px; }
.home-suggest .hs-all .ico { width: 15px; height: 15px; }
.home-suggest .hs-head-act { display: inline-flex; align-items: center; gap: 12px; }
.home-suggest .hs-fold { border: 0; background: none; color: var(--hint); font: inherit; font-weight: 550; cursor: pointer; padding: 4px 2px; }
.home-suggest .hs-fold:hover { color: var(--text); }
.home-suggest .hs-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
.hs-card {
  display: flex;
  align-items: flex-start;
  gap: 11px;
  min-width: 0;
  padding: 13px 14px;
  text-align: left;
  font: inherit;
  color: var(--text);
  background: var(--s-card);
  border: 1px solid var(--s-line);
  border-radius: 18px;
  box-shadow: var(--s-sh-card);
  cursor: pointer;
  transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}
.hs-card:hover { transform: translateY(-2px); border-color: var(--s-brand-line); box-shadow: var(--s-sh-lift); }
.hs-ico { flex: 0 0 32px; height: 32px; display: grid; place-items: center; border-radius: 10px; }
.hs-ico .ico { width: 17px; height: 17px; stroke-width: 1.7; }
.hs-green { background: var(--s-tint-green); color: var(--s-on-green); }
.hs-blue { background: var(--s-tint-blue); color: var(--s-on-blue); }
.hs-violet { background: var(--s-tint-violet); color: var(--s-on-violet); }
.hs-amber { background: var(--s-tint-amber); color: var(--s-on-amber); }
.hs-sky { background: var(--s-tint-sky); color: var(--s-on-sky); }
.hs-tx { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.hs-tx b { font-size: 13.5px; font-weight: 650; letter-spacing: -0.01em; line-height: 1.3; }
.hs-tx small { font-size: 12px; color: var(--hint); line-height: 1.35; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
@media (prefers-reduced-motion: reduce) { .hs-card, .hs-card:hover { transition: none; transform: none; } }
@media (max-width: 959px) {
  .home-greet, [data-theme="light"] .home-greet { font-size: 32px; margin-bottom: 20px; }
  .home-slot { margin-top: 18px; }
  /* Телефон: шаблоны лентой вбок, край следующей карточки подсказывает «листайте» */
  .home-hero { padding-bottom: 14px; }
  .home-suggest .hs-grid {
    scroll-padding-inline: 16px;
    display: flex;
    gap: 10px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    margin: 0 -16px;
    padding: 2px 16px 8px;
    scrollbar-width: none;
  }
  .home-suggest .hs-grid::-webkit-scrollbar { display: none; }
  .hs-card { flex: 0 0 74%; scroll-snap-align: start; }
}

/* Лента карточек на главной (телефон) */
.agent-card { padding: 14px 16px; }
.agent-card .agent-task { font-weight: 500; letter-spacing: -0.005em; }
.agent-card.agent-paused, [data-theme="light"] .agent-card.agent-paused, .agent-card.agent-error { background: var(--s-card); }
.agent-card .agent-project { background: var(--s-surface); box-shadow: inset 0 0 0 1px var(--s-line); }
.tab-bar { border-bottom-color: var(--s-line); }
.tab { font-weight: 550; }
.tab.active { font-weight: 700; }

/* ══ Экраны-списки: проекты, рутины, входящие, команды, новая задача ══ */
.projects-grid { gap: 12px; }
.project-card { padding: 16px 18px; }
.project-card .pc-name { font-size: 15px; font-weight: 700; letter-spacing: -0.015em; }
.sched-card { padding: 16px 18px; margin-top: 12px; }
.sched-name { font-size: 15px; font-weight: 700; letter-spacing: -0.015em; }
.sched-tag { background: var(--s-surface); box-shadow: inset 0 0 0 1px var(--s-line); border-radius: 999px; padding: 3px 10px; }
.inbox-item { border-radius: 18px; }
.nt-project-card { border-radius: 18px; }
.nt-project-card.active { border-color: color-mix(in srgb, #2f5bea 50%, transparent); background: var(--s-brand-soft); box-shadow: 0 0 0 3px color-mix(in srgb, #2f5bea 10%, transparent); }
.tpl-card { border-radius: 16px; }
.tpl-card:hover { transform: translateY(-1px); }
.nt-input-bar { background: color-mix(in srgb, var(--s-page) 92%, transparent); border-top-color: var(--s-line); }
.nt-input-wrapper { border-radius: 22px; border: 1px solid var(--s-line); background: var(--s-card); box-shadow: var(--s-sh-composer); }
.st-group { padding: 4px 0; }
.st-row + .st-row { border-top-color: var(--s-line); }
.empty-state p { color: var(--hint); }
.costs-section, .cost-card { border-radius: var(--s-r-card); }

/* Баннеры над экранами и приглашения */
.invite-banner { border-radius: 18px; box-shadow: var(--s-sh-window); }

/* ══ Вход: карточка-окно на холсте с точками ══ */
#login-modal .login-modal-content,
.login-modal-content {
  background: var(--s-card);
  border: 1px solid var(--s-line);
  border-radius: 24px;
  box-shadow: var(--s-sh-window);
}
#login-modal {
  background-color: var(--s-page);
  background-image:
    radial-gradient(40rem 28rem at 85% 0%, var(--s-glow-a), transparent 65%),
    radial-gradient(36rem 26rem at 10% 100%, var(--s-glow-c), transparent 65%),
    radial-gradient(color-mix(in srgb, var(--s-dots) 70%, transparent) 1px, transparent 1.3px);
  background-size: auto, auto, 14px 14px;
}
.login-modal-content { max-width: 400px; width: calc(100% - 32px); overflow: hidden; }
.login-brand { padding: 30px 26px 4px; }
.login-brand-title { font-size: 24px; font-weight: 800; letter-spacing: -0.03em; }
.login-modal-body { padding: 20px 26px 28px; }
#auth-pane-local input,
#auth-pane-crm input,
.login-input {
  padding: 12px 14px !important;
  border-radius: 12px !important;
  border: 1px solid var(--s-line) !important;
  background: var(--s-card) !important;
  box-shadow: var(--s-sh-xs);
  font-size: 15px !important;
}
#auth-pane-local input:focus,
#auth-pane-crm input:focus,
.login-input:focus { border-color: var(--link) !important; box-shadow: var(--focus-ring); outline: none; }
.auth-tabs { border-radius: 999px; }

/* ══ Телефон: те же карточки, отступы плотнее, таб-бар — стекло ══ */
@media (max-width: 959px) {
  .chat-messages { padding: 6px 0 12px; }
  .chat-messages .msg-user,
  [data-theme="light"] .chat-messages .msg-user { margin: 12px 12px 8px auto; max-width: 86%; padding: 9px 14px; }
  .chat-messages .msg-text { padding: 8px 14px; }
  .chat-messages .msg-tool_use.msg-step,
  .chat-messages .msg-thinking.msg-step { margin: 6px 12px; }
  .chat-messages .msg-tool_result.msg-step { margin: -7px 12px 6px; padding-left: 14px; }
  .chat-messages .msg-tool_result.msg-step pre { max-height: 140px; }
  .chat-messages .msg-step.step-compact { margin: 4px 12px; padding-left: 46px; }
  .chat-messages .msg-step.step-compact .step-out pre,
  .chat-messages .msg-tool_result.msg-step.step-compact pre { max-height: 260px; }
  .agent-attachments-summary { margin: 12px 12px 8px; padding: 12px; }
  .msg-plan-container { margin: 12px; }
  .quick-actions { padding: 8px 12px 4px; }
  .chat-messages .msg-status { padding: 10px 12px; }

  #mobile-tab-bar,
  [data-theme="light"] #mobile-tab-bar {
    background: color-mix(in srgb, var(--s-card) 94%, transparent);
    border-top: 1px solid var(--s-line);
    box-shadow: 0 -10px 30px -22px rgba(15, 23, 42, 0.35);
  }
  #mobile-tab-bar .tab-btn { position: relative; gap: 3px; }
  #mobile-tab-bar .tab-btn svg { width: 22px; height: 22px; padding: 0; }
  #mobile-tab-bar .tab-btn.active { color: var(--link); }
  #mobile-tab-bar .tab-btn.active svg { filter: drop-shadow(0 4px 8px rgba(47, 91, 234, 0.35)); }
  #mobile-tab-bar .tab-btn.active span:not(.tab-badge) { font-weight: 700; }
  #mobile-tab-bar .tab-btn.active::before {
    content: '';
    position: absolute;
    top: -6px;
    left: 50%;
    width: 22px;
    height: 3px;
    margin-left: -11px;
    border-radius: 0 0 3px 3px;
    background: var(--button);
  }
  .header { padding-bottom: 12px; }
  .projects-bar { padding-top: 10px; }
  .modal-content { border-radius: 24px 24px 0 0; }
}

/* ══ Рутина — карточка как «Утренняя сводка продаж» на сайте ══ */
@media (min-width: 960px) {
  #screen-schedules > .form-body,
  #screen-runners > .form-body,
  #screen-teams > .form-body { max-width: 880px; margin: 0 auto; width: 100%; }
}
.runners-intro { background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px; box-shadow: var(--s-sh-xs); }
.sched-card { position: relative; padding: 18px 20px 14px 72px; }
.sched-card::before {
  content: '';
  position: absolute;
  left: 18px;
  top: 16px;
  width: 38px;
  height: 38px;
  border-radius: 12px;
  background: var(--s-brand-soft);
  box-shadow: inset 0 0 0 1px var(--s-brand-line);
}
.sched-card::after {
  content: '';
  position: absolute;
  left: 28px;
  top: 26px;
  width: 18px;
  height: 18px;
  background: var(--link);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5'/%3E%3Cpath d='M16 2v4M8 2v4M3 10h5'/%3E%3Ccircle cx='16' cy='16' r='6'/%3E%3Cpath d='M16 14v2l1.5 1'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5'/%3E%3Cpath d='M16 2v4M8 2v4M3 10h5'/%3E%3Ccircle cx='16' cy='16' r='6'/%3E%3Cpath d='M16 14v2l1.5 1'/%3E%3C/svg%3E") center / contain no-repeat;
}
.sched-card.sched-off::before { background: var(--s-surface); box-shadow: inset 0 0 0 1px var(--s-line); }
.sched-card.sched-off::after { background: var(--hint); }
.sched-head .sched-toggle {
  height: 30px;
  padding: 0 12px;
  border-radius: 999px;
  border: 1px solid var(--s-line);
  background: var(--s-card);
  font-weight: 550;
  color: var(--hint);
  box-shadow: var(--s-sh-xs);
}
.sched-head .sched-toggle:hover { color: var(--text); border-color: var(--s-line-strong); text-decoration: none; }
.sched-off .sched-head .sched-toggle { background: var(--button); border-color: var(--button); color: #fff; box-shadow: var(--s-sh-brand); }
.sched-runs-box { margin-top: 12px; padding: 10px 14px; border-radius: 12px; background: var(--s-surface); border: 1px solid var(--s-line); }
.sched-times { margin-top: 10px; }
.sched-actions { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--s-line); }
.sched-actions .btn-link { color: var(--hint); font-weight: 550; }
.sched-actions .btn-link:hover { color: var(--link); text-decoration: none; }
@media (max-width: 959px) {
  .sched-card { padding: 16px 16px 12px 60px; }
  .sched-card::before { left: 14px; top: 16px; width: 32px; height: 32px; border-radius: 10px; }
  .sched-card::after { left: 21px; top: 23px; }
}

/* Совет агента в вопросе — бренд, а не зелёный */
.sdkq-opt.rec { border-color: var(--s-brand-line); }

/* Полоса шаблонов на «Новой задаче» — карточки-таблетки со значком в квадрате */
.tpl-card-mini { display: inline-flex; align-items: center; gap: 9px; padding: 6px 14px 6px 6px; border-radius: 999px; box-shadow: var(--s-sh-xs); }
.tpl-card-mini .tpl-card-icon.hs-ico { flex: 0 0 28px; height: 28px; border-radius: 999px; font-size: inherit; }
.tpl-card-mini .tpl-card-icon .ico { width: 15px; height: 15px; }
.tpl-card-mini .tpl-card-title { font-weight: 550; }
.tpl-card-all { padding: 6px 14px; color: var(--link); }

/* Строка «агент работает» — мягкая брендовая плашка по ширине поля ввода.
   Ширина с полями 12px, как у поля ввода: общее правило колонки выше ставит
   width:100% и обнуляет боковые поля — на телефоне таблетка упиралась в края
   экрана (10.10.2026). */
#screen-chat > .chat-live { width: calc(100% - 24px); max-width: 856px; }
.chat-live {
  /* Не таблетка: при высоте ~31px полный радиус даёт полукруглые торцы,
     а у поля ввода под ней углы 24px — формы разные, глаз цепляется.
     Скруглённый прямоугольник 12px — та же форма, радиус в пропорции
     к высоте (12.10.2026). */
  border-radius: 12px;
  background: var(--s-brand-soft);
  box-shadow: inset 0 0 0 1px var(--s-brand-line);
  color: var(--s-brand-ink);
  font-weight: 500;
}
.chat-live-time { color: var(--hint); opacity: 1; }
.msg-user .msg-hint-tag { text-transform: none; letter-spacing: 0; font-size: 11.5px; font-weight: 600; color: var(--s-brand-ink); opacity: 1; }
.sdkq-submit:disabled { box-shadow: none; }

/* Меньше движения — без пульса, вертушки и подъёма карточек */
@media (prefers-reduced-motion: reduce) {
  .dl-item-status::before,
  #screen-chat:has(.chat-status-dot.st-running) .chat-messages > .msg-tool_use.msg-step:not(.step-has-result):last-child::after { animation: none; }
  .btn-primary:hover:not(:disabled), .btn-save-cta:hover:not(:disabled), .tpl-card:hover { transform: none; }
}

/* Сегментированный переключатель — белая «таблетка» на мягкой подложке, как вкладки сайта */
.seg { padding: 4px; gap: 4px; background: var(--s-surface); border: 1px solid var(--s-line); border-radius: 999px; }
.seg-btn { border-radius: 999px; font-weight: 550; }
.seg-btn.active { color: #fff; background: var(--button); box-shadow: 0 6px 14px -8px rgba(47, 91, 234, 0.75); }
.modal-card .form-body input, .modal-card .form-body select, .modal-card .form-body textarea,
.modal-card input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
.modal-card select, .modal-card textarea { border-radius: 12px; border-color: var(--s-line); }

/* Проект — значок папки в мягком квадрате слева, как строки «Сайты и боты» на сайте */
.project-card { position: relative; padding-left: 70px; }
.project-card::before {
  content: '';
  position: absolute;
  left: 16px;
  top: 15px;
  width: 38px;
  height: 38px;
  border-radius: 12px;
  background: var(--s-tint-blue);
}
.project-card::after {
  content: '';
  position: absolute;
  left: 26px;
  top: 25px;
  width: 18px;
  height: 18px;
  background: var(--s-on-blue);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z'/%3E%3C/svg%3E") center / contain no-repeat;
}
.project-card .pc-path { font-size: 11.5px; }
@media (max-width: 959px) { .project-card { padding-left: 62px; } .project-card::before { left: 14px; width: 34px; height: 34px; border-radius: 10px; } .project-card::after { left: 22px; top: 23px; } }

/* ══════════════════════════════════════════════════════════════════
 * UX2, раунд 1 (08.10.2026): «одно действие в одном месте».
 * Новая задача — композер главной; меню аватара и лист «Ещё»; кнопка-
 * список вместо лент чипов; живой ответ набором; живой график; файлы;
 * виджет; настройки по разделам. Раздел последний — перекрывает слои выше.
 * ══════════════════════════════════════════════════════════════════ */

/* ── Меню-список (openMenuSelect) ── */
.menu-select {
  position: fixed; z-index: 1400; min-width: 200px; max-width: min(360px, calc(var(--vw) * 100 - 16px));
  max-height: min(440px, calc(var(--vh) * 100 - 24px));
  display: flex; flex-direction: column;
  padding: 6px; background: var(--s-card); color: var(--text);
  border: 1px solid var(--s-line); border-radius: 16px; box-shadow: var(--s-sh-window);
  animation: agentMenuIn .12s ease;
}
.menu-select .ms-list { overflow-y: auto; display: flex; flex-direction: column; gap: 1px; min-height: 0; }
.menu-select .ms-search {
  margin: 2px 2px 6px; padding: 8px 10px; font: inherit; font-size: 14px; color: var(--text);
  background: var(--s-surface); border: 1px solid var(--s-line); border-radius: 10px; outline: none;
}
.menu-select .ms-search:focus { border-color: var(--s-brand-line); }
.menu-select .ms-item {
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
  padding: 9px 10px; border: 0; border-radius: 10px; background: transparent; color: var(--text);
  font: inherit; font-size: 14px; font-weight: 500; cursor: pointer; min-height: 38px;
}
.menu-select .ms-item:focus-visible { background: color-mix(in srgb, var(--text) 6%, transparent); outline: none; }
/* Наведение — только там, где есть мышь: на телефоне лист «Ещё» всплывает под
   пальцем, и залипший :hover красил «Выйти», будто пункт уже выбран. */
@media (hover: hover) { .menu-select .ms-item:hover { background: color-mix(in srgb, var(--text) 6%, transparent); outline: none; } }
.menu-select .ms-item:active { background: color-mix(in srgb, var(--text) 8%, transparent); }
.menu-select .ms-item.active { color: var(--link); }
.menu-select .ms-item.danger { color: var(--destructive, #d2463e); }
.menu-select .ms-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: flex; flex-direction: column; }
.menu-select .ms-hint { font-size: 12px; font-weight: 400; color: var(--hint); white-space: normal; }
.menu-select .ms-count { font-size: 12px; color: var(--hint); font-variant-numeric: tabular-nums; }
.menu-select .ms-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.menu-select .ms-ico { display: inline-flex; color: var(--hint); flex: none; }
.menu-select .ms-item.danger .ms-ico { color: inherit; }
.menu-select .ms-check { flex: none; color: var(--link); }
.menu-select .ms-sep { height: 1px; margin: 5px 6px; background: var(--s-line); }
.menu-select .ms-heading { padding: 8px 10px 4px; font-size: 12px; color: var(--hint); font-weight: 600; }
.menu-select .ms-title { padding: 4px 10px 10px; font-size: 17px; font-weight: 700; }
.menu-select-scrim { position: fixed; inset: 0; z-index: 1390; background: rgba(8, 12, 20, .36); animation: msScrim .15s ease; }
@keyframes msScrim { from { opacity: 0; } to { opacity: 1; } }
.menu-select.menu-select-sheet {
  max-height: calc(var(--vh) * 100 - 48px);
  left: 0 !important; right: 0; bottom: 0; top: auto !important; max-width: none; width: 100%;
  border-radius: 22px 22px 0 0; padding: 10px 10px calc(14px + env(safe-area-inset-bottom, 0px));
  animation: msSheetUp .2s cubic-bezier(.2,.8,.2,1);
}
.menu-select.menu-select-sheet .ms-item { min-height: 48px; font-size: 16px; padding: 12px 12px; }
@keyframes msSheetUp { from { transform: translateY(24px); opacity: .4; } to { transform: none; opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  .menu-select, .menu-select.menu-select-sheet, .menu-select-scrim { animation: none; }
}

/* ── Боковая панель: «Новая задача» подписанной кнопкой, аватар с меню (S-03, S-05) ── */
@media (min-width: 960px) {
  #desktop-layout { grid-template-columns: 64px 316px 1fr; }
  #desktop-sidebar { width: 64px; min-width: 64px; }
  /* Надпись «1do.», как в шапке телефона, а не знак: 42px по ширине
     помещаются в рейку 64px. */
  .sidebar-wordmark { width: 42px; height: auto; }
  /* «Новая задача» — та же клетка 40×40, что у иконок панели: синий
     скруглённый квадрат с «+», подпись — всплывающей подсказкой, как у
     соседей (мелкая надпись внутри кнопки выглядела втиснутой). */
  .sidebar-btn.sidebar-new-task {
    width: 40px; height: 40px; min-height: 40px; flex: none; margin: 2px 0 12px;
    padding: 0; gap: 0;
    color: #fff; background: var(--button); border-radius: 12px;
    box-shadow: 0 6px 16px -8px rgba(47, 91, 234, .65);
  }
  .sidebar-btn.sidebar-new-task svg { width: 20px; height: 20px; }
  .sidebar-btn.sidebar-new-task:hover { color: #fff; background: var(--button); filter: brightness(1.08); }
  .sidebar-btn.sidebar-new-task.active { color: #fff; background: var(--button); box-shadow: var(--s-sh-brand); }
  .sidebar-new-label { display: none; }
  .sidebar-avatar-btn { border: 0; padding: 0; background: transparent; cursor: pointer; border-radius: 50%; }
  .sidebar-avatar-btn:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }
  .sidebar-avatar-btn[aria-expanded="true"] .sidebar-avatar { box-shadow: 0 0 0 2px var(--link); }
}

/* ── Телефон: пять вкладок, в чате вкладок нет (S-04, S-20) ── */
@media (max-width: 959px) {
  #mobile-tab-bar .tab-btn span:not(.tab-badge) { white-space: nowrap; font-size: 11px; }
  body[data-screen="chat"] #mobile-tab-bar { display: none !important; }
  body[data-screen="chat"] .chat-input-bar { padding-bottom: calc(8px + env(safe-area-inset-bottom, 0px)); }
  body[data-screen="chat"] .chat-action-bar { padding-bottom: calc(8px + env(safe-area-inset-bottom, 0px)); }
  #screen-costs .costs-body, #costs-dashboard { padding-left: 16px; padding-right: 16px; }
  #screen-costs, #screen-admin-costs { padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px) + 8px); }
}

/* ── Служебные строки чата (S-25) и мягкий pop «Готово» (S-26) ── */
.chat-messages .msg-status.status-running.sl-superseded { display: none; }
.chat-messages .msg-status .sl-start .sl-title { font-weight: 500; color: var(--hint); }
.chat-messages .msg-status.status-done:not(.msg-no-anim) { animation: doneLinePop .2s ease-out; transform-origin: left center; }
@keyframes doneLinePop { from { transform: scale(.96); opacity: .4; } to { transform: none; opacity: 1; } }

/* ── Рамка «агент работает» — только внутри чата, 2px, без вращения (S-26) ── */
.agent-glow-border { display: none !important; }
#screen-chat { position: relative; }
#screen-chat::after {
  content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 5;
  border-radius: inherit; box-shadow: inset 0 0 0 2px var(--glow-c, transparent); opacity: 0;
}
/* C-done-ring: «Готово» не обводит весь чат зелёным — ответ проявляется сам
   и сам является сигналом; кольцо спорило с ним. Ошибка, остановка и вопрос
   кольцо сохраняют: там нужно внимание. */
body[data-glow="flash-done"] #screen-chat::after { animation: none; }
body[data-glow="flash-failed"] #screen-chat::after { --glow-c: #e0473e; animation: chatRing 1.2s ease-out; }
body[data-glow="flash-stopped"] #screen-chat::after { --glow-c: #e59a0b; animation: chatRing 1.2s ease-out; }
body[data-glow="flash-question"] #screen-chat::after { --glow-c: var(--link); animation: chatRing 2s ease-in-out 3; }
@keyframes chatRing { 0% { opacity: 0; } 25% { opacity: 1; } 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  #screen-chat::after { display: none; }
  .chat-messages .msg-status.status-done { animation: none; }
}

/* ── Кнопка-список фильтра (S-06) ── */
.proj-select {
  display: inline-flex; align-items: center; gap: 7px; max-width: 100%;
  padding: 7px 10px 7px 12px; border-radius: 999px; cursor: pointer;
  font: inherit; font-size: 13.5px; font-weight: 600; color: var(--text);
  background: var(--s-card); border: 1px solid var(--s-line); box-shadow: var(--s-sh-xs);
}
.proj-select:hover { border-color: var(--s-line-strong); }
.proj-select[aria-expanded="true"] { border-color: var(--s-brand-line); box-shadow: 0 0 0 3px var(--s-brand-soft); }
.proj-select .ico, .proj-select > svg:first-child { width: 15px; height: 15px; color: var(--hint); flex: none; }
.proj-select .ps-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proj-select .ps-caret { color: var(--hint); flex: none; }
.proj-select .ps-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.proj-select.is-set { color: var(--s-brand-ink); background: var(--s-brand-soft); border-color: var(--s-brand-line); }
@media (max-width: 959px) {
  #tab-bar { align-items: center; gap: 4px; }
  #tab-bar .tab { flex: 0 0 auto; padding: 10px 6px; margin-right: 10px; }
}

/* ── Ряд под ответом без прокрутки вбок (S-07) ── */
#quick-actions:not(.poll-mode) { flex-wrap: wrap; overflow-x: visible; row-gap: 8px; max-height: 96px; }
#quick-actions .qa-chip, #quick-actions .qa-primary { flex-shrink: 0; white-space: nowrap; }
#quick-actions .qa-more { padding-left: 10px; padding-right: 10px; min-width: 38px; justify-content: center; }
#quick-actions .qa-more svg { width: 18px; height: 18px; }

/* ── Решение по плану на карточке плана (S-18) ── */
.plan-actions {
  display: flex; flex-direction: column; gap: 10px; margin: 0; padding: 12px 16px 14px;
  border-top: 1px solid var(--s-line);
}
.plan-actions .plan-wait { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; color: var(--s-on-amber); }
.plan-actions .plan-wait .ico, .plan-actions .plan-wait svg { width: 15px; height: 15px; }
.plan-actions .plan-btns { display: flex; flex-wrap: wrap; gap: 8px; }
.plan-actions .qa-primary, .plan-actions .qa-chip { white-space: nowrap; }
/* итог хода «Готово» под ожидающим планом не нужен — статус в карточке */
/* RR-5: прячем только строки «готово» хода плана; ошибка, лимит, сжатие — видны. */
.chat-messages .msg-plan-container:has(.plan-actions) ~ .msg-status:is(.status-result, .status-done, .status-completed) { display: none; }

/* ── Карточка задачи в две строки (S-19) ── */
.agent-card.agent-card-2l { display: flex; flex-direction: column; gap: 4px; padding: 12px 12px 12px 16px; }
.agent-card-2l .ac-head { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
/* display: block обязателен: от общего .agent-card .agent-task остаётся
   -webkit-box с line-clamp, а Safari на -webkit-box многоточие не рисует —
   заголовок на iPhone обрезался посреди буквы (11.10.2026). */
.agent-card-2l .ac-head .agent-task {
  flex: 1; min-width: 0; margin: 0; font-size: 15px; font-weight: 600; line-height: 1.3; color: var(--text);
  display: block; -webkit-line-clamp: none;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.agent-card-2l .ac-time { flex: none; font-size: 12.5px; color: var(--hint); line-height: 1.6; font-variant-numeric: tabular-nums; }
.agent-card-2l .ac-head .agent-menu-btn { flex: none; margin: -4px -6px -4px 0; width: 28px; height: 28px; }
.agent-card-2l .ac-sub { display: flex; align-items: center; gap: 6px; min-width: 0; flex-wrap: nowrap; margin: 0; font-size: 13px; color: var(--hint); }
.agent-card-2l .ac-sub .agent-project { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0; background: none; border: 0; font-size: 13px; color: var(--hint); flex: 0 1 auto; }
.agent-card-2l .ac-sep { color: var(--hint); opacity: .6; }
.agent-card-2l .agent-status-tag { display: inline-flex; align-items: center; gap: 4px; padding: 0; background: none; border: 0; font-size: 13px; font-weight: 500; color: var(--hint); white-space: nowrap; flex: none; }
.agent-card-2l .agent-status-tag .si { width: 14px; height: 14px; }
.agent-card-2l .agent-status-tag.status-tag-completed, .agent-card-2l .agent-status-tag.status-tag-done { color: var(--s-on-green); }
.agent-card-2l .agent-status-tag.status-tag-failed { color: var(--s-on-red); }
.agent-card-2l .agent-status-tag.status-tag-running, .agent-card-2l .agent-status-tag.status-tag-waiting_input { color: var(--link); }
.agent-card-2l .agent-avatar { width: 18px; height: 18px; font-size: 10px; flex: none; }
.agent-card-2l .agent-bottom:empty { display: none; }
.agent-card-2l .agent-bottom { margin-top: 4px; }

.dl-item.dl-item-2l { display: flex; flex-direction: column; gap: 4px; }
.dl-item-2l .dl-item-head { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
.dl-item-2l .dl-item-head .dl-item-task {
  flex: 1; min-width: 0; margin: 0; font-size: 14px; font-weight: 600; line-height: 1.35; color: var(--text);
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;
}
.dl-item-2l .dl-item-time { flex: none; margin: 0; font-size: 12px; color: var(--hint); line-height: 1.7; font-variant-numeric: tabular-nums; }
.dl-item-2l .dl-menu-btn { flex: none; margin: -2px -6px 0 0; }
.dl-item-2l .dl-item-bottom { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: 12.5px; color: var(--hint); margin: 0; }
.dl-item-2l .dl-item-project { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 0 1 auto; color: var(--hint); font-size: 12.5px; padding: 0; background: none; }
.dl-item-2l .dl-sep { opacity: .6; }
.dl-item-2l .dl-item-status { padding: 0; background: none; border: 0; font-size: 12.5px; font-weight: 500; white-space: nowrap; flex: none; color: var(--hint); }
.dl-item-2l .dl-item-status::before { display: none; }
.dl-item-2l .dl-item-status.s-completed, .dl-item-2l .dl-item-status.s-done { color: var(--s-on-green); }
.dl-item-2l .dl-item-status.s-failed { color: var(--s-on-red); }
.dl-item-2l .dl-item-status.s-running, .dl-item-2l .dl-item-status.s-waiting_input { color: var(--link); }
.dl-item-2l .dl-item-cost { margin-left: auto; font-size: 11.5px; color: var(--hint); opacity: .8; font-variant-numeric: tabular-nums; flex: none; }
.dl-item-2l .dl-item-model { font-size: 11.5px; color: var(--hint); white-space: nowrap; }

/* ── Шапка чата на телефоне (S-20) ── */
.chat-meta .meta-part + .meta-part::before { content: '·'; margin: 0 6px; color: var(--hint); opacity: .6; }
.chat-status-dot { width: 8px; height: 8px; }
@media (max-width: 600px) {
  .chat-title-text { -webkit-line-clamp: 1; white-space: nowrap; display: block; overflow: hidden; text-overflow: ellipsis; }
  .chat-title .chat-status-dot { margin-top: calc(0.65em - 4px); }
  .chat-meta .meta-model, .chat-meta .meta-cost, .chat-meta .meta-time { display: none; }
}
.details-modal .details-title { font-size: 17px; font-weight: 700; margin-bottom: 12px; }
.details-modal .details-list { display: grid; grid-template-columns: auto 1fr; gap: 8px 16px; margin: 0 0 16px; font-size: 14px; }
.details-modal .details-list dt { color: var(--hint); }
.details-modal .details-list dd { margin: 0; font-weight: 550; font-variant-numeric: tabular-nums; }

/* ── Живой график (S-11, S-15) ── */
.dgm.dgm-chart { padding: 14px 14px 10px; }
.dgm.dgm-chart .dgm-canvas { justify-content: flex-start; cursor: default; padding: 0; }
.dgm.dgm-chart .dgm-canvas svg { overflow: visible; }
.dgm.dgm-chart .dgm-canvas svg:focus { outline: none; }
.dgm.dgm-chart .dgm-canvas svg:focus-visible { outline: 2px solid var(--link); outline-offset: 4px; border-radius: 6px; }
.dgm-bar.dgm-bar-chart {
  position: absolute; top: 10px; right: 10px; margin: 0; opacity: 1; z-index: 3;
}
.dgm-bar-chart .dgm-bar-btns { gap: 6px; }
.dgm-btn.dgm-btn-text {
  width: auto; padding: 0 10px; font: inherit; font-size: 12.5px; font-weight: 600; color: var(--text);
  background: var(--s-card); border-color: var(--s-line); border-radius: 999px;
}
.dgm-btn.dgm-btn-text.active { color: var(--s-brand-ink); background: var(--s-brand-soft); border-color: var(--s-brand-line); }
.dgm-bar-chart .dgm-btn:not(.dgm-btn-text) { background: var(--s-card); border-color: var(--s-line); border-radius: 999px; }
@media (hover: none) { .dgm-bar-chart .dgm-zoom { display: none; } }
.dgm-menu {
  position: absolute; top: calc(100% + 6px); right: 0; z-index: 20; min-width: 170px;
  display: flex; flex-direction: column; padding: 5px; gap: 1px;
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 12px; box-shadow: var(--s-sh-window);
}
.dgm-menu-item {
  text-align: left; padding: 8px 10px; border: 0; border-radius: 8px; background: transparent;
  color: var(--text); font: inherit; font-size: 13.5px; cursor: pointer; white-space: nowrap;
}
.dgm-menu-item:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
.dgm-chart-svg [data-i], .dgm-chart-svg .dgm-slice, .dgm-chart-svg .dgm-line { transition: opacity .15s ease; }
.dgm-chart-svg.dgm-hovering [data-i]:not(.dgm-hot),
.dgm-chart-svg.dgm-hovering .dgm-slice:not(.dgm-hot) { opacity: .35; }
.dgm-chart-svg.dgm-hovering .dgm-dot.dgm-hot { r: 6; }
.dgm-chart-svg .dgm-guide { color: var(--hint); opacity: .7; pointer-events: none; }
.dgm-chart-svg .dgm-leg[data-s] { cursor: pointer; }
.dgm-chart-svg .dgm-leg[data-s]:focus { outline: none; }
.dgm-chart-svg .dgm-leg[data-s]:focus-visible rect { stroke: var(--link); stroke-width: 2; }
.dgm-chart-svg .dgm-leg-off { opacity: .45; }
.dgm-chart-svg.dgm-still-hover [data-i], .dgm-chart-svg.dgm-still-hover .dgm-slice { transition: none; }
.dgm-tip {
  position: absolute; z-index: 6; pointer-events: none; min-width: 120px; max-width: 260px;
  padding: 8px 10px; border-radius: 10px; font-size: 12.5px; line-height: 1.35;
  background: var(--s-card); color: var(--text); border: 1px solid var(--s-line); box-shadow: var(--s-sh-window);
}
.dgm-tip[hidden] { display: none; }
.dgm-tip-head { font-weight: 700; margin-bottom: 4px; }
.dgm-tip-row { display: flex; align-items: center; gap: 6px; white-space: nowrap; }
.dgm-tip-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.dgm-tip-name { color: var(--hint); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.dgm-tip-val { font-variant-numeric: tabular-nums; margin-left: auto; }
@media (prefers-reduced-motion: reduce) {
  .dgm-chart-svg [data-i], .dgm-chart-svg .dgm-slice, .dgm-chart-svg .dgm-line { transition: none; }
}

/* ── Виджет: одна рамка, панель поверх (S-13) ── */
.chat-messages .dgm-widget { padding: 0; }
.chat-messages .dgm-widget .dgm-canvas { background: transparent; border-radius: 0; padding: 0; }
.chat-messages .dgm-widget .dgm-widget-err { margin: 12px 12px 0; }
.dgm-widget .dgm-bar {
  position: absolute; top: 8px; right: 8px; margin: 0; z-index: 4;
  opacity: 0; transition: opacity .15s ease; pointer-events: none;
}
.dgm-widget:hover .dgm-bar, .dgm-widget:focus-within .dgm-bar { opacity: 1; pointer-events: auto; }
.dgm-widget .dgm-bar .dgm-title { display: none; }
.dgm-widget .dgm-bar-btns {
  padding: 4px; gap: 4px; background: var(--s-glass); border: 1px solid var(--s-line);
  border-radius: 12px; box-shadow: var(--s-sh-xs);
}
.dgm-widget .dgm-btn { background: transparent; border-color: transparent; }
.dgm-widget .dgm-btn:hover { background: color-mix(in srgb, var(--text) 8%, transparent); }
.dgm-wmore { display: none; }
.dgm-widget .dgm-src { margin: 0 12px 12px; }
@media (hover: none) {
  /* SF-7: «⋯» — в правом верхнем углу, а не у последней строки содержимого.
     Под неё сверху своя полоса: кнопка поверх iframe касание не получает —
     браузер отдаёт его фрейму виджета (проверено: касание уходило в iframe). */
  .dgm-widget .dgm-bar { opacity: 1; pointer-events: auto; top: 4px; bottom: auto; right: 6px; }
  .chat-messages .dgm-widget .dgm-canvas { padding-top: 30px; }
  .dgm-widget .dgm-bar-btns { display: none; position: absolute; top: calc(100% + 6px); bottom: auto; right: 0; }
  .dgm-widget.dgm-bar-open .dgm-bar-btns { display: flex; }
  .dgm-wmore {
    display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; padding: 0; opacity: .85;
    color: var(--text); background: var(--s-glass); border: 1px solid var(--s-line); border-radius: 999px; cursor: pointer;
    box-shadow: var(--s-sh-xs);
  }
}

/* ── Файлы результата как на сайте (S-12, S-16) ── */
.agent-attachments-summary { display: flex; flex-direction: column; gap: 0; padding: 14px 16px 8px; }
.agent-attachments-summary .aas-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 0 0 6px; }
.agent-attachments-summary .aas-head .aas-title { margin: 0; }
.aas-dl-all {
  display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 999px; cursor: pointer;
  font: inherit; font-size: 13px; font-weight: 600; color: var(--s-brand-ink); background: var(--s-brand-soft);
  border: 1px solid var(--s-brand-line);
}
.aas-dl-all:hover { filter: brightness(1.04); }
.aas-dl-all.done { color: var(--s-on-green); background: var(--s-tint-green); border-color: transparent; }
.aas-dl-all:disabled { cursor: default; }
/* строки внутри сводки — без рамки и тени, тонкая линия между ними */
.agent-attachments-summary .agent-attachment-card.aac-row {
  display: flex; align-items: center; gap: 12px; padding: 10px 2px; margin: 0;
  border: 0; border-radius: 0; box-shadow: none; background: transparent; cursor: pointer;
}
.agent-attachments-summary .aac-row + .aac-row { border-top: 1px solid var(--s-line); }
.agent-attachments-summary .aac-row:hover { background: transparent; }
.agent-attachments-summary .aac-row:hover .aac-name { color: var(--link); }
.agent-attachments-summary .aac-row:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; border-radius: 10px; }
.aac-row .aac-icon {
  position: relative; flex: none; width: 40px; height: 40px; border-radius: 11px; overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  background: var(--s-tint-blue); color: var(--s-on-blue);
}
.aac-row .aac-icon svg { width: 20px; height: 20px; }
.aac-row .aac-icon[data-kind="sheet"] { background: var(--s-tint-green); color: var(--s-on-green); }
.aac-row .aac-icon[data-kind="doc"] { background: var(--s-tint-sky); color: var(--s-on-sky); }
.aac-row[data-ext="pdf"] .aac-icon { background: var(--s-tint-red); color: var(--s-on-red); }
.aac-row .aac-icon[data-kind="image"] { background: var(--s-tint-violet); color: var(--s-on-violet); }
.aac-row .aac-icon[data-kind="web"] { background: var(--s-tint-amber); color: var(--s-on-amber); }
.aac-row .aac-icon[data-kind="archive"] { background: var(--s-tint-amber); color: var(--s-on-amber); }
.aac-row .aac-icon .aac-thumb-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; cursor: zoom-in; background: var(--s-surface); }
.aac-row .aac-icon.has-thumb svg { visibility: hidden; }
.aac-row .aac-info { flex: 1; min-width: 0; }
.aac-row .aac-name { font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transition: color .12s; }
.aac-row .aac-meta { font-size: 12.5px; color: var(--hint); margin-top: 1px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.aac-row .aac-prev[hidden] { display: none !important; }
.aac-row .aac-btn.aac-dl-text {
  width: auto; height: 34px; padding: 0 14px; gap: 6px; border-radius: 999px; flex: none;
  display: inline-flex; align-items: center; font: inherit; font-size: 13px; font-weight: 600;
}
/* Три синие кнопки подряд плюс «Скачать всё» — это шум: у строки кнопка
 * спокойная (тон бренда), заметной её делает наведение. */
.agent-attachments-summary .aac-row .aac-btn.aac-dl-text {
  background: var(--s-brand-soft); color: var(--s-brand-ink); border: 1px solid transparent; box-shadow: none;
}
.agent-attachments-summary .aac-row .aac-btn.aac-dl-text:hover { background: var(--link); color: #fff; }
.aac-row .aac-btn.aac-more { width: 32px; height: 32px; border-radius: 999px; border-color: transparent; background: transparent; flex: none; }
.aac-row .aac-btn.aac-more:hover { background: var(--s-surface); }
@media (max-width: 480px) {
  .aac-row .aac-btn.aac-dl-text { padding: 0 11px; }
  .aac-row .aac-btn.aac-dl-text span { display: none; }
  .aac-row .aac-btn.aac-dl-text { width: 36px; padding: 0; justify-content: center; }
}

/* ── Настройки по разделам (S-09, S-10, S-17) ── */
#screen-settings .form-body { padding: 8px 16px 100px; }
.st-layout { display: block; }
.st-nav { display: flex; flex-direction: column; gap: 2px; }
.st-nav-item {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  padding: 10px 12px; border: 0; border-radius: 12px; background: transparent; cursor: pointer;
  font: inherit; font-size: 15px; font-weight: 550; color: var(--text);
}
.st-nav-item:active { background: color-mix(in srgb, var(--text) 5%, transparent); }
/* На таче :hover залипает на строке под пальцем, открывшим раздел, и она
   выглядит выбранной (аудит профиля 1.1) — подсветка наведения только у мыши. */
@media (hover: hover) {
  .st-nav-item:hover { background: color-mix(in srgb, var(--text) 5%, transparent); }
}
.st-nav-item.active { background: var(--s-brand-soft); color: var(--s-brand-ink); }
.st-nav-ico { display: inline-flex; width: 20px; height: 20px; color: var(--hint); flex: none; }
.st-nav-ico .ico { width: 20px; height: 20px; }
.st-nav-item.active .st-nav-ico { color: var(--link); }
.st-nav-label { flex: 1; min-width: 0; }
.st-nav-chev { color: var(--hint); flex: none; display: none; }
.st-badge-admin { font-size: 11px; font-weight: 700; padding: 2px 7px; border-radius: 999px; background: var(--s-tint-amber); color: var(--s-on-amber); }
.st-sec { display: none; }
.st-sec.active { display: block; }
.st-sec-head { display: flex; align-items: center; gap: 6px; margin: 0 0 14px; }
.st-sec-title { margin: 0; font-size: 22px; font-weight: 750; letter-spacing: -0.02em; color: var(--text); }
.st-sec-back { display: none; }
/* единый ритм: заголовок группы над карточкой, карточки с рамкой */
.st-sec .st-group-title, #st-sessions-card .st-group-title {
  font-size: 13px; font-weight: 650; color: var(--hint); text-transform: none; letter-spacing: 0;
  padding: 0 4px 8px; margin: 0;
}
.st-title-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
/* Нижний отступ .st-inline-link поднимал «Завершить остальные» над «Устройствами»,
   а цель была 16px. Поле нажатия растёт за счёт padding, строка — нет. */
.st-title-row .st-inline-link { margin: -8px 0; padding: 8px 4px; font-size: 13px; font-weight: 600; }
.st-sec .st-group, .st-card.st-group {
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px;
  padding: 4px 0; margin: 0 0 22px; box-shadow: var(--s-sh-xs); overflow: visible;
}
.st-sec .st-row { padding: 12px 16px; min-height: 48px; gap: 14px; }
.st-sec .st-row + .st-row { border-top: 1px solid var(--s-line); }
.st-sec .st-row-text { display: flex; flex-direction: column; gap: 2px; }
.st-sec .st-row-label { font-size: 15px; font-weight: 600; line-height: 1.3; }
.st-sec .st-row-hint, .st-sec .hint, .st-card .hint, .st-card .st-row-hint {
  font-size: 13px; line-height: 1.4; color: var(--hint); margin: 0;
}
.st-sec .st-group > .st-row-hint, .st-sec .st-group > .st-row-label { padding: 0 16px 12px; }
.st-sec .st-group > .st-chips-row { padding: 12px 16px; }
.st-sec .st-group > .st-chips-row + .st-row-hint { margin-top: -4px; }
.st-sec .st-group > .st-inline-link { margin: 0 16px 12px; }
.st-sec .st-group > .st-select { width: calc(100% - 32px); margin: 12px 16px 8px; }
.st-sec .st-group > .st-zoom-head, .st-sec .st-group > .st-zoom-range, .st-sec .st-group > .st-zoom-scale { margin-left: 16px; margin-right: 16px; width: calc(100% - 32px); }
.st-sec .st-group > .st-zoom-head { margin-top: 12px; }
.st-sec .st-group > .st-map-rows { padding: 6px 16px; }
.st-sec .st-row.st-row-link {
  width: 100%; border: 0; background: transparent; text-align: left; cursor: pointer; font: inherit; color: var(--text);
  padding: 12px 16px; text-decoration: none;
}
.st-sec .st-row.st-row-link:hover { background: color-mix(in srgb, var(--text) 4%, transparent); }
.st-sec .st-row.st-row-link:first-child { border-top-left-radius: 15px; border-top-right-radius: 15px; }
.st-sec .st-row.st-row-link:last-child { border-bottom-left-radius: 15px; border-bottom-right-radius: 15px; }
.st-chev { color: var(--hint); flex: none; }
.st-sec .st-number-wrap { gap: 8px; }
.st-sec .st-number { width: 88px; text-align: right; font-family: inherit; font-variant-numeric: tabular-nums; padding: 7px 10px; border-radius: 10px; background: var(--s-surface); border-color: var(--s-line); }
.st-sec .st-unit { min-width: 26px; font-size: 13px; }
.st-sec .st-num-row .st-row-text { flex: 1; }
.st-more { margin: 2px 0 0; font-size: 13px; color: var(--hint); }
.st-group > .st-more { margin: 0 16px 12px; }
.st-more > summary {
  list-style: none; cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; border-radius: 50%; border: 1px solid var(--s-line-strong); font-size: 11px; font-weight: 700;
  color: var(--hint); user-select: none;
}
.st-more > summary::-webkit-details-marker { display: none; }
.st-more[open] > summary { color: var(--link); border-color: var(--s-brand-line); }
.st-more-body { margin-top: 6px; line-height: 1.45; }
.st-more .st-more-t { display: none; }
/* Под группой чипов одинокий кружок «?» смотрелся обломком — там это
 * текстовая ссылка «Подробнее»; в строке рядом с подписью остаётся «?». */
.st-group > .st-more > summary, .st-more.has-lead > summary { width: auto; height: auto; border: 0; border-radius: 0; font-size: 13px; font-weight: 500; color: var(--link); }
.st-group > .st-more .st-more-q, .st-more.has-lead .st-more-q { display: none; }
.st-group > .st-more .st-more-t, .st-more.has-lead .st-more-t { display: inline; }
.st-sec .st-group > .st-row-hint.st-hint-lead { padding-bottom: 2px; }
.st-profile-row .btn-secondary, .st-pwd-row .btn-secondary { flex: none; white-space: nowrap; }
.st-pwd-form { padding: 0 16px 14px; }
.st-pwd-form[hidden] { display: none; }
.st-cur-badge { font-size: 11px; font-weight: 650; padding: 1px 7px; border-radius: 999px; background: var(--s-tint-green); color: var(--s-on-green); margin-left: 4px; vertical-align: 1px; }
.st-push-card > .st-row-hint, .st-push-card > .btn-secondary { margin: 0 16px 12px; }
.st-push-card > .st-row-hint:first-child { margin-top: 12px; }
.st-actions.st-actions-sticky {
  position: sticky; bottom: 0; z-index: 5; display: flex; gap: 10px; align-items: center;
  margin: 8px -4px 0; padding: 12px 4px calc(12px + env(safe-area-inset-bottom, 0px));
  background: color-mix(in srgb, var(--s-page) 88%, transparent); backdrop-filter: blur(8px);
  border-top: 1px solid var(--s-line);
}
.st-actions-sticky .st-save { flex: 1; margin: 0; }
.st-actions-sticky .st-reset { flex: none; margin: 0; width: auto; padding: 0 12px; }
@media (min-width: 960px) {
  #screen-settings .form-body { max-width: 980px; margin: 0 auto; padding: 16px 24px 80px; }
  .st-layout { display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: 32px; align-items: start; }
  .st-nav { position: sticky; top: 8px; }
  .st-pages { min-width: 0; max-width: 680px; }
}
@media (max-width: 959px) {
  .st-nav { background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px; padding: 4px; box-shadow: var(--s-sh-xs); }
  .st-nav-item { padding: 13px 12px; }
  .st-nav-item.active { background: transparent; color: var(--text); }
  .st-nav-item.active .st-nav-ico { color: var(--hint); }
  .st-nav-chev { display: inline-block; }
  .st-layout .st-pages { display: none; }
  .st-layout.st-open .st-nav { display: none; }
  .st-layout.st-open .st-pages { display: block; }
  .st-sec-back {
    display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; margin-left: -8px;
    border: 0; background: transparent; color: var(--link); border-radius: 50%; cursor: pointer;
  }
  .st-actions.st-actions-sticky { bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px)); padding-bottom: 12px; }
  /* S1-07: полоса «Сохранить» непрозрачная и закрывает щель до нижней
     панели — текст секции не просвечивает ни под ней, ни за вкладками. */
  .st-actions.st-actions-sticky {
    background: var(--s-page); backdrop-filter: none;
    box-shadow: 0 -10px 14px -6px color-mix(in srgb, var(--s-page) 90%, transparent),
                0 40px 0 0 var(--s-page), 0 80px 0 0 var(--s-page);
  }
}
.st-sec .st-row-text:has(> .st-more) { flex-direction: row; flex-wrap: wrap; align-items: center; column-gap: 6px; }
.st-sec .st-row-text > .st-more { margin: 0; }
.st-sec .st-row-text > .st-more[open] { flex-basis: 100%; order: 4; }
.st-sec .st-row-text > .st-more { order: 2; }
.st-sec .st-row-text > .st-more.has-lead { order: 4; flex-basis: 100%; }
.st-sec .st-row-text > .st-hint-lead { flex-basis: 100%; order: 3; }
.st-advanced { margin: 0 0 22px; }
.st-advanced > summary {
  list-style: none; cursor: pointer; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
  padding: 12px 16px; border: 1px dashed var(--s-line-strong); border-radius: 16px; font-size: 15px; font-weight: 600; color: var(--text);
}
.st-advanced > summary::-webkit-details-marker { display: none; }
.st-advanced > summary::before { content: '›'; display: inline-block; transition: transform .15s; color: var(--hint); }
.st-advanced[open] > summary { margin-bottom: 16px; }
.st-advanced[open] > summary::before { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .st-advanced > summary::before { transition: none; } }
.st-sec .st-row > .btn-secondary, .st-sec .st-row > .btn-primary {
  width: auto; flex: none; margin: 0; padding: 8px 14px; min-height: 36px; font-size: 14px; border-radius: 999px; white-space: nowrap;
}
.st-sec .st-row > .st-row-text { flex: 1 1 auto; min-width: 0; }
.st-sec .st-push-card > .btn-secondary { width: auto; }
/* липкий «Сохранить» прилипает к прокрутке экрана, а не тела формы */
#screen-settings #settings-body { overflow: visible; }

/* ── Карточка «1do работает» в ленте (S-02) ── */
.chat-messages .live-did {
  display: flex; align-items: center; gap: 12px; margin: 10px 20px; padding: 12px 14px;
  border-radius: 16px; background: var(--s-card); border: 1px solid var(--s-line); box-shadow: var(--s-sh-xs);
  cursor: pointer; animation: none;
}
.chat-messages .live-did:hover { border-color: var(--s-line-strong); }
.chat-messages .live-did:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }
.live-did .ld-spin {
  flex: none; width: 18px; height: 18px; border-radius: 50%;
  border: 2px solid var(--s-brand-soft); border-top-color: var(--link); animation: ldSpin .9s linear infinite;
}
@keyframes ldSpin { to { transform: rotate(360deg); } }
.live-did .ld-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.live-did .ld-what { font-size: 14px; font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.live-did .ld-sum { font-size: 13px; color: var(--hint); }
.live-did .ld-sum:empty { display: none; }
.live-did .ld-chev { color: var(--hint); transition: transform .15s; font-size: 18px; line-height: 1; }
.live-did[aria-expanded="true"] .ld-chev { transform: rotate(90deg); }
/* C9 (r2): «Что делал» — та же коробка, что «1do работает»: высота не меняется,
   меняются только фон, рамка, цвет и значок (спиннер → галочка). */
.chat-messages .live-did.done { background: transparent; box-shadow: none; }
.chat-messages .live-did.done .ld-what { font-weight: 600; color: var(--text-secondary, var(--hint)); }
.chat-messages.feed-quiet.feed-peek .msg-tech.turn-cur { display: block; }
.chat-messages:not(.feed-minimal) .live-did { display: none; }
/* C9: «1do работает» → «Что делал» — только цвета; строки фиксированной высоты,
   чтобы смена текста не меняла высоту карточки. */
.chat-messages .live-did { transition: background-color .35s, border-color .35s, box-shadow .35s; }
.live-did .ld-what { line-height: 20px; }
.live-did .ld-sum { line-height: 18px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.chat-messages .live-did.ld-gone { pointer-events: none; }
.live-did .ld-spin { position: relative; transition: border-color .3s, background-color .3s; }
.live-did .ld-spin::after {
  content: ''; position: absolute; inset: -2px; opacity: 0; transition: opacity .3s;
  background: var(--success);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / 12px 12px no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E") center / 12px 12px no-repeat;
}
.chat-messages .live-did.done .ld-spin { animation: none; border-color: var(--success-line); }
.chat-messages .live-did.done .ld-spin::after { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .chat-messages .live-did, .live-did .ld-spin, .live-did .ld-spin::after { transition: none; }
}
@media (max-width: 959px) { .chat-messages .live-did { margin: 8px 12px; } }
@media (max-width: 959px) { .bg-progress-note { margin: 8px 12px 4px; } .stream-idle-note { margin: 6px 12px 2px; } }
@media (prefers-reduced-motion: reduce) { .live-did .ld-spin { animation: none; border-top-color: var(--link); } .live-did .ld-chev { transition: none; } }

/* ── «Тонкая настройка» вместо второго экрана запуска (S-22) ── */
#screen-new-task [hidden] { display: none !important; }
#screen-new-task .nt-sep { display: none; }
#screen-new-task .nt-top { display: flex; flex-direction: column; gap: 10px; margin: 4px 0 18px; }
#screen-new-task .nt-top .nt-input-bar {
  position: static; padding: 0; background: transparent; border: 0; z-index: auto; max-width: none; margin: 0;
}
#screen-new-task .nt-top .nt-input-wrapper { min-height: 96px; align-items: flex-start; padding: 10px; }
#screen-new-task .nt-top #nt-task { min-height: 72px; }
/* Один запуск на экране — «Запустить»; стрелка в поле его дублировала.
 * Поле — на всю ширину сверху, скрепка/буфер/✨ строкой под ним. */
#screen-new-task .nt-top .nt-input-wrapper { flex-wrap: wrap; padding: 12px 14px 8px; }
#screen-new-task .nt-top #nt-task { order: -1; flex: 1 1 100%; width: 100%; }
#screen-new-task .nt-top #btn-nt-send,
#screen-new-task .nt-top .voice-lang-select { display: none !important; }
#screen-new-task .nt-launch-row { display: flex; align-items: center; gap: 10px; justify-content: space-between; }
#screen-new-task .nt-launch { width: auto; min-width: 140px; padding: 10px 22px; border-radius: 999px; font-weight: 650; }
#screen-new-task .nt-launch:disabled { opacity: .45; cursor: default; }
#screen-new-task .nt-body { padding-bottom: 40px; }
@media (max-width: 959px) {
  #screen-new-task .nt-body { padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px) + 24px); }
}
/* ✨ «Улучшить» — только когда есть что улучшать (S-21) */
#btn-chat-improve:disabled { display: none; }
.cmp-advanced {
  display: block; width: calc(100% - 8px); margin: 8px 4px 2px; padding: 9px 10px; text-align: left; cursor: pointer;
  border: 0; border-top: 1px solid var(--s-line); background: transparent; color: var(--link); font: inherit; font-size: 13.5px; font-weight: 600;
}
.cmp-advanced:hover { background: color-mix(in srgb, var(--text) 5%, transparent); border-radius: 8px; }
body[data-screen="chat"] .cmp-advanced { display: none; }

/* ── Шаблоны на главной сеткой (S-23) ── */
.home-suggest .hs-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 959px) {
  .home-suggest .hs-grid {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;
    overflow: visible; margin: 0; padding: 0; scroll-snap-type: none;
  }
  .hs-card { flex: initial; flex-direction: column; gap: 8px; padding: 12px; }
  .hs-card .hs-ico { flex: none; width: 32px; height: 32px; align-self: flex-start; }
  .hs-tx b { font-size: 13.5px; }
}

/* ── Входящие: сначала то, что ждёт действия (S-24) ── */
.inbox-item[role="button"] { cursor: pointer; }
.inbox-item[role="button"]:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }
.inbox-unread > summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 10px 4px; font-size: 13px; font-weight: 650; color: var(--hint);
}
.inbox-unread > summary::-webkit-details-marker { display: none; }
.inbox-unread > summary .iu-title::before { content: '›'; display: inline-block; margin-right: 6px; transition: transform .15s; }
.inbox-unread[open] > summary .iu-title::before { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .inbox-unread > summary .iu-title::before { transition: none; } }

/* ── Карточка проекта без серверного пути (S-27) ── */
.project-card .pc-stats { margin-top: 6px; font-size: 13px; color: var(--hint); }
.pc-more-btn {
  display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0;
  border: 0; border-radius: 999px; background: transparent; color: var(--hint); cursor: pointer;
}
@media (pointer: coarse) {
  /* Единственный путь к «Настроить проект» — не меньше 40px под пальцем. */
  .pc-more-btn { width: 40px; height: 40px; margin: -4px -4px -4px 0; }
}
.pc-more-btn:hover { background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text); }
.pc-more-btn .ico { width: 18px; height: 18px; }

/* ── Команды (S-28) ── */
.form-body .id-card-btn.btn-secondary { background: #fff; color: #0e1014; border: 1px solid rgba(255,255,255,.2); box-shadow: none; }
.form-body .id-card-btn.btn-secondary:hover { filter: none; background: #eef2fe; }
.id-card-text { font-size: 13.5px; margin-top: 8px; }
#btn-team-new[hidden] { display: none !important; }
.agent-card.agent-card-2l { padding: 11px 12px 11px 16px; gap: 3px; }
.agent-card-2l .ac-head { align-items: center; min-height: 22px; }
.agent-card-2l .ac-head .agent-menu-btn { width: 26px; height: 24px; margin: -2px -6px -2px 0; }
.agent-card-2l .ac-sub { min-height: 18px; line-height: 18px; }
.agent-card-2l .ac-sub .agent-project { box-shadow: none; height: auto; line-height: 18px; }
/* Отступ под статус-бар обязателен и здесь: без safe-area шапка чата в PWA на
   iPhone ложилась под часы (10.10.2026). */
@media (max-width: 600px) { #screen-chat .chat-header { padding-top: calc(10px + env(safe-area-inset-top, 0px)); padding-bottom: 10px; } }
/* Чат на телефоне ровно в экран: окно не прокручивается, иначе протяжка ленты
   у края и сдвиг iOS под клавиатуру уводили шапку под часы (10.10.2026). */
@media (max-width: 959px) {
  html:has(body[data-screen="chat"]),
  body[data-screen="chat"] { overflow: hidden; overscroll-behavior: none; }
}
.agent-card.agent-card-2l .ac-head .agent-menu-btn { min-height: 0; min-width: 0; height: 24px; }
.agent-card-2l .ac-sub .agent-status-tag { height: 18px; line-height: 18px; }
.agent-card-2l .ac-head .agent-menu-btn { position: relative; }
.agent-card-2l .ac-head .agent-menu-btn::after { content: ''; position: absolute; inset: -10px -6px; }

/* «Ждёт вас» (план ждёт решения) — янтарным, а не зелёным «Готово» (S-18). */
.dl-item-status.is-wait, .agent-status-tag.is-wait { color: var(--s-on-amber, #b45309) !important; }
.agent-status-tag.is-wait .si { color: inherit; }

/* ══ Раунд 2 ══════════════════════════════════════════════════════════ */

/* ── Архив на телефоне в две строки, как «В работе» (MF-2) ── */
.history-item.hi-2l { display: flex; flex-direction: column; align-items: stretch; gap: 3px; padding: 11px 16px; }
.hi-2l .hi-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
.history-item.hi-2l .hi-task { flex: 1; min-width: 0; font-size: 15px; font-weight: 600; line-height: 1.3; color: var(--text); }
.hi-2l .hi-time { flex: none; font-size: 12.5px; color: var(--hint); font-variant-numeric: tabular-nums; }
.hi-2l .hi-sub { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: 13px; color: var(--hint); line-height: 18px; }
.history-item.hi-2l .hi-project { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 0 1 auto; font-size: 13px; color: var(--hint); }
.hi-2l .hi-sep { opacity: .6; }
.hi-2l .hi-st { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; flex: none; font-weight: 500; }
.hi-2l .hi-st .si { width: 14px; height: 14px; }
.hi-2l .hi-st.s-done { color: var(--s-on-green); }
.hi-2l .hi-st.s-deferred { color: var(--s-on-amber, #b45309); }
.history-item.hi-2l .hi-meta { margin-left: auto; font-size: 11.5px; opacity: .8; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; text-align: right; }
.history-item.hi-2l .agent-avatar { width: 18px; height: 18px; font-size: 10px; margin: 0; flex: none; }

/* ── Уведомления: текст карточки с тем же отступом 16px, что везде (MF-3) ── */
#st-push-card > .st-row-hint { margin: 0; padding: 12px 16px; }
#st-push-card > .st-row + .st-row-hint, #st-push-card > .btn-secondary + .st-row-hint { padding-top: 0; }
#st-push-card > .btn-secondary { margin: 0 16px 12px; }
#st-push-card .st-bool-row .st-row-hint { margin: 0; padding: 0; }

/* ── ✨ «Улучшить» только при тексте в поле (MF-4): поле чистят и из кода,
 * без события input, — пустое поле прячет кнопку само. ── */
#chat-input-wrapper:has(#chat-input:placeholder-shown) #btn-chat-improve { display: none; }
/* На главной справа от ✨ стоит чип модели: прячь ✨ — чип прыгал бы на 32px
 * с первой буквы. Там ✨ держит место бледной (disabled, .btn-improve). */
body[data-screen="dashboard"] #btn-chat-improve:disabled,
body[data-screen="dashboard"] #chat-input-wrapper:has(#chat-input:placeholder-shown) #btn-chat-improve { display: inline-flex; }

/* ── Шаблон: поле ввода не дублирует карточку шаблона (MF-5) ── */
#screen-new-task .nt-top .nt-input-wrapper.tpl-mode {
  min-height: 0; padding: 0; border: 0; background: transparent; box-shadow: none; flex-wrap: nowrap; align-items: center;
}
#screen-new-task .nt-input-wrapper.tpl-mode #nt-tpl-chip,
#screen-new-task .nt-input-wrapper.tpl-mode #btn-nt-paste,
#screen-new-task .nt-input-wrapper.tpl-mode #btn-nt-improve,
#screen-new-task .nt-input-wrapper.tpl-mode #btn-nt-mic { display: none !important; }
#screen-new-task .nt-input-wrapper.tpl-mode #btn-attach-file {
  width: 38px; height: 38px; padding: 0; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--s-line); background: var(--s-card); color: var(--text);
}
#screen-new-task .nt-input-wrapper.tpl-mode #btn-attach-file svg { width: 17px; height: 17px; }
/* скрепка — в одну строку с проектом и «Запустить», а не отдельной полосой */
#screen-new-task .nt-top:has(.nt-input-wrapper.tpl-mode) { flex-direction: row; align-items: center; }
#screen-new-task .nt-top:has(.nt-input-wrapper.tpl-mode) > .nt-input-bar { flex: none; width: auto; }
#screen-new-task .nt-top:has(.nt-input-wrapper.tpl-mode) > .nt-launch-row { flex: 1; min-width: 0; }
/* «Запустить» на одной линии с выбором проекта */
#screen-new-task .nt-launch-row .nt-launch { margin: 0; }

/* ── Палитра «/» не уходит за верх окна (SF-2) ── */
.skills-dropdown.sd-below { bottom: auto; top: 100%; margin-bottom: 0; margin-top: 6px; }

/* ── «+ Задача» в панели видна на всех экранах (A1): на главной она не второй
 * запуск, а указатель на композер — фокус в поле и одно мягкое кольцо. ── */
#chat-input-wrapper.cmp-pulse { position: relative; }
#chat-input-wrapper.cmp-pulse::after {
  content: ''; position: absolute; inset: -1px; border-radius: inherit; pointer-events: none;
  animation: cmpRing .9s cubic-bezier(.2,.7,.2,1) both;
}
@keyframes cmpRing {
  0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--button) 0%, transparent); }
  25% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--button) 30%, transparent); }
  100% { box-shadow: 0 0 0 14px color-mix(in srgb, var(--button) 0%, transparent); }
}
@media (prefers-reduced-motion: reduce) { #chat-input-wrapper.cmp-pulse::after { animation: none; } }

/* ── Вкладки телефона без «←» (SF-9): Проекты, Рутины, Входящие — сами
 * вкладки нижней панели, назад с них ведёт панель. ── */
@media (max-width: 959px) {
  #btn-projects-back, #btn-schedules-back, #btn-inbox-back { display: none; }
}

/* ── «Ждёт вас» в шапке чата тем же янтарным, что в списке (SF-12) ── */
.chat-meta .is-wait { color: var(--s-on-amber, #b45309); font-weight: 600; }

/* ── Проект в композере главной не режется в «Playgro…» (SF-11): на узком
   экране папка в чипе не рисуется (подпись «Проект» в title остаётся), а
   место отдаётся названию. Чип не шире прежнего — тулбар не переполняется. ── */
@media (max-width: 420px) {
  body[data-screen="dashboard"] #cmp-project-wrap .cmp-chip { padding: 0 8px; gap: 0; }
  body[data-screen="dashboard"] #cmp-project-wrap .cmp-chip svg { display: none; }
  body[data-screen="dashboard"] #cmp-project-wrap .cmp-chip-label { max-width: 80px; }
}

/* Телефон: из раздела настроек назад ведёт стрелка шапки экрана (она
   возвращает к списку разделов) — вторая «‹» внутри раздела была дублем. */
@media (max-width: 959px) {
  .st-sec-back { display: none; }
}

/* ── B1/B2: шапка списка агентов — две ровные строки (десктоп).
 * Строка 1: заголовок, фильтр проекта, (в Архиве) статус, поиск — всё 32px
 * на одной оси. Строка 2: «В работе N | Архив» во всю ширину. Поиск
 * раскрывается под ними и не двигает строку заголовка. ── */
@media (min-width: 960px) {
  /* Строка «Агенты / проекты / поиск» — по центру знака «1do.» в рейке (12.10.2026):
     с отступом 14px она стояла на 4–5px ниже логотипа на всех ширинах. */
  .dl-head { display: flex; flex-direction: column; gap: 10px; padding: 10px 10px 8px 10px; flex-shrink: 0; }
  .dl-head-row { display: flex; align-items: center; gap: 4px; height: 32px; min-width: 0; }
  .dl-head .dl-header-title { flex: 0 0 auto; margin-right: auto; padding-left: 6px; font-size: 18px; font-weight: 750; letter-spacing: -0.02em; line-height: 32px; }
  .dl-icon-btn {
    flex: none; width: 32px; height: 32px; border-radius: 999px; border: 0; padding: 0; cursor: pointer;
    display: inline-grid; place-items: center; color: var(--hint); background: transparent;
    transition: background .15s, color .15s;
  }
  .dl-icon-btn:hover { color: var(--text); background: color-mix(in srgb, var(--text) 6%, transparent); }
  .dl-icon-btn[aria-expanded="true"] { color: var(--link); background: var(--s-brand-soft); }
  .dl-icon-btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
  .dl-head .dl-tabs { height: 34px; margin: 0; padding: 3px; gap: 2px; box-sizing: border-box; border: 1px solid var(--s-line); border-radius: 999px; background: color-mix(in srgb, var(--s-surface) 80%, transparent); }
  .dl-head .dl-tab { flex: 1 1 0; height: 26px; padding: 0 10px; white-space: nowrap; display: inline-flex; align-items: center; justify-content: center; gap: 6px; font-size: 13px; line-height: 1; border-radius: 999px;
    /* --hint на подложке вкладок давал 3,9:1 при 13px — ниже AA 4,5. */
    color: color-mix(in srgb, var(--hint) 75%, var(--text)); }
  .dl-head .dl-tab.active { color: var(--text); }
  .dl-head .dl-tab .dl-badge { background: none; padding: 0; min-width: 0; height: auto; font-size: 12px; font-weight: 650; color: var(--hint); font-variant-numeric: tabular-nums; animation: none; }
  .dl-head .dl-tab.active .dl-badge { color: var(--link); }
  .dl-head .dl-search { padding: 0; display: grid; grid-template-rows: 0fr; opacity: 0; margin-top: -10px; visibility: hidden;
    transition: grid-template-rows .18s cubic-bezier(.2,.7,.2,1), opacity .18s, margin-top .18s, visibility 0s linear .18s; }
  .dl-head .dl-search.open { grid-template-rows: 1fr; opacity: 1; margin-top: 0; visibility: visible; transition-delay: 0s; }
  .dl-head .dl-search-in { min-height: 0; overflow: hidden; position: relative; }
  .dl-head .dl-search input { height: 34px; padding: 0 34px; border-radius: 999px; box-sizing: border-box; font-size: 13.5px; }
  .dl-head .dl-search-ico { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--hint); pointer-events: none; }
  .dl-head .dl-search-x { position: absolute; right: 4px; top: 3px; width: 28px; height: 28px; border-radius: 999px; border: 0; padding: 0; background: transparent; color: var(--hint); cursor: pointer; display: grid; place-items: center; font-size: 18px; line-height: 1; }
  .dl-head .dl-search-x:hover { color: var(--text); background: color-mix(in srgb, var(--text) 6%, transparent); }
}
@media (min-width: 960px) and (prefers-reduced-motion: reduce) { .dl-head .dl-search { transition: none; } }

/* ── B3: шапка ленты на телефоне — тот же язык, что на десктопе: сегмент
 * «В работе N | Архив» и таблетка проекта, обе 36px на одной линии. ── */
@media (max-width: 959px) {
  #tab-bar { display: flex; align-items: center; gap: 8px; padding: 6px 16px 10px; border-bottom: 0; }
  #tab-bar .tab-seg { display: inline-flex; flex: 0 0 auto; height: 36px; padding: 3px; gap: 2px; box-sizing: border-box;
    border: 1px solid var(--s-line); border-radius: 999px; background: color-mix(in srgb, var(--s-surface) 80%, transparent); }
  #tab-bar .tab { flex: 0 0 auto; height: 28px; margin: 0; padding: 0 14px; display: inline-flex; align-items: center; gap: 6px;
    border: 0; border-radius: 999px; font-size: 14px; font-weight: 550; color: var(--hint); white-space: nowrap; }
  #tab-bar .tab.active { color: var(--text); font-weight: 550; background: var(--s-card); box-shadow: var(--s-sh-xs), 0 0 0 1px var(--s-line); border-bottom: 0; }
  #tab-bar .tab .badge { background: none; padding: 0; min-width: 0; height: auto; font-size: 13px; font-weight: 650; color: var(--hint); animation: none; }
  #tab-bar .tab.active .badge { color: var(--link); }
}

/* ── S2-6: уведомления не закрывают поле ввода — на компьютере и в чате на
 * телефоне они появляются сверху. ── */
@media (min-width: 960px) {
  /* Ниже шапки чата (0–66px) и по центру рабочей панели, а не окна: сверху
     тост ложился на название задачи и на ту самую точку, которую объяснял.
     380px — сайдбар 64 + колонка списка 316 (#desktop-layout). */
  .toast-container { bottom: auto; top: 76px; flex-direction: column;
    left: calc(380px + (100vw - 380px) / 2); }
  .toast-container .toast { transform: translateY(-10px); }
  .toast-container .toast.show { transform: none; }
}
@media (max-width: 959px) {
  body[data-screen="chat"] .toast-container { bottom: auto; top: calc(env(safe-area-inset-top, 0px) + 64px); flex-direction: column; }
  body[data-screen="chat"] .toast-container .toast { transform: translateY(-10px); }
  body[data-screen="chat"] .toast-container .toast.show { transform: none; }
}

/* ── S2-7: с открытым просмотром файла колонка чата узкая — ряд быстрых
 * действий одной строкой с прокруткой, «…» не падает отдельной строкой. ── */
@media (min-width: 960px) {
  body:has(#afp-side-panel.open) #quick-actions:not(.poll-mode) {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; max-height: none;
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
            mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
  }
  body:has(#afp-side-panel.open) #quick-actions:not(.poll-mode)::-webkit-scrollbar { display: none; }
}
#sched-delivery-fld[hidden], .fld-divider[hidden], .sched-delivery[hidden] { display: none; }

/* ── S3-4: подсказки в форме проекта — спокойным серым; предупреждающим
 * цветом и значком только реальный риск (что видит/запускает соавтор). ── */
.pe-share-warn { color: var(--hint); }
#pe-share-warn-exec:not(:empty) { color: var(--warning); display: flex; gap: 6px; align-items: flex-start; }
#pe-share-warn-exec:not(:empty)::before { content: '⚠'; flex: none; }
.pe-skill-install { width: auto; margin-top: 8px; }

/* ── S3-5: заголовок «Новое в задачах» и «Отметить всё прочитанным» на одной линии. ── */
.inbox-unread > summary { display: flex; align-items: center; gap: 12px; line-height: 1.4; }
.inbox-unread > summary .iu-title { flex: 1 1 auto; min-width: 0; line-height: 1.4; }
.inbox-unread > summary #inbox-mark-all { margin: 0 0 0 auto; flex: none; line-height: 1.4; padding: 0; align-self: center; }

/* ── D: на узком телефоне с текстом в поле появляется «улучшить» (✦), и
 * последняя кнопка ряда («/») обрезалась наполовину. Чипы проекта и модели
 * теперь сжимаются с многоточием, кнопки-иконки не сжимаются никогда. ── */
#cmp-project-wrap { min-width: 0; flex: 0 1 auto; }
#cmp-model-wrap { min-width: 0; flex: 0 0 auto; }
#cmp-project-wrap .cmp-chip, #cmp-model-wrap .cmp-chip { max-width: 100%; min-width: 0; overflow: hidden; }
#cmp-project-wrap .cmp-chip-label, #cmp-model-wrap .cmp-chip-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Ссылка на сайт продукта на экране входа (10.10.2026). */
.login-site-link { display: inline-block; margin-top: 8px; font-size: 13px; color: var(--hint); text-decoration: none; }
.login-site-link:hover { color: var(--link); text-decoration: underline; }

/* ── Подсказки боковой панели (10.10.2026): карточка с уголком, а не тёмная
   наклейка вплотную к кнопке поверх списка. Появляется с задержкой (проход
   мышью не мигает), после нажатия прячется. Цвета — по теме. ── */
[data-theme="light"] { --tip-bg: #ffffff; }
:root, [data-theme="dark"] { --tip-bg: #161c28; }
[data-theme="light"] #desktop-sidebar { --tip-bg: #ffffff; }
@media (min-width: 960px) {
  /* Своя ступень слоёв: прокручиваемый список рисуется отдельным слоем и
     иначе ложился поверх подсказок панели (нижняя половина плашки уходила
     под первую карточку). */
  #desktop-sidebar { position: relative; z-index: 30; }
  #desktop-sidebar [data-tip]::after {
    left: calc(100% + 14px);
    background: var(--tip-bg);
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 7px 11px;
    font-size: 13px;
    font-weight: 600;
    line-height: 16px;
    box-shadow: 0 10px 28px -10px rgba(15, 23, 42, .28), 0 1px 2px rgba(15, 23, 42, .06);
    transform: translate(-4px, -50%);
  }
  #desktop-sidebar [data-tip]::before {
    left: calc(100% + 9px);
    width: 10px; height: 10px;
    border: 1px solid var(--border);
    border-right-color: transparent; border-top-color: transparent;
    background: var(--tip-bg);
    transform: translate(-4px, -50%) rotate(45deg);
    z-index: 1301;
  }
  #desktop-sidebar [data-tip]:hover::after, #desktop-sidebar [data-tip]:focus-visible::after {
    transform: translate(0, -50%); transition-delay: .35s;
  }
  #desktop-sidebar [data-tip]:hover::before, #desktop-sidebar [data-tip]:focus-visible::before {
    transform: translate(0, -50%) rotate(45deg); transition-delay: .35s;
  }
  #desktop-sidebar [data-tip]:active::after, #desktop-sidebar [data-tip]:active::before {
    opacity: 0; transition-delay: 0s;
  }
}

/* ══ Скелетон главной на время первой загрузки (10.10.2026) ══
   До ответа /api/me, проектов и ленты страница собиралась кусками: сначала
   статичные вкладки и фильтр, потом сверху выпрыгивал hero, потом лента.
   Теперь, пока на <html> висит .is-booting, вместо живых блоков главной стоит
   каркас в их раскладке, а _finishBoot() снимает класс и проявляет блоки по
   очереди (.boot-in с --boot-i). Шапка и нижнее меню статичны — они видны сразу. */
.boot-skel { display: none; }
html.is-booting .boot-skel-home { display: flex; }
html.is-booting .boot-skel-list { display: block; }
@media (min-width: 960px) {
  html.is-booting .boot-skel-home { display: none; }
  html.is-booting #desktop-main-panel > .boot-skel-desk { display: flex; }
}
@media (max-width: 959px) {
  html.is-booting .boot-skel-list,
  html.is-booting .boot-skel-desk { display: none !important; }
}
/* Живые блоки на время загрузки спрятаны: их место держит каркас. */
html.is-booting #screen-dashboard > :not(.header):not(.boot-skel),
html.is-booting #home-hero,
html.is-booting #desktop-agent-list,
html.is-booting #owner-filter-desktop,
html.is-booting #sched-feed-summary-desktop { display: none !important; }

.boot-skel-home { flex-direction: column; padding: 4px 16px 24px; gap: 0; }
.sk {
  /* Перелив мягкий и медленный: резкий блик на тёмной теме читался миганием. */
  background: linear-gradient(100deg, var(--ov-06, var(--ov-04)) 35%, var(--ov-08) 50%, var(--ov-06, var(--ov-04)) 65%);
  background-size: 300% 100%;
  animation: sk-shimmer 2.2s ease-in-out infinite;
  border-radius: 10px;
}
/* Каркас проступает не сразу: на быстрой загрузке (кеш, хорошая сеть) он не
   успевает появиться вовсе, вместо вспышки «каркас → страница». */
html.is-booting .boot-skel { animation: sk-in .3s ease .12s both; }
@keyframes sk-in { from { opacity: 0; } to { opacity: 1; } }
/* Уход: каркас остаётся на своём месте (fixed по замеру) под проявляющимися
   блоками и гаснет, а не пропадает разом — это и было «резкое мигание». */
.boot-skel.boot-leaving {
  position: fixed; margin: 0; z-index: -1; pointer-events: none; animation: none;
  transition: opacity .35s ease !important;
}
/* Десктопный каркас носит .home-hero, а `#desktop-main-panel > .home-hero`
   гасит transition с !important — перебиваем селектором сильнее. */
#desktop-main-panel > .boot-skel.boot-leaving { transition: opacity .35s ease !important; }
html.is-booting #desktop-main-panel > .boot-skel { animation: sk-in .3s ease .12s both !important; }
@keyframes sk-shimmer { from { background-position: 100% 0; } to { background-position: 0 0; } }
.sk-chip { width: 92px; height: 41px; border-radius: 999px; }
/* Размеры сверены замером с живыми блоками (390 и 1440 px): расхождение 0–1 px. */
.sk-greet { width: 62%; max-width: 300px; height: 39px; margin: 20px auto 20px; border-radius: 12px; }
.sk-composer { width: 100%; height: 123px; border-radius: 28px; }
.sk-tpl { width: 141px; height: 38px; margin-top: 18px; border-radius: 999px; }
.sk-tabs { display: flex; justify-content: space-between; align-items: center; margin: 20px 0 22px; }
.sk-seg { width: 183px; height: 36px; border-radius: 999px; }
.sk-proj { width: 108px; height: 36px; border-radius: 999px; }
.sk-cards { display: flex; flex-direction: column; gap: 8px; margin: 0 -4px; }
.sk-card {
  display: flex; flex-direction: column; gap: 10px;
  padding: 15px 16px; border-radius: var(--r-card);
  border: 1px solid var(--border); background: var(--secondary-bg);
}
.sk-line { height: 14px; border-radius: 7px; }
.sk-line.sk-thin { height: 11px; }
.sk-w80 { width: 80%; } .sk-w70 { width: 70%; } .sk-w50 { width: 50%; } .sk-w45 { width: 45%; }
/* Карточки дальше от верха бледнее: каркас не притворяется длинной лентой. */
.sk-cards .sk-card:nth-child(4) { opacity: .6; }
.sk-cards .sk-card:nth-child(5) { opacity: .3; }

.boot-skel-desk .home-col { align-items: stretch; }
.boot-skel-desk .sk-greet { height: 52px; margin: 0 auto 27px; }
/* Место заголовка «Можно начать с шаблона» и сетки 2×3: колонка
   центрируется по вертикали, и без этого каркас стоял на 92px ниже. */
.boot-skel-desk .sk-tpl { width: 100%; height: 209px; margin-top: 38px; border-radius: 16px; }
.boot-skel-list { padding: 2px 10px 14px; }
.boot-skel-list .sk-row { display: flex; flex-direction: column; box-sizing: border-box; height: 70px; gap: 12px; padding: 14px; margin-bottom: 6px; }
/* Место фильтра «Мои / Все» в десктопном списке. */
html.boot-owner .boot-skel-list { padding-top: 58px; }
/* В светлой теме перелив на белых карточках почти не виден — гуще. */
[data-theme="light"] .sk { background-image: linear-gradient(100deg, var(--ov-08) 30%, var(--ov-14, var(--ov-12)) 50%, var(--ov-08) 70%); }
/* Сеть медленная (страховка сработала раньше данных): каркас остаётся, а не
   сменяется пустой страницей, и говорит, что происходит. */
/* Поверх каркаса, а не в потоке: иначе надпись сдвигала его, и при приходе
   данных всё прыгало обратно. */
.boot-skel-home, .boot-skel-desk .home-col { position: relative; }
html.boot-slow .boot-skel-home::before,
html.boot-slow .boot-skel-desk .home-col::after {
  content: 'Сеть медленная, ещё загружаем…';
  position: absolute; left: 0; right: 0;
  text-align: center; color: var(--hint); font-size: 13px;
}
html.boot-slow .boot-skel-home::before { top: 2px; }
html.boot-slow .boot-skel-desk .home-col::after { top: calc(100% + 18px); }
.boot-skel-list .sk-row:nth-child(n+5) { opacity: .5; }

/* Проявление после загрузки: сверху вниз с шагом 70 мс. */
.boot-in {
  animation: boot-in .45s cubic-bezier(.2, .7, .2, 1) both !important;
  animation-delay: calc(var(--boot-i, 0) * 70ms) !important;
}
@keyframes boot-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }

@media (prefers-reduced-motion: reduce) {
  .sk, html.is-booting .boot-skel { animation: none; }
  .boot-in { animation: none !important; }
  .boot-skel.boot-leaving { transition: none; }
}

/* ══ Скелетоны загрузки экранов: skel(kind, n) в app.js ══
   Тот же .sk, что у каркаса главной; формы повторяют итоговые блоки, чтобы при
   приходе данных ничего не прыгало. Проступает с задержкой — быстрый ответ
   каркас не показывает вовсе. */
.skx { display: flex; flex-direction: column; gap: 8px; grid-column: 1 / -1; width: 100%; box-sizing: border-box;
  animation: sk-in .3s ease .12s both; }
.skx-card { box-sizing: border-box; border: 1px solid var(--border); background: var(--secondary-bg); border-radius: var(--r-card, 16px); }
.skx-item { display: flex; align-items: center; gap: 12px; min-height: 68px; padding: 14px 16px; }
.skx-ico { flex: none; width: 36px; height: 36px; border-radius: 10px; }
.skx-lines { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 9px; }
.skx-list .skx-item:nth-child(4) { opacity: .6; }
.skx-list .skx-item:nth-child(n+5) { opacity: .3; }
.skx-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin-bottom: 14px; }
.skx-tile { display: flex; flex-direction: column; justify-content: space-between; gap: 12px; min-height: 84px; padding: 14px 16px; }
.skx-num { height: 24px; border-radius: 8px; }
.skx-title { padding: 6px 4px 4px; }
.skx-title .sk-line { height: 13px; min-width: 90px; max-width: 200px; }
.skx-group { overflow: hidden; margin-bottom: 14px; }
.skx-srow { display: flex; align-items: center; gap: 12px; min-height: 48px; padding: 12px 14px; box-sizing: border-box; }
.skx-srow + .skx-srow, .skx-trow + .skx-trow { border-top: 1px solid var(--border); }
.skx-pill { flex: none; width: 42px; height: 24px; border-radius: 999px; }
.skx-trow { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 16px; align-items: center; min-height: 44px; padding: 10px 14px; box-sizing: border-box; }
.skx-thead { min-height: 36px; opacity: .7; }
.skx-chart { display: flex; align-items: flex-end; gap: 6px; height: 180px; padding: 18px 16px; margin-bottom: 14px; }
.skx-chart > .sk { flex: 1; border-radius: 6px 6px 2px 2px; }
.skx-text { gap: 10px; padding: 4px 0; }
.skx-ico-s { width: 28px; height: 28px; border-radius: 8px; }
.skx-srows { gap: 0; }
.skx-srows .skx-srow + .skx-srow { border-top: 1px solid var(--border); }
.skx-files { gap: 0; }
.skx-frow { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 10px 12px; box-sizing: border-box; }
.skx-fico { flex: none; width: 20px; height: 20px; border-radius: 5px; }
.skx-frow .sk-line { height: 12px; }
.skx-files .skx-frow:nth-child(n+6) { opacity: .5; }
.skx-text .sk-line { height: 11px; }
@media (max-width: 640px) {
  .skx-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .skx-trow { grid-template-columns: 2fr 1fr 1fr; }
  .skx-trow > :nth-child(4) { display: none; }
  .skx-chart { height: 140px; gap: 4px; }
}
@media (prefers-reduced-motion: reduce) {
  .skx { animation: none; }
}

/* ══ UX-аудит, волна 1: мелочи (11.10.2026) ══ */
/* Профиль 1.2: всплывашка с именем у аватара дублировала открытое меню и наезжала на него. */
#desktop-sidebar [data-tip][aria-expanded="true"]::after,
#desktop-sidebar [data-tip][aria-expanded="true"]::before { display: none; }
/* Чат 1.4: «⋮» в десктопной ленте 20×20 — поле нажатия 28×28 псевдоэлементом,
   чтобы строка не стала выше (на телефоне это уже сделано у .agent-card-2l). */
.dl-item .dl-menu-btn { position: relative; }
.dl-item .dl-menu-btn::after { content: ''; position: absolute; inset: -4px; }
/* Рутины 1.4: «Удалить» прижато вправо, а не висит слева главным действием. */
.sched-actions .sched-del { margin-left: auto; }
.sched-actions .sched-del:hover { color: var(--danger, #d75c5c); }
/* Рутины 1.5: состояние видно цветом — «● Вкл» зелёное. */
.sched-toggle[aria-pressed="true"], .sched-page-toggle[aria-pressed="true"] { color: var(--success, #2e9e5b); }
/* Рутины 1.11: пояснение «Рутина — задача…» нужно, пока рутин нет. */
#screen-schedules .runners-intro:has(~ #schedules-list .sched-card) { display: none; }
/* Входящие 1.6: «Отметить всё прочитанным» было 17px по высоте. */
#inbox-mark-all { padding: 8px 4px; margin-top: -6px; margin-bottom: -6px; }
/* Форма проекта 1.14: «Настроить» у MCP — 21px; растим поле нажатия, не строку. */
#pe-mcp-manage { padding: 8px 6px; margin: -8px -6px; }
/* Списки 1.8: на десктопе заголовок экрана стоит над колонкой контента,
   а не у края окна (ширины колонок — из правил выше: 600 / 720 / 880). */
@media (min-width: 960px) {
  #screen-projects > .form-header, #screen-schedules > .form-header,
  #screen-inbox > .form-header, #screen-teams > .form-header, #screen-learn > .form-header {
    padding-left: max(16px, calc((100% - var(--col, 720px)) / 2));
    padding-right: max(16px, calc((100% - var(--col, 720px)) / 2));
  }
  #screen-projects { --col: 600px; }
  #screen-schedules, #screen-teams { --col: 880px; }
}
/* Вопрос агента M7/M11: подсказка о нескольких ответах — под вопросом;
   строки-пояснения без «?» — серым и обычным весом. */
.sdkq-q-main, .sdkq-q-ctx { display: block; }
#ask-dock .sdkq-q-ctx { font-weight: 400; font-size: var(--fs-md); color: var(--hint); letter-spacing: 0; }
.sdkq-sub { font-size: var(--fs-sm); color: var(--hint); margin-top: -6px; }
/* M13: бейдж совета в строке подписи — вариант не выше соседей, подпись на линии кружка. */
/* Отступ даёт пробел в разметке: на переносе он схлопывается, и бейдж встаёт
   ровно под подписью — margin сдвигал бы его и в новой строке. */
.sdkq-opt-label .sdkq-opt-rec { display: inline-flex; margin: 0; vertical-align: 1px; }
@media (max-width: 959px) {
  /* M9: поле мельче 16px iOS приближает при фокусе; варианты читаемее. */
  .sdkq-other-input { font-size: 16px; }
  #ask-dock .sdkq-opt-label { font-size: 15px; }
  #ask-dock .sdkq-opt-desc { font-size: 13.5px; }
}

/* ══ Карточка «1do спрашивает», v349: шапка и низ одной строкой (K1, K2),
   нижний лист на телефоне (K4) ══ */
/* K1. Шапка: заголовок слева, справа сегменты прогресса и меню «⋯». */
.sdkq-head { display: flex; flex-direction: column; }
.sdkq-body { display: flex; flex-direction: column; gap: 10px; }
.sdkq-grab, .sdkq-fold-strip { display: none; }
#ask-dock .sdkq-top { min-height: 40px; gap: 8px; margin: -6px 0 -4px; }
.sdkq-top-ttl { flex-shrink: 0; white-space: nowrap; }
.sdkq-top-r { position: relative; z-index: 1; margin-left: auto; display: flex; align-items: center; gap: 4px; min-width: 0; }
.sdkq-segs { display: flex; align-items: center; min-width: 0; }
.sdkq-seg {
  flex: 0 1 auto;
  width: 24px;
  min-width: 12px;
  height: 32px;
  padding: 0;
  border: none;
  border-radius: 8px;
  background: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
/* Серая — без ответа, синяя — отвечен, с обводкой — открыт сейчас. */
.sdkq-seg i {
  display: block;
  width: 18px;
  max-width: 100%;
  height: 4px;
  border-radius: 2px;
  background: var(--s-line-strong, var(--ov-24));
  transition: background 0.2s, box-shadow 0.2s;
}
.sdkq-seg.done i { background: var(--button); }
.sdkq-seg.active i { background: color-mix(in srgb, var(--button) 22%, transparent); box-shadow: 0 0 0 1.5px var(--button); }
.sdkq-seg.active.done i { background: var(--button); box-shadow: 0 0 0 2px color-mix(in srgb, var(--button) 35%, transparent); }
/* Последний сегмент — проверка ответов: галочка вместо пилюли. */
.sdkq-seg-review i {
  width: auto;
  height: auto;
  background: none !important;
  box-shadow: none !important;
  font-style: normal;
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  color: var(--hint);
}
.sdkq-seg-review.active i { color: var(--button); }
.sdkq-seg:hover i { filter: brightness(1.15); }
.sdkq-seg:focus-visible, .sdkq-more:focus-visible, .sdkq-grab:focus-visible, .sdkq-fold-strip:focus-visible,
.sdkq-menu-item:focus-visible, .sdkq-accept-chip:focus-visible {
  outline: 2px solid var(--link);
  outline-offset: -2px;
}
.sdkq-more {
  flex-shrink: 0;
  position: relative;
  width: 36px;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 999px;
  background: none;
  color: var(--hint);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.sdkq-more svg { width: 20px; height: 20px; fill: currentColor; }
.sdkq-more:hover, .sdkq-more[aria-expanded="true"] { background: var(--ov-06); color: var(--text); }
/* Точка на «⋯»: в меню ждёт «Принять советы 1do». */
.sdkq-more.has-rec::after {
  content: '';
  position: absolute;
  top: 7px;
  right: 7px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--button);
}
.sdkq-menu {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 5;
  min-width: 230px;
  padding: 6px;
  display: flex;
  flex-direction: column;
  background: var(--s-card, var(--secondary-bg));
  border: 1px solid var(--s-line, var(--ov-12));
  border-radius: 14px;
  box-shadow: var(--s-sh-window, 0 12px 32px rgba(0, 0, 0, 0.25));
}
.sdkq-menu[hidden] { display: none; }
.sdkq-menu .sdkq-menu-item {
  display: flex;
  align-items: center;
  min-height: 44px;
  width: 100%;
  padding: 0 12px;
  border: none;
  border-radius: 10px;
  background: none;
  color: var(--text);
  font-family: inherit;
  font-size: var(--fs-md);
  font-weight: 500;
  text-align: left;
  white-space: nowrap;
  opacity: 1;
  cursor: pointer;
}
.sdkq-menu .sdkq-menu-item:hover { background: var(--ov-06); }
.sdkq-menu .sdkq-accept { color: var(--link); }
.sdkq-menu .sdkq-stop { color: color-mix(in srgb, var(--destructive) 85%, var(--text)); }
.sdkq-menu .sdkq-stop:hover { background: color-mix(in srgb, var(--destructive) 10%, transparent); }
.sdkq-menu .sdkq-menu-item[hidden] { display: none; }
/* «✓ Как советует 1do» чипом в шапке — на широком экране; на телефоне он
   в меню «⋯», чтобы шапка оставалась одной строкой. */
.sdkq-accept-chip {
  flex-shrink: 0;
  height: 30px;
  padding: 0 12px;
  border: 1px solid var(--s-brand-line, var(--accent-line));
  border-radius: 999px;
  background: var(--s-brand-soft, var(--accent-bg));
  color: var(--s-brand-ink, var(--link));
  font-family: inherit;
  font-size: var(--fs-sm);
  font-weight: 600;
  white-space: nowrap;
  cursor: pointer;
  margin-right: 6px;
}
.sdkq-accept-chip:hover { border-color: var(--button); }
.sdkq-accept-chip[hidden] { display: none; }
/* Тема вопроса (раньше — подпись чипа) серой строкой над ним. */
.sdkq-eyebrow {
  margin: -4px 0 -6px;
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--hint);
}
.sdkq-sub .sdkq-hint { font-size: inherit; color: inherit; flex-basis: auto; }

/* K2. Низ: одна строка 56px — вторичная пилюля слева, главная справа. */
#ask-dock .sdkq-footer { display: block; padding: 6px 14px; }
.sdkq-footer-row { display: flex; align-items: center; gap: 8px; }
.sdkq-footer-sec { display: flex; flex: 0 1 auto; min-width: 0; }
.sdkq-footer-sec:empty { display: none; }
#ask-dock .sdkq-footer-sec .sdkq-skip {
  min-height: 44px;
  padding: 0 16px;
  border: 1px solid var(--s-line-strong, var(--ov-24));
  border-radius: 999px;
  background: transparent;
  color: var(--text);
  opacity: 1;
  font-size: var(--fs-md);
  font-weight: 500;
}
#ask-dock .sdkq-footer-sec .sdkq-skip:hover { background: var(--ov-06); }
#ask-dock .sdkq-submit {
  flex: 1 1 60%;
  min-height: 44px;
  padding: 0 20px;
  margin-left: auto;
  font-size: 16px;
  border-radius: 999px;
  background: var(--button);
}
#ask-dock .sdkq-submit:disabled { background: var(--ov-08); color: var(--hint); box-shadow: none; opacity: 1; }
#ask-dock .sdkq-submit[data-sdkq-next]::after { content: ' →'; }
#ask-dock .sdkq-keys {
  flex: 1 1 auto;
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
}
@media (min-width: 960px) {
  #ask-dock .sdkq-submit { flex: 0 0 auto; min-width: min(240px, 100%); }
}
@media (max-width: 959px) {
  .sdkq-accept-chip { display: none !important; }
}
@media (pointer: coarse) {
  .sdkq-seg { width: 44px; height: 44px; }
  .sdkq-more { width: 44px; height: 44px; }
  #ask-dock .sdkq-opt, #ask-dock .sdkq-words { min-height: 44px; }
}

/* K4. Телефон: док — нижний лист. Ручка сверху, скругление только сверху,
   свайп вниз по шапке (или тап по ручке) сворачивает в полосу 56px. */
@media (max-width: 959px) {
  /* Лист целиком в кадре на любом телефоне: док не прокручивается и может
     сжаться, прокручивается только тело карточки, а шапка и кнопки стоят на
     месте без position: sticky (на iPhone липкий низ уезжал за край, и до
     кнопок надо было долистывать). */
  #screen-chat > .ask-dock {
    display: flex;
    flex-direction: column;
    flex-shrink: 1;
    min-height: 0;
    overflow: hidden;
    max-height: calc(var(--dvh) * 62);
    padding: 0;
    margin-bottom: 0;
    background: var(--s-card, var(--secondary-bg));
    border-top: 1px solid var(--s-brand-line, var(--accent-line));
    border-radius: 22px 22px 0 0;
    box-shadow: 0 -12px 32px -16px rgba(15, 23, 42, 0.35);
  }
  /* Лист стоит на нижнем крае экрана: отступ поля ввода под ним не нужен,
     вырез снизу (home indicator) лист берёт на себя. */
  #screen-chat > #chat-input-bar.ask-docked { padding: 0; }
  #ask-dock .sdkq-card {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    padding: 0 16px;
    border: none;
    border-radius: 0;
    background: transparent;
    box-shadow: none;
  }
  /* Ручка и шапка стоят над телом — свернуть можно с любой прокрутки. */
  #ask-dock .sdkq-head {
    flex-shrink: 0;
    position: relative;
    z-index: 2;
    margin: 0 -16px;
    padding: 0 16px;
    background: var(--s-card, var(--secondary-bg));
  }
  /* Ручка во всю ширину: сегменты справа лежат поверх неё, а слева
     (над заголовком) она ловит тап на полную высоту 44px. */
  #ask-dock .sdkq-grab {
    display: block;
    position: relative;
    width: 100%;
    height: 44px;
    margin: 0 auto -26px;
    padding: 0;
    border: none;
    background: none;
    cursor: grab;
    -webkit-tap-highlight-color: transparent;
  }
  #ask-dock .sdkq-grab i, .sdkq-fold-strip::before {
    position: absolute;
    top: 8px;
    left: 50%;
    width: 36px;
    height: 4px;
    margin-left: -18px;
    border-radius: 2px;
    background: var(--s-line-strong, var(--ov-24));
  }
  #ask-dock .sdkq-grab i { display: block; }
  #ask-dock .sdkq-top { margin: 0; min-height: 44px; }
  #ask-dock .sdkq-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
    margin: 0 -16px;
    padding: 0 16px 10px;
  }
  #ask-dock .sdkq-footer {
    position: static;
    flex-shrink: 0;
    margin: 0 -16px;
    padding: 6px 16px calc(6px + env(safe-area-inset-bottom, 0px));
    background: var(--s-card, var(--secondary-bg));
    border-top: 1px solid var(--s-line, var(--ov-12));
  }
  /* Свёрнутый лист: только полоса «1do ждёт ответа · N вопросов · Ответить ↑». */
  #ask-dock.folded { overflow: hidden; }
  #ask-dock.folded .sdkq-card > :not(.sdkq-fold-strip) { display: none !important; }
  #ask-dock.folded .sdkq-card { padding: 0; }
  #ask-dock.folded .sdkq-fold-strip {
    display: flex;
    position: relative;
    align-items: center;
    gap: 10px;
    width: 100%;
    min-height: calc(56px + env(safe-area-inset-bottom, 0px));
    padding: 8px 16px calc(4px + env(safe-area-inset-bottom, 0px));
    border: none;
    background: none;
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-md);
    text-align: left;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  .sdkq-fold-strip::before { content: ''; top: 6px; }
  .sdkq-fold-txt { flex: 1; min-width: 0; color: var(--hint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .sdkq-fold-txt b { color: var(--link); font-weight: 650; }
  .sdkq-fold-go {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    height: 36px;
    padding: 0 14px;
    border-radius: 999px;
    background: var(--button);
    color: #fff;
    font-weight: 600;
    white-space: nowrap;
  }
}
@media (max-width: 959px) and (prefers-reduced-motion: no-preference) {
  #ask-dock.sheet-in .sdkq-card { animation: sdkq-sheet-in 0.24s cubic-bezier(0.2, 0.8, 0.2, 1); }
  #ask-dock .sdkq-card { transition: transform 0.18s ease-out; }
}
@keyframes sdkq-sheet-in { from { transform: translateY(24px); opacity: 0.6; } to { transform: none; opacity: 1; } }

/* ══ Карточка «Ответ отправлен» / «1do спрашивает» в ленте — в стиле 1do (11.10.2026) ══
   Значок состояния был эмодзи (✅ ❓ ⏭ ⏰) прямо в HTML с сервера и выбивался из
   темы. Эмодзи прячем, а значок рисуем линейной иконкой в мягком круге —
   правилом CSS, чтобы новый вид получили и старые события в истории. */
.qsum { border: 1px solid var(--s-line, var(--ov-12)); border-radius: var(--r-card, 16px); background: var(--s-card, var(--ov-04)); box-shadow: var(--s-sh-xs, none); }
.qsum-head { gap: 10px; padding: 11px 14px; border-bottom: 1px solid var(--s-line, var(--ov-06)); }
.qsum-head b { font-weight: 600; letter-spacing: -0.01em; }
.qsum-ic {
  position: relative; flex: 0 0 24px; width: 24px; height: 24px; border-radius: 50%;
  font-size: 0; color: var(--link); background: var(--s-brand-soft, var(--accent-bg));
}
.qsum-ic::after {
  content: ''; position: absolute; inset: 6px; background-color: currentColor;
  -webkit-mask: var(--qsum-ico) center / contain no-repeat; mask: var(--qsum-ico) center / contain no-repeat;
}
.qsum { --qsum-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 8.5a4 4 0 1 1 5.6 3.7c-1 .5-1.6 1.3-1.6 2.4'/%3E%3Cpath d='M12 19.5h.01'/%3E%3C/svg%3E"); }
.qsum[data-qsum-state="answered"] { --qsum-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); }
.qsum[data-qsum-state="skipped"] { --qsum-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 17 5-5-5-5'/%3E%3Cpath d='m13 17 5-5-5-5'/%3E%3C/svg%3E"); }
.qsum[data-qsum-state="timeout"] { --qsum-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E"); }
.qsum[data-qsum-state="answered"] .qsum-ic { color: var(--st-done, var(--success)); background: color-mix(in srgb, var(--st-done, var(--success)) 16%, transparent); }
.qsum[data-qsum-state="skipped"] .qsum-ic { color: var(--hint); background: var(--ov-06); }
.qsum[data-qsum-state="timeout"] .qsum-ic { color: var(--st-ask, var(--warning)); background: color-mix(in srgb, var(--st-ask, var(--warning)) 16%, transparent); }
.qsum-n { font-size: 12.5px; }
.qsum-list { gap: 12px; padding: 12px 14px 14px; }
/* Без боковой полосы у строки: разделяет отступ, а не линия. */
.qsum-row, .qsum[data-qsum-state] .qsum-row { padding-left: 0; border-left: 0; gap: 3px; }
.qsum-topic { font-size: 11.5px; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--hint); }
.qsum-q { font-size: 13.5px; }
.qsum-a { font-size: 14.5px; font-weight: 550; color: var(--text); }
.qsum-a::before { content: none; }
.qsum[data-qsum-state="answered"] .qsum-a:not(.qsum-none) { color: var(--s-brand-ink, var(--link)); }
.qsum-a.qsum-wait, .qsum-a.qsum-none { font-size: 13px; font-weight: 400; font-style: normal; opacity: .8; }

/* ── Файл готов: меню «Поделиться» на iPhone (save_file.js) ── */
.sf-sheet {
  position: fixed; inset: 0; z-index: 9600; display: flex; align-items: flex-end; justify-content: center;
  background: rgba(0, 0, 0, .35); padding: 16px 16px calc(16px + env(safe-area-inset-bottom, 0px));
}
.sf-card {
  width: 100%; max-width: 420px; display: flex; flex-direction: column; gap: 10px; padding: 18px;
  border-radius: 18px; background: var(--s-card, var(--bg)); color: var(--text); box-shadow: 0 12px 40px rgba(0, 0, 0, .25);
}
.sf-title { font-size: 16px; font-weight: 650; }
.sf-names { font-size: 13.5px; color: var(--hint); overflow-wrap: anywhere; }
.sf-card .btn-primary, .sf-card .btn-secondary { width: 100%; justify-content: center; }

/* ── Нераспознанные голосовые: число на микрофоне (вместо плашки над полем) ── */
#btn-voice, #btn-nt-mic { position: relative; overflow: visible; }
.voice-pending-badge {
  position: absolute; top: -4px; right: -4px; z-index: 1;
  min-width: 18px; height: 18px; padding: 0 5px; box-sizing: border-box;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 999px; background: var(--warning, #d08c3f); color: #fff;
  font-size: 11px; font-weight: 700; line-height: 1;
  pointer-events: none;  /* только индикатор: нажатие уходит в микрофон */
  box-shadow: 0 0 0 2px var(--s-card, var(--bg));
}


/* ── iPad в установленном приложении: полоса со временем поверх экрана ──
 * viewport-fit=cover + black-translucent кладут статус-бар на страницу.
 * Шапки экранов справа (.header/.chat-header/.form-header) отступ уже
 * учитывали, а рейка с логотипом и колонка «Агенты» — нет: логотип и
 * заголовок уходили под время (Адлет, 11.10.2026). Снизу — полоска «домой». */
@media (min-width: 960px) {
  #desktop-sidebar {
    padding-top: calc(12px + env(safe-area-inset-top, 0px));
    padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
    padding-left: env(safe-area-inset-left, 0px);
  }
  #desktop-list-panel .dl-head { padding-top: calc(10px + env(safe-area-inset-top, 0px)); }
  #desktop-list-panel { padding-bottom: env(safe-area-inset-bottom, 0px); }
}
/* Экраны справа (Аналитика, Настройки, Проекты) прокручиваются вместе с
 * шапкой — при прокрутке текст шёл под время. Под полосой — размытая
 * подложка, как в нативных приложениях iOS; без полосы её высота 0. */
@media (min-width: 960px) {
  #desktop-main-panel::before {
    content: '';
    position: absolute; top: 0; left: 0; right: 0;
    height: env(safe-area-inset-top, 0px);
    z-index: 50;
    pointer-events: none;
    background: color-mix(in srgb, var(--bg) 82%, transparent);
    -webkit-backdrop-filter: blur(14px) saturate(1.4);
    backdrop-filter: blur(14px) saturate(1.4);
  }
}
/* ══════════════════════════════════════════════════════════════════
 * Лимиты на человека (фаза 215): экран «Лимиты и тариф», блок в меню
 * профиля, полоса над полем ввода, модалка отказа, админка «Лимиты стенда».
 * Цвет полоски: < 75% основной, 75–99% оранжевый, 100% красный.
 * Ритм — как у «Настроек»: карточка 16px с рамкой и лёгкой тенью,
 * подпись группы 13px серым над карточкой, кнопки — общие таблетки.
 * ══════════════════════════════════════════════════════════════════ */
#screen-limits .form-body, #screen-admin-limits .form-body { padding: 12px 16px 24px; }
@media (min-width: 960px) {
  /* По центру, как «Настройки» и «Расходы», а не прижато влево */
  #screen-limits .form-body { max-width: 760px; margin: 0 auto; padding: 16px 24px 80px; }
}
.lim-sub { color: var(--hint); font-size: 14px; line-height: 1.45; margin: 0 4px 16px; }
.lim-note { color: var(--hint); font-size: 13px; line-height: 1.45; margin-top: 6px; }
.lim-muted { color: var(--hint); }
.lim-label { color: var(--hint); font-size: 13px; }
/* Подпись группы — как .st-group-title в «Настройках» */
.lim-h { font-size: 13px; font-weight: 650; color: var(--hint); letter-spacing: 0; margin: 24px 0 0; padding: 0 4px 8px; scroll-margin-top: 12px; }
.lim-card {
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px;
  box-shadow: var(--s-sh-xs); padding: 16px; margin-bottom: 16px; min-width: 0;
}
.lim-card-title { font-size: 15px; font-weight: 600; line-height: 1.3; }
.lim-card > .lim-note:first-of-type { margin-top: 2px; }
.lim-plan-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.lim-plan-foot { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--s-line); }
.lim-plan-line { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.lim-plan-note { color: var(--hint); font-size: 13px; }
.lim-off { margin-top: 14px; }
.lim-grid2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
.lim-grid-admin { gap: 16px; margin-bottom: 16px; align-items: start; }
.lim-grid-admin .lim-card { margin-bottom: 0; }
@media (max-width: 640px) { .lim-grid2 { grid-template-columns: minmax(0, 1fr); gap: 18px; } }

.lim-badge {
  display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px; font-size: 12px; line-height: 1.4;
  font-weight: 650; background: var(--s-tint-blue); color: var(--s-on-blue); white-space: nowrap;
}
.lim-badge-free { background: var(--s-surface); color: var(--text); border: 1px solid var(--s-line); }
.lim-badge-exempt { background: var(--s-tint-violet); color: var(--s-on-violet); }

/* Полоски: процент крупно — это главное на экране */
.lim-meter-head { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
.lim-meter-name { font-weight: 600; font-size: 15px; }
.lim-meter-pct { font-weight: 750; font-size: 22px; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; white-space: nowrap; }
.lim-meter-of { font-size: 13px; font-weight: 500; color: var(--hint); letter-spacing: 0; }
.lim-track, .lim-mini-track { border-radius: 999px; background: color-mix(in srgb, var(--text) 9%, transparent); overflow: hidden; }
.lim-track { height: 8px; margin: 8px 0 7px; }
.lim-mini-track { height: 5px; margin: 4px 0 8px; }
.lim-fill { height: 100%; border-radius: inherit; background: var(--button); transition: width .4s ease; }
.lim-fill.warn { background: var(--warning); }
.lim-fill.danger { background: var(--destructive); }
.lim-meter-foot { color: var(--hint); font-size: 13px; }
@media (prefers-reduced-motion: reduce) { .lim-fill { transition: none; } }

.lim-alert { border-radius: 16px; padding: 12px 16px; font-size: 14px; line-height: 1.45; margin-bottom: 16px; border: 1px solid; color: var(--text); }
.lim-alert.warn { background: var(--warning-bg); border-color: var(--warning-line); }
.lim-alert.danger { background: var(--danger-bg); border-color: var(--danger-line); }

/* Планы */
.lim-plans { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; }
@media (max-width: 760px) { .lim-plans { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } }
.lim-plan {
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px; padding: 14px;
  box-shadow: var(--s-sh-xs); display: flex; flex-direction: column; gap: 2px; min-width: 0;
}
.lim-plan.is-current { border-color: var(--s-brand-line); box-shadow: 0 0 0 1px var(--s-brand-line) inset; background: var(--s-brand-soft); }
.lim-plan-name { font-weight: 600; font-size: 14px; color: var(--hint); }
.lim-plan.is-current .lim-plan-name { color: var(--s-brand-ink, var(--link)); }
.lim-plan-price { font-size: 20px; font-weight: 750; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; white-space: nowrap; margin-top: 2px; }
.lim-plan-price small { font-size: 12px; font-weight: 500; color: var(--hint); letter-spacing: 0; }
.lim-plan-mult { color: var(--hint); font-size: 13px; flex: 1; }
/* Кнопка и подпись внизу карточки одной высоты — карточки ровные */
.form-body .lim-plan-btn, .lim-plan-btn {
  display: inline-flex; align-items: center; justify-content: center; width: 100%;
  margin-top: 10px; min-height: 38px; padding: 7px 10px; font-size: 14px;
}
.lim-plan-cur {
  display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 10px; min-height: 38px;
  font-size: 13.5px; font-weight: 600; color: var(--s-brand-ink, var(--link));
}
.lim-plan-cur.is-muted { color: var(--hint); font-weight: 500; }
/* .btn-primary в .form-body — блок во всю ширину с отступом сверху; здесь по содержимому */
.form-body .lim-up-btn, .form-body #lim-save {
  display: inline-flex; align-items: center; justify-content: center; width: auto; margin: 0;
  min-height: 38px; padding: 8px 18px; font-size: 14px; white-space: nowrap; flex: none;
}
.lim-admin-link { margin: 14px 0 0; display: inline-block; padding: 8px 4px; }

/* Меню профиля: блок «Лимиты» вместо обычной строки */
.menu-select .ms-item.ms-item-block { display: block; padding: 10px 12px 9px; min-height: 0; text-align: left; }
.menu-select.menu-select-sheet .ms-item.ms-item-block { font-size: 14px; padding: 12px; }
.lim-mini-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.lim-mini-title { font-weight: 650; flex: 1; min-width: 0; }
.lim-mini-chev { color: var(--hint); flex: none; margin-right: -4px; }
.lim-mini-row { display: flex; justify-content: space-between; font-size: 13px; color: var(--text); font-variant-numeric: tabular-nums; }
.lim-mini-note { color: var(--hint); font-size: 12px; font-weight: 400; }
.menu-select .ms-item.ms-item-block:focus-visible { box-shadow: inset 0 0 0 2px var(--link); }

/* Полоса над полем ввода: радиус и отступ как у баннера очереди */
.lim-strip {
  display: flex; align-items: center; gap: 8px; margin: 0 0 8px; padding: 6px 6px 6px 14px; min-height: 40px; box-sizing: border-box;
  border-radius: var(--r-xl, 16px); font-size: 13.5px; line-height: 1.4; border: 1px solid; color: var(--text);
}
.lim-strip.warn { background: var(--warning-bg); border-color: var(--warning-line); }
.lim-strip.danger { background: var(--danger-bg); border-color: var(--danger-line); }
.lim-strip-text { flex: 1; min-width: 0; padding: 3px 0; }
.lim-strip-x {
  display: inline-flex; align-items: center; justify-content: center; flex: none; width: 32px; height: 32px;
  border: 0; background: transparent; color: var(--hint); font-size: 20px; line-height: 1; padding: 0; cursor: pointer; border-radius: 10px;
}
.lim-strip-x:hover { color: var(--text); background: color-mix(in srgb, var(--text) 7%, transparent); }
.lim-strip-link {
  flex: none; min-height: 32px; border: 0; border-radius: 10px; background: transparent; color: var(--link);
  font: inherit; font-weight: 600; cursor: pointer; white-space: nowrap; padding: 4px 10px;
}
.lim-strip-link:hover { background: color-mix(in srgb, var(--link) 9%, transparent); }
.lim-strip-x:focus-visible, .lim-strip-link:focus-visible, .lim-plan-btn:focus-visible, .lim-up-btn:focus-visible,
.lim-admin-link:focus-visible, #lim-save:focus-visible, #lim-enabled:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }
/* Заблокированное поле: приглушено, плейсхолдер обычным серым — красного
   хватает в полосе над полем */
.chat-input-bar.lim-locked .chat-input-wrapper { opacity: .78; }

/* Модалка отказа 429 usage_limit: кнопки как у остальных модалок */
.lim-modal { max-width: 520px; width: 100%; }
.lim-modal h3 { margin: 0 0 6px; font-size: 18px; font-weight: 700; letter-spacing: -0.015em; }
.lim-modal-text { color: var(--hint); font-size: 14px; line-height: 1.5; margin: 0 0 14px; }
.lim-modal .modal-actions { margin-top: 16px; }
.lim-modal .modal-actions .btn-secondary, .lim-modal .modal-actions .btn-primary {
  width: auto; margin: 0; padding: 9px 16px; font-size: var(--fs-lg); }
/* В модалке планы — справка, а не витрина: без кнопок, текущий отмечен */
.lim-plans-compact { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
.lim-plans-compact .lim-plan { padding: 10px 12px; box-shadow: none; }
.lim-plans-compact .lim-plan-price { font-size: 16px; }
.lim-plans-compact .lim-plan-btn, .lim-plans-compact .lim-plan-cur.is-muted { display: none; }
.lim-plans-compact .lim-plan-cur { justify-content: flex-start; margin-top: 4px; min-height: 0; font-size: 12.5px; }
@media (max-width: 480px) {
  .lim-modal .modal-actions .btn-secondary, .lim-modal .modal-actions .btn-primary { flex: 1 1 auto; white-space: nowrap; padding: 9px 14px; }
}

/* Админка «Лимиты стенда» */
.lim-toggle-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.lim-toggle-text { min-width: 0; }
.lim-toggle-row .st-toggle { flex: none; }
.lim-table { width: 100%; border-collapse: collapse; margin-top: 12px; font-size: 14px; }
.lim-table th { text-align: left; color: var(--hint); font-weight: 500; font-size: 12.5px; padding: 0 8px 6px 0; }
.lim-table td { padding: 4px 8px 4px 0; vertical-align: middle; white-space: nowrap; }
.lim-table td:last-child, .lim-table th:last-child { padding-right: 0; }
.lim-table th.lim-num, .lim-table td.lim-num { text-align: right; }
.lim-table:not(.lim-shares) { width: auto; }
.lim-table:not(.lim-shares) td:first-child { min-width: 84px; padding-right: 16px; }
.lim-usd-in { display: flex; align-items: center; gap: 6px; color: var(--hint); }
/* .form-body input (0,1,1) растягивал поля на всю ширину — здесь узкие */
.form-body .lim-in {
  width: 92px; max-width: 100%; padding: 7px 10px; border: 1px solid var(--s-line); border-radius: 10px;
  background: var(--s-surface); color: var(--text); font: inherit; font-size: 14px; font-variant-numeric: tabular-nums; text-align: right;
}
.form-body .lim-in:focus { outline: none; border-color: var(--s-brand-line); box-shadow: 0 0 0 3px var(--s-brand-soft); }
.form-body .lim-in[aria-invalid="true"] { border-color: var(--danger); background: var(--danger-bg); }
.lim-num { font-variant-numeric: tabular-nums; color: var(--hint); font-size: 13px; }
.form-body .lim-shares .lim-in { width: 72px; }
.lim-save-row { display: flex; align-items: center; justify-content: flex-end; gap: 12px; margin: 0 0 16px; }
.lim-save-row .lim-note { margin: 0; flex: 1; min-width: 0; text-align: right; }
.lim-users { margin-top: 10px; }
.lim-urow {
  display: grid; grid-template-columns: minmax(120px, 1.3fr) minmax(110px, 1fr) minmax(0, 1.2fr) minmax(0, 1.2fr) minmax(90px, 1fr);
  gap: 10px; align-items: center; padding: 10px 0; border-top: 1px solid var(--s-line); font-size: 14px;
}
.lim-uhead { color: var(--hint); font-size: 12.5px; border-top: 0; padding-top: 0; }
.lim-ucell { min-width: 0; overflow-wrap: anywhere; }
.lim-uwho { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.lim-ulabel { display: none; }
.lim-pill {
  display: inline-block; min-width: 42px; text-align: center; padding: 1px 7px; border-radius: 999px; font-weight: 650; font-size: 12.5px;
  background: var(--s-tint-blue); color: var(--s-on-blue); font-variant-numeric: tabular-nums;
}
.lim-pill.warn { background: var(--s-tint-amber); color: var(--s-on-amber); }
.lim-pill.danger { background: var(--s-tint-red); color: var(--s-on-red); }
.lim-pill.is-muted { background: none; color: var(--hint); font-weight: 500; }
.lim-usd { color: var(--hint); font-size: 13px; font-variant-numeric: tabular-nums; }
.form-body .lim-uplan .st-select { width: 100%; max-width: 160px; min-height: 36px; padding: 6px 10px; font-size: 14px; }
@media (max-width: 720px) {
  .lim-uhead { display: none; }
  .lim-urow { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px 12px; padding: 12px 0; }
  .lim-uwho { grid-column: 1 / -1; }
  .lim-uplan { grid-column: 1 / -1; }
  .form-body .lim-uplan .st-select { max-width: none; min-height: 40px; }
  .lim-ulabel { display: block; color: var(--hint); font-size: 12px; margin-bottom: 2px; }
  .lim-usd-cap { display: none; }
}
@media (max-width: 480px) {
  /* Доли планов на 375: потолок в две строки, поля уже — без прокрутки вбок */
  .lim-card { padding: 14px; }
  .form-body .lim-shares .lim-in { width: 70px; padding: 7px 7px; font-size: 13.5px; }
  .lim-shares td, .lim-shares th { padding-right: 6px; }
  .lim-shares td.lim-num { white-space: normal; font-size: 12.5px; line-height: 1.35; }
}
/* Телефон: конец экрана не уходит под панель вкладок (как у «Расходов») */
@media (max-width: 959px) {
  #screen-limits, #screen-admin-limits { padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px) + 8px); }
}

/* ── Навигация (11.10.2026): «Управление», Профиль, личное меню ──────────────
   Рейка — только рабочие разделы; внизу «Управление» (админ и владелец) и
   аватар. Оба места в разметке с первой отрисовки: кнопку показывает класс
   роли на <html> (кэш прошлого входа), аватар до /api/me — заглушка. */
#sidebar-admin { display: none; position: relative; }
html.role-admin #sidebar-admin { display: flex; }
#sidebar-admin .access-badge[hidden] { display: none; }
.sidebar-avatar-slot { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; }
.sidebar-avatar-skel { display: block; width: 36px; height: 36px; border-radius: 50%; background: var(--ov-06, rgba(127,127,127,.12)); }
/* Аватар разметкой: инициалы снизу, фото поверх (не загрузилось — видны инициалы) */
.sidebar-avatar, .pm-ava, .pf-ava { position: relative; display: inline-flex; flex: none; border-radius: 50%; overflow: hidden; }
.sidebar-avatar-ini, .pm-ava-ini, .pf-ava-ini {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  background: var(--accent-bg-strong, var(--accent-bg)); color: var(--link); font-weight: 650; letter-spacing: .02em;
}
.sidebar-avatar > img, .pm-ava > img, .pf-ava > img { position: relative; width: 100%; height: 100%; object-fit: cover; }
.sidebar-avatar-ini { font-size: 13px; }
.sidebar-avatar-btn.active .sidebar-avatar { box-shadow: 0 0 0 2px var(--link); }

/* Шапка личного меню: кто вошёл → Профиль */
.menu-select .ms-item.ms-profile { padding: 10px 12px; }
.pm-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
.pm-ava { width: 36px; height: 36px; }
.pm-ava-ini { font-size: 13px; }
.pm-text { display: flex; flex-direction: column; min-width: 0; flex: 1; line-height: 1.25; }
.pm-name { font-weight: 650; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pm-sub { font-size: 12.5px; color: var(--hint); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pm-chev { color: var(--hint); flex: none; margin-right: -4px; }

/* Вкладки «Управления» под шапкой экрана */
.adm-tabs {
  display: flex; gap: 4px; padding: 4px; margin: 4px 16px 4px; overflow-x: auto; scrollbar-width: none;
  background: var(--s-card, var(--secondary-bg)); border: 1px solid var(--s-line, var(--border)); border-radius: 12px;
  align-self: flex-start; max-width: calc(100% - 32px); box-sizing: border-box; flex: none;
}
.adm-tabs::-webkit-scrollbar { display: none; }
.adm-tab {
  display: inline-flex; align-items: center; gap: 6px; flex: none; border: 0; background: transparent; cursor: pointer;
  font: inherit; font-size: 14px; font-weight: 600; color: var(--hint); padding: 7px 14px; border-radius: 9px; white-space: nowrap;
}
.adm-tab:hover { color: var(--text); }
.adm-tab.active { background: var(--accent-bg); color: var(--link); }
.adm-tab:focus-visible { outline: 2px solid var(--link); outline-offset: 1px; }
.adm-tab-badge {
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px; box-sizing: border-box;
  background: var(--danger, #e5484d); color: #fff; font-size: 11px; font-weight: 700; line-height: 18px; text-align: center;
}

/* brain.css красит все кнопки .screen-brain рамкой и фоном — вкладкам свой вид */
.screen-brain .form-header button.btn-icon { border: 0; background: transparent; padding: 0; }
.screen-brain .adm-tabs .adm-tab { border: 0; background: transparent; color: var(--hint); padding: 7px 14px; border-radius: 9px; font-size: 14px; font-weight: 600; }
.screen-brain .adm-tabs .adm-tab:hover { color: var(--text); background: transparent; }
.screen-brain .adm-tabs .adm-tab.active { background: var(--accent-bg); color: var(--link); }

/* Профиль */
#screen-profile .pf-body { padding: 8px 16px 100px; overflow-y: auto; }
@media (min-width: 960px) { #screen-profile .pf-body { max-width: 680px; margin: 0 auto; width: 100%; box-sizing: border-box; } }
@media (max-width: 959px) {
  #screen-profile { padding-bottom: calc(var(--tabbar-h) + env(safe-area-inset-bottom, 0px) + 8px); }
}
.pf-id { display: flex; align-items: center; gap: 14px; padding: 16px; margin: 4px 0 22px;
  background: var(--s-card, var(--secondary-bg)); border: 1px solid var(--s-line, var(--border)); border-radius: 16px; box-shadow: var(--s-sh-xs, none); }
.pf-ava { width: 56px; height: 56px; }
.pf-ava-ini { font-size: 20px; }
.pf-id-text { min-width: 0; }
.pf-name { font-size: 19px; font-weight: 750; letter-spacing: -0.01em; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pf-sub { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 3px; font-size: 13.5px; color: var(--hint); }
.pf-role { font-size: 12px; font-weight: 650; color: var(--link); background: var(--accent-bg); padding: 2px 8px; border-radius: 999px; }
.pf-limits {
  display: block; width: 100%; text-align: left; cursor: pointer; font: inherit; color: var(--text);
  padding: 14px 16px; margin: 0 0 22px; box-sizing: border-box;
  background: var(--s-card, var(--secondary-bg)); border: 1px solid var(--s-line, var(--border)); border-radius: 16px; box-shadow: var(--s-sh-xs, none);
}
.pf-limits:hover { border-color: color-mix(in srgb, var(--link) 35%, var(--s-line, var(--border))); }
.pf-limits:focus-visible { outline: 2px solid var(--link); outline-offset: 2px; }
/* «Люди»: пустые блоки — одной строкой, чтобы список людей не уезжал вниз */
#screen-admin-access .admin-access-list > .empty-state { padding: 10px 4px; min-height: 0; text-align: left; }
#screen-admin-access .admin-access-list > .empty-state p { margin: 0; font-size: 13.5px; color: var(--hint); }
/* Телефон: полоса вкладок «Управления» шире экрана — край затухает, видно,
   что её можно листать */
@media (max-width: 959px) {
  .adm-tabs.is-scroll:not(.at-end) { -webkit-mask-image: linear-gradient(90deg, #000 85%, transparent); mask-image: linear-gradient(90deg, #000 85%, transparent); }
}

/* ── «Управление»: одна сетка на все вкладки (11.10.2026) ────────────────────
   Раньше у каждой вкладки была своя ширина: Аналитика и Расходы во весь экран,
   Лимиты 900px у левого края, Brain снова во весь. Теперь как в Настройках и
   Профиле: колонка --adm-w по центру, полоса вкладок стоит на её левом краю. */
:root { --adm-w: var(--page-w); --adm-pad: var(--page-pad); }
@media (min-width: 960px) {
  .adm-tabs {
    width: max-content; max-width: calc(100% - 2 * var(--adm-pad));
    margin: 16px 0 4px max(var(--adm-pad), calc((100% - var(--adm-w)) / 2 + var(--adm-pad)));
  }
  #screen-admin-stats > .form-body, #screen-admin-costs > .form-body,
  #screen-admin-limits > .form-body, #screen-admin-access > .form-body, #screen-brain > #brain-mount {
    width: 100%; max-width: var(--adm-w); margin: 0 auto; box-sizing: border-box;
    padding: 16px var(--adm-pad) 80px;
  }
  #screen-brain > #brain-mount { padding-bottom: 24px; }
}

/* ── «Управление»: единый вид вкладок по образцу Настроек (11.10.2026) ───────
   Подпись группы — над карточкой (13px/650, серым), карточка — фон --s-card,
   рамка --s-line, радиус 16, тень --s-sh-xs, между группами 22px. Плитки
   цифр одной высоты: подпись сверху серым, значение крупно. Всё под id
   экранов «Управления» — личные «Мои расходы» (#screen-costs) не трогаем. */
:is(#screen-admin-stats, #screen-admin-costs, #screen-admin-access, #screen-admin-limits, #screen-brain) > .form-header {
  min-height: calc(65px + env(safe-area-inset-top, 0px)); box-sizing: border-box; padding-top: calc(8px + env(safe-area-inset-top, 0px)); padding-bottom: 8px;
}
:is(#screen-admin-access, #screen-admin-limits) > .form-header > .btn-icon:not(.btn-back-ico) {
  width: 36px; height: 36px; min-width: 36px; min-height: 36px; padding: 0; display: inline-flex; align-items: center; justify-content: center; font-size: 18px;
}
#screen-brain > .form-header h2 { font-family: var(--font, inherit); }
@media (max-width: 959px) {
  .adm-tabs { margin: 12px 16px 0; }
  :is(#screen-admin-stats, #screen-admin-costs, #screen-admin-access, #screen-admin-limits) > .form-body { padding: 16px 16px 100px; }
}

/* Плитки цифр */
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .costs-cards { gap: 12px; margin: 0 0 22px; }
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .cost-card {
  display: flex; flex-direction: column; justify-content: space-between; gap: 6px; min-width: 0; min-height: 88px; box-sizing: border-box;
  padding: 14px 16px; text-align: left;
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px; box-shadow: var(--s-sh-xs);
}
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .cost-card-label {
  margin: 0; font-size: 13px; font-weight: 600; line-height: 1.3; color: var(--hint); text-transform: none; letter-spacing: 0;
}
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .cost-card-value {
  font-size: 24px; font-weight: 750; letter-spacing: -0.02em; line-height: 1.15; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
@media (max-width: 640px) {
  #screen-admin-stats .adm-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #screen-admin-stats .adm-kpis > .cost-card:last-child:nth-child(odd) { grid-column: 1 / -1; }
  :is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .costs-cards { gap: 10px; }
  :is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .cost-card { min-height: 78px; padding: 12px 14px; }
  :is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .cost-card-value { font-size: 21px; }
}

/* Секции: подпись над карточкой. Подпись в разметке внутри секции — выносим
   её над рамкой абсолютным позиционированием; место под неё даёт margin-top. */
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .costs-section {
  position: relative; overflow: visible; min-width: 0;
  margin: 48px 0 0; padding: 16px;
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px; box-shadow: var(--s-sh-xs);
}
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .costs-section:last-child { margin-bottom: 8px; }
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .costs-section > .costs-section-title {
  position: absolute; left: 4px; right: 4px; top: -26px; margin: 0;
  font-size: 13px; font-weight: 650; line-height: 18px; color: var(--hint); text-transform: none; letter-spacing: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Подписи полосок — одной колонкой, чтобы полосы начинались ровно */
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .breakdown-label {
  width: 168px; min-width: 168px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px;
}
@media (max-width: 640px) {
  :is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .breakdown-label { width: 96px; min-width: 96px; font-size: 13.5px; }
  :is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .costs-section { padding: 14px; }
}

/* Таблицы: внутри карточки, на телефоне листаются вбок до краёв карточки */
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .admin-stats-table-wrap {
  margin: -6px -16px -10px; padding: 0 6px; overflow-x: auto; -webkit-overflow-scrolling: touch; overscroll-behavior-x: contain;
}
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .admin-stats-table { font-size: 14px; font-variant-numeric: tabular-nums; }
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .admin-stats-table th {
  font-size: 12.5px; font-weight: 600; color: var(--hint); text-transform: none; letter-spacing: 0; padding: 10px; border-bottom: 1px solid var(--s-line);
}
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .admin-stats-table td { padding: 10px; border-bottom: 1px solid var(--s-line); }
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .admin-stats-table tr:last-child td { border-bottom: 0; }
:is(#screen-admin-stats, #screen-admin-costs, #screen-costs) .admin-stats-table tr:hover td { background: color-mix(in srgb, var(--text) 3%, transparent); }

/* «Люди»: подписи групп как в Настройках, пустые блоки — карточкой в одну строку */
#screen-admin-access .users-section-title {
  padding: 0 4px 8px; margin: 22px 0 0; font-size: 13px; font-weight: 650; color: var(--hint); text-transform: none; letter-spacing: 0;
}
#screen-admin-access .form-body > .users-section-title:first-child { margin-top: 0; }
#screen-admin-access .admin-access-list > .empty-state,
#screen-admin-access .users-list > .empty-state {
  padding: 13px 16px; min-height: 0; text-align: left;
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px; box-shadow: var(--s-sh-xs);
}
#screen-admin-access .admin-access-list > .empty-state p, #screen-admin-access .users-list > .empty-state p { margin: 0; font-size: 14px; color: var(--hint); }
#screen-admin-access .users-list { padding: 0; }
#screen-admin-access .user-card {
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 16px; box-shadow: var(--s-sh-xs); padding: 14px 16px;
}

/* «Лимиты»: обе карточки одной высоты, «Сохранить» вплотную под ними */
#screen-admin-limits .lim-sub { margin: 0 4px 14px; font-size: 13.5px; }
#screen-admin-limits .lim-card { margin-bottom: 22px; }
#screen-admin-limits .lim-grid-admin { align-items: stretch; margin-bottom: 12px; }
#screen-admin-limits .lim-grid-admin .lim-card { margin-bottom: 0; }
#screen-admin-limits .lim-save-row { margin: 0 0 22px; }
#screen-admin-limits .lim-save-row .lim-note { text-align: left; padding-left: 4px; }
/* «Люди» в Лимитах — подпись над карточкой, как у остальных групп */
#screen-admin-limits .lim-card:has(> .lim-users) { position: relative; margin-top: 48px; }
#screen-admin-limits .lim-card:has(> .lim-users) > .lim-card-title {
  position: absolute; left: 4px; top: -26px; font-size: 13px; font-weight: 650; line-height: 18px; color: var(--hint);
}
#screen-admin-limits .lim-users { margin-top: -6px; }

/* Brain: шапка и вкладки внутри колонки, шрифт и фон приложения */
#screen-brain { font-family: inherit; font-size: inherit; line-height: inherit; background: transparent; }
#screen-brain > #brain-mount { font-size: 14px; line-height: 1.5; }
#screen-brain #brain-mount .brain-header {
  position: static; padding: 0 4px 12px; background: transparent; border: 0; flex-wrap: wrap; row-gap: 8px;
}
#screen-brain #brain-mount .brain-header h1 { font-size: 13px; font-weight: 650; color: var(--hint); }
#screen-brain #brain-mount nav.tabs {
  position: static; display: flex; width: max-content; max-width: 100%; box-sizing: border-box; gap: 4px; padding: 4px; margin: 0 0 16px;
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: 12px; box-shadow: var(--s-sh-xs); scrollbar-width: none;
}
#screen-brain #brain-mount nav.tabs::-webkit-scrollbar { display: none; }
#screen-brain #brain-mount .brain-tab-btn { border: 0; border-radius: 9px; padding: 7px 14px; font-size: 14px; font-weight: 600; color: var(--hint); background: transparent; }
#screen-brain #brain-mount .brain-tab-btn:hover { color: var(--text); }
#screen-brain #brain-mount .brain-tab-btn.active { background: var(--accent-bg); color: var(--link); }
#screen-brain #brain-mount .brain-main { padding: 0 0 80px; max-width: none; }
@media (max-width: 959px) {
  #screen-brain > #brain-mount { padding: 16px 16px 100px; }
}
#screen-admin-access .admin-access-list { padding: 0; }
@media (max-width: 720px) {
  #screen-admin-limits .lim-users { margin-top: 0; }
  #screen-admin-limits .lim-uhead + .lim-urow { border-top: 0; padding-top: 0; }
}
#screen-brain #brain-mount .brain-tab-btn { flex: none; }
#screen-brain > .form-header button.btn-icon.btn-back-ico { padding: 4px 8px; }

/* ── Страницы на десктопе: одна сетка (12.10.2026) ──────────────────────────
   Всё, кроме Главной и чата, — колонка --page-w по центру; заголовок шапки
   стоит над левым краем контента. Раньше заголовок был то у края экрана
   (Настройки), то посередине (Входящие, Команды), то со сдвигом (Проекты). */
:root { --page-w: 1040px; --page-pad: 24px; }
@media (min-width: 960px) {
  /* Место под полосу прокрутки держим всегда: иначе колонка по центру
     сдвигалась на ширину полосы, когда приходили данные и страница
     становилась длиннее экрана (прыгали вкладки «Управления»). */
  #desktop-layout .screen { scrollbar-gutter: stable; }
  #desktop-layout.is-wide .screen > .form-header {
    padding-left: max(var(--page-pad), calc((100% - var(--page-w)) / 2 + var(--page-pad)));
    padding-right: max(var(--page-pad), calc((100% - var(--page-w)) / 2 + var(--page-pad)));
    box-sizing: border-box;
    /* одна высота шапки на всех страницах: с кнопкой справа и без неё */
    min-height: 65px; align-items: center;
  }
  #desktop-layout.is-wide .screen > .form-body,
  #desktop-layout.is-wide .screen > .projects-grid,
  #desktop-layout.is-wide .screen > .tpl-gallery-body {
    width: 100%; max-width: var(--page-w); margin-left: auto; margin-right: auto;
    padding-left: var(--page-pad); padding-right: var(--page-pad); box-sizing: border-box;
  }
  /* Формы редактирования — уже, но шапка и форма на одном краю */
  #screen-project-edit, #screen-team-edit, #screen-mcp-edit { --page-w: 720px; }
}

/* ── Внутренние страницы: единый стиль (12.10.2026) ─────────────────────────
   Проекты, Рутины, Команды, Обучение, Входящие, Мой компьютер, Вехи, Шаблоны,
   MCP приведены к образцу Настроек: карточка — фон --s-card, рамка --s-line,
   радиус 16, тень --s-sh-xs; подпись группы — над карточкой 13px/650 серым,
   без капители; вводный абзац — серый текст без рамки (как в «Обучении»);
   «+ Создать» — одна таблетка справа в шапке. Всё под id экранов. */
:root { --ip-r: 16px; }

/* Кнопка создания в шапке: одна высота и один вид на всех страницах */
.screen > .form-header > .btn-add-cta {
  display: inline-flex; align-items: center; justify-content: center; flex: none;
  height: 36px; padding: 0 16px; margin: 0 0 0 auto; box-sizing: border-box;
  font: inherit; font-size: 14px; font-weight: 650; line-height: 1;
}
.screen > .form-header > .btn-icon.btn-ico + .btn-add-cta,
.screen > .form-header > .ws-mount + .btn-add-cta { margin-left: 0; }
.screen > .form-header > h2 { flex: 1 1 auto; min-width: 0; }

/* Вводный абзац страниц — серый текст без рамки */
:is(#screen-schedules, #screen-runners, #screen-workspaces) .runners-intro {
  background: transparent; border: 0; box-shadow: none; border-radius: 0;
  padding: 0 4px; margin: 0 0 16px; font-size: 13.5px; line-height: 1.5; color: var(--hint);
}
#screen-learn .learn-intro { padding: 0 4px; margin: 0 0 16px; font-size: 13.5px; }

/* Карточки списков */
#screen-runners .runner-card, #screen-workspaces .runner-card,
#screen-teams .team-card, #screen-learn .learn-card, #screen-mcp .mcp-card,
#screen-inbox .inbox-item {
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: var(--ip-r); box-shadow: var(--s-sh-xs);
}
:is(#screen-runners, #screen-workspaces) .runners-list { display: flex; flex-direction: column; gap: 12px; }
:is(#screen-runners, #screen-workspaces) .runner-card { margin: 0; padding: 14px 16px; }
:is(#screen-runners, #screen-workspaces) .rc-name { font-size: 15px; font-weight: 650; }
:is(#screen-runners, #screen-workspaces) .rc-actions { border-top: 1px solid var(--s-line); margin-top: 12px; padding-top: 10px; }
:is(#screen-runners, #screen-workspaces) .rc-actions .btn-link { color: var(--hint); font-weight: 550; text-decoration: none; }
:is(#screen-runners, #screen-workspaces) .rc-actions .btn-link:hover { color: var(--link); }
:is(#screen-runners, #screen-workspaces) .rc-actions .rc-act-danger:hover { color: var(--danger, #d75c5c); }

#screen-mcp .mcp-card { padding: 14px 16px; margin: 0 0 12px; }
#screen-mcp .mcp-card:hover, #screen-teams .team-card:hover {
  border-color: color-mix(in srgb, var(--link) 35%, var(--s-line));
}

/* Пустые списки — карточкой, текст по центру */
:is(#runners-list, #workspaces-list, #schedules-list, #mcp-list, #teams-list, #projects-list) > .empty-state {
  min-height: 0; padding: 28px 20px; text-align: center;
  background: var(--s-card); border: 1px dashed var(--s-line); border-radius: var(--ip-r);
}
:is(#runners-list, #workspaces-list, #schedules-list, #mcp-list, #teams-list, #projects-list) > .empty-state p {
  margin: 0 auto; max-width: 520px; font-size: 14px; line-height: 1.5; color: var(--hint);
}
:is(#runners-list, #workspaces-list, #schedules-list, #mcp-list, #teams-list, #projects-list) > .empty-state p:first-child:not(:only-child) {
  font-size: 15px; font-weight: 650; color: var(--text); margin-bottom: 4px;
}

/* Метки-таблетки (владелец, пройден, участник) — одного вида */
:is(#screen-teams, #screen-team-edit, #screen-learn) .team-role {
  display: inline-flex; align-items: center; flex: none; height: 22px; padding: 0 9px; box-sizing: border-box;
  border-radius: 999px; border: 0; font-size: 12px; font-weight: 600; line-height: 1; white-space: nowrap;
  background: var(--ov-06, rgba(127,127,127,.12)); color: var(--hint);
}
:is(#screen-teams, #screen-team-edit, #screen-learn) .team-role.owner { background: var(--accent-bg); color: var(--link); }

/* Команды: адрес для приглашений — светлая карточка, как остальные */
#screen-teams .form-body .id-card {
  background: var(--s-card); color: var(--text); border: 1px solid var(--s-line); border-radius: var(--ip-r);
  box-shadow: var(--s-sh-xs); padding: 16px; margin: 0 0 22px; gap: 16px;
}
#screen-teams .id-card-label {
  font-size: 13px; font-weight: 650; letter-spacing: 0; text-transform: none; color: var(--hint); margin-bottom: 4px;
}
#screen-teams .id-card-value { font-size: 22px; color: var(--text); }
#screen-teams .id-card-text { font-size: 13.5px; color: var(--hint); margin-top: 4px; }
#screen-teams .form-body .id-card-btn {
  height: 36px; padding: 0 16px; font-size: 14px; font-weight: 650; background: var(--accent-bg); color: var(--link);
}
#screen-teams .teams-list { gap: 12px; }
#screen-teams .team-card { padding: 14px 16px; }
#screen-teams .team-card-name { font-size: 15px; font-weight: 650; }
#screen-teams .team-card-sub { font-size: 13px; }

/* Обучение: карточки урока плотнее, пройденный урок — спокойная кнопка */
#screen-learn .learn-list, #screen-learn .learn-cards { gap: 12px; }
#screen-learn .learn-card { padding: 14px 16px; }
#screen-learn .learn-card-title { font-size: 15px; font-weight: 650; line-height: 1.35; }
#screen-learn .learn-card-sub { font-size: 13.5px; line-height: 1.5; color: var(--text-secondary, var(--hint)); opacity: 1; margin-top: 4px; }
#screen-learn .learn-card-bottom { margin-top: 10px; }
#screen-learn .learn-card-meta { font-size: 12.5px; }
#screen-learn .form-body .learn-card .btn-primary.learn-start {
  height: 34px; padding: 0 16px; font-size: 14px; font-weight: 650; border-radius: 999px; box-shadow: none;
}
#screen-learn .form-body .learn-card:has(.team-role.owner) .btn-primary.learn-start {
  background: var(--accent-bg); color: var(--link);
}

/* Входящие: подписи групп над карточками, строки — карточками */
#screen-inbox .inbox-section { margin: 0 0 22px; }
#screen-inbox .inbox-section > label, #screen-inbox .inbox-unread > summary .iu-title {
  font-size: 13px; font-weight: 650; color: var(--hint); text-transform: none; letter-spacing: 0;
}
#screen-inbox .inbox-section > label { padding: 0 4px; margin: 0 0 8px; }
#screen-inbox .inbox-unread > summary { padding: 0 4px; margin: 0 0 8px; }
#screen-inbox .inbox-item { padding: 12px 16px; margin: 0 0 8px; gap: 12px; }
#screen-inbox .inbox-item .ii-title { font-size: 15px; font-weight: 600; }
#screen-inbox .inbox-item .ii-sub { font-size: 13px; }
#screen-inbox .inbox-item.need-question { border-color: color-mix(in srgb, var(--link) 40%, var(--s-line)); }
#screen-inbox .inbox-item.need-colleague { border-color: color-mix(in srgb, var(--warning) 45%, var(--s-line)); }
#screen-inbox .form-body .inbox-item .btn-primary, #screen-inbox .form-body .inbox-item .btn-secondary {
  height: 34px; padding: 0 14px; font-size: 14px; border-radius: 999px; box-shadow: none;
}
#screen-inbox .inbox-empty {
  margin: 0; padding: 36px 20px; font-size: 14px; color: var(--hint);
  background: var(--s-card); border: 1px dashed var(--s-line); border-radius: var(--ip-r);
}
#screen-inbox .inbox-empty b { color: var(--text); font-size: 15px; font-weight: 650; }

/* Рутина: шапка карточкой, «Запуски» — подписью группы, прогоны одной карточкой */
#screen-schedule .sched-page-head {
  padding: 16px; background: var(--s-card); border: 1px solid var(--s-line); border-radius: var(--ip-r); box-shadow: var(--s-sh-xs);
}
#screen-schedule .sched-page-head .sched-task { font-size: 15px; line-height: 1.5; color: var(--text); }
#screen-schedule .sched-times, #screen-schedule .sched-cost { font-size: 13px; color: var(--hint); }
#screen-schedule .sched-runs-title {
  margin: 22px 0 0; padding: 0 4px 8px; font-size: 13px; font-weight: 650; color: var(--hint); text-transform: none; letter-spacing: 0;
}
#screen-schedule .sched-run-row {
  margin: 0; padding: 12px 16px; border-radius: 0; background: var(--s-card);
  border: 1px solid var(--s-line); border-top-width: 0; box-shadow: none;
}
#screen-schedule .sched-runs-title + .sched-run-row { border-top-width: 1px; border-top-left-radius: var(--ip-r); border-top-right-radius: var(--ip-r); }
#screen-schedule .sched-run-row:not(:has(+ .sched-run-row)) { border-bottom-left-radius: var(--ip-r); border-bottom-right-radius: var(--ip-r); box-shadow: var(--s-sh-xs); }
#screen-schedule .sched-run-row:hover { background: color-mix(in srgb, var(--text) 3%, var(--s-card)); border-color: var(--s-line); }
#screen-schedule .load-more { margin-top: 12px; }

/* Шаблоны: заголовок карточки как у остальных карточек */
#screen-templates .tpl-card-title { font-size: 15px; font-weight: 650; line-height: 1.3; }
#screen-templates .tpl-card-desc { font-size: 13px; }
#screen-templates .tpl-card { border-color: var(--s-line); box-shadow: var(--s-sh-xs); }
#screen-learn .learn-card-bottom { align-items: center; }
#screen-learn .learn-card-meta { line-height: 1.3; }

/* Обучение на телефоне: кнопка переносится под подпись без лишней дыры */
#screen-learn .learn-card-bottom { row-gap: 8px; }
#screen-learn .form-body .learn-card .btn-primary.learn-start { margin: 0; }

/* Страница команды: подписи групп над карточками, участники и проекты — одной
   карточкой со строками через линию (как группы Настроек) */
#screen-team-edit .team-section { margin: 0 0 22px; }
#screen-team-edit .team-section > label {
  padding: 0 4px; margin: 0 0 8px; font-size: 13px; font-weight: 650; color: var(--hint); text-transform: none; letter-spacing: 0;
}
#screen-team-edit .pe-share-list, #screen-team-edit #team-projects {
  display: flex; flex-direction: column; gap: 0; margin: 0; overflow: hidden;
  background: var(--s-card); border: 1px solid var(--s-line); border-radius: var(--ip-r); box-shadow: var(--s-sh-xs);
}
#screen-team-edit .pe-share-row {
  margin: 0; padding: 12px 16px; border: 0; border-radius: 0; background: transparent;
}
#screen-team-edit .pe-share-row + .pe-share-row { border-top: 1px solid var(--s-line); }
#screen-team-edit .form-body .team-project-row { padding: 12px 16px; border-bottom: 0; font-size: 15px; }
#screen-team-edit .form-body .team-project-row + .team-project-row { border-top: 1px solid var(--s-line); }
#screen-team-edit #team-projects > .hint { padding: 13px 16px; font-size: 14px; color: var(--hint); }
#screen-team-edit .team-invite-row { margin-top: 12px; }
#screen-team-edit .team-invite-input { border-color: var(--s-line); background: var(--s-card); font-size: 15px; border-radius: 12px; }
#screen-team-edit .team-invite-row .btn-secondary { height: auto; border-radius: 12px; padding: 0 16px; font-size: 14px; font-weight: 600; }
#screen-team-edit .pe-share-warn { padding: 0 4px; font-size: 13px; line-height: 1.45; color: var(--hint); }
#screen-team-edit .team-actions { border-top: 0; padding-top: 0; margin-top: 8px; }

/* Шапка без кнопок (Входящие, Обучение, Шаблоны) той же высоты, что с кнопкой */
:is(#screen-inbox, #screen-learn, #screen-templates, #screen-schedule, #screen-team-edit) > .form-header > h2 {
  min-height: 36px; display: flex; align-items: center;
}

/* Проект: карточки «Источник файлов» — радиус и рамка как у карточек страниц */
#screen-project-edit .pe-source-toggle .pe-source-opt {
  border-radius: 12px; border-color: var(--s-line); background: var(--s-card); font-size: 14px; font-weight: 550;
}
#screen-project-edit .pe-source-toggle .pe-source-opt:has(input:checked) {
  border-color: var(--link); background: var(--accent-bg);
}

/* ── Сверка независимой проверки (12.10.2026) ─────────────────────────────── */
/* Один радиус карточек на всех страницах, кроме ленты и чата (там 20px) */
.screen:not(#screen-dashboard):not(#screen-chat) { --r-card: 16px; --s-r-card: 16px; }
/* Вводные абзацы — с края контента, без лишних 4px */
#desktop-layout.is-wide .screen .runners-intro, #screen-learn .learn-intro, .lim-sub { margin-left: 0; margin-right: 0; padding-left: 0; padding-right: 0; }
/* «Управление»: обновление — повторным кликом по вкладке, отдельные ⟳ убраны */
#btn-admin-refresh, #btn-admin-limits-refresh { display: none !important; }
/* Рутины: скелетон по форме карточки рутины — содержимое не сдвигается */
#schedules-list .skx-item { min-height: 168px; align-items: flex-start; }
/* Телефон: шапка одной высоты на всех страницах */
@media (max-width: 959px) {
  .screen > .form-header { min-height: 65px; box-sizing: border-box; align-items: center; }
  .screen > .form-header > .btn-back-ico { flex: none; width: 40px; }
}
/* Одинаковый отступ под шапкой на всех страницах (16px до первого блока) */
@media (min-width: 960px) {
  #desktop-layout.is-wide .screen > .form-body,
  #desktop-layout.is-wide .screen > .projects-grid,
  #desktop-layout.is-wide .screen > .tpl-gallery-body { padding-top: 16px; }
  #desktop-layout.is-wide .screen > .form-body > :first-child,
  #desktop-layout.is-wide .screen > .form-body > .st-sec > :first-child,
  #desktop-layout.is-wide .screen > .tpl-gallery-body > :first-child { margin-top: 0; }
}
@media (min-width: 960px) {
  :is(#schedules-list, #teams-list, #projects-list, #runners-list, #workspaces-list, #inbox-list) > :first-child { margin-top: 0; }
}

/* ── «Аналитика → Запуски»: фильтры, страницы, без горизонтальной прокрутки ── */
.adm-runs-row { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
.adm-runs-q, .adm-runs-sel {
  height: 36px; box-sizing: border-box; border-radius: 10px; border: 1px solid var(--s-line, var(--border));
  background: var(--input-bg, var(--bg)); color: var(--text); font: inherit; font-size: 14px; padding: 0 10px;
}
.adm-runs-q { flex: 1 1 220px; min-width: 160px; }
.adm-runs-sel { flex: 0 1 auto; max-width: 200px; }
/* `.form-body select` (padding 10px) перебивал `padding: 0 10px` выше: при height 36px
   на строку оставалось 14px, и Windows резал текст снизу. */
.form-body .adm-runs-sel { padding-top: 0; padding-bottom: 0; }
.adm-chips { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 12px; }
.adm-chip {
  border: 1px solid var(--s-line, var(--border)); background: transparent; color: var(--hint); font: inherit; font-size: 13px; font-weight: 600;
  padding: 6px 12px; border-radius: 999px; cursor: pointer;
}
.adm-chip:hover { color: var(--text); }
.adm-chip.active { background: var(--accent-bg); color: var(--link); border-color: transparent; }
.adm-runs-body { transition: opacity .15s ease; }
.adm-runs-body.is-loading { opacity: .5; pointer-events: none; }
.adm-runs-table { width: 100%; table-layout: fixed; border-collapse: collapse; font-size: 14px; font-variant-numeric: tabular-nums; }
.adm-runs-table th {
  text-align: left; font-size: 12.5px; font-weight: 600; color: var(--hint); padding: 8px 10px; border-bottom: 1px solid var(--s-line, var(--border));
}
.adm-runs-table td { padding: 10px; border-bottom: 1px solid var(--s-line, var(--border)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.adm-runs-table tr:last-child td { border-bottom: 0; }
.adm-runs-table tbody tr:hover td { background: color-mix(in srgb, var(--text) 3%, transparent); }
.adm-runs-table .num { text-align: right; }
.adm-runs-table col.c-who { width: 18%; }
.adm-runs-table col.c-model { width: 92px; }
.adm-runs-table col.c-st { width: 116px; }
.adm-runs-table col.c-cost { width: 78px; }
.adm-runs-table col.c-when { width: 132px; }
.adm-st { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; }
.adm-st::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex: none; }
.adm-st-done { color: var(--success, #1e9e5a); }
.adm-st-failed { color: var(--danger, #e5484d); }
.adm-st-active { color: var(--link); }
.adm-st-stopped { color: var(--hint); }
.adm-runs-empty { padding: 18px 4px; color: var(--hint); font-size: 14px; }
.adm-runs-pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 12px; flex-wrap: wrap; }
.adm-pg-info { color: var(--hint); font-size: 13px; font-variant-numeric: tabular-nums; }
.adm-pg-btns { display: inline-flex; gap: 4px; align-items: center; }
.adm-pg {
  min-width: 34px; height: 34px; padding: 0 8px; border-radius: 10px; border: 1px solid var(--s-line, var(--border));
  background: transparent; color: var(--text); font: inherit; font-size: 14px; cursor: pointer; font-variant-numeric: tabular-nums;
}
.adm-pg:hover:not(:disabled) { background: color-mix(in srgb, var(--text) 5%, transparent); }
.adm-pg.active { background: var(--accent-bg); color: var(--link); border-color: transparent; font-weight: 650; }
.adm-pg:disabled { opacity: .4; cursor: default; }
.adm-pg-gap { color: var(--hint); padding: 0 2px; }
/* Телефон: строка таблицы — карточка в две строки, без прокрутки вбок */
@media (max-width: 640px) {
  .adm-runs-sel { flex: 1 1 calc(50% - 4px); max-width: none; }
  .adm-runs-table, .adm-runs-table tbody { display: block; }
  .adm-runs-table colgroup, .adm-runs-table thead { display: none; }
  .adm-runs-table tr {
    display: grid; grid-template-columns: 1fr auto; gap: 2px 10px; padding: 10px 0; border-bottom: 1px solid var(--s-line, var(--border));
  }
  .adm-runs-table tr:last-child { border-bottom: 0; }
  .adm-runs-table td { display: block; padding: 0; border: 0; }
  .adm-runs-table td.c-task { grid-column: 1 / -1; grid-row: 1; font-weight: 600; }
  .adm-runs-table td.c-who { grid-column: 1; grid-row: 2; font-size: 13px; }
  .adm-runs-table td.c-cost { grid-column: 2; grid-row: 2; }
  .adm-runs-table td.c-model { grid-column: 1; grid-row: 3; font-size: 13px; color: var(--hint); }
  .adm-runs-table td.c-st { grid-column: 2; grid-row: 3; text-align: right; }
  .adm-runs-table td.c-when { grid-column: 1 / -1; grid-row: 4; text-align: left; font-size: 12.5px; color: var(--hint); }
  .adm-runs-pager { justify-content: center; }
}

/* ── Последовательный показ страниц (12.10.2026) ────────────────────────────
   .pg-enter — на 0.9 с после перехода: блоки страницы поднимаются по очереди.
   .rv-in — данные пришли на место скелетона: блоки проявляются по очереди. */
@keyframes pg-rise { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.screen.pg-enter > .form-body > *,
.screen.pg-enter > .projects-grid > *,
.screen.pg-enter > .tpl-gallery-body > *,
.screen.pg-enter #schedules-list > *,
.screen.pg-enter #inbox-list > *,
.screen.pg-enter .st-sec.active > .st-sec-body > * {
  animation: pg-rise .32s cubic-bezier(.2, .7, .2, 1) both;
}
.screen.pg-enter > .form-body > :nth-child(2), .screen.pg-enter > .projects-grid > :nth-child(2), .screen.pg-enter #schedules-list > :nth-child(2), .screen.pg-enter .st-sec-body > :nth-child(2) { animation-delay: 45ms; }
.screen.pg-enter > .form-body > :nth-child(3), .screen.pg-enter > .projects-grid > :nth-child(3), .screen.pg-enter #schedules-list > :nth-child(3), .screen.pg-enter .st-sec-body > :nth-child(3) { animation-delay: 90ms; }
.screen.pg-enter > .form-body > :nth-child(4), .screen.pg-enter > .projects-grid > :nth-child(4), .screen.pg-enter #schedules-list > :nth-child(4), .screen.pg-enter .st-sec-body > :nth-child(4) { animation-delay: 135ms; }
.screen.pg-enter > .form-body > :nth-child(n+5), .screen.pg-enter > .projects-grid > :nth-child(n+5), .screen.pg-enter #schedules-list > :nth-child(n+5), .screen.pg-enter .st-sec-body > :nth-child(n+5) { animation-delay: 180ms; }
.rv-in { animation: pg-rise .32s cubic-bezier(.2, .7, .2, 1) both; animation-delay: calc(var(--rv-i, 0) * 45ms); }
/* Скелетон внутри проявляющейся страницы не поднимаем — у него своё проявление */
.screen.pg-enter .skx { animation: sk-in .3s ease .12s both; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .screen.pg-enter *, .rv-in { animation: none !important; }
}
.adm-note { margin: 0 0 14px; color: var(--hint); font-size: 14px; line-height: 1.45; }
/* ══════════════════════════════════════════════════════════════════
 * Графики: наведение и анимация (12.10.2026)
 * Столбики по дням (_barChartHtml) и строки разрезов (_bdRow) в «Расходах»,
 * «Управление → Расходы» и «Управление → Аналитика». Цвета — только токены
 * темы: светлая и тёмная получают свои значения без отдельных правил.
 * ══════════════════════════════════════════════════════════════════ */
.costs-section { position: relative; }

/* — Столбики по дням — */
.bc {
  --bc-h: 140px;
  /* Тёмная тема (она же по умолчанию): светлый --link виден на тёмной карточке */
  --bc-fill: color-mix(in srgb, var(--link) 50%, var(--s-card));
  --bc-on: var(--link);
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  column-gap: 8px;
  row-gap: 6px;
  font-variant-numeric: tabular-nums;
}
[data-theme="light"] .bc {
  --bc-fill: color-mix(in srgb, var(--button) 60%, var(--s-card));
  --bc-on: var(--button);
}
.bc-y { position: relative; height: var(--bc-h); min-width: 22px; }
/* Невидимая самая длинная подпись задаёт ширину колонки шкалы */
.bc-y-size { display: block; height: 0; overflow: hidden; visibility: hidden; font-size: 11px; font-weight: 400; white-space: nowrap; }
.bc-y span {
  position: absolute; right: 0; transform: translateY(50%);
  font-size: 11px; line-height: 1; color: var(--hint); white-space: nowrap;
}
.bc-plot { position: relative; height: var(--bc-h); }
.bc-grid i {
  position: absolute; left: 0; right: 0; height: 0;
  border-top: 1px dashed var(--s-line);
}
.bc-grid i.bc-base { bottom: 0; border-top: 1px solid var(--s-line-strong); }
.bc-bars { position: absolute; inset: 0; display: flex; align-items: stretch; }
.bc-col {
  position: relative; flex: 1 1 0; min-width: 0;
  display: flex; align-items: flex-end; justify-content: center;
  cursor: default; outline: none; -webkit-tap-highlight-color: transparent;
}
.bc-bar {
  display: block;
  width: min(72%, 18px); min-width: 3px;
  height: var(--h);
  background: var(--bc-fill);
  border-radius: 3px 3px 0 0;
  transition: opacity .14s ease, background-color .14s ease;
  animation: bc-grow 260ms cubic-bezier(.2, .8, .2, 1) both;
  animation-delay: calc(var(--i, 0) * 4.5ms);
}
.bc-col.is-today .bc-bar { background: var(--bc-on); }
/* День без расхода — короткая заглушка у базовой линии, а не пустота */
.bc-col.is-zero .bc-bar {
  height: 2px; border-radius: 1px; background: var(--s-line-strong); animation: none;
}
.bc-col.is-on .bc-bar { background: var(--bc-on); }
.bc.bc-hot .bc-col:not(.is-on) .bc-bar { opacity: .42; }
.bc-col:focus-visible::after {
  content: ''; position: absolute; inset: -2px 0; border-radius: 6px;
  box-shadow: 0 0 0 2px var(--button); pointer-events: none;
}
.bc-x {
  grid-column: 2;
  display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr));
  font-size: 11px; line-height: 1; color: var(--hint);
}
.bc-x span { text-align: center; white-space: nowrap; overflow: visible; }
.bc-x span.is-today { color: var(--bc-on); font-weight: 700; }
@keyframes bc-grow {
  from { clip-path: inset(100% 0 0 0); }
  to   { clip-path: inset(0 0 0 0); }
}
@media (max-width: 640px) {
  .bc { --bc-h: 128px; column-gap: 6px; }
}

/* — Подсказка: одна на карточку, ставится над столбиком или концом полосы — */
.bc-tip {
  position: absolute; left: 0; top: 0; z-index: 6;
  display: flex; flex-direction: column; gap: 2px;
  padding: 8px 11px; min-width: 96px; max-width: 260px;
  background: var(--s-card); color: var(--text);
  border: 1px solid var(--s-line-strong); border-radius: 10px;
  box-shadow: var(--s-sh-window);
  pointer-events: none; white-space: nowrap;
  opacity: 0; transform: translateY(4px);
  transition: opacity .12s ease, transform .12s ease;
  font-variant-numeric: tabular-nums;
}
.bc-tip.is-show { opacity: 1; transform: translateY(0); }
.bc-tip.is-moving { transition: opacity .12s ease, transform .12s ease, left .12s ease, top .12s ease; }
.bc-tip b { font-size: 15px; font-weight: 700; line-height: 1.25; color: var(--text); }
.bc-tip-d { font-size: 12px; line-height: 1.3; color: var(--hint); overflow: hidden; text-overflow: ellipsis; }
.bc-tip-s { font-size: 12px; line-height: 1.3; color: var(--text); opacity: .78; }

/* — Строки разрезов — */
.breakdown-row[data-tt] {
  margin: 0 -8px 2px; padding: 5px 8px; border-radius: 10px;
  transition: background-color .14s ease;
}
.breakdown-row[data-tt]:last-child { margin-bottom: 0; }
.breakdown-row[data-tt].is-on { background: var(--ov-06); }
.breakdown-row[data-tt] .breakdown-bar-fill {
  transition: opacity .14s ease;
  animation: bd-grow 460ms cubic-bezier(.2, .8, .2, 1) both;
  animation-delay: min(calc(var(--i, 0) * 45ms), 270ms);
}
.bc-hot .breakdown-row[data-tt]:not(.is-on) .breakdown-bar-fill { opacity: .45; }
@keyframes bd-grow {
  from { clip-path: inset(0 100% 0 0); }
  to   { clip-path: inset(0 0 0 0); }
}

@media (prefers-reduced-motion: reduce) {
  .bc-bar, .breakdown-row[data-tt] .breakdown-bar-fill { animation: none; }
  .bc-tip, .bc-tip.is-moving { transition: opacity .12s ease; transform: none; }
}
/* Телефон: тот же отступ под шапкой (16px), что на десктопе */
@media (max-width: 959px) {
  .screen > .form-body, .screen > .projects-grid, .screen > .tpl-gallery-body { padding-top: 16px; }
  .screen > .form-body > :first-child, .screen > .form-body > .st-layout > :first-child,
  .screen > .tpl-gallery-body > :first-child { margin-top: 0; }
  .screen > .adm-tabs { margin-top: 16px; }
  .screen > .adm-tabs + .form-body, .screen > .adm-tabs + #brain-mount { padding-top: 12px; }
}
@media (max-width: 959px) {
  #screen-settings > .form-body, #screen-profile > .pf-body, #screen-limits > .form-body { padding-top: 16px; }
}
#screen-profile .pf-id { margin-top: 0; }

/* ── Движение ленты: «Все / Мои» и «В работе ↔ Архив» (демо) ──
 * Призраки ушедших строк живут в слое-обрезке размером с видимую часть
 * списка: так они не рисуются поверх шапки, вкладок и нижней навигации. */
.list-ghosts { position: fixed; overflow: hidden; pointer-events: none; z-index: 4; }
.list-ghosts > * { position: absolute; margin: 0; box-sizing: border-box; }
/* Пока строки едут, наведение не перескакивает с одной на другую. */
.list-flipping .dl-item, .list-flipping .agent-card, .list-flipping .history-item { pointer-events: none; }
/* Ответ на «Все / Мои» задержался — лента приглушается, но не на быстром ответе. */
.dl-list, #agents-list, #history-list { transition: opacity .18s ease; }
/* Активная пилюля переключателя переезжает (см. _slidePill). Неактивный чип
 * «Все / Мои» прозрачный, как вкладка «Архив»: подложку даёт сама дорожка,
 * а белая плашка под ним закрывала бы едущую пилюлю. */
.dl-tabs, #tab-bar .tab-seg, .owner-filter { position: relative; isolation: isolate; }
.seg-pill { position: absolute; z-index: -1; pointer-events: none; }
.seg-moving > .active { background: transparent !important; box-shadow: none !important; border-color: transparent !important; }
.seg-moving > * { transition-property: color !important; }
.owner-filter .owner-chip:not(.active) { background: transparent; border-color: transparent; box-shadow: none; }
.owner-filter .owner-chip:not(.active):hover { background: color-mix(in srgb, var(--text) 5%, transparent); border-color: transparent; }
.owner-chip-count { display: inline-block; }


/* «Ранее в этой сессии» без файлов текущего хода — единственная строка блока:
   отступы блока 14/8 опускали подпись на 3px ниже центра рамки. */
.agent-attachments-summary:has(> .aas-history:first-child) { padding-top: 8px; padding-bottom: 8px; }

/* ── Выпадающие списки (12.10.2026): закрытое поле в стиле 1do ──
   Список открывает openMenuSelect (app.js, wireNativeSelects), здесь только
   поле: свой шеврон вместо системной стрелки и высота строки, при которой
   текст не режется снизу (Windows Chrome резал «Все люди» при height 36px). */
select:not([multiple]):not([size]):not(.voice-lang-select) {
  -webkit-appearance: none; appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238792a8' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right 10px center !important;
  background-size: 16px 16px !important;
  padding-right: 34px !important;
  line-height: 1.3;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  cursor: pointer;
  transition: border-color .15s, box-shadow .15s;
}
select:not([multiple]):not([size]):not(.voice-lang-select):not(:disabled):not(:focus):hover { border-color: var(--s-line-strong); }
select:not([multiple]):not([size]):not(.voice-lang-select)[aria-expanded="true"] {
  border-color: var(--s-brand-line); box-shadow: 0 0 0 3px var(--s-brand-soft);
}
select:disabled { cursor: default; }

/* ── Фильтры ленты одной кнопкой (12.10.2026) ──────────────────────────
 * «Все / Мои», проект и статус Архива — в окне «Фильтры»: на телефоне лист
 * снизу, на десктопе поповер под кнопкой. Кнопка стоит в строке вкладок
 * (телефон) и в шапке списка (десктоп). Слой ниже меню проекта (1400),
 * которое открывается поверх окна. */
.feed-filter-btn {
  flex: none; display: inline-flex; align-items: center; gap: 6px; height: 36px; padding: 0 12px 0 11px;
  border: 1px solid var(--s-line); border-radius: 999px; background: var(--s-card); box-shadow: var(--s-sh-xs);
  color: var(--text); font: inherit; font-size: 14px; font-weight: 600; cursor: pointer; white-space: nowrap;
  -webkit-tap-highlight-color: transparent; transition: background .15s, border-color .15s, color .15s;
}
.feed-filter-btn svg { color: var(--hint); flex: none; }
.feed-filter-btn:hover { border-color: var(--s-line-strong); }
.feed-filter-btn[aria-expanded="true"] { border-color: var(--s-brand-line); box-shadow: 0 0 0 3px var(--s-brand-soft); }
.feed-filter-btn.is-set { color: var(--s-brand-ink); background: var(--s-brand-soft); border-color: var(--s-brand-line); }
.feed-filter-btn.is-set svg { color: currentColor; }
.feed-filter-btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.ffb-count {
  min-width: 18px; height: 18px; padding: 0 5px; box-sizing: border-box; border-radius: 999px;
  display: inline-grid; place-items: center; font-size: 11.5px; font-weight: 700; line-height: 1;
  background: var(--link); color: #fff; font-variant-numeric: tabular-nums;
}
.ffb-count[hidden] { display: none; }
#tab-bar .feed-filter-btn { margin-left: auto; }
/* Самые узкие телефоны: только значок и число — вкладки «В работе N | Архив»
 * важнее подписи. */
@media (max-width: 359px) {
  #tab-bar .feed-filter-btn { width: auto; padding: 0 10px; }
  #tab-bar .feed-filter-btn .ffb-label { display: none; }
}
@media (min-width: 960px) {
  .dl-head .feed-filter-btn { height: 32px; padding: 0 10px 0 9px; font-size: 13px; border-color: transparent; background: transparent; box-shadow: none; }
  .dl-head .feed-filter-btn:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
  .dl-head .feed-filter-btn[aria-expanded="true"] { background: var(--s-brand-soft); color: var(--s-brand-ink); box-shadow: none; }
  .dl-head .feed-filter-btn.is-set { border-color: var(--s-brand-line); background: var(--s-brand-soft); }
}

.ff-scrim { position: fixed; inset: 0; z-index: 1290; background: rgba(8, 12, 20, .36); animation: msScrim .15s ease; }
.ff-scrim[hidden], .ff-pop[hidden] { display: none; }
.ff-pop {
  position: fixed; z-index: 1300; width: 300px; box-sizing: border-box;
  display: flex; flex-direction: column; gap: 14px; padding: 14px 14px 16px;
  background: var(--s-card); color: var(--text);
  border: 1px solid var(--s-line); border-radius: 18px; box-shadow: var(--s-sh-window);
  animation: agentMenuIn .12s ease;
}
.ff-pop.ff-sheet {
  left: 0; right: 0; bottom: 0; width: 100%; max-height: calc(var(--vh) * 100 - 48px); overflow-y: auto;
  border-radius: 22px 22px 0 0; padding: 16px 16px calc(16px + env(safe-area-inset-bottom, 0px));
  animation: msSheetUp .2s cubic-bezier(.2,.8,.2,1);
}
.ff-head { display: flex; align-items: center; gap: 8px; }
.ff-title { flex: 1; font-size: 17px; font-weight: 700; }
.ff-pop:not(.ff-sheet) .ff-title { font-size: 15px; }
.ff-reset {
  border: 0; background: transparent; padding: 6px 8px; margin: -6px -8px -6px 0; border-radius: 8px;
  color: var(--link); font: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
}
.ff-reset:disabled { color: var(--hint); opacity: .55; cursor: default; }
.ff-reset:not(:disabled):hover { background: var(--s-brand-soft); }
.ff-sec { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.ff-sec[hidden] { display: none; }
.ff-label { font-size: 12.5px; font-weight: 600; color: var(--hint); }
/* Переключатель «Все / Мои» во всю ширину окна */
.ff-pop .owner-filter { display: flex; width: auto; margin: 0; padding: 3px; gap: 2px; box-sizing: border-box; }
.ff-pop .owner-filter[style*="none"] { display: none; }
.ff-pop .owner-chip { flex: 1 1 0; justify-content: center; height: 34px; padding: 0 10px; font-size: 14px; }
/* Проект — та же кнопка-список, во всю ширину; меню открывается под ней */
.ff-pop .projects-bar { padding: 0; overflow: visible; display: flex; }
.ff-pop .proj-select { width: 100%; max-width: none; min-width: 0; height: 40px; padding: 0 12px; font-size: 14px; }
.ff-pop .proj-select .ps-label { flex: 1; text-align: left; }
.ff-pills { display: flex; flex-wrap: wrap; gap: 8px; }
.ff-pill {
  height: 34px; padding: 0 14px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--s-line); background: var(--s-card); color: var(--text);
  font: inherit; font-size: 14px; font-weight: 550; -webkit-tap-highlight-color: transparent;
}
.ff-pill:hover { border-color: var(--s-line-strong); }
.ff-pill.active { color: var(--s-brand-ink); background: var(--s-brand-soft); border-color: var(--s-brand-line); font-weight: 650; }
.ff-done {
  height: 44px; margin-top: 2px; border: 0; border-radius: 12px; cursor: pointer;
  background: var(--button, #2563eb); color: var(--button-text, #fff); font: inherit; font-size: 15px; font-weight: 650;
}
.ff-pop:not(.ff-sheet) .ff-done { display: none; }
@media (prefers-reduced-motion: reduce) { .ff-pop, .ff-pop.ff-sheet, .ff-scrim { animation: none; } }

/* Кнопка шаблонов в углу пустого поля композера на главной */
.btn-home-tpl {
  position: absolute; top: 2px; right: 0; z-index: 1;
  display: inline-flex; align-items: center; gap: 5px; height: 28px; padding: 0 10px 0 8px;
  border: 1px solid var(--s-line); border-radius: 999px; background: var(--s-card);
  color: var(--hint); font: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
  -webkit-tap-highlight-color: transparent; transition: color .15s, border-color .15s;
}
.btn-home-tpl svg { width: 15px; height: 15px; flex: none; }
.btn-home-tpl:hover { color: var(--text); border-color: var(--s-line-strong); }
.composer-text.has-tpl-btn textarea { padding-right: 112px; }
/* Узкий телефон: подпись съела бы половину поля — остаётся значок. */
@media (max-width: 359px) {
  .btn-home-tpl { width: 30px; padding: 0; justify-content: center; }
  .btn-home-tpl span { display: none; }
  .composer-text.has-tpl-btn textarea { padding-right: 38px; }
}

/* ── Карточка генерации картинки (docs/IMAGE_GEN_PLAN.md §3.3) ───────────
   Строка ленты `.msg-image_gen` > `.imggen` > `.imggen-card`; анимация —
   modules/image_gen.js. */
.msg-image_gen { padding: 0; background: none; }
.imggen-fallback { color: var(--hint); font-size: 13px; }
.imggen-card {
  background: var(--secondary-bg); border: 1px solid var(--ov-06, rgba(127,127,127,.12));
  border-radius: 16px; padding: 12px; max-width: 520px;
}
.imggen-head { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--hint); margin-bottom: 6px; }
.imggen-head b { color: var(--text); font-weight: 600; }
.imggen-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--violet); flex: none; }
.imggen-card.running .imggen-dot { animation: imggen-blink 1.2s ease-in-out infinite; }
@keyframes imggen-blink { 50% { opacity: .25; } }
.imggen-prompt {
  font-size: 14px; color: var(--text); margin: 0 0 10px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.imggen-frame { position: relative; width: 100%; border-radius: 12px; overflow: hidden; background: var(--ov-06, rgba(127,127,127,.08)); }
.imggen-frame canvas, .imggen-frame img { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
.imggen-frame canvas { transition: opacity .4s ease; }
.imggen-frame img { object-fit: cover; opacity: 0; transition: opacity .6s ease; cursor: zoom-in; }
.imggen-frame img.shown { opacity: 1; }
.imggen-foot {
  display: flex; justify-content: space-between; gap: 10px; margin-top: 8px;
  font-size: 12.5px; color: var(--hint); font-variant-numeric: tabular-nums;
}
.imggen-t { color: var(--text); font-weight: 600; }
.imggen-card.failed .imggen-state { color: var(--danger, #d2463e); }
@media (prefers-reduced-motion: reduce) {
  .imggen-card.running .imggen-dot { animation: none; }
  .imggen-frame img, .imggen-frame canvas { transition: none; }
}
