/* Кегль на телефоне задаёт лист, а не Safari.
 *
 * iOS сам увеличивает текст блоков, если считает его мелким для ширины
 * («text autosizing»), и увеличивает НЕ ВСЁ: абзац раздувается, заголовок нет.
 * 2026-08-13 владелец прислал снимок статьи обучения, где абзац крупнее
 * собственного заголовка, — это не шрифт и не вёрстка, это чужое решение о
 * кегле поверх нашего. На десктопе не воспроизводится вовсе, поэтому и дожило
 * до прода.
 *
 * Стоит в общем листе, а не на одной странице: правило про телефон одинаково
 * для всего сайта, а вторая копия рядом со следующей статьёй разошлась бы с
 * этой молча. */
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}

/* Shared header/navigation component.
 *
 * These rules lived in assets/js/consent.css, which CLAUDE.md §2 reserves for the consent
 * dialog: "Do not add component styles to consent.css". Nav styling had accumulated there
 * because that file was already linked on every page, and the cost showed up the moment a
 * nav bug had to be found — it was the last place anyone looked.
 *
 * Moved verbatim, so specificity and source order are unchanged: this sheet is linked
 * immediately BEFORE consent.css on every page, exactly where the combined file used to
 * sit. tools/shared_runtime.py owns that link, so one writer keeps one version.
 *
 * The remaining !important flags are inherited, not endorsed. They fight the nav markup
 * still duplicated inline across ~280 pages; the fix for those is to own the markup, not
 * to escalate further here (§8).
 */
/* Корень документа. Без объявления на html всё, что не покрыто правилом,
   достаётся системному Times — так на четырёх страницах в измерении шрифтов
   всплывал третий шрифт, которого никто не задавал. */
html{font-family:'Space Grotesk', system-ui, sans-serif}
html:lang(ru){font-family:'Manrope', 'Space Grotesk', system-ui, sans-serif}
/* Браузер по умолчанию рисует code/pre/kbd моноширинным — это третий шрифт,
   которого никто не объявлял. Различие несёт не гарнитура, а фон и цвет. */
code,pre,kbd,samp,tt{font-family:inherit;font-variant-numeric:tabular-nums}
/* Поля и кнопки не наследуют шрифт документа — браузер даёт им системный.
   Флажок на доске TradFi так и приезжал Arial'ом. */
input,select,textarea,button{font-family:inherit}

/* ────────────────────────────────────────────────────────────────────────
   ШАПКА. Один стиль на весь сайт: тот, что стоит на главной.

   До 2026-08-06 каждая страница несла собственную копию правил `.ttn …` в теле
   документа, и общий лист шапку не оформлял вовсе. Копии снял
   tools/header_shell.py — оформление живёт здесь и только здесь.

   Набор тот же, что у шапки лендинга: моноширинный 10px, прописные, разряд
   .1em, тихий серый; зелёный появляется на наведении и у текущего языка. Ни
   пилюль, ни свечения, ни точек-разделителей: строка навигации должна давать
   ориентир, а не соревноваться за внимание с содержанием страницы.
   ──────────────────────────────────────────────────────────────────────── */
.nav{display:flex;align-items:center;flex-wrap:wrap;gap:8px 6px;
  min-height:66px;padding:0 clamp(20px,4vw,64px);
  border-bottom:1px solid rgba(232,236,233,.14)}
