/* Chimera design system 0.96.0 — built from chimera/*.css by scripts/build.py; do not edit.
   Written in rem: html[data-size="m" | "l"] grows the whole interface (size.css). */

/* ═══ tokens.css ═══ */
/* Химера — токены. Единственный источник значений: компоненты берут цвета, шрифты и размеры только отсюда.

   Палитры работают на двух уровнях:
   — вся страница: data-theme="light|dark" на <html> (или системная тема);
   — отдельный блок: тот же data-theme="light|dark" на любом элементе.
     Внутри такого блока все цвета берутся из его палитры — так собираются смешанные экраны. */

:root {
  /* Шрифты: голос Химеры — антиква, всё остальное — гротеск. Данные (даты, метки, пути, оси графиков) — тем же Onest,
     мельче и тише по цвету; моноширинный не сочетался с Onest */
  /* --font-literata и --font-onest ставит продукт, когда подключает файлы шрифтов сам (next/font); без них — семейства с Google Fonts */
  --font-voice: var(--font-literata, "Literata"), Georgia, "Times New Roman", serif;
  --font-ui: var(--font-onest, "Onest"), "Helvetica Neue", Arial, sans-serif;
  --font-data: var(--font-ui);

  /* Отступы */
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-6: 1.5rem;
  --space-8: 2rem;
  --space-12: 3rem;
  --space-18: 4.5rem;

  /* Скругления: минимальные, круг только у точек-сигналов */
  --radius-sm: 2px;         /* кольцо фокуса, мелкие метки */
  --radius: 4px;            /* кнопки, поле ввода, кнопка отправки */
  --radius-full: 999px;     /* только точки */

  /* Шкала шрифтов: один размер голоса на всех экранах */
  --text-greeting: 1.375rem;    --leading-greeting: 1.9375rem;  /* приветствие на первом экране */
  --text-voice: 1rem;       --leading-voice: 1.625rem;     /* голос Химеры: чат и проза документа */
  --text-voice-sm: 0.875rem;    --leading-voice-sm: 1.375rem;  /* голос в карточке находки: мельче её заголовка */
  --text-title: 1.5rem;       --leading-title: 2rem;     /* заголовок документа */
  --text-heading: 1.125rem;     --leading-heading: 1.75rem;   /* заголовок раздела документа: крупнее прозы под ним */
  --text-body: 0.9375rem;        --leading-body: 1.5rem;      /* реплики человека, поле ввода */
  --text-ui: 0.875rem;          --leading-ui: 1.3125rem;        /* кнопки, списки, доказательства */
  --text-label: 0.8125rem;       --leading-label: 1.125rem;     /* подписи разделов */
  --text-meta: 0.8125rem;        --leading-meta: 1.125rem;      /* метаданные: даты, источники, подписи осей. 13 — пол всего текста (владелец, 2026-11-04);
                                                          ступенью label по размеру, но обычным весом и шрифтом данных */

  /* Размеры */
  --rail: 4.5rem;
  --rail-item: 2.75rem;        /* зона нажатия пункта рейки */
  --rail-icon: 1.5rem;        /* иконки рейки */
  --rail-logo: 1.5rem;        /* знак Chimera: того же размера, что иконки, в той же колонке */
  --rail-logo-gap: 2rem;    /* защитный отступ знака от меню */
  --rail-open: 13.5rem;       /* рейка с подписями */
  --rail-fade: 4.5rem;        /* за открытой рейкой, открытой близостью, грунт растворяется в цвет страницы */
  --chat: clamp(22.5rem, 32vw, 40rem);  /* треть экрана, как на макете; строка голоса не длиннее ~80 знаков */
  --measure: 40rem;         /* колонка разговора на всю ширину */
  --digest: 50rem;          /* колонка дайджеста: шире разговора, чтобы на больших экранах не было узкой полосы */
  --doc: 65rem;            /* предельная ширина документа справа */
  --control: 2.125rem;
  --composer: 3.25rem;
  --topbar: 3.25rem;           /* полоса узкого окна: кнопка меню и знак */
  --send: 2rem;

  --page: 95rem;           /* предельная ширина рабочей страницы, по центру экрана */
  /* Ширины рабочей страницы — доли контейнера, у каждой есть нижний и верхний предел */
  --page-pad: clamp(1.5rem, 3.33%, 4rem);   /* поля страницы: 48px при окне 1440 */
  --cols-gap: clamp(2rem, 5%, 6rem);      /* между лентой и сводкой: 72px при полной ширине страницы */
  --card-pad: clamp(0.75rem, 2.4%, 1.25rem);    /* поля карточки с заливкой — доля ширины ленты */
  /* Скриншот заметной находки: высотой ровно в заголовок из двух строк и строку источника
     (2 × 21 + 8 + 21 = 71px), ширина — по пропорции 3 : 2. Считается от шрифта, а не от колонки: карточка рассчитана на перенос */
  --thumb-sm: calc((var(--leading-ui) * 3 + var(--space-2)) * 3 / 2);
  --thumb-lg: calc(var(--thumb-sm) * 1.28); /* скриншот важной находки там же: на 28% крупнее заметной, не больше */
  --modal: min(92vw, 70rem);             /* ширина модалки — доля окна с пределом */
  --modal-pad: clamp(1.25rem, 2.5%, 2rem);   /* поля модалки — доля её ширины */
  --bars-label: clamp(7.5rem, 30%, 11rem); /* подписи горизонтального графика — доля ширины графика; «Papaya Global» с фавиконом не режется */
  --sections: clamp(11rem, 16%, 14.5rem);   /* список разделов документа (ch-sections в fp--sections) — доля колонки с пределами */
  /* Сигнальная точка (ch-dot: агент работает, источник читается, новое с прошлого раза; владелец, 2026-11-10: в 5 её почти не было
     видно, особенно на дне пульса) — 8, крупнее строчной буквы меты, мельче иконки */
  --dot: 0.5rem;
  --icon-sm: 0.875rem;          /* мелкие иконки в строке: стрелки ссылок, шевроны, галочки */
  --chart-gap: 0.125rem;         /* щель цвета фона между сегментами графика */
  --bar: 0.75rem;              /* толщина столбца и полосы — одна на всех графиках, вертикальных и горизонтальных; остаток ячейки — воздух */
  --ev-shot: 4.5rem;          /* снимок или рисунок у строки опоры в документе убеждения (ch-ev--shots), 3 : 2 — 48 высотой */

  --hairline: 1px;
  --ease: cubic-bezier(.2, .7, .2, 1);
  --dur-size: 320ms;        /* смена размера интерфейса: страница растёт одной картинкой */
  --dur-size-out: 64ms;     /* за это время уходит прежняя картинка: новая с первого кадра одна, двух копий текста нет */
}

/* Светлая тема «Griffin»: тот же тёплый тон, что у тёмной, светлый и сдвинутый к 40° —
   на 30° такой светлый серый читался розовым. Текст взят из тёмной темы,
   поэтому обе темы читаются как одна система. Текст держит ≥ 4.7:1 на всех поверхностях.
   Серый один (владелец, 2026-11-04: «море серого текста»): ink-muted. ink-faint больше не ступень — имя оставлено псевдонимом
   со значением ink-muted в каждой теме и на каждом грунте, чтобы ничего не сломалось; ни одна таблица стилей его не берёт. */
:root, [data-theme="light"] {
  --canvas: #EFEDE9;        /* фон разговора, рейки, первого контакта */
  --paper: #F8F7F5;         /* фон документа справа */
  --field: #FBFAF9;         /* внутренность поля ввода */
  --wash: #E6E3DD;          /* наведение на кнопку или строку */
  --line: #E2DED7;          /* волосяные разделители, граница панелей */
  --line-control: #D0CABE;  /* обводка кнопок и поля ввода */
  --ink: #2A2623;           /* основной текст, заголовки */
  --ink-muted: #635D52;     /* единственный серый: подписи разделов, тихая кнопка, метаданные — даты, крошки, статусы */
  --ink-faint: #635D52;     /* псевдоним ink-muted (владелец, 2026-11-04: один серый) — своей ступени нет, в стилях не используется */
  --ink-gone: #6E685C;      /* то, чего уже нет: строка удалённого и ушедшего, заменённое убеждение. Своё значение: в светлой — ступень
                               под ink-muted, где стоял прежний ink-faint (5.2 : 1 на бумаге, 4.7 на холсте); в тёмной ink-muted почти чернила,
                               и ушедшему нужна ступень дальше: #A9A298 — 5.5 : 1 на бумаге и 4.9 на холсте. Не на wash и не на feed-plate-hover (4.52 : 1) */
  --accent: #2F4F8F;        /* ink blue — действие и выбор человека: отправка и основная кнопка, ссылки, включённое, текущий раздел, фокус.
                               Холодный противовес тёплым серым; ≥ 6.2:1 на всех поверхностях */
  --on-accent: #F8F7F5;     /* текст на заливке акцентом */
  --live: #2F6E58;          /* агент жив и работает: точки, события */
  --alert: #A3402C;         /* сбой: агент не смог прочитать источник */
  --belief-confirmed: #4F7A23;  /* статус убеждения ● факт: свой оливковый зелёный, не --live — тот значит «агент работает»; оттенок 132° против 168°
                                   у --live (OKLCH L .529, C .126). Знак 12px, не текст: 4.7 : 1 на бумаге (владелец, 3 ноября 2026) */
  --belief-supported: #5D733F;  /* статус ◐ подкреплено: ступень между фактом и гипотезой — 60% --belief-confirmed и 40% прежнего серого #6E685C
                                   в OKLab, 4.9 : 1. Гипотеза ○ — --ink-muted: про неё ещё мало что известно */
  --chart-notable: #4A443D; /* графики: заметные находки — тёмная ступень */
  --chart-routine: #B4AB9E; /* графики: рутина — светлая ступень того же тона, 2.1:1 к paper */
  /* График находок по уровню — три ступени одного тона (RULES → Colour, Charts): важные и критичные — тёмная ступень,
     заметные — средняя, рутина — светлая, по 2.06 : 1 между соседями. Важность цвета не получает: это ступень тона графика */
  --chart-major: #4A443D;   /* важные и критичные: тёмная ступень, значение chart-notable */
  --chart-mid: #7B736A;     /* заметные под ними: средняя ступень, 2.06 : 1 к тёмной и к светлой */
  --mark-plate: transparent; /* плашка под фавиконом сайта: на светлом не нужна */
  /* Поднятый слой (ch-raised; владелец, 2026-11-07, сужен 2026-11-08) — «объект, вставленный в поток»: убеждение в разговоре,
     фигура в ответе, карточка на доске. Заливка говорит о слое, а не о важности. Что стоит на своём постоянном месте страницы —
     фигуры в колонке, рейке, разделе — лежит на бумаге без подложки (владелец, 2026-11-08: светлая панель графиков рядом
     с плашками ленты читалась другим материалом — «что тут главное и почему такая очевидная разница»).
     Значение — от грунта. На бумаге — тон плашки ленты (= feed-plate, ступень под бумагой, 1.05 : 1): вставка на бумажной
     странице и находки — один материал; ink-muted 5.79, ink-gone 4.91, ссылка 7.07. Сейчас ни один экран не ставит вставку
     на бумагу: разговор, плашка агента и дорожка доски — холст. На холсте — полшага от холста к бумаге (1.06 : 1;
     владелец, 2026-11-08: значение бумаги, 1.09, читалось слишком белым; ниже поля ввода 1.12, чтобы вставка не спорила с полем ответа); холст объявляет его вместе со своими волоском, наведением,
     заготовкой и пульсом (ch-app--canvas, bl-group в components.css; плашка агента — своя поверхность --plate) */
  --raised: #F3F1EE;
  --raised-canvas: #F5F4F1;
  --raised-line: #E2DED7;          /* волосок внутри поднятого: в светлой — тот же line (1.19 на поднятом бумаги) */
  --raised-canvas-line: #E2DED7;   /* то же на холсте: 1.22 к листу */
  --raised-gone: #6E685C;          /* ушедшее внутри поднятого: в светлой — тот же ink-gone (4.91 на поднятом бумаги; под наведением 4.52 — ушедшему туда нельзя, как на плашке) */
  --raised-hover: #EBE8E3;         /* наведение на строку внутри поднятого на бумаге: = feed-plate-hover, 1.08 к нему, ink-muted 5.34 */
  --raised-canvas-hover: #EEECE8;  /* то же на холсте: 1.07 к листу, ink-muted 5.53 */
  --raised-wash: #E2DED7;          /* наведение кнопки внутри поднятого на бумаге: 1.19 к нему, как wash к бумаге (1.20) */
  --raised-canvas-wash: #E6E3DD;   /* то же на холсте, и заготовка там: тот же wash, 1.16 к листу */
  --raised-skeleton: #C4BCAF;      /* заготовка внутри поднятого на бумаге — skeleton-plate, как на плашке ленты того же тона: 1.67 : 1 и мелкий пульс (ch-pulse-plate) */
  /* Тег важности (ch-severity; владелец, 2026-11-07): залит тёмной ступенью графиков (chart-major) — той же, что Major и critical на графиках находок по уровню.
     Слова и значок — бумагой, 8.98 : 1; в тёмной — светлая ступень с чернилами светлой темы, 11.01 : 1 */
  --severity: #4A443D;
  --on-severity: #F8F7F5;
  --scrim: rgba(42, 38, 35, .36); /* затемнение страницы под модалкой — чернила на треть */
  --hover-row: #F3F1EE;     /* подложка находки при наведении: между бумагой и плиткой, чтобы плитка не пропадала */
  /* Плашка ленты находок (ch-list--feed; владелец, 3 ноября 2026, CHI-1584): под серией рутины дня и под каждой заметной находкой.
     Ступень под бумагой (1.05 : 1). С 2026-11-07 на своей плашке лежит и важная находка: её выделяют размер и залитый тег, а не белая карточка.
     Значение то же, что у hover-row, но смысл свой: плашка лежит всегда, подложка наведения — только под указателем.
     Метаданные (ink-muted) на ней — 5.79 : 1, плитка скриншота (field и волосок line) светлее неё — 1.08 и 1.19 */
  --feed-plate: #F3F1EE;
  /* Наведение и выбор на плашке: ступень глубже (1.08 к плашке), по её краям. Метаданные (ink-muted) здесь — 5.34 : 1; ссылка — 6.52;
     ink-gone — 4.52 : 1, ниже 4.7 темы, поэтому ушедшему сюда нельзя */
  --feed-plate-hover: #EBE8E3;
  /* Плашка, где говорит агент (ch-plate; владелец, 2026-11-10): на бумаге — белая, ступень над ней (1.07 : 1), чтобы слово
     Chimera не читалось ещё одной находкой рядом с плашками ленты (тон холста был в полушаге от них). Волосок — вполовину тише
     line (1.13 : 1 к плашке): край, а не рамка */
  --plate: #FFFFFF;
  --plate-line: #F1EFEB;
  /* Полоса заготовки на плашках ленты (ch-skeleton в ch-list--feed): wash на плашке почти не виден (1.14 : 1, под указателем 1.05).
     1.67 : 1 к плашке, 1.54 к наведению — у важной, на той же плашке, так же; на дне пульса (.65) — 1.38 и 1.31 */
  --skeleton-plate: #C4BCAF;
  --accent-tint: #DCDFE7;   /* оттенок акцента: дни между концами выбранного периода в календаре, 14% акцента на бумаге */
  --inset-lift: 0 0.125rem 0.375rem rgb(20 20 19 / .05), 0 0.5rem 1.5rem -0.75rem rgb(20 20 19 / .14); /* врезка на сайте: окно продукта или чужого приложения, поставленное в страницу картинкой, — тонкая тень у края и мягкая под окном (владелец, 2 ноября 2026) */
  /* Панель, которая плавает над страницей (меню, фильтр, список вариантов, свой период, подсказка), отрывается от неё одной мягкой тенью
     (владелец, 3 ноября 2026): у края — волосок плотнее, под панелью — размытая, без сдвига вбок. Больше теней в продукте нет */
  --float-lift: 0 1px 0.1875rem rgb(20 20 19 / .08), 0 0.5rem 1.5rem -0.25rem rgb(20 20 19 / .16);
  /* Рисунок находки без скриншота (thumbs.js в .ch-thumb): объём — свой у рисунка, интерфейс остаётся плоским.
     Тёплая лестница из четырёх ступеней — 1 самая светлая плоскость, 4 самая глубокая грань и тонкая линия;
     и один отмеченный предмет — то, о чём находка: верх, левая и правая грани; тёмный здесь, белый в тёмной теме */
  --drawing-1: #F2EFEA;
  --drawing-2: #E3DED6;
  --drawing-3: #CBC3B6;
  --drawing-4: #9C9385;
  --drawing-mark-1: #5A534C;
  --drawing-mark-2: #3D3833;
  --drawing-mark-3: #2A2623;
  /* Рисунок без плиты, на холсте (.ch-thumb.is-shelf): лестница на ступень темнее — самая светлая плоскость рисунка
     светлее самого холста, и без плиты верхние грани пропадали бы; отмеченный предмет тот же */
  --drawing-canvas-1: #E3DED6;
  --drawing-canvas-2: #CBC3B6;
  --drawing-canvas-3: #9C9385;
  --drawing-canvas-4: #5A534C;
  /* Отмеченные грани в акценте (.ch-thumb.is-accent) — для сайта, где акцент — единственный цвет страницы кроме чернил.
     Считано, не подобрано: OKLCH на оттенке и хроме --accent (262.7°, C .112, хрома в границах гаммы) при светлоте
     лестницы отметки, L .447 / .344 / .272, — так рисунок держит глубину. Лестница и линия остаются тёплыми */
  --drawing-mark-accent-1: #325292;
  --drawing-mark-accent-2: #173572;
  --drawing-mark-accent-3: #05215C;
  color-scheme: light;
}

/* Тёмная тема: тёплый тёмный #38332E (оттенок 30°, светлота 20%).
   Документ и поле ввода на ступень глубже, наведение и линии светлее. Текст держит ≥ 6.4:1 на всех поверхностях; ушедшее (ink-gone) — 4.9–5.5 : 1,
   как ушедшее светлой. ink-faint — псевдоним ink-muted и здесь. */
@media (prefers-color-scheme: dark) {
  /* грунт на самом <html> остаётся грунтом: этот блок сильнее его блоков (0,2,0 против 0,1,0) и перекрасил бы его в тёплое */
  :root:not([data-theme="light"], [data-ground="band"], [data-ground="poster"], [data-ground="statement"]) {
    --canvas: #38332E; --paper: #302B27; --field: #2A2623; --wash: #46403A;
    --line: #4C453E; --line-control: #6D635A;
    --ink: #F7F4EF; --ink-muted: #E2DCD3; --ink-faint: #E2DCD3; --ink-gone: #A9A298;
    --accent: #A9BEF0; --on-accent: #2A2623; --live: #B8E3C9; --alert: #F8C0AE;
    /* статусы убеждений (CHI-1730): факт — оливковый на ступень темнее тёмного --live и на 43° желтее (L .84 C .12 H 115 против
       L .878 H 158; прежний стоял той же светлоты в 33° от него и читался зелёным агента, ΔE OKLab .053 — теперь .096,
       больше светлой пары, .087); подкреплено — 60% факта и 40% ink-muted, как в светлой. 8.75 и 9.36 : 1 на бумаге */
    --belief-confirmed: #C8D475; --belief-supported: #D2D89D;
    --chart-notable: #E2DCD3; --chart-routine: #6F675D; --chart-major: #E2DCD3; --chart-mid: #A29A91; --mark-plate: #F7F4EF; --scrim: rgba(0, 0, 0, .55); --hover-row: #35302B;
    /* поднятый: на бумаге — тон плашки ленты (1.06 : 1 под бумагой), как в светлой, и её же волосок (line, 1.57), наведение (1.09)
       и заготовка (skeleton-plate #46403A, 1.45; ink-muted 10.87, ушедшее 6.59 и под наведением 7.19); на холсте — ступенью светлее
       (1.15 : 1; #3A3531 на холсте — 1.03, слился бы), внутри свои волосок (line пропадал бы, 1.15; здесь 1.35), ушедшее (ink-gone на #423C37 — 4.30,
       здесь 4.83), наведение и заготовка (wash #46403A на поднятом холста — 1.06, здесь 1.23) */
    --raised: #2B2723; --raised-canvas: #423C37; --raised-line: #4C453E; --raised-canvas-line: #574F48; --raised-gone: #B3ACA2; --raised-hover: #24201D; --raised-canvas-hover: #4A443F; --raised-wash: #46403A; --raised-canvas-wash: #504943; --raised-skeleton: #46403A; --severity: #E2DCD3; --on-severity: #2A2623;
    /* плашка ленты — как в светлой: ступень под бумагой (1.06 : 1); прежняя карточка важной (#3A3531, её токена больше нет) стояла над ней (1.16 к бумаге, 1.22 к плашке);
       в значении hover-row (#35302B, светлее бумаги) плашка стояла бы в 1.08 от карточки важной и сливалась с ней. Плитка скриншота (field) на плашке
       почти того же тона — её рамку держит волосок line, 1.57 : 1. Наведение — ещё на ступень глубже (1.09), а не светлее,
       как hover-row: светлая подложка поднимала бы заметную плашку к карточке важной. ink-muted на них — 10.87 и 11.86 : 1 */
    --feed-plate: #2B2723; --feed-plate-hover: #24201D;
    /* плашка агента — тон холста, ступень над бумагой (1.12 : 1); волосок — посередине между line и плашкой */
    --plate: #38332E; --plate-line: #423C36;
    /* полоса заготовки на плашке — значение wash, как была: 1.45 : 1 к плашке, 1.58 к наведению; на дне пульса (.65) — 1.26 и 1.33 */
    --skeleton-plate: #46403A;
    /* оттенок акцента: 22% акцента на тёмной бумаге — на 14%, как в светлой, он сливался с наведением */
    --accent-tint: #4B4B53;
    /* золото вне продукта: на тёмном оно читается — 8.07 : 1 на холсте, 9.04 на бумаге; в светлой теме его нет (1.45 : 1) */
    --highlight: #EBCC8F;
    /* врезка на сайте: на тёмном тень темнее, но читается слабее — окно и так отделено от страницы цветом */
    --inset-lift: 0 0.125rem 0.375rem rgb(0 0 0 / .2), 0 0.5rem 1.5rem -0.75rem rgb(0 0 0 / .45);
    /* плавающая панель: на тёмном тень нужна темнее и плотнее — светлая тень там не видна, а слабая чёрная тонет в тёмной бумаге */
    --float-lift: 0 0.125rem 0.25rem rgb(0 0 0 / .32), 0 0.75rem 2rem -0.25rem rgb(0 0 0 / .6);
    /* рисунок: лестница темнеет к глубине, а предмет светлый — на тёмном поле он светится, а не тонет */
    --drawing-1: #8A8177; --drawing-2: #6F675E; --drawing-3: #585049; --drawing-4: #463F39;
    --drawing-mark-1: #FFFFFF; --drawing-mark-2: #F1ECE4; --drawing-mark-3: #DCD5CA;
    /* на тёмном холсте лестница и так отстоит от него: на холсте те же ступени */
    --drawing-canvas-1: #8A8177; --drawing-canvas-2: #6F675E; --drawing-canvas-3: #585049; --drawing-canvas-4: #463F39;
    /* отметка в акценте: оттенок и хрома тёмного --accent (267°, C .075) при L .92 / .803 / .70 — верх светло-синий,
       не белый, левая грань — сам акцент */
    --drawing-mark-accent-1: #D9E5FE; --drawing-mark-accent-2: #A9BEF0; --drawing-mark-accent-3: #899ECE;
    color-scheme: dark;
  }
}
/* Грунты (data-ground, ниже) — вне продукта; берут роли тёмной темы отсюда же, а свои — в своих блоках */
[data-theme="dark"],
[data-ground="band"], [data-ground="poster"], [data-ground="statement"] {
  --canvas: #38332E; --paper: #302B27; --field: #2A2623; --wash: #46403A;
  --line: #4C453E; --line-control: #6D635A;
  --ink: #F7F4EF; --ink-muted: #E2DCD3; --ink-faint: #E2DCD3; --ink-gone: #A9A298;
  --accent: #A9BEF0; --on-accent: #2A2623; --live: #B8E3C9; --alert: #F8C0AE;
  --belief-confirmed: #C8D475; --belief-supported: #D2D89D;
  --chart-notable: #E2DCD3; --chart-routine: #6F675D; --chart-major: #E2DCD3; --chart-mid: #A29A91; --mark-plate: #F7F4EF; --scrim: rgba(0, 0, 0, .55); --hover-row: #35302B;
  --raised: #2B2723; --raised-canvas: #423C37; --raised-line: #4C453E; --raised-canvas-line: #574F48; --raised-gone: #B3ACA2; --raised-hover: #24201D; --raised-canvas-hover: #4A443F; --raised-wash: #46403A; --raised-canvas-wash: #504943; --raised-skeleton: #46403A; --severity: #E2DCD3; --on-severity: #2A2623;
  --feed-plate: #2B2723; --feed-plate-hover: #24201D; --skeleton-plate: #46403A;
  --plate: #38332E; --plate-line: #423C36;
  --accent-tint: #4B4B53;
  --highlight: #EBCC8F;
  --inset-lift: 0 0.125rem 0.375rem rgb(0 0 0 / .2), 0 0.5rem 1.5rem -0.75rem rgb(0 0 0 / .45);
  --float-lift: 0 0.125rem 0.25rem rgb(0 0 0 / .32), 0 0.75rem 2rem -0.25rem rgb(0 0 0 / .6);
  --drawing-1: #8A8177; --drawing-2: #6F675E; --drawing-3: #585049; --drawing-4: #463F39;
  --drawing-mark-1: #FFFFFF; --drawing-mark-2: #F1ECE4; --drawing-mark-3: #DCD5CA;
  --drawing-canvas-1: #8A8177; --drawing-canvas-2: #6F675E; --drawing-canvas-3: #585049; --drawing-canvas-4: #463F39;
  --drawing-mark-accent-1: #D9E5FE; --drawing-mark-accent-2: #A9BEF0; --drawing-mark-accent-3: #899ECE;
  color-scheme: dark;
}

/* Грунты — поле вне продукта (RULES, Colour): сайт и лендинги, карточка для соцсетей и слайд, шапка письма Химеры о себе
   (лист ожидания, новости). Никогда в продукте: ни экран, ни диалог, ни панель, ни карточка, ни график, ни письмо с находками
   или дайджест. Грунт тёмный в обеих темах: роли тёмной темы он берёт из её блока выше, а здесь переворачивает то, что меняет поле.
   Селекторы называют ровно три значения — голого [data-ground] нет. Акцент на грунте — бумага: кольцо фокуса, фокус поля,
   ссылка — бумагой с подчёркиванием; золото приходит только туда, где компонент называет --highlight, — по наследству оно
   никуда не попадает */
[data-ground="band"], [data-ground="poster"], [data-ground="statement"] {
  --ink: #F8F7F5;           /* --paper светлой темы: 14.05 / 16.61 / 14.01 : 1 на трёх грунтах */
  --canvas: var(--ground); --paper: var(--ground); --plate: var(--ground); --plate-line: var(--ground); --raised: var(--ground); --raised-canvas: var(--ground); --raised-wash: var(--wash); --raised-canvas-wash: var(--wash); --raised-hover: var(--hover-row); --raised-canvas-hover: var(--hover-row); --raised-skeleton: var(--wash);
  --accent: var(--ink);     /* кольцо фокуса и фокус поля; выбора на грунте нет — переключатели, флажки, вкладки стоят на бумаге */
  --on-accent: var(--ground);
  --highlight: #EBCC8F;     /* песочное золото: то одно, на чём держится вещь, и её одно действие. 9.72 / 11.49 / 9.69 : 1; на бумаге 1.45 : 1 — там его нет */
  --on-highlight: var(--ground); /* слова на золотой кнопке — цветом грунта */
  color-scheme: dark;
}
/* band — блок среди других блоков страницы (раздел сайта, шапка письма): оттенок акцента при светлоте чернил (L .274),
   так он весит, как строка текста рядом с белыми разделами. Тёплые роли тёмной темы на синем читались бурыми — они перевёрнуты */
[data-ground="band"] {
  --ground: #102452;
  --ink-muted: #C3D1F2; --ink-faint: #C3D1F2;   /* 9.83 : 1; ink-faint — псевдоним ink-muted */
  --ink-gone: #91A1C5;                           /* ушедшего на грунте нет; если встанет — прежней ступенью серого грунта, 5.81 : 1 */
  --line: #42547F; --line-control: #66779F;      /* 2.01 и 3.37 : 1: поле на грунте стоит одной обводкой */
  --field: #23355F; --wash: #304269; --hover-row: #1E315C; --accent-tint: #435276;
  --chart-notable: #C3D1F2; --chart-routine: #4D6291; --chart-major: #C3D1F2; --chart-mid: #8294BD;
  --drawing-1: #6A7AA2; --drawing-2: #54668F; --drawing-3: #42547F; --drawing-4: #30436F;
  --drawing-mark-1: #D9E5FE; --drawing-mark-2: #A9BEF0; --drawing-mark-3: #899ECE;
  --drawing-canvas-1: var(--drawing-1); --drawing-canvas-2: var(--drawing-2); --drawing-canvas-3: var(--drawing-3); --drawing-canvas-4: var(--drawing-4);
  --drawing-mark-accent-1: var(--drawing-mark-1); --drawing-mark-accent-2: var(--drawing-mark-2); --drawing-mark-accent-3: var(--drawing-mark-3);
}
/* poster — грунт и есть вся вещь (плакат, карточка для соцсетей, слайд): на ступень глубже (L .210), рядом нет ничего,
   что задало бы ему вес. Только здесь — одно свечение за главной цифрой (ch-glow): светлее грунта синий, в него грунт */
[data-ground="poster"] {
  --ground: #0C1730;
  --ink-muted: #B4C0DA; --ink-faint: #B4C0DA;   /* 9.73 : 1, на пике свечения 7.37; ink-faint — псевдоним ink-muted */
  --ink-gone: #8C98B1;                           /* ушедшее, если встанет: 6.13 : 1, на пике свечения 4.64 */
  --line: #3B4660; --line-control: #717C96;      /* 1.89 и 4.26 : 1; на пике свечения обводка поля 3.22 */
  --field: #1F2940; --wash: #2D364C; --hover-row: #1A243C; --accent-tint: #40485B;
  --chart-notable: #B4C0DA; --chart-routine: #4B5A7D; --chart-major: #B4C0DA; --chart-mid: #7A88A7;
  --glow: #1B2D57;
  --drawing-1: #606C85; --drawing-2: #4C5771; --drawing-3: #3B4660; --drawing-4: #2A354F;
  --drawing-mark-1: #D9E5FE; --drawing-mark-2: #A9BEF0; --drawing-mark-3: #899ECE;
  --drawing-canvas-1: var(--drawing-1); --drawing-canvas-2: var(--drawing-2); --drawing-canvas-3: var(--drawing-3); --drawing-canvas-4: var(--drawing-4);
  --drawing-mark-accent-1: var(--drawing-mark-1); --drawing-mark-accent-2: var(--drawing-mark-2); --drawing-mark-accent-3: var(--drawing-mark-3);
}
/* statement — высказывание крупным шрифтом, где синее поле спорило бы со словами: --ink светлой темы, нового значения нет.
   Тёплые ступени тёмной темы остаются; поле тёмной темы и есть этот цвет — оно переворачивается */
[data-ground="statement"] {
  --ground: #2A2623;
  --ink-muted: #BEBCBA; --ink-faint: #BEBCBA;   /* 7.92 : 1; ink-faint — псевдоним ink-muted */
  --ink-gone: #A6A3A1;                           /* ушедшее, если встанет: 5.98 : 1 */
  --line-control: #878482;                       /* 4.04 : 1 */
  --field: #3A3734; --accent-tint: #575451;
  --drawing-mark-accent-1: var(--drawing-mark-1); --drawing-mark-accent-2: var(--drawing-mark-2); --drawing-mark-accent-3: var(--drawing-mark-3);
}

/* ═══ components.css ═══ */
/* Химера — примитивы. Классы ch-*, значения только из tokens.css. */

/* Основа страницы: этого хватает продукту без других стилей. Полоса прокрутки держит место всегда — замок прокрутки
   под модалкой не сдвигает страницу; длинное слово без пробелов переносится, а не раздвигает колонку */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; scrollbar-gutter: stable; }
/* Полоса прокрутки — тонкая и видна только во время прокрутки (владелец, 2026-11-03: «нигде, кроме прокрутки»). Где система
   держит полосы на виду (Windows, macOS «всегда показывать», мышь), полоса прозрачна, пока рамка стоит; рамка, которая
   прокручивается, получает от скрипта data-scrolling, и бегунок цветом обводки показывается до секунды покоя (scrollbars.js,
   у продукта — свой скрипт). У страницы атрибут стоит на <html>: полоса окна берёт цвет у корня. Место полоса держит и
   прозрачной: страница не сдвигается, когда бегунок появляется. Свойства на каждом элементе, а не по наследству:
   scrollbar-width не наследуется, а цвет наследовался бы уже посчитанным, и блок со своей палитрой (data-theme) получил бы
   бегунок чужой темы. Рамка, которая прячет полосу (рейка, вкладки на телефоне), сильнее этого правила */
* { scrollbar-width: thin; scrollbar-color: transparent transparent; }
[data-scrolling] { scrollbar-color: var(--line-control) transparent; }
html, body { min-height: 100%; }
body {
  margin: 0;
  background: var(--canvas);
  color: var(--ink);
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui);
  overflow-wrap: break-word;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}
p { margin: 0; }
b, strong { font-weight: 500; }
[hidden] { display: none !important; }
.ch-visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* Блок со своей палитрой: текст берёт цвет из неё, а не наследует от родителя */
[data-theme] { color: var(--ink); }
button { font: inherit; color: inherit; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm); }
/* Иконка и знак стоят в строке, как svg без сброса: сброс продукта (svg — блоком) не роняет ↗ на свою строку */
.ch-icon { display: inline-block; vertical-align: baseline; width: 1.125rem; height: 1.125rem; flex: none; }
/* Контейнер, который фокусирует скрипт (диалог, панель, шторка), кольца не получает: кольцо — у того, что внутри */
:is(.ch-modal, .ch-menu--float, .ch-drawer):focus { outline: none; }

/* ── Типографика ─────────────────────────────────────────── */
/* Ссылка внутри голоса и примечаний — тонкое подчёркивание цветом обводки, ниже на 4px: текст читается подряд, ссылка видна */
.ch-voice a:not([class]) { color: inherit; text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.ch-voice a:not([class]):hover { text-decoration-color: currentColor; }
.ch-voice { font-family: var(--font-voice); font-size: var(--text-voice); line-height: var(--leading-voice); display: grid; gap: var(--space-3); text-wrap: pretty; }
/* Список в голосе — с маркерами тише текста; пункты в шаг строки, как абзацы списка */
.ch-voice :is(ul, ol) { margin: 0; padding-left: var(--space-6); display: grid; gap: var(--space-1); }
.ch-voice ul { list-style: disc; }
.ch-voice ol { list-style: decimal; }
.ch-voice li::marker { color: var(--ink-muted); }
.ch-voice--xl { font-size: var(--text-greeting); line-height: var(--leading-greeting); letter-spacing: -0.005em; }
.ch-title { font: 500 var(--text-title)/var(--leading-title) var(--font-ui); letter-spacing: -0.01em; margin: 0; text-wrap: pretty; }
/* Подпись раздела — капитель чернилами: серая 13/500 тонула над текстом голосом 16 (владелец, 2026-11-08: «Что
   произошло» и «Почему это важно» в окне находки не было видно). Прописные — оформлением, слова в разметке остаются как пишутся: экранный диктор читает их словами */
.ch-label { font: 500 var(--text-label)/var(--leading-label) var(--font-ui); letter-spacing: .08em; text-transform: uppercase; color: var(--ink); margin: 0; }
.ch-meta { font: 400 var(--text-meta)/var(--leading-meta) var(--font-data); color: var(--ink-muted); font-variant-numeric: tabular-nums; }
.ch-meta--ink { color: var(--ink); }
code, .ch-code { font-family: var(--font-data); }
/* Ссылка внутри прозы интерфейса — заметки документа (fp-note, у убеждения — bl-note: «Scout is watching <a>…</a> until …»),
   описания настройки, подсказки поля, значения в Details, подпись раздела досье (co-intro: «Chimera can’t read <a>Klue’s list of
   subprocessors</a>…», CHI-1740): голая <a> акцентом, кеглем и строкой самой прозы, подчёркнута под
   указателем. ch-link ставит свой кегль 14 и строчный блок, поэтому в строке 12 он крупнее слов вокруг и не переносится внутри
   себя; ch-link — для ссылки, которая стоит сама (Open, See all) */
:is(.fp-note, .bl-note, .fp-details dd, .ch-setting__desc, .ch-field__hint, .co-intro) a:not([class]) { color: var(--accent); text-decoration: none; }
:is(.fp-note, .bl-note, .fp-details dd, .ch-setting__desc, .ch-field__hint, .co-intro) a:not([class]):hover { text-decoration: underline; text-underline-offset: 4px; }
/* Факты одной строкой меты («7 of 14 · searched the web in 9 of 14 · claude-haiku-5-5»): каждый — span со своей « ·» через
   неразрывный пробел, целым куском, пока помещается в строку; факт длиннее строки переносится внутри себя, и строка не начинается
   с точки. Под числом раздела, в строке списка, под числом ch-kpis, во второй строке ячейки — один класс */
.ch-facts > span { display: inline-block; max-width: 100%; }

/* ── Каркас приложения: рейка | страница. Страница на бумаге отделена от рейки волосяной линией;
      страница на холсте (дайджест, разговор) — без линии: холст на холсте ── */
.ch-app { display: flex; min-height: 100vh; }
.ch-app > .ch-rail { border-right: var(--hairline) solid var(--line); }
.ch-app--canvas > .ch-rail { border-right: 0; }
/* Колонка страницы, когда над рамкой стоит что-то от приложения (баннер лимита, паузы): рамка страницы — её ребёнок */
.ch-app__main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.ch-app__banner { padding: var(--space-4) var(--page-pad) 0; }
.ch-app__banner > * { max-width: var(--page); margin-inline: auto; }

/* ── Узкое окно: рейка уходит в шторку, сверху — полоса с кнопкой меню и знаком. Шторка — та же рейка с подписями
      у левого края поверх затемнения; закрывается крестиком, Esc и кликом мимо ── */
.ch-topbar { display: none; }
.ch-topbar__brand { display: inline-flex; align-items: center; gap: var(--space-2); font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-decoration: none; }
.ch-topbar__brand .ch-icon { width: var(--rail-logo); height: var(--rail-logo); }
@media (max-width: 760px) {
  .ch-app { flex-direction: column; }
  .ch-app > .ch-rail { display: none; }
  .ch-topbar {
    position: sticky; top: 0; z-index: 20; display: flex; align-items: center; gap: var(--space-2);
    height: var(--topbar); padding: 0 var(--space-3); background: var(--canvas); border-bottom: var(--hairline) solid var(--line);
  }
}
.ch-drawer { position: fixed; inset: 0 auto 0 0; z-index: 55; width: min(17.5rem, 86vw); display: flex; animation: ch-drawer-in .25s var(--ease) both; }
.ch-drawer > .ch-rail { flex: 1; height: 100%; overflow-y: auto; }
.ch-drawer__close { position: absolute; top: var(--space-4); right: var(--space-3); }
@keyframes ch-drawer-in { from { transform: translateX(-100%); } }

/* ── Слой под оверлеем, который ставит скрипт (диалог, шторка): затемнение на всё окно; модалка — по центру, длинная прокручивается ── */
.ch-scrim { position: fixed; inset: 0; z-index: 50; display: grid; grid-template-columns: minmax(0, 1fr); place-items: center; overflow-y: auto; padding: var(--space-8) var(--space-4); background: var(--scrim); }
.ch-scrim > .ch-modal { position: relative; margin: auto; max-width: 100%; }

/* ── Рейка ───────────────────────────────────────────────── */
.ch-rail {
  width: var(--rail); flex: none;
  display: flex; flex-direction: column; align-items: center;
  padding-block: var(--space-4);
  background: var(--canvas);
}
.ch-rail__logo { width: var(--rail-item); height: var(--rail-item); display: grid; place-items: center; color: var(--ink); margin-bottom: var(--rail-logo-gap); }
.ch-rail__logo .ch-icon { width: var(--rail-logo); height: var(--rail-logo); }
.ch-rail__nav { display: grid; gap: var(--space-2); }
.ch-rail__foot { margin-top: auto; }
.ch-rail .ch-rail__item .ch-icon { width: var(--rail-glyph); height: var(--rail-glyph); }
.ch-rail__item {
  position: relative; width: var(--rail-item); height: var(--rail-item);
  display: grid; place-items: center;
  border: 0; background: none; color: var(--ink-muted); cursor: pointer;
  border-radius: var(--radius);
}
.ch-rail__item:hover { color: var(--ink); background: var(--wash); }
.ch-rail__item[aria-current="page"] { color: var(--ink); }
.ch-rail__item[aria-current="page"]::before {
  content: ""; position: absolute; left: calc((var(--rail) - var(--rail-item)) / -2); top: 0.6875rem; bottom: 0.6875rem;
  width: 0.0938rem; background: var(--ink);
}
.ch-rail__item[data-badge]::after {
  content: ""; position: absolute; top: 0.4375rem; right: 0.4375rem;
  width: 0.375rem; height: 0.375rem; border-radius: var(--radius-full); background: var(--live);
}
.ch-rail__item.is-new { animation: ch-arrive .5s var(--ease) both; }
a.ch-rail__item, a.ch-rail__logo { text-decoration: none; }

/* Рейка с подписями: та же колонка иконок, рядом появляются названия. Иконки не сдвигаются. */
.ch-rail { transition: width .2s var(--ease); }
.ch-rail--sticky { position: sticky; top: 0; height: 100vh; overflow: hidden auto; overscroll-behavior: contain; scrollbar-width: none; }
.ch-rail__label, .ch-rail__group, .ch-rail__brand { display: none; }
.ch-rail__brand { font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.ch-rail__section { margin-top: var(--space-6); display: grid; gap: var(--space-2); }
.ch-rail__group { padding-left: calc((var(--rail-item) - var(--rail-glyph)) / 2); }
.ch-rail--open { width: var(--rail-open); align-items: stretch; padding-inline: calc((var(--rail) - var(--rail-item)) / 2); }
.ch-rail--open .ch-rail__label, .ch-rail--open .ch-rail__group, .ch-rail--open .ch-rail__brand { display: block; }
.ch-rail--open .ch-rail__item, .ch-rail--open .ch-rail__logo {
  width: 100%; display: flex; align-items: center; gap: var(--space-3);
  padding: 0 calc((var(--rail-item) - var(--rail-glyph)) / 2);
}
.ch-rail--open .ch-rail__label { color: inherit; white-space: nowrap; }
.ch-rail__account {
  display: flex; align-items: center; gap: var(--space-3); width: var(--rail-item); height: var(--rail-item);
  justify-content: center; border: 0; background: none; padding: 0; cursor: pointer; border-radius: var(--radius); color: var(--ink);
}
.ch-rail__account:hover { background: var(--wash); }
.ch-rail--open .ch-rail__account { width: 100%; justify-content: flex-start; padding: 0 calc((var(--rail-item) - var(--rail-glyph)) / 2); text-align: left; }
.ch-rail__account .ch-rail__label { display: none; min-width: 0; }
.ch-rail--open .ch-rail__account .ch-rail__label { display: grid; flex: 1; }
.ch-rail__account .ch-rail__label > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ch-rail__account > .ch-icon { width: var(--icon-sm); height: var(--icon-sm); display: none; color: var(--ink-muted); }
.ch-rail--open .ch-rail__account > .ch-icon { display: block; }
/* Рейка, открытая близостью (data-near; решение владельца 2026-11-01). Закрытая рейка называет пункты, пока указатель на ней
   или в зоне рядом шириной с рейку (не дальше начала содержимого рядом — data-rail-edge): та же рейка на время шире, над
   страницей, и её грунт, слова и строка под указателем — один слой, без линии между рейкой и словами; справа грунт
   растворяется в цвет страницы (--rail-fade). С самой рейки видно всё меню (data-near="all"), и оно держится, пока указатель
   над открытым меню; из зоны — слова у указателя (data-near="zone"): ближнее целиком, дальние гаснут почти до нуля по --near,
   которое скрипт ставит пункту (1 — целиком). Строка под указателем — пункт с data-nearest. Нажимается только то, что видно
   целиком: всё меню — его пункты, слова у указателя — строка под указателем; под остальным грунтом страница сохраняет свои
   клики и прокрутку. Иконки и точка у иконки не сдвигаются: подпись группы не показывается. Фокус с клавиатуры открывает
   всё меню. Скрипт — proto.js в прототипе. */
.ch-rail[data-near] {
  --rail-solid: calc(var(--rail-open) - 1.5rem);
  z-index: 40; pointer-events: none;
  min-width: calc(var(--rail-open) + var(--rail-fade));
  margin-right: calc(var(--rail) - var(--rail-open) - var(--rail-fade));
  align-items: flex-start; padding-inline: calc((var(--rail) - var(--rail-item)) / 2);
  /* грунт — фон самой рейки, поэтому он не уезжает, когда высокая рейка прокручена: сплошной за словами, затем цвет
     страницы по плавной кривой, а не по прямой */
  background: linear-gradient(to right,
    var(--canvas) var(--rail-solid),
    color-mix(in oklab, var(--canvas) 92%, transparent) calc(var(--rail-solid) + (100% - var(--rail-solid)) / 6),
    color-mix(in oklab, var(--canvas) 75%, transparent) calc(var(--rail-solid) + (100% - var(--rail-solid)) / 3),
    color-mix(in oklab, var(--canvas) 50%, transparent) calc(var(--rail-solid) + (100% - var(--rail-solid)) / 2),
    color-mix(in oklab, var(--canvas) 25%, transparent) calc(var(--rail-solid) + (100% - var(--rail-solid)) * 2 / 3),
    color-mix(in oklab, var(--canvas) 8%, transparent) calc(var(--rail-solid) + (100% - var(--rail-solid)) * 5 / 6),
    transparent 100%) no-repeat;
}
/* слова у указателя стоят над страницей: колесо над строкой листает страницу, а не останавливается в рейке */
.ch-rail[data-near="zone"] { overscroll-behavior: auto; }
.ch-rail[data-near]:not(.ch-rail--sticky) { position: relative; }
.ch-app > .ch-rail[data-near] { border-right-color: transparent; }
/* у закрытой рейки на бумаге её линия забирает пиксель у колонки иконок: открытая держит иконки на том же месте */
.ch-app:not(.ch-app--canvas) > .ch-rail[data-near] { padding-left: calc((var(--rail) - var(--hairline) - var(--rail-item)) / 2); }
.ch-rail[data-near] :is(.ch-rail__item, .ch-rail__account) {
  width: calc(var(--rail-open) - var(--rail) + var(--rail-item));
  display: flex; align-items: center; justify-content: flex-start; gap: var(--space-3);
  padding: 0 calc((var(--rail-item) - var(--rail-glyph)) / 2); text-align: left;
}
/* Слово пункта и его иконка — на одной базовой линии, а не на центрах двух боксов (владелец, 2026-11-08: при M и L слова
   стояли несимметрично относительно иконок). Базовая линия текста встаёт на целый пиксель экрана, иконка — по-своему; при S
   пункты стоят на целых пикселях, а при M и L (46.75 на пункт, 8.5 зазор) — на дробных, разных у каждого пункта, и слово
   прыгало относительно иконки на пиксель то вверх, то вниз. Поэтому низ иконки привязан к базовой линии слова на целое число
   пикселей экрана (--rail-drop; 0.3325 em — середина между ascent 970 и descent 305 у Onest: столько от центра строки до
   её базовой линии), и сама иконка целая (--rail-glyph: 24 / 26 / 27 при плотности 1): они встают на пиксели вместе.
   Иконка — в той же точке, что при центрировании: строка пункта — бокс иконки, отступ сверху — её поле. Шаг округления —
   пиксель экрана (--rail-px): при масштабе 125% или 150% целый CSS-пиксель — не целый пиксель экрана; иная плотность
   (масштаб браузера) берёт CSS-пиксель, как раньше. Без round() (Chrome до 125) — те же места без округления.
   Знак с именем (ch-rail__logo) центрирован, как был: по базовой линии его строка выше иконки, и в рейке, которая не
   помещается в окно, он не сжимался бы до знака */
.ch-rail {
  --rail-px: 1px;
  --rail-glyph: var(--rail-icon);
  --rail-drop: calc(var(--rail-glyph) / 2 - 0.3325 * var(--text-ui));
}
@media (resolution: 1.25dppx) { .ch-rail { --rail-px: 0.8px; } }
@media (resolution: 1.5dppx) { .ch-rail { --rail-px: 0.666667px; } }
@media (resolution: 1.75dppx) { .ch-rail { --rail-px: 0.571429px; } }
@media (resolution: 2dppx) { .ch-rail { --rail-px: 0.5px; } }
@media (resolution: 2.25dppx) { .ch-rail { --rail-px: 0.444444px; } }
@media (resolution: 2.5dppx) { .ch-rail { --rail-px: 0.4px; } }
@media (resolution: 3dppx) { .ch-rail { --rail-px: 0.333333px; } }
@supports (width: round(1px, 1px)) {
  .ch-rail {
    --rail-glyph: round(var(--rail-icon), var(--rail-px));
    --rail-drop: round(calc(var(--rail-glyph) / 2 - 0.3325 * var(--text-ui)), var(--rail-px));
  }
}
:is(.ch-rail--open, .ch-rail[data-near]) .ch-rail__item {
  align-items: baseline; padding-top: calc((var(--rail-item) - var(--rail-glyph)) / 2 - var(--rail-drop));
}
:is(.ch-rail--open, .ch-rail[data-near]) .ch-rail__item > .ch-icon { position: relative; top: var(--rail-drop); }
/* Строка под указателем выше пункта на 8 и сдвинута на 4 (растут с размером), а её прозрачная кромка — 4px (линия, не растёт):
   поле сверху добирает разницу, и строка, став ближайшей, не сдвигается (при M и L — на 0.25 и 0.5) */
.ch-rail { --rail-near-border: 4px; }
.ch-rail[data-near] .ch-rail__item[data-nearest] {
  padding-top: calc((var(--rail-item) - var(--rail-glyph)) / 2 - var(--rail-drop) + 0.25rem - var(--rail-near-border));
}
/* Знак в открытой рейке — своего размера (--rail-logo), а не целой иконки: стоит в колонке иконок, как в закрытой */
.ch-rail--open .ch-rail__logo { padding-inline: calc((var(--rail-item) - var(--rail-logo)) / 2); }
/* всё меню — вся рейка: клик и колесо в его пустотах не уходят на страницу под ним, колесо листает высокую рейку */
.ch-rail[data-near="all"],
.ch-rail[data-near] .ch-rail__logo,
.ch-rail[data-near="all"] :is(.ch-rail__nav, .ch-rail__section, .ch-rail__foot, .ch-rail__item, .ch-rail__account),
.ch-rail[data-near] [data-nearest] { pointer-events: auto; }
.ch-rail[data-near] :is(.ch-rail__item, .ch-rail__account):not([data-nearest]):hover { background: none; }
/* Строка под указателем: от иконки до конца, её конец растворяется вместе с грунтом. Она подсвечена до половины зазора
   к соседу, и клик там попадает в неё: прозрачная кромка по 4px сверху и снизу, раскладка не меняется */
.ch-rail[data-near] [data-nearest] {
  color: var(--ink); background: linear-gradient(to right, var(--wash) calc(100% - 3.5rem), transparent) padding-box;
  height: calc(var(--rail-item) + 0.5rem); margin-block: -0.25rem; border-block: var(--rail-near-border) solid transparent;
  position: relative; z-index: 1;   /* у пунктов внизу без зазора её кромка ложится на соседа: клик идёт в подсвеченный */
}
.ch-rail[data-near] .ch-rail__item[data-badge]::after { right: auto; left: calc(var(--rail-item) - 0.8125rem); }
.ch-rail[data-near] .ch-rail__label {
  display: block; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: color-mix(in oklab, currentColor calc(var(--near, 1) * 100%), var(--canvas));
  opacity: min(1, calc(var(--near, 1) * 4));
  transition: opacity .12s linear;
}
@starting-style { .ch-rail[data-near] .ch-rail__label { opacity: 0; } }
.ch-rail[data-near] .ch-rail__account .ch-rail__label { display: grid; }
.ch-rail[data-near] .ch-rail__account .ch-meta { color: color-mix(in oklab, var(--ink-muted) calc(var(--near, 1) * 100%), var(--canvas)); }
/* домен аккаунта под указателем — ink-muted целиком, без растворения в холст */
.ch-rail[data-near] .ch-rail__account[data-nearest] .ch-meta { color: var(--ink-muted); }
/* Рядом с рейкой на том же грунте — разговор слева (сводка): пока меню открыто, его слова отступают, и меню читается поверх */
[data-rail-recede] { transition: opacity .16s var(--ease); }
body:has(.ch-rail[data-near]) [data-rail-recede] { opacity: .2; }
.ch-avatar {
  width: var(--rail-glyph, var(--rail-icon)); height: var(--rail-glyph, var(--rail-icon)); flex: none; display: grid; place-items: center;
  border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  font: 500 var(--text-meta)/1 var(--font-ui); color: var(--ink);
}

/* ── Кнопки ─────────────────────────────────────────────── */
.ch-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
  min-height: var(--control); padding: 0 var(--space-3);
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink);
  background: transparent; border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  white-space: nowrap; cursor: pointer; transition: background-color .15s, border-color .15s;
}
a.ch-btn { text-decoration: none; }
.ch-btn:hover { background: var(--wash); }
.ch-btn--quiet { border-color: transparent; color: var(--ink-muted); }
.ch-btn--quiet:hover { background: transparent; color: var(--ink); }
/* Недоступное (disabled, aria-disabled) — своё отличие, видное без наведения: при одном сером тихая кнопка в покое уже ink-muted,
   и недоступная выглядела бы так же. Слова недоступного — ink-muted на 55% к своему фону (свет ≈ 2.4 : 1, тёмная ≈ 4 : 1; WCAG
   недоступные элементы от контраста освобождает). Одна запись во всех правилах ниже; строка под словом — почему нельзя — остаётся
   ink-muted и читается. color-mix от var(--ink-muted) на месте — так и на грунте берётся его серый */
.ch-btn[aria-disabled="true"] { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
.ch-btn[aria-disabled="true"]:hover { background: transparent; }
.ch-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; }
/* Кнопка длиннее всего ряда (CHI-1769: «Начать следить за 2 конкурентами и вашим сайтом» на телефоне 390 при L — 419 px, страница
   ехала вбок) встаёт во всю ширину ряда и переносит подпись по пробелам, по центру и ровными строками; пока подпись помещается,
   кнопка та же, что была: ряд переносит кнопки целиком раньше, чем кнопка — свои слова. Не сжимается рядом с соседями (flex-shrink 0),
   так что в ряду без переноса (действия плашки) ничего не меняется */
.ch-actions > .ch-btn { flex-shrink: 0; max-width: 100%; padding-block: var(--space-1); white-space: normal; text-align: center; text-wrap: balance; }

.ch-send {
  width: var(--send); height: var(--send); flex: none;
  display: grid; place-items: center;
  border: 0; border-radius: var(--radius);
  background: var(--accent); color: var(--on-accent); cursor: pointer;
  transition: opacity .15s;
}
.ch-send .ch-icon { width: 1rem; height: 1rem; }
.ch-send:disabled { opacity: .35; cursor: default; }
.ch-send[aria-busy="true"] { opacity: .6; cursor: progress; }
/* Крутилка на заливке акцентом — цветом текста на акценте, как в баннере */
.ch-send .ch-spinner { border-color: color-mix(in srgb, var(--on-accent) 35%, transparent); border-top-color: var(--on-accent); }

/* ── Поле ввода ─────────────────────────────────────────── */
.ch-composer {
  display: flex; align-items: center; gap: var(--space-3);
  min-height: var(--composer);
  padding: 0 calc((var(--composer) - var(--send)) / 2 - 1px) 0 var(--space-4);
  background: var(--field);
  border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  transition: border-color .15s;
}
.ch-composer:focus-within { border-color: var(--ink-muted); }
/* Ответ не принят: рамка красным, слова — под полем, как у поля формы */
.ch-composer:has([aria-invalid="true"]) { border-color: var(--alert); }
.ch-composer + .ch-field__error { margin-top: var(--space-2); }
.ch-composer__input {
  flex: 1; min-width: 0; border: 0; outline: 0; background: none;
  font: 400 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink);
}
.ch-composer__input::placeholder { color: var(--ink-muted); }
.ch-composer__hint { text-align: right; margin-top: var(--space-2); }
/* Поле, чьему действию ещё нет бэкенда (владелец, 2026-11-03): disabled у поля и у кнопки. Рамка остаётся — это всё ещё поле, —
   заливки нет, слова — как у недоступного (ink-muted на 55%), указатель ничего не меняет; кнопка теряет заливку, как недоступная основная. Под полем — строка
   ch-composer__note: когда или где это можно сделать (поле ссылается на неё aria-describedby) */
.ch-composer:has(.ch-composer__input:disabled) { background: transparent; cursor: default; }
.ch-composer__input:disabled, .ch-composer__input:disabled::placeholder { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
.ch-composer:has(.ch-composer__input:disabled) .ch-send:disabled { opacity: 1; background: transparent; color: color-mix(in srgb, var(--ink-muted) 55%, transparent); border: var(--hairline) solid var(--line-control); }
.ch-composer__note { margin-top: var(--space-2); }
/* Разговор уходит под липкое поле (владелец, 2026-11-03). Полоса поля (dg__ask, cp-ask) липнет к низу на своём грунте
   (--ask-ground: canvas у дайджеста, paper у дела). Пока под ней есть разговор (data-more у полосы — ставит скрипт), над её
   верхним краем слой ch-ask-more: слова растворяются в грунт полосы на space-12 — градиент грунта, не тень, по той же плавной
   кривой, что у рейки, — и ниже, сплошным грунтом высотой с кнопку, по центру стоит тихая кнопка со стрелкой вниз: к концу
   разговора. Поле она не закрывает: между ней и полем — верхний отступ полосы. В конце разговора слоя не видно и кнопки нет
   (visibility: hidden — из порядка Tab она уходит). Нажимается только кнопка: под раствором страница кликается как была */
.ch-ask-more {
  position: absolute; left: 0; right: 0; bottom: 100%;
  height: calc(var(--space-12) + var(--control));
  display: flex; align-items: flex-end; justify-content: center;
  pointer-events: none;
  background: linear-gradient(to bottom,
    transparent,
    color-mix(in oklab, var(--ask-ground, var(--paper)) 8%, transparent) calc(var(--space-12) / 6),
    color-mix(in oklab, var(--ask-ground, var(--paper)) 25%, transparent) calc(var(--space-12) / 3),
    color-mix(in oklab, var(--ask-ground, var(--paper)) 50%, transparent) calc(var(--space-12) / 2),
    color-mix(in oklab, var(--ask-ground, var(--paper)) 75%, transparent) calc(var(--space-12) * 2 / 3),
    color-mix(in oklab, var(--ask-ground, var(--paper)) 92%, transparent) calc(var(--space-12) * 5 / 6),
    var(--ask-ground, var(--paper)) var(--space-12));
  opacity: 0; visibility: hidden;
  transition: opacity .16s var(--ease), visibility 0s linear .16s;
}
[data-more] > .ch-ask-more { opacity: 1; visibility: visible; transition: opacity .16s var(--ease); }
.ch-ask-more > .ch-btn { pointer-events: auto; }
/* Конец разговора, на который кнопка переводит фокус: контейнер, сфокусированный скриптом, без кольца */
[data-ask-end]:focus { outline: none; }

/* ── Реплики ────────────────────────────────────────────── */
.ch-user { display: grid; gap: var(--space-1); }
.ch-user__text { font: 400 var(--text-body)/var(--leading-body) var(--font-ui); }

.ch-event { display: flex; align-items: center; gap: var(--space-2); }
.ch-event::after { content: ""; flex: 1; height: var(--hairline); background: var(--line); margin-left: var(--space-2); }

.ch-dot { width: var(--dot); height: var(--dot); border-radius: var(--radius-full); background: var(--live); flex: none; }
.ch-dot--pulse { animation: ch-pulse 1.8s ease-in-out infinite; }
/* «Новое с прошлого раза» — точка тише текста, не зелёная: зелёный значит «агент работает» */
.ch-dot--new { background: var(--ink-muted); }
/* Точка стоит против первой строки своих слов, по её середине (владелец, 2026-11-10: строка в две строки ставила точку между ними,
   так не делают): начало строки, а не центр; 1lh — высота строки самой метки */
.ch-agent-status { display: inline-flex; align-items: flex-start; gap: var(--space-2); }
.ch-agent-status > .ch-dot { margin-top: calc((1lh - var(--dot)) / 2); }

/* ── Документ ───────────────────────────────────────────── */
.ch-crumbs { display: flex; gap: var(--space-2); }
.ch-crumbs a { color: inherit; text-decoration: none; }
.ch-crumbs a:hover { color: var(--ink); }

.ch-doc-head { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-8); align-items: baseline; }
.ch-metarow { display: flex; flex-wrap: wrap; column-gap: var(--space-6); row-gap: var(--space-1); }
.ch-rule { height: var(--hairline); background: var(--line); border: 0; margin: 0; }

.ch-section { display: grid; gap: var(--space-3); }   /* 12 под капителью подписи: при 8 строка прописных липла к тексту */

.ch-mark { display: inline-block; vertical-align: baseline; width: 0.75rem; height: 0.75rem; flex: none; color: var(--ink); }
/* Статус убеждения — в цвете своей уверенности: чем полнее знак, тем ближе к оливковому (владелец, 3 ноября 2026). Гипотеза ○ и
   заменённое ⊘ — --ink-muted (единственный серый), подкреплённое ◐ — ступень между, факт ● — --belief-confirmed. Модификатор называет статус, потому что
   CSS не видит, на какой символ спрайта ссылается <use>. Важность находки (△ ▲) модификатора не берёт и остаётся чернилами */
.ch-mark--hypothesis, .ch-mark--replaced { color: var(--ink-muted); }
.ch-mark--supported { color: var(--belief-supported); }
.ch-mark--confirmed { color: var(--belief-confirmed); }
.ch-status { display: inline-flex; align-items: center; gap: var(--space-2); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); white-space: nowrap; }
/* Статус, которому может не хватить строки («Confirmed by Scout · 11 findings from 4 competitors over 6 weeks», узкий столбец
   уровня), переносится по пробелам, знак — на первой строке */
.ch-status--wrap { white-space: normal; align-items: flex-start; }
.ch-status--wrap > .ch-mark { margin-top: calc((var(--leading-ui) - 0.75rem) / 2); }

.ch-list { list-style: none; margin: 0; padding: 0; border-top: var(--hairline) solid var(--line); }
.ch-list > li { border-bottom: var(--hairline) solid var(--line); }

.ch-evidence__item { display: grid; gap: var(--space-1); padding-block: var(--space-3) var(--space-4); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }

.ch-belief {
  width: 100%; display: grid; grid-template-columns: 0.75rem minmax(0, 1fr) auto; gap: var(--space-3); align-items: center;
  padding: var(--space-3) 0; border: 0; background: none; text-align: left; cursor: pointer;
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink);
}
.ch-belief:hover .ch-belief__title { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.ch-belief[data-status="replaced"] .ch-belief__title { text-decoration: line-through; color: var(--ink-gone); }
.ch-belief[data-status="replaced"] .ch-mark { color: var(--ink-gone); }

/* ── Ссылка: тихое действие в тексте («Open», «See all beliefs», «Show earlier»). Ссылка-кнопка, которой тесно в строке,
      переносится от начала строки, как ссылка, а не по центру, как кнопка ── */
.ch-link {
  display: inline-flex; align-items: center; gap: var(--space-1);
  padding: 0; border: 0; background: none; cursor: pointer; text-decoration: none; text-align: left;
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted);
}
.ch-link:hover { color: var(--ink); }
.ch-link .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }
.ch-link[aria-disabled="true"] { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
/* Конец ссылки-кнопки (ch-link__end): последнее слово, счёт и знак за ними — одним куском, как ch-url__end у адреса.
   Ссылке, которой тесно, слова переносятся по пробелам, а «· 4» и шеврон не остаются одни на строке и не уходят к её краю:
   ссылка с концом — строчная, а не строчный flex. Раскрытая (aria-expanded) поворачивает шеврон и внутри конца */
.ch-link:has(> .ch-link__end) { display: inline; }
.ch-link__end { white-space: nowrap; }
.ch-link__end > .ch-icon { margin-left: var(--space-1); vertical-align: -0.125rem; }

/* ── Кнопка с иконкой: иконка интерфейсного размера; раскрытое состояние — чернила и рамка, без заливки ── */
.ch-btn .ch-icon { width: 1.125rem; height: 1.125rem; }
.ch-btn .ch-icon.ch-disclosure__chev { width: var(--icon-sm); height: var(--icon-sm); }
.ch-btn[aria-expanded="true"] { color: var(--ink); }
.ch-btn--quiet[aria-expanded="true"] { border-color: var(--line-control); }
/* Квадратная кнопка с одной иконкой: стрелки и крестик в шапке модалки */
.ch-btn--icon { width: var(--control); padding: 0; }
.ch-btn:disabled, .ch-btn:disabled:hover { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); background: transparent; cursor: default; }

/* ── Переключатель: квадратный, без заливки дорожки — заливка остаётся только у отправки ── */
.ch-switch {
  display: inline-flex; align-items: center; gap: var(--space-2);
  padding: 0; border: 0; background: none; cursor: pointer;
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted);
}
.ch-switch:hover { color: var(--ink); }
/* Выключенный переключатель: слово и дорожка тише, нажать нельзя */
.ch-switch:is(:disabled, [aria-disabled="true"]), .ch-switch:is(:disabled, [aria-disabled="true"]):is(:hover, [aria-checked="true"]) { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
.ch-switch:disabled .ch-switch__track, .ch-switch[aria-disabled="true"] .ch-switch__track { border-color: var(--line-control); }
.ch-switch:disabled .ch-switch__track::after, .ch-switch[aria-disabled="true"] .ch-switch__track::after { background: var(--line-control); }
.ch-switch__track {
  position: relative; width: 1.625rem; height: 0.875rem; flex: none;
  border: var(--hairline) solid var(--ink-muted); border-radius: var(--radius-sm);
  transition: border-color .15s;
}
.ch-switch__track::after {
  content: ""; position: absolute; top: 0.125rem; left: 0.125rem; width: 0.5rem; height: 0.5rem;
  border-radius: var(--radius-sm); background: var(--ink-muted);
  transition: transform .15s var(--ease), background-color .15s;
}
.ch-switch[aria-checked="true"] { color: var(--ink); }
.ch-switch[aria-checked="true"] .ch-switch__track { border-color: var(--ink); }
.ch-switch[aria-checked="true"] .ch-switch__track::after { transform: translateX(0.75rem); background: var(--ink); }

/* ── Поиск: в покое — иконка и подсказка, рамка появляется только при вводе ── */
.ch-search {
  display: inline-flex; align-items: center; gap: var(--space-2);
  height: var(--control); padding: 0 var(--space-3);
  border: var(--hairline) solid transparent; border-radius: var(--radius); color: var(--ink-muted);
}
.ch-search:hover { color: var(--ink-muted); }
.ch-search:has(.ch-search__input:disabled), .ch-search:has(.ch-search__input:disabled):hover, .ch-search__input:disabled::placeholder { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
.ch-search:focus-within { border-color: var(--ink-muted); background: var(--field); color: var(--ink-muted); }
.ch-search .ch-icon { width: 1.125rem; height: 1.125rem; }
.ch-search__input {
  width: 10.5rem; min-width: 0; border: 0; outline: 0; background: none; padding: 0;
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink);
}
.ch-search__input::placeholder { color: var(--ink-muted); opacity: 1; }
.ch-search__input::-webkit-search-cancel-button { display: none; }
/* Активный запрос — акцентом и в рамке, даже без фокуса: лента отфильтрована, и это видно; крестик сбрасывает запрос */
.ch-search:has(.ch-search__input:not(:placeholder-shown)) { border-color: var(--accent); color: var(--accent); }
.ch-search:has(.ch-search__input:not(:placeholder-shown)) .ch-search__input { color: var(--accent); }
.ch-search__clear {
  display: grid; place-items: center; width: 1.125rem; height: 1.125rem; margin-right: calc(var(--space-1) * -1);
  padding: 0; border: 0; border-radius: var(--radius-sm); background: none; color: inherit; cursor: pointer;
}
.ch-search__clear .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }

/* ── Выпадающая панель и список вариантов: бумага, волосяная рамка и одна мягкая тень (--float-lift) — панель плавает над
      страницей и не сливается с бумагой под ней (владелец, 3 ноября 2026). Длинная прокручивается сама, страницу под собой
      не тянет (overscroll-behavior) ── */
.ch-pop { position: relative; display: inline-flex; }
.ch-menu {
  position: absolute; top: calc(100% + var(--space-1)); left: 0; z-index: 30;
  min-width: 12.5rem; max-height: min(26.25rem, 70vh); overflow: auto; overscroll-behavior: contain;
  padding: var(--space-2); display: grid; gap: var(--space-1);
  background: var(--paper); border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  box-shadow: var(--float-lift);
}
.ch-menu--end { left: auto; right: 0; }
/* Меню и панель, которые ставит у кнопки скрипт (а не .ch-pop): место задаёт он, слой — над модалкой.
   Место до края окна скрипт может назвать в --float-room: длинная панель (фильтр рабочего списка) не выше его */
.ch-menu--float { position: relative; top: auto; left: auto; z-index: 70; }
.ch-menu__group { padding: var(--space-2) var(--space-2) var(--space-1); }
.ch-menu__item {
  display: flex; align-items: center; gap: var(--space-2); width: 100%;
  min-height: 1.875rem; padding: 0 var(--space-2); border: 0; border-radius: var(--radius-sm);
  background: none; text-align: left; cursor: pointer;
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink);
}
.ch-menu__item:hover { background: var(--wash); }
.ch-menu__item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.ch-menu__item .ch-icon { width: var(--icon-sm); height: var(--icon-sm); margin-left: auto; visibility: hidden; }
.ch-menu__item[aria-pressed="true"] .ch-icon { visibility: visible; }
/* Пункт-флажок и пункт-выбор меню, которое ставит скрипт (role=menuitemcheckbox / menuitemradio): отметка — та же галочка */
.ch-menu__item[aria-checked="true"] .ch-icon { visibility: visible; }
/* Пункт с пояснением: слово и под ним строка — что пункт сделает или почему он недоступен; панель с пояснениями не шире 320px */
.ch-menu__item:has(> .ch-menu__text) { align-items: flex-start; padding-block: var(--space-1); }
/* Отметка пункта с пояснением («Custom range…» и под ним выбранный период) — на строке слова, не над ней */
.ch-menu__item:has(> .ch-menu__text) > .ch-icon { margin-top: calc((var(--leading-ui) - var(--icon-sm)) / 2); }
.ch-menu__text { display: grid; gap: var(--space-1); min-width: 0; }
.ch-menu__note { font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--ink-muted); white-space: normal; text-wrap: pretty; }
.ch-menu:has(.ch-menu__note) { width: max-content; max-width: 20rem; }
/* Недоступный пункт: слово тише, без подложки; в Tab-порядке он остаётся, чтобы его причину было слышно */
.ch-menu__item:is(:disabled, [aria-disabled="true"]) { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
.ch-menu__item:is(:disabled, [aria-disabled="true"]):hover { background: none; }
/* Группа пунктов (role=group): тот же шаг, что между пунктами панели, — и там, где пункты стоят без панели вокруг
   (список палитры команд в теле окна) */
.ch-menu [role="group"], [role="group"]:has(> .ch-menu__item) { display: grid; gap: var(--space-1); }
.ch-menu__foot { display: flex; justify-content: flex-end; padding: var(--space-2) var(--space-2) var(--space-1); border-top: var(--hairline) solid var(--line); margin-top: var(--space-1); }

/* ── Флажок: рамка и галочка чернилами, без заливки ── */
.ch-check { display: flex; align-items: center; gap: var(--space-2); min-height: 1.875rem; padding: 0 var(--space-2); border-radius: var(--radius-sm); cursor: pointer; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); white-space: nowrap; }
.ch-check:hover { background: var(--wash); }
.ch-check:hover .ch-check__count { color: var(--ink-muted); }
.ch-check input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ch-check__box { width: 1rem; height: 1rem; flex: none; display: grid; place-items: center; border: var(--hairline) solid var(--ink-muted); border-radius: var(--radius-sm); color: var(--ink); }
.ch-check__box .ch-icon { width: var(--icon-sm); height: var(--icon-sm); visibility: hidden; }
.ch-check input:checked + .ch-check__box { border-color: var(--ink); }
.ch-check input:checked + .ch-check__box .ch-icon { visibility: visible; }
.ch-check input:focus-visible + .ch-check__box { outline: 2px solid var(--accent); outline-offset: 2px; }
.ch-check__count { margin-left: auto; padding-left: var(--space-4); }
/* Флажок с пояснением: слово и строка под ним, что флажок делает; длинные слова переносятся, рамка — на первой строке */
.ch-check:has(> .ch-check__text) { align-items: flex-start; padding-block: var(--space-1); white-space: normal; }
.ch-check:has(> .ch-check__text) .ch-check__box { margin-top: calc((var(--leading-ui) - 1rem) / 2); }
.ch-check__text { display: grid; gap: var(--space-1); min-width: 0; }
.ch-check__desc { font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--ink-muted); }
.ch-check--wrap { white-space: normal; }
/* Выключенный флажок: слово и рамка тише, нажать нельзя — как выключенный переключатель */
.ch-check:has(input:disabled) { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: not-allowed; }
.ch-check:has(input:disabled):hover { background: none; }
.ch-check input:disabled + .ch-check__box, .ch-check input:disabled:checked + .ch-check__box { border-color: var(--line-control); color: color-mix(in srgb, var(--ink-muted) 55%, transparent); }

/* ── Чип активного фильтра: снимается нажатием ── */
.ch-chip {
  display: inline-flex; align-items: center; gap: var(--space-1);
  height: 1.625rem; padding: 0 var(--space-1) 0 var(--space-2);
  border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  background: none; cursor: pointer; font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink);
}
.ch-chip:hover { background: var(--wash); }
.ch-chip .ch-icon { width: var(--icon-sm); height: var(--icon-sm); color: var(--ink-muted); }

/* ── Значок сайта: его фавикон — единственный чужой цвет в интерфейсе вместе со скриншотами;
      без фавикона — монограмма рамкой, как аватар, без заливки.
      Размер значка — свой, и сброс продукта его не сжимает (max-width: none; система 0.65.1, CHI-1712): у картинки с
      max-width: 100% (Tailwind preflight) браузер не считает её ширину, когда меряет наименьшую ширину столбца таблицы, — столбец
      выходил на значок уже, и имя рядом рвалось посреди слова («Ap / p / Store», «Austr / alia») вместо того, чтобы таблица
      прокручивалась в своей рамке. Так же у флага (ch-flag) ── */
.ch-tile {
  width: 1.125rem; height: 1.125rem; max-width: none; flex: none; display: inline-grid; place-items: center;
  border: var(--hairline) solid var(--line-control); border-radius: var(--radius-sm); color: var(--ink-muted);
  font: 500 var(--text-meta)/1 var(--font-ui); text-transform: uppercase;
}
.ch-tile--you { border-color: var(--ink); color: var(--ink); }
/* Фавикон на плашке: в тёмной теме тёмные значки не пропадают */
.ch-tile--icon { display: block; padding: 1px; border: 0; background: var(--mark-plate); object-fit: contain; }
/* Свой сайт — без рамки у значка, его выделяет подпись: полужирная, чернилами — в графике, фильтре и источнике карточки */
:is(.ch-bars__label, .ch-check, .ch-finding__src) > .ch-tile--you + span { font-weight: 500; color: var(--ink); }

/* ── Раскрывашка: «Based on 4 findings», свёрнутые убеждения, «Open» у находки ── */
.ch-disclosure > summary { list-style: none; cursor: pointer; }
.ch-disclosure > summary::-webkit-details-marker { display: none; }
.ch-disclosure__chev { width: var(--icon-sm); height: var(--icon-sm); transition: transform .15s var(--ease); }
.ch-disclosure[open] > summary .ch-disclosure__chev,
[aria-expanded="true"] > .ch-disclosure__chev,
[aria-expanded="true"] > .ch-link__end > .ch-disclosure__chev { transform: rotate(180deg); }

/* ── Плитка Скаута: его вывод или совет голосом на плитке цвета холста. Подпись сверху — «Scout · …»,
      13, имя чернилами; под текстом могут стоять действия. Цвет холста здесь значит «говорит Скаут» ── */
/* Плашка голоса агента: шириной того, над чем стоит, как баннер (владелец, 2026-11-05: полэкрана пусто — нет); проза внутри — мерой
   чтения. Плашка — контейнер: от 840 её действия встают у правого края, на первой строке прозы, как действия баннера */
.ch-plate { position: relative; display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-2); padding: var(--space-4) var(--space-6) var(--space-6); background: var(--plate); border: var(--hairline) solid var(--plate-line); border-radius: var(--radius); container-type: inline-size; justify-self: stretch; }
/* Плашку, которую можно закрыть (первое чтение над лентой), закрывает крестик в её правом верхнем углу (ch-plate__close),
   тихая кнопка 28; строка автора не заходит под него */
.ch-plate__close { position: absolute; top: var(--space-3); right: var(--space-3); width: 1.75rem; min-height: 1.75rem; }
.ch-plate:has(> .ch-plate__close) > .ch-plate__by { padding-right: var(--space-8); }
.ch-plate > .ch-voice { max-width: var(--measure); }
.ch-plate__by { margin: 0; font: 500 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }
.ch-plate__by b { font-weight: 500; color: var(--ink); }
.ch-plate > .ch-actions { margin-top: var(--space-2); }
@container (min-width: 52.5rem) {
  .ch-plate > :not(.ch-actions) { grid-column: 1; }
  .ch-plate > .ch-voice + .ch-actions { grid-column: 2; grid-row: 2; flex-wrap: nowrap; justify-content: flex-end; align-self: start; margin: calc((var(--leading-voice) - var(--control)) / 2) 0 0 var(--space-6); }
}

/* ── Поднятый слой (ch-raised; владелец, 2026-11-07, сужен 2026-11-08): объект, вставленный в поток, — убеждение в разговоре,
      фигура в ответе, карточка на доске. Заливка говорит о слое, а не о важности. Что стоит на своём постоянном месте страницы —
      фигура в колонке, в рейке, в разделе — лежит на бумаге без подложки: вставка ли это, решает место, а не форма.
      Значение — от грунта: на бумаге — тон плашки ленты (--raised = feed-plate, 1.05 : 1 под бумагой), так вставка на бумажной
      странице и находки — один материал, и заготовка в ней — как на плашке; на холсте — полшага от холста к бумаге (--raised-canvas):
      грунт-холст объявляет его здесь со своими волоском, наведением, заготовкой и пульсом — приложение-холст (разговор)
      и дорожка доски (плашка агента с 2026-11-10 — белая, своя поверхность --plate). Текстовые структуры — таблица, ряд чисел, сводка колонками,
      детали — остаются без подложки. Внутри — свои волосок, ушедшее, наведение и заготовка: на тёмном поднятом общий line
      пропадал бы (1.15), ушедшее падало бы под 4.7, заготовка (wash) таяла бы — у каждого свой тон.
      Грунт графика (--chart-ground) — сам поднятый: доли акцента своей строки смешиваются с ним, а не с бумагой.
      Поля — у того, что поднято, и за колонку оно не выступает: лист в разговоре и фигура в ответе стоят вровень с колонкой ── */
.ch-app--canvas, .bl-group {
  --raised: var(--raised-canvas); --raised-line: var(--raised-canvas-line); --raised-hover: var(--raised-canvas-hover);
  --raised-wash: var(--raised-canvas-wash); --raised-skeleton: var(--raised-canvas-wash); --raised-pulse: ch-pulse;
}
.ch-raised {
  --line: var(--raised-line); --ink-gone: var(--raised-gone); --hover-row: var(--raised-hover); --wash: var(--raised-wash);
  --chart-ground: var(--raised);
  background: var(--raised); border-radius: var(--radius);
}
/* Фигура, вставленная в поток (в ответе): заголовок и легенда фигуры — внутри панели. Фигура на своём месте страницы —
   ch-chart без ch-raised: на бумаге, по краям своей колонки */
.ch-chart.ch-raised { padding: var(--space-4) var(--card-pad) var(--space-6); }

/* ── Кликабельная строка или карточка: открывается кликом в любом месте. Наведение — подложка под всей строкой:
      выступает за колонку на поля карточки и лежит под текстом, ничего не сдвигается. Выбранная строка (aria-current) — с той же подложкой.
      --card — для карточки на своей подложке (доска убеждений): вместо заливки за краями темнеет рамка по её краю ── */
.ch-clickable { position: relative; isolation: isolate; cursor: pointer; }
.ch-clickable::before {
  content: ""; position: absolute; z-index: -1; inset: 0 calc(var(--card-pad) * -1);
  border-radius: var(--radius); background: var(--hover-row); opacity: 0; transition: opacity .12s;
}
.ch-clickable:hover::before, .ch-clickable[aria-current="true"]::before { opacity: 1; }
/* Карточка — свой слой (isolation: подложка лежит под её словами), и всё, что в ней, — внутри него: открытое меню «···» карточки
   уходило под следующую карточку, которая рисуется позже. Карточка, где что-то раскрыто (кнопка меню с aria-expanded), встаёт над
   соседями. Панель, которую ставит скрипт поверх страницы (ch-menu--float в портале), этого не требует */
.ch-clickable:has([aria-expanded="true"]) { z-index: 1; }
.ch-clickable--card::before { inset: 0; background: none; box-shadow: inset 0 0 0 var(--hairline) var(--line-control); }

/* ── Пустое состояние: одна фраза, что здесь будет, и при необходимости кнопка, которая это исправит.
      В списке ch-list линий вокруг нет ── */
.ch-empty { display: grid; gap: var(--space-3); justify-items: start; padding: var(--space-6) 0; }
.ch-empty > p { margin: 0; max-width: var(--measure); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.ch-list > li.ch-empty { border-bottom: 0; }
.ch-list:has(> .ch-empty:only-child) { border-top: 0; }

/* ── Лента находок: три плотности — строка рутины, карточка, крупная карточка; список — тот же ch-list,
      в ленте находок — на плашках (ch-list--feed, ниже) ── */
.ch-day { display: flex; align-items: baseline; gap: var(--space-2); padding: var(--space-8) 0 var(--space-3); margin: 0; }
.ch-day:first-child { padding-top: 0; }

.ch-finding {
  display: grid; grid-template-columns: 1.125rem minmax(0, 1fr) auto; column-gap: var(--space-3);
  align-items: baseline; padding: var(--space-3) 0;
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted);
}
.ch-finding > .ch-tile { align-self: start; margin-top: calc((var(--leading-ui) - 1.125rem) / 2); }
.ch-finding > .ch-mark { align-self: start; justify-self: center; margin-top: calc((var(--leading-ui) - 0.75rem) / 2); }
.ch-finding__site { color: var(--ink); font-weight: 500; }
.ch-finding__time { white-space: nowrap; }

.ch-finding--card { grid-template-columns: var(--thumb-sm) minmax(0, 1fr); column-gap: var(--space-4); align-items: start; padding: var(--space-4) 0; }
/* Три плотности на три уровня: major и critical — крупная карточка со скриншотом на 28% крупнее обычного, заголовком 15/24
   и залитым тегом важности; заметные — карточкой; рутина — строкой. Заливка говорит о слое, а не о важности (владелец, 2026-11-07:
   белая ушла из-под важной к поднятому слою, ch-raised): важная лежит на плашке (--feed-plate), как заметная, — в ленте и вне её.
   В ленте находок (ch-list--feed) заметная и рутина лежат на плашках, вне её — на бумаге с разделителями.
   Плашка выступает за колонку на свои поля: текст внутри стоит по той же линии, что и у строк вокруг */
.ch-finding--major {
  grid-template-columns: var(--thumb-lg) minmax(0, 1fr);
  margin: var(--space-2) calc(var(--card-pad) * -1); padding: var(--card-pad);
  background: var(--feed-plate); border-radius: var(--radius); column-gap: var(--card-pad);
}
.ch-list > li.ch-finding--major { border-bottom-color: transparent; }
/* Подложка наведения у карточки на плашке — по её краям и ступенью глубже плашки (--feed-plate-hover): hover-row в светлой
   теме того же тона, что плашка, и пропал бы */
.ch-finding--major::before { inset: 0; border-radius: inherit; background: var(--feed-plate-hover); }

/* ── Лента находок на плашках (ch-list--feed; владелец, 3 ноября 2026, CHI-1584). Лента читалась таблицей — волосок под каждой
      строкой; теперь линий между находками нет. Подряд идущая рутина дня лежит на одной общей плашке (--feed-plate), без линий
      внутри; заметная находка — на своей, важная и критическая — тоже (с 2026-11-07; прежде — белая карточка). Между плашками —
      щель бумаги в 4, не линия. Плашка стоит в колонке (владелец, 2026-11-10), слова в ней — на поле карточки (--card-pad)
      от её края. Событие убеждения (ch-finding со знаком статуса, не кликабельное) — строка, как рутина: встаёт в серию, где стоит.
      Список — один на день, как прежде (читалка считает находки дня); края серии находят соседние селекторы, своих классов у
      строк нет. :has() — только отдельным правилом, никогда в списке селекторов: сборка продукта (Lightning CSS) такой список
      теряет (CHI-365). Другие списки с ch-finding и ch-list (загрузка, дела, убеждения) не меняются ── */
.ch-list--feed { border-top: 0; }
.ch-list--feed > li { border-bottom: 0; }
/* Строка рутины, событие убеждения и карточка — на плашке; плашка стоит в колонке, её края — края колонки (владелец, 2026-11-10:
   плашки, выступавшие за колонку, торчали из-под шапки и плитки Chimera), слова отступают внутрь на поле карточки */
.ch-list--feed > .ch-finding {
  margin-inline: 0; padding-inline: var(--card-pad); background: var(--feed-plate);
}
/* Карточка — своя плашка: скруглена целиком и отступает от соседей на щель бумаги; у важной — та же щель,
   а не её 8 сверху и снизу вне ленты */
.ch-list--feed > .ch-finding--card { border-radius: var(--radius); }
.ch-list--feed > .ch-finding--major { margin-block: 0; }
.ch-list--feed > li + .ch-finding--card, .ch-list--feed > .ch-finding--card + li { margin-top: var(--space-1); }
/* Серия строк — одна плашка: скруглены только её верх (первая строка дня или первая после карточки) и низ (последняя строка
   дня или последняя перед карточкой). Углы — по отдельности: строка может быть и первой, и последней серии */
.ch-list--feed > .ch-finding:not(.ch-finding--card):first-child,
.ch-list--feed > .ch-finding--card + .ch-finding:not(.ch-finding--card) {
  border-top-left-radius: var(--radius); border-top-right-radius: var(--radius);
}
.ch-list--feed > .ch-finding:not(.ch-finding--card):last-child {
  border-bottom-left-radius: var(--radius); border-bottom-right-radius: var(--radius);
}
.ch-list--feed > .ch-finding:not(.ch-finding--card):has(+ .ch-finding--card) {
  border-bottom-left-radius: var(--radius); border-bottom-right-radius: var(--radius);
}
/* Наведение и выбор на плашке — ступенью глубже (--feed-plate-hover; подложка hover-row того же тона, что плашка, пропала бы),
   ровно по краям строки или карточки и с их углами: внутри серии — полосой от края до края плашки, у края серии — с её скруглением.
   Метаданные (время, строка источника) остаются ink-muted — на этой ступени 5.34 : 1. Важная карточка — так же */
.ch-list--feed > .ch-finding::before { inset: 0; border-radius: inherit; background: var(--feed-plate-hover); }
/* Любая находка — и карточка, и строка рутины — кликабельна целиком (ch-clickable) и открывает модалку.
   При наведении заголовок без подчёркивания, «Open» подчёркивается, текст рутины темнеет */
.ch-finding[data-id]:hover .ch-finding__text { color: var(--ink); }
.ch-finding[data-id]:hover .ch-link[data-open] { text-decoration: underline; text-underline-offset: 4px; }
/* Текст строки рутины — кнопка: с клавиатуры она открывает ту же модалку */
.ch-finding__text { padding: 0; border: 0; background: none; font: inherit; color: inherit; text-align: left; cursor: pointer; }
/* Текст карточки — по углам: заголовок и время сверху, источник и «Open» прижаты к низу скриншота.
   Каркас один у всех карточек, какой бы длины ни был заголовок, — сетка событий держится ровно.
   Заголовок уступает место времени: слово длиннее строки рвётся, а не выталкивает время за край телефона; время — одной строкой */
.ch-finding__body { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; align-self: stretch; }
.ch-finding__top { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-4); }
.ch-finding__title { min-width: 0; margin: 0; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-wrap: pretty; overflow-wrap: anywhere; }
.ch-finding--major .ch-finding__title { font-size: var(--text-body); line-height: var(--leading-body); }
/* Важная карточка в узкой колонке (телефон: колонка до 400px): время уходит строкой под заголовок, и заголовок берёт всю
   колонку текста — на телефоне 360 при L 139px вместо 81 (в окне той же ширины с полосой прокрутки в 15px — 124), обычные
   слова («compliance», «Enterprise») больше не рвутся. Скриншот и залитый тег важности — как были; заметная карточка и
   колонка шире не меняются: до 400 доходит только телефон (при S — окно до 448, при L — до 504), планшет и ноутбук — нет.
   Колонка — ближайший контейнер (рамка страницы fd или fp), а не окно.
   Русское длинное слово заголовка или источника («высокопроизводительные», «Позиционирование») в узкой колонке переносится
   по слогам с дефисом, а не рвётся на любой букве: hyphens по языку страницы (lang="ru" на <html>), и только слова от 12 букв —
   обычные («собственные», «зарплат») остаются целыми. Английские слова — как были: перенос по слогам рвал бы и обычные
   («requirem-ents»), а им хватает строки */
/* С CHI-1730 (2026-11-10) так же и заметная карточка, и скриншот в такой колонке меньше — снимок строки опоры убеждения (--ev-shot,
   72 при S; у важной — в полтора раза, 108: уже в колонке не встал бы её тег «▲ Критичная», 99 при S): на телефоне 390 при L заголовку заметной оставалось 137 px и 6–7 строк рядом со скриншотом
   в 120 и временем справа. Скриншот остаётся сбоку — сверху он сделал бы карточку на телефоне вдвое выше */
@container (max-width: 25rem) {
  .ch-finding--card { grid-template-columns: var(--ev-shot) minmax(0, 1fr); }
  .ch-finding--major { grid-template-columns: calc(var(--ev-shot) * 1.5) minmax(0, 1fr); }
  .ch-finding--card .ch-finding__top { flex-direction: column; align-items: flex-start; gap: var(--space-1); }
  :is(.ch-finding__title, .ch-finding__src):lang(ru) { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 12 4 4; }
}
/* Вывод Скаута — голосом, но мельче заголовка карточки: заголовок главнее */
.ch-finding__summary { max-width: var(--measure); font-size: var(--text-voice-sm); line-height: var(--leading-voice-sm); }
/* Защитный отступ описания от нижней строки — на ступень больше, чем от заголовка: плотный абзац иначе прилипает к источнику */
.ch-finding__summary { margin-bottom: var(--space-2); }
.ch-finding__summary p { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
/* Вывод, который пишет шаблон кода, а не Скаут (находка реестра: фраза каталога), — без голоса, интерфейсным шрифтом на
   кегле ui (RULES → Type) */
.ch-finding__summary:not(.ch-voice) { font-size: var(--text-ui); line-height: var(--leading-ui); }
/* Источник и «Open» — в строку, пока помещаются; тесно (карточка на телефоне; важная при M и L наезжала «Open» на слова
   источника) — «Open» уходит строкой под источник, к началу строки, а источник не дробится рядом с ним на две-четыре строки */
.ch-finding__foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-1) var(--space-4); margin-top: auto; }
/* Значок сайта — у первой строки источника: слова, которым тесно и в своей строке (важная карточка на 360 при L), переносятся от начала
   своей строки, а знак не съезжает на середину двух строк. Слова встают на середину значка отступом сверху, поэтому строка
   в одну строку — та же, что была по центру */
.ch-finding__src { display: inline-flex; align-items: flex-start; gap: var(--space-2); min-width: 0; }
/* Слово длиннее строки («Позиционирование» на 360 при L) рвётся у края карточки, а не выходит за её заливку; по-русски в узкой
   колонке — по слогам, как заголовок */
.ch-finding__src > .ch-tile + * { margin-top: calc((1.125rem - var(--leading-meta)) / 2); min-width: 0; overflow-wrap: anywhere; }

/* Колонка скриншота тянется на высоту карточки: скриншоты одного размера, а важность стоит внизу колонки,
   на одной линии со строкой источника. Заголовок — вровень с верхом скриншота */
.ch-finding__shot { align-self: stretch; display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-2); }

/* Важность — внизу колонки со скриншотом, на одной линии со строкой бренда и типа: видна при беглом просмотре и держит симметрию.
   Тег (владелец, 2026-11-07): залит тёмной ступенью графиков (--severity — значение chart-major, той ступени, которой Major
   и critical стоят на графиках находок по уровню), значок и слово — бумагой (--on-severity), 8.98 : 1; в тёмной теме — светлая
   ступень с чернилами светлой темы. Цвета у важности нет — это ступень тона. Без рамки, не фокусируется, не нажимается: по форме —
   метка (radius-sm, 20 высотой), не кнопка (34) и не фильтр (ch-chip с рамкой). △ Major — контурный треугольник, ▲ Critical — залитый */
.ch-severity {
  display: inline-flex; align-items: center; gap: 0.375rem; min-height: 1.25rem; padding: 1px var(--space-2) 1px 0.375rem;
  border-radius: var(--radius-sm); background: var(--severity); color: var(--on-severity); white-space: nowrap;
  font: 500 var(--text-label)/var(--leading-label) var(--font-ui);
}
.ch-severity > .ch-mark { color: inherit; }
/* Под скриншотом — у низа колонки: низ тега на линии низа строки источника */
.ch-finding__shot > .ch-severity { margin-block: auto 1px; }

.ch-thumb { display: block; width: 100%; height: auto; aspect-ratio: 3 / 2; border: var(--hairline) solid var(--line); border-radius: var(--radius-sm); background: var(--field); }
img.ch-thumb { object-fit: cover; object-position: top; }
/* Без скриншота в той же рамке — рисунок предмета находки (thumbs.js, предмет по таблице RULES.md). Объём — свой у рисунка,
   единственное исключение из «без объёма»: изометрия на тёплой лестнице из четырёх ступеней и один отмеченный предмет — то,
   о чём находка (тёмный в светлой теме, белый в тёмной). Классы ролей — буквальными селекторами, чтобы продукт видел их в chimera.css */
.ch-thumb .th-1 { fill: var(--drawing-1); }
.ch-thumb .th-2 { fill: var(--drawing-2); }
.ch-thumb .th-3 { fill: var(--drawing-3); }
.ch-thumb .th-4 { fill: var(--drawing-4); }
.ch-thumb .th-m1 { fill: var(--drawing-mark-1); }
.ch-thumb .th-m2 { fill: var(--drawing-mark-2); }
.ch-thumb .th-m3 { fill: var(--drawing-mark-3); }
.ch-thumb .th-line { fill: none; stroke: var(--drawing-4); stroke-linecap: round; stroke-linejoin: round; }
/* Off the plate (is-shelf): the figure alone on the canvas, for a page that shows drawings as objects on a shelf rather
   than tiles in a feed (a landing's "what it reads"). No frame and no fill; the svg's viewBox is the figure's own box
   (thumbs.json → boxes) and its size that box at --thumb-k px a unit, 1.4667 by default: a 160px tile's scale and a
   tenth more, since the plate's margins are gone; a page sets --thumb-k for a narrower column. Every box is 66 units
   tall, so a row of figures stands on one line, and each stands where its words start. On the light canvas the ramp
   starts a step darker (--drawing-canvas-*): the plate's lightest face is lighter than the canvas itself. */
.ch-thumb.is-shelf { --thumb-k: 1.4667; --thumb-u: 1rem; width: calc(var(--fw, 120) * var(--thumb-k) * var(--thumb-u) / 16); height: calc(var(--fh, 80) * var(--thumb-k) * var(--thumb-u) / 16); aspect-ratio: auto; border: 0; border-radius: 0; background: none; }
.ch-thumb.is-shelf .th-1 { fill: var(--drawing-canvas-1); }
.ch-thumb.is-shelf .th-2 { fill: var(--drawing-canvas-2); }
.ch-thumb.is-shelf .th-3 { fill: var(--drawing-canvas-3); }
.ch-thumb.is-shelf .th-4 { fill: var(--drawing-canvas-4); }
.ch-thumb.is-shelf .th-line { stroke: var(--drawing-canvas-4); }
/* The market's field under a site scene (iso.Scene.field, the site's set only): dots on the scene's ground at rest, the canvas's
   lightest tone on the plate and on the shelf alike. The wave — darker dots and the month by --d — is the page's own motion
   and stays out of the system; d-month is a group and takes no fill. Never under a finding's drawing. */
.ch-thumb .d-dot { fill: var(--drawing-canvas-1); }
/* Marked faces in the accent (is-accent): for the site, where the accent is the page's one colour beside ink, the subject's
   own faces take it — th-m1…3 from --drawing-mark-accent-*, the ramp and the line as they are; composes with is-shelf.
   Never in a feed, the dialog or a finding's page: there the mark says "this is the subject", in ink. */
.ch-thumb.is-accent .th-m1 { fill: var(--drawing-mark-accent-1); }
.ch-thumb.is-accent .th-m2 { fill: var(--drawing-mark-accent-2); }
.ch-thumb.is-accent .th-m3 { fill: var(--drawing-mark-accent-3); }

/* ── Чтение источника: OK — зелёная точка, как «агент работает»; Failing — красный знак, как сбой чтения.
      На странице конкурентов — у каждого сайта, на странице конкурента — у каждого источника ── */
/* Слова — на базовой линии строки, знак — по центру строки слов: у знака своей базовой линии нет, и первым элементом флекса
   он отдавал бы её — низ точки или круга — всей метке, так что в предложении («…and your site ⓘ 2 failing») красные слова
   вставали бы выше серых, а строка вырастала. Перед меткой — пробел текста и ничего больше: он и gap после знака дают
   одинаковый просвет по обе стороны знака */
.ch-ok { display: inline-flex; align-items: baseline; gap: var(--space-2); color: var(--ink-muted); white-space: nowrap; }
.ch-ok > .ch-dot { align-self: center; }
.ch-failing { display: inline-flex; align-items: baseline; gap: var(--space-1); color: var(--alert); font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); white-space: nowrap; }
.ch-failing .ch-icon { width: var(--icon-sm); height: var(--icon-sm); align-self: center; }
/* Сбой предложением: переносится, знак — на первой строке */
.ch-failing--wrap { white-space: normal; align-items: baseline; }
.ch-failing--wrap > .ch-icon { align-self: flex-start; margin-top: calc((var(--leading-ui) - var(--icon-sm)) / 2); }
/* Сбой с пояснением: знак сбоя сам — знак пояснения (ch-info ch-info--alert), второго «i» рядом нет (владелец, 2026-11-05: «по 2
   иконки, должна остаться одна красная»). Кнопка 20 в ширину, знак 14 — поля по 3 уходят в отрицательный отступ, так что знак и слово
   стоят там же, где у сбоя без пояснения. Цвет — красный и под указателем: подложка wash говорит, что знак нажимается */
.ch-failing > .ch-info--alert { align-self: center; margin: 0 calc((var(--icon-sm) - 1.25rem) / 2); color: inherit; }
.ch-failing > .ch-info--alert:is(:hover, [data-open]) { color: inherit; }
.ch-failing--wrap > .ch-info--alert { align-self: flex-start; }

/* ── Строка-опора (ch-ev): значок, слова, мета. Чужие страницы — досье новостей и подтверждения находки, пресса, источники —
      стоят так: значок сайта, слова ссылкой, дата в своей колонке ── */
.ch-ev { margin-top: var(--space-1); }
.ch-ev > li {
  display: grid; grid-template-columns: 1.125rem minmax(0, 1fr) auto; column-gap: var(--space-3); align-items: baseline;
  padding: var(--space-3) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink);
}
.ch-ev > li > .ch-tile { align-self: start; margin-top: calc((var(--leading-ui) - 1.125rem) / 2); }
.ch-ev__text { display: grid; gap: var(--space-1); min-width: 0; overflow-wrap: anywhere; }
.ch-ev__text > a { color: inherit; text-decoration: none; }
.ch-ev__text > a:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
/* Пояснение Скаута к опоре — голосом, мельче её заголовка: только там, где оно и есть довод документа (оба Against it) */
.ch-ev__sum { margin: 0; font: 400 var(--text-voice-sm)/var(--leading-voice-sm) var(--font-voice); color: var(--ink-muted); }
.ch-ev__when { white-space: nowrap; }
/* Мелкие слова под словами чужой страницы (вид, «2 pages») — строкой меты */
.ch-ev__tags { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); }
/* Находка, на которую опирается текст, — одна строка везде (владелец, 2026-11-11): заголовок, под ним строка фактов
   (ui.js findingLine) — уровень только у важной и критичной (ch-severity), фавикон 14 и страница перемены
   («yunojuno.com/designers», у главной — домен), за ними слова строки («from page history», «unconfirmed», ch-ev__word) —
   отдельной метой через промежуток, без точки (ch-facts выведен, Legibility); дата — на этой строке у правого края, по её
   базовой линии (ch-ev__line; владелец, 2026-11-05). Сайт — всегда одна строка: не влезает — страница кончается многоточием;
   слова и дата остаются целыми; не влезают уровень или слова — они переносятся (ch-ev__facts), дата остаётся у края на
   последней строке. Слева — по правилу:
   · сноска под текстом (ch-ev--cite: утверждение дела, ответ на вопрос) — ничего: заголовок берёт всю ширину, текст над ней
     говорит, что значат находки, и пояснения Скаута у сноски нет;
   · опора документа убеждения (ch-ev--shots: What it rests on, оба Against it) — снимок находки, 72 при S, 3 : 2, как превью
     в ленте; без снимка — рисунок её предмета (ch-thumb из thumbs.json); у ушедшей находки («A finding it rested on») ячейка
     пустая. Документ убеждения иначе — один текст, а снимки — то место, откуда приходит собственный цвет конкурента (решение
     владельца 2026-11-03). Строка — по центру снимка; на телефоне снимок тот же 72: мельче 48 он не узнаётся как страница.
   Строка фактов и дата стоят по последней базовой линии: дата — на строке сайта и слов, и когда уровень или слова перенеслись */
.ch-ev--cite > li { grid-template-columns: minmax(0, 1fr); }
.ch-ev--shots > li { grid-template-columns: var(--ev-shot) minmax(0, 1fr); column-gap: var(--space-4); align-items: center; }
.ch-ev--shots > li > .ch-thumb { width: var(--ev-shot); }
.ch-ev__line { display: flex; align-items: last baseline; justify-content: space-between; gap: var(--space-4); min-width: 0; }
.ch-ev__line > .ch-ev__when { flex: none; }
.ch-ev__facts { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); min-width: 0; }
.ch-ev__facts > :is(.ch-severity, .ch-ev__word) { flex: none; white-space: nowrap; }
.ch-ev__facts > .ch-ev__site { max-width: 100%; }
.ch-ev__site { display: flex; align-items: flex-start; column-gap: var(--space-1); min-width: 0; white-space: nowrap; }
.ch-ev__site > * { flex: none; }
.ch-ev__site > .ch-tile + span, .ch-ev__site > span:first-child:not(.ch-tile) { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ch-ev__site > .ch-tile { flex: none; width: var(--icon-sm); height: var(--icon-sm); margin-top: calc((var(--leading-meta) - var(--icon-sm)) / 2); }

/* ── Строка списка со значком, двумя строками и действием в конце: значок сайта (или иконка 18) — у первой строки, имя чернилами,
      под ним что с ним — тише, за ними мета; действие — кнопка в рамке на строке имени (одна в строке — в рамке, RULES → Behaviour).
      Поправки словаря в плане видимости; строки из списка Скаута — те же, без действия. Ушедшее стоит на месте, тише, значок —
      вполовину, как в строке ушедшего в таблице ── */
.ch-row { display: grid; grid-template-columns: 1.125rem minmax(0, 1fr) auto; column-gap: var(--space-3); align-items: start; padding: var(--space-3) 0; }
.ch-row > :is(.ch-tile, .ch-icon) { margin-top: calc((var(--leading-ui) - 1.125rem) / 2); }
.ch-row > .ch-icon { color: var(--ink-muted); }
.ch-row > .ch-btn { margin-block: calc((var(--leading-ui) - var(--control)) / 2); }
.ch-row__text { display: grid; gap: var(--space-1); min-width: 0; overflow-wrap: anywhere; }
.ch-row__name { font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.ch-row__line { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.ch-row.is-gone :is(.ch-row__name, .ch-row__line, .ch-meta) { color: var(--ink-gone); }

/* ── Ссылка наружу в строке и в таблице: текст чернилами, при наведении — тонкое подчёркивание, ↗ после последнего слова.
      Длинный адрес переносится по слешам (<wbr>) и дефисам, а внутри слова — только когда слово само не влезает в строку:
      break-word, а не anywhere, поэтому столбец таблицы не сжимается до буквы и не ломает адрес посреди слова.
      Последнее слово адреса (после последнего «/», «-» или «.») и ↗ — в ch-url__end: значок не уходит на строку один ── */
.ch-url { color: var(--ink); text-decoration: none; overflow-wrap: break-word; }
.ch-url__end { white-space: nowrap; }
.ch-url:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.ch-url .ch-icon { width: var(--icon-sm); height: var(--icon-sm); margin-left: var(--space-1); vertical-align: -0.125rem; color: var(--ink-muted); }
/* Профили компании на площадках (LinkedIn, X, G2…): ссылка наружу (ch-url), перед именем — фавикон площадки 14 на плашке, как
   сайт в строке опоры (ch-ev__site); без фавикона — первая буква в рамке значка. Ссылки — в ряд, переносятся целыми */
.ch-profiles { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); }
.ch-profile { white-space: nowrap; }
/* Значок — по середине строки слов: от верха строки, а не от базовой линии (у буквы в рамке она своя, внутри значка) */
.ch-profile > .ch-tile { display: inline-grid; width: var(--icon-sm); height: var(--icon-sm); margin: calc((var(--leading-ui) - var(--icon-sm)) / 2) var(--space-2) 0 0; vertical-align: top; }
/* Профиль, который стоит один на строке, — в столбце сводки (fp-glance__values), в ячейке таблицы и со строкой под ним
   (ch-profile-item): имя длиннее строки («Telegram @mellowinternationalcontractors» в столбце сводки или на телефоне) переносится
   под имя, а не под значок — висячий отступ шириной значка и его промежутка; значок — на первой строке, слово без пробелов рвётся
   у края. В ряду (ch-profiles) ссылки по-прежнему переносятся целыми. В таблице --fixed длинное обрезает многоточие, как было
   (система 0.49.0, с досье конкурента: co-pf-table) */
:is(.fp-glance__values, .ch-table:not(.ch-table--fixed), .ch-profile-item) .ch-profile {
  display: block; width: fit-content; max-width: 100%; white-space: normal; overflow-wrap: anywhere;
  padding-left: calc(var(--icon-sm) + var(--space-2)); text-indent: calc((var(--icon-sm) + var(--space-2)) * -1);
}
:is(.fp-glance__values, .ch-table:not(.ch-table--fixed), .ch-profile-item) .ch-profile > .ch-tile { text-indent: 0; }
/* Профиль и одна строка под ним (ch-profile-item; система 0.49.0, было co-profile): профиль, который видите только вы, —
   «only you» метой и причина за «i» (ch-info), с того края, где начинается имя, а не значок; знак — высотой строки меты, строка
   не растёт. Нового цвета нет: метка серая, причина — знак системы */
.ch-profile-item { display: block; max-width: 100%; }
.ch-profile-item__note {
  display: block; padding-left: calc(var(--icon-sm) + var(--space-2));
  font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--ink-muted);
}
.ch-profile-item__note .ch-info { height: var(--leading-meta); }

/* ── Имя со значком в строке слов (ch-named; дизайнер, 2026-11-04, с досье конкурента): инструмент, магазин, издание, площадка —
      фавикон его сайта на плашке (ch-tile ch-tile--icon), страна — её флаг (ch-flag). Значок 14, по середине строки своей ступени
      (ui; в мете и фактах — меты), 8 до имени (в мете — 4), как у профиля. Имя — в своём span: значок не отрывается от его первого
      слова (между ними переноса нет), а имя длиннее строки («Deel: Global Payroll & HR» в колонке телефона) переносится по словам.
      Строчное: базовая линия — у первой строки слов, так что дверь Show сводки стоит на ней; в ряду значений (ch-values) имя целое, пока
      помещается в строку. Значок стоит от верха строки, а не на базовой линии. В ячейке таблицы имя, которое ведёт строку, —
      ch-table__site ── */
.ch-named { white-space: nowrap; }
.ch-named > span { white-space: normal; }
.ch-named > .ch-tile { display: inline-grid; vertical-align: top; width: var(--icon-sm); height: var(--icon-sm); margin: calc((var(--leading-ui) - var(--icon-sm)) / 2) var(--space-2) 0 0; }
:is(.ch-meta, .ch-facts, .ch-kpis dt) .ch-named > .ch-tile { margin: calc((var(--leading-meta) - var(--icon-sm)) / 2) var(--space-1) 0 0; }
:is(.ch-meta, .ch-facts, .ch-kpis dt) .ch-named > .ch-flag { margin: calc((var(--leading-meta) - 0.75rem) / 2) var(--space-1) 0 0; }

/* ── Флаг страны (ch-flag; владелец, 2026-11-04: флаги рядом с именами стран; вид — дизайнера): второй чужой цвет после фавиконов и
      скриншотов, и только рядом с именем страны, никогда один. Плоский 4 : 3 страны ISO 3166-1 (набор flag-icons, MIT, своими файлами,
      не с CDN): 16 × 12 при S, скругление radius-sm, волосяная линия внутри края — белое поле флага не сливается с бумагой; alt="",
      имя рядом. Не у языка, валюты, региона, ЕС или «Remote», не в статусе, чипе и ряду графика. В списке стран строка нескольких
      стран («In more than 3 countries») или региона («Europe») держит на месте флага глобус (ch-flag--globe; владелец, 2026-11-05,
      CHI-1633): линейный значок i-globe в коробке флага 16 × 12, по её центру, ink-muted, без рамки — не флаг и не чужой цвет.
      Страна без флага и место, которого доска не назвала, держат пустое место (ch-flag--none), чтобы имена стояли в одну линию.
      В подписи полосы (ch-bars__label) — по середине её первой строки ── */
.ch-flag {
  display: inline-block; flex: none; vertical-align: top; width: 1rem; height: 0.75rem; max-width: none; margin: calc((var(--leading-ui) - 0.75rem) / 2) var(--space-2) 0 0;
  border-radius: var(--radius-sm); outline: var(--hairline) solid var(--line); outline-offset: calc(var(--hairline) * -1); object-fit: cover;
}
.ch-flag--none { outline: 0; }
/* Глобус: значок 16 в коробке 12 — круг i-globe с его штрихом занимает ровно 12 по высоте, так что поля значка уходят за коробку */
.ch-flag--globe { outline: 0; color: var(--ink-muted); }
.ch-flag--globe > .ch-icon { display: block; width: 1rem; height: 1rem; margin-top: -0.125rem; }
.ch-bars__label > .ch-flag { margin: calc((var(--leading-label) - 0.75rem) / 2) 0 0; }

/* ── Ряд значений одного вида (ch-values; дизайнер, 2026-11-04): страны с флагами, инструменты и магазины с фавиконами, документы и
      поддомены ссылками наружу, разделы сайта — в строку и переносятся целыми, как профили (ch-profiles); значение длиннее строки
      переносится внутри себя. На сводке (At a glance) ряд показывает четыре, остальное — «and N more» метой последним в ряду
      (ch-values__more); у ряда значений, который сводкой не является, «and 72 more» — строкой меты под рядом; список полос, который
      держит строки, вместо меты открывается дверью (ch-bars__more). Путь раздела — тише, тем же
      шрифтом: моноширинного в системе нет ── */
.ch-values { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-4); margin: 0; }
.ch-values > * { max-width: 100%; }
.ch-values > code { font: inherit; color: var(--ink-muted); }
p.ch-values__more { margin: 0; padding-top: var(--space-2); }

/* ── Чужой текст как его дали: ответ ассистента, ответ, снятый в приложении. Шапка — чей он, пометка метой («example answer,
      1 of 14») и факты (ch-facts); строка о том, что источник сделал до ответа (ch-quote__note: «Searched for “…”», его слова — в q,
      чернилами); сам текст — blockquote за волосяной линией слева, интерфейсным шрифтом и чернилами, без нашего выделения: кого
      он назвал, говорят факты, а не жирный. Не Literata — это не голос Химеры и не агента. Под текстом — сайты, на которые он
      сослался, ссылками наружу (ch-url). Несколько — стопкой ch-quotes на шаге 32 ── */
.ch-quotes { display: grid; gap: var(--space-8); }
.ch-quote { display: grid; gap: var(--space-3); margin: 0; }
.ch-quote__head { display: grid; gap: var(--space-1); }
.ch-quote__who { margin: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-3); font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.ch-quote__who .ch-meta { font-weight: 400; }
.ch-quote__note { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); text-wrap: pretty; overflow-wrap: anywhere; }
.ch-quote__note q { color: var(--ink); }
.ch-quote__text { display: grid; gap: var(--space-2); margin: 0; padding-left: var(--space-4); border-left: var(--hairline) solid var(--line); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); overflow-wrap: anywhere; }
.ch-quote__text p { margin: 0; }
/* Слова записи из ленты конкурента (анонс блога, ADR-0094 D2 продукта) — в окне находки и на её странице, рядом с голосом Scout:
   той же величины, что голос, наклонным Onest (своего курсива у Onest нет, наклон браузера — владелец, 2026-11-10, выбран перед
   курсивом Literata), за линией 2px в акценте. Прямой Onest 14 за волосяной линией у голоса читался ошибкой шрифта */
.ch-quote__text--post { border-left: 2px solid var(--accent); font-size: var(--text-voice); line-height: var(--leading-voice); font-style: italic; font-synthesis: style; }
.ch-quote__text :is(ul, ol) { margin: 0; padding-left: var(--space-6); display: grid; gap: var(--space-1); }
/* Маркеры — свои, не браузера: сброс продукта (ul, ol { list-style: none }) снимал их, как у списка в голосе (.ch-voice ul) */
.ch-quote__text ul { list-style: disc; }
.ch-quote__text ol { list-style: decimal; }
.ch-quote__text li::marker { color: var(--ink-muted); }
.ch-quote__cites { display: grid; gap: var(--space-1); }
.ch-quote__cites ul { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--space-1); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }

/* ── Графики: две ступени одного тона, щель --chart-gap цвета фона, волосяная сетка ── */
.ch-chart { display: grid; gap: var(--space-3); margin: 0; }
.ch-chart__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--space-2) var(--space-4); }
.ch-chart__title { display: grid; gap: var(--space-1); }
.ch-chart__title h2 { margin: 0; }
/* Заголовок графика читается сразу: 15/24 чернилами, как заголовок важной находки; подпись под ним остаётся мелкой */
.ch-chart__head h2 { font: 500 var(--text-body)/var(--leading-body) var(--font-ui); letter-spacing: normal; text-transform: none; color: var(--ink); }   /* заголовок графика — не подпись: строчными, как был */
.ch-legend { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); }
.ch-legend span { display: inline-flex; align-items: center; gap: var(--space-2); }
.ch-legend i, .ch-tip i { width: 0.5rem; height: 0.5rem; border-radius: var(--radius-sm); display: inline-block; flex: none; }
.m-notable { fill: var(--chart-notable); background: var(--chart-notable); }
.m-routine { fill: var(--chart-routine); background: var(--chart-routine); }
/* График находок по уровню: важные и критичные внизу столбца и первыми в полосе, заметные над ними, рутина сверху */
.m-major { fill: var(--chart-major); background: var(--chart-major); }
.m-mid { fill: var(--chart-mid); background: var(--chart-mid); }

.ch-chart__svg { display: block; width: 100%; overflow: visible; }
.ch-chart__svg text { font-family: var(--font-data); font-size: var(--text-meta); fill: var(--ink-muted); font-variant-numeric: tabular-nums; }
.ch-chart__svg .grid { stroke: var(--line); stroke-width: 1; shape-rendering: crispEdges; }
.ch-chart__svg .col { transition: opacity .12s; }
.ch-chart__svg.is-hovering .col:not(.is-active) { opacity: .4; }
/* Столбцы, которые нажимаются (--press): страница сужается до того, что столбец считает, — день, неделю или месяц.
   Каждый столбец — кнопка (g role=button), его зона — вся ячейка (col__hit, под столбцом). Наведение и фокус кладут под
   ячейку подложку строки (hover-row), как у кликабельной строки; фокус обводит ячейку кольцом акцента (col__ring, 2px с
   отступом 2px — его рисует сам svg: outline у элементов svg браузеры рисуют по-разному). Подсказка кончается действием
   (ch-tip__act). График без --press — прежняя картинка: без указателя, подложки и действия */
.ch-chart__svg--press .col { cursor: pointer; }
.ch-chart__svg--press .col:focus { outline: none; }
.ch-chart__svg--press .col__hit { fill: transparent; transition: fill .12s; }
.ch-chart__svg--press .col:is(:hover, .is-active) .col__hit { fill: var(--hover-row); }
.ch-chart__svg--press .col__ring { fill: none; stroke: transparent; stroke-width: 2px; pointer-events: none; }
.ch-chart__svg--press .col:focus-visible .col__ring { stroke: var(--accent); }

/* Полоса — доля дорожки (--share от 0 до 1, пишет скрипт); место под число справа — --bars-value: число, --wide — тысячи, --money — деньги */
.ch-bars { --bars-value: var(--space-8); list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-1); border-radius: var(--radius-sm); }
.ch-bars--wide { --bars-value: var(--space-12); }
.ch-bars--money { --bars-value: var(--space-18); }
.ch-bars__row { display: grid; grid-template-columns: var(--bars-label) minmax(0, 1fr); align-items: center; gap: var(--space-3); min-height: calc(var(--bar) * 2); }
/* Подпись длиннее своей колонки переносится на вторую строку, а не режется многоточием (владелец, 2026-11-07, CHI-1678): у
   пробелов, а слово шире колонки («Unterauftragsverarbeiter») — внутри себя, с переносом по словарю языка страницы, где он
   есть («Unterauftragsver-arbeiter»; слово короче 14 букв не переносится, английское — тоже, как у заголовка находки); после
   второй строки — многоточие, полное имя — в подсказке и скрытой таблице. Значок, флаг и «i» — на первой строке имени; полоса и число — по середине строки, так что
   строка в две строки держит свою полосу посередине, как одна. Имя — простой span подписи (без класса) или ch-named */
.ch-bars__label { display: flex; align-items: flex-start; gap: var(--space-2); min-width: 0; font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); }
.ch-bars__label > :where(span:not([class]), .ch-named) { min-width: 0; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; overflow-wrap: anywhere; white-space: normal; }
.ch-bars__label > :where(span:not([class]), .ch-named):not(:lang(en)) { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 14 6 6; }
.ch-bars__label > .ch-info { flex: none; margin: calc((var(--leading-label) - var(--leading-ui)) / 2) 0 0 calc(var(--space-1) * -1); }
.ch-bars__track { display: flex; align-items: center; gap: var(--space-2); min-width: 0; }
.ch-bars__bar { display: flex; gap: var(--chart-gap); width: calc((100% - var(--bars-value) - var(--space-2)) * var(--share, 0)); height: var(--bar); flex: none; }
.ch-bars__bar--tight { gap: 0; }
.ch-bars__bar > i { display: block; height: 100%; min-width: 0; }
.ch-bars__bar > i:last-child { border-radius: 0 var(--radius-sm) var(--radius-sm) 0; }
.ch-bars__value { color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }  /* число полосы — чернилами, как её подпись */
.ch-bars.is-hovering .ch-bars__row:not(.is-active) .ch-bars__bar { opacity: .4; }
/* Полосы на дорожках (ch-bars--rail; владелец, 2026-11-09, сводка находок: без опоры полосы висели, справа от коротких — пустота).
   У каждой строки дорожка до самой длинной — 35% линии на грунте графика, тише полос и подложки ленты, со скруглением полосы;
   число — колонкой у правого края, а не за концом полосы. Остаток шкалы читается дорожкой, а не дырой. Дорожка — под полосой
   в своём слое строки (isolation), подложки страниц и панелей её не перекрывают */
.ch-bars--rail { --bars-rail: color-mix(in srgb, var(--line) 35%, var(--chart-ground, var(--paper))); }
.ch-bars--rail .ch-bars__track { position: relative; isolation: isolate; }
.ch-bars--rail .ch-bars__track::before {
  content: ""; position: absolute; left: 0; top: 50%; z-index: -1;
  width: calc(100% - var(--bars-value) - var(--space-2)); height: var(--bar); transform: translateY(-50%);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0; background: var(--bars-rail);
}
.ch-bars--rail .ch-bars__value { margin-left: auto; min-width: var(--bars-value); text-align: right; }
/* Список полос, который держит строки (страны найма; владелец, 2026-11-05, CHI-1633): под ним дверь — ch-link с шевроном и
   aria-expanded, «Show N more» / «Show fewer», aria-controls — на список. Скрытые строки стоят в том же списке (hidden), на той же
   шкале: их --share — от того же максимума. Раскрыл — фокус на первую показанную строку (tabindex="-1"), свернул — на кнопке.
   «and N more» метой остаётся у сводки (ch-values__more) */
.ch-bars__more { margin: 0; justify-self: start; }

/* ── Диапазон на шкале (ch-band): цифра, которая не одно число («0.7–6.7%», «below 3.2%»), — полосой от низа до верха на одной
      шкале для всех, кого сравнивают. Волосяная линия — шкала от нуля до верха (её концы подписывает ch-band__scale); полоса —
      толщиной столбца (--bar), тёмной ступенью графика, от --from до --to (доли шкалы от 0 до 1, пишет скрипт). Точки внутри
      нет: середина диапазона не цифра. «Ниже 3.2%» начинается от нуля. Полоса не тоньше 2px, как столбец, что что-то держит.
      Рисунок — aria-hidden: те же числа стоят словами рядом. Стоит под цифрой ряда чисел (ch-kpis__band), столбцом таблицы
      (ch-table__band; на узком уходит, как ch-table__wide) и на месте полосы в строке ch-bars (ch-bars--range) ── */
.ch-band { position: relative; display: block; height: var(--bar); min-width: 0; }
.ch-band::before { content: ""; position: absolute; inset: 50% 0 auto; border-top: var(--hairline) solid var(--line-control); }
.ch-band > i { position: absolute; inset-block: 0; left: calc(var(--from, 0) * 100%); width: max(0.125rem, (var(--to, 0) - var(--from, 0)) * 100%); border-radius: var(--radius-sm); background: var(--chart-notable); }
.ch-band__scale { display: flex; justify-content: space-between; gap: var(--space-2); font: 400 var(--text-meta)/var(--leading-meta) var(--font-data); color: var(--ink-muted); font-variant-numeric: tabular-nums; }
/* В строке полос: диапазон на месте полосы, на всю дорожку; место под значение — как у денег, «0.7–6.7%» и «below 3.2%» */
.ch-bars--range { --bars-value: var(--space-18); }
/* Строка диапазона читается одной высотой (владелец, 2026-11-07, с Brands на Visibility): значение — размером подписи (13/18),
   как имя; полоса — по первой строке имени, а не по середине двух строк переноса */
.ch-bars--range .ch-bars__value { font: 400 var(--text-label)/var(--leading-label) var(--font-ui); }
.ch-bars--range .ch-bars__row { align-items: start; }
.ch-bars--range .ch-bars__track { min-height: var(--leading-label); }
/* Концы шкалы — строкой под последней полосой, в той же сетке (ch-bars__row ch-bars__row--scale с пустой подписью, aria-hidden):
   своей высоты строки полосы у неё нет, от последней полосы — на щель 4 больше, чем между полосами */
.ch-bars__row--scale { min-height: 0; margin-top: var(--space-1); }
.ch-bars__track > :is(.ch-band, .ch-band__scale) { flex: 1; }
.ch-bars__track > :is(.ch-band, .ch-band__scale) + .ch-bars__value { flex: none; width: var(--bars-value); }

/* Подсказка над столбцом плавает над страницей и отрывается от неё тенью, как всякая плавающая панель: бумагой на поднятой
   панели фигуры она теряла бы край */
.ch-tip {
  position: fixed; z-index: 75; pointer-events: none; display: grid; gap: var(--space-1); min-width: 8.25rem;
  padding: var(--space-2) var(--space-3); background: var(--paper);
  border: var(--hairline) solid var(--line-control); border-radius: var(--radius); box-shadow: var(--float-lift);
}
.ch-tip__row { display: flex; align-items: center; gap: var(--space-2); }
.ch-tip__row b { margin-left: auto; padding-left: var(--space-4); font-weight: 400; color: var(--ink); font-variant-numeric: tabular-nums; }
/* Что сделает нажатие на столбец («Show March 2022») — последней строкой, за волосяной линией, акцентом, как ссылка */
.ch-tip__act { margin-top: var(--space-1); padding-top: var(--space-2); border-top: var(--hairline) solid var(--line); color: var(--accent); }

/* ── Таблица: строка 14/21 с волосяными линиями; подписи столбцов — капителью 13/500 чернилами, как подпись раздела, над линией
      чернилами, итог — под такой же линией (владелец, 2026-11-11: в большой таблице серые подписи и итог тонули в данных).
      Первая ячейка может быть заголовком строки (th) — выглядит как обычная. Всё в таблице стоит слева: и слова, и числа
      (владелец, 2026-11-05). Числа — ch-table__num: одной строкой, цифрами одной ширины, у левого края, как подпись над ними.
      Группа строк — ch-table__group: подпись группы со счётом. Сортировка — кнопка в th и aria-sort.
      Модификаторы: --hover подсвечивает строку, --sticky прилипает шапкой под шапку страницы,
      --fixed раскладывает столбцы по долям из colgroup и обрезает длинное многоточием.
      Та же таблица, скрытая от глаз, лежит под каждым графиком для экранных читалок ── */
.ch-table { width: 100%; border-collapse: collapse; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums; }
.ch-table thead th {
  padding: var(--space-3) var(--space-4) var(--space-3) 0; border-bottom: var(--hairline) solid transparent;
  background-image: linear-gradient(var(--head-rule, var(--ink)), var(--head-rule, var(--ink))); background-position: bottom; background-size: 100% var(--hairline); background-repeat: no-repeat;
  text-align: left; vertical-align: bottom; font: 500 var(--text-label)/var(--leading-label) var(--font-ui); letter-spacing: .08em; text-transform: uppercase; color: var(--ink); white-space: nowrap;
}
/* Линия под шапкой — фоном ячейки у её низа, а не её границей: при border-collapse граница липкой шапки (--sticky) уезжает вместе
   со строкой, и прилипшие подписи висели над данными без линии. Граница прозрачная — держит высоту шапки прежней. Цвет линии —
   --head-rule (по умолчанию ink); липкая шапка задаёт только цвет фона, чтобы не стереть линию.
   Кнопка сортировки и знак в подписи берут капитель подписи: у кнопки браузер её сбрасывает */
.ch-table thead th > button { letter-spacing: inherit; text-transform: inherit; }
/* Подпись, которая — имя со своим знаком (свой сайт над столбцом Visibility), пишется как имя: капитель — у слов подписей, не у имён */
.ch-table thead th:has(.ch-tile) { letter-spacing: normal; text-transform: none; }
.ch-table tbody th { font-weight: 400; text-align: left; }
.ch-table tbody th, .ch-table td { padding: var(--space-3) var(--space-4) var(--space-3) 0; border-bottom: var(--hairline) solid var(--line); vertical-align: middle; }
.ch-table :is(th, td):last-child { padding-right: 0; }
.ch-table :is(th, td).ch-table__num { white-space: nowrap; }
/* Слова вместо числа («Under 1 min», «Меньше минуты») переносятся между словами: число держит одну строку, фраза — нет,
   иначе она раздвигает столбец и таблица выходит за колонку телефона */
.ch-table__num .ch-table__words { white-space: normal; }
.ch-table .ch-table__words { font-variant-numeric: normal; }   /* words keep ordinary figures: the table's tabular ones, meant for numbers in a column, set "100 days" as "1 00 days" */
/* День, известный только границей (дизайнер, 2026-11-04; правило RULES → Copy): «by Oct 19» словами (ch-table__words, «by» держится за
   дату неразрывным пробелом), почему — за знаком перед ним (ch-info); знак и слова — одной строкой в любом столбце */
.ch-table :is(td, th):has(> .ch-info + .ch-info__text + .ch-table__words) { white-space: nowrap; }
/* Слова и знак после них («Only you ⓘ» в столбце Seen by профилей) — тоже одной строкой: знак не встаёт под словами один
   (система 0.49.0, было co-pf-table td:nth-child(2)) */
/* Сами слова — тоже: перенос перед знаком берёт white-space слов (normal у ch-table__num), а не ячейки, и знак после «by Oct 19»
   вставал под словами */
.ch-table :is(td, th):has(> .ch-table__words + .ch-info) { white-space: nowrap; }
.ch-table :is(td, th):has(> .ch-table__words + .ch-info) > .ch-table__words { white-space: nowrap; }
.ch-table tfoot td { padding-top: var(--space-4); border-top: var(--hairline) solid var(--ink); border-bottom: 0; font-weight: 500; }
/* При border-collapse из двух границ одной толщины, разных лишь цветом, побеждает верхняя ячейка — линия последней строки (line)
   перекрывала линию итога чернилами. У последней строки над итогом своей линии нет */
.ch-table:has(> tfoot) > tbody:last-of-type > tr:last-child > :is(th, td) { border-bottom: 0; }
/* Группа строк — начало раздела таблицы, а не ещё одна строка: подпись — заголовком подраздела (15/24, 500, чернилами, как
   h3 подраздела досье), над ней воздух в 32, под ней линия потемнее; счёт — метой после подписи, как у заголовка раздела
   («Pages and feeds 5»). Ни заливки, ни рамки: она не кнопка и не плашка. Наведение строк её не подсвечивает */
.ch-table .ch-table__group > :is(td, th) {
  padding-top: var(--space-8); padding-bottom: var(--space-2); border-bottom-color: var(--line-control);
  font: 500 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); text-align: left;
}
.ch-table .ch-table__group .ch-meta { font-weight: 400; }
.ch-table tbody tr:first-child.ch-table__group > :is(td, th) { padding-top: var(--space-4); }
/* Статус в ячейке — блочный: у знака без базовой линии строка не вырастает на пиксель. Ширина — по слову: рамка фокуса и
   подсказка обводят слово, а не ячейку; стоит у левого края, как всё в таблице */
.ch-table .ch-ok, .ch-table .ch-failing { display: flex; width: fit-content; }
/* Строка таблицы — в одну строку: пояснение к ней не встаёт второй строкой, а прячется за знаком «i» (ch-info, ниже, у подсказок).
   ch-table__sub — только данные под данными: перерыв в чтении под адресом источника на Watching («Not read Oct 10 – Oct 19»),
   столбец, сложенный в узкой колонке (ch-table__narrow), и то немногое, что читают с одного взгляда (доля голоса под
   диапазоном, откуда цифра); нет данных — тире тише текста */
.ch-table__sub { display: block; margin-top: var(--space-1); }
.ch-table__none { color: var(--ink-muted); }
/* Короткая метка того, что это за строка («this finding», «your product») — метой на той же строке, после слов; не фраза */
/* Строкой высотой в строку слов и от её верха: после значка с именем (ch-table__site) базовая линия — низ значка, и метка садилась бы ниже имени */
.ch-table__tag { margin-left: var(--space-2); font: 400 var(--text-meta)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); white-space: nowrap; vertical-align: top; }
/* Знак пояснения в ячейке: на строке слов, после них, в любом столбце — и после числа: числа держат левый край.
   Слово состояния с пояснением («OK ⓘ») — в строку со знаком, а не блоком; у сбоя знак пояснения — его собственный (ch-info--alert) */
.ch-table :is(.ch-ok, .ch-failing):has(+ .ch-info) { display: inline-flex; vertical-align: top; }
/* Слово состояния и его знак не расходятся по строкам в узком столбце (телефон): знак не встаёт под словом один */
.ch-table :is(td, th):has(> :is(.ch-ok, .ch-failing) + .ch-info) { white-space: nowrap; }
.ch-table tr.is-gone .ch-info { color: var(--ink-gone); }
.ch-table tr.is-gone .ch-info:is(:hover, [data-open]) { color: var(--ink); }
/* Строка того, чего уже нет (удалённый код, закрытая роль), стоит на месте, но тише: слова, ссылки и метаданные — ink-gone
   (своя ступень под ink-muted: в светлой — где стоял прежний второй серый, в тёмной — дальше от чернил, где ink-muted почти они) */
.ch-table tr.is-gone > :is(th, td), .ch-table tr.is-gone :is(a, .ch-meta, .ch-table__sub, .ch-table__tag) { color: var(--ink-gone); }
/* Свой продукт или сайт — первой строкой, отделён от остальных линией потемнее (свой сайт у Competitors, Mellow в брендах видимости) */
.ch-table tr.ch-table__you > :is(th, td) { border-bottom-color: var(--line-control); }
/* Сайт или бренд в ячейке — значок и имя чернилами 500; вторая строка под ним — от края слов, а не значка. В строке ушедшего
   имя тише и обычным весом, значок — вполовину, как и вся строка */
.ch-table__site { display: inline-flex; align-items: flex-start; gap: var(--space-2); font-weight: 500; color: var(--ink); }
/* Имя без пробелов длиннее столбца (31 буква) рвётся у края, а не раздвигает таблицу: в ячейке таблицы с авто-раскладкой только
   anywhere сжимает наименьшую ширину слова; значок стоит на первой строке имени, на её середине, как у строки списка (ch-row) */
.ch-table__site > .ch-tile { flex: none; margin-top: calc((var(--leading-ui) - 1.125rem) / 2); }
.ch-table__site > :not(.ch-tile) { min-width: 0; overflow-wrap: anywhere; align-self: baseline; }   /* базовая линия ячейки — у имени, не у низа значка: строки, выровненные по первой строке текста, стоят ровно */
/* Компания, которую называет чужой документ, а не бренд, за которым следят (Facebook, Meta у политики конфиденциальности):
   значок и имя обычным весом, как юр. лица рядом (ch-table__site--plain; дизайнер, 2026-11-04) */
.ch-table__site--plain { font-weight: 400; }
.ch-table__site ~ .ch-table__sub { padding-left: calc(1.125rem + var(--space-2)); }
.ch-table tr.is-gone .ch-table__site { color: var(--ink-gone); font-weight: 400; }
.ch-table tr.is-gone .ch-tile, .ch-row.is-gone > .ch-tile { opacity: .5; }
/* Столбец, который в узкой колонке (контейнер до 480 при S: телефон, крупный размер) уходит второй строкой в соседнюю ячейку. У таблицы
   в рамке ch-table-wrap контейнер — сама рамка, то есть ширина таблицы, а не колонки страницы: в двух колонках страницы находки
   таблица бывает уже телефона (CHI-1723). Его подпись и ячейки — ch-table__wide, то же значение второй строкой соседней ячейки — ch-table__sub ch-table__narrow. Видно одно из двух,
   и читалка читает то, что видно: aria-hidden ни на одном нет */
.ch-table .ch-table__narrow { display: none; }
@container (max-width: 30rem) {
  .ch-table .ch-table__wide { display: none; }
  .ch-table .ch-table__narrow { display: block; }
  .ch-table .ch-table__band { display: none; }
}
/* Столбец-шкала (ch-table__band): диапазон строки рисунком (ch-band) на одной шкале для всей таблицы, перед столбцом чисел,
   которые он рисует. В шапке — концы шкалы (ch-band__scale: «0» и «80%», рисунок) и её имя для читалки; в строке полоса стоит
   на первой строке ячейки, у строки без цифры ячейка пустая. Пятая часть ширины таблицы с небольшим, а когда тесно — не уже 60: имени с заметками под ним остаётся место,
   а таблица брендов по-русски помещается в колонку документа на 1024 S (450; при 96 шла на 467). Справа — поле в 16, как у
   любой ячейки: числа за ним стоят у левого края своего столбца. На узком (до 480) уходит: числа
   остаются, рисунок без них ничего не добавляет */
.ch-table :is(th, td).ch-table__band { width: 22%; min-width: 3.75rem; padding-left: var(--space-4); padding-right: var(--space-4); vertical-align: top; }
.ch-table thead th.ch-table__band { vertical-align: bottom; }
.ch-table td.ch-table__band > .ch-band { margin-block: calc((var(--leading-ui) - var(--bar)) / 2); }
/* Сортировка: подпись — кнопка; выбранный столбец — со стрелкой (по возрастанию стрелка вверх), подпись под указателем — с тонким
   подчёркиванием, как ссылка: все подписи чернилами, цвет больше не отличает ни наведение, ни выбор */
/* Знак «i» (ch-info) в подписи — тоже кнопка, но не сортировка: правила ниже его не берут, а :where не поднимает их вес над правилами экранов */
/* У сортируемой подписи поля даёт сама кнопка */
.ch-table thead th:has(> button:not(:where(.ch-info))) { padding: 0; }
.ch-table th > button:not(:where(.ch-info)) {
  display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-3) var(--space-4) var(--space-3) 0;
  border: 0; background: none; cursor: pointer; font: inherit; color: inherit; white-space: nowrap; text-align: left;
}
/* Подпись последнего столбца кончается у края таблицы, как его ячейки: поле справа у кнопки — промежуток до следующего столбца, а его нет */
.ch-table th:last-child > button:not(:where(.ch-info)) { padding-right: 0; }
.ch-table th > button:not(:where(.ch-info)):hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.ch-table th > button:not(:where(.ch-info)) .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }
.ch-table th[aria-sort="ascending"] > button:not(:where(.ch-info)) .ch-icon { transform: rotate(180deg); }
/* Место стрелки держится и у столбца, по которому не сортируют: подпись не переносится и не сдвигается, когда по нему
   начинают сортировать, и шапка не растёт на строку. Стрелка — после подписи в любом столбце: подпись стоит у левого края,
   над словами и числами */
.ch-table th:not([aria-sort]) > button:not(:where(.ch-info))::after { content: ""; flex: none; width: var(--icon-sm); }
/* Знак «i» после сортируемой подписи (CHI-22) — на строке её слов: у кнопки подписи поля space-3 сверху и снизу, и знак с
   vertical-align: top вставал к верху поля, на 11–12 px выше слова. Знак опускается на поле кнопки и берёт высоту строки подписи
   (label 13/18), так его середина — на середине слова при S, M и L. Промежуток до следующего столбца — после знака, а не между
   словом и знаком: знак стоит 4 после подписи (её стрелки или места стрелки), как после слов в строке */
.ch-table thead th > button:not(:where(.ch-info)) + .ch-info { height: var(--leading-label); margin-top: var(--space-3); margin-right: var(--space-4); }
.ch-table thead th > button:not(:where(.ch-info)):has(+ .ch-info) { padding-right: 0; }
.ch-table thead th:last-child > button:not(:where(.ch-info)) + .ch-info { margin-right: 0; }
.ch-table--hover tbody tr:not(.ch-table__group):hover > :is(th, td) { background: var(--hover-row); }
.ch-table--sticky thead th { position: sticky; top: var(--head-h, 8rem); z-index: 2; background-color: var(--paper); }
.ch-table--fixed { table-layout: fixed; }
.ch-table--fixed tbody th, .ch-table--fixed td { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* В долях обрезается и то, что внутри ячейки: ссылка, слова, путь, вторая строка — каждое своим многоточием */
.ch-table--fixed :where(td, tbody th) > :where(a:not([class]), span:not([class]), code, .ch-url, .ch-table__sub) { display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Со знаком пояснения слова ячейки уступают ему место на той же строке и режут многоточие раньше */
.ch-table--fixed :where(td, tbody th) > :where(a:not([class]), span:not([class]), code, .ch-url):has(+ .ch-info) { display: inline-block; max-width: calc(100% - 1.25rem - var(--space-1)); vertical-align: top; }
/* Кнопка в строке таблицы ниже обычной: строка не растёт из-за неё; кнопка с одной иконкой — квадратная */
.ch-table .ch-btn { height: 1.75rem; padding: 0 var(--space-3); }
.ch-table .ch-btn--icon { width: 1.75rem; padding: 0; }
/* Таблица шире своей колонки прокручивается в своей рамке, а не страница: рамка берёт ширину колонки и не растит её своей
   таблицей и она же — контейнер для правил по ширине внутри таблицы (container-type: сдерживание ширины, как прежде у contain, и
   ширина, которую читает сложенный столбец; CHI-1723), поле в 4px держит кольцо фокуса внутри рамки. Подсказку знака «i» скрипт
   ставит в <body>, рамка её не режет. Таблица с липкой шапкой (--sticky) в рамку не ставится */
.ch-table-wrap { position: relative; overflow-x: auto; container-type: inline-size; margin: calc(var(--space-1) * -1); padding: var(--space-1); }

/* ── Вкладки: подпись и число; выбранная — чернилами с полосой акцента снизу, как текущий раздел в рейке ── */
/* Вкладки — всегда одной строкой (дизайнер, 2026-11-04, после досье конкурента: шесть вкладок со счётом при размере L или
   по-русски переносились вторым рядом между 760 и 960, и полоса выбранной уходила с линии). Не влезают — строка прокручивается
   в своей рамке при любой ширине, как широкая таблица; полоса прокрутки скрыта, выбранную вкладку страница прокручивает в вид
   сама, как нарисовано. В рамке полоса выбранной — над линией, кольцо фокуса — внутри вкладки, как у пункта меню */
.ch-tabs { display: flex; flex-wrap: nowrap; gap: var(--space-6); border-bottom: var(--hairline) solid var(--line); overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none; }
.ch-tabs::-webkit-scrollbar { display: none; }
.ch-tabs > * { flex: none; }
/* Вкладка — кнопка списка вкладок или ссылка, когда вкладки — страницы (открываются в новой вкладке браузера); выбранная ссылка — aria-current */
.ch-tabs > :is(button, a) {
  position: relative; display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-4) 0 var(--space-3);
  border: 0; background: none; cursor: pointer; text-decoration: none; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted);
}
.ch-tabs > :is(button, a):hover, .ch-tabs > button[aria-selected="true"], .ch-tabs > a[aria-current="page"] { color: var(--ink); }
.ch-tabs > :is(button[aria-selected="true"], a[aria-current="page"])::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 0.125rem; background: var(--accent); }
.ch-tabs > :is(button, a):focus-visible { outline-offset: -2px; }
/* Вкладки в пути: заготовка на месте подписи, полоса той же высоты, что с подписями */
.ch-tabs > .ch-skeleton { width: 4.5rem; margin-block: calc(var(--space-4) + (var(--leading-ui) - 0.75rem) / 2) calc(var(--space-3) + (var(--leading-ui) - 0.75rem) / 2); }
.ch-tabs .ch-meta { font-weight: 400; }
.ch-tabs .ch-failing { font-size: var(--text-label); }
/* На телефоне вкладки стоят теснее */
@media (max-width: 760px) {
  .ch-tabs { column-gap: var(--space-4); }
}

/* ── Разделы списком (ch-sections): страницы одного раздела документа — ссылками сверху вниз, слева от раздела (Settings, рамка
      fp--sections). Слова пункта — по левому краю заголовка страницы: подложка наведения выходит за край на свой отступ.
      Текущий (aria-current="page") — чернилами и полосой акцента слева, как текущий пункт рейки и выбранная вкладка; под
      указателем — wash. Группа (Agents) — подписью, как в рейке. Список держится у верха окна, пока раздел длиннее экрана ── */
.ch-sections { position: sticky; top: var(--space-8); display: grid; gap: var(--space-1); margin-inline-start: calc(var(--space-3) * -1); min-width: 0; }
.ch-sections__group { display: grid; gap: var(--space-1); margin-top: var(--space-6); }
.ch-sections__label { margin: 0 0 var(--space-1); padding-inline: var(--space-3); font: 500 var(--text-label)/var(--leading-label) var(--font-ui); letter-spacing: .08em; text-transform: uppercase; color: var(--ink); }   /* как подпись группы в рейке (ch-label) */
.ch-sections a {
  position: relative; display: block; padding: var(--space-2) var(--space-3); border-radius: var(--radius);
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); text-decoration: none; text-wrap: pretty;
}
.ch-sections a:hover { color: var(--ink); background: var(--wash); }
.ch-sections a[aria-current="page"] { color: var(--ink); }
.ch-sections a[aria-current="page"]::before { content: ""; position: absolute; left: 0; top: var(--space-2); bottom: var(--space-2); width: 0.125rem; background: var(--accent); }
/* Тесно (контейнер страницы 840 и меньше): список — полоса вкладок под шапкой, как ch-tabs на телефоне: одной строкой,
   прокручивается в своей рамке, выбранная — полосой акцента снизу, над линией; подпись группы уходит, пункты встают в ряд.
   Выбранную целиком в полосу прокручивает страница, меряя как нарисовано */
@container (max-width: 52.5rem) {
  .ch-sections {
    position: static; display: flex; flex-wrap: nowrap; column-gap: var(--space-6); margin-inline-start: 0;
    border-bottom: var(--hairline) solid var(--line); overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none;
  }
  .ch-sections::-webkit-scrollbar { display: none; }
  .ch-sections__group { display: contents; }
  .ch-sections__label { display: none; }
  .ch-sections a { flex: none; padding: var(--space-4) 0 var(--space-3); border-radius: 0; font-weight: 500; white-space: nowrap; }
  .ch-sections a:hover { background: none; }
  .ch-sections a:focus-visible { outline-offset: -2px; }
  .ch-sections a[aria-current="page"]::before { top: auto; right: 0; bottom: 0; width: auto; height: 0.125rem; }
}
@media (max-width: 760px) {
  .ch-sections { column-gap: var(--space-4); }
}

/* ── Крупные числа: число 24/32 и подпись под ним, между числами — волосяные линии ── */
/* Числа переносятся рядами: между рядами — та же линия, у начала ряда линии нет. Каждое число несёт линию сверху и слева;
   сетка сдвинута влево на поле числа и срезана по краю колонки, так что первое в ряду стоит по краю текста, а его левая линия
   уходит за срез. Четыре числа, которым тесно в ряд, встают два на два, а не три и одно */
.ch-kpis {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); min-width: 0;
  margin: 0 0 0 calc(var(--space-4) * -1); border-bottom: var(--hairline) solid var(--line); clip-path: inset(0 0 0 var(--space-4));
}
.ch-kpis:not(.ch-kpis--fit):has(> div:nth-child(4):last-child) { grid-template-columns: repeat(auto-fit, minmax(clamp(10rem, (40rem - 100%) * 999, 50%), 1fr)); }
/* Пять — в ряд от 800px колонки, уже — три и два, а не четыре и одно */
.ch-kpis:not(.ch-kpis--fit):has(> div:nth-child(5):last-child) { grid-template-columns: repeat(auto-fit, minmax(clamp(10rem, (50rem - 100%) * 999, 33.33%), 1fr)); }
/* Число — столбцом: значение, подпись, факты, дверь; дверь (ch-kpis__go) стоит у низа плитки */
.ch-kpis > div { display: flex; flex-direction: column; gap: var(--space-1); margin-left: calc(var(--hairline) * -1); padding: var(--space-4); border-top: var(--hairline) solid var(--line); border-left: var(--hairline) solid var(--line); }
.ch-kpis dd { margin: 0; font: 500 var(--text-title)/var(--leading-title) var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums; }
.ch-kpis dt { order: 2; font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); }  /* имя и его число — одним цветом, чернилами */
/* Значение, которое не одно число: слова вместо числа, пока его нет (ch-kpis__words: «needs 15 more answers», «recounting saved
   answers») — ступенью body, чернилами, а не крупно; устарело — путь к цифре теперь ch-meter, но слова ещё стоят на нескольких страницах; части без общего числа (ch-kpis__parts: после смены модели у каждой части свой
   диапазон, счёт и период) — строками ui, число полужирным, период метой под ним. Факты о значении — метой под подписью
   (ch-kpis__facts; каждый целым — ch-facts) */
.ch-kpis dd.ch-kpis__words { font: 400 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); }
.ch-kpis dd.ch-kpis__parts { display: grid; gap: var(--space-1); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.ch-kpis__parts b { font-weight: 500; font-variant-numeric: tabular-nums; }
.ch-kpis__parts .ch-meta { display: block; }
.ch-kpis dd.ch-kpis__facts { order: 3; font: 400 var(--text-meta)/var(--leading-meta) var(--font-data); color: var(--ink-muted); font-variant-numeric: tabular-nums; }
/* Значения нет (ch-kpis__none; владелец, 2026-11-05: ряд обзора конкурента — один набор плиток для всех, «у Mellow нет сделок —
   тогда N/A»; вид — дизайнера, 2026-11-05): «N/A» («н/д») ступенью числа, но серым — это не число, и рядом с чернильными числами ряда
   оно не читается нулём. Почему значения нет — в ch-info у подписи плитки; дверь остаётся, так что двери ряда — на одной линии */
.ch-kpis dd.ch-kpis__none { color: var(--ink-muted); }
/* Знак «i» у подписи плитки — высотой её строки: подпись с пояснением не выше подписи без него */
.ch-kpis dt .ch-info { height: var(--leading-label); }
/* Дверь под числом (ch-kpis__go; дизайнер, 2026-11-04, с досье конкурента): число, за которым стоит список, ведёт к нему — See all
   на страницу с фильтром, Show на вкладку этой же страницы; ch-link ступенью ui, ссылкой в том же окне. Дверь — после фактов, у низа
   плитки, так что двери ряда стоят на одной линии, сколько бы фактов ни было над ними. Имя ссылки говорит, куда она ведёт
   («See all 22 findings about Deel from the last 30 days»): See all одно на шесть плиток */
.ch-kpis dd.ch-kpis__go { order: 4; margin-top: auto; padding-top: var(--space-3); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }
/* Ряд по своим плиткам (ch-kpis--fit; дизайнер, 2026-11-04): плитка не шире 240, ряд шириной своих плиток, а не колонки, так что
   одна или две не растягиваются на 800px. Раскладка — на каждое число от 1 до 6, по числу плиток, а не по атрибуту: в ряду, где
   плитки, которой нечего показать, нет (размер сайта), ряд перестраивается сам; ряд обзора конкурента — всегда шесть, пустая — «N/A»
   (ch-kpis__none; владелец, 2026-11-05). Колонка от 1080 — все в ряд; уже — пять и шесть по три (3 + 2, 3 + 3);
   четыре — в ряд от 720, уже — два на два; колонка до 480 (телефон при любом размере) — по две, одна — одна */
.ch-kpis.ch-kpis--fit { --n: 1; grid-template-columns: repeat(var(--n), minmax(0, 15rem)); width: fit-content; max-width: calc(100% + var(--space-4)); }
.ch-kpis--fit:has(> div:nth-child(2):last-child) { --n: 2; }
.ch-kpis--fit:has(> div:nth-child(3):last-child) { --n: 3; }
.ch-kpis--fit:has(> div:nth-child(4):last-child) { --n: 4; }
.ch-kpis--fit:has(> div:nth-child(5):last-child) { --n: 5; }
.ch-kpis--fit:has(> div:nth-child(6):last-child) { --n: 6; }
/* Ряд во всю ширину (ch-kpis--span, вместе с --fit; владелец, 2026-11-05, Site на Platforms): та же раскладка по числу плиток, но
   плитки делят колонку поровну, а не стоят по 240, — так под ними встаёт сводка столбцами (fp-glance) того же числа столбцов, и
   линии плиток идут вниз её линиями. Только над такой сводкой: одна плитка во всю ширину пуста */
.ch-kpis.ch-kpis--fit.ch-kpis--span { grid-template-columns: repeat(var(--n), minmax(0, 1fr)); width: auto; max-width: none; }
@container (max-width: 67.4375rem) {
  .ch-kpis--fit:has(> div:nth-child(5):last-child) { --n: 3; }
  .ch-kpis--fit:has(> div:nth-child(6):last-child) { --n: 3; }
}
@container (max-width: 44.9375rem) {
  .ch-kpis--fit:has(> div:nth-child(4):last-child) { --n: 2; }
}
@container (max-width: 29.9375rem) {
  .ch-kpis--fit:has(> div:nth-child(3):last-child) { --n: 2; }
  .ch-kpis--fit:has(> div:nth-child(4):last-child) { --n: 2; }
  .ch-kpis--fit:has(> div:nth-child(5):last-child) { --n: 2; }
  .ch-kpis--fit:has(> div:nth-child(6):last-child) { --n: 2; }
}

/* ── Путь к порогу (ch-meter; владелец, 2026-11-04, с обзора Visibility): сколько уже есть из того, что нужно для цифры, —
      «75 / 90» — вместо слов «needs 15 more answers» (ch-kpis__words). Дорожка 4px в line-control, пройденное — чернилами, значение
      справа — ui 500 чернилами, табличными цифрами. Ширина — 100% до 280. role="meter" с aria-valuemin, -max, -now и именем
      («Answers toward a figure: 75 of 90») — на самом элементе; доля — --share от 0 до 1 (пишет скрипт), больше 1 дорожка не берёт.
      В плитке ch-kpis стоит на месте числа, по середине его строки, так что подписи ряда остаются на одной линии ── */
.ch-meter { display: flex; align-items: center; gap: var(--space-3); width: 100%; max-width: 17.5rem; min-width: 0; }
.ch-meter__track { position: relative; flex: 1; min-width: var(--space-8); height: 0.25rem; border-radius: var(--radius-sm); background: var(--line-control); overflow: hidden; }
.ch-meter__track > i { position: absolute; inset: 0 auto 0 0; width: calc(min(max(var(--share, 0), 0), 1) * 100%); background: var(--ink); }
.ch-meter__value { flex: none; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ch-kpis dd:has(> .ch-meter) { display: flex; align-items: center; min-height: var(--leading-title); }
/* в режиме высокой контрастности заливки нет: дорожка и пройденное — системными цветами */
@media (forced-colors: active) {
  .ch-meter__track { background: GrayText; }
  .ch-meter__track > i { background: CanvasText; }
}

/* ── Список чисел: подпись слева, число справа; рамки строк — от ch-list. Подпись и число — одним цветом, чернилами; число — 500 ── */
.ch-stats > li { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-4); padding: var(--space-2) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.ch-stats b { font-weight: 500; color: var(--ink); font-variant-numeric: tabular-nums; }

/* ── Акцент ink blue: действие и выбор человека — отправка и основная кнопка (одна на экран), ссылки,
      включённые переключатели и фильтры, текущий раздел, фокус, свой сайт на графике.
      Зелёный «агент работает» и красный «сбой» остаются за своими смыслами; важность находок — без цвета ── */
.ch-btn--primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
.ch-btn--primary:hover { background: color-mix(in srgb, var(--accent) 85%, var(--ink)); }
/* Недоступная основная (disabled или aria-disabled, не занятая) — как недоступная на грунте: без заливки, обводка --line-control,
   слово — как у недоступного (ink-muted на 55%); наведение ничего не меняет. Оба способа выглядят одинаково; занятая остаётся с заливкой (правило ниже) */
.ch-btn--primary:is(:disabled, [aria-disabled="true"]):not([aria-busy="true"]), .ch-btn--primary:is(:disabled, [aria-disabled="true"]):not([aria-busy="true"]):hover { background: transparent; border-color: var(--line-control); color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
.ch-link { color: var(--accent); }
.ch-link:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 4px; }
.ch-switch[aria-checked="true"] .ch-switch__track { border-color: var(--accent); }
.ch-switch[aria-checked="true"] .ch-switch__track::after { background: var(--accent); }
.ch-check input:checked + .ch-check__box { border-color: var(--accent); color: var(--accent); }
.ch-menu__item:is([aria-pressed="true"], [aria-checked="true"]) .ch-icon { color: var(--accent); }
.ch-rail__item[aria-current="page"]::before { background: var(--accent); }
.ch-bars__row:has(.ch-tile--you) :is(.m-notable, .m-major) { background: var(--accent); }
.ch-bars__row:has(.ch-tile--you) .m-mid { background: color-mix(in srgb, var(--accent) 70%, var(--chart-ground, var(--paper))); }
.ch-bars__row:has(.ch-tile--you) .m-routine { background: color-mix(in srgb, var(--accent) 40%, var(--chart-ground, var(--paper))); }
/* Свой продукт на шкале — акцентом: строка полос со своим значком, своя строка таблицы, цифра своего продукта (ch-band--you) */
.ch-table tr.ch-table__you .ch-band > i, .ch-band--you > i { background: var(--accent); }
.ch-bars__row:has(.ch-tile--you) .ch-band > i { background: var(--accent); }

/* ── Модалка: бумага с волосяной рамкой поверх затемнения, без тени. Шапка и подвал на месте, середина прокручивается.
      Высота — по видимой части окна (dvh): на телефоне подвал с кнопками не уходит под панели браузера ── */
.ch-modal {
  width: var(--modal); max-width: none; max-height: calc(100vh - 2 * var(--space-8)); max-height: calc(100dvh - 2 * var(--space-8));
  padding: 0; border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  background: var(--paper); color: var(--ink); overflow: hidden;
}
.ch-modal::backdrop { background: var(--scrim); }
html:has(.ch-modal[open]) { overflow: hidden; }
.ch-modal__box { display: flex; flex-direction: column; max-height: calc(100vh - 2 * var(--space-8)); max-height: calc(100dvh - 2 * var(--space-8)); }
.ch-modal__head { display: grid; gap: var(--space-3); padding: var(--modal-pad) var(--modal-pad) var(--space-4); border-bottom: var(--hairline) solid var(--line); }
.ch-modal__top { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-6); }
.ch-modal__tools { display: flex; align-items: center; gap: var(--space-1); flex: none; }
.ch-modal__tools .ch-meta { margin-right: var(--space-2); white-space: nowrap; }
/* Крестик — не шаг по списку: после пары ‹ › он стоит в 24 от неё (space-6 вместо gap 4), пара остаётся вплотную.
   Срабатывает, только когда перед крестиком (последней кнопкой-иконкой) стоит другая кнопка-иконка: одинокий крестик
   и крестик после одного счёта «3 of 18» лишнего отступа не получают */
.ch-modal__tools > .ch-btn--icon + .ch-btn--icon:last-child { margin-left: calc(var(--space-6) - var(--space-1)); }
.ch-modal__meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-4); }
/* Части тела модалки — баннер, абзац, таблица, примечание — стоят с шагом 16 (у подтверждения — 12), а не вплотную.
   Тело — один столбец шириной в окно: таблица, которая не переносится, или длинное слово его не раздвигают и не уводят
   слова рядом за край окна (на телефоне очередь Add competitors раздвигала его на 12–60px); шире окна — своя рамка ch-table-wrap */
.ch-modal__body { flex: 1; min-height: 0; overflow: auto; overscroll-behavior: contain; padding: var(--modal-pad); display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-4); align-content: start; }
.ch-modal__foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); padding: var(--space-4) var(--modal-pad); border-top: var(--hairline) solid var(--line); }
/* Подвал из одних действий — они у правого края, без пустышки слева */
.ch-modal__foot > .ch-actions:only-child { margin-left: auto; }
/* На телефоне заголовку окна не тесно рядом с инструментами: длинный заголовок встаёт под них во всю ширину (wrap-reverse),
   короткий остаётся с ними в строке; заголовок — ступенью heading, подвал переносит кнопки рядами */
@media (max-width: 760px) {
  .ch-modal__top { flex-wrap: wrap-reverse; align-items: center; row-gap: var(--space-2); }
  .ch-modal__tools { margin-left: auto; }
  .ch-modal .ch-title { font-size: var(--text-heading); line-height: var(--leading-heading); }
  .ch-modal__foot { flex-wrap: wrap; row-gap: var(--space-2); }
}
/* Модалка, которая сменила содержимое на месте (шаг по ленте, пришла деталь), меняет размер плавно, а не прыжком: скрипт
   ставит прежний размер, класс is-resizing и новый размер; рамка растёт или сужается от центра, коробка заполняет её —
   подвал едет вместе с краем, середина на время не прокручивается. В конце скрипт снимает класс и размеры */
.ch-modal.is-resizing { transition: width .24s var(--ease), height .24s var(--ease); }
.ch-modal.is-resizing > .ch-modal__box { height: 100%; }
.ch-modal.is-resizing .ch-modal__body { overflow: hidden; }
/* Модалка приходит так же, когда её ставит скрипт поверх ch-scrim, а не <dialog open> */
/* Заполнение backwards, не both (0.31.1): после прихода на коробке не остаётся transform, иначе она — рамка для position: fixed,
   и список ch-select в окне обрезался бы краем модалки (overflow: hidden) */
.ch-modal[open] .ch-modal__box, .ch-scrim > .ch-modal > .ch-modal__box { animation: ch-arrive .25s var(--ease) backwards; }

/* ── Поле формы: подпись 13 над полем, подсказка или ошибка под ним. Поле — как композер: фон поля, волосяная рамка,
      в фокусе рамка темнее. Ошибка — рамка и текст красным со знаком: красный в системе значит «что-то не так» ── */
.ch-field { display: grid; gap: var(--space-1); min-width: 0; }
.ch-field__label { font: 500 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); }
/* «Optional» у необязательного поля — в подписи после пробела и ещё 4, серым и тоньше подписи: подпись — имя поля, чернилами,
   «Optional» — пометка при нём (владелец, 2026-11-11: подпись серым и «Optional» серым через пробел читались одной фразой).
   Отступ — пробел и поле, читалка слышит два слова */
.ch-field__optional { margin-left: var(--space-1); font-weight: 400; color: var(--ink-muted); }
.ch-field__hint { font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--ink-muted); }
/* Ошибка в несколько строк (отказ адреса в Add competitors — два-три предложения) переносится от начала строки, знак — у первой
   строки, а не посередине абзаца; ошибка в одну строку стоит, как стояла: знак по середине её строки. Адрес без пробелов в ней
   (личная ссылка deel.com/invite/a8F3kQ9…) рвётся у края, а не выталкивает форму за край окна на телефоне: слова ошибки — текст
   без своей обёртки, и только overflow-wrap: anywhere сжимает их наименьшую ширину */
.ch-field__error { display: inline-flex; align-items: flex-start; gap: var(--space-1); min-width: 0; font: 500 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--alert); overflow-wrap: anywhere; }
.ch-field__error .ch-icon { flex: none; width: var(--icon-sm); height: var(--icon-sm); margin-top: calc((var(--leading-meta) - var(--icon-sm)) / 2); }
.ch-input, .ch-textarea, .ch-select__button {
  width: 100%; min-height: var(--control); padding: 0 var(--space-3);
  background: var(--field); border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); transition: border-color .15s;
}
.ch-input::placeholder, .ch-textarea::placeholder { color: var(--ink-muted); opacity: 1; }
.ch-input:hover, .ch-textarea:hover, .ch-select__button:not(:disabled):hover { border-color: var(--ink-muted); }
.ch-input:focus, .ch-textarea:focus, .ch-select__button:focus { outline: none; border-color: var(--ink-muted); }
.ch-input:focus-visible, .ch-textarea:focus-visible, .ch-select__button:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ch-textarea { min-height: 5.5rem; padding: var(--space-2) var(--space-3); resize: vertical; }
/* ── Выбор из списка (ch-select, система 0.31.0): список рисует система, а не браузер, — одинаковый везде (владелец, 3 ноября 2026).
      Закрытый — кнопка в виде поля (role=combobox): выбранное словами, длиннее поля — многоточием до стрелки; значение для формы
      несёт скрытый input. Открытый — панель меню (ch-menu role=listbox) прямо под полем: левый край по левому краю поля, не уже
      поля, шире — только если варианту нужно, до 360; зазор space-1, как у других панелей; внизу места нет — над полем; поле
      не закрывает никогда. Длинный список прокручивается внутри, не выше 320 и места до края окна (--float-room).
      Выбранный — галочкой акцентом в конце строки, как у ch-combobox и меню периода; активный (стрелки, наведение) — подложкой
      wash. Место списка ставит ChimeraUI (ui.js) скриптом: position: fixed, так что список не режет панель с overflow (календарь
      в панели своего периода) ── */
.ch-select { position: relative; display: grid; grid-template-columns: minmax(0, 1fr); min-width: 0; }
.ch-select__button { display: flex; align-items: center; min-width: 0; gap: var(--space-2); text-align: left; cursor: pointer; }
/* Ширина — по самому длинному варианту, как у списка браузера (0.31.1): в ячейке слов под выбранным стоят невидимо все варианты
   (ch-select__sizer, aria-hidden), так что поле, ширину которого задаёт содержимое (ряд ch-fields, год в календаре), не меняет
   ширину со сменой выбора и не двигает соседей. Поле с заданной шириной по-прежнему кончает длинный выбор многоточием */
.ch-select__value { flex: 1 1 auto; min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr); }
.ch-select__chosen, .ch-select__sizer, .ch-select__sizer > * { grid-area: 1 / 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ch-select__sizer { display: grid; grid-template-columns: minmax(0, 1fr); visibility: hidden; }
.ch-select__button > .ch-icon { flex: none; width: var(--icon-sm); height: var(--icon-sm); color: var(--ink-muted); }
.ch-select__button[aria-expanded="true"] { border-color: var(--ink-muted); }
.ch-select__button:disabled > .ch-icon { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); }
.ch-select__list {
  position: fixed; top: 0; left: 0; z-index: 80;
  min-width: var(--select-width, 100%); width: max-content; max-width: min(22.5rem, calc(100vw - 2 * var(--space-2)));
  max-height: min(20rem, var(--float-room, 20rem));
}
[aria-invalid="true"].ch-input, [aria-invalid="true"].ch-textarea, .ch-select__button[aria-invalid="true"] { border-color: var(--alert); }
.ch-input:disabled, .ch-textarea:disabled, .ch-select__button:disabled, .ch-input:disabled::placeholder, .ch-textarea:disabled::placeholder { background: transparent; color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: not-allowed; }
/* Поле в рамке с тем, что внутри: знак и единица по краям числа ($ … USD), тихая кнопка в конце (Show, Copy).
   Рамка, наведение, фокус и ошибка — как у поля; само поле внутри без рамки и тянется */
.ch-affix {
  display: flex; align-items: center; gap: var(--space-2); min-height: var(--control); padding: 0 var(--space-3);
  background: var(--field); border: var(--hairline) solid var(--line-control); border-radius: var(--radius); transition: border-color .15s;
}
.ch-affix:hover { border-color: var(--ink-muted); }
.ch-affix:focus-within { border-color: var(--ink-muted); }
.ch-affix:has(.ch-input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 1px; }
.ch-affix:has(.ch-input[aria-invalid="true"]) { border-color: var(--alert); }
.ch-affix:has(.ch-input:disabled) { background: transparent; }
.ch-affix > .ch-input, .ch-affix > .ch-input:is(:hover, :focus, :focus-visible) { flex: 1; width: auto; min-width: 0; min-height: calc(var(--control) - 2 * var(--hairline)); padding: 0; border: 0; outline: none; background: none; }
.ch-affix__unit { flex: none; font: 400 var(--text-meta)/var(--leading-meta) var(--font-data); color: var(--ink-muted); font-variant-numeric: tabular-nums; }
.ch-affix--num > .ch-input { text-align: right; font-variant-numeric: tabular-nums; }
.ch-affix > .ch-btn { flex: none; align-self: stretch; min-height: 0; margin: 0.125rem calc(0.125rem - var(--space-3)) 0.125rem 0; padding: 0 var(--space-3); font-size: var(--text-label); }
/* Группа полей в строку: подписи сверху, поля по одной линии, кнопка — вровень с полями, даже когда под полем появилась ошибка */
.ch-fields { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, auto); align-items: start; gap: var(--space-3); }
.ch-fields > .ch-btn { margin-top: calc(var(--leading-label) + var(--space-1)); }
/* --grow: поле тянется рядом с кнопками, от 240px; где тесно, кнопки уходят строкой ниже, поля встают одно под другим */
.ch-fields--grow { display: flex; flex-wrap: wrap; }
.ch-fields--grow > .ch-field { flex: 1 1 15rem; }
/* --one: одно поле на всю строку и его кнопка в конце, мерой текста (Add profile на Watching); подсказка — под полем, кнопка — вровень
   с полем. В контейнере 560 и уже (телефон, порог страниц досье) кнопка встаёт под поле, с его левого края
   (система 0.49.0, было co-pf-add) */
.ch-fields--one { grid-template-columns: minmax(0, 1fr) auto; max-width: var(--measure); }
@container (max-width: 35rem) {
  .ch-fields--one { grid-auto-flow: row; grid-template-columns: minmax(0, 1fr); }
  .ch-fields--one > .ch-btn { justify-self: start; margin-top: 0; }
}
.ch-fieldset { display: grid; gap: var(--space-1); margin: 0; padding: 0; border: 0; }
.ch-fieldset > legend { padding: 0; margin-bottom: var(--space-1); font: 500 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }

/* Выбор одного из нескольких: круглая отметка, выбранная — акцентом, как выбранный фильтр */
.ch-radio { display: flex; align-items: center; gap: var(--space-2); min-height: 1.875rem; cursor: pointer; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.ch-radio input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ch-radio__dot { position: relative; width: 1rem; height: 1rem; flex: none; border: var(--hairline) solid var(--ink-muted); border-radius: var(--radius-full); }
.ch-radio input:checked + .ch-radio__dot { border-color: var(--accent); }
.ch-radio input:checked + .ch-radio__dot::after { content: ""; position: absolute; inset: 0.1875rem; border-radius: var(--radius-full); background: var(--accent); }
.ch-radio input:focus-visible + .ch-radio__dot { outline: 2px solid var(--accent); outline-offset: 2px; }
.ch-radio:has(input:disabled) { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: not-allowed; }
.ch-radio input:disabled + .ch-radio__dot { border-color: var(--line-control); }
/* Выбор с пояснением: слово и строка под ним — чем вариант отличается от соседних (совпадения реестра в Add a company: номер,
   дата регистрации, адрес). Длинное слово переносится у края, а не раздвигает окно; точка — у первой строки слова, как рамка
   у флажка с пояснением. Недоступный вариант стоит на месте, словом тише, а не полупрозрачным целиком: его строка говорит,
   почему его не выбрать («Already one of Multiplier’s companies»), и должна читаться */
.ch-radio:has(> .ch-radio__text) { align-items: flex-start; padding-block: var(--space-1); }
.ch-radio:has(> .ch-radio__text) .ch-radio__dot { margin-top: calc((var(--leading-ui) - 1rem) / 2); }
.ch-radio__text { display: grid; gap: var(--space-1); min-width: 0; overflow-wrap: anywhere; }
.ch-radio__desc { font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--ink-muted); }
/* Ошибка группы (радиокнопки, флажки стран) — словами под её вариантами, последней в fieldset, на шаге группы; группа связана
   с ней aria-describedby и помечена aria-invalid (ChimeraUI.invalid(fieldset, '…')). Варианты не краснеют: какую группу
   поправить, говорят слова под ней */

/* Поле файла: кнопка в рамке выбирает файл — это label вокруг скрытого input type=file, так что фокус, Enter, подпись и ошибка
   у самого поля; рядом — что подходит («PNG or JPG») или имя выбранного файла метой и тихая кнопка Remove. Ошибка — под полем,
   как у любого поля: рамка кнопки красным, слова — ch-field__error, связанные с input */
.ch-file { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); min-width: 0; }
.ch-file__input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ch-file > .ch-btn:has(> .ch-file__input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }
.ch-file > .ch-btn:has(> .ch-file__input[aria-invalid="true"]) { border-color: var(--alert); }
.ch-file__name { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); min-width: 0; overflow-wrap: anywhere; }

/* ── Кнопка необратимого действия: красным словом и рамкой, без заливки. Основной остаётся одна кнопка на экран ── */
.ch-btn--danger { color: var(--alert); border-color: color-mix(in srgb, var(--alert) 45%, transparent); }
.ch-btn--danger:hover { background: color-mix(in srgb, var(--alert) 10%, var(--paper)); }
/* Недоступная (disabled или aria-disabled, не занятая) красную рамку теряет — как недоступная контурная: обводка --line-control,
   слово — как у недоступного (ink-muted на 55%), наведение ничего не меняет. Занятая — как была */
.ch-btn--danger:is(:disabled, [aria-disabled="true"]):not([aria-busy="true"]), .ch-btn--danger:is(:disabled, [aria-disabled="true"]):not([aria-busy="true"]):hover { background: transparent; border-color: var(--line-control); color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
/* Кнопка, которая ждёт ответа: крутилка вместо иконки, нажать ещё раз нельзя */
.ch-btn[aria-busy="true"] { color: var(--ink-muted); cursor: progress; }
/* Основная кнопка в ожидании остаётся основной: заливка и рамка акцентом, слово и крутилка — цветом на акценте, как у отправки;
   наведение заливку не меняет и не снимает — нажать ещё раз нельзя. Сильнее недоступной (:disabled, aria-disabled):
   busy() ставит disabled, продукт — aria-disabled */
.ch-btn--primary[aria-busy="true"], .ch-btn--primary[aria-busy="true"]:hover { background: var(--accent); border-color: var(--accent); color: var(--on-accent); cursor: progress; }
.ch-btn--primary[aria-busy="true"] .ch-spinner { border-color: color-mix(in srgb, var(--on-accent) 35%, transparent); border-top-color: var(--on-accent); }

/* ── Баннер: сообщение о состоянии страницы — знак, текст, действия. Сплошная заливка тоном, текст и кнопки — цветом бумаги,
      как у тоста: пропустить нельзя. Обычный — чернилами; --alert — красный: что-то не работает и это меняет то, что вы видите ниже ── */
.ch-banner {
  --tone: var(--ink);
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; column-gap: var(--space-3); align-items: start;
  padding: var(--space-3) var(--space-4); border-radius: var(--radius);
  background: var(--tone); border: var(--hairline) solid var(--tone); color: var(--paper);
  font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui);
  /* Ширина баннера — ширина того, над чем он стоит (владелец, 2026-11-05: «уведомление, после которого полэкрана пусто»):
     коробка не останавливается на мере чтения, слова внутри — останавливаются. Баннер — контейнер: по своей ширине он решает,
     где стоит действие. Растягивается и там, где соседи стоят по началу строки: контейнер не берёт ширину у содержимого */
  container-type: inline-size; justify-self: stretch;
}
.ch-banner--alert { --tone: var(--alert); }
.ch-banner > .ch-icon { width: 1.125rem; height: 1.125rem; margin-top: calc((var(--leading-ui) - 1.125rem) / 2); color: inherit; }
.ch-banner__text { margin: 0; max-width: var(--measure); }
.ch-banner__text b { font-weight: 500; }
.ch-banner__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-4); grid-column: 2; margin-top: var(--space-2); }
/* Кнопки и ссылки на заливке — цветом бумаги: контурная кнопка, подчёркнутая ссылка, крестик */
.ch-banner .ch-btn, .ch-banner .ch-btn:hover, .ch-banner .ch-btn:disabled, .ch-banner .ch-btn[aria-busy="true"] { color: inherit; }
.ch-banner .ch-btn:not(.ch-btn--icon) { background: transparent; border-color: color-mix(in srgb, var(--paper) 60%, transparent); }
.ch-banner .ch-btn:not(.ch-btn--icon):hover { background: color-mix(in srgb, var(--paper) 14%, transparent); }
.ch-banner .ch-btn:disabled { opacity: .7; }
/* Недоступная на заливке (aria-disabled — она держит фокус и подсказку: Check them now, когда проверять сегодня нечего,
   CHI-1616): как недоступная на бумаге, только от бумаги — слово бумагой на 55%, рамка бумагой на 30%; наведение ничего не
   меняет. Прозрачность кнопки не трогается: подсказка (data-tip) над ней остаётся плотной */
.ch-banner .ch-btn:not(.ch-btn--icon)[aria-disabled="true"]:not([aria-busy="true"]),
.ch-banner .ch-btn:not(.ch-btn--icon)[aria-disabled="true"]:not([aria-busy="true"]):hover { background: transparent; border-color: color-mix(in srgb, var(--paper) 30%, transparent); color: color-mix(in srgb, var(--paper) 55%, transparent); cursor: default; }
.ch-banner .ch-spinner { border-color: color-mix(in srgb, var(--paper) 35%, transparent); border-top-color: currentColor; }
.ch-banner .ch-link, .ch-banner .ch-link:hover { color: inherit; text-decoration: underline; text-underline-offset: 4px; }
.ch-banner > .ch-btn--icon { grid-column: 3; grid-row: 1; width: 1.5rem; min-height: 1.5rem; margin: calc((var(--leading-ui) - 1.5rem) / 2) calc(var(--space-2) * -1) 0 0; opacity: .75; }
.ch-banner > .ch-btn--icon:hover { opacity: 1; }
.ch-banner :focus-visible { outline-color: var(--paper); }
/* Широкий баннер (840 и шире — колонка документа на десктопе): действие — у правого края, в одну строку со словами, по
   середине их первой строки; слова и знак опущены на половину разницы строки с кнопкой, так что строка из слов и кнопки стоит
   ровно. Крестик — после действия. Уже 840 (телефон, узкая колонка, окно диалога) — действие под словами, как было */
@container (min-width: 52.5rem) {
  .ch-banner__actions { grid-column: 3; grid-row: 1; flex-wrap: nowrap; justify-content: flex-end; margin-top: 0; margin-left: var(--space-6); }
  .ch-banner__actions ~ .ch-btn--icon { grid-column: 4; }
  .ch-banner:has(> .ch-banner__actions) > .ch-banner__text { padding-block: calc((var(--control) - var(--leading-ui)) / 2); }
  .ch-banner:has(> .ch-banner__actions) > .ch-icon { margin-top: calc((var(--control) - 1.125rem) / 2); }
}

/* ── Тост: короткое подтверждение сделанного внизу экрана, чернилами по бумаге наоборот; «Undo» — подчёркнутым словом.
      Уходит сам через несколько секунд; с действием — живёт дольше; о сбое — красный (--alert, ниже) и стоит до крестика.
      Стопка — во всю ширину окна без полей по 16px, тост — по центру шириной по словам: на телефоне он берёт всю строку,
      а не половину окна ── */
.ch-toasts { position: fixed; left: var(--space-4); right: var(--space-4); bottom: var(--space-6); z-index: 80; display: grid; gap: var(--space-2); justify-items: center; pointer-events: none; }
.ch-toast {
  display: flex; align-items: center; gap: var(--space-4); max-width: min(35rem, 100%); min-height: 2.5rem; padding: var(--space-2) var(--space-2) var(--space-2) var(--space-4);
  background: var(--ink); color: var(--paper); border-radius: var(--radius); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui);
  pointer-events: auto; animation: ch-arrive .25s var(--ease) both;
}
/* Действие тоста — кнопка: слово не переносится, переносятся слова сообщения */
.ch-toast__action { flex: none; white-space: nowrap; padding: 0 var(--space-2); border: 0; background: none; cursor: pointer; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--paper); text-decoration: underline; text-underline-offset: 4px; }
/* Крестик держит свою ширину: длинный тост сжимал его до 14px. Тост из двух фраз с действием (заголовок и описание — «2 pages
   added to Deel’s sources. Scout reads them now…» и «Open Deel’s sources») в узкой стопке (телефон, до 480px): слова — первой
   строкой во всю ширину, с тем же полем справа, что слева; действие и крестик — строкой под ними, слово действия — от края
   слов, крестик — в конце строки. Порядок на экране — порядок разметки и Tab: слова, действие, крестик. Короткий тост
   («Marked as noise · Undo») и любой тост на широком экране стоят, как стояли */
.ch-toasts { container-type: inline-size; }
@container (max-width: 30rem) {
  .ch-toast:has(> :first-child > b):has(> .ch-toast__action) { flex-wrap: wrap; row-gap: var(--space-1); }
  .ch-toast:has(> :first-child > b):has(> .ch-toast__action) > :first-child { flex: 1 0 100%; padding-right: var(--space-2); }
  .ch-toast:has(> :first-child > b) > .ch-toast__action { margin-left: calc(var(--space-2) * -1); }
  .ch-toast:has(> :first-child > b) > .ch-toast__action + .ch-toast__close { margin-left: auto; }
}
.ch-toast__close { display: grid; place-items: center; flex: none; width: 1.5rem; height: 1.5rem; padding: 0; border: 0; border-radius: var(--radius-sm); background: none; color: var(--paper); opacity: .7; cursor: pointer; }
.ch-toast__close:hover { opacity: 1; }
.ch-toast__close .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }
.ch-toast :focus-visible { outline-color: var(--paper); }

/* Тост о сбое (--alert): то, что не вышло, — заливкой сбоя, как баннер о сбое, и знаком сбоя i-alert перед словами, 18px, как
   у баннера, в 12px от слов («The finding wasn’t put back in Kleos’s entities. Chimera couldn’t reach the server…»). Слова,
   действие и крестик — цветом бумаги, как у любого тоста; стоит, пока его не закроют. Знак, действие и крестик держатся первой
   строки слов, а не середины абзаца: строка тоста стоит по верху, слова и действие опущены на половину разницы своей строки
   с крестиком, знак — на половину своей; тост в одну строку стоит, как тост без знака. Класс — только вместе со знаком:
   красного тоста без знака нет */
.ch-toast--alert { align-items: flex-start; background: var(--alert); }
.ch-toast--alert > .ch-icon { width: 1.125rem; height: 1.125rem; margin: calc((1.5rem - 1.125rem) / 2) calc(var(--space-3) - var(--space-4)) 0 0; }
.ch-toast--alert > :not(.ch-icon, .ch-toast__close) { margin-top: calc((1.5rem - var(--leading-ui)) / 2); }
/* Тост о сбое из двух фраз с действием на телефоне — как любой: слова — первой строкой, за знаком, до конца строки; действие
   и крестик — строкой под ними, слово действия — от края слов, а не от знака, крестик — в конце строки */
@container (max-width: 30rem) {
  .ch-toast--alert:has(> .ch-icon + * > b):has(> .ch-toast__action) { flex-wrap: wrap; row-gap: var(--space-1); }
  .ch-toast--alert:has(> .ch-icon + * > b):has(> .ch-toast__action) > .ch-icon + * { flex: 1 0 calc(100% - 1.125rem - var(--space-3)); padding-right: var(--space-2); }
  .ch-toast--alert:has(> .ch-icon + * > b) > .ch-toast__action { margin-left: calc(1.125rem + var(--space-3) - var(--space-2)); }
  .ch-toast--alert:has(> .ch-icon + * > b) > .ch-toast__action + .ch-toast__close { margin-left: auto; }
}

/* ── Диалог подтверждения: та же модалка, узкая; вопрос, что случится, и два ответа — отменить и сделать ── */
.ch-modal--confirm { width: min(92vw, 27.5rem); }
/* Модалка с формой: строка чтения шириной, шапка и подвал как у большой; заголовок — на ступень ниже заголовка страницы, как у подтверждения;
   абзацы тела — тише полей */
.ch-modal--form { width: min(92vw, var(--measure)); }
.ch-modal--form .ch-title { font-size: var(--text-heading); line-height: var(--leading-heading); }
.ch-modal--form .ch-modal__body > p:not([class]) { margin: 0; max-width: var(--measure); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.ch-modal--confirm .ch-modal__head { border-bottom: 0; padding-bottom: 0; }
.ch-modal--confirm .ch-modal__body { gap: var(--space-3); padding-top: var(--space-3); color: var(--ink-muted); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }
.ch-modal--confirm .ch-modal__foot { justify-content: flex-end; border-top: 0; padding-top: 0; }
.ch-modal--confirm .ch-title { font-size: var(--text-heading); line-height: var(--leading-heading); }
.ch-modal--confirm .ch-modal__body p { margin: 0; max-width: var(--measure); }
/* Что действие закроет — строками под фразой (вопросы дела, которые закроет архив): слова людей интерфейсным шрифтом и чернилами,
   как строка списка на странице, не больше двух строк, дальше многоточие; слова целиком остаются в разметке. Строки — не ссылки:
   диалог решает, а не уводит. Больше трёх — первые три, а за списком строка меты «and N more» */
.ch-modal__list > li { padding: var(--space-3) 0; }
.ch-modal__item { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-wrap: pretty; }

/* ── Загрузка: крутилка — когда ждём секунды; полоса — когда известна доля; заготовка — пока не пришёл текст.
      Полоса работы Скаута — зелёная, как «агент работает»; остальное — чернилами ── */
.ch-spinner { display: inline-block; width: 1rem; height: 1rem; flex: none; border: 1.5px solid var(--line-control); border-top-color: var(--ink-muted); border-radius: var(--radius-full); animation: ch-spin .8s linear infinite; }
.ch-progress { height: 0.25rem; overflow: hidden; border-radius: var(--radius-full); background: var(--line); }
.ch-progress > span { display: block; height: 100%; border-radius: inherit; background: var(--ink); transition: width .3s var(--ease); }
.ch-progress--live > span { background: var(--live); }
.ch-progress--busy > span { width: 30%; animation: ch-slide 1.4s var(--ease) infinite; }
.ch-skeleton { display: block; height: 0.75rem; border-radius: var(--radius-sm); background: var(--wash); animation: ch-pulse 1.8s ease-in-out infinite; }
.ch-skeleton--title { height: 1rem; }
.ch-skeleton--tile { width: 1.125rem; height: 1.125rem; }
/* На плашках ленты (feed-plate, под указателем feed-plate-hover) полоса wash почти пропадала: 1.14 и 1.05 : 1 в покое, 1.01 на дне
   пульса. Здесь — свой тон (skeleton-plate) и пульс мельче (до .65, не .3): в светлой 1.67 / 1.54 : 1 в покое на плашке и под указателем,
   1.38 / 1.31 на дне (0.68.1); важная с 0.71.0 лежит на той же плашке — те же значения */
.ch-list--feed .ch-skeleton { background: var(--skeleton-plate); animation-name: ch-pulse-plate; }
/* Внутри поднятого — его заготовка: на бумаге тон и пульс плашки (поднятый там того же тона), на холсте — wash и обычный пульс */
.ch-raised .ch-skeleton { background: var(--raised-skeleton); animation-name: var(--raised-pulse, ch-pulse-plate); }

/* ── Ожидание поверх страницы (ch-wait; владелец, 4 ноября 2026): продукт ждёт то, без чего окно не открыть (подробности
      находки, её снимок), и ждёт дольше 200 мс. Слой — то же затемнение, что под окном (ch-scrim, слой 50), и оно общее с
      окном: когда окно готово, уходит только плашка. По центру — плашка бумаги окна (волосок line-control, скругление 4,
      без тени), на ней знак ожидания и слово. Знак — четыре кубика на языке рисунков находки (dist/wait.json из
      scripts/iso/wait.py): отметка обходит их по часовой стрелке, отмеченный приподнимается. Это знак «жду», не предмет
      находки. Без движения фигура стоит целой, отмечен дальний кубик, и ожидание говорит слово ── */
.ch-wait { cursor: default; animation: ch-wait-in .16s var(--ease) both; }
html:has(.ch-wait:not([hidden])) { overflow: hidden; }
.ch-wait__plate {
  display: flex; flex-direction: column; align-items: center; gap: var(--space-3);
  min-width: 12rem; max-width: 100%; padding: var(--space-6) var(--space-8);
  background: var(--paper); color: var(--ink);
  border: var(--hairline) solid var(--line-control); border-radius: var(--radius);
  animation: ch-arrive .25s var(--ease) .05s backwards;
}
.ch-wait__word { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); text-align: center; text-wrap: balance; }
.ch-wait__fig { display: block; flex: none; width: 3.25rem; height: 3rem; overflow: visible; }
/* Роли знака — ступени рисунка без плиты: плашка — бумага, на ней самая светлая грань плиты пропала бы */
.ch-wait__fig .th-1 { fill: var(--drawing-canvas-1); }
.ch-wait__fig .th-2 { fill: var(--drawing-canvas-2); }
.ch-wait__fig .th-3 { fill: var(--drawing-canvas-3); }
.ch-wait__fig .th-m1 { fill: var(--drawing-mark-1); }
.ch-wait__fig .th-m2 { fill: var(--drawing-mark-2); }
.ch-wait__fig .th-m3 { fill: var(--drawing-mark-3); }
/* Обход: 1.6 с на круг, по 0.4 с на кубик, по часовой стрелке (дальний, правый, ближний, левый); соседние отметки
   перетекают одна в другую. Подъём — в долях viewBox (transform-box: view-box): 7.7% — 3 из 39 единиц, место над
   кубиками, которое оставляет wait.py; в долях, а не в px, он растёт вместе с фигурой при размере M и L */
.ch-wait__cube { transform-box: view-box; animation: ch-wait-lift 1.6s var(--ease) infinite; }
.ch-wait__mark { opacity: 0; animation: ch-wait-mark 1.6s var(--ease) infinite; }
.ch-wait__cube--0, .ch-wait__cube--0 .ch-wait__mark { animation-delay: -1.6s; }
.ch-wait__cube--1, .ch-wait__cube--1 .ch-wait__mark { animation-delay: -1.2s; }
.ch-wait__cube--2, .ch-wait__cube--2 .ch-wait__mark { animation-delay: -.8s; }
.ch-wait__cube--3, .ch-wait__cube--3 .ch-wait__mark { animation-delay: -.4s; }
@keyframes ch-wait-in { from { opacity: 0; } }
@keyframes ch-wait-mark { 0% { opacity: 0; } 8%, 25% { opacity: 1; } 40%, 100% { opacity: 0; } }
@keyframes ch-wait-lift { 0% { transform: none; } 8%, 25% { transform: translateY(-7.7%); } 40%, 100% { transform: none; } }
@media (prefers-reduced-motion: reduce) {
  .ch-wait__cube--0 .ch-wait__mark { opacity: 1; }
}
/* Заготовка раздела, пока он в пути: заголовок и строки стопкой; ширины строк задаёт страница */
.ch-skeletons { display: grid; gap: var(--space-3); align-content: start; }

/* ── Подсказка: подпись к кнопке-иконке по наведению и фокусу, чернилами по бумаге наоборот.
      Ставится атрибутом data-tip; data-tip-pos="bottom" — под кнопкой, если сверху не хватает места; "bottom-end" — под ней по правому краю ── */
[data-tip] { position: relative; }
[data-tip]::after {
  content: attr(data-tip); position: absolute; left: 50%; bottom: calc(100% + 0.375rem); z-index: 40;
  padding: 0.125rem var(--space-2); border-radius: var(--radius-sm); background: var(--ink); color: var(--paper);
  font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); white-space: nowrap; pointer-events: none;
  box-shadow: var(--float-lift);
  opacity: 0; transform: translate(-50%, 0.125rem); transition: opacity .12s, transform .12s;
}
[data-tip][data-tip-pos="bottom"]::after { top: calc(100% + 0.375rem); bottom: auto; transform: translate(-50%, -0.125rem); }
/* bottom-end — у кнопки в конце строки, у края страницы («···» в шапке документа): подсказка встаёт под ней по правому краю
   и не выходит за окно — иначе страница прокручивалась бы вбок даже со скрытой подсказкой */
[data-tip][data-tip-pos="bottom-end"]::after { top: calc(100% + 0.375rem); bottom: auto; left: auto; right: 0; transform: translateY(-0.125rem); }
[data-tip]:hover::after, [data-tip]:focus-visible::after { opacity: 1; transform: translate(-50%, 0); transition-delay: .3s; }
[data-tip][data-tip-pos="bottom-end"]:is(:hover, :focus-visible)::after { transform: none; }
/* Та же подсказка элементом — когда её ставит скрипт (длинная подпись, подпись в меню или модалке) */
.ch-tooltip { z-index: 75; max-width: 20rem; padding: 0.125rem var(--space-2); border-radius: var(--radius-sm); background: var(--ink); color: var(--paper); font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); box-shadow: var(--float-lift); }

/* ── Пояснение (ch-info): к строке таблицы, к ряду или к заголовку раздела (ch-heading, ниже) — серый знак «i» на строке слов,
      само пояснение — в подсказке; у заголовка — один знак, не больше. Знак — тихая кнопка-иконка
      14 в поле 20 × строка: фокус, имя для читалки («Note»), пояснение — её описание (aria-describedby на скрытый
      ch-info__text рядом). Подсказка (ch-tooltip--note) открывается по наведению, по фокусу с клавиатуры и по нажатию —
      на сенсорном экране только так; нажатие оставляет её открытой, второе нажатие, Esc и нажатие мимо закрывают. Ставит её
      скрипт поверх страницы (position: fixed), над знаком, а у верхнего края — под ним: рамка таблицы (ch-table-wrap) её не
      режет. Это не сбой: знак серый, «i», не «!» — сбой говорит словами (ch-failing); у сбоя с пояснением кнопкой становится его
      собственный красный знак (ch-info--alert), серого «i» после слова нет ── */
.ch-info {
  display: inline-grid; place-items: center; width: 1.25rem; height: var(--leading-ui); margin-left: var(--space-1); padding: 0;
  border: 0; border-radius: var(--radius-sm); background: none; color: var(--ink-muted); cursor: pointer; vertical-align: top;
}
.ch-info .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }
.ch-info:hover, .ch-info[data-open] { background: var(--wash); color: var(--ink); }
.ch-info__text { display: none; }
/* В строке меты (номер и тема под вопросом) знак — высотой её строки: строка не растёт */
.ch-meta .ch-info { height: var(--leading-meta); }
/* ── Заголовок раздела с пояснением (ch-heading; владелец, 2026-11-04: «интерфейс — не чат»): то, что раздел говорит о себе, —
      метод, оговорка, правило счёта, модели — не строка под заголовком, а один ch-info после него, и никогда второй. Заголовок —
      строчный, так что знак стоит сразу за последним словом, 4 после него, по середине его строки: у заголовка в две строки — на второй,
      а не у края колонки. Своей строки у обёртки нет (line-height 0), строку задаёт заголовок. Ступень по умолчанию — heading 18/28,
      500, чернилами; свой класс у заголовка (ch-label) её перекрывает, и знак тогда — высотой его строки ── */
.ch-heading { min-width: 0; margin: 0; line-height: 0; text-wrap: pretty; }
/* Ступень по умолчанию — с весом элемента (0,0,1), как у сброса продукта (Tailwind preflight: h1–h6 { font-size: inherit;
   font-weight: inherit }, он стоит до chimera.css): равный вес — и правило системы выигрывает порядком, а свой класс заголовка
   (ch-label) — весом. С нулевым весом (:where целиком) сброс перекрывал его, и в продукте заголовок раздела стоял 14/400 (0.68.1) */
:where(.ch-heading) > :is(h1, h2, h3, h4) { font: 500 var(--text-heading)/var(--leading-heading) var(--font-ui); color: var(--ink); }
.ch-heading > :is(h1, h2, h3, h4) { display: inline; margin: 0; }
.ch-heading > .ch-info { margin: calc((var(--leading-heading) - var(--leading-ui)) / 2) 0 0 var(--space-1); }
.ch-heading:has(> .ch-label) > .ch-info { height: var(--leading-label); margin-top: 0; }
/* Подсказка пояснения: несколько строк до 320 (не шире окна без полей), каждое пояснение — своей строкой */
/* Подсказку можно навести и выделить её слова (WCAG 1.4.13): она берёт указатель и держится, пока он над ней или над знаком */
.ch-tooltip--note { position: fixed; top: 0; left: 0; max-width: min(20rem, calc(100vw - 1rem)); padding: var(--space-1) var(--space-2); text-wrap: pretty; overflow-wrap: break-word; }
.ch-tooltip--note > span { display: block; }
.ch-tooltip--note > span + span { margin-top: var(--space-1); }

/* ── Меню действий «···»: та же панель, что у фильтров; разделитель отделяет необратимое, оно — красным словом ── */
.ch-menu__sep { height: var(--hairline); margin: var(--space-1) 0; border: 0; background: var(--line); }
.ch-menu__item--danger { color: var(--alert); }
.ch-menu[role="menu"] { min-width: 13.75rem; }

/* ── Выбор одного из двух-трёх: слова тихими кнопками, выбранное — акцентом, как включённый фильтр. Без рамки и подложки:
      вид списка (List · Board), размер интерфейса (S · M · L), тема. Группа кнопок с aria-pressed — или радиогруппа
      (role=radiogroup, кнопки role=radio с aria-checked): стрелки ходят по вариантам и сразу выбирают (ui.js) ── */
.ch-segmented { display: inline-flex; flex-wrap: wrap; gap: var(--space-1); }
.ch-segmented > .ch-btn:is([aria-pressed="true"], [aria-checked="true"]) { color: var(--accent); }

/* ── Страницы списка (ch-pager; владелец, 2026-11-09: убеждения по 25) — выбор словами, как ch-segmented: номера — тихие
      кнопки, текущая — акцентом (aria-current="page"), по краям — шевроны «назад» и «вперёд» с подписью для скринридера
      (на первой и последней странице — disabled). До семи страниц — все номера; больше — первая, последняя, текущая с соседями
      и «…» между (ch-pager__gap). Одна страница — без ряда. Стоит в строке счёта под списком (fd__more) ── */
.ch-pager { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--space-1); }
.ch-pager > .ch-btn:not(.ch-btn--icon) { min-width: var(--control); justify-content: center; padding-inline: var(--space-2); font-variant-numeric: tabular-nums; }
.ch-pager > .ch-btn[aria-current="page"] { color: var(--accent); }
.ch-pager__gap { min-width: var(--space-6); text-align: center; color: var(--ink-muted); }

/* ── Строка настройки: имя и что настройка делает сейчас — слева, управление — в конце строки, на первой строке имени.
      Имя — подпись управления (label for), описание — его aria-describedby; описание меняется вместе с настройкой.
      Строки лежат в ch-list ch-settings; в узком списке выбор словами и поле уходят под текст, переключатель остаётся справа ── */
.ch-settings { container-type: inline-size; }
.ch-setting { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: var(--space-8); row-gap: var(--space-3); align-items: start; padding: var(--space-4) 0; }
.ch-setting__text { display: grid; gap: var(--space-1); min-width: 0; }
.ch-setting__name { justify-self: start; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.ch-setting__desc { margin: 0; max-width: var(--measure); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); text-wrap: pretty; }
.ch-setting__control { display: flex; align-items: center; justify-content: flex-end; min-height: var(--leading-ui); }
/* Кнопка и выбор словами стоят по центру первой строки имени и не раздвигают строку */
.ch-setting__control > :is(.ch-btn, .ch-segmented) { margin-block: calc((var(--leading-ui) - var(--control)) / 2); }
/* Слова тихих кнопок кончаются у края строки, как переключатель: поле кнопки выходит за край */
.ch-setting__control > .ch-segmented { margin-inline-end: calc(var(--space-3) * -1); }
/* Поле (список, поле с поиском) — под текстом, как поле формы под подписью: справа от абзаца ему тесно */
.ch-setting:has(> .ch-setting__control > :is(.ch-select, .ch-combobox)) { grid-template-columns: minmax(0, 1fr); }
.ch-setting__control:has(> :is(.ch-select, .ch-combobox)) { justify-content: flex-start; }
.ch-setting__control > :is(.ch-select, .ch-combobox) { width: min(100%, 20rem); }
@container (max-width: 30rem) {
  .ch-setting:has(> .ch-setting__control > .ch-segmented) { grid-template-columns: minmax(0, 1fr); }
  .ch-setting__control:has(> .ch-segmented) { justify-content: flex-start; }
  .ch-setting__control > .ch-segmented { margin-block: 0; margin-inline: calc(var(--space-3) * -1) 0; }
}

/* ── Поле с выбором из длинного списка (часовой пояс, находка для дела): поле ввода ищет, под ним — варианты той же панелью,
      что у меню. Стрелки двигают выделение (aria-activedescendant), Enter выбирает, Esc и уход фокуса возвращают прежнее значение.
      Выбранный вариант — галочкой акцентом; пояснение варианта (смещение пояса, дата) — мелко справа ── */
.ch-combobox { position: relative; display: grid; }
.ch-combobox > .ch-input { padding-right: var(--space-8); text-overflow: ellipsis; }
.ch-combobox > .ch-icon { position: absolute; right: var(--space-3); top: calc(var(--control) / 2); width: var(--icon-sm); height: var(--icon-sm); transform: translateY(-50%); color: var(--ink-muted); pointer-events: none; }
.ch-combobox > .ch-menu { right: 0; min-width: 17.5rem; max-height: 20rem; }
.ch-menu__item.is-active { background: var(--wash); }
.ch-menu__item[aria-selected="true"] .ch-icon { visibility: visible; color: var(--accent); }
.ch-menu__desc { margin-left: auto; padding-left: var(--space-4); font: 400 var(--text-meta)/var(--leading-meta) var(--font-data); color: var(--ink-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ch-menu__desc + .ch-icon { margin-left: var(--space-2); }
/* На подложке наведения описание и заметка остаются ink-muted: на wash — 5.1 : 1 в светлой, 7.5 в тёмной */
/* Имя варианта переносится: длинный пояс в одно слово не раздвигает панель вбок */
.ch-menu__label { min-width: 0; overflow-wrap: anywhere; }
.ch-menu[role="listbox"] { overflow-x: hidden; }
/* Варианты в панели, которую ставит скрипт: высота — как у ch-combobox, ширина — поля, её задаёт скрипт */
.ch-menu--float[role="listbox"] { max-height: 20rem; }
.ch-menu__empty { margin: 0; padding: var(--space-1) var(--space-2); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }

/* ── Свой период: поля «From» и «To» и календарь под ними — в панели у той же кнопки, что открывает меню периода: бумага
      с рамкой меню (ch-menu; в продукте — ch-menu--float от поповера, в прототипе — ch-pop), голова ch-menu__group,
      подвал ch-menu__foot с «Cancel» и основной кнопкой, которая называет действие. Форма в списке пунктов меню не живёт:
      стрелки и поиск по буквам меню мешали бы вводу. Дату вводят словами («Mar 1, 2022», «1 мар. 2022», 2022-03-01) или
      выбирают в календаре; поле, которое заполнит следующий выбор, — в рамке темнее (is-picking). Ошибки — словами под
      обоими полями во всю ширину, у каждого поля своя строка (aria-describedby), рамка поля — красным.
      Ширина — 320, на телефоне — окно без полей слоя; высота — не больше места до края окна (--float-room).
      Панель — столбец: голова и подвал стоят, прокручивается только тело между ними, от линии подвала до головы; поля панели
      перешли к её частям, так что без прокрутки она та же, что прежде (тело — 16 от рамки сбоку, 16 до линии подвала) ── */
.ch-range { width: min(20rem, calc(100vw - 2 * var(--space-4))); max-height: var(--float-room, none); display: flex; flex-direction: column; gap: 0; padding: 0; overflow: hidden; }
.ch-range > .ch-menu__group { flex: none; margin: var(--space-2) var(--space-2) 0; }
.ch-range > .ch-menu__foot { flex: none; margin: 0 var(--space-2) var(--space-2); }
.ch-range__body { flex: 0 1 auto; min-height: 0; overflow: hidden auto; overscroll-behavior: contain; display: grid; gap: var(--space-3); padding: var(--space-2) var(--space-4) var(--space-4); }
.ch-range__fields { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: var(--space-3); row-gap: var(--space-1); }
.ch-range__fields > .ch-field__error { grid-column: 1 / -1; }
.ch-range .ch-field.is-picking > .ch-input:not([aria-invalid="true"]) { border-color: var(--ink-muted); }

/* ── Календарь: месяц и год — списками, так годы назад — два выбора, а не десятки нажатий; стрелки — соседние месяцы.
      Неделя — строка таблицы (role=grid), недель всегда шесть, пустые — в конце. Дни — тихие кнопки; сегодня — в рамке; дни после сегодня тише и не нажимаются.
      Концы выбранного — заливкой акцентом (выбор человека, как включённая радиокнопка), дни между ними — его оттенком,
      полосой без щелей, скруглённой у концов и у краёв недели. Клавиатура: стрелки — день и неделя, Home и End — начало
      и конец недели, PageUp и PageDown — месяц, с Shift — год; Enter и пробел выбирают ── */
.ch-cal { display: grid; gap: var(--space-2); }
.ch-cal__head { display: flex; align-items: center; gap: var(--space-1); }
.ch-cal__month { flex: 1 1 0; min-width: 0; }
.ch-cal__year { flex: none; }
.ch-cal__head .ch-select__button { padding-inline: var(--space-2); gap: var(--space-1); }
.ch-cal__grid { width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0 var(--space-1); margin-block: calc(var(--space-1) * -1); }
.ch-cal__grid th { padding: 0; font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--ink-muted); text-align: center; }
/* Сетка — всегда шесть недель; пустая неделя держит высоту дня, так что панель не меняет высоту с месяцем */
.ch-cal__grid td { padding: 0; height: var(--control); }
.ch-cal__day {
  display: grid; place-items: center; width: 100%; height: var(--control); padding: 0;
  border: var(--hairline) solid transparent; border-radius: var(--radius); background: none; cursor: pointer;
  font: 400 var(--text-ui)/1 var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums;
}
.ch-cal__day:hover { background: var(--wash); }
.ch-cal__day[aria-current="date"] { border-color: var(--line-control); font-weight: 500; }
.ch-cal__day:disabled, .ch-cal__day:disabled:hover { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); background: none; cursor: default; }
.ch-cal__grid td.is-in { background: var(--accent-tint); }
.ch-cal__grid td:is(.is-in:first-child, .is-start) { border-start-start-radius: var(--radius); border-end-start-radius: var(--radius); }
.ch-cal__grid td:is(.is-in:last-child, .is-end) { border-start-end-radius: var(--radius); border-end-end-radius: var(--radius); }
.ch-cal__grid td:is(.is-start, .is-end) > .ch-cal__day { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
.ch-cal__grid td:is(.is-start, .is-end) > .ch-cal__day:hover { background: color-mix(in srgb, var(--accent) 85%, var(--ink)); }

/* ── Грунты — вне продукта (data-ground, tokens.css): сайт и лендинги, карточка для соцсетей и слайд, шапка письма Химеры
      о себе. Блок на грунте сам берёт его фон и чернила — поле от края до края, не карточка и не панель. Золото (--highlight)
      отмечает в вещи не больше двух вещей, и различаются они формой: то, на чём она держится (цифра вместе с частью
      рисунка, которую она заполняет, и одной подписью или отметкой шкалы; один предмет графика; одно повторяемое слово —
      это слова и рисунок страницы, а не компонент), и её одно действие — основная кнопка, золотая
      со словами цветом грунта, или ссылка-действие, подчёркнутая золотом. Основная кнопка одна на экран — и золотое действие
      одно. Любая другая ссылка — бумагой, подчёркнутая цветом обводки: на поле ссылку цветом не отличить ── */
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) { background: var(--ground); color: var(--ink); }
/* Золотая кнопка: наведение — золото на 55% в бумагу (слова 11.48 / 13.57 / 11.45 : 1), нажатие — на 85% в грунт
   (7.38 / 8.57 / 7.41 : 1); фокус — кольцо бумагой, как на всём грунте */
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary { background: var(--highlight); border-color: var(--highlight); color: var(--on-highlight); }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary:not(:disabled, [aria-disabled="true"], [aria-busy="true"]):hover { background: color-mix(in srgb, var(--highlight) 55%, var(--ink)); border-color: color-mix(in srgb, var(--highlight) 55%, var(--ink)); }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary:not(:disabled, [aria-disabled="true"], [aria-busy="true"]):active { background: color-mix(in srgb, var(--highlight) 85%, var(--ground)); border-color: color-mix(in srgb, var(--highlight) 85%, var(--ground)); }
/* Недоступная или придержанная золотая кнопка золото теряет: золото — действие, которое можно сделать сейчас. Она — как
   недоступная кнопка продукта: без заливки, слова — как у недоступного (ink-muted на 55%), обводка --line-control. Занятая (aria-busy) остаётся золотой —
   действие идёт, — но не отвечает указателю */
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary:is(:disabled, [aria-disabled="true"]), :is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary:is(:disabled, [aria-disabled="true"]):hover { background: transparent; border-color: var(--line-control); color: color-mix(in srgb, var(--ink-muted) 55%, transparent); cursor: default; }
/* Занятая золотая остаётся золотой и тогда, когда она ещё и недоступна (busy() ставит disabled); слово и крутилка — цветом грунта */
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary[aria-busy="true"], :is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary[aria-busy="true"]:hover { background: var(--highlight); border-color: var(--highlight); color: var(--on-highlight); cursor: progress; }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-btn--primary[aria-busy="true"] .ch-spinner { border-color: color-mix(in srgb, var(--on-highlight) 35%, transparent); border-top-color: var(--on-highlight); }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-link { color: var(--ink); text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-link:hover { color: var(--ink); text-decoration-color: currentColor; }
/* Недоступная ссылка — без черты: черта на грунте говорит «нажми» */
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-link[aria-disabled="true"], :is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-link[aria-disabled="true"]:hover { color: color-mix(in srgb, var(--ink-muted) 55%, transparent); text-decoration: none; }
/* Ссылка-действие вещи: слова бумагой, черта золотом в 2px; под указателем черта — бумагой. Её стрелка — бумагой, как слова:
   значок золота не берёт. Вне грунта класс ничего не меняет — это обычная ch-link */
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-link--action { font-weight: 500; text-decoration-color: var(--highlight); text-decoration-thickness: 2px; text-underline-offset: 0.3em; }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-link--action:hover { text-decoration-color: var(--ink); }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-link--action .ch-icon { color: var(--ink); }
/* Свой сайт на графике — один предмет графика: на грунте золотом, а не акцентом (акцент здесь — бумага). Его называет и
   подпись — ch-tile--you и имя полужирным; золото — второй знак, по светлоте оно близко к chart-notable */
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-bars__row:has(.ch-tile--you) :is(.m-notable, .m-major) { background: var(--highlight); }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-bars__row:has(.ch-tile--you) .m-mid { background: color-mix(in srgb, var(--highlight) 70%, var(--ground)); }
:is([data-ground="band"], [data-ground="poster"], [data-ground="statement"]) .ch-bars__row:has(.ch-tile--you) .m-routine { background: color-mix(in srgb, var(--highlight) 40%, var(--ground)); }
/* Свечение за главной цифрой — только на poster: блок, что держит цифру (или сам плакат, где цифра в его середине), берёт
   ch-glow; эллипс светлее грунта синего (--glow) уходит в грунт. Единственный градиент вне графиков; на band и statement,
   как и где-либо ещё, класс ничего не рисует */
[data-ground="poster"].ch-glow, [data-ground="poster"] .ch-glow { background-image: radial-gradient(ellipse 60% 55% at 50% 52%, var(--glow) 0%, transparent 70%); }

/* ── Движение ───────────────────────────────────────────── */
@keyframes ch-pulse { 50% { opacity: .3; } }
@keyframes ch-pulse-plate { 50% { opacity: .65; } }
@keyframes ch-arrive { from { opacity: 0; transform: translateY(0.375rem); } }
@keyframes ch-spin { to { transform: rotate(360deg); } }
@keyframes ch-slide { from { transform: translateX(-100%); } to { transform: translateX(340%); } }
.ch-arrive { animation: ch-arrive .45s var(--ease) both; }
/* Реплика, которая ещё не пришла: место занято, чтобы разговор не прыгал */
[data-step].is-hidden { visibility: hidden; }
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}

/* ═══ digest.css ═══ */
/* Дайджест: рейка | разговор на всю ширину по центру холста. Повторяющееся — в components.css. */

/* Липкое поле ответа не должно закрывать элемент в фокусе и новую реплику; высоту поля со статусом считает digest.js */
html:has(.dg) { height: auto; min-height: 100%; }
html:has(.dg__ask) { scroll-padding-bottom: calc(var(--ask-h, 6.25rem) + var(--space-4)); }
/* Пока разговор идёт под полем, над полосой стоит раствор со стрелкой (ch-ask-more): элемент в фокусе встаёт над ним */
html:has(.dg__ask[data-more]) { scroll-padding-bottom: calc(var(--ask-h, 6.25rem) + var(--space-12) + var(--control)); }
html:has(.dg) body { height: auto; min-height: 100%; }

/* Колонка разговора: digest по центру, между ходами — space-8, внутри хода — space-4 */
.dg { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.dg__thread, .dg__ask { width: min(100% - 2 * var(--space-8), var(--digest)); margin-inline: auto; }
.dg__thread { flex: 1; display: grid; align-content: start; gap: var(--space-8); padding-block: var(--space-12) var(--space-8); }
.dg__turn { display: grid; gap: var(--space-4); }
.dg__turn > .ch-actions { margin-top: var(--space-2); }

/* Ответ Химере прилипает к низу экрана; пока разговор идёт под ним, слова над ним растворяются в холст (ch-ask-more) */
.dg__ask { --ask-ground: var(--canvas); position: sticky; bottom: 0; z-index: 5; display: grid; gap: var(--space-2); padding: var(--space-4) 0 var(--space-6); background: var(--ask-ground); }
/* Строка «ответить можно будет позже» стоит под полем через зазор сетки, своего отступа ей не нужно */
.dg__ask > .ch-composer__note { margin-top: 0; }

/* Убеждения в рассказе: строка-раскрывашка в ритме ch-belief; формулировка, опоры и переход к документу внутри.
   Каждое — свой поднятый лист (ch-raised; владелец, 2026-11-07: вставка без фона сливалась с голосом хода, иерархия слабела);
   линий списка нет, между листами — щель холста. Лист стоит вровень с колонкой голоса (владелец, 2026-11-08: выступ на поля карточки читался торчащим), его слова — на поле карточки внутри */
.dg__turn > .ch-list { display: grid; gap: var(--space-1); border-top: 0; }
.dg__turn > .ch-list > li { border-bottom: 0; }
.dg-belief { padding: var(--space-4) var(--card-pad); display: grid; gap: var(--space-2); }
/* Голос внутри листа — мельче голоса хода (voice-sm 14/22, «голос в карточке»): фраза Химеры выше вставки и фоном, и размером */
.dg-belief .ch-voice { font-size: var(--text-voice-sm); line-height: var(--leading-voice-sm); }
/* Списки внутри листа — одним уровнем волосков, без верхней линии: лист сам держит край */
.dg-belief .ch-list { border-top: 0; }
.dg-belief .ch-list > li:last-child { border-bottom: 0; }
.dg-belief > summary { display: grid; grid-template-columns: 0.75rem minmax(0, 1fr) auto; column-gap: var(--space-3); row-gap: var(--space-1); align-items: baseline; }
.dg-belief > summary .ch-mark { align-self: start; margin-top: calc((var(--leading-ui) - 0.75rem) / 2); }
.dg-belief__title { font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.dg-belief > summary:hover .dg-belief__title { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.dg-belief[data-status="replaced"] .dg-belief__title { text-decoration: line-through; color: var(--ink-gone); }
.dg-belief__side { display: inline-flex; align-items: center; gap: var(--space-2); color: var(--ink-muted); }
.dg-belief > summary .dg-belief__meta { grid-column: 2 / -1; }
.dg-belief__body { display: grid; gap: var(--space-3); padding-left: calc(0.75rem + var(--space-3)); padding-top: var(--space-1); }
.dg-belief__foot { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-6); }
.dg-belief__evidence { width: 100%; }
.dg-belief__evidence .ch-list, .dg-belief__evidence > .ch-failing { margin-top: var(--space-2); }
/* Находка против убеждения — под словами Скаута, до «Based on» и «Open»: факт, который оспорили, или подтверждение, которое Скаут снял */
.dg-belief__against { display: grid; gap: var(--space-2); }

/* ═══ findings.css ═══ */
/* Страница находок: рейка | лента и сводка на бумаге. Повторяющееся — в components.css. */

/* Липкая шапка не должна закрывать элемент в фокусе */
html:has(.fd) { height: auto; min-height: 100%; scroll-padding-top: calc(var(--head-h, 8rem) + var(--space-2)); }
html:has(.fd) body { height: auto; min-height: 100%; background: var(--paper); }

/* Все ширины — доли: поля страницы, колонки и щель между ними растут и сжимаются вместе с окном */
.fd { flex: 1; min-width: 0; background: var(--paper); padding: 0 var(--page-pad); container-type: inline-size; }
.fd > * { max-width: var(--page); margin-inline: auto; }

/* Шапка прилипает: фильтры всегда под рукой */
.fd__head {
  position: sticky; top: 0; z-index: 10;
  display: grid; gap: var(--space-4);
  padding: var(--space-8) 0 var(--space-3);
  background: var(--paper); border-bottom: var(--hairline) solid var(--line);
}
/* Плашка ленты выступает за колонку на поле карточки (--card-pad), а земля шапки кончалась краем колонки: уехавшая под шапку
   карточка торчала из-под неё слева и справа (владелец, 2026-11-08, на делах). Земля шапки — шире на то же поле; линия шапки —
   прежней ширины, по колонке */
.fd__head::before { content: ""; position: absolute; inset: 0 calc(var(--card-pad) * -1); z-index: -1; background: var(--paper); }
/* Отрицательные поля по краям выравнивают первый переключатель и шеврон периода с краями шапки;
   между соседями везде 24px: поле одного + поле или отступ другого */
.fd__toolbar { display: flex; flex-wrap: wrap; align-items: center; row-gap: var(--space-2); margin-inline: calc(var(--space-3) * -1); }
.fd__toolbar > .ch-switch { margin-inline: var(--space-3); }
.fd__toolbar-end { margin-left: auto; }
/* Выбор словами (ch-segmented), за которым в строке идёт ещё один, отстоит от него на 32, как два выбора на обзоре видимости
   (vo-toolbar): на узком окне, где конец строки уже не у правого края, «US UK» и «Cards Table» иначе читались одним выбором из
   четырёх. Поле — после выбора, а не перед следующим: перенесённый на новую строку выбор встаёт от её края */
.fd__toolbar > .ch-segmented:not(:last-child) { margin-inline-end: var(--space-8); }
/* Вкладки раздела (страницы одного раздела: Overview, Questions, App check, Plan у видимости) в шапке рабочего списка — те же, что
   под шапкой документа (fp__head, затем ch-tabs, как у конкурента): под заголовком через 24, за волосяной линией, подпись — в 16
   под ней, своя линия снизу; инструменты — за ними. Переходя со страницы-документа раздела на его рабочий список, вкладки
   выглядят одними, а не вторыми, теснее и без линии */
.fd__head > .ch-tabs { margin-top: var(--space-2); border-top: var(--hairline) solid var(--line); }
.fd__count:not(:empty)::before { content: "· "; }
/* Как это устроено (fd__about; владелец, 2026-11-08, на делах: текст, который читают один раз, всё время занимал место на
   экране): вопрос в конце строки инструментов — тихая кнопка, знак вопроса и слова («How cases work»), — и текст в панели под
   ним, у её правого края. Панель — не модальная, со своим заголовком; слова — ui, приглушённые, как прежний раздел */
.fd__about-pop { width: min(28.75rem, calc(100vw - 2 * var(--space-4))); max-height: min(35rem, 70vh); padding: var(--space-4); gap: var(--space-3); }
.fd__about-title { margin: 0; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.fd__about-pop > p { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); text-wrap: pretty; }
/* Выбранные фильтры — как активный поиск: кнопка и счётчик акцентом, отфильтрованную ленту не пропустить. Кнопка, чей выбор
   сам сужает список (свой период у кнопки периода: она уже называет его), — акцентом так же, без счётчика (is-filtering) */
.ch-btn:has(.fd__count:not(:empty)), .fd__count:not(:empty), .ch-btn.is-filtering { color: var(--accent); }
.fd__chips { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
/* Высота — не больше места до края окна, если его называет скрипт, который ставит панель (--float-room): на телефоне шапка
   уходит со страницей, кнопка стоит ниже, и подвал с «Clear filters» иначе открывался бы за краем экрана */
.fd__filter { width: max-content; max-width: calc(100vw - 2 * var(--space-4)); max-height: min(37.5rem, calc(100vh - 10rem), var(--float-room, 100vh)); }
/* Панель фильтра — столбец: прокручивается только тело (единственная часть панели, кроме подвала), подвал с «Clear filters»
   стоит под ним и с прокруткой не едет, полоса — от верха панели до линии подвала. Поля панели перешли к её частям: без
   прокрутки она та же, что прежде. Дойдя до конца, прокрутка не уходит странице под панелью */
.fd__filter { display: flex; flex-direction: column; gap: 0; padding: 0; overflow: hidden; }
.fd__filter > :not(.ch-menu__foot) { flex: 0 1 auto; min-height: 0; overflow: hidden auto; overscroll-behavior: contain; padding: var(--space-2); }
/* Группы фильтра — каждая своей высоты: короткая (Sites) не растягивает строки длинной (Types) до общей высоты колонки */
.fd__filter-cols { display: grid; grid-template-columns: max-content max-content; column-gap: var(--space-6); align-items: start; }
/* Подвал длинной панели фильтра — всегда на виду: «Clear filters» не уезжает за список и не качается с ним */
.fd__filter > .ch-menu__foot { flex: none; margin: 0 var(--space-2) var(--space-2); }

/* Две колонки с общей верхней линией: лента чуть шире статистики (11 : 10), чтобы карточкам находок было свободнее */
.fd__cols { display: grid; grid-template-columns: minmax(0, 11fr) minmax(0, 10fr); column-gap: var(--cols-gap); align-items: start; padding-top: var(--space-6); }
.fd__feed { min-width: 0; display: grid; align-content: start; }
.fd__aside { display: grid; gap: var(--space-12); padding: 0 0 var(--space-18); min-width: 0; }
/* Сводка, которая идёт за читателем (fd__aside--follow; владелец, 2026-11-08, на делах: под графиком оставалась пустота):
   короче окна — держится под шапкой на шаге колонок (24). Выше окна — едет со страницей и встаёт только на границе своих блоков:
   первый блок, что не помещается, целиком уходит под шапку, а следующий держится заголовком в 24 под ней (владелец, 2026-11-10:
   сводка, что держалась своим концом у низа окна, вставала заголовком первого графика вплотную под шапку и так и стояла).
   Где ей встать, считает скрипт (follow.js → --fd-side-top); без него сводка липнет верхом.
   Нижнее поле страницы — у колонок, а не у сводки, иначе она держалась бы на 72 выше низа */
.fd__aside--follow {
  position: sticky; padding-bottom: 0;
  top: var(--fd-side-top, calc(var(--head-h, 8rem) + var(--space-6)));
}
.fd__cols:has(> .fd__aside--follow) { padding-bottom: var(--space-18); }
/* Сводка находок начинается вровень с первой находкой, а не с подписью дня над ней (владелец, 2026-11-09): лента, которая
   открывается днём (ch-day), сдвигает сводку на его высоту — строка подписи и 12 под ней. Лента без дня сверху (первое чтение,
   пусто) сводку не сдвигает */
.fd__cols:has(> .fd__feed .ch-day:first-child) > .fd__aside { margin-top: calc(var(--leading-label) + var(--space-3)); }
/* Графики сводки, стоящие друг под другом, разделены волосяной линией посередине щели в 64 (владелец, 2026-11-09: в 48 без линии
   они слипались). Сводка с одним графиком (дела) — прежняя */
.fd__aside:has(> .ch-chart + .ch-chart) { gap: var(--space-8); }
.fd__aside:has(> .ch-chart + .ch-chart) > * + * { padding-top: var(--space-8); border-top: var(--hairline) solid var(--line); }
.fd__chart-foot { display: grid; gap: var(--space-2); justify-items: start; }

.fd__more { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-4) 0 0; margin: 0; }
.fd__note { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.fd__note { padding-top: var(--space-2); }

/* Находка, отмеченная как шум, остаётся в ленте приглушённой. На плашке ленты (ch-list--feed) приглушается то, что на ней, а не
   сама плашка: общая плашка серии не получает бледной дыры, плашка важной — тоже, подложка наведения — в полную силу */
.ch-finding.is-noise { opacity: .45; }
.ch-list--feed > .ch-finding.is-noise { opacity: 1; }
.ch-list--feed > .ch-finding.is-noise > * { opacity: .45; }

/* ── Модалка находки: слева что изменилось и почему это важно, справа скриншот страницы; на узком окне скриншот сверху ── */
.fd-modal__site { display: inline-flex; align-items: center; gap: var(--space-2); font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); }
.fd-modal__date { margin-left: auto; }
/* Окно со скриншотом шире общего (1232 против 1120): тексту колонка вровень со скриншотом, а скриншот не теряет ширины */
.ch-modal:has(.fd-modal:not(.fd-modal--text)) { --modal: min(92vw, 77rem); }
/* Окно одних слов (без скриншота, рутина) — по их колонке: строка чтения и поля окна по 20 (нижний предел --modal-pad),
   без пустой полосы справа */
.ch-modal:has(.fd-modal--text) { --modal: min(92vw, calc(var(--measure) + 2.5rem)); }
.fd-modal { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: var(--cols-gap); align-items: start; }
.fd-modal__text { display: grid; gap: var(--space-6); }
.fd-modal__counts { display: grid; gap: var(--space-1); margin: 0; padding: 0; list-style: none; font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }
.fd-modal__counts .ch-meta { margin-top: var(--space-1); }
/* Счётчики сразу под прозой — на шаг ближе к ней */
.ch-voice + .fd-modal__counts { margin-top: calc(var(--space-2) * -1); }
.fd-modal__shot { margin: 0; display: grid; gap: var(--space-2); }
.fd-modal__shot figcaption { display: flex; justify-content: space-between; gap: var(--space-4); }
/* Подпись снимка в окне — одна строка (владелец, 2026-11-10: две серые строки под снимком — уже абзац, их не читают): что на
   снимке слева, когда снято — у правого края. Адреса и страны съёмки в окне нет: адрес открывает Open the page, страна — на
   странице находки. Не влезает — слова кончаются многоточием, время целое. Подпись без снимка — одна причина словами — переносится */
.fd-modal__shot figcaption > :last-child:not(:first-child) { flex: none; white-space: nowrap; }
.fd-modal__shot figcaption > :first-child:not(:last-child) { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fd-modal__shot figcaption > span:only-child { text-wrap: pretty; }
.fd-modal a { color: inherit; text-decoration: none; overflow-wrap: anywhere; }
.fd-modal a:hover { color: var(--ink); text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
/* Рутина — без скриншота: одна колонка шириной в строку чтения */
.fd-modal--text { grid-template-columns: minmax(0, var(--measure)); }
@media (max-width: 760px) {
  .fd-modal { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-6); }
  .fd-modal__shot { order: -1; }
}

/* Узкие ноутбуки: равным колонкам тесно, лента забирает долю у статистики (3 : 2); совсем узко — одна колонка.
   Считаем по ширине бумаги, а не окна, поэтому раскрытая рейка тоже учитывается */
@container (max-width: 62.5rem) {
  .fd__cols { grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); }
}
@container (max-width: 52.5rem) {
  .fd__cols { grid-template-columns: minmax(0, 1fr); }
  .fd__aside { max-width: var(--measure); padding-top: var(--space-4); }
  /* Сводка стоит под лентой: ровнять её с первой находкой не с чем */
  .fd__cols:has(> .fd__feed .ch-day:first-child) > .fd__aside { margin-top: 0; }
  /* В одну колонку сводка стоит после ленты и за читателем не идёт */
  .fd__aside--follow { position: static; }
}
@media (max-width: 760px) {
  .fd__toolbar-end { margin-left: 0; }
  /* Вопрос перенёсся к началу строки — его панель открывается от левого края кнопки, не за край экрана */
  .fd__about-pop { left: 0; right: auto; }
  /* На телефоне шапка с фильтрами уходит вместе со страницей: прилипшая, она занимала бы треть экрана над лентой.
     Наверху остаётся только полоса приложения — под неё и прилипает шапка таблицы, и не прячется элемент в фокусе */
  .fd__head { position: static; }
  .fd__head::before { content: none; }
  html:has(.fd) { scroll-padding-top: calc(var(--topbar) + var(--space-2)); }
  .fd .ch-table--sticky thead th { top: var(--topbar); }
  /* Фильтр в одну колонку: две колонки шире телефона, а панель не прокручивается вбок */
  .fd__filter-cols { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-2); }
}

/* Событие убеждения в ленте: что насчитало правило Скаута — строкой под заголовком, столбец времени держит только час */
.fd-fact__basis { display: block; margin-top: var(--space-1); }

/* Первое чтение Скаута — его плитка (ch-plate) над лентой: слова, шаг и строка о странице, которая не открылась, — с шагом
   разговора; от ленты под ней — как между днями (ch-day: 32 сверху) */
/* Слова плитки — на поле карточки от её края, как слова находок под ней (владелец, 2026-11-10) */
.fd-first { gap: var(--space-3); padding-inline: var(--card-pad); }
.fd-first + .ch-empty { padding-top: var(--space-8); }

/* Находка, чьи слова Chimera ещё переводит (CHI-1382; ADR-0057 Р13 продукта): после смены языка она стоит на своём месте, со всем,
   что не слова, — фавиконом, именем, видом, важностью, временем, снимком, — а на месте слов полосы заготовки (ch-skeleton) и под
   ними одна строка меты «Chimera is translating…», как лист находки, пока его слова в пути. Плашки и карточки — те же: ждущая
   строка встаёт в серию рутины, как любая. Строка рутины: имя, за ним полоса на средней линии строки, слово — строкой под ними.
   Карточка: полоса заголовка — посередине строки заголовка (время стоит у её верха, как у заголовка), у находки с выводом —
   три полосы шагом строки голоса; слово — над источником */
.fd-wait__bar { display: inline-block; vertical-align: middle; min-width: 6em; max-width: 100%; }
.fd-wait__word { display: block; }
.ch-finding:not(.ch-finding--card) .fd-wait__word { margin-top: var(--space-1); }
.fd-wait .ch-finding__top { align-items: flex-start; }
.fd-wait__lines { display: grid; gap: calc(var(--leading-voice-sm) - 0.75rem); flex: 1; min-width: 0; }
.fd-wait .ch-finding__top > .fd-wait__lines { align-self: stretch; margin-block: calc((var(--leading-ui) - 1rem) / 2); }
.fd-wait.ch-finding--major .ch-finding__top > .fd-wait__lines { margin-block: calc((var(--leading-body) - 1rem) / 2); }
.fd-wait__sum { max-width: var(--measure); padding-block: calc((var(--leading-voice-sm) - 0.75rem) / 2); }
.fd-wait__line { margin: 0; }
/* Заголовок окна, пока слова в пути: полоса посередине строки заголовка (title 24/32) */
.fd-wait__title { display: block; width: 70%; margin-block: calc((var(--leading-title) - 1rem) / 2); }
/* Заголовок окна с полосой — элемент ряда ch-modal__top, который сжимается по содержимому, а в нём, кроме полосы, лишь скрытый текст:
   без своей ширины он был 0, и 70% от него — тоже 0 (0.68.1). Здесь он берёт всё место до инструментов, а на телефоне, где ряд
   переносится (wrap-reverse), встаёт под них во всю ширину, как длинный заголовок. :has — отдельным правилом, не в списке
   селекторов: Lightning CSS роняет :has() из списка (CHI-365) */
.ch-modal__top > .ch-title:has(> .fd-wait__title) { flex: 1 1 100%; min-width: 0; }

/* ═══ finding.css ═══ */
/* Страница находки: рейка | документ на бумаге. Слева — что изменилось и что это значит для продукта, справа — скриншот и подробности.
   Повторяющееся — в components.css. */

html:has(.fp) { height: auto; min-height: 100%; }
html:has(.fp) body { height: auto; min-height: 100%; background: var(--paper); }

/* Ширины — доли окна с пределами, как на ленте находок */
.fp { flex: 1; min-width: 0; padding: var(--space-8) var(--page-pad) var(--space-18); container-type: inline-size; }
.fp > * { max-width: var(--page); margin-inline: auto; }

.fp__head { display: grid; gap: var(--space-3); padding-bottom: var(--space-6); border-bottom: var(--hairline) solid var(--line); }
.fp__top { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-8); }
.fp__top .ch-actions { flex: none; flex-wrap: nowrap; }
.fp__meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-4); }
/* Тихое действие шапки (fp__act) — в конце строки меты, под действиями заголовка, а не рядом с ними (владелец, 2026-11-09: «Mark
   as noise» под «Open the page», на уровне конкурента, вида и времени). Шапка с ним — две колонки: всё на всю ширину, кроме меты
   (слева) и действия (справа, по середине её строки) */
.fp__head--act { grid-template-columns: minmax(0, 1fr) auto; column-gap: var(--space-8); }
.fp__head--act > :not(.fp__meta, .fp__act) { grid-column: 1 / -1; }
.fp__head--act > .fp__meta { align-self: center; }
.fp__head--act > .fp__act { grid-column: 2; justify-self: end; align-self: center; }
.fp__site { display: inline-flex; align-items: center; gap: var(--space-2); font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); }

.fp__cols { display: grid; grid-template-columns: minmax(0, 11fr) minmax(0, 10fr); column-gap: var(--cols-gap); align-items: start; padding-top: var(--space-8); }
/* Текст — в строку чтения, даже если колонка шире */
.fp__main { display: grid; gap: var(--space-12); min-width: 0; }
.fp__main > * { max-width: var(--measure); }
.fp__side { display: grid; gap: var(--space-8); min-width: 0; }
/* Сторона находки идёт за читателем (владелец, 2026-11-03): короче текста — липнет у верха окна и едет через пустоту под собой;
   выше окна — прокручивается со страницей, пока не покажет свой конец, и держится им у низа окна (top уходит в минус на то,
   на сколько она выше окна). Высоту стороны как нарисована даёт скрипт (--fp-side-h); без него она липнет верхом, и её
   конец открывается в конце текста. Прокручивается окно; липких шапок над двумя колонками нет (полоса узкого окна — только в
   одну колонку, где сторона не липнет) */
.fp__side--follow { position: sticky; top: min(var(--space-8), 100vh - var(--fp-side-h, 0px) - var(--space-8)); }
/* Находка — лист на столе (fp--sheet; владелец, 2026-11-09, вариант A из трёх): страница из двух колонок отдаёт фокус одной.
   Читают находку слева, справа — её снимок и справка, поэтому страница лежит на холсте — шапка без линии под ней, рейка без
   линии, как на любой странице холста, — а прочтение находки — лист бумаги (fp__main): поле 24 · 32 · 32, в узком окне — поле
   карточки. Бумага — поверхность документа, а не приподнятое (RULES → Colour, Surfaces). Шов страницы — край листа, линии в
   щели нет. Сторона — на холсте, со своими тонами линий; снимок стоит верхним краем на верхнем краю листа.
   :has() — только отдельными правилами: сборка продукта (Lightning CSS) список селекторов с ним теряет (CHI-365) */
html:has(.fp--sheet) body { background: var(--canvas); }
.ch-app:has(.fp--sheet) > .ch-rail { border-right: 0; }
.fp--sheet .fp__head { padding-bottom: 0; border-bottom: 0; }
.fp--sheet .fp__main { background: var(--paper); border-radius: var(--radius); padding: var(--space-6) var(--space-8) var(--space-8); }
.fp--sheet .fp__side { --line: var(--raised-canvas-line); --hover-row: var(--raised-canvas); }
/* Сторона без снимка начинается заголовком — он встаёт на строку первого заголовка листа (поле листа, 24) */
.fp--sheet .fp__side > .fp-section:first-child { padding-top: var(--space-6); }
/* Часть «What changed» подписана именем страницы — ссылкой на неё: подзаголовок чернилами, ↗ — что уводит на сайт */
.fp-sub__link { color: inherit; text-decoration: none; }
.fp-sub__link:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.fp-sub__link .ch-icon { width: var(--icon-sm); height: var(--icon-sm); margin-left: var(--space-1); color: var(--ink-muted); vertical-align: -0.125rem; }
/* Документ разделами (fp--sections, Settings): под линией шапки — две панели. Слева — список разделов (ch-sections), доля колонки
   с пределами (--sections), справа — выбранный раздел (fp__main), строкой чтения. Стороны у такого документа нет */
.fp--sections .fp__cols { grid-template-columns: var(--sections) minmax(0, 1fr); }
/* Часть, которой можно шире строки чтения, — широкая таблица, пара графиков; в широком разделе слова остаются в строке чтения */
.fp__main > .fp-wide { max-width: none; }
.fp__main > .fp-section.fp-wide > * { max-width: var(--measure); }
.fp__main > .fp-section.fp-wide > :is(h2, .fp-wide, .ch-table-wrap) { max-width: none; }

/* Разделы: заголовок 18/28 чернилами — крупнее голоса под ним; пояснения — тише, интерфейсным шрифтом */
/* Один столбец во всю ширину раздела: ни таблица, которая не переносится, ни длинное слово не раздвигают раздел и слова рядом
   с собой (столбец auto брал ширину самой широкой части — досье Deel 09.10 растянуло прочтение Scout на 1405px) */
.fp-section { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-3); }
.fp-section > h2 { margin: 0; font: 500 var(--text-heading)/var(--leading-heading) var(--font-ui); color: var(--ink); }
.fp-section .ch-day { padding: 0; }
/* Пустота — весь текст раздела: стоит под заголовком на его шаге, без своих полей */
.fp-section > .ch-empty { padding-block: 0; }
.fp-sub { margin: 0; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.fp-note { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
/* Число, которое отвечает на вопрос раздела (оценка Scout — диапазон): одно в своей строке, размером заголовка раздела, единица —
   тише; факты о нём — строкой меты под ним (p.ch-meta.ch-facts из components.css), каждый факт целиком и с точкой после себя:
   строка не начинается с «·», факт длиннее строки (длинное имя рекламодателя на телефоне) переносится внутри себя. За ним —
   рассуждение, потом доказательства */
.fp-figure { display: grid; gap: var(--space-1); margin: 0 0 var(--space-2); }
.fp-figure__value { margin: 0; font: 400 var(--text-heading)/var(--leading-heading) var(--font-ui); color: var(--ink-muted); }
.fp-figure__value b { font-weight: 500; color: var(--ink); font-variant-numeric: tabular-nums; }

/* Часть раздела (div.fp-page: путь страницы или заголовок h3.fp-sub, под ним её содержимое). Под своим заголовком — 8, а от
   того, что стоит в разделе перед ней (факты списком, абзац, другая часть), — 32 (12 шага раздела и 20 сверху): заголовок
   части читается началом того, что под ним, а не концом того, что над ним */
.fp-page { display: grid; gap: var(--space-2); }
.fp-section > :not(h2) + .fp-page { margin-top: calc(var(--space-8) - var(--space-3)); }

/* Дифф текста — без цвета: зелёный и красный в системе заняты. Удалённое зачёркнуто и приглушено, добавленное — чернилами.
   Пользователь — находка юрдокумента: изменённые слова условий по частям (div.fp-page > h3.fp-sub + ul.ch-list.fp-diff;
   в продукте — FpDiffList, document-finding.tsx), в ките — «A document’s changed words». Ушёл только раздел страницы
   находки «Text that changed on the page» (0.27.0) */
.fp-diff > li { display: grid; grid-template-columns: 1rem minmax(0, 1fr); column-gap: var(--space-2); padding: var(--space-2) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.fp-diff__op { color: var(--ink-muted); text-align: center; }
.fp-diff > li[data-op="-"] .fp-diff__text { color: var(--ink-muted); text-decoration: line-through; }

/* Счётчики Скаута — как в модалке */
.fp-counts { display: grid; gap: var(--space-1); margin: 0; padding: 0; list-style: none; font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }
.fp-counts .ch-meta { margin-top: var(--space-1); }

/* Ход работы: время, кто, что сделал, сколько стоило */
.fp-activity > li {
  display: grid; grid-template-columns: max-content var(--icon-sm) minmax(0, 1fr) max-content; align-items: baseline; column-gap: var(--space-3);
  padding: var(--space-2) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink);
}
/* Значок — у первой строки: в узкой колонке стороны слова переносятся, а значок остаётся рядом со временем */
.fp-activity .ch-icon { width: var(--icon-sm); height: var(--icon-sm); align-self: start; margin-top: calc((var(--leading-ui) - var(--icon-sm)) / 2); color: var(--ink-muted); }
/* Ссылка в словах строки («Filed in Deel: payroll in Japan») — строчная, как в Details: переносится вместе со словами */
.fp-activity .ch-link { display: inline; }
.fp-spend b { font-weight: 500; color: var(--ink); }

/* Справа: стопка снимков, подробности, ход работы. Стопка — по снимку на каждый известный кадр (версии A/B-теста; страница и
   новости из досье), просто друг под другом: подпись под своим снимком на 8, следующий снимок — на 24, подробности — на 32 */
.fp-shots { display: grid; gap: var(--space-6); min-width: 0; }
.fp-shot { margin: 0; display: grid; gap: var(--space-2); }
/* Подпись — по ширине снимка (владелец, 2026-11-11): что и откуда слева, день и время у правого края. Узко — слова слева
   переносятся, время остаётся целым на первой строке */
.fp-shot figcaption { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-4); }
.fp-shot figcaption > :first-child { min-width: 0; text-wrap: pretty; }
.fp-shot figcaption > :last-child:not(:first-child) { flex: none; white-space: nowrap; }
/* Подробности — свой контейнер (владелец, 2026-11-08): колонка подписи — доля списка, поэтому решает его ширина, а не
   страницы — сторона документа узка и при широкой странице (1024–1280 рядом с текстом). Уже 448 (телефон при любом
   размере, L с раскрытой рейкой на 768, сторона рядом с текстом) подпись встаёт над значением: в 30% от 440 и меньше
   длинная русская подпись («Позиционирование и рынки», 132 при S) рвалась посреди слова. Шире — подпись слева, как была */
.fp-details { margin: 0; container-type: inline-size; justify-self: stretch; }
.fp-details > div { display: grid; grid-template-columns: minmax(6rem, 30%) minmax(0, 1fr); column-gap: var(--space-4); padding: var(--space-3) 0; border-bottom: var(--hairline) solid var(--line); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }
@container (max-width: 27.9375rem) {
  .fp-details > div { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-1); }
}
.fp-details dt { color: var(--ink-muted); }
.fp-details dd { margin: 0; min-width: 0; color: var(--ink); overflow-wrap: anywhere; }
.fp-details .ch-link { display: inline; }
/* Вторая строка значения — между какими днями, заметка к факту: под ним, метой */
.fp-details__sub { display: block; margin-top: var(--space-1); }
.fp-details .ch-link .ch-icon { vertical-align: -0.125rem; margin-left: var(--space-1); }
/* Значения больше нет (fp-details__none): слова на его месте — не значение, а серое, как N/A у fp-glance__none и ch-kpis__none.
   Находка с YouTube, чья запись ушла (ADR-0116 продукта): «Video details are no longer available», почему — за «i» строки */
.fp-details dd .fp-details__none { color: var(--ink-muted); }
/* Сводка строками (fp-details--glance; дизайнер, 2026-11-04): строка — одно значение (fp-details__value) и дверь Show у правого края,
   на строке значения; разные виды фактов не склеиваются в одну строку. В широком контейнере строки встают в две колонки (когда в ряд
   встают две по 480 и промежуток колонок), у каждой своя мера. At a glance обзора конкурента теперь — столбцами (fp-glance, ниже);
   строки остаются у сводки внутри раздела (партнёрские программы на Company) и у продукта, пока он не перешёл */
.fp-details--glance { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 30rem), 1fr)); column-gap: var(--cols-gap); }
.fp-details--glance dd { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-4); }
.fp-details--glance dd > .ch-link { flex: none; }
.fp-details__value { min-width: 0; }

/* ── Сводка столбцами (fp-glance; владелец, 2026-11-05: «данные по странам, соцсетям просят вертикальные столбы… половины экрана не
      хватает», из двух макетов выбраны столбцы; вид — дизайнера, 2026-11-05). Столбец на вид факта, набор и порядок — одни для всех
      конкурентов: сверху подпись (dt, ступень label, серым, как подпись подробностей), под ней значения по одному в строке
      (fp-glance__values: флаг или фавикон и имя — ch-named, ch-flag, ch-profile), до четырёх, последней строкой — «and N more» метой
      (ch-values__more); у низа столбца — дверь Show (fp-glance__go), двери ряда на одной линии, как ch-kpis__go. Вида без значений —
      «N/A» серым (fp-glance__none) вместо значений и без двери. Линии — как у плиток ch-kpis: сверху и слева у каждого столбца, левая
      у первого в ряду срезана по краю текста, одна под последним рядом; раздел — во всю ширину колонки, столбцы делят её поровну.
      По числу столбцов, как ch-kpis--fit: колонка от 1080 — все в ряд; уже — пять и шесть по три (3 + 2, 3 + 3); четыре — в ряд от
      720, уже — два на два; колонка до 480 (телефон при любом размере) — по два ── */
.fp-glance {
  --n: 1; display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr)); min-width: 0;
  margin: 0 0 0 calc(var(--space-4) * -1); border-bottom: var(--hairline) solid var(--line); clip-path: inset(0 0 0 var(--space-4));
}
.fp-glance > div {
  display: flex; flex-direction: column; min-width: 0; margin-left: calc(var(--hairline) * -1); padding: var(--space-4);
  border-top: var(--hairline) solid var(--line); border-left: var(--hairline) solid var(--line);
}
.fp-glance dt { font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }
.fp-glance dd { margin: 0; min-width: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); overflow-wrap: anywhere; }
.fp-glance dd.fp-glance__values { display: grid; justify-items: start; gap: var(--space-2); margin-top: var(--space-3); }
.fp-glance__values > * { max-width: 100%; }
/* Имя длиннее строки столбца («Deel: Global Payroll & HR» на телефоне) переносится под имя, а не под значок: значок — на первой строке */
.fp-glance__values > .ch-named { display: flex; align-items: flex-start; }
.fp-glance dd.fp-glance__none { margin-top: var(--space-3); color: var(--ink-muted); }
/* Значение с числом и строкой под ним (fp-glance__item; Site на Platforms, 2026-11-05): первая строка — имя (ссылка наружу, ch-url)
   и его число у правого края столбца, чернилами; вторая — что это, серым (строка, привязанная к значению). Столбец таких значений
   не режется на четырёх: в нём весь набор */
.fp-glance__values:has(> .fp-glance__item) { gap: var(--space-3); }
.fp-glance__values > .fp-glance__item { display: grid; justify-self: stretch; }
.fp-glance__line { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-3); min-width: 0; }
.fp-glance__line > .ch-url { min-width: 0; }
.fp-glance__count { flex: none; color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.fp-glance__about { color: var(--ink-muted); }
.fp-glance dd.fp-glance__go { margin-top: auto; padding-top: var(--space-4); }
.fp-glance:has(> div:nth-child(2):last-child) { --n: 2; }
.fp-glance:has(> div:nth-child(3):last-child) { --n: 3; }
.fp-glance:has(> div:nth-child(4):last-child) { --n: 4; }
.fp-glance:has(> div:nth-child(5):last-child) { --n: 5; }
.fp-glance:has(> div:nth-child(6):last-child) { --n: 6; }
@container (max-width: 67.4375rem) {
  .fp-glance:has(> div:nth-child(5):last-child) { --n: 3; }
  .fp-glance:has(> div:nth-child(6):last-child) { --n: 3; }
}
@container (max-width: 44.9375rem) {
  .fp-glance:has(> div:nth-child(4):last-child) { --n: 2; }
}
@container (max-width: 29.9375rem) {
  .fp-glance:has(> div:nth-child(3):last-child) { --n: 2; }
  .fp-glance:has(> div:nth-child(4):last-child) { --n: 2; }
  .fp-glance:has(> div:nth-child(5):last-child) { --n: 2; }
  .fp-glance:has(> div:nth-child(6):last-child) { --n: 2; }
}
/* Колонка до 480 (телефон; после правил по числу столбцов — та же сила селектора, побеждает порядок): столбцы таких значений — по одному в ряд, а не по два: в половине телефона путь с описанием рвётся по
   слогам. Ряд чисел над ними остаётся два в ряд, так что на телефоне линии плиток вниз не идут */
@container (max-width: 29.9375rem) {
  .fp-glance:has(> div > .fp-glance__values > .fp-glance__item) { --n: 1; }
}
.fp-nowrap { white-space: nowrap; }
.fp-cases { display: flex; flex-wrap: wrap; gap: var(--space-2); }
/* Чип дела — одной строкой: длинное имя режет многоточие, чип не шире строки; дело в архиве — словом после имени */
.fp-case {
  display: inline-flex; align-items: center; gap: var(--space-2); max-width: 100%; height: 1.625rem; padding: 0 var(--space-1) 0 var(--space-2);
  border: var(--hairline) solid var(--line-control); border-radius: var(--radius); font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink);
}
.fp-case > :is(a, span:not([class])) { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fp-case > .ch-meta { flex: none; }
.fp-case > .ch-icon { width: var(--icon-sm); height: var(--icon-sm); color: var(--ink-muted); }
.fp-case > .ch-tile { width: var(--icon-sm); height: var(--icon-sm); }
.fp-case > a { color: inherit; text-decoration: none; }
.fp-case > a:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.fp-case button { flex: none; display: grid; place-items: center; width: 1.125rem; height: 1.125rem; padding: 0; border: 0; border-radius: var(--radius-sm); background: none; color: var(--ink-muted); cursor: pointer; }
.fp-case button:hover { color: var(--ink); }
.fp-case button .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }

/* История компании на странице находки реестра: перемена, о которой есть находка, — ссылкой чернилами, как изменение в ленте
   конкурента; рутина и то, что старше года, — тише */
.fp-history__finding { color: var(--ink); text-decoration: none; }
.fp-history__finding:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.fp-history__routine { color: var(--ink-muted); }

/* Узкое окно: одна колонка, скриншот и подробности — над текстом */
@container (max-width: 52.5rem) {
  .fp__cols { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-12); }
  .fp__side { order: -1; max-width: var(--measure); }
  /* Лист в одну колонку — уже: поля по полю карточки */
  .fp--sheet .fp__main { padding: var(--space-4) var(--card-pad) var(--space-6); }
  .fp--sheet .fp__side > .fp-section:first-child { padding-top: 0; }
  /* Документ разделами: список — полосой вкладок прямо под линией шапки, как вкладки раздела в документе; раздел — под ней на 32 */
  .fp--sections .fp__cols { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-8); padding-top: 0; }
  /* Документ, где ведёт текст (расходы, агент, вопрос): сторона — после него, порядок чтения тот же, что на широком */
  .fp--main-first .fp__side { order: 0; }
  /* Сторона, что шла за читателем, в одну колонку не липнет и раскладывается по странице: снимки и подробности — над текстом
     (с fp--main-first — после него), ход работы — в конце страницы, после текста. Подробности стоят под снимками на 32, как
     в колонке, а не на шаг страницы (48) */
  .fp__side--follow { display: contents; }
  .fp__side--follow > * { order: -1; max-width: var(--measure); }
  .fp--main-first .fp__side--follow > * { order: 1; }
  .fp__side--follow > .fp-section--end { order: 2; }
  .fp__side--follow > .fp-shots + * { margin-top: calc(var(--space-8) - var(--space-12)); }
}
/* Узкая шапка — телефон, окно 761–900 с открытой рейкой, размер L: кнопки уходят под заголовок и переносятся рядом, если обе в
   строку не встают (крупный размер, русские слова). По ширине документа, а не окна (CHI-1730): при окне 768 и открытой рейке
   заголовку рядом с кнопками оставалось 294 px и 6 строк, на 760 — 706. Порог 640 при S (720 при L): рядом с кнопками заголовку
   остаётся от ~460 при S и ~520 при L, а окно 900 с закрытой рейкой держит кнопки рядом при любом размере */
@container (max-width: 39.9375rem) {
  .fp__top { flex-direction: column; gap: var(--space-4); }
  .fp__top .ch-actions { flex-wrap: wrap; }
  /* Тихая кнопка первой в действиях (Archive case у дела, Close question, Pause у Скаута) — словом или значком на краю заголовка,
     а не на поле кнопки; у кнопки-значка поля нет */
  .fp__top .ch-actions > .ch-btn--quiet:first-child:not(.ch-btn--icon) { margin-left: calc(var(--space-3) * -1); }
  /* Тихое действие — строкой под метой, от левого края, как кнопки под заголовком */
  .fp__head--act { grid-template-columns: minmax(0, 1fr); }
  .fp__head--act > .fp__act { grid-column: 1; justify-self: start; margin-left: calc(var(--space-3) * -1); }
}

/* ── Possible explanations (CHI-118): соперничающие гипотезы крупного события — раздел документа, голос Chimera, а не плитка.
      Заголовок раздела с «i» (ch-heading): что это гипотезы и что с соперниками, когда одну решат. Строка: заголовок гипотезы
      голосом (voice, чернила), под ним одна строка меты — знак и слово статуса, план (значок конкурента, категория, срок), —
      затем основание и что её решит, голосом мельче (voice-sm). Между гипотезами — волоски списка ── */
.fp-section > .ch-heading > h2 { font: 500 var(--text-heading)/var(--leading-heading) var(--font-ui); color: var(--ink); }
.fp-hyps > li { display: grid; gap: var(--space-1); padding: var(--space-4) 0; }
.fp-hyps > li > * { max-width: var(--measure); }
.fp-hyp__head { margin: 0; font: 400 var(--text-voice)/var(--leading-voice) var(--font-voice); color: var(--ink); text-wrap: pretty; }
/* Строка плана — текст, а не ряд: перенос идёт между словами, « · » не начинает строку (неразрывный пробел перед ним),
   значок конкурента не отрывается от первого слова за ним (fp-hyp__on — значок и первое слово, без переноса) */
.fp-hyp__plan { margin: 0; text-wrap: pretty; }
.fp-hyp__plan > .ch-status { font: inherit; color: inherit; gap: var(--space-1); vertical-align: top; }
.fp-hyp__on { white-space: nowrap; }
.fp-hyp__plan .ch-tile { display: inline-block; width: var(--icon-sm); height: var(--icon-sm); vertical-align: -0.125rem; margin: 0 var(--space-1); }
.fp-hyp__body { margin-top: var(--space-2); gap: var(--space-2); font-size: var(--text-voice-sm); line-height: var(--leading-voice-sm); }

/* ═══ cases.css ═══ */
/* Страница дел. Каркас — из findings.css: липкая шапка с фильтрами, лента и сводка в две колонки, панель прототипа.
   Здесь — только то, чего у находок нет: шапка с «New case», дело в ленте, пояснение справа. */

.cs-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-6); }

/* Лента дел начинается сразу под линией шапки — своя верхняя линия списка была бы второй */
.cs-list { border-top: 0; }
/* Дело — карточка на плашке ленты, как карточка находки (владелец, 2026-11-08: колонки страницы были одной силы, фокуса на
   важном не было): плашка стоит в колонке, как плашки ленты (владелец, 2026-11-10), слова — на поле карточки от её края; между
   делами — щель бумаги 8, линий нет. Наведение — ступенью глубже плашки, по её краям и с её углами */
.cs-list > li.cs-case {
  margin-inline: 0; padding-inline: var(--card-pad);
  background: var(--feed-plate); border-bottom: 0; border-radius: var(--radius);
}
.cs-list > li.cs-case + li.cs-case { margin-top: var(--space-2); }
.cs-list > li.cs-case::before { inset: 0; border-radius: inherit; background: var(--feed-plate-hover); }

/* Дело: значок | название и дата, вывод Скаута, внизу последняя находка или кто сдвинулся — и «Open».
   Без заливки и цвета бренда: цвет в ленте дают только фавиконы. Как находка, дело кликабельно целиком (ch-clickable) */
.cs-case { display: grid; grid-template-columns: 1.125rem minmax(0, 1fr); column-gap: var(--space-3); padding: var(--space-4) 0; }
.cs-case:hover .cs-case__open { text-decoration: underline; text-underline-offset: 4px; }
/* Значок — по первой строке названия: фавикон конкурента или «люди» у дела по рынку */
.cs-case > .ch-tile, .cs-case > .ch-icon { margin-top: calc((var(--leading-body) - 1.125rem) / 2); }
.cs-case > .ch-icon { width: 1.125rem; height: 1.125rem; color: var(--ink-muted); }

.cs-case__body { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-2); min-width: 0; }
.cs-case__top { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-4); }
/* Название дела короткое, поэтому на ступень крупнее заголовка находки: оно держит всю карточку */
.cs-case__title { margin: 0; font: 500 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); text-wrap: pretty; }
.cs-case__when { white-space: nowrap; }
/* Вывод Скаута — голосом, мельче названия, целиком: это его текущее прочтение дела, обрезать нельзя */
.cs-case__brief { max-width: var(--measure); font-size: var(--text-voice-sm); line-height: var(--leading-voice-sm); margin-bottom: var(--space-2); }

/* Низ: слева последняя находка или кто сдвинулся, справа «Open» по нижней строке. Подпись над ними — чернилами, 13/500, строчными,
   в 4 над значением (cs-case__label; владелец, 2026-11-10: серая мета под голосом брифа не читалась, а метка раздела капсом
   спорила с названием дела); значение — чернилами */
/* Где «Open» рядом не помещается (телефон, длинная дата в «кто сдвинулся»), он уходит на свою строку, а не распирает карточку */
.cs-case__foot { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: var(--space-2) var(--space-6); }
.cs-case__foot > div { flex: 1 1 0; display: grid; gap: var(--space-1); min-width: 0; }
.cs-case__label { margin: 0; font: 500 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); }
.cs-case__latest { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
a.cs-case__latest { text-decoration: none; }
a.cs-case__latest:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.cs-case__open { flex: none; }

/* Кто сдвинулся по рынку — по порядку: значок, имя, дата */
.cs-movers { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); margin: 0; padding: 0; list-style: none; }
.cs-movers > li { display: inline-flex; align-items: center; gap: var(--space-2); font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); white-space: nowrap; }
.cs-movers .ch-tile { width: 1rem; height: 1rem; }

/* Числа по открытым делам — крупными числами (ch-kpis), первыми в сводке, их верхняя линия — на верху первой плашки:
   что такое дело, сказано в панели под вопросом строки инструментов (fd__about), а не здесь */
.cs-stats { gap: 0; }

/* ── Нижние блоки сводки (владелец, 2026-11-10): когда дела двигались в последний раз, где Chimera передумала. Всё — примитивы
      системы (ch-chart, ch-bars, ch-list ch-stats, ch-heading с ch-info); здесь — только то, как они сложены на этой странице ── */

/* Под числами линии нет: у плиток своя нижняя линия, вторая в 32 под ней читалась бы двойной. Между графиками ниже — волосяная
   линия в щели 64, как в сводке находок (findings.css); от чисел до первого графика — прежние 48 */
/* 0,4,0 — сильнее линии между графиками сводки (findings.css: .fd__aside:has(> .ch-chart + .ch-chart) > * + *, 0,3,0), которая
   с двумя графиками на странице иначе рисует вторую линию под числами (0.92.1) */
.fd__aside:has(> .cs-stats) > .cs-stats + .ch-chart { border-top: 0; padding-top: var(--space-4); }

/* Знак пояснения у заголовка графика: заголовок графика стоит 15/24 (ch-chart__head h2), а не подписью 13/18, — знак той же
   высоты, что его строка, иначе он висит выше середины (у ch-heading с ch-label знак — высотой подписи) */
.fd__aside .ch-chart__head .ch-heading > .ch-info { height: var(--leading-body); margin-top: 0; }

/* Где Chimera передумала: строка — дело (значок или «люди» и имя — ссылка на дело) и день, когда переписана сводка, у правого
   края. Длинное имя переносится под имя, а не под значок. Значок без фавикона — плитка с буквой (span.ch-tile), той же меры */
.cs-minds > [data-plot] { display: grid; gap: var(--space-3); }
.cs-minds__list > li > a { min-width: 0; }
.cs-minds__case { display: block; padding-left: calc(var(--icon-sm) + var(--space-2)); color: var(--ink); text-decoration: none; overflow-wrap: anywhere; }
.cs-minds__case > :is(img, svg, .ch-tile) { display: inline-block; vertical-align: top; width: var(--icon-sm); height: var(--icon-sm); margin: calc((var(--leading-ui) - var(--icon-sm)) / 2) var(--space-2) 0 calc((var(--icon-sm) + var(--space-2)) * -1); }
.cs-minds__case > svg { color: var(--ink-muted); }
.cs-minds__case:hover > span { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.cs-minds__when { flex: none; white-space: nowrap; }

/* Одна фраза на месте списка (Chimera не передумала): сразу под заголовком, без поля пустого списка */
.fd__aside .cs-minds .ch-empty { padding: 0; }

/* ═══ case.css ═══ */
/* Страница дела. Каркас документа — из finding.css: шапка с крошками и действиями, две колонки, разделы 18/28, подробности.
   Здесь — бриф по утверждениям, находки под ними, кто сдвинулся и вопрос Скауту. */

.cp-col { display: grid; min-width: 0; }
/* Дело — лист на столе, как находка (fp--sheet; владелец, 2026-11-10: обе половины одного цвета, и не понять, что главное).
   Читают дело слева — бриф и вопрос Скауту, — поэтому лист — вся левая колонка (cp-col), а не только fp__main: поле вопроса
   прилипает к низу окна на бумаге листа (--ask-ground: paper) и кончает лист своим полем 32. Справа — кто сдвинулся,
   подробности, вопросы и убеждения — на холсте, в тонах холста (finding.css). Дело в архиве без поля — лист кончается полем 32 */
.fp--sheet .cp-col { background: var(--paper); border-radius: var(--radius); padding: var(--space-6) var(--space-8) 0; }
.fp--sheet .cp-col > .fp__main { background: none; border-radius: 0; padding: 0; }
.fp--sheet .cp-ask { padding-bottom: var(--space-8); }
.fp--sheet .cp-col:has(> .cp-ask[hidden]) { padding-bottom: var(--space-8); }
/* Поля нет в разметке вовсе (продукт: дело в архиве, дело своего сайта) — лист кончается полем 32 под сводкой */
.fp--sheet .cp-col > .fp__main:last-child { padding-bottom: var(--space-8); }
/* Край шапки над стороной (владелец, 2026-11-11): у листа слева край есть, у стороны его не было. Волосок цвета листа на высоте
   верхнего края листа, от начала стороны до правого края страницы (края действий заголовка). Это край листа, продолженный через
   сторону, а не ещё одна строка списка — поэтому paper, а не line. Доли колонок — как у fp__cols (11 : 10). В одну колонку — нет.
   Только у дела (:has(> .cp-col)): case.css в продукте собран с finding.css, а у находки на этой высоте стоит верх снимка */
.fp--sheet .fp__cols:has(> .cp-col) { position: relative; }
.fp--sheet .fp__cols:has(> .cp-col)::after { content: ""; position: absolute; top: var(--space-8); right: 0; left: calc((100% - var(--cols-gap)) * 11 / 21 + var(--cols-gap)); border-top: var(--hairline) solid var(--paper); }

/* Утверждение брифа — голосом Скаута; число находок под ним раскрывает их списком прямо под абзацем */
.cp-claims { display: grid; gap: var(--space-6); }
.cp-claim { display: grid; gap: var(--space-2); }
.cp-claim > .ch-link { justify-self: start; }
.cp-claim > .ch-voice--quiet { color: var(--ink-muted); }

/* «Show all» в списке всех находок дела — под последней строкой */
.cp-more { display: flex; align-items: center; gap: var(--space-4); padding-top: var(--space-3); margin: 0; }

/* Справа: кто сдвинулся по порядку — имя слева, дата справа */
.cp-movers > li { display: grid; grid-template-columns: 1.125rem minmax(0, 1fr) auto; column-gap: var(--space-3); align-items: center; padding: var(--space-2) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.cp-movers .ch-meta { white-space: nowrap; }

/* Списки стороны, где строка — ссылка на страницу (убеждения, вопросы Скауту): строка интерфейсным шрифтом, заголовок
   строки подчёркивается тонкой линией при наведении */
.cp-beliefs > li > a, .cp-asked > li > a { display: grid; column-gap: var(--space-3); padding: var(--space-3) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-decoration: none; }
.cp-beliefs > li > a:hover > span:nth-child(2), .cp-asked > li > a:hover > .cp-asked__title { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }

/* Убеждения, которые питает дело: знак статуса, формулировка и под ней статус словом с датой; строка ведёт к убеждению.
   Статус — под формулировкой, а не справа: у факта он говорит, кто подтвердил, а у подтверждения Скаута ещё и что насчитало
   правило («confirmed by Scout since Oct 22 · 63 findings from 12 competitors over 3 months») — в столбце стороны справа ему тесно */
.cp-beliefs > li > a { grid-template-columns: 0.75rem minmax(0, 1fr); row-gap: var(--space-1); align-items: baseline; }
.cp-beliefs .ch-mark { align-self: start; margin-top: calc((var(--leading-ui) - 0.75rem) / 2); }
.cp-beliefs .ch-meta { grid-column: 2; }
.cp-beliefs > li[data-status="replaced"] > a > span:nth-child(2) { text-decoration: line-through; color: var(--ink-gone); }
.cp-beliefs > li[data-status="replaced"] .ch-mark { color: var(--ink-gone); }

/* Вопросы Скауту: строка ведёт на страницу вопроса — слова человека строкой списка (ui 14, как убеждения рядом; body 15 — в разговоре),
   под ними мета рядом фактов (ch-metarow): кто и когда спросил, сколько раз ответил Скаут и статус словами страницы вопроса.
   Факты переносятся между собой; внутри себя — только факт длиннее строки.
   Слова вопроса — не больше двух строк, дальше многоточие, на любой ширине: обрезка только видимая, слова целиком остаются
   в разметке (имя ссылки для читалки), целиком вопрос — на его странице */
.cp-asked > li > a { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-1); }
.cp-asked__title { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-wrap: pretty; }

/* Вопрос Скауту прилипает к низу колонки брифа; элемент в фокусе не уходит под него (--ask-h — высота поля со статусом, если её меряет скрипт).
   У дела в архиве поля нет (hidden) — и запаса под ним нет */
html:has(.cp-ask:not([hidden])) { scroll-padding-bottom: calc(var(--ask-h, calc(var(--composer) + var(--leading-meta) + var(--space-12))) + var(--space-4)); }
/* Пока бриф идёт под полем, над полосой стоит раствор со стрелкой (ch-ask-more): элемент в фокусе встаёт над ним */
html:has(.cp-ask[data-more]:not([hidden])) { scroll-padding-bottom: calc(var(--ask-h, calc(var(--composer) + var(--leading-meta) + var(--space-12))) + var(--space-12) + var(--control)); }
.cp-ask { --ask-ground: var(--paper); position: sticky; bottom: 0; z-index: 5; display: grid; gap: var(--space-2); max-width: var(--measure); margin-top: var(--space-12); padding: var(--space-4) 0 var(--space-6); background: var(--ask-ground); }

/* Подпись «Scout» в строке над брифом */
.cp-by b { font-weight: 500; color: var(--ink); }

/* Первый день новых конкурентов (CHI-1027, Б3-4б): строка на месте сводки, пока её нет; точка — на первой строке слов */
.cp-firstday { display: flex; align-items: flex-start; margin: 0; max-width: var(--measure); }
.cp-firstday .ch-dot { margin-top: calc((var(--leading-meta) - var(--dot)) / 2); flex: none; }

/* Узкое окно: лист — по полю карточки, как у находки */
@container (max-width: 52.5rem) {
  .fp--sheet .cp-col { padding: var(--space-4) var(--card-pad) 0; }
  .fp--sheet .cp-col > .fp__main { padding: 0; }
  .fp--sheet .cp-ask { padding-bottom: var(--space-6); }
  .fp--sheet .cp-col:has(> .cp-ask[hidden]) { padding-bottom: var(--space-6); }
  .fp--sheet .cp-col > .fp__main:last-child { padding-bottom: var(--space-6); }
  .fp--sheet .fp__cols:has(> .cp-col)::after { display: none; }
}

/* ═══ beliefs.css ═══ */
/* Убеждения Скаута: список с подробностями и доска по статусам. Каркас — из findings.css: липкая шапка с фильтрами, панель прототипа.
   Статус — знак и слово, как везде: ○ гипотеза, ◐ подкреплено, ● факт, ⊘ заменено; знак — в цвете своей уверенности (ch-mark--<статус>, components.css). */

/* Переключатель вида «List · Board» — общий выбор словами (ch-segmented) */

/* «Worth acting on» — совет Скаута: знак и слово чернилами, как важность находки */
.bl-act { display: inline-flex; align-items: center; gap: var(--space-1); font: 500 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); white-space: nowrap; }
.bl-act .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }

/* ── Список: убеждения | выбранное целиком ── */
/* Фокус страницы (владелец, 2026-11-09, вариант «Лист» из трёх): список — указатель, читают документ. Вид списка лежит на холсте —
   страница, её шапка и рейка без линии, как разговор (ch-app--canvas), — а выбранное убеждение — лист бумаги: бумага — поверхность
   документа (RULES → Colour, Surfaces), не приподнятое (ch-raised). Доска остаётся на бумаге: её дорожки сами холст.
   :has() — только отдельными правилами: сборка продукта (Lightning CSS) список селекторов с ним теряет (CHI-365) */
html:has(.fd > .bl-split:not([hidden])) body { background: var(--canvas); }
.fd:has(> .bl-split:not([hidden])) { background: var(--canvas); }
.fd:has(> .bl-split:not([hidden])) > .fd__head { background: var(--canvas); }
.fd:has(> .bl-split:not([hidden])) > .fd__head::before { background: var(--canvas); }
.ch-app:has(.fd > .bl-split:not([hidden])) > .ch-rail { border-right: 0; }
/* На холсте у линий и подложек — свои тона (как у плашки агента на холсте): общие бумажные пропали бы */
.fd:has(> .bl-split:not([hidden])) > .fd__head { --line: var(--raised-canvas-line); }
.bl-list { --line: var(--raised-canvas-line); --hover-row: var(--raised-canvas); }
/* Выбранная строка — той же бумаги, что лист документа, и с полосой акцента (владелец, 2026-11-09, вариант 1 из четырёх):
   строка и документ — один материал; под указателем — полшага от холста к бумаге */
.bl-list .bl-item[aria-current="true"]::before { background: var(--paper); }
/* Лист документа: поля внутри, скругление; колонка свойств и списки — по его полям */
.bl-doc { background: var(--paper); border-radius: var(--radius); padding: var(--space-6) var(--space-8) var(--space-8); }
.bl-split { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); column-gap: var(--cols-gap); align-items: start; padding: var(--space-6) 0 var(--space-18); }
.bl-list { min-width: 0; }
.bl-item > button {
  width: 100%; display: grid; grid-template-columns: 0.75rem minmax(0, 1fr); column-gap: var(--space-3); row-gap: var(--space-1);
  padding: var(--space-4) 0; border: 0; background: none; text-align: left; cursor: pointer; font: inherit; color: inherit;
}
/* Строка списка — 16 сверху и снизу (владелец, 2026-11-09: при 12 список был слишком плотным) */
.bl-item .ch-mark { margin-top: calc((var(--leading-ui) - 0.75rem) / 2); }
.bl-item__title { font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-wrap: pretty; }
.bl-item__meta { grid-column: 2; display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); }
/* Строка кликабельна целиком (ch-clickable); выбранная отмечена ещё и полосой акцента слева, как текущий раздел в рейке */
.bl-item[aria-current="true"]::after {
  content: ""; position: absolute; top: var(--space-2); bottom: var(--space-2); left: calc(var(--card-pad) * -1);
  width: 0.125rem; border-radius: 1px; background: var(--accent);
}

/* Выбранное убеждение — документ, как страница находки; прилипает под шапкой и прокручивается сам */
.bl-doc {
  position: sticky; top: calc(var(--head-h, 8rem) + var(--space-6));
  max-height: calc(100vh - var(--head-h, 8rem) - var(--space-12)); overflow: auto; overscroll-behavior: contain;
  display: grid; gap: var(--space-8); align-content: start; min-width: 0; padding-bottom: var(--space-6);
}
/* Слова документа — одной колонкой, строкой чтения, как «What Scout sees»: плитка Скаута и разделы за ней тоже (владелец,
   2026-11-03, после пары 0.30.0 вживую); на всю ширину документа — только списки (0.30.0) */
.bl-doc > * { max-width: var(--measure); }
.bl-doc > .bl-section--wide { max-width: none; }
/* Шапка — один заголовок, без линии под ним (владелец, 2026-11-09): от тела её отделяет шаг документа, 32 */
.bl-doc__head { max-width: none; }
/* Заголовок убеждения — на ступень ниже заголовка страницы: над ним уже стоит «What Scout believes» 24/32.
   Шкала документа: убеждение 18, голос Скаута 16, подписи разделов 13 */
.bl-doc__title { margin: 0; font: 500 var(--text-heading)/var(--leading-heading) var(--font-ui); color: var(--ink); text-wrap: pretty; }
/* Тело документа (владелец, 2026-11-09): текст | свойства. Справа от строки чтения оставалась пустота — в ней теперь
   свойства убеждения колонкой: статус и факты стопкой (подпись над значением). Колонка — доля ширины документа
   в пределах 192–232 (с полем 24 за линией); текст — остальное, не шире строки чтения. Колонка держится наверху, пока документ прокручивается */
.bl-doc > .bl-body { max-width: none; }
.bl-body { display: grid; grid-template-columns: minmax(0, 1fr) clamp(12rem, 30%, 14.5rem); column-gap: var(--space-6); align-items: start; }
.bl-body__main { display: grid; gap: var(--space-8); align-content: start; min-width: 0; }
.bl-body__main > * { max-width: var(--measure); }
/* Свойства отделены от текста волосяной линией посередине щели в 48 (владелец, 2026-11-09); линия — высотой колонки свойств */
.bl-props { position: sticky; top: 0; min-width: 0; padding-left: var(--space-6); border-left: var(--hairline) solid var(--line); }
/* Свойства стопкой: подпись над значением, 16 между свойствами. Имена конкурентов — строкой под значками */
.bl-facts { display: grid; gap: var(--space-4); margin: 0; }
.bl-facts > div { display: grid; gap: var(--space-1); min-width: 0; }
.bl-facts dt { font: 400 var(--text-meta)/var(--leading-meta) var(--font-ui); color: var(--ink-muted); }
.bl-facts dd { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.bl-facts .bl-sites { display: flex; flex-wrap: wrap; }
.bl-facts .bl-sites > span:not(.ch-tile) { flex-basis: 100%; }
/* Один конкурент — значок и имя одной строкой (вживую, 2026-11-09: имя под единственным значком читалось оторванным) */
.bl-facts .bl-sites:not(:has(> .ch-tile ~ .ch-tile)) > span:not(.ch-tile) { flex-basis: auto; margin-left: var(--space-1); }
.bl-sites { display: inline-flex; align-items: center; gap: var(--space-1); }
.bl-nowrap { white-space: nowrap; }
.bl-sites .ch-tile { width: 1rem; height: 1rem; }


/* Разделы документа — подписью раздела системы (ch-label): капитель 13/500 чернилами, 12 до текста под ней */
.bl-section { display: grid; gap: var(--space-3); }
.bl-label { margin: 0; font: 500 var(--text-label)/var(--leading-label) var(--font-ui); letter-spacing: .08em; text-transform: uppercase; color: var(--ink); }
.bl-label b { font-weight: 500; color: var(--ink); }
.bl-note { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
/* Ссылка в заметке — акцентом, как любая ссылка в прозе интерфейса (components.css, рядом с fp-note; RULES → Behaviour) */
/* Раздел, тело которого — список (на чём стоит, против, дела): список на всю ширину документа, дата строки — у его правого
   края; слова в нём — заметка и почему находка пошла против — остаются строкой чтения. Класс ставит разметка, не :has() */
.bl-section--wide > .bl-note, .bl-section--wide .ch-ev__sum { max-width: var(--measure); }
.bl-cases > li > a { display: grid; grid-template-columns: 1.125rem minmax(0, 1fr) auto; column-gap: var(--space-3); align-items: center; padding: var(--space-3) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-decoration: none; }
.bl-cases > li > a > .ch-icon { width: 1.125rem; height: 1.125rem; color: var(--ink-muted); }
.bl-cases > li > a:hover > span:nth-child(2) { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }

/* ── Доска: три колонки по зрелости; в последней — решённые: подтверждённые вами и заменённые.
      Статус — дорожка цвета холста, убеждения на ней — карточки цвета бумаги: карточку отделяет контраст двух токенов, без тени ── */
/* Дорожки доски — ближе друг к другу, на треть уже щели колонок страницы (владелец, 2026-11-09) */
.bl-board { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: calc(var(--cols-gap) * 2 / 3); align-items: start; padding: var(--space-6) 0 var(--space-18); }
.bl-col { display: grid; gap: var(--space-6); min-width: 0; }
.bl-group { display: grid; padding: var(--space-4) var(--space-3) var(--space-3); background: var(--canvas); border-radius: var(--radius); }
.bl-group__head { display: grid; gap: var(--space-1); padding: 0 var(--space-1) var(--space-4); }
.bl-group__name { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); margin: 0; font: 500 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); }
.bl-group__name > span:first-child { display: inline-flex; align-items: center; gap: var(--space-2); }
/* Знак «i» с тем, что значит дорожка, — в 4 за именем, как у заголовка раздела (ch-heading) */
.bl-group__name .ch-info { margin-left: calc(var(--space-1) * -1); }
/* Подгруппа внутри дорожки: «Worth acting on» наверху подтверждённых — совет сказан подписью, на карточках не повторяется */
.bl-sub { padding: var(--space-4) var(--space-1) var(--space-2); }
.bl-group__head + .bl-sub { padding-top: 0; }
/* Карточки — без волосяных линий списка, с зазором 8px */
.bl-board .ch-list { display: grid; gap: var(--space-3); border-top: 0; }
.bl-board .ch-list > li { border-bottom: 0; }
.bl-group > .bl-note { padding-inline: var(--space-1); }

/* Свёртка того, что затихло (CHI-1591): тихие факты подгруппы Confirmed и давно закрытые в Replaced — одной строкой в конце
   своей группы, «Quiet for over 3 months · 4». Строка — ссылка системы (ch-link, акцентом — это действие человека, как Show
   earlier) с шевроном (ch-disclosure__chev, aria-expanded); последнее слово, счёт и шеврон — её конец (ch-link__end), так
   что тесная строка переносится словами. Своего цвета у тихого нет. Раскрытая строка
   остаётся над своими карточками подписью, шеврон смотрит вверх. На доске слова строки — у края подписи подгруппы (space-1);
   без карточек над ней (затихло всё) строка встаёт сразу под подписью. В списке — под последней строкой, как «Show earlier» */
.bl-fold { margin: 0; padding: var(--space-3) var(--space-1) 0; }
.bl-group__head + .bl-fold, .bl-sub + .bl-fold { padding-top: 0; }
.bl-fold + .ch-list { margin-top: var(--space-2); }
.bl-list .bl-fold { padding: var(--space-4) 0 0; }
.bl-list > .ch-list[hidden] + div > .bl-fold:first-child { padding-top: 0; }

/* Карточка: кто, сколько и когда; заголовок. Поднятый лист на дорожке холста (ch-raised: в светлой — полшага от холста к бумаге;
   в тёмной — над дорожкой, а не под ней). Кликабельна целиком (ch-clickable--card): открывает убеждение в списке,
   при наведении темнеет рамка по её краю */
/* Карточке — воздух (владелец, 2026-11-09: «всё сливается»): поля 16 со всех сторон, 8 между строками, 12 между карточками */
.bl-card { display: grid; gap: var(--space-2); padding: var(--space-4); }
.bl-card__top, .bl-card__foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); min-width: 0; }
.bl-card__top .bl-sites { min-width: 0; }
.bl-card__top .bl-sites > .ch-meta { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-left: var(--space-1); }
.bl-card__title { margin: 0; }
.bl-card__title > button { padding: 0; border: 0; background: none; text-align: left; cursor: pointer; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-wrap: pretty; }
.bl-card__when { flex: none; }
.bl-card__foot { margin-top: var(--space-1); }

/* Узко: список над выбранным не помещается рядом — выбранное сверху, без прилипания; доска — в одну колонку */
@container (max-width: 52.5rem) {
  .bl-split { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-12); }
  .bl-doc { position: static; max-height: none; overflow: visible; order: -1; }
  /* Лист в одну колонку — уже: поля листа по полю карточки, чтобы строке чтения хватало места */
  .bl-doc { padding: var(--space-4) var(--card-pad) var(--space-6); }
  /* Документ в одну колонку: свойства — над текстом, строкой фактов, как поместятся; каждое свойство шириной в свои слова,
     остаток строки делится поровну, свойство не переносит свои слова, а уходит на следующую строку целиком */
  .bl-body { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-8); }
  .bl-props { order: -1; position: static; padding-left: 0; border-left: 0; }
  .bl-facts { display: flex; flex-wrap: wrap; gap: var(--space-3) var(--space-6); }
  .bl-facts > div { flex: 1 1 auto; }
  .bl-facts .bl-sites { display: inline-flex; flex-wrap: nowrap; }
  .bl-facts .bl-sites > span:not(.ch-tile) { flex-basis: auto; margin-left: var(--space-1); }
  .bl-board { grid-template-columns: minmax(0, 1fr); row-gap: var(--space-12); }
}

/* Заменённое убеждение остаётся в списках и на доске зачёркнутым и тихим — видна история (RULES → Marks) */
.bl-item[data-status="replaced"] .bl-item__title,
.bl-card[data-status="replaced"] .bl-card__title > button,
.bl-doc[data-status="replaced"] .bl-doc__title { text-decoration: line-through; color: var(--ink-gone); }
.bl-item[data-status="replaced"] .ch-mark, .bl-card[data-status="replaced"] .ch-mark { color: var(--ink-gone); }

/* «Why it is a fact» у подтверждения Скаута: что насчитало правило — словами интерфейса, не голосом: это счёт кода, а не
   рассуждение Скаута (рассуждение — Literata в «What Scout sees» над ним) */
.bl-rule { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-wrap: pretty; }

/* Первый день новых конкурентов (CHI-1027, Б3-4б): строка над списком и доской — что Chimera сверяет и когда скажет.
   Точка — на первой строке слов, слова переносятся под себя */
.bl-firstday { display: flex; align-items: flex-start; margin: 0 0 var(--space-4); max-width: var(--measure); }
.bl-firstday .ch-dot { margin-top: calc((var(--leading-meta) - var(--dot)) / 2); flex: none; }

/* ═══ competitors.css ═══ */
/* Конкуренты: таблица наблюдения. Каркас — из findings.css: липкая шапка с фильтрами, панель прототипа.
   Цвет в таблице — только фавиконы и красный у сайтов, которые Скаут не может прочитать: числа и дни — значения, чернилами (RULES) */

/* «Add competitors» стоит у заголовка, пока рядом есть место; тесно (телефон, размер L) — уходит строкой ниже, под счёт,
   а не сжимается в две строки и не выталкивает шапку за край окна */
.cm-head { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: var(--space-4) var(--space-6); }
.cm-head > .ch-btn { flex: none; }
.cm-head__title { display: grid; gap: var(--space-1); }
.cm-head__title .ch-meta { margin: 0; font-size: var(--text-ui); line-height: var(--leading-ui); color: var(--ink-muted); }

.cm-wrap { padding: var(--space-6) 0 var(--space-18); }
/* Таблица — общая ch-table (сортировка, липкая шапка, доли столбцов, подсветка строки); здесь — только своё */
/* Ширины — доли таблицы, а не по содержимому: так у каждого столбца запас под самое длинное значение и нет пустот.
   Самые длинные: «Papaya Global», «papayaglobal.com», «Failing», «Oct 22», «Legal & partners»; домену — 15%, чтобы
   «papayaglobal.com» стоял целым и у самой узкой таблицы, 1080 (с 0.95.0: подписи капителью шире, по-русски
   «ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ» и «УБЕЖДЕНИЯ» целы только от 1080).
   Подписи обоих языков стоят в своей доле, не залезая в соседнюю: «Убеждения» — целым словом, «Последнее изменение»,
   «Находки за 30 дней», «Открытые дела» и «Pages watched» переносятся между словами */
.cm-c-site { width: 14%; }
.cm-c-domain { width: 15%; }
.cm-c-status { width: 9%; }
.cm-c-last { width: 10%; }
.cm-c-kind { width: 13%; }
.cm-c-findings { width: 11%; }
.cm-c-cases { width: 10%; }
.cm-c-beliefs { width: 10%; }
.cm-c-pages { width: 8%; }
/* Подпись столбца, которой тесно в своей доле, переносится между словами от левого края, а не режется и не выходит за таблицу;
   стрелка сортировки идёт за последним словом и, когда ей нет места, уходит на строку ниже, а не отнимает место у слова.
   Слово длиннее своей доли (таблица уже своей наименьшей ширины) рвётся у края, а не лезет в соседний столбец */
.cm-table thead th { white-space: normal; }
/* Только кнопка сортировки: знак «i» в той же th — тоже button, но своей раскладки (ch-info), и inline-block с vertical-align
   стрелки сбивали его на 11–12 px выше слова (CHI-22) */
.cm-table thead th > button:not(.ch-info) { display: inline-block; white-space: normal; overflow-wrap: anywhere; max-width: 100%; }
.cm-table thead th > button:not(.ch-info) .ch-icon { margin-left: var(--space-1); vertical-align: -0.125rem; }
/* Свой сайт закреплён сверху и отделён от конкурентов линией потемнее — строка ch-table__you */

/* Конкурент: фавикон и имя; домен — своим столбцом, тише, ведёт на сайт */
.cm-site { display: flex; align-items: center; gap: var(--space-2); white-space: nowrap; }
.cm-site__name { font-weight: 500; color: var(--ink); text-decoration: none; }
.cm-site__name:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.cm-domain { color: var(--ink-muted); text-decoration: none; white-space: nowrap; }
.cm-domain:hover { color: var(--ink); text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }

/* Последнее изменение — его день, своим столбцом чисел; вид — следующим столбцом, словами. День ведёт на находку, если она
   есть в ленте */
.cm-last { color: var(--ink); text-decoration: none; }
/* Находки, дела и убеждения — числа: чернилами, как всякое значение рядом со своим именем (RULES), а ссылку выдаёт
   подчёркивание под указателем; ведут в находки, дела и убеждения по этому сайту */
.cm-count { color: var(--ink); text-decoration: none; }
:is(a.cm-last, a.cm-count):hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }


/* Узко: таблица прокручивается вбок, а не сжимается */
@container (max-width: 67.5rem) {
  .cm-wrap { overflow-x: auto; }
  /* Уже — подписи шире своих долей: таблица держит ширину, при которой каждое слово подписи стоит целым, и прокручивается */
  .cm-table { min-width: 67.5rem; }
  .cm-table thead th { position: static; }
}

/* ── Окно Add competitors (CHI-1431): форма системы над затемнением. Здесь — только своё: ряд адреса и строки под ним
      (отказ, удержанный Ask Scout) — столбцом с шагом 4, как подсказка под полем; очередь — список, а не таблица: «почему» —
      предложение, а строки предложений — список (RULES), как кандидаты онбординга. Строка: значок; имя (малое поле или слова:
      Your site, имя конкурента у страницы); «убрать» — в конце строки имени; под именем — адрес, который Scout будет читать,
      и почему, во всю ширину до края строки, под «убрать» тоже. В разметке «убрать» — последним: читалка слышит имя, адрес и
      почему, потом кнопку. Почему из подсказки Scout — его голосом, как у кандидатов онбординга; «Added by you…» и строка
      своего сайта — слова системы ── */
/* Один столбец во всю ширину окна: отказ с длинной личной ссылкой не раздвигает форму за край диалога на телефоне */
.cm-add { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-1); }
.cm-queue > li { display: grid; grid-template-columns: 1.125rem minmax(0, 1fr) auto; column-gap: var(--space-3); row-gap: var(--space-1); align-items: start; padding: var(--space-3) 0; }
.cm-queue > li > .ch-meta, .cm-queue__why { grid-column: 2 / -1; }
.cm-queue > li > .ch-btn { grid-column: 3; grid-row: 1; }
.cm-queue__name { font-weight: 500; color: var(--ink); }
.cm-queue__why { margin: 0; max-width: var(--measure); color: var(--ink-muted); text-wrap: pretty; }
.cm-queue__why--scout { font: 400 var(--text-voice-sm)/var(--leading-voice-sm) var(--font-voice); }
/* Строка имени — высотой с «убрать», словами (Your site, имя конкурента у страницы) или малым полем: значок, имя и кнопка —
   по её середине. Кнопка не выступает за строку имени на адрес под ней, и строки слов и строки с полем идут одним шагом */
.cm-queue > li > .ch-tile { margin-top: calc((var(--control) - 1.125rem) / 2); }
.cm-queue__name { align-self: center; }

/* ── Chimera suggests (CHI-671): плашка голоса (ch-plate) над таблицей, по строке на кандидата. Строка: значок (буква — сайт вне
      списка), имя и сайт; почему — голосом Chimera чернилами (это довод, ради которого строка стоит); кто его называет —
      значения в ряд (ch-values: фавикон конкурента и имя ссылкой на его страницу сравнения, закрытая для роботов — без ссылки, со
      словами и «i»); метка с датой — одна строка меты. Действия — у правого края строки на её первой строке; в плашке уже 840 —
      под словами, как у любой плашки голоса (RULES). Между строками — волосок плашки ── */
/* Место плашки под шапкой страницы: 24 над ней; пустой недели нет — нет и места */
.cm-suggests:not(:empty) { padding-top: var(--space-6); }
/* Шапка плашки: строка автора, как у всех плашек голоса (Chimera · suggests), и цена наблюдения — своим фактом у правого края, над
   действиями строк, а не третьим звеном строки автора; тесно — под ней */
.cm-sg__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 0 var(--space-6); }
.cm-sg__price { margin: 0; }
.cm-sg { list-style: none; margin: 0; padding: 0; }
.cm-sg > li { display: grid; grid-template-columns: 1.125rem minmax(0, 1fr) auto; column-gap: var(--space-3); row-gap: var(--space-3); align-items: start; padding: var(--space-4) 0; border-top: var(--hairline) solid var(--plate-line); }
.cm-sg > li:first-child { border-top: 0; padding-top: var(--space-2); }
.cm-sg > li:last-child { padding-bottom: 0; }
.cm-sg > li > .ch-tile { margin-top: calc((var(--leading-ui) - 1.125rem) / 2); }
.cm-sg__main { display: grid; gap: var(--space-1); min-width: 0; }
.cm-sg__main > p { margin: 0; }
.cm-sg__name { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--space-3); }
.cm-sg__name > b { font-weight: 500; color: var(--ink); }
.cm-sg__why { max-width: var(--measure); font: 400 var(--text-voice-sm)/var(--leading-voice-sm) var(--font-voice); color: var(--ink); text-wrap: pretty; margin-bottom: var(--space-1) !important; }
.cm-sg__by { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-3); }
.cm-sg__by > .ch-values { gap: var(--space-1) var(--space-4); }
.cm-sg__by .ch-named > .ch-tile { margin-right: var(--space-1); }
.cm-sg__closed { white-space: nowrap; }
.cm-sg__closed .ch-meta { margin-left: var(--space-1); }
.cm-sg > li > .ch-actions { flex-wrap: nowrap; }
/* Решённая строка: одна фраза на месте строки; после Not relevant — причина по желанию (выбор слов) и Undo */
.cm-sg__done { grid-column: 2 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-4); min-height: var(--control); }
.cm-sg__done > p { margin: 0; }
.cm-sg__reason { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-2); }
.cm-sg__more { margin-top: var(--space-4); justify-self: start; }
.cm-sg__more[aria-expanded="true"] .ch-disclosure__chev { transform: rotate(180deg); }
@container (max-width: 52.4988rem) {
  .cm-sg > li > .ch-actions { grid-column: 2; flex-wrap: wrap; }
}
.cm-unread { color: var(--ink-muted); }
.cm-sg > li:has(> .cm-sg__done) > .ch-tile { margin-top: calc((var(--control) - 1.125rem) / 2); }

/* ═══ competitor.css ═══ */
/* Досье конкурента. Каркас документа — из finding.css: шапка с крошками и действием, разделы 18/28, подробности.
   Здесь — вкладки, дашборд обзора, найм, таблицы юр. лиц, инструментов, источников и страниц. Цвет — только
   фавиконы и флаги рядом с именем страны (ch-flag, RULES → Colour), акцент у ссылок и выбора, красный — у источников, которые
   Chimera не может прочитать */

.co-title { display: inline-flex; align-items: center; gap: var(--space-3); }
.co-title .ch-tile { width: 1.5rem; height: 1.5rem; }

.co-panel { padding-top: var(--space-8); outline: none; }
.co-panel > .fp__cols { padding-top: 0; }
.co-stack { display: grid; gap: var(--space-12); }
.co-stack > * { max-width: var(--measure); }
.co-stack > .fp-wide { max-width: none; }
/* Баннер сбоя и советы Chimera — шириной таблицы источников под ними, а не меры чтения (RULES → Behaviour, баннер; плашка) */
.co-stack > :is(.ch-banner, .ch-plate) { max-width: none; }

/* Подпись над разделом и пояснение под ним — тише текста */
.co-intro { margin: 0; max-width: var(--measure); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
/* Ссылка в её прозе — правило прозы системы (components.css, fp-note и соседи) */

/* Ряд контролов над списком (Partner programs: поиск, чип, выгрузка) */
.co-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-6); margin-bottom: var(--space-6); }

/* ── Компания: найм — три числа, направления и страны полосами, открытые руководящие роли (таблица системы, ch-table) ── */
/* Полосы найма и рекламы — две фигуры рядом, на своём месте страницы: на бумаге без подложки (владелец, 2026-11-08),
   щель между ними — --cols-gap; ряд чисел и таблица ролей — на бумаге тоже */
.co-pair { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-8) var(--cols-gap); align-items: start; }
.co-pair .ch-bars__row { grid-template-columns: minmax(7.5rem, 45%) minmax(0, 1fr); }

.co-muted { color: var(--ink-muted); }
/* Страница под наблюдением — «Watched» акцентом, без рамки */
.ch-table .ch-btn[aria-pressed="true"] { color: var(--accent); border-color: transparent; }

/* Добавить источник: форма из общих полей раскрывается по кнопке, а не висит над списком; узко — поля одно под другим */
.co-add { grid-template-columns: 9.375rem minmax(0, 1fr) 7.5rem auto; max-width: var(--measure); }

/* Узко: колонки — в одну */
@container (max-width: 52.5rem) {
  .co-pair { grid-template-columns: minmax(0, 1fr); }
}
/* На телефоне: форма источника — поля одно под другим */
@container (max-width: 35rem) {
  .co-add { grid-auto-flow: row; grid-template-columns: minmax(0, 1fr); }
  .co-add > .ch-btn { justify-self: start; margin-top: 0; }
}

/* Подразделы внутри раздела: заголовок 15/24 чернилами, как у графиков */
.co-sub { display: grid; gap: var(--space-3); margin: 0; }
.co-sub > h3 { margin: 0; font: 500 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); }
.co-stack > .fp-section.fp-wide > * { max-width: var(--measure); }
/* Ряд чисел (ch-kpis--fit) — шириной своих плиток, а не мерой текста */
.co-stack > .fp-section.fp-wide > :is(h2, .fp-wide, .ch-table-wrap, .ch-kpis--fit) { max-width: none; }
/* Разделы сайта на Platforms (co-site, часть раздела fp-page: 32 над ней, 8 под заголовком): столбцы по назначению — во всю
   ширину, на сетке плиток над ними; заголовок 15/24 с «i»; пути без описания — подписью метой и рядом ссылок под столбцами */
.co-stack > .fp-section.fp-wide > .co-site { max-width: none; }
.co-site > h3, .co-site > .ch-heading > h3 { font: 500 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); }
.co-site > .ch-heading > .ch-info { margin: calc((var(--leading-body) - var(--leading-ui)) / 2) 0 0 var(--space-1); }
.co-site__rest { display: grid; gap: var(--space-1); margin-top: var(--space-2); }

/* Строки таблиц досье — в одну строку: причина сбоя и пояснения — за знаком «i» (ch-info); вторая строка бывает только у
   столбца, сложенного на телефоне (языки страницы, «Declared»), — строки выравниваются по первой строке текста;
   короткие факты (вид, частота, даты, кто добавил) не переносятся */
.co-panel .ch-table tbody th, .co-panel .ch-table td { vertical-align: baseline; }
.co-panel .ch-table td.co-muted { white-space: nowrap; }
/* Check now и меню «···» строки источника — в ряд у правого края, не переносятся; у строки без меню его место держит
   невидимая кнопка той же формы (co-slot), чтобы Check now стоял в одной колонке (в продукте — MenuSlot) */
.co-row-actions { justify-content: flex-end; flex-wrap: nowrap; }
.co-slot { visibility: hidden; }
/* Слово состояния на месте Check now у строки, о сбое которой знает команда Chimera (CHI-1625: Chimera team notified, Fix in
   progress): серое, как OK и Not read yet, высотой и правым полем кнопки, которую оно заменило, — строка не становится ниже
   соседних, а слова кончаются там же, где «Check now». Знак «i» — внутри, после слов, по их середине, как после числа */
.co-team { display: inline-flex; align-items: center; gap: var(--space-1); min-height: var(--control); padding-right: var(--space-3); color: var(--ink-muted); }
.co-team > .ch-info { margin-left: 0; }

/* ── Реклама (вкладка Ads): данные библиотеки рекламы Microsoft, без голоса Скаута. Картина — число объявлений числом раздела
      (fp-figure), языки и соперники полосами (co-pair, как найм; у соперника — значок компании, ваш — акцентом), страницы
      таблицей. Без картины ответ — фраза, как у найма (co-intro), факты мелко под ней (ch-facts), оговорка; ещё не
      смотрел и первое чтение — пустое состояние (ch-empty). Языки страницы в таблице — тише адреса и переносятся по словам:
      столбец не раздвигает таблицу на телефоне ── */
.co-langs { color: var(--ink-muted); }
/* Полосы языков и соперников — на шаг дальше от ссылки в библиотеку: ссылка закрывает шапку картины, как у найма */
.co-panel .fp-figure ~ .co-pair { margin-top: var(--space-3); }
/* Ссылка в библиотеку — слова одним куском, ↗ — после последнего слова, как у адреса (ch-url), а не у края строки */
.co-out > span > .ch-url__end > .ch-icon { margin-left: var(--space-1); vertical-align: -0.125rem; }
/* Два совета Скаута подряд на Watching (список вакансий и рекламодатель) — одной стопкой, а не двумя разделами */
.co-stack > .ch-plate + .ch-plate { margin-top: calc(var(--space-4) - var(--space-12)); }
/* Узкая колонка (телефон): языки — второй строкой под адресом, столбец уходит; иначе «English, German, French» стоит
   в три строки и строка таблицы вырастает втрое */
.co-langs-sub { display: none; }
@container (max-width: 35rem) {
  .co-ad-pages .co-langs { display: none; }
  .co-ad-pages .co-langs-sub { display: block; }
}

/* ── Компания → Apps: строка на приложение — имя, что с ним сейчас (темп версий, давно без версий, почему Scout его не
      заводит; «не может найти в магазине» — красным словами), факты мелко: магазины, версия и день, кто завёл. Каждый факт —
      целым куском, строка не начинается с точки. Действие — в конце строки, на строке имени, как управление строки настройки;
      на телефоне — под словами. Остановленное стоит на месте, тише ── */
.co-apps > li { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: var(--space-6); row-gap: var(--space-2); align-items: start; padding: var(--space-3) 0; }
/* Слова строки — одним столбцом во всю её ширину, как у строк-опор (ch-ev__text): имя без пробелов рвётся у края, а не выталкивает
   страницу вбок на телефоне. Факты — ch-facts: целым куском, пока помещаются в строку; факт длиннее строки (длинный номер версии
   Android) переносится внутри себя, и строка всё так же не начинается с точки */
.co-app__text { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-1); min-width: 0; overflow-wrap: anywhere; }
.co-app__name { font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.co-app__state { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); text-wrap: pretty; }
.co-apps .ch-actions > .ch-btn { margin-block: calc((var(--leading-ui) - var(--control)) / 2); }
/* Одна кнопка в ряду — с рамкой (Stop watching, Watch again); тихая — только вторая, Not relevant рядом с Watch: её слово
   кончается у края строки, как текст над ним, поле кнопки выходит за край */
.co-apps .ch-actions > .ch-btn--quiet:last-child { margin-inline-end: calc(var(--space-3) * -1); }
.co-apps > li.is-gone :is(.co-app__name, .co-app__state, .ch-meta) { color: var(--ink-gone); }
@container (max-width: 35rem) {
  .co-apps > li { grid-template-columns: minmax(0, 1fr); }
  .co-apps .ch-actions > .ch-btn { margin-block: 0; }
  .co-apps .ch-actions > .ch-btn--quiet:last-child { margin-inline-end: 0; }
}

/* ── Компания → Companies in registries (продукт: ADR-0107). Строка компании и строка вопроса — та же строка, что у приложения
      (co-apps): имя, что с компанией сейчас, как Скаут её связал, факты мелко, действие в конце строки имени. Имя — ссылка наружу
      на страницу реестра (ch-url); перемена-находка — ссылкой на находку, чернилами. История
      подач раскрывается таблицей под фактами; на телефоне «Declared» уходит второй строкой под перемену. Меню строки «···» —
      на строке имени и на телефоне: одна иконка под словами читалась бы подписью. Компания, которой кабинет сказал «нет», и
      закрытая в реестре стоят на месте тихими, ссылки — тоже ── */
.co-company__more { grid-column: 1 / -1; display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-1); margin-top: calc(var(--space-1) * -1); }
.co-company__more > p { margin: 0; justify-self: start; }
.co-app__state > a { color: var(--ink); text-decoration: none; }
.co-app__state > a:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.co-apps > li.is-gone :is(.ch-url, .ch-url .ch-icon, .co-app__state > a) { color: var(--ink-gone); }
.co-apps .ch-actions > .ch-pop > .ch-btn { margin-block: calc((var(--leading-ui) - var(--control)) / 2); }
.co-history { display: grid; gap: var(--space-2); margin-top: var(--space-1); overflow-wrap: normal; }
:is(.co-history, .co-funding tbody th) a { color: var(--ink); text-decoration: none; }
:is(.co-history, .co-funding tbody th) a:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.co-history__sub { display: none; }
@container (max-width: 35rem) {
  .co-companies > li:has(> .ch-actions > .ch-pop) { grid-template-columns: minmax(0, 1fr) auto; }
  .co-history .co-history__filed { display: none; }
  .co-history__sub { display: block; }
}
/* Окно Add a company: реестр — поле короче названия, оба растут в строке; узко — одно под другим, как поля Add competitors */
.co-find { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-1); }
.co-find .co-find__registry { flex: 1 1 10rem; }
.co-find .ch-field:not(.co-find__registry) { flex: 3 1 15rem; }

/* ── Overview — дашборд конкурента (владелец, 2026-11-04). Ряд чисел с дверями — ch-kpis ch-kpis--fit и ch-kpis__go, сводка —
      fp-details--glance, ряды значений — ch-values, имена со значком и флагом — ch-named, ch-flag (система 0.42.0). Здесь — только
      место сводки на странице: раздел At a glance — во всю ширину колонки, а не мерой текста, как прочие разделы стопки ── */
.co-stack > .co-glance { max-width: none; }
/* Инструменты: имя переносится только между словами («Google Tag | Manager»), слово — целым (StackAdapt, Cloudflare). break-word, в
   отличие от anywhere у ch-table__site, не сжимает наименьшую ширину столбца: столбец не уже самого длинного слова со значком.
   Чтобы три столбца с «by Nov 6» встали в телефон 390 при S и M, вид инструмента переносится между словами («Visitor |
   identification»), а не держит строку, как короткие факты досье. Таблица, которой и так мало места (320; L при 390), листается
   в своей рамке ch-table-wrap, страница вбок не едет */
.co-tools .ch-table__site > :not(.ch-tile) { overflow-wrap: break-word; }
.co-panel .co-tools td.co-muted { white-space: normal; }

/* Шапка: имя без пробелов не толкает страницу вбок — сжимается и рвётся у края, значок — на первой строке */
.fp__top > .co-title { display: flex; align-items: flex-start; min-width: 0; }
.co-title > span { min-width: 0; overflow-wrap: anywhere; }
/* Сайт конкурента — знак ↗ сразу за именем (владелец, 2026-11-05: кнопки сайта нет): тихая ссылка-иконка 24 × 24 на строке
   заголовка, знак 14 в ink-muted, под указателем wash и ink; имя для читалки — «Open deel.com», подсказка — домен */
.co-title .co-title__site {
  flex: none; display: inline-grid; place-items: center; width: 1.5rem; height: 1.5rem;
  margin: calc((var(--leading-title) - 1.5rem) / 2) 0 0 calc(var(--space-1) - var(--space-3));
  border-radius: var(--radius-sm); color: var(--ink-muted);
}
.co-title .co-title__site .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }
.co-title .co-title__site:hover { background: var(--wash); color: var(--ink); }
.co-title .ch-tile { flex: none; margin-top: calc((var(--leading-title) - 1.5rem) / 2); }

/* Apps таблицей: имя — 500 чернилами, состояние словом за ним, причина — за «i» */
.co-apps-table .co-app__name { margin-right: var(--space-2); }
.co-apps-table .ch-failing { margin-right: var(--space-1); }
.co-apps-table tr.is-gone :is(td, .co-app__name) { color: var(--ink-gone); }
.co-apps-table tr.is-gone .ch-tile { opacity: .5; }

/* ── Компания → Partner programs (CHI-1618): через кого конкурент получает клиентов. Подраздел — группа страниц партнёров или
      программы по типам: заголовок 15/24 с одним «i», 32 над подразделом и 8 до того, что он ведёт (RULES → Space and layout,
      fp-page); строки — сводкой (fp-details--glance), список партнёров раскрывается под ней таблицей системы. Общие партнёры —
      ряд значений: фавикон сайта, имя и счёт одной ссылкой. Цвет — только фавиконы и акцент у ссылок ── */
.co-pp { gap: var(--space-2); }
.co-pp-section > .co-pp, .co-pp-section > .fp-details + .co-pp { margin-top: calc(var(--space-8) - var(--space-3)); }
.co-pp-section > .ch-heading + .co-pp { margin-top: 0; }
.co-pp > .ch-heading > h3 { font: 500 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); }
.co-pp > .ch-heading > .ch-info { margin: calc((var(--leading-body) - var(--leading-ui)) / 2) 0 0 var(--space-1); }
.fp-details .co-pp__with { display: inline-flex; align-items: center; white-space: nowrap; gap: var(--space-2); }
.co-pp__with > .ch-tile { flex: none; }
.co-pp__list { display: grid; gap: var(--space-3); margin-top: var(--space-3); }
.co-pp__tools { margin-bottom: 0; }
.co-pp__download { margin-left: auto; }
.co-pp__table tbody th { font-weight: 400; }
.co-pp__programs td q, .co-pp__programs td { white-space: normal; }
/* Телефон: столбец «Also with» уходит — общие партнёры видны выше, в сводке, и по ссылке на сайт */
@container (max-width: 35rem) {
  .co-pp__table .co-pp__also { display: none; }
  .co-pp__download { margin-left: 0; }
}
/* «i» в шапке столбца — высотой строки меты: шапка не растёт */
.co-pp .ch-table thead .ch-info { height: var(--leading-meta); }

/* ── Профили на площадках (ADR-0113 продукта): вид — системы (0.49.0). Профиль один на строке переносится под имя (ch-profile в
      fp-glance__values и в ячейке ch-table), «only you» и причина за «i» — строкой под ним (ch-profile-item, ch-profile-item__note),
      «Only you ⓘ» в таблице — ch-table__words со знаком одной строкой, форма Add profile — ch-fields ch-fields--one. Своих правил
      у раздела нет ── */

/* Funding на Company (владелец, 2026-11-05): ряд чисел и столбцы по раундам — во всю ширину раздела; сумма над столбцом и раунд
   под осью — чернилами, год и деления шкалы — ink-muted, как у всех графиков. Столбцы — на бумаге
   без подложки, на своём месте страницы (владелец, 2026-11-08): своего заголовка у картинки нет, «Funding» ведёт раздел —
   числа, столбцы и таблицу; ширину рисунка скрипт берёт у фигуры (clientWidth), сетка — волоском line */
.co-rounds__plot { min-height: 13.25rem; }
.co-rounds .ch-chart__svg text.co-rounds__value { fill: var(--ink); }

/* Оценка в App Store (CHI-1615): «4.7 · 12,400 ratings» чернилами — значение, без звёзд и цвета; две части переносятся целыми,
   точка остаётся с первой, число и слово — вместе */
.co-rating > span { white-space: nowrap; }

/* ═══ signin.css ═══ */
/* Вход: слева — холст с тем, что даёт Химера, справа — форма на бумаге. Та же пара, что рейка | документ в приложении.
   Поля, кнопки, баннер — общие из components.css; здесь — раскладка и строка пароля */

html:has(.si), html:has(.si) body { height: auto; min-height: 100%; }
html:has(.si) body { background: var(--paper); }
.si { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); min-height: 100vh; }

/* ── Слева: знак, обещание и пример утра, внизу — что делает агент ── */
.si__brand {
  display: flex; flex-direction: column; justify-content: space-between; gap: var(--space-12);
  padding: var(--space-8) clamp(var(--space-8), 5vw, var(--space-18)) var(--space-12); background: var(--canvas); border-right: var(--hairline) solid var(--line);
}
.si__logo { align-self: flex-start; display: inline-flex; align-items: center; gap: var(--space-3); color: var(--ink); text-decoration: none; font: 500 var(--text-body)/var(--leading-body) var(--font-ui); }
.si__logo .ch-icon { width: var(--rail-logo); height: var(--rail-logo); }
.si__pitch { display: grid; gap: var(--space-8); max-width: 30rem; }
.si__tagline { margin: 0; font: 500 var(--text-title)/var(--leading-title) var(--font-ui); letter-spacing: -0.01em; color: var(--ink); }
.si__sample { display: grid; gap: var(--space-3); margin: 0; }
.si__sample .ch-meta b { font-weight: 500; color: var(--ink); }
.si__beliefs { margin-top: var(--space-2); }
.si__beliefs > li { display: grid; grid-template-columns: 0.75rem minmax(0, 1fr) auto; column-gap: var(--space-3); align-items: center; padding: var(--space-3) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.si__about { margin: 0; max-width: 26.25rem; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }

/* ── Справа: форма по центру, шириной в одну колонку полей; под ней, у нижнего края, — политика конфиденциальности ── */
.si__main { display: grid; grid-template-rows: minmax(0, 1fr) auto; row-gap: var(--space-8); place-items: center; padding: var(--space-12) var(--page-pad); }
.si__panel { width: min(100%, 22.5rem); display: grid; gap: var(--space-6); }
.si__head { display: grid; gap: var(--space-2); }
.si__head .ch-title:focus { outline: none; }
.si__lead { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.si__lead b { font-weight: 500; color: var(--ink); }
.si__back { justify-self: start; }
.si__back .ch-icon { width: var(--icon-sm); height: var(--icon-sm); }
.si__form { display: grid; gap: var(--space-4); }
.si__submit { width: 100%; margin-top: var(--space-2); }

/* Подпись пароля и «Forgot password?» — в одну строку */
.si__label-row { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-4); }
.si__label-row .ch-link { font-size: var(--text-label); line-height: var(--leading-label); }
/* «Show» внутри поля пароля — тихой кнопкой в рамке поля (ch-affix): «Показать» и «Скрыть» не ложатся на пароль */

.si__or { display: flex; align-items: center; gap: var(--space-3); font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }
.si__or::before, .si__or::after { content: ""; flex: 1; height: var(--hairline); background: var(--line); }
.si__google { width: 100%; }
.si__google svg { width: 1.125rem; height: 1.125rem; flex: none; }
.si__foot { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.si__foot .ch-link { display: inline; white-space: nowrap; }
/* Политика — у нижнего края страницы, с левым краем панели: под каждым видом входа одна и та же */
.si__legal { width: min(100%, 22.5rem); margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }

/* Узко: холст — полосой сверху со знаком и обещанием, форма — под ней; полоса по содержимому, остаток экрана — форме */
@media (max-width: 840px) {
  .si { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto 1fr; }
  .si__brand { gap: var(--space-6); padding-bottom: var(--space-8); border-right: 0; border-bottom: var(--hairline) solid var(--line); }
  .si__sample, .si__about { display: none; }
  .si__main { place-items: start center; padding-top: var(--space-8); }
}

/* ═══ scout.css ═══ */
/* Страница агента: Скаут и Media Buyer. Каркас документа — из finding.css: шапка с действием и метой, две колонки 11 : 10,
   разделы 18/28, подробности. Числа, баннер и пустота — общие.
   Здесь — что агенту можно: область, что он в ней делает и его уровень словом */

/* Область: имя и что агент делает — слева, уровень — справа словом, под ним что он значит; строки в ch-list */
.sc-areas > li { display: grid; grid-template-columns: minmax(0, 1fr) max-content; column-gap: var(--space-8); row-gap: var(--space-3); padding: var(--space-4) 0; }
.sc-area { display: grid; gap: var(--space-1); min-width: 0; }
.sc-area > h3 { margin: 0; font: 500 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); }
.sc-area > p { margin: 0; max-width: var(--measure); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); text-wrap: pretty; }
/* Уровень — слово чернилами, как статус убеждения: без рамки и заливки, чтобы не походить на кнопку */
.sc-level { display: grid; justify-items: end; align-content: start; gap: var(--space-1); margin: 0; padding-top: calc((var(--leading-body) - var(--leading-ui)) / 2); text-align: right; }
.sc-level > b { font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }

/* Что держит уровень и где исполняются изменения — короткие пары под описанием области */
.sc-facts { margin: var(--space-2) 0 0; max-width: var(--measure); }
.sc-facts > div { display: grid; grid-template-columns: minmax(7.5rem, 40%) minmax(0, 1fr); column-gap: var(--space-4); padding: var(--space-2) 0; border-top: var(--hairline) solid var(--line); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }
.sc-facts dt { color: var(--ink-muted); }
.sc-facts dd { display: grid; gap: var(--space-1); margin: 0; color: var(--ink); }
/* Пояснение к значению — тише него, тем же размером */
.sc-facts__note { color: var(--ink-muted); }

/* Закрытый раздел: только пустота, без колонок */
.sc-closed { padding-top: var(--space-4); }

/* Узко: уровень — под описанием, слева */
@container (max-width: 35rem) {
  .sc-areas > li { grid-template-columns: minmax(0, 1fr); }
  .sc-level { justify-items: start; text-align: left; padding-top: 0; grid-auto-flow: column; justify-content: start; align-items: baseline; gap: var(--space-2); }
}

/* ═══ usage.css ═══ */
/* Расходы. Каркас документа — из finding.css: шапка, две колонки 11 : 10, разделы 18/28. Числа, таблица (вторая строка, тире),
   полосы, графики, баннер и модалка с формой — общие. Здесь — строка лимита, удержанная кнопка, столбцы по дням и заготовка загрузки */

/* Лимит: подпись, под ней измеритель (ch-meter, CHI-1730) — сумма против потолка, «$124.50 / $150.00» чернилами, без цвета
   тревоги: что будет у лимита, говорят слова */
.us-limit { display: grid; gap: var(--space-2); }
.us-limit__row { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.us-limit__line { margin: var(--space-1) 0 0; max-width: var(--measure); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
/* «Ask for more» и причина рядом, пока запрос у команды: кнопка удержана, слова говорят почему */
.us-ask-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-4); margin-top: var(--space-2); }
.us-ask-row__why { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }

/* Подпись под графиком — что учитывается */
.us-foot { margin: 0; }

/* Заготовка загрузки (ch-skeletons): на месте графика — одна полоса его высоты */
.us-skel__chart { height: 10.75rem; }

/* Из чего общая сумма — ИИ Скаута и проверки видимости, двумя фактами метой (ch-facts): под полосой лимита или под числами без лимита */
.us-kpis { display: grid; gap: var(--space-2); }

/* Проверки видимости: ссылки пояснения (fp-note) — общим правилом ссылок в прозе интерфейса; имя ассистента не сжимается до слова */
.us-vis tbody th { min-width: 9rem; }

/* ═══ settings.css ═══ */
/* Настройки — документ разделами (fp--sections, каркас из finding.css): шапка с заголовком, под её линией — список разделов
   (ch-sections) и выбранный раздел (fp__main). Строка настройки, выбор словами, поле с поиском, переключатель, баннер и пустота —
   общие (ch-setting, ch-segmented, ch-combobox, ch-switch, ch-banner, ch-empty). Здесь — подзаголовок шапки, шаг внутри раздела,
   форма продукта и заготовка загрузки */

/* Подзаголовок шапки — что это за страница, одной строкой тише заголовка */
.st-lead { margin: 0; max-width: var(--measure); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }

/* Раздел: имя, кто это (у агента — мета), что раздел делает; первая строка настроек — сразу под описанием */
.st .fp__main > .fp-section { gap: var(--space-2); }
.st .fp__main > .fp-section > h2 + .ch-meta { margin-top: calc(var(--space-1) * -1); }
/* Строка настройки: под описанием — факты строки (у кого есть канал, расход за 30 дней) */
.st-facts { margin: 0; }

/* Форма продукта: поля одно под другим, Save — под последним */
.st-form { display: grid; gap: var(--space-4); }
.st-form > .ch-actions { margin-top: var(--space-2); }
.st-form .ch-textarea { min-height: 4.5rem; }

/* Account: политика конфиденциальности — 32 под формой (8 даёт шаг раздела) */
.st-legal { margin: calc(var(--space-8) - var(--space-2)) 0 0; }

/* Заготовка, пока настройки в пути (ch-skeletons): строки настроек — полосами с линией под каждой */
.st-skel__row { display: grid; gap: var(--space-2); padding-block: var(--space-3); border-bottom: var(--hairline) solid var(--line); }

/* ═══ question.css ═══ */
/* Вопрос к делу. Каркас документа — из finding.css: крошки, заголовок с действиями, мета, две колонки 11 : 10, разделы 18/28.
   Реплики, событие, статус агента, находки-опоры и пустота — общие (ch-user, ch-event, ch-agent-status, ch-ev, ch-empty).
   Здесь — ритм разговора, ответ Скаута подписью и голосом, строка убеждения справа */

/* Разговор: между репликами — воздух, как между ходами дайджеста; находки под ответом — сразу под его словами */
.qn-thread { display: grid; gap: var(--space-8); max-width: var(--measure); }
.qn-turn { display: grid; gap: var(--space-2); }
.qn-turn > .ch-ev { margin-top: var(--space-2); }
.qn-turn > .ch-link { justify-self: start; margin-top: var(--space-1); }
/* Ответ Скаута — подпись «Scout · answered: not yet» над его голосом, без плитки: в разговоре автора называет подпись */
.qn-turn > .ch-plate__by .ch-meta { font-weight: 400; }
/* Строка ожидания — на месте будущего ответа */
.qn-wait { margin: 0; }

/* Справа: убеждение, которое Скаут держит по вопросу, — строкой, как убеждения дела */
.qn-beliefs > li > a { display: grid; grid-template-columns: 0.75rem minmax(0, 1fr); column-gap: var(--space-3); row-gap: var(--space-1); padding: var(--space-3) 0; color: var(--ink); text-decoration: none; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); }
.qn-beliefs .ch-mark { margin-top: calc((var(--leading-ui) - 0.75rem) / 2); }
.qn-beliefs .ch-meta { grid-column: 2; }
.qn-beliefs > li > a:hover > span:nth-child(2) { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }

/* Заготовка загрузки (ch-skeletons): реплики — в строку чтения, между ними воздух */
.qn-skel { max-width: var(--measure); }
.qn-skel + .qn-skel { margin-top: var(--space-6); }

/* ═══ not-found.css ═══ */
/* Страницы нет или она не загрузилась (not-found.html, error.html). Каркас документа — из finding.css: шапка с крошками и заголовком.
   Под шапкой — общая пустота: одна фраза и действие, которое ведёт туда, где искать, или пробует ещё раз */

.nf__empty { padding-top: var(--space-8); }

/* ═══ onboarding.css ═══ */
/* Первый запуск: рейка | разговор на холсте, как первый контакт и знакомство (screens.css), но своими классами onb-*:
   приветствие по центру экрана, дальше лента реплик в колонку чтения. Реплики, поле ввода, флажки, поля, выбор и баннер — общие */

html:has(.onb), html:has(.onb) body { min-height: 100%; }
/* Липкое поле ответа после запуска не закрывает последнюю реплику; до запуска поля внизу нет — и места под него нет */
html:has(.onb__ask:not([hidden])) { scroll-padding-bottom: calc(var(--composer) + var(--leading-meta) + var(--space-12)); }
.onb { flex: 1; min-width: 0; display: flex; flex-direction: column; }

/* Приветствие: колонка по центру экрана, чуть выше середины */
.onb__intro { flex: 1; display: grid; place-items: center; padding: var(--space-12) var(--space-8); }
.onb__intro-col { width: min(100%, var(--measure)); display: grid; gap: var(--space-8); margin-top: -6vh; }

/* Разговор: колонка чтения по центру холста; между ходами — space-8, внутри хода — space-4 */
.onb__thread { flex: 1; width: min(100% - 2 * var(--space-8), var(--measure)); margin-inline: auto; padding-block: var(--space-12) var(--space-12); display: grid; align-content: start; gap: var(--space-8); }
.onb-turn { display: grid; gap: var(--space-4); }
.onb-turn > .ch-actions { margin-top: var(--space-2); }
.onb-turn .ch-agent-status { margin: 0; }

/* Имя продукта: ссылка «Rename» открывает поле на месте строки */
.onb-name { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-3); margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.onb-name b { font-weight: 500; color: var(--ink); }

/* Предложенные конкуренты — строками с флажком: имя и домен, ниже — почему, голосом Химеры, мельче имени.
   Флажок и рамка — общие (ch-check); строка выше обычной: текст в две строки, без подложки при наведении */
.onb-cands { margin: 0; }
.onb-cand.ch-check {
  display: grid; grid-template-columns: 1rem 1.125rem minmax(0, 1fr); column-gap: var(--space-3); row-gap: var(--space-1); align-items: start;
  min-height: 0; padding: var(--space-3) 0; border-radius: 0; white-space: normal;
}
.onb-cand.ch-check:hover { background: none; }
.onb-cand .ch-check__box { margin-top: calc((var(--leading-ui) - 1rem) / 2); }
.onb-cand .ch-tile { margin-top: calc((var(--leading-ui) - 1.125rem) / 2); }
.onb-cand__head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--space-2); min-width: 0; }
.onb-cand__name { font-weight: 500; color: var(--ink); overflow-wrap: anywhere; }
.onb-cand__why { grid-column: 3; margin: 0; max-width: var(--measure); font: 400 var(--text-voice-sm)/var(--leading-voice-sm) var(--font-voice); color: var(--ink-muted); text-wrap: pretty; }
.onb-cand:has(input:disabled) { cursor: not-allowed; }
/* Выбор после запуска — история: отмеченные остаются отмеченными акцентом */
.onb-cand input:disabled:checked + .ch-check__box { border-color: var(--accent); color: var(--accent); }
.onb-cand:has(input:disabled:not(:checked)) > :not(.ch-check__box) { opacity: .5; }

/* Сколько выбрано и что это значит — строкой под списком */
.onb-summary { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); }
.onb-langs { display: flex; flex-wrap: wrap; gap: 0 var(--space-6); }

/* После запуска поле ответа Химере прилипает к низу, как на знакомстве */
.onb__ask { position: sticky; bottom: 0; z-index: 5; width: min(100% - 2 * var(--space-8), var(--measure)); margin-inline: auto; display: grid; gap: var(--space-2); padding: var(--space-4) 0 var(--space-6); background: var(--canvas); }

@media (max-width: 760px) {
  .onb__intro { padding: var(--space-8) var(--space-4); }
  .onb__thread, .onb__ask { width: min(100% - 2 * var(--space-4), var(--measure)); }
}

/* ═══ visibility.css ═══ */
/* Видимость — обзор, форма C «Каналы, с флагами» (владелец, 2026-11-04). Шапка — шапка документа (fp__head, fp__top: заголовок,
   период — его действие, волосяная линия), под ней вкладки раздела (ch-tabs ссылками), меты нет. Mellow в четырёх каналах — радио в ряд под своими ассистентами; ниже — бренды диапазонами
   (ch-bars--range) и сайты полосами (ch-bars), 3 : 2. Заголовок раздела с «i» (ch-heading, ch-info), метр до цифры (ch-meter),
   флаг (ch-flag) с кодом страны (ch-named), значки и полосы — общие. Здесь — своё: ячейка канала как выбор, колонки,
   строка брендов без ответов, список имён без цифр, подпись столбцов сайтов. Голоса агента нет: всё на странице — результат функции. Цвет — фавиконы,
   флаги и акцент у выбора и своего бренда и сайта */

/* ── Шапка — шапка документа (fp__head): период — действие у заголовка; вкладки под её линией, строки меты нет ── */
.vo .fp__top .ch-btn .ch-icon { flex: none; }

.vo-panel { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-12); padding-top: var(--space-8); }
.vo-section { align-content: start; gap: var(--space-4); min-width: 0; }

/* ── Каналы: два ассистента по две страны, в ряд из четырёх; имя ассистента — словами над своими двумя ячейками ── */
.vo-chs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--space-8); row-gap: var(--space-6); }
.vo-chgroup { display: grid; grid-template-rows: auto 1fr; gap: var(--space-3); min-width: 0; }
.vo-chgroup__head { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.vo-chgroup__cells { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); border-top: var(--hairline) solid var(--line); }
.vo-chgroup__cells > .vo-ch + .vo-ch { border-left: var(--hairline) solid var(--line); }
/* Первая ячейка группы: слова — на краю колонки (под именем ассистента), а коробка — со своим полем, вынесенным влево
   отрицательным полем: подложка и кольцо фокуса не касаются слов; линия акцента — по линии группы, не шире её */
.vo-chgroup__cells > .vo-ch:first-child { margin-left: calc(var(--space-4) * -1); }
.vo-chgroup__cells > .vo-ch:first-child[aria-checked="true"]::before { left: var(--space-4); }

/* Канал — выбор без рамки: под указателем подложка строки, выбранный — под линией акцента 2px на линии группы */
.vo-ch {
  position: relative; display: grid; gap: var(--space-2); align-content: start; min-width: 0; padding: var(--space-4);
  border: 0; border-radius: 0; background: none; text-align: left; font: inherit; color: var(--ink); cursor: pointer;
}
.vo-ch:hover { background: var(--hover-row); }
.vo-ch[aria-checked="true"]::before { content: ""; position: absolute; left: 0; right: 0; top: calc(var(--hairline) * -1); height: 0.125rem; background: var(--accent); }
.vo-ch:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.vo-ch__who { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.vo-ch__body { display: grid; gap: var(--space-1); align-content: start; min-width: 0; }
/* Цифра Mellow — размером заголовка документа, счёт под ней — ui; всё чернилами */
.vo-ch__fig { font: 500 var(--text-title)/var(--leading-title) var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.vo-ch__count, .vo-ch__line, .vo-ch__when { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums; }
/* Без цифры (пересчёт, выключен) и метр первой недели стоят на строке цифры: ячейки ряда одной высоты */
.vo-ch__line, .vo-ch__meter { display: flex; align-items: center; min-height: var(--leading-title); }
/* После смены модели — две цифры столбиком, у каждой её даты подписью над ней */
.vo-ch__part { display: grid; gap: 0; }
.vo-ch__part + .vo-ch__part { margin-top: var(--space-3); }

/* ── Колонки: брендов длинный список, сайтов короткий — 3 : 2, а не пополам с пустой четвертью ── */
.vo-cols { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: var(--space-12) var(--cols-gap); align-items: start; }
.vo-off { padding-block: 0; }

/* ── Бренды диапазонами на одной шкале, концы шкалы — под последней строкой. Обе фигуры — на своём месте страницы,
      на бумаге без подложки (владелец, 2026-11-08) ── */
.vo-brands, .vo-sites { margin: 0; gap: var(--space-2); }
.vo-brands { --bars-label: clamp(9.375rem, 32%, 13.75rem); --bars-value: var(--space-18); }
/* Длинное имя бренда переносится у края, как любая подпись полосы, но не режется и после второй строки: имя бренда — то, что
   считают; значок и «i» — на его первой строке (ch-bars__label) */
.vo-brands .ch-bars__label > .vo-name { min-width: 0; overflow-wrap: anywhere; }
/* Строка диапазона одной высотой и шкала под последней строкой — у системы (ch-bars--range, ch-bars__row--scale; с 2026-11-07) */
/* Части после смены модели: их даты подписью над строками части */
.vo-part { margin: var(--space-2) 0 0; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums; }
.vo-part:first-of-type { margin-top: 0; }
/* Бренды, которых не назвал ни один ответ: их значки в ряд и одна цифра для всех */
.vo-stack { display: flex; flex-wrap: wrap; gap: var(--space-1); }
.vo-never__v { font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); }
/* Ушедший бренд — тише: имя в ink-gone, значок вполсилы (как у ушедшей строки ch-row и таблицы) */
.vo-gone .ch-bars__label { color: var(--ink-gone); }
.vo-gone .ch-tile { opacity: .5; }
.vo-gone .ch-info { color: var(--ink-gone); }
.vo-gone .ch-info:is(:hover, [data-open]) { color: var(--ink); }

/* Первая неделя и пересчёт — цифр нет: бренды, которые считаются, — значок и имя, в колонки; ни полос, ни значений */
.vo-names { margin: 0; padding: 0; list-style: none; columns: 12.5rem; column-gap: var(--space-8); }
.vo-names > li { display: flex; align-items: flex-start; gap: var(--space-2); padding-block: var(--space-1); break-inside: avoid; font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); }
.vo-names > li > .ch-tile { flex: none; }
.vo-names > li > .vo-name { min-width: 0; overflow-wrap: anywhere; }
.vo-names > li > .ch-tile--you + .vo-name { font-weight: 500; }
.vo-names > li > .ch-info { flex: none; height: var(--leading-label); margin: 0 0 0 calc(var(--space-1) * -1); }

/* «i» в баннере — цветом его слов, на заливке тоном; подложка под указателем — бумагой, как у кнопки баннера */
.ch-banner .ch-info { color: inherit; }
.ch-banner .ch-info:is(:hover, [data-open]) { background: color-mix(in srgb, var(--paper) 14%, transparent); color: inherit; }

/* ── Сайты: подпись столбцов над счётом; mellow.io — последней строкой, отступом ── */
.vo-sites .ch-bars { --bars-label: clamp(9.375rem, 46%, 13.75rem); }
.vo-sites .ch-bars__row.vo-sites__you { margin-top: var(--space-2); }
.vo-colhead { display: flex; justify-content: space-between; gap: var(--space-3); font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }
.vo-more { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.vo-more b { font-weight: 500; }

/* Заготовка, пока обзор в пути (ch-skeletons): четыре канала в ряд высотой с ячейку */
.vo-skel { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-4); }
.vo-skel__ch { height: 6rem; }

/* ── Узкая колонка: колонки — одна под другой; уже 560 — ассистенты друг под другом, по две страны в ряд, цифра — размером
      заголовка раздела ── */
@container (max-width: 47.5rem) {
  .vo-cols { grid-template-columns: minmax(0, 1fr); }
}
@container (max-width: 35rem) {
  .vo-chs { grid-template-columns: minmax(0, 1fr); }
  .vo-ch { padding: var(--space-3); }
  .vo-chgroup__cells > .vo-ch:first-child { margin-left: calc(var(--space-3) * -1); }
  .vo-chgroup__cells > .vo-ch:first-child[aria-checked="true"]::before { left: var(--space-3); }
  .vo-ch__fig { font: 500 var(--text-heading)/var(--leading-heading) var(--font-ui); }
  .vo-ch__line, .vo-ch__meter { min-height: var(--leading-heading); }
  .vo-skel { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ═══ visibility-questions.css ═══ */
/* Вопросы видимости. Каркас — из findings.css (fd): липкая шапка — заголовок с периодом и «Add question» (fp__top, как у обзора),
   вкладки раздела, инструменты: тема, поиск, страна словами. Сводки справа нет: список во всю ширину, счёт — у его заголовка и у
   тем. Правила Legibility (DS 0.43.0): меты нет, предложений в хроме нет — пояснения за «i» (ch-info), имя и число — чернилами,
   бренд — своим значком. Форма A «таблица по темам» (владелец, 2026-11-05). Голоса агента нет; цвет — фавиконы и акцент */

.vl .fp__top .ch-btn .ch-icon { flex: none; }
.vl-body { padding-top: var(--space-8); }
/* Заголовок списка и подписи тем: слово и счёт — одним цветом, чернилами; счёт обычным весом */
.vl-heading { margin-bottom: var(--space-4); }
/* Число у заголовка списка — чернилами, как у заголовка раздела; число у группы строк — метой (ch-meta, RULES → Behaviour: группа строк; CHI-1730) */
.vl-n { font-weight: 400; color: var(--ink); font-variant-numeric: tabular-nums; }

/* Слова вопроса — до двух строк с многоточием; «i» — сразу после слов, на их последней строке */
.vl-q__titles { display: block; min-width: 0; }
.vl-q__title {
  min-width: 0; margin: 0; font: 400 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); text-decoration: none; text-wrap: pretty;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere;
}
.vl-q__titles:has(.ch-info) .vl-q__title { display: inline; -webkit-line-clamp: unset; }
.vl-q__titles .ch-info { height: var(--leading-body); }

/* ── A: таблица по темам, во всю ширину. Тема — свой tbody; вопрос — до двух строк; у ассистента два столбца: Mellow и кого
      назвали чаще всех (значок и счёт); «of 14» — один раз, у имени ассистента; в конце строки — «···» ── */
.vl-table { min-width: 42.5rem; }
.vl-table .vl-table__q { width: 52%; }
.vl-table .vl-table__act { width: calc(var(--control) + var(--space-2)); }
.vl-table thead .vl-table__as { padding-bottom: var(--space-1); --head-rule: var(--line); text-align: left; color: var(--ink); }
/* Над столбцами ассистента — его имя: имя пишется как пишется, не капителью подписей столбцов (ChatGPT, а не CHATGPT) */
.vl-table thead .vl-table__as { letter-spacing: normal; text-transform: none; }
.vl-table thead td { padding: 0; border-bottom: var(--hairline) solid transparent; background-image: linear-gradient(var(--ink), var(--ink)); background-position: bottom; background-size: 100% var(--hairline); background-repeat: no-repeat; }
.vl-of { margin-left: var(--space-1); font-weight: 400; color: var(--ink-muted); }
.vl-colhead { display: inline-flex; align-items: center; gap: var(--space-2); }
.vl-colhead > .ch-tile { flex: none; }
/* Конкурент — значком, имя в alt; счёт — сразу за ним */
.vl-lead { display: inline-flex; align-items: center; gap: var(--space-2); height: var(--leading-ui); vertical-align: top; font-variant-numeric: tabular-nums; }
.vl-lead > .ch-tile { flex: none; }
.vl-table .vl-q__title { -webkit-line-clamp: 2; font-size: var(--text-ui); line-height: var(--leading-ui); }
.vl-table .vl-q__titles .ch-info { height: var(--leading-ui); }
.vl-table tbody tr:not(.ch-table__group):hover .vl-q__title { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
.vl-table tbody tr:not(.ch-table__group) { cursor: pointer; }
.vl-table td { white-space: nowrap; }
/* Каждая тема — свой tbody: воздух над подписью группы — у каждой, не только у первой */
.vl-table tbody + tbody tr.ch-table__group > th { padding-top: var(--space-8); }
/* Между ассистентами — поле шире, чем между столбцами одного: два столбца читаются группой */
.vl-table :is(td.vl-you, th.vl-you, thead .vl-table__as) { padding-left: var(--space-8); }
.vl-table td.vl-table__menu { padding-block: 0; text-align: right; }
.vl-table td.vl-table__menu > .ch-pop { margin-right: calc(var(--space-2) * -1); }
.vl-table tr.is-gone :is(th, td, a) { color: var(--ink-gone); }

/* ── Форма вопроса: поля одно под другим; что вопрос называет — строкой под полем, сразу при вводе ── */
.vl-form { display: grid; gap: var(--space-4); }
.vl-countries { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); margin-inline: calc(var(--space-2) * -1); }
.vl-names { margin: 0; font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink); }


/* ═══ visibility-question.css ═══ */
/* Вопрос видимости. Каркас документа — из finding.css: крошки, заголовок с действиями (период — первым), две колонки 11 : 10,
   разделы, подробности справа; строки меты нет. Ячейки каналов (vo-ch*), подпись столбцов (vo-colhead), строка не названных
   (vo-never, vo-stack) и ушедший бренд (vo-gone) — из visibility.css, как на обзоре. Заголовок раздела с «i» (ch-heading),
   метр до диапазона (ch-meter), флаг с кодом (ch-named, ch-flag), полосы (ch-bars), чужой текст (ch-quote) —
   общие. Здесь — своё: колонки 3 : 2 с брендами выбранного канала под подробностями, строка автора ответа со значками брендов
   справа, запросы по строке, общее с API счётом. Голоса агента нет: Literata здесь не стоит — это слова ассистента, не Химеры */

.vq .fp__top .ch-btn .ch-icon { flex: none; }
/* Колонки — как на обзоре, 3 : 2 (vo-cols); правая растёт вместе с левой: в A под подробностями — бренды выбранного канала */
.vq .fp__cols.vo-cols { padding-top: var(--space-8); }
.vq .fp__side { gap: var(--space-12); }
/* «Correct question» и «···» — одной группой: на телефоне первым переносится период, «···» не уходит строкой одна */
.vq-acts { display: flex; flex-wrap: nowrap; align-items: center; gap: inherit; }
.vq-full { margin: 0; font: 400 var(--text-body)/var(--leading-body) var(--font-ui); color: var(--ink); overflow-wrap: anywhere; }
.vq-section { gap: var(--space-4); }
.vq-below { display: grid; gap: var(--space-12); }
.fp__main:has(> .vq-below) { gap: var(--space-12); }
.vq-line { margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }

/* Счёт под цифрой ячейки — одной строкой («1 of 14 answers» не переносится) */
.vq .vo-ch__count { white-space: nowrap; }

/* ── Бренды выбранного канала полосами, под подробностями; подпись столбцов над ними. Фигура — на своём месте страницы,
      как Sites на обзоре: на бумаге без подложки, по краям своей колонки (владелец, 2026-11-08) ── */
.vq-brands { margin: 0; display: grid; gap: var(--space-2); }
.vq-brands .ch-bars { --bars-label: clamp(9.375rem, 32%, 13.75rem); }

/* ── Ответ: строка автора — кто (ассистент или приложение, флаг и код) и когда слева, значки брендов, которых он назвал, справа ── */
.vq-who { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-2) var(--space-4); flex-wrap: wrap; }
.vq-who .ch-quote__who { align-items: center; }
.vq-who .ch-quote__who:empty { display: none; }
.vq-when { font-weight: 400; color: var(--ink-muted); font-variant-numeric: tabular-nums; }
.vq-names { display: flex; flex-wrap: wrap; gap: var(--space-1); }
/* Что искал — подпись строкой заметки и запросы, по одному в строку; ссылки — значком сайта и адресом (ch-quote__cites) */
.vq-searched ul { margin: var(--space-1) 0 0; padding: 0; list-style: none; display: grid; gap: var(--space-1); }
.ch-quote__cites li { display: flex; align-items: flex-start; gap: var(--space-2); min-width: 0; }
.ch-quote__cites li > .ch-tile { flex: none; margin-top: calc((var(--leading-ui) - var(--icon-sm)) / 2); width: var(--icon-sm); height: var(--icon-sm); }
.ch-quote__cites li > .ch-url { min-width: 0; }
/* Общее со своим API — два счёта «k of n» в ряд, подпись чернилами перед каждым */
.vq-overlap { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-8); margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.vq-overlap > div { display: flex; gap: var(--space-2); min-width: 0; }
.vq-overlap dd { margin: 0; font-weight: 500; font-variant-numeric: tabular-nums; white-space: nowrap; }
.vq-source { justify-self: start; }

/* ── Подробности: подпись и значение — одним цветом, чернилами; флаги и значки — в строку ── */
.vq-details dt { color: var(--ink); }
.vq-details dd { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); }


/* ═══ visibility-plan.css ═══ */
/* План замера видимости — настройки раздела, как Settings, и дом исходов прогонов. Каркас документа — из finding.css: шапка
   (заголовок и период, вкладки под ней, меты нет), разделы, число раздела (fp-figure). Заголовок раздела с одним «i»
   (ch-heading), строка настройки, выбор словами, поля с единицей, пары имя — значение (ch-kpis), путь к лимиту (ch-meter),
   полосы (ch-bars), легенда (ch-legend), таблица — общие. Здесь — прогоны на всю ширину над колонками, полоса на линии
   запланированного, колонки фактов прогонов, значки списка; колонки ниже — 3 : 2, как на Обзоре (vo-cols) */

.vp .fp__top .ch-btn .ch-icon { flex: none; }

/* ── Прогоны: на всю ширину страницы над колонками ── */
.vp-runs { padding-top: var(--space-8); }
.vp-runs[hidden] { display: none; }
.vp-section { display: grid; gap: var(--space-4); }

/* Группа на ассистента — имя словами чернилами, под ним строки стран. Строка — сетка ch-bars с колонками фактов после
   дорожки: подпись (флаг и код), полоса и «417 of 425», затем поиск, сбой, пропуск, упор — у каждой своя подпись серым сверху.
   Фигура — на своём месте страницы, на бумаге без подложки (владелец, 2026-11-08) */
.vp-runs__chart { --bars-label: clamp(3.5rem, 8%, 6rem); --vp-col: clamp(4.5rem, 9%, 7rem); display: grid; gap: var(--space-4); margin: 0; }
/* Значение «417 of 425» — шире счёта: ширина колонки значения ставится у самого списка (ch-bars ставит свою) */
.vp-runs__chart, .vp-runs__chart .ch-bars { --bars-value: calc(var(--space-18) + var(--space-4)); }
.vp-runs__chart .ch-bars__row { grid-template-columns: var(--bars-label) minmax(0, 1fr) repeat(var(--vp-cols, 4), var(--vp-col)); }
.vp-runs__group { display: grid; gap: var(--space-1); }
.vp-runs__who { margin: 0; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.vp-runs__chart .ch-bars__value { flex: none; width: var(--bars-value); margin-left: auto; text-align: right; }
.vp-runs__col { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
.vp-runs__colhead { min-height: 0; margin-bottom: calc(var(--space-2) * -1); }
.vp-runs__colhead .ch-bars__track { justify-content: flex-end; }
.vp-runs__colhead :is(.ch-bars__value, .vp-runs__col) { font: 400 var(--text-label)/var(--leading-label) var(--font-ui); color: var(--ink-muted); }
.vp-runs__colhead .ch-info { height: var(--leading-label); vertical-align: top; }
.vp-off { font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }

/* Полоса: линия длиной в запланированное, на ней ответы и отказы — по своим счетам (flex), с щелью фона; доля, в которой что-то
   есть, — не уже 2px; остаток (сбой и пропуск) — одна линия, без цвета серии */
.vp-run { position: relative; }
.vp-run::before { content: ''; position: absolute; inset: calc(50% - var(--hairline) / 2) 0 auto; height: var(--hairline); background: var(--line-control); }
.vp-run > i { position: relative; min-width: 0.125rem; border-radius: 0; }
.vp-run > i:first-child { border-radius: var(--radius-sm) 0 0 var(--radius-sm); }
.vp-run > i:last-of-type { border-radius: 0 var(--radius-sm) var(--radius-sm) 0; }
.vp-run > i:only-of-type { border-radius: var(--radius-sm); }
.vp-run__rest { display: block; min-width: 0; }

/* Легенда — своей строкой под полосами, последней в фигуре: знак, слово и итог чернилами;
   линия — запланированное */
.vp-legend { list-style: none; margin: 0; padding: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.vp-legend > li { display: flex; align-items: center; gap: var(--space-2); }
.vp-legend b { font-weight: 500; font-variant-numeric: tabular-nums; }
.vp-legend .vp-legend__line { width: 0.75rem; height: var(--hairline); border-radius: 0; background: var(--line-control); }

/* ── Колонки ниже прогонов: 3 : 2, как на Обзоре (vo-cols) ── */
@container (min-width: 52.5625rem) {
  .vp .fp__cols { grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); }
}

.vp-ink { color: var(--ink); }
.vp-value { font-variant-numeric: tabular-nums; }
.vp-countries { gap: var(--space-4); font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
/* Строка ассистента: ссылка на условия — словом перед переключателем */
.vp-assistant { gap: var(--space-6); }

/* Форма плана: выбор, оценка, лимиты, Save — сверху вниз на шаге 16 */
.vp-form { display: grid; gap: var(--space-4); }
.vp-form > .ch-actions { margin-top: var(--space-2); }
.vp-form > .ch-settings > .ch-setting:first-child { padding-top: var(--space-3); }
.vp-estimate { display: grid; gap: var(--space-3); }
.vp-estimate > .fp-figure { margin: 0; }

/* Справа: проверки — состояние словом, расход месяца метром до лимита */
.vp-spent { grid-template-columns: minmax(0, 1fr) minmax(0, 17.5rem); align-items: center; }
.vp-spent .ch-setting__control { min-width: 0; }
.vp .fp__side .fp-section { gap: var(--space-3); }

/* Имена: значки списка — плотной строкой, рядом их число чернилами; поправка — значок, имя, форма, дата, действие */
.vp-brands { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2) var(--space-3); margin: 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.vp-brands b { font-weight: 500; }
.vp-stack-tiles { display: flex; flex-wrap: wrap; gap: var(--space-1); }
.vp-fixes .ch-row { align-items: center; }
.vp-fixes .ch-row:has(> .ch-btn) { grid-template-columns: 1.125rem minmax(0, 1fr) auto auto; }
.vp-fixes .ch-row > .ch-tile { margin-top: 0; }
.vp-when { display: inline-flex; align-items: center; gap: var(--space-1); flex: none; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink-muted); white-space: nowrap; }
.vp-fixes .ch-row.is-gone .vp-when { color: var(--ink-gone); }
.vp-add { display: grid; gap: var(--space-3); margin-top: var(--space-4); }
.vp-add > .fp-sub { margin-bottom: calc(var(--space-1) * -1); }
.vp-scout__title { margin-top: var(--space-6); }

/* Заготовка, пока план в пути (ch-skeletons): строки полосами с линией под каждой */
.vp-skel__row { display: grid; gap: var(--space-2); padding-block: var(--space-3); border-bottom: var(--hairline) solid var(--line); }

/* Узко: факты прогонов уходят под полосу, каждый со своей подписью перед числом; пустые — не стоят; подписи колонок сверху уходят */
@media (max-width: 640px) {
  .vp-runs__chart .ch-bars__row { grid-template-columns: var(--bars-label) minmax(0, 1fr); row-gap: 0; }
  .vp-runs__chart .vp-runs__col { grid-column: 2; text-align: left; }
  .vp-runs__chart .vp-runs__col:empty { display: none; }
  /* подпись видна глазу, а читалке — пустая: имя столбца ей уже даёт скрытое слово в ячейке, второй раз оно не звучит */
  .vp-runs__chart li .vp-runs__col::before { content: attr(data-head) ' ' / ''; color: var(--ink); }
  .vp-runs__colhead .vp-runs__col { display: none; }
  .vp-spent { grid-template-columns: minmax(0, 1fr); }
}

/* ═══ visibility-app.css ═══ */
/* Сверка с приложениями, форма A «Таблица» (владелец, 2026-11-05: A). Каркас документа — из finding.css: шапка без меты, вкладки
   раздела, разделы; колонки — делёж Обзора, 3 : 2. Заголовок раздела с «i» (ch-heading, ch-info), метр (ch-meter), флаг с кодом
   страны (ch-named, ch-flag), таблица с группами строк, поля, радиокнопки и ошибка их группы (ChimeraUI.invalid у fieldset), поле
   файла (ch-file), поле с поиском, пустота — общие. Здесь — своё: итог по парам, таблица месяца со снятыми вопросами группами
   строк, свёрнутый месяц, метры месяца, радиокнопки в строку и пары полей. Сторона на узком — после текста (fp--main-first):
   ведёт итог, форма — за ним */

/* Колонки — делёж Обзора (vo-cols, 3 : 2): итог и снятые ответы шире, месяц и форма — уже; узко — одна под другой (fp__cols) */
.va .fp__cols { grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); }
@container (max-width: 52.5rem) {
  .va .fp__cols { grid-template-columns: minmax(0, 1fr); }
}

/* ── Итог: таблица пар по месяцам; у пары своя группа строк (tbody), общие бренды и сайты — «8 of 18» чернилами справа ── */
.va-table tbody th { white-space: nowrap; }
/* Подпись второй пары стоит с воздухом в 32, как подпись группы в середине таблицы */
.va-table tbody + tbody .ch-table__group > th { padding-top: var(--space-8); }

/* ── Снятые ответы по месяцам: заголовок месяца со счётом ответов, под ним таблица месяца; прошлый месяц свёрнут под кнопкой ── */
.va-month { display: grid; gap: var(--space-2); }
.va-month + .va-month { margin-top: var(--space-6); }
.va-month__head { display: flex; align-items: baseline; gap: var(--space-2); }
.va-month__n { font-weight: 400; color: var(--ink); font-variant-numeric: tabular-nums; }
.va-month__toggle { justify-self: start; }
/* Таблица месяца: столбец приложения одной ширины, так что «2 of 6» стоят столбцом, есть значок Mellow или нет. Снятый вопрос —
   группа строк: линия только между вопросами, строки приложений — без линий, плотно */
.va-caps { table-layout: fixed; }
.va-caps__app { width: clamp(6rem, 28%, 11rem); }
.va-caps__src { width: 6rem; }
.va-caps thead th { vertical-align: bottom; }
/* Подписи столбцов переносятся, а не режутся: на телефоне «Brands in common» встаёт в две строки над своими числами */
.ch-table:is(.va-caps, .va-table) thead th { white-space: normal; text-wrap: balance; overflow-wrap: normal; }
.va-caps tbody :is(th, td) { border-bottom: 0; padding-top: var(--space-1); padding-bottom: var(--space-1); vertical-align: baseline; }
.va-caps tbody tr:last-child > :is(th, td) { padding-bottom: var(--space-4); border-bottom: var(--hairline) solid var(--line); }
.va-caps tbody:last-child tr:last-child > :is(th, td) { border-bottom: 0; }
.va-caps .va-cap > th { padding-top: var(--space-4); padding-bottom: var(--space-2); font-weight: 400; text-align: left; white-space: normal; }
/* Слова вопроса — ссылка на его страницу: чернилами, подчёркивание при наведении, как заголовок-ссылка */
.va-answer__title { display: block; font: 500 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); text-decoration: none; text-wrap: pretty; overflow-wrap: anywhere; }
.va-answer__title:hover { text-decoration: underline; text-decoration-color: var(--line-control); text-underline-offset: 4px; }
/* Где и когда: страна флагом с кодом, день — серым после неё, «i» группы — последним */
.va-answer__by { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-3); margin: var(--space-1) 0 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.va-answer__by time { color: var(--ink-muted); }
.va-answer__by .ch-info { margin-left: calc(var(--space-2) * -1); align-self: center; }
.va-app { font-weight: 400; white-space: nowrap; }
.va-app > .ch-tile { display: inline-grid; vertical-align: top; width: var(--icon-sm); height: var(--icon-sm); margin: calc((var(--leading-ui) - var(--icon-sm)) / 2) 0 0 var(--space-2); }
.va-src { white-space: nowrap; }

/* ── Этот месяц: по приложению — имя и метр до 10 вопросов ── */
.va-done > li { display: grid; grid-template-columns: minmax(7rem, auto) minmax(0, 1fr); align-items: center; gap: var(--space-4); padding: var(--space-3) 0; font: 400 var(--text-ui)/var(--leading-ui) var(--font-ui); color: var(--ink); }
.va-done .ch-meter { max-width: none; }

/* Форма записи: поля сверху вниз на шаге 16; пары полей — в строку, где им хватает места */
.va-form { display: grid; gap: var(--space-4); }
.va-form > .ch-actions { margin-top: var(--space-2); }
.va-text { min-height: 9rem; }
/* Радиокнопки группы — в строку, переносятся рядами */
.va-radios { display: flex; flex-wrap: wrap; gap: 0 var(--space-6); }
/* Пара «день и время»: время — узкое поле рядом с днём */
.va-when > .ch-field:last-child { flex: 0 1 10.5rem; }
.va-when > .ch-field:first-child { flex: 1 1 12.5rem; }
/* Ссылка — последним столбцом, по правому краю таблицы: поля справа у неё нет */
:is(.va-caps, .va-table) :is(th, td):last-child { padding-right: 0; }

/* ═══ size.css ═══ */
/* Interface size S · M · L — the person's choice, kept per browser (cookie `chimera-size` in the product).
   Sources are written in px, the sizes at S; the build writes dist/ in rem, so one number on <html> grows
   type, spacing, controls, rows and the page's caps together. S has no attribute. Lines, corners and the
   window's media queries stay in px. Prototype pages load the px sources, where this file has no effect. */
html[data-size="m"] { font-size: 106.25%; } /* 17px */
html[data-size="l"] { font-size: 112.5%; }  /* 18px */

/* A change of size is one picture (the product's size setting): while html[data-size-change] is on, the page's picture
   grows about the switch that was pressed (--size-change-origin) by --size-change-scale, the root's size after over
   before; the rail and the narrow top bar pass as themselves, so the zoom does not throw them off the window's edge, and
   the rail's foot apart from the rail, since it is kept at the window's bottom while the rest of the rail hangs from its top.
   Nothing transitions on its own meanwhile, so the page the script measures is the one it ends in. */
html[data-size-change], html[data-size-change] *, html[data-size-change] *::before, html[data-size-change] *::after { transition: none !important; }
html[data-size-change]::view-transition-group(root),
html[data-size-change]::view-transition-image-pair(root),
html[data-size-change]::view-transition-old(root),
html[data-size-change]::view-transition-new(root) { animation-duration: var(--dur-size); animation-timing-function: var(--ease); }
html[data-size-change]::view-transition-image-pair(root) { animation-name: ch-size-change; transform-origin: var(--size-change-origin, 50% 0); }
html[data-size-change]::view-transition-new(root) { transform: scale(calc(1 / var(--size-change-scale, 1))); transform-origin: var(--size-change-origin, 50% 0); }
@keyframes ch-size-change { to { transform: scale(var(--size-change-scale, 1)); } }
html[data-size-change] .ch-rail { view-transition-name: ch-rail; }
/* the foot's box reaches the rail's edge, where the current item's bar stands, so its picture holds the bar; what is in it stays put */
html[data-size-change] .ch-rail__foot {
  view-transition-name: ch-rail-foot;
  margin-left: calc((var(--rail) - var(--rail-item)) / -2); padding-left: calc((var(--rail) - var(--rail-item)) / 2);
}
html[data-size-change] .ch-topbar { view-transition-name: ch-topbar; }
html[data-size-change]::view-transition-group(ch-rail),
html[data-size-change]::view-transition-image-pair(ch-rail),
html[data-size-change]::view-transition-old(ch-rail),
html[data-size-change]::view-transition-new(ch-rail),
html[data-size-change]::view-transition-group(ch-rail-foot),
html[data-size-change]::view-transition-image-pair(ch-rail-foot),
html[data-size-change]::view-transition-old(ch-rail-foot),
html[data-size-change]::view-transition-new(ch-rail-foot),
html[data-size-change]::view-transition-group(ch-topbar),
html[data-size-change]::view-transition-image-pair(ch-topbar),
html[data-size-change]::view-transition-old(ch-topbar),
html[data-size-change]::view-transition-new(ch-topbar) { animation-duration: var(--dur-size); animation-timing-function: var(--ease); }
/* Only the new picture grows: it stands alone from the first frame, drawn plainly over the old one, and the old one is gone
   within --dur-size-out. Below the width of --page the page at L is not the page at S made larger (its columns are shares
   of the frame and its lines wrap anew; at 1024 the two columns become one), so a cross-fade drew two copies of every
   heading and line, up to 150px apart at 1440. The old picture shows only where the new one has not yet grown over the
   window (S → L), and only at first. */
html[data-size-change]::view-transition-old(root),
html[data-size-change]::view-transition-old(ch-rail),
html[data-size-change]::view-transition-old(ch-rail-foot),
html[data-size-change]::view-transition-old(ch-topbar) { animation-name: ch-size-out; animation-duration: var(--dur-size-out); mix-blend-mode: normal; }
html[data-size-change]::view-transition-new(root),
html[data-size-change]::view-transition-new(ch-rail),
html[data-size-change]::view-transition-new(ch-rail-foot),
html[data-size-change]::view-transition-new(ch-topbar) { animation-name: none; mix-blend-mode: normal; }
@keyframes ch-size-out { to { opacity: 0; } }
/* The rail's new picture grows from its top and is short of the window's bottom until it has grown (S → L); its column
   keeps the rail's colour meanwhile */
html[data-size-change]::view-transition-group(ch-rail) { background: var(--canvas); }
/* `:root`, not `html`: a `*` argument adds nothing to a selector's weight, and these must outrank the named rules above */
@media (prefers-reduced-motion: reduce) {
  :root[data-size-change]::view-transition-group(*),
  :root[data-size-change]::view-transition-image-pair(*),
  :root[data-size-change]::view-transition-old(*),
  :root[data-size-change]::view-transition-new(*) { animation: none; }
  :root[data-size-change]::view-transition-new(root) { transform: none; }
}