.nav>a{display:flex;align-items:center;gap:11px;margin-right:8px;
  color:#e8ece9;text-decoration:none}
.nav>a span{font-size:13px;font-weight:700;letter-spacing:0}
.nav>a video,.nav>a img{width:38px;height:38px;border-radius:0;
  object-fit:cover;display:block}
.ttn{margin-left:auto;display:flex;align-items:center;flex-wrap:wrap;gap:0;
  font-family:'Space Grotesk', system-ui, sans-serif;font-size:10px}
.ttn a.l{display:inline-flex;align-items:center;min-height:40px;padding:0 10px;
  color:#8a948c;text-decoration:none;letter-spacing:.1em;text-transform:uppercase;
  line-height:1;border-radius:0;transition:color .15s ease}
.ttn a.l:hover,.ttn a.l:focus-visible{color:#33ff66}
/* Иконка у каждого пункта и точка между пунктами — два ряда мелкой графики
   поверх ряда из восьми слов. Ни то, ни другое ничего не различает. */
.ttn a.l .ni{display:none}
/* Два исключения, оба по просьбе владельца: знак атома у раздела Algo
   (2026-08-11 сигма, 2026-08-12 атом) и звезда у Daily Read (2026-08-12).
   Правила идут ПОСЛЕ строки выше и весят столько же — значит, выигрывают
   порядком; знак несёт оба класса, `ni sig` или `ni star`, и порядок здесь и
   есть решение. Цвет листом, а не атрибутом SVG: атрибут не достаётся светлой
   теме, и на светлом фоне ярко-зелёный перестал бы читаться. */
.ttn a.l .sig{display:inline-flex;flex:0 0 auto;margin-right:6px;color:#33ff66}
/* Звезда пришла на место слова «popular». Зелёная, как и знак раздела Algo —
   правка владельца 2026-08-12: два знака ряда читаются как одна система, а
   разный цвет у соседних значков выглядел бы как разный смысл. */
.ttn a.l .star{display:inline-flex;flex:0 0 auto;margin-right:6px;color:#33ff66}
/* Монитор у Скринера (просьба владельца 2026-08-14). Жёлтый, а не зелёный:
   зелёные знаки помечают разделы деска, этот помечает живое табло — экран, на
   который смотрят сейчас. Правило стоит ПОСЛЕ `.ni{display:none}` и весит
   столько же: показывает его порядок, как и у двух соседей выше. */
.ttn a.l .mon{display:inline-flex;flex:0 0 auto;margin-right:6px;color:#ffce54}
/* Знак X у «Трендов Твиттера» (просьба владельца 2026-08-14). Цвета своего не
   имеет намеренно: он называет ИСТОЧНИК пункта, а не его состояние, поэтому
   наследует цвет подписи и зеленеет вместе с ней на наведении. Светлой теме
   считать тут нечего — наследованный цвет уже посчитан у подписи. */
.ttn a.l .xio{display:inline-flex;flex:0 0 auto;margin-right:6px;color:inherit}
.ttn .sep{display:none}
/* Раскрывающийся пункт помечается тем же уголком, что на главной. */
.ttn .l-dd>a.l:after{content:'';width:4px;height:4px;margin-left:7px;
  border-right:1px solid currentColor;border-bottom:1px solid currentColor;
  transform:translateY(-2px) rotate(45deg);opacity:.55}
/* «alpha» была зелёной пилюлей с пульсирующим свечением — единственный
   мигающий элемент страницы стоял в навигации. Пункт как пункт. */
.ttn .nt{color:#8a948c;background:transparent;padding:0 10px;font-weight:400;
  border-radius:0;animation:none}
.ttn .nt:hover{color:#33ff66}
/* Единственный внешний адрес в шапке — кнопка со знаком X, а не ещё один
   пункт меню. Владелец, 2026-08-07. */
/* Размер кнопок шапки — ОДНО число на всех, и живёт оно здесь.
   Переключатель темы объявлен в assets/js/lang.js и рисуется скриптом; пока
   размер стоял и там, и тут, кнопки разъехались на два пикселя. Скрипт читает
   эту переменную с запасным значением: лист может не догрузиться, кнопка
   обязана остаться кнопкой. */
/* Видимая коробка кнопки шапки и её ЦЕЛЬ — разные величины. Рисунок 34px
   утверждён владельцем 2026-08-09; §7 требует цель не меньше 40px на касании, и
   до 2026-08-10 `ui_check` держал по этому поводу 25 замечаний на пяти ширинах.
   Растить рисунок значило бы менять принятый вид, поэтому растёт только цель:
   сам элемент 40×40 и прозрачен, рамку рисует `::before` в 34×34 по центру.
   Палец попадает в 40, глаз видит 34. */
.nav{--tt-navbtn:34px;--tt-navhit:40px}

/* Кнопка X и переключатель темы — ОДНА кнопка в двух ролях: одна коробка, одна
   рамка, один приглушённый цвет, зелёный на наведении. Заливка у X была
   отдельным решением и оказалась ошибкой: рядом с обведённым переключателем
   она читалась как другой элемент, а не как соседняя кнопка. Владелец,
   2026-08-09.

   Селектор именно `a.l.xf`: соседнее правило `.ttn a.l` весит больше и
   перекрывало и цвет знака, и минимальную высоту. Чинится весом, не
   `!important`. */
.ttn a.l.xf{position:relative;display:inline-flex;align-items:center;
  justify-content:center;
  width:var(--tt-navhit,40px);height:var(--tt-navhit,40px);
  min-height:var(--tt-navhit,40px);padding:0;gap:0;
  color:#8a948c;background:transparent;border:0;
  transition:color .14s ease}
.ttn a.l.xf::before{content:"";position:absolute;left:50%;top:50%;
  width:var(--tt-navbtn,34px);height:var(--tt-navbtn,34px);
  transform:translate(-50%,-50%);
  border:1px solid rgba(232,236,233,.18);
  transition:border-color .14s ease}
.ttn a.l.xf .xg{position:relative;flex:0 0 auto}
.ttn a.l.xf:hover,.ttn a.l.xf:focus-visible{color:#33ff66;background:transparent}
.ttn a.l.xf:hover::before,.ttn a.l.xf:focus-visible::before{
  border-color:rgba(51,255,102,.45)}
/* Метка «popular» снята 2026-08-12: её работу делает звезда у подписи.
   Правило оставлено пустым намеренно — страница со старой разметкой может
   доехать до браузера раньше свипа, и лучше пусть метка будет невидимой, чем
   всплывёт неоформленным словом посреди ряда. */
.ttn .ttpop{display:none}
.ttn .l-menu{position:absolute;top:100%;left:0;z-index:70;min-width:210px;
  display:none;flex-direction:column;gap:0;padding:6px;margin-top:8px;
  background:#0e1512;border:1px solid rgba(232,236,233,.14);border-radius:0;
  box-shadow:0 24px 60px rgba(0,0,0,.5)}
/* Полоса пустоты между пунктом и списком закрывалась под курсором: указатель
   покидал пункт раньше, чем входил в список. Мостик держит его внутри. */
.ttn .l-menu:before{content:'';position:absolute;left:0;right:0;top:-10px;height:10px}
.ttn .l-menu a.l{display:flex;min-height:40px;padding:0 12px;color:#c2cec6;
  letter-spacing:.08em;text-transform:none;white-space:nowrap}
.ttn .l-menu a.l:hover{color:#33ff66;background:rgba(51,255,102,.06)}
.ttn .l-menu a.l.hl{color:#33ff66;font-weight:400;background:transparent}
.ttn .l-menu .mh{font-family:'Space Grotesk', system-ui, sans-serif;font-size:9px;
  letter-spacing:.12em;text-transform:uppercase;color:#5a635c;padding:8px 12px 4px}
.ttn .l-menu .msep{height:1px;background:rgba(232,236,233,.1);margin:5px 6px}
.ttn .l-menu .amark{color:#ffce54;font-size:11px;margin-left:4px;vertical-align:1px}
/* Переключатель языка — та же рамка, что на главной: текущий язык залит. */
/* Живая строка деска: та же, что в шапке главной — точка с пульсом и подпись. */
.ttlive{display:inline-flex;align-items:center;gap:7px;min-height:40px;padding:0 10px;
  color:#33ff66;font-family:'Space Grotesk', system-ui, sans-serif;font-size:10px;
  letter-spacing:.12em;text-transform:uppercase;white-space:nowrap}
.ttlive-dot{width:7px;height:7px;flex:0 0 7px;border-radius:50%;background:#33ff66;
  box-shadow:0 0 0 0 rgba(51,255,102,.55);animation:ttLivePulse 2.4s ease-out infinite}
@keyframes ttLivePulse{0%{box-shadow:0 0 0 0 rgba(51,255,102,.5)}
  70%{box-shadow:0 0 0 9px rgba(51,255,102,0)}100%{box-shadow:0 0 0 0 rgba(51,255,102,0)}}
@media(prefers-reduced-motion:reduce){.ttlive-dot{animation:none}}
@media(max-width:900px){.ttlive{display:none}}
/* Ссылка на дэшборд стоит на месте прежней живой строки (владелец
   2026-08-15). Вид — обычного пункта шапки; на телефоне она НЕ
   прячется, в отличие от снятой строки: строка ничего не открывала, а
   этот пункт ведёт туда, куда идут чаще всего. */
.ttn a.l.ttdash{white-space:nowrap}
.ttlang{display:flex;align-items:center;border:1px solid rgba(232,236,233,.14);
  border-radius:0;overflow:hidden;margin-left:8px}
.ttlang a,.ttlang .ttk{min-width:40px;justify-content:center;color:#8a948c;
  font-family:'Space Grotesk', system-ui, sans-serif;font-size:10px;
  letter-spacing:.1em;text-transform:uppercase;text-decoration:none;border:0}
.ttlang a[aria-current],.ttlang .ttk[aria-current]{background:#33ff66;color:#0a0c0a;
  font-weight:700}
@media(max-width:760px){
  .nav{padding-left:22px;padding-right:22px}
  /* Положение мобильного списка держит `assets/js/header.js` — он вписывает
     своё правило в документ и выигрывает у листа. Своя копия здесь была
     вторым владельцем одной строки: лист говорил «рядом с пунктом», скрипт —
     «во всю ширину под меню», и побеждал скрипт. Правило снято, чтобы у
     положения остался один владелец. */
}
@media(max-width:1040px){.ttn{gap:0}.ttn a.l{padding:0 7px}}
@media(max-width:760px){
  /* Телефонную раскладку держит assets/js/header.js: бургер, три видимых
     пункта и переключатель языка. Лист сюда не лезет — два владельца одной
     строки уже давали шапку, где меню закрыто и открыто одновременно. */
  .nav{flex-wrap:wrap;row-gap:10px;min-height:0;padding:14px 22px}
  .ttn{margin-left:0;justify-content:flex-start}
}
@media(max-width:380px){
  .nav{padding-left:12px;padding-right:12px}
  .ttn>.l,.ttn>.l-dd>a{padding-left:2px;padding-right:2px}
}
/* Пункт с выпадающим списком раскрывается по наведению и по фокусу. */
.ttn .l-dd{position:relative;display:inline-flex}
.ttn .l-dd:hover>.l-menu,.ttn .l-dd:focus-within>.l-menu,
.ttn .l-dd.open>.l-menu{display:flex}
/* У касания наведения нет: там меню открывает тап через header.js. */
@media(hover:none){
  .ttn .l-dd:hover>.l-menu{display:none}
  .ttn .l-dd.open>.l-menu{display:flex}
}

/* Dashboard status strip (assets/js/desk-state.js).
 * One row of readings above the widgets, so the page opens with a position
 * instead of a grid the reader has to assemble one themselves.  Cells are links:
 * the strip states the reading, the product page behind it shows the working.
 * Tone is never the only carrier — every cell prints its state as words too. */
.deskstate{margin:0 0 26px}
.deskstate .ds-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:1px;background:var(--tt-line,rgba(232,236,233,.14));border:1px solid var(--tt-line,rgba(232,236,233,.14));border-radius:0;overflow:hidden}
.deskstate .ds-cell{display:flex;flex-direction:column;gap:5px;min-width:0;padding:13px 14px;background:#000000;color:inherit}
.deskstate .ds-main{display:flex;flex-direction:column;gap:5px;min-width:0;color:inherit;text-decoration:none;transition:background 150ms ease}
.deskstate .ds-main:hover,.deskstate .ds-main:focus-visible{background:rgba(232,236,233,.045)}
.deskstate .ds-main:focus-visible{outline:none;box-shadow:inset 0 0 0 2px rgba(51,255,102,.5)}
.deskstate .ds-k{font-family:'Space Grotesk', system-ui, sans-serif;font-size:10px;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:#8a948c}
.deskstate .ds-help{display:inline-block;width:13px;height:13px;margin-left:4px;line-height:13px;text-align:center;font-size:9px;font-weight:700;letter-spacing:0;text-transform:none;color:#0a0c0a;background:#8a948c;border-radius:50%;vertical-align:middle}.deskstate .ds-help:hover,.deskstate .ds-help:focus-visible{background:#33ff66;outline:none}
.deskstate .ds-v{font-family:'Space Grotesk', system-ui, sans-serif;font-size:17px;font-weight:700;line-height:1.15;overflow-wrap:anywhere}
.deskstate .ds-s{font-family:'Space Grotesk', system-ui, sans-serif;font-size:11px;line-height:1.4;color:#8a948c;overflow-wrap:anywhere}
.deskstate .ds-up{color:#33ff66}
.deskstate .ds-dn{color:#ff7a7a}
.deskstate .ds-mid{color:#e8ece9}
.deskstate .ds-stale{margin-left:7px;padding:1px 5px;border:1px solid rgba(255,206,84,.5);border-radius:0;font-size:9px;font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:#ffce54;vertical-align:middle}
.deskstate .ds-foot{margin:9px 0 0;font-family:'Space Grotesk', system-ui, sans-serif;font-size:11px;line-height:1.5;color:#5a635c}
@media(max-width:900px){.deskstate .ds-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:560px){.deskstate .ds-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.deskstate .ds-v{font-size:15px}}

/* Screener desk highlights (assets/js/screener-highlights.js).
 * Sits above the boards: what the desk would look at, and what it threw out. */
.hl{margin:0 0 26px}
.hl .hl-h{font-family:'Space Grotesk',sans-serif;font-size:19px;color:#eafff0;margin:0 0 4px}
.hl .hl-gate{margin:0 0 14px;font-size:12.5px;line-height:1.55;color:#8a948c}
.hl .hl-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(224px,1fr));gap:10px}
.hl .hl-card{display:flex;flex-direction:column;gap:6px;min-width:0;padding:12px 13px;border:1px solid rgba(232,236,233,.12);border-radius:0;background:#000000}
.hl .hl-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.hl .hl-sym{font-family:'Space Grotesk', system-ui, sans-serif;font-size:15px;font-weight:700;color:#e8ece9}
.hl .hl-dir{font-family:'Space Grotesk', system-ui, sans-serif;font-size:9.5px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;padding:2px 6px;border-radius:0}
.hl .hl-long{color:#33ff66;border:1px solid rgba(51,255,102,.4)}
.hl .hl-short{color:#ff7a7a;border:1px solid rgba(255,122,122,.4)}
.hl .hl-name{font-size:11.5px;color:#8a948c;overflow-wrap:anywhere}
.hl .hl-fac{margin:2px 0 0;padding:0 0 0 15px;font-size:12px;line-height:1.5;color:#c3cabf}
.hl .hl-fac li{margin:0 0 3px}
.hl .hl-count{margin-top:auto;padding-top:6px;font-family:'Space Grotesk', system-ui, sans-serif;font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:#5a635c}
.hl .hl-rej{margin:14px 0 0;padding:11px 13px;border:1px solid rgba(255,206,84,.32);border-radius:0;background:rgba(255,206,84,.05);font-size:12px;line-height:1.55;color:#c3cabf}
.hl .hl-rej b{color:#ffce54}
.hl .hl-rej ul{margin:6px 0 0;padding:0 0 0 15px}
.hl .hl-note{margin:12px 0 0;font-size:11.5px;line-height:1.55;color:#5a635c}
/* Screener board groups (§9.9): a heading that says what kind of question each
   group of boards answers, so a table is never just a table. */
.grouph{font-family:'Space Grotesk',sans-serif;font-size:19px;color:#eafff0;margin:34px 0 3px}
.groups{font-size:12.5px;line-height:1.5;color:#8a948c;margin:0 0 12px}
.hl .hl-age{color:#5a635c}
.hl .hl-late{color:#ffce54}

/* Daily Read — what changed since yesterday (§9.8), directly under the verdict. */
.changed{margin:12px 0 20px;padding:12px 14px;border:1px solid rgba(232,236,233,.14);border-left:2px solid #62a8ff;border-radius:0;background:rgba(98,168,255,.05)}
.changed.held{border-left-color:#5a635c;background:rgba(232,236,233,.03)}
.changed .ch-k{font-family:'Space Grotesk', system-ui, sans-serif;font-size:10.5px;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:#62a8ff}
.changed.held .ch-k{color:#8a948c}
.changed .ch-age{color:#5a635c;letter-spacing:.06em}
.changed .ch-l{margin:7px 0 0;padding:0 0 0 16px;font-size:13px;line-height:1.6;color:#c3cabf}
.changed .ch-l li{margin:0 0 3px}
.changed .ch-p{margin:6px 0 0;font-size:13px;line-height:1.6;color:#8a948c}
/* Per-cell age on the Dashboard strip: every cell says how old it is, not only
   the late ones — these sources run on cadences from ten minutes to a day. */
.deskstate .ds-age{float:right;font-weight:400;letter-spacing:.04em;color:#5a635c;text-transform:none}
.deskstate .ds-late{color:#ffce54}

/* ── "build your dashboard" CTA (§6 buttons): rides the eyebrow line so it lands
   top-right of the hero on desktop and becomes a full-width button on mobile.

   It sits INSIDE <main>, not beside the breadcrumb, so it inherits whatever
   max-width and gutters the page already uses — the three surfaces that carry it
   do not agree on that number (1000px on Indicators, 1340px on the Screener), and
   a wrapper with its own width would have to guess. */
.deskrow{display:flex;align-items:center;justify-content:space-between;gap:12px 20px;flex-wrap:wrap}
.deskrow>.eyebrow{margin-bottom:0}
/* Sized as an offer, not a nav item: at 12.5px on one line it read as a tag
   sitting in the corner. The icon leads, the label names the destination, the
   second line says what the reader gets there. */
.dashcta{display:inline-flex;align-items:center;gap:13px;min-height:58px;box-sizing:border-box;
  padding:12px 20px;border:1px solid rgba(51,255,102,.42);border-radius:0;
  background:transparent;
  color:#33ff66;text-decoration:none;font-family:'Space Grotesk', system-ui, sans-serif;
  transition:border-color 150ms ease,background 150ms ease}
.dashcta .dc-ic{display:inline-flex;align-items:center;justify-content:center;
  width:38px;height:38px;flex:0 0 auto;border-radius:0;
  border:1px solid rgba(51,255,102,.28);background:transparent}
.dashcta .dc-tx{display:flex;flex-direction:column;gap:3px;min-width:0}
.dashcta .dc-tx b{font-size:14.5px;font-weight:700;line-height:1.2;letter-spacing:.01em}
.dashcta .dc-tx i{font-style:normal;font-size:11.5px;line-height:1.3;color:#8a948c;
  letter-spacing:.02em}
.dashcta .dc-go{font-size:17px;line-height:1;opacity:.8}
/* Two actions stack on the right of the eyebrow line, not side by side: side by
   side they compete for the same glance and neither wins. The calculator is the
   quiet one — §6 gives a region one primary action, and the primary one here is
   the dashboard. */
.deskcta{display:flex;flex-direction:column;align-items:stretch;gap:8px}
.screener-hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(320px,430px);gap:24px 40px;
  align-items:start;margin-bottom:24px}
.screener-copy>.eyebrow{margin-bottom:10px}
.screener-copy>h1{margin-top:0}
.screener-copy>.lead{margin-bottom:14px}
.screener-hero .deskcta{min-width:0}
.dashcta.alt{border-color:rgba(232,236,233,.24);background:none;color:#e8ece9}
.dashcta.alt .dc-ic{border-color:rgba(232,236,233,.2);background:rgba(232,236,233,.045)}
.dashcta.alt:hover,.dashcta.alt:focus-visible{border-color:rgba(232,236,233,.44);
  background:rgba(232,236,233,.05)}
.dashcta.alt:hover .dc-tx i,.dashcta.alt:focus-visible .dc-tx i{color:#c3cabf}
.dashcta:hover,.dashcta:focus-visible{border-color:rgba(51,255,102,.72);
  background:rgba(51,255,102,.1)}
.dashcta:hover .dc-tx i,.dashcta:focus-visible .dc-tx i{color:#c3cabf}
.dashcta:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(51,255,102,.28)}
@media(max-width:640px){
  .deskcta{width:100%}
  .dashcta{width:100%;justify-content:flex-start;padding:13px 16px}
  .dashcta .dc-go{margin-left:auto}
}
@media(max-width:860px){
  .screener-hero{grid-template-columns:1fr;gap:18px;margin-bottom:22px}
  .screener-hero .deskcta{width:100%}
}
@media(prefers-reduced-motion:reduce){.dashcta{transition:none}}

/* The footer owns its own colours. Its copyright span is `.cp`, a name generic
   enough that a page-level utility took it over once already and painted the
   line amber on /status/ — the one route that copies the Lab stylesheet. Scoped
   here rather than renamed there, because the next collision will be a different
   page's class, not the same one. */
/* ────────────────────────────────────────────────────────────────────────
   ПОДВАЛ. Одна форма на весь сайт (CLAUDE.md §6).

   До 2026-08-06 подвал главной и подвал остальных страниц были разной формы:
   на главной знак деска, слоган и кнопки площадок, на прочих — только ряд
   юридических ссылок мельче и в другом порядке. Читатель, уходя с главной,
   попадал в другой сайт. Содержимое теперь строит footer_normalize, а
   оформление живёт здесь — и только здесь.

   Строка одна:  знак | слоган · ссылки | две равные кнопки
                 под ней: копирайт · версия
   Содержимое стоит в той же колонке, что и содержимое страницы: 1120px,
   центрировано, те же отступы.
   ──────────────────────────────────────────────────────────────────────── */
.foot{box-sizing:border-box;display:grid;grid-template-columns:minmax(0,1fr) auto;
  align-items:center;column-gap:24px;row-gap:14px;
  width:100%;max-width:1120px;margin-inline:auto;
  padding:26px clamp(16px,4vw,40px);
  border-top:1px solid rgba(232,236,233,.14);
  font-family:'Space Grotesk', system-ui, sans-serif;font-size:9px;color:#8a948c}
/* Верхний уровень: знак со слоганом слева, кнопки справа. */
.foot-brand{display:flex;align-items:center;gap:14px;min-width:0}
.foot-mark{flex:0 0 auto;line-height:0}
.foot-mark video,.foot-mark img{width:34px;height:34px;border-radius:0;
  object-fit:cover;display:block}
.foot-mark .still{display:none}
@media (prefers-reduced-motion:reduce){
  /* Постер вместо ролика: движение в подвале не несёт информации. */
  .foot-mark video{display:none}
  .foot-mark .still{display:block}
}
/* Прежняя обёртка ряда: разметку с ней больше не пишут, правило оставлено
   ради страниц, которые ещё не пересобраны деплоем. */
.foot-row{display:contents}
/* Знак и слоган — один выход на главную (владелец 2026-08-14). Ссылка
   обнимает оба, потому что читатель тычет в них как в одно целое; цвет
   и подчёркивание не появляются, иначе слоган стал бы похож на пункт
   ряда ссылок ниже. */
.foot-brand-a{display:flex;align-items:center;gap:10px;text-decoration:none;
  color:inherit}
.foot-brand-a:hover h2{color:#33ff66}
.foot-brand-a:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(51,255,102,.28)}
/* Слоган — строка того же кегля, что имя деска в шапке, а не заголовок. */
.foot h2{font-family:'Space Grotesk',system-ui,sans-serif;margin:0;font-size:11px;
  font-weight:600;letter-spacing:0;white-space:nowrap;color:#e8ece9}
/* Нижний уровень: ссылки слева, служебная пара справа — края совпадают с
   краями верхнего уровня. */
.foot-links{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;min-width:0}
.foot-legal{display:flex;align-items:center;gap:10px;white-space:nowrap;
  justify-self:end}
.foot .cp,.foot .ver{color:#5a635c;margin:0}
/* Кредит студии — атрибуция, а не навигация: тише ссылки ряда, без рамки. */
.foot .credit{color:#5a635c;font-size:9px;letter-spacing:.06em;
  text-transform:none;text-decoration:none;border-bottom:0}
.foot .credit:hover,.foot .credit:focus-visible{color:#121613}
/* Правый блок верхнего уровня: две равные цели, всегда одной строкой. */
.foot-side{display:block;justify-self:end}
.foot-cta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;
  align-items:stretch;width:min(100%,320px)}
.foot-cta a{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  width:100%;min-width:0;min-height:44px;padding:0 12px;
  border:1px solid rgba(232,236,233,.14);border-radius:0;
  background:transparent;color:#8a948c;text-decoration:none;font-weight:400;
  font-size:10px;letter-spacing:.1em;text-transform:uppercase;white-space:nowrap}
.foot-cta a:hover{border-color:rgba(51,255,102,.45);color:#33ff66}
.foot-cta a:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(51,255,102,.28)}
/* Ссылки подвала ведут себя как пункты шапки: без подчёркивания, тихие,
   зелёные на наведении. */
.foot a,.foot-links a{color:#8a948c;text-decoration:none;border-bottom:0}
.foot a:hover,.foot a:focus-visible{color:#33ff66}
.foot .fi{display:inline-flex;align-items:center;gap:8px;white-space:nowrap}
.foot .fi i{font-style:normal;color:#5a635c;opacity:.5;border:0}
.foot .fi a,.foot .foot-links a,.foot .cp,.foot .ver{
  font-family:'Space Grotesk', system-ui, sans-serif;
  font-size:9px;letter-spacing:.1em;text-transform:uppercase}
.foot .cp,.foot .ver{text-transform:none;letter-spacing:.06em}
/* Цель пальца — 24px по WCAG 2.5.8: служебный ряд плотный по замыслу. */
.foot .foot-links a,.foot .fi a{display:inline-flex;align-items:center;
  min-height:24px;padding:2px 0}

@media(max-width:760px){
  /* Телефон: сетка в одну колонку, порядок блоков тот же. */
  .foot{grid-template-columns:1fr;row-gap:14px}
  .foot-side,.foot-legal{justify-self:start}
  /* На 320px копирайт с версией в одну строку не помещается и выносит
     документ за край: nowrap здесь дороже одной лишней строки. */
  .foot-legal{flex-wrap:wrap;white-space:normal;gap:4px 10px}
  .foot .cp,.foot .ver{white-space:normal}
  /* Слоган переносится: в 390px строка `one desk for trading decisions` с
     запретом переноса выносила документ за край экрана на 39px. */
  .foot h2{white-space:normal}
  .foot-row{flex-wrap:wrap;width:100%}
  .foot-side{width:100%}
  .foot-cta{width:100%}
}

/* Цель пальца — 40px, §7. Пункты шапки жили на 30px, а строки выпадающих меню
   на 27: на телефоне это промах через раз, и промах здесь стоит открытия не
   того раздела. Высота ряда от этого не растёт — она и так 44px по бургеру. */
.ttn .l,.ttn .l-dd>a.l,.ttn>a,.nav>a{min-height:40px}
.ttn .l-menu a{display:flex;align-items:center;min-height:40px}
/* Закрытое меню не участвует в ширине документа.
   Часть страниц прячет его `visibility:hidden`, а не `display:none`: невидимый
   блок при этом остаётся в потоке позиционирования, и на 1024px меню «education»
   уходило на 32px за правый край — окно получало горизонтальную прокрутку от
   меню, которого не видно. Видимость оставлена как есть (её анимируют), убрана
   геометрия. */
.ttn .l-dd:not(.open) .l-menu{left:auto;right:0;pointer-events:none}
/* Схлопывать высотой бесполезно: ширину документа тянул правый край блока, а не
   его высота. Закрытое меню прижимается правым краем к своему пункту и потому
   заведомо внутри окна; открытому сторону выбирает header.js по факту. */
/* Меню шире экрана не бывает; сторону открытия считает header.js по факту. */
.ttn .l-menu{max-width:calc(100vw - 24px)}
/* Переключатель языка — управляющий элемент, а не подпись: те же 40px. */
.ttlang a,.ttlang button,.ttlang .ttk{min-height:40px;display:inline-flex;align-items:center}
/* Ряд юридических ссылок подвала плотный и мелкий по замыслу — это служебная
   строка. Цель доводится до 24px по WCAG 2.5.8 отступами, а не кеглем: 40px
   здесь растянули бы подвал на три экрана телефона. */
.foot .foot-links a,.foot .fi a{display:inline-flex;align-items:center;min-height:24px;padding:2px 0}
.foot .fi i{opacity:.5}
.foot .cp,.foot .ver{text-transform:none;letter-spacing:.06em}

/* Таблица шире телефона прокручивается ВНУТРИ себя, а не тащит за собой всю
   страницу (§5: горизонтальный overflow только для данных, и только в своём
   контейнере). /lab/tradfi/ уносил документ на 339px вправо. */
@media(max-width:760px){
  main table,.wrap table{display:block;max-width:100%;overflow-x:auto}
}

.cl-title span,.cl-thesis,.cl-product-title{text-wrap:balance}
.cl-title span{white-space:nowrap}

/* ────────────────────────────────────────────────────────────────────────
   ШРИФТЫ. Space Grotesk не имеет кириллицы.

   На русских страницах он рисовал латиницу, а кириллицу отдавал системному
   фолбэку — system-ui на macOS, Segoe UI на Windows, Roboto на Android. RU-
   версия набиралась тремя гарнитурами сразу, и ни одна не была выбрана.

   Кириллица — Manrope: тот же геометрический характер, полный набор, та же
   шкала весов. Трекинг заголовков считался под узкий Space Grotesk (-0.072em);
   у Manrope такая посадка склеивает «ЖД» и «ДЕ», поэтому для :lang(ru) он
   пересчитан примерно втрое мягче.
   ──────────────────────────────────────────────────────────────────────── */
:root{--tt-font-sans:'Space Grotesk',system-ui,sans-serif;
  --tt-font-sans-ru:'Manrope','Space Grotesk',system-ui,sans-serif;
  /* Третьей гарнитуры нет: переменная указывает на основную, чтобы
     страница, объявившая 'Space Grotesk', system-ui, sans-serif, получила стандарт. */
  --tt-font-mono:'Space Grotesk', system-ui, sans-serif}
:lang(ru) body,:lang(ru) h1,:lang(ru) h2,:lang(ru) h3,:lang(ru) p,
:lang(ru) a,:lang(ru) li,:lang(ru) td,:lang(ru) th,:lang(ru) button,
:lang(ru) input,:lang(ru) select,:lang(ru) summary,:lang(ru) figcaption{
  font-family:var(--tt-font-sans-ru)}
/* Служебные подписи и таблицы набираются тем же семейством, что остальной
   текст: с 2026-08-07 на сайте два шрифта. Цифры выравниваются по колонкам
   `tabular-nums`, а не третьей гарнитурой.

   Кириллица идёт СВОИМ стеком, а не латинским: у Space Grotesk кириллицы нет,
   и `.eyebrow` с `.crumb`, прибитые к нему, отдавались системному шрифту —
   то есть третьему. Видно это было на 110 новых русских страницах: «РЫНОК
   TRADFI» и хлебные крошки набирались не тем, чем вся страница вокруг. */
:lang(ru) .ttn,:lang(ru) .foot,:lang(ru) code,:lang(ru) pre,
:lang(ru) .eyebrow,:lang(ru) .crumb{font-family:var(--tt-font-sans-ru)}
/* Заголовки лендинга объявлены через `#tt-cloudline …` — идентификатор
   сильнее любого `:lang(ru) .cl-title`, и первая редакция этих правил молча
   проигрывала каскад: кегль оставался латинским, «КОНСЕНСУСА» уезжало за край.
   Селектор поднят до того же веса. */
:lang(ru) h1,:lang(ru) h2{letter-spacing:-.03em}
/* Кегль русских заголовков лендинга. Первая редакция уводила его до ~60% от
   английского — этого хватало, чтобы «КОНСЕНСУСА» перестало вылезать за
   колонку, и слишком много, чтобы герой остался героем: рядом с английской
   версией русская читалась как подпись под ней. Manrope шире Space Grotesk
   примерно на десятую, плюс трекинг здесь мягче (-.03em против -.072em), и
   этим двум поправкам соответствует множитель около 0.85, а не 0.6.
   Заголовок героя держит 0.87, тезис и заголовок продуктов — 0.82: у них
   колонка уже, и предел ставит самое длинное слово, а не размер шрифта. */
#tt-cloudline:lang(ru) .cl-title,html:lang(ru) #tt-cloudline .cl-title{
  letter-spacing:-.03em;line-height:.92;font-size:clamp(54px,7vw,101px)}
html:lang(ru) #tt-cloudline .cl-thesis{letter-spacing:-.025em;
  font-size:clamp(34px,4.9vw,72px)}
html:lang(ru) #tt-cloudline .cl-product-title{letter-spacing:-.025em;
  font-size:clamp(45px,6.3vw,90px)}
html:lang(ru) #tt-cloudline .cl-about-lead{letter-spacing:-.02em;
  font-size:clamp(27px,3.5vw,50px)}
/* Телефон отдельно: у английского героя на узком экране свой кегль
   (clamp(38px,11.2vw,64px)), а правило выше сильнее его на всех ширинах —
   без этой пары русский заголовок приехал бы на 390px крупнее английского и
   вылез бы за экран. Тот же множитель 0.87. */
@media(max-width:900px){
  html:lang(ru) #tt-cloudline .cl-title{
    font-size:clamp(34px,9.8vw,56px);letter-spacing:-.04em}
}
:lang(ru) .cl-thesis,:lang(ru) .cl-product-title{letter-spacing:-.025em}
:lang(ru) .cl-about-lead{letter-spacing:-.02em}

/* Подсказка о горизонтальной прокрутке — её вставляет модуль overflow в
   assets/js/header.js. Моно meta по §4, приглушённый цвет по §3: это подсказка,
   а не содержание. */
.ttovf-cue{margin:6px 0 0;font-family:'Space Grotesk', system-ui, sans-serif;
  font-size:12px;line-height:1.35;letter-spacing:.04em;
  color:var(--tt-text-subtle,#5a635c);text-align:right;user-select:none}
.ttovf-cue[hidden]{display:none}

/* ────────────────────────────────────────────────────────────────────────
   Cloudline: гарнитуры лендинга. Моно-стеки внутри оверлея писались как
   `ui-monospace, monospace`, и весь верхний бар главной рисовался системным
   моно — SF Mono, Consolas или DejaVu, — а при переходе на любую внутреннюю
   страницу гарнитура менялась на глазах.
   ──────────────────────────────────────────────────────────────────────── */
#tt-cloudline,#tt-cloudline *{font-family:'Space Grotesk', system-ui, sans-serif}
#tt-cloudline :is(h1,h2,h3,h4,h5,p,li,blockquote,.cl-lede,.cl-answer),
#tt-cloudline :is(h1,h2,h3,h4,h5,p,li,blockquote,.cl-lede,.cl-answer) *{
  font-family:'Space Grotesk',system-ui,sans-serif}

/* ────────────────────────────────────────────────────────────────────────
   Русский герой лендинга. Кегль заголовка считался под английские слова:
   `clamp(62px,8vw,116px)` при плотном трекинге -0.072em. У русского трекинг
   пересчитан мягче (-0.03em, иначе Manrope склеивает «ЖД»), а слова длиннее —
   «УБЕЖДЕНИЕ» против «CONVICTION», — и строка вылезала за колонку 52%.
   ──────────────────────────────────────────────────────────────────────── */
:lang(ru) #tt-cloudline .cl-title{font-size:clamp(46px,6.2vw,92px);
  overflow-wrap:break-word;hyphens:manual}
:lang(ru) #tt-cloudline .cl-copy,
:lang(ru) #tt-cloudline .cl-thesis,
:lang(ru) #tt-cloudline .cl-product-title{max-width:100%;overflow-wrap:break-word}
@media(max-width:900px){
  :lang(ru) #tt-cloudline .cl-title{font-size:clamp(32px,9.4vw,56px)}
}

/* Колонки чисел выравниваются табличными цифрами, а не третьим шрифтом:
   моноширинная гарнитура нужна была ровно ради этого. */
table,.foot .ver,.ttn,.deskstate,.num,.stat,.metric,.tick{font-variant-numeric:tabular-nums}

/* ────────────────────────────────────────────────────────────────────────
   «КАК ЧИТАТЬ» — одна форма на весь сайт

   Блок отвечает на вопрос, который читатель задаёт первым: что это за
   строка и что с ней делать. До 2026-08-14 правило стояло СЕМЬ раз — по
   копии в каждом генераторе (funding, crosschain, lab, playbook, regime,
   whales, скринер TradFi), и правка любой из них расходилась с шестью
   остальными молча. Владелец теперь один, и он здесь.

   Форма: рамка в один пиксель, зелёная планка слева, подпись-надстрочник
   прописными. Планка — единственное зелёное в покое (§6.1 разрешает его
   как признак действия или подтверждённого состояния; здесь это метка
   «сюда смотреть»), поэтому второго акцента в блоке нет.

   Надстрочник блочный, а не в строку: «Как читать строку →» в одной
   строке с примером читалось как начало предложения, и глаз не отличал
   подпись от содержания. */
.example{position:relative;margin:6px 0 26px;padding:12px 16px 13px;
  border:1px solid rgba(232,236,233,.14);
  border-left:2px solid rgba(51,255,102,.55);
  background:rgba(51,255,102,.045);border-radius:0;
  font-size:12.5px;color:#c3cabf;line-height:1.62}
.example .k{display:block;margin:0 0 5px;color:#33ff66;font-size:10px;
  font-weight:600;letter-spacing:.14em;text-transform:uppercase}
.example b{color:#e8ece9;font-weight:600}
.example a{color:#c3cabf}
.example a:hover,.example a:focus-visible{color:#33ff66}
