/* LiveBall — единый файл стилей. СБОРКА из css/partials/ через build.sh или build.js. Не редактировать напрямую. */

/* ===== partials/00-core.css ===== */
/* ============================================================
   LiveBall — единый файл стилей
   Структура:
     0. Шрифты (@font-face, файлы в ../fonts)
     1. Токены (цвета, шрифты, радиусы)
     2. База (reset, типографика)
     3. Утилиты (u-*)
     4. Общие компоненты (lb-*): шапка, навигация, футер,
        кнопки, пилюли, карточки, строки матчей, таблицы,
        звёзды избранного, дропдауны, модалки, слайдеры
     5. Мобильные общие компоненты (m-*): каркас, топбар, дровер
     6. Страничные секции (по одной на страницу, префиксы:
        home-, lg-, team-, mt-, fav-, news-, hk-, hkm-, bb-,
        bbm-, ufc-, ufcs-, f1-, doc-, hub-, mob-)
   ============================================================ */

/* ---------- 0. Шрифты ---------- */
/* Unbounded (заголовки) и Golos Text (текст) лежат у нас, а не на Google Fonts.
   До 11.09.2026 их подключал <link rel="stylesheet"> на fonts.googleapis.com в
   <head> каждой страницы, а внешний CSS в <head> — блокирующий ресурс: пока он
   не ответил, браузер не рисует НИЧЕГО. Зависший Google Fonts (у части
   провайдеров в РФ — обычное дело) держал пустой экран до таймаута, ~20 с;
   display=swap от этого не спасает — он про подмену шрифта, а не про ожидание
   самого CSS. Нашёл тестер закрытой беты (отзыв 11.09.2026).

   Файлы — те же woff2, что раздаёт Google: css2?family=Unbounded:wght@500..700
   &family=Golos+Text:wght@400..800, запрошенные с UA Chrome (так приходят
   вариативные файлы, по одному на сабсет). unicode-range ниже — Google'овский,
   поэтому кириллица и латиница качаются по мере надобности, как и раньше. Оба
   шрифта под SIL Open Font License, самохостинг разрешён.

   Пути относительные (css/../fonts) ради макета, который открывают с диска;
   сборка сайта переписывает их в /public/fonts/v2/ (scripts/build-css.js, там
   же, где пути картинок). Файлы лежат в обоих местах — public/fonts/v2/ и
   dist/untitled/fonts/ — и правятся парой. ?v у шрифтов нет: кеш браузера
   бьётся именем файла, обновил шрифт — переименуй. */
@font-face {
  font-family: 'Golos Text';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url(/public/fonts/v2/golos-text-cyrillic-ext.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'Golos Text';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url(/public/fonts/v2/golos-text-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Golos Text';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url(/public/fonts/v2/golos-text-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Golos Text';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url(/public/fonts/v2/golos-text-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Unbounded';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url(/public/fonts/v2/unbounded-cyrillic-ext.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: 'Unbounded';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url(/public/fonts/v2/unbounded-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Unbounded';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url(/public/fonts/v2/unbounded-vietnamese.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'Unbounded';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url(/public/fonts/v2/unbounded-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: 'Unbounded';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url(/public/fonts/v2/unbounded-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ---------- 1. Токены ---------- */
:root {
  --bg: #0C110B;            /* фон страницы */
  --bg-header: #0A0E08;     /* фон шапки */
  --panel: #11170F;         /* карточки, контролы */
  --panel-2: #151C12;       /* выпадающие панели */
  --panel-modal: #141A11;   /* модальные окна */
  --field: #0C110B;         /* поля/селекты внутри модалок */

  --ink: #F2F5EF;           /* основной текст */
  --ink-strong: #FFFFFF;    /* заголовки */
  --ink-soft: #C9D2C4;      /* вторичный текст */
  --muted: #9DA898;         /* приглушённый */
  --dim: #6E7A69;           /* слабый */
  --faint: #4A5545;         /* едва заметный */

  --green: #58DB24;         /* акцент */
  --green-hover: #6BEA37;
  --green-soft: #8BE96A;    /* hover-текст, киккеры */
  --green-pale: #C0F4A4;    /* активные ссылки */
  --on-green: #0B1206;      /* текст на зелёном */

  /* Жёлтый в палитре один и заведён под конкретную задачу: число сверки при
     входе. Оно единственное на экране, что нужно НАЙТИ ГЛАЗАМИ и сопоставить с
     тремя кнопками в боте, — ни зелёный (им набран весь интерфейс), ни белый
     (им набран весь текст) на эту роль не годятся. */
  --yellow: #FFD24A;

  --red-live: #FF4545;
  --red-live-text: #FF6B6B;  /* live-время и live-счёт в строках матчей */
  --red-soft: #FF8A8A;

  /* Значки формы В/Н/П — ОДИН набор на весь сайт: шапка матча, хиро команды,
     строки результатов, «форма · 10» в статистике. Раньше team-* были
     приглушённые, а mt-form/team-form10 — плотной заливкой; из-за этого одна и
     та же форма выглядела на разных страницах по-разному. Оставили
     ПОЛУПРОЗРАЧНЫЙ вариант — тот, что в макете на мобилке и на странице
     команды: заливка 8–16% и цветная буква поверх неё.
     Плотная заливка осталась только там, где это график, а не значок
     (полоса .team-formline__bar). */
  --form-w: rgba(88, 219, 36, 0.16);
  --form-w-ink: var(--green-soft);
  --form-d: rgba(255, 255, 255, 0.08);
  --form-d-ink: var(--muted);
  --form-l: rgba(255, 69, 69, 0.14);
  --form-l-ink: var(--red-live-text);
  --tg: #2AABEE;
  --tg-hover: #4DBBF2;

  --line-soft: rgba(255, 255, 255, 0.06);   /* разделители строк, шапка */
  --line: rgba(255, 255, 255, 0.08);        /* границы карточек */
  --line-ctl: rgba(255, 255, 255, 0.09);    /* границы контролов */
  --line-strong: rgba(255, 255, 255, 0.12); /* дропдауны, тумблеры */
  --line-green: rgba(120, 230, 80, 0.3);    /* акцентные рамки */
  --hover-green-line: rgba(139, 233, 106, 0.5);

  --font-display: 'Unbounded', 'Golos Text', sans-serif;
  --font-text: 'Golos Text', system-ui, sans-serif;

  --r-row: 10px;
  --r-ctl: 12px;
  --r-menu: 14px;
  --r-card: 16px;
  --r-lg: 18px;
  --r-xl: 20px;
  --r-pill: 999px;

  --shadow-menu: 0 16px 40px rgba(0, 0, 0, 0.55);
  --shadow-modal: 0 28px 72px rgba(0, 0, 0, 0.55);

  /* Направление строки для градиентов. Вёрстка написана логическими
     свойствами (margin-inline-start, inset-inline-end…), и справа налево
     (<html dir="rtl">, иврит) она отражается сама. У linear-gradient
     логического направления нет: «to right» остался бы правым, и затухание у
     края картинки оказалось бы с другой стороны от текста. Поэтому
     горизонтальные градиенты пишутся через этот угол: «к концу строки». */
  --to-end: 90deg;
}

/* Справа налево — иврит (/he). Всё, что логическими свойствами не выражается
   (градиенты, фоновые картинки, направленные иконки), разворачивается
   правилами [dir="rtl"] рядом с исходными. */
[dir="rtl"] {
  --to-end: 270deg;
  /* Иврита нет ни в Unbounded, ни в Golos Text — буквы браузер берёт у
     следующего шрифта в списке. У текста это system-ui, у заголовков был
     generic sans-serif, и заголовки на иврите набирались бы другим
     системным шрифтом, чем текст под ними. */
  --font-display: 'Unbounded', 'Golos Text', system-ui, sans-serif;
}

/* ---------- 2. База ---------- */
* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-text);
  -webkit-font-smoothing: antialiased;
}

/* Флекс-колонка на body — прибивка футера: на коротких страницах (пустое
   избранное, 404, «турнир скоро») страница тянется минимум на высоту экрана,
   и футер прижат к низу (margin-top: auto у него в блоке «Футер»), а не висит
   посреди. Заодно до низа дотягивается и фоновая полоса брендинга — она
   рисуется в background самого body (ad/_custom_brand*.html). Именно флекс,
   а не grid: прямых детей у body много и они разные (шапка, секции, футер,
   баннеры и модалки рекламы, распорка брендинга) — им нужен обычный поток
   без явных строк. Фиксированные/абсолютные слои флекс не трогает. */
body {
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
}

/* Раньше здесь был min-width:1220px — снят ради адаптива (см. блок @media в конце файла) */

a { color: var(--green); text-decoration: none; }
a:hover { color: var(--green-soft); }
::selection { background: rgba(88, 219, 36, 0.35); }

button {
  font-family: var(--font-text);
  border: none;
  background: none;
  padding: 0;
  color: inherit;
  cursor: pointer;
}

input, select {
  font-family: var(--font-text);
  color: var(--ink);
}

img { max-width: 100%; }

h1, h2, h3, h4 { margin: 0; color: var(--ink-strong); }

/* [hidden] от UA-стилей — display:none БЕЗ !important, и его перебивает любое
   авторское правило с display. Из-за этого фильтры Все/Live/Завершенные молча
   не работали: app.js ставил row.hidden = true, а .lb-fixture/.team-fix/
   .mt-event оставались display:grid — на главной пропадали только
   лиги целиком, а строки не из фильтра оставались на месте. Точечно это уже
   лечили в 15-favorites.css; правило вынесено в базу, чтобы не ловить то же
   самое на каждом новом компоненте, который прячут атрибутом. */
[hidden] { display: none !important; }

@keyframes lbPulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.25; }
}

/* Зелёные элементы рендерим без сглаживания жирности (как в макете) */
.lb-crisp, .lb-crisp * {
  -webkit-font-smoothing: subpixel-antialiased;
  -moz-osx-font-smoothing: auto;
}

/* ---------- 3. Утилиты ---------- */
.u-dim { color: var(--dim); }
.u-faint { color: var(--faint); }
.u-grow { flex: 1 1 0%; min-width: 0; }
.u-right { text-align: end; }

/* Горизонтальный скролл без скроллбара (слайдеры, ряды чипов) */
.lb-scroll {
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.lb-scroll::-webkit-scrollbar { display: none; }

/* ---------- 4. Общие компоненты ---------- */

/* Контейнеры */
.lb-container { width: 1140px; margin: 0 auto; }
.lb-narrow { width: 960px; margin: 0 auto; }

/* Сетка страницы: сайдбар + контент */
.lb-layout {
  width: 1140px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 264px 1fr;
  gap: 20px;
  align-items: start;
  /* Верхний отступ 12px, а не 24px: разделителя у подшапки больше нет, и вместе
     с её нижними 8px прежние 24 давали 32px пустоты между рядом видов спорта и
     первой карточкой ленты. Нижние 12 не трогаем — там футер. */
  padding: 12px 0;
}
.lb-sidebar { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.lb-content { display: flex; flex-direction: column; gap: 20px; min-width: 0; }

/* Заголовки и киккеры */
.lb-kicker {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.16em;
  color: var(--green-soft);
  text-transform: uppercase;
}
.lb-h1 { font-family: var(--font-display); font-size: 32px; font-weight: 700; line-height: 1.25; }
.lb-h2 { font-family: var(--font-display); font-size: 19px; font-weight: 700; }
.lb-h3 { font-family: var(--font-display); font-size: 15px; font-weight: 700; }
/* Тур рядом с названием лиги («· 2-й квалификационный раунд») — вторичный:
   шрифт и цвет как у строки лиги в хиро топ-матча (.home-hero__league).
   Один класс на ленту матчей, шапку матча и избранное. */
.lb-round { font-family: var(--font-text); font-size: 13px; font-weight: 600; color: var(--muted); }
/* Строка «Название · тур», которая режется многоточием. Многоточие браузер
   красит стилями БЛОКА, у которого стоит text-overflow, а не того текста,
   который он обрезал: у белого жирного блока точки после приглушённого тура
   выходили белыми и жирными и читались как часть названия. Отдельного
   ::ellipsis в CSS нет, поэтому название и тур режутся по отдельности —
   каждый своим цветом. Флексом становятся только строки С ТУРОМ: без него
   текст однородный, и разносить нечего.
   Тур сжимается первым (flex-shrink: 999) — название важнее. */
.lb-titled:has(.lb-round) { display: flex; align-items: baseline; column-gap: 5px; min-width: 0; }
.lb-titled > .lg,
.lb-titled > .lb-round { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lb-titled > .lb-round { flex-shrink: 999; }

/* Шапка */
.lb-header { background: var(--bg-header); border-bottom: 1px solid var(--line-soft); }
.lb-header__inner {
  width: 1140px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 14px 0;
}
.lb-header__logo { display: flex; align-items: center; flex: none; }
.lb-header__logo img { height: 27px; display: block; }

.lb-search {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  background: var(--panel);
  border: 1px solid var(--line-ctl);
  border-radius: var(--r-pill);
  padding: 10px 18px;
  margin-inline-start: 16px;
}
.lb-search input {
  background: transparent;
  border: none;
  outline: none;
  font-size: 14px;
  width: 100%;
}

/* Круглая иконка-кнопка (звезда, настройки) */
.lb-iconbtn {
  position: relative;
  flex: none;
  width: 43px;   /* 41px макета — content-box, у нас border-box: +2px рамки */
  height: 43px;
  border-radius: 50%;
  background: var(--panel);
  border: 1px solid var(--line-ctl);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--ink-soft);
  cursor: pointer;
}
.lb-iconbtn:hover { border-color: var(--hover-green-line); color: var(--green-soft); }
.lb-iconbtn svg { display: block; }

/* Слот кнопки adbetnet в шапке: пока зона пустая (сеть не налила рекламу или
   вырезал адблок), обёртка не занимает места — иначе пустой div зоны был
   flex-элементом и раздувал зазор поиск→настройки лишним gap. Как только
   лоадер вставил контент, :has() раскрывает обёртку на лету. */
.lb-header__adbet { display: none; }
.lb-header__adbet:has(a, img, iframe, ins) { display: block; }

/* Бейдж-счётчик избранного. Красный, а не зелёный: цифра показывает число
   live-матчей среди избранных — тот же смысловой красный, что у live-точки. */
.lb-badge {
  position: absolute;
  top: -4px;
  inset-inline-end: -4px;
  min-width: 17px;
  height: 17px;
  border-radius: 999px;
  background: var(--red-live);
  color: #fff;
  /* 600, не 800: на красной заливке жирная белая цифра заплывала */
  font-size: 10px;
  font-weight: 600;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 0 4px;
}
.lb-badge.is-on { display: inline-flex; }

/* Кнопки */
.lb-btn {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  border-radius: var(--r-pill);
  padding: 10px 20px;
  font-size: 14px;
  font-weight: 700;
  border: 1px solid transparent;
  cursor: pointer;
}
.lb-btn--green { background: var(--green); border-color: var(--green); color: var(--on-green); }
.lb-btn--green:hover { background: var(--green-hover); border-color: var(--green-hover); color: var(--on-green); }
.lb-btn--tg { background: var(--tg); border-color: var(--tg); color: #FFFFFF; }
.lb-btn--tg:hover { background: var(--tg-hover); border-color: var(--tg-hover); color: #FFFFFF; }

/* Компактная кнопка-«призрак» для строк списка настроек: рамка и
   полупрозрачная заливка вместо цвета. Общая, а не по классу на каждую
   кнопку, потому что таких строк уже две («Пройти заново» у обучения,
   «Написать отзыв» у обратной связи) и стоят они одна под другой — разъехайся
   у них padding или размер шрифта, это читается как недоделка. Одна из них
   вдобавок <a>, а не <button>: у базовой .lb-btn рамка прозрачная, и ссылка
   без этого модификатора превращалась в зелёный текст. */
.lb-btn--ghost {
  padding: 7px 14px;
  border-color: var(--line-strong);
  background: rgba(255, 255, 255, 0.05);
  color: var(--ink);
  font-size: 12.5px;
}
.lb-btn--ghost:hover { border-color: var(--hover-green-line); color: var(--green-soft); }

/* ---------- Аккаунт в шапке ----------
   Хендофф design_handoff_header_account (22.09.2026). Одна кнопка #login_btn
   на два состояния, переключает их класс is-authed на <html> (на сайте —
   auth.js плюс ранний хинт из localStorage перед разметкой шапки, в макете —
   демо-вход в components.js): гостю — нейтральная пилюля «Войти» (зелёной
   больше нет: две зелёные кнопки рядом с Telegram спорили друг с другом),
   вошедшему — пилюля аккаунта: аватар-инициал, имя и маленькая шестерёнка
   как подсказка, что настройки теперь здесь. Отдельная шестерёнка у
   вошедшего прячется. Высота 43px — как у .lb-iconbtn рядом. */
.lb-header__login {
  height: 43px;
  padding-block: 0; padding-inline: 17px 20px;
  background: var(--panel);
  border-color: var(--line-ctl);
  color: var(--ink);
}
.lb-header__login:hover { border-color: var(--hover-green-line); color: var(--green-pale); }
.lb-account__guest, .lb-account__user { display: inline-flex; align-items: center; gap: 8px; }
.lb-account__user { display: none; gap: 9px; font-size: 13.5px; }
/* Шестерёнка в пилюле мельче и приглушённее отдельной кнопки: это подсказка,
   а не действие само по себе. Дочерний селектор — иконка аватара лежит глубже. */
.lb-account__user > svg { width: 15px; height: 15px; color: var(--muted); }
.lb-account__user > svg * { stroke-width: 1.7; }
html.is-authed .lb-header__login { padding-block: 0; padding-inline: 5px 13px; }
html.is-authed .lb-header__login:hover { color: var(--ink); } /* зеленеет только рамка, имя не перекрашиваем */
html.is-authed .lb-account__guest { display: none; }
html.is-authed .lb-account__user { display: inline-flex; }
html.is-authed .lb-header__settings { display: none; }
.lb-account__name { max-width: 140px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Аватар — инициал на зелёном градиенте, фото сервер не отдаёт. Три размера:
   31px в пилюле шапки, 38px в дровере (--md), 44px в настройках (--lg).
   is-empty — инициала нет (гость в дровере или аккаунт без имени): пунктирный
   круг с иконкой юзера из разметки. Иконка лежит в разметке всегда и
   показывается только в этом состоянии. */
.lb-account__avatar {
  flex: none;
  width: 31px;
  height: 31px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, var(--green), #2F9412);
  color: var(--on-green);
  font-size: 13px;
  font-weight: 800;
  line-height: 1;
}
.lb-account__avatar--md { width: 38px; height: 38px; font-size: 15px; }
.lb-account__avatar--lg { width: 44px; height: 44px; font-size: 18px; }
.lb-account__avatar svg { display: none; }
.lb-account__avatar.is-empty { background: var(--panel); border: 1px dashed rgba(255, 255, 255, 0.22); color: var(--muted); }
.lb-account__avatar.is-empty svg { display: block; }
.lb-account__avatar--md svg { width: 17px; height: 17px; }

/* Навигация видов спорта + пилюли-табы */
/* Разделитель у подшапки НЕ рисуем: фон у неё тот же, что у страницы (--bg),
   поэтому полоса читалась как второй разделитель сразу под линией шапки и
   отрезала ряд видов спорта от контента. Граница остаётся только у .lb-header. */
.lb-nav { background: var(--bg); }
/* Избранное в подшапке (переехало из шапки): на десктопе прижато к правому
   краю ряда. В РАЗМЕТКЕ пилюля при этом первая, и это не рассинхрон: на
   мобилке ряд видов спорта скроллится горизонтально, и прижатое вправо
   избранное пришлось бы докручивать — там прижим снимается (99-responsive,
   блок 940px), а порядок разметки как раз даёт нужное «первой в ленте».
   Бейдж-счётчик в потоке строки — базовый .lb-badge абсолютный и «липнет»
   к звезде. Отрицательный margin-block — потому что бейдж (17px) выше строки
   пилюли (16px: иконка и текст): появляясь при первом live-матче в избранном,
   он растил пилюлю, а с ней и всю подшапку на 1px — страница под ней
   вздрагивала. */
.lb-nav__fav { order: 1; margin-inline-start: auto; }
.lb-nav__fav .lb-badge { position: static; top: auto; inset-inline-end: auto; margin-block: -1px; }
.lb-nav__inner {
  width: 1140px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 0;
}

.lb-pill {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: var(--panel);
  border: 1px solid var(--line-ctl);
  color: var(--ink-soft);
  font-size: 13px;
  font-weight: 600;
  border-radius: var(--r-pill);
  padding: 8px 16px;
  cursor: pointer;
  white-space: nowrap;
}
.lb-pill:hover { border-color: var(--hover-green-line); color: var(--green-pale); }
.lb-pill.is-active {
  background: var(--green);
  border-color: var(--green);
  color: var(--on-green);
  font-weight: 700;
}
.lb-pill.is-active:hover { color: var(--on-green); }

/* Крупные пилюли (табы разделов) */
.lb-pill--lg { padding: 9px 18px; border-color: rgba(255, 255, 255, 0.1); }
.lb-pill--lg.is-active { border-color: var(--green); font-weight: 800; }
/* Мелкие пилюли (фильтры списков) */
.lb-pill--sm { padding: 8px 16px; font-size: 12.5px; border-color: rgba(255, 255, 255, 0.1); }
.lb-pill--sm.is-active { font-weight: 800; }

/* Ряд табов */
.lb-tabs { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* Панели табов */
.lb-panel { display: none; }
.lb-panel.is-active { display: block; }

/* ---------- Поле-фильтр списка (lb-find) ----------
   Маленький поиск, который сужает УЖЕ ОТРИСОВАННЫЙ список на месте: страны в
   сайдбаре, лента матчей на главной. Класс свой, а не .lb-search из шапки:
   тот спрашивает сервер и раскрывает выдачу, этот только прячет строки — общей
   у них остаётся форма, а не поведение.
   Фон и внешние отступы задаёт страница (home-*): в карточке поле должно быть
   темнее её, на голом фоне — светлее. */
.lb-find {
  display: flex;
  align-items: center;
  gap: 8px;
  border: 1px solid var(--line-ctl);
  border-radius: var(--r-pill);
  color: var(--dim);
}
.lb-find:focus-within { border-color: var(--hover-green-line); color: var(--green-soft); }
.lb-find > svg { flex: none; }
.lb-find input {
  flex: 1;
  min-width: 0;
  padding: 0;
  background: transparent;
  border: 0;
  outline: none;
  font-family: inherit;
  font-size: 13px;
  font-weight: 600;
  color: var(--ink);
  caret-color: var(--green);
}
.lb-find input::placeholder { color: var(--dim); font-weight: 500; }
/* Крестик — тот же, что в мобильном поиске (.m-search__clear), только мельче.
   Своё display:none у [hidden] обязательно: UA-правило перебивается авторским
   display (см. комментарий про [hidden] в начале файла). */
.lb-find__clear {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--dim);
  color: var(--bg);
  cursor: pointer;
}
.lb-find__clear:hover { background: var(--muted); }
.lb-find__clear[hidden] { display: none; }

/* Карточки */
.lb-card {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
}
.lb-card--lg { border-radius: var(--r-lg); }
.lb-card--xl { border-radius: var(--r-xl); }
.lb-card--pad { padding: 20px; }
.lb-card--clip { overflow: hidden; }

.lb-score {
  font-size: 13px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Вспышка изменившегося счёта — поллинг живых матчей (public/js/v2/live.js
   вешает класс на один прогон анимации). Цвет, а не движение: строка живёт в
   плотном списке, где подпрыгивающая ячейка дёргает соседние.
   Скрытый настройкой счёт не подсвечивается вовсе — это делает скрипт, а не
   CSS: сама вспышка сообщала бы, что кто-то забил. */
/* На 100% цвет НЕ задан намеренно: так он доезжает до собственного цвета
   элемента, каким бы тот ни был в этой теме и в этом блоке. */
@keyframes lbScoreBump {
  0%   { color: var(--red-live); transform: scale(1.2); }
  25%  { color: var(--red-live); transform: scale(1); }
  55%  { color: var(--red-live); }
  100% { transform: scale(1); }
}
.lb-score--bump { animation: lbScoreBump 1.1s ease-out 1; }
@media (prefers-reduced-motion: reduce) {
  .lb-score--bump { animation-name: none; }
}

/* Точка live */
.lb-live-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--red-live);
  animation: lbPulse 1.2s ease infinite;
  flex: none;
}
/* Единственная бесконечная анимация сайта — её и просят гасить в первую
   очередь. Точка остаётся, перестаёт только мигать: статус «идёт сейчас»
   несёт цвет, а не движение. */
@media (prefers-reduced-motion: reduce) {
  .lb-live-dot { animation: none; }
}

/* Горизонтальная строка матча (списки в группах лиг: звезда | время | дом | счёт | гости | ›) */
.lb-fixture {
  display: grid;
  /* Колонки счёта и времени — переменными: у баскетбола счёт трёхзначный с
     обеих сторон («112 : 108»), и в 64px он не помещается (.bb-groups).
     Время шире базовых 76px нужно там, где live-статус — не минута, а слово:
     «1-й период» (77px вместе с точкой) и «1-я четверть» (88px) в 76px не
     влезают и переносятся на вторую строку, задирая высоту строки. nowrap
     здесь не вариант — перенос нужен «Матч перенесен» (см. ниже). */
  grid-template-columns: 18px var(--fx-timew, 76px) 1fr var(--fx-scorew, 64px) 1fr 16px;
  align-items: center;
  gap: 10px;
  padding: 11px 18px;
  border-top: 1px solid var(--line-soft);
  color: var(--ink);
}
.lb-fixture:hover { background: rgba(255, 255, 255, 0.02); }
/* Без nowrap: длинное время («19:00 · 19.07») переносится на 2 строки, как в макете */
.lb-fixture__time { font-size: 12px; font-weight: 600; color: var(--dim); }
.lb-fixture__time.is-live { color: var(--red-live-text); font-weight: 800; display: inline-flex; align-items: center; gap: 6px; }
/* Дата рядом со временем («22:00 · 19.07») — вторичная: нужна там, где соседние
   строки списка из разных дней (избранное), и не должна спорить со временем.
   Разделитель — псевдоэлементом, а не текстом в разметке: на мобилке ячейка
   времени становится флексом, и голый текстовый узел « · » между временем и
   датой схлопывает свои пробелы («22:00 ·19.07»). */
.lb-fixture__date { color: var(--dim); font-weight: 700; }
.lb-fixture__date::before { content: '·'; margin: 0 4px; }
.lb-fixture__home,
.lb-fixture__away {
  display: flex;
  align-items: center;
  gap: 9px;
  font-size: 13.5px;
  font-weight: 600;
  overflow: hidden;
  white-space: nowrap;
}
.lb-fixture__home { justify-content: flex-end; text-align: end; }
.lb-fixture__home span,
.lb-fixture__away span { overflow: hidden; text-overflow: ellipsis; }
.lb-fixture__home img,
.lb-fixture__away img { width: 22px; height: 22px; flex: none; object-fit: contain; }
.lb-fixture__home.is-winner,
.lb-fixture__away.is-winner { color: var(--green-soft); font-weight: 700; }
.lb-fixture__score {
  text-align: center;
  font-size: 13.5px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  color: var(--ink);
}
.lb-fixture__arrow { color: var(--dim); font-size: 14px; }
/* Цвет счёта по статусу матча (как в макете): live — красный, будущий «– : –» — приглушённый */
.lb-fixture[data-st="live"] .lb-fixture__score { color: var(--red-live-text); }
.lb-fixture[data-st="up"] .lb-fixture__score { color: var(--dim); }

/* Строка кастомного события админки (internal/siteevents): церемония,
   жеребьёвка или матч, которого нет во внешнем API. Та же .lb-fixture со
   звездой и стрелкой — событие стоит в карточке своей лиги вровень с матчами
   дня, — отличий два:

   1. у одиночного события нет команд — заголовок занимает всю середину строки;
   2. счёт не подсвечивается красным во время эфира: у события его не бывает
      вовсе, в колонке заглушка, и красная «– : –» читалась бы как сбой. */
/* [data-st] в селекторе — не украшение, а специфичность: правила цвета счёта
   по статусу ниже весят (0,3,0) — .lb-fixture[data-st="live"] .lb-fixture__score,
   — и без атрибута здесь (0,2,0) заглушка «– : –» у идущего события красилась
   бы красным, как настоящий live-счёт. */
.lb-fixture--ev[data-st] .lb-fixture__score { color: var(--dim); }
/* Карточка событий без шапки (секция «События» на /ufc и /formula1, блок
   команд на странице события): у первой строки .lb-fixture остаётся
   border-top, а отделять её не от чего — по верху карточки шла лишняя линия. */
.home-group--flat .home-group__rows > .lb-fixture:first-child { border-top: 0; }
/* Карточка событий со своей шапкой: распорку до шеврона обычно даёт счётчик
   «N матчей» или звезда лиги, а здесь нет ни того, ни другого — счётчик
   app.js не рисует (событие не матч), звезды у снимка события быть не может. */
.home-group--ev .home-group__chev { margin-inline-start: auto; }
/* Лента одним списком по времени (кнопка «По времени», app.js): карточки лиг
   гаснут, строки съезжаются в одну карточку без шапки — и лигу каждой строке
   приходится нести самой. Марку (логотип + название) вставляет скрипт третьей
   колонкой, сразу за временем; на сервере её в строке нет и быть не должно —
   строки кешируются построчно, а название лиги и так стоит в шапке карточки. */
.home-group--time .lb-fixture {
  grid-template-columns: 18px var(--fx-timew, 76px) 148px 1fr var(--fx-scorew, 64px) 1fr 16px;
}
/* Заголовок одиночного события занимает середину строки: с новой колонкой
   середина сдвинулась на одну вправо. */
.home-group--time .lb-fixture__single { grid-column: 4 / 7; }
.lb-fixture__lg {
  display: flex;
  align-items: center;
  gap: 7px;
  min-width: 0;
  font-size: 11.5px;
  font-weight: 600;
  color: var(--muted);
}
.lb-fixture__lg img { width: 16px; height: 16px; flex: none; object-fit: contain; }
.lb-fixture__lg span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Заголовок одиночного события — по центру строки, там же, где у матча стоит
   счёт: ячейка тянется на все три средние колонки, и прижатый влево текст
   читался бы продолжением ячейки времени («21:00 Мультикаст»), а не
   названием. На телефоне (99-responsive) выравнивание левое, как у команд:
   там ячейка стоит в колонке команд, а те выровнены по левому краю. */
.lb-fixture__single {
  grid-column: 3 / 6;
  font-size: 13.5px;
  font-weight: 600;
  text-align: center;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Звезда избранного */
.lb-star {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  color: rgba(255, 255, 255, 0.45);
  flex: none;
}
.lb-star:hover { color: var(--green-soft); }
.lb-star svg { display: block; }
.lb-star svg path { fill: none; }
.lb-star.is-on { color: var(--green); }
.lb-star.is-on svg path { fill: currentColor; }

/* Флаги */
.lb-flag { width: 20px; height: 14px; border-radius: 3px; object-fit: cover; flex: none; }

/* Логотипы команд/лиг вне строк матчей */
.lb-logo-18 { width: 18px; height: 18px; object-fit: contain; flex: none; }

/* Выпадающее меню */
.lb-menu {
  position: absolute;
  z-index: 1100;
  background: var(--panel-2);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-menu);
  padding: 8px;
  display: none;
  flex-direction: column;
  gap: 2px;
  box-shadow: var(--shadow-menu);
}
.lb-menu.is-open { display: flex; }

/* Поделиться: глиф-кнопка + поповер соцсетей (шапка хиро матча, шапка
   новости; разметка — _share.html на сайте, статичная копия в макете).
   Меню всегда fixed: хиро режет absolute своим overflow: hidden
   (скругления), а позиционирует его под кнопкой и ведёт при прокрутке
   app.js — та же ветка fixed-меню data-menu-open, что у календаря
   избранного; top/right ниже — фолбэк до первого открытия. Ссылки сетей
   заполняет app.js из location.href при открытии: сервер в виджет ничего
   не пишет, поэтому он безопасен внутри кешируемых партиалов. На
   тач-устройствах вместо поповера — системная шторка navigator.share. */
.lb-share { position: relative; display: inline-flex; flex: none; }
.lb-share__btn { display: inline-flex; color: var(--muted); }
.lb-share__btn:hover { color: var(--green-pale); }
.lb-share__menu { position: fixed; top: 120px; inset-inline-end: 16px; width: 224px; padding: 6px; }
.lb-share__row {
  display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 9px 11px; border-radius: 9px;
  font-size: 13px; font-weight: 600; color: var(--ink); text-align: start;
}
.lb-share__row:hover { background: rgba(255, 255, 255, 0.05); color: var(--green-pale); }
.lb-share__row > svg { flex: none; color: var(--green-soft); }
.lb-share__vk {
  width: 16px; height: 16px; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1.5px solid currentColor; border-radius: 5px; color: var(--green-soft);
  font-size: 8px; font-weight: 800;
}
.lb-share__copy { margin-top: 4px; border-top: 1px solid var(--line-soft); border-radius: 0 0 9px 9px; padding-top: 11px; }
.lb-share__copy.is-done { color: var(--green-soft); }

/* Модальные окна */
.lb-overlay {
  position: fixed;
  inset: 0;
  background: rgba(4, 7, 3, 0.68);
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
  z-index: 1000;
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding-top: 92px;
}
.lb-overlay.is-open { display: flex; }
.lb-modal {
  width: 480px;
  background: var(--panel-modal);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-lg);
  padding: 22px 26px 24px;
  box-shadow: var(--shadow-modal);
}
.lb-modal--sm { width: 400px; }
.lb-modal__head { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
.lb-modal__title { font-family: var(--font-display); font-size: 17px; font-weight: 700; flex: 1; }
.lb-modal__x {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  color: var(--muted);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 16px;
}
.lb-modal__x:hover { color: #FFFFFF; background: rgba(255, 255, 255, 0.06); }
.lb-modal__note { font-size: 12px; color: var(--dim); font-weight: 500; }

/* ---------- Окно выбора БК (клик по коэффициенту) ----------
   Десктоп — модалка по центру, мобилка — шторка снизу (99-responsive).
   Разметка: _bk_modal.html, поведение — app.js (data-bk-*). */
/* z-index выше катфиша (999999 у рандомного класса в ad/_catfish.html): на
   телефоне шторка выезжает снизу — ровно туда, где висит баннер, и он накрывал
   нижние строки со ставками. Остальные модалки сидят на общем 1000: их
   середина экрана катфишу не мешает. */
.lb-bk-overlay { align-items: center; padding: 20px; z-index: 1000000; }
/* То же правило для ЛЮБОЙ шторки, выезжающей снизу (фильтры и календарь
   тулбара главной, _home_toolbar.html): на телефоне она встаёт ровно на место
   катфиша, и с общим 1000 баннер накрывал её нижнюю часть — кнопку
   «Применить» и последние ряды календаря. Слой тот же, что у окна БК:
   катфиш 999999, шторка на единицу выше. */
.lb-overlay--sheet { z-index: 1000000; }
.lb-bk {
  width: 520px;
  max-width: 100%;
  max-height: calc(100vh - 40px);
  display: flex;
  flex-direction: column;
  background: var(--panel-modal);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-modal);
  overflow: hidden;
  animation: lbBkIn 0.12s ease-out both;
}
@keyframes lbBkIn {
  from { opacity: 0; transform: scale(0.98); }
  to { opacity: 1; transform: none; }
}
/* Ручка шторки — мобильный элемент, на десктопе её нет. */
.lb-bk__grip { display: none; }
.lb-bk__head {
  flex: none; display: flex; align-items: flex-start; gap: 14px;
  padding: 20px 22px 16px; border-bottom: 1px solid rgba(255, 255, 255, 0.07);
}
.lb-bk__head-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.lb-bk__title { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); }
.lb-bk__sub { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12.5px; color: var(--muted); }
.lb-bk__chip {
  display: inline-flex; align-items: center; gap: 6px;
  background: rgba(88, 219, 36, 0.12); border: 1px solid rgba(88, 219, 36, 0.35);
  border-radius: 8px; padding: 3px 9px; font-size: 11.5px; color: var(--green-soft); font-weight: 700;
}
.lb-bk__chip b { color: var(--ink-strong); font-weight: 800; }
.lb-bk__x {
  flex: none; background: none; border: 0; padding: 4px; margin: -4px;
  color: var(--dim); cursor: pointer; display: inline-flex;
}
.lb-bk__x:hover { color: var(--ink); }
.lb-bk__list { flex: 1; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; padding: 10px 12px 8px; }
.lb-bk__row {
  display: flex; align-items: center; gap: 13px;
  padding: 11px 10px; border-radius: var(--r-ctl); color: var(--ink);
}
.lb-bk__row:hover { background: rgba(255, 255, 255, 0.05); color: var(--ink); }
/* Логотипы из админки — широкие вордмарки, поэтому колонка фиксированной
   ширины и картинка вписывается по высоте (как в блоке «Ставки» на матче). */
.lb-bk__logo { flex: none; width: 104px; display: inline-flex; align-items: center; }
.lb-bk__logo img { max-width: 100%; max-height: 24px; object-fit: contain; }
.lb-bk__name { flex: none; width: 104px; font-size: 14px; font-weight: 700; }
.lb-bk__bonus {
  flex: 1; min-width: 0; display: inline-flex; align-items: center; gap: 6px;
  font-size: 11.5px; font-weight: 600; color: var(--green-soft);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lb-bk__bonus svg { flex: none; }
.lb-bk__badge {
  flex: none; display: inline-flex; align-items: center;
  background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.14);
  color: var(--ink-soft); font-size: 10px; font-weight: 800; letter-spacing: 0.06em;
  text-transform: uppercase; border-radius: var(--r-pill); padding: 4px 9px;
}
.lb-bk__cta {
  flex: none; display: inline-flex; align-items: center; justify-content: center;
  background: var(--green); color: var(--on-green);
  font-size: 12.5px; font-weight: 700; border-radius: var(--r-pill); padding: 9px 18px;
}
.lb-bk__row:hover .lb-bk__cta { background: var(--green-hover); }
.lb-bk__note {
  flex: none; padding: 12px 22px 16px; border-top: 1px solid rgba(255, 255, 255, 0.07);
  font-size: 10.5px; line-height: 1.5; color: var(--dim);
}
/* Скролл страницы под окном не уезжает (позиция сохраняется — фиксируем
   только overflow, без position:fixed). */
body.lb-noscroll { overflow: hidden; }

/* Строка настройки в модалке */
.lb-setting { display: flex; align-items: center; gap: 12px; padding: 14px 0; }
.lb-setting--tight { padding: 10px 0 4px; }
.lb-setting__label { flex: 1; font-size: 13.5px; font-weight: 600; }
/* «Авто» включено — строку с выбором зоны прячем целиком: выбирать в ней
   нечего, а заблокированный серый список читается как поломка сайта. Вместо
   общей подписи под тумблером показываем ту, где названа выбранная зона:
   иначе человек не видит, по какому времени смотрит матчи.

   Правило на :has(), а не на JS, потому что состояние тумблера рисуют разные
   скрипты: на сайте класс is-active вешает local-time.js ([data-tz-auto]), в
   макете — app.js по data-switch. Браузер без :has() покажет прежнее
   поведение (строка на месте, селект disabled, подпись общая) — это
   деградация, а не поломка. По той же причине авто-подпись спрятана по
   умолчанию, а не наоборот: без :has() или без JS в ней остался бы виден
   незаполненный плейсхолдер {zone}. */
[data-tz-note="auto"] { display: none; }
.lb-modal:has(:is([data-tz-auto="on"], [data-switch="lbTzAuto"] [data-val="on"]).is-active)
  :is([data-tz-row], [data-tz-note="manual"]) { display: none; }
.lb-modal:has(:is([data-tz-auto="on"], [data-switch="lbTzAuto"] [data-val="on"]).is-active)
  [data-tz-note="auto"] { display: block; }
.lb-modal__note--divider { padding: 8px 0 16px; border-bottom: 1px solid rgba(255, 255, 255, 0.07); }
.lb-modal__actions { display: flex; justify-content: flex-end; margin-top: 18px; }
.lb-modal__actions .lb-btn { padding: 10px 26px; font-size: 13.5px; }

/* Настройки у вошедшего (html.is-authed, хендофф 22.09.2026): вместо
   заголовка — блок аккаунта (аватар, имя, «Вход через Telegram · @username»),
   под ним разделитель, в подвале слева «Выйти» напротив «Готово». Гостю —
   заголовок «Настройки» и одно «Готово», как было. Заголовок из разметки не
   уходит (он имя диалога для aria-labelledby) — прячется. Модификатор
   lb-modal--settings — чтобы правила не задели окно входа с той же шапкой. */
.lb-modal__account { display: none; align-items: center; gap: 14px; flex: 1; min-width: 0; }
.lb-modal__account-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.lb-modal__account-name { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lb-modal__account-via { display: flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 500; color: var(--muted); }
/* Имя и ник из Telegram — чужой текст неизвестного направления. На странице
   справа налево ник «@user» без изоляции печатался бы «user@»: «@» —
   нейтральный знак и прилипает к ивритской стороне строки. plaintext берёт
   направление из самого текста; слева направо ничего не меняется. */
[data-account-name],
[data-account-handle] { unicode-bidi: plaintext; }
.lb-modal__account-via svg { flex: none; color: var(--tg); }
html.is-authed .lb-modal--settings .lb-modal__title { display: none; }
html.is-authed .lb-modal--settings .lb-modal__account { display: flex; }
html.is-authed .lb-modal--settings .lb-modal__head { margin-bottom: 2px; padding-bottom: 18px; border-bottom: 1px solid rgba(255, 255, 255, 0.07); }
html.is-authed .lb-modal--settings .lb-modal__actions { justify-content: space-between; }
/* «Выйти» — и здесь, и в дровере только вошедшему; клик ловит auth.js по классу. */
.lb-auth__logout { display: none; }
html.is-authed .lb-auth__logout { display: inline-flex; }
.lb-modal__actions .lb-modal__logout { padding: 9px 16px; font-size: 13px; gap: 8px; border-color: var(--line-strong); background: transparent; color: var(--muted); }
.lb-modal__actions .lb-modal__logout:hover { border-color: rgba(255, 107, 107, 0.55); color: var(--red-live-text); }

/* Модалка входа.
   Разметка общая с мобильным экраном входа: в ней лежит топбар «назад» +
   лого. В модалке он не нужен — прячем; включает его 99-responsive на 940px.
   Сами способы входа (переключатель, шаги, панели, число сверки) — общие
   блоки с экраном /login, их стили в 14-beta.css.

   Окно выше прежнего (шаги + панель), а экран ноутбука бывает низким —
   прокручивается весь оверлей, а не обрезается нижний край окна. */
.lb-overlay--auth { overflow-y: auto; padding-top: 64px; padding-bottom: 40px; }
.lb-auth__bar { display: none; }
.lb-auth__hint { font-size: 12.5px; line-height: 1.55; color: var(--muted); margin: 0 0 16px; }
/* Заметка «добавлять в избранное можно только после входа». Появляется только
   когда модалку открыла звезда гостя (app.js снимает hidden). Акцентная
   плашка, а не красная: это приглашение войти, а не ошибка человека.
   Цвет текста — обычный ink, а не muted у соседней подсказки: эту строку
   человек не искал, и она должна читаться первой. */
.lb-auth__limit {
  font-size: 12.5px;
  line-height: 1.55;
  color: var(--ink);
  margin: 0 0 14px;
  padding: 10px 12px;
  background: rgba(88, 219, 36, 0.07);
  border: 1px solid rgba(88, 219, 36, 0.22);
  border-radius: 10px;
}

/* Имя бота внутри подсказки — ссылка в чат с ним. Зелёным и жирным: ник должен
   читаться одним словом, иначе @lblauth1_bot растворяется в приглушённой строке
   и человек ищет его глазами. Тем же классом размечено имя бота на калитке входа
   — ссылку в фразу подставляет tLink (render/i18nfuncs.go), и класс общий
   специально, чтобы два экрана одного и того же входа не разошлись. */
.lb-botlink { color: var(--green); font-weight: 700; }
.lb-botlink:hover { color: var(--green-soft); }
/* Строка ошибки входа (истёк код, «это не я» в боте, перебор кодов). Ставит
   её auth.js; ожидание подтверждения показывает плашка в панели Telegram. */
.lb-auth__status { font-size: 12px; line-height: 1.5; color: var(--muted); margin: 12px 0 0; text-align: center; }
.lb-auth__status.is-error { color: var(--red-live-text); }
.lb-auth__status a { color: var(--green); text-decoration: underline; }

/* Тумблер Вкл/Выкл */
.lb-switch {
  display: inline-flex;
  background: var(--field);
  border: 1px solid var(--line-strong);
  border-radius: 10px;
  padding: 3px;
  gap: 2px;
}
.lb-switch button {
  border-radius: 8px;
  padding: 5px 14px;
  font-size: 12px;
  font-weight: 600;
  color: var(--muted);
}
.lb-switch button.is-active {
  background: var(--green);
  color: var(--on-green);
  font-weight: 700;
}
.lb-switch--sm button { padding: 5px 12px; font-size: 11.5px; }

/* ---------- Тумблер (lb-toggle) ----------
   Переключатель вкл/выкл из хендоффа «блок с сортировками» (05.09.2026): трек
   с кнобом, включённый — зелёный. Состояние живёт СНАРУЖИ: is-active на
   родителе (кнопка «Только с трансляцией» в тулбаре главной) либо :checked у
   соседнего чекбокса (шторка фильтров на телефоне) — самому тумблеру класс
   не нужен, и обе разметки красятся одним правилом. Не путать с .lb-switch:
   тот — сегмент Вкл/Выкл с подписями в настройках. */
.lb-toggle {
  position: relative;
  display: inline-block;
  flex: none;
  vertical-align: middle;
  width: 34px;
  height: 20px;
  border-radius: var(--r-pill);
  background: rgba(255, 255, 255, 0.14);
  transition: background .15s;
}
.lb-toggle__knob {
  position: absolute;
  top: 2px;
  inset-inline-start: 2px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: #9AA694;
  transition: left .15s, background .15s;
}
.is-active > .lb-toggle, input:checked + .lb-toggle { background: var(--green); }
.is-active > .lb-toggle .lb-toggle__knob, input:checked + .lb-toggle .lb-toggle__knob { inset-inline-start: calc(100% - 18px); background: var(--on-green); }
/* Крупный (44×26) — строка шторки на телефоне, где тач-таргет важнее места. */
.lb-toggle--lg { width: 44px; height: 26px; }
.lb-toggle--lg .lb-toggle__knob { top: 3px; inset-inline-start: 3px; width: 20px; height: 20px; }
.is-active > .lb-toggle--lg .lb-toggle__knob, input:checked + .lb-toggle--lg .lb-toggle__knob { inset-inline-start: calc(100% - 23px); }

/* Селект в модалке */
.lb-select { position: relative; display: inline-flex; }
.lb-select select {
  appearance: none;
  background: var(--field);
  border: 1px solid var(--line-strong);
  border-radius: 10px;
  padding-block: 10px; padding-inline: 12px 32px;
  font-size: 13px;
  width: 225px;
  outline: none;
  cursor: pointer;
}
.lb-select svg {
  position: absolute;
  inset-inline-end: 12px;
  top: 50%;
  transform: translateY(-50%);
  pointer-events: none;
}

/* Кнопка соцвхода */
.lb-social {
  display: flex;
  align-items: center;
  gap: 12px;
  background: var(--bg);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-ctl);
  padding: 11px 14px;
  font-size: 13.5px;
  font-weight: 700;
  color: var(--ink);
  text-align: start;
  width: 100%;
}
.lb-social__ico {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  font-size: 9.5px;
  font-weight: 800;
  color: #FFFFFF;
}
.lb-social--tg:hover { border-color: rgba(42, 171, 238, 0.7); background: rgba(42, 171, 238, 0.07); }
.lb-social--tg .lb-social__ico { background: var(--tg); }

/* Обёртка слайдера: остался только контекст позиционирования для стрелок
   разделов (.ufc-sec__nav на витрине UFC). Общего .lb-slider__arrow больше
   нет — его последняя разметка (стрелки «Топ лиг» в хоккее и баскетболе)
   убрана, ряд там прокручивается пальцем, как везде на сайте. */
.lb-slider { position: relative; }

/* Футер */
/* margin-top: auto — прибивка к низу вьюпорта (см. флекс-колонку body в §2):
   на заполненной странице свободного места нет и auto равен нулю, отступ
   сверху по-прежнему даёт паддинг СЕО-блока, как в макете. В макете
   флекс-ребёнок body — веб-компонент <lb-footer> (components.js), поэтому
   auto нужен и ему; у вложенного .lb-footer внутри обычного блока auto
   схлопывается в 0 и не мешает. */
lb-footer { margin-top: auto; }
.lb-footer { margin-top: auto; border-top: 1px solid rgba(255, 255, 255, 0.07); }
.lb-footer__inner { width: 1140px; margin: 0 auto; padding: 26px 0 34px; }
.lb-footer__row { display: flex; align-items: center; justify-content: space-between; gap: 20px; }
.lb-footer__logo { height: 20px; opacity: 0.85; }
.lb-footer__links { display: flex; align-items: center; gap: 22px; }
.lb-footer__links a { font-size: 13px; color: var(--muted); }
.lb-footer__links a:hover { color: var(--green-pale); }
.lb-footer__links a.is-active { color: var(--green-pale); font-weight: 700; }
.lb-footer__copy { margin-top: 16px; font-size: 12px; color: var(--dim); }

/* ---------- 5. Мобильные общие компоненты ---------- */

/* Топбар */
.m-topbar {
  flex: none;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 16px 12px;
  background: var(--bg-header);
  border-bottom: 1px solid var(--line-soft);
  position: sticky;
  top: 0;
  z-index: 100;
}
.m-topbar__logo { height: 22px; display: block; }
.m-iconbtn {
  position: relative;
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: var(--panel);
  border: 1px solid var(--line-ctl);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--ink-soft);
  flex: none;
  padding: 0;
}
.m-iconbtn--push { margin-inline-start: auto; }
.m-iconbtn .lb-badge { top: -3px; inset-inline-end: -3px; }

/* Чип вида спорта */
.m-chip {
  flex: none;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: var(--panel);
  border: 1px solid var(--line-strong);
  color: #DFE5DB;
  font-size: 12.5px;
  font-weight: 600;
  border-radius: var(--r-pill);
  padding: 9px 15px;
}
.m-chip.is-active {
  background: rgba(88, 219, 36, 0.14);
  border-color: rgba(88, 219, 36, 0.45);
  color: var(--green-soft);
  font-weight: 700;
}
/* Дровер — полноэкранное меню (как в макете) */
@keyframes mDrawerIn {
  from { opacity: 0; transform: translateY(6px); }
  to { opacity: 1; transform: none; }
}
.m-drawer { display: none; }
.m-drawer.is-open { display: block; }
/* z-index выше катфиша (999999 у рандомного класса в ad/_catfish.html) — тот
   же слой, что у шторок и окна БК: меню во весь экран, и с общим 1000 баннер
   висел поверх его низа (кнопка Telegram-канала, копирайт). Делить слой не с
   кем: окно входа, открытое из меню, само его закрывает (app.js). */
.m-drawer__panel {
  position: fixed;
  inset: 0;
  z-index: 1000000;
  background: var(--bg-header);
  display: flex;
  flex-direction: column;
  animation: mDrawerIn 0.22s ease-out both;
}
.m-drawer__body { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 16px 24px; }
.m-drawer__link {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 17px 2px;
  border-bottom: 1px solid var(--line-soft);
  color: var(--ink);
}
.m-drawer__link.is-active { color: var(--green-soft); }
.m-drawer__link-name { font-family: var(--font-display); font-size: 15px; font-weight: 700; flex: 1; }
/* Счётчик избранного в дровере — обычная пилюля в строке. Базовый .lb-badge
   абсолютный (он «прилипает» к звезде в шапке), внутри строки меню это
   выносило его за правый край. */
.m-drawer__link .lb-badge { position: static; top: auto; inset-inline-end: auto; }
.m-drawer__arrow { color: var(--dim); }
.m-drawer__caption {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--dim);
  margin: 22px 2px 10px;
}
.m-drawer__chips { display: flex; flex-wrap: wrap; gap: 8px; }
.m-drawer__svc {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 13px 2px;
  border-bottom: 1px solid var(--line-soft);
  color: var(--ink);
  font-size: 13.5px;
  font-weight: 600;
  text-align: start;
}
.m-drawer__svc:hover { color: var(--ink); }
.m-drawer__svc--row { padding: 10px 2px; }
.m-drawer__svc .u-grow { font-size: 13.5px; font-weight: 600; }
.m-drawer__val { font-size: 12px; font-weight: 600; color: var(--green-soft); }
/* Строка настройки с выбором (часовой пояс, язык): подпись слева, текущее
   значение справа, шеврон. Нативный <select> — на телефоне это системный
   пикер, что ближе к макету, чем самодельный список.

   Шеврон рисует САМ селект фоном, а не отдельная иконка рядом: иконка лежала
   вне поля, и тап по ней попадал в <label> — тот селект только фокусирует, но
   не раскрывает. Заодно селект растянут на всю правую часть строки, поэтому
   попасть в него легко пальцем. */
.m-drawer__svc--pick { cursor: pointer; }
.m-drawer__val { flex: 1; min-width: 0; text-align: end; }
.m-drawer__val select {
  appearance: none; -webkit-appearance: none;
  width: 100%; padding-block: 0; padding-inline: 0 16px; border: 0;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%239DA898' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right center;
  font: inherit; color: inherit; text-align: end;
  text-overflow: ellipsis; cursor: pointer;
}
/* Шеврон-фон стоит у конца строки: справа налево — слева. */
[dir="rtl"] .m-drawer__val select { background-position: left center; }
.m-drawer__val select:disabled { opacity: 1; }
/* Своих правил :focus в проекте не было, и браузер рисовал по строке настройки
   собственное кольцо (у заказчика — жёлтое). Для мыши и тапа гасим, для
   клавиатуры оставляем — но уже брендовое. */
.m-drawer__val select:focus { outline: none; }
.m-drawer__val select:focus-visible { outline: 2px solid var(--hover-green-line); outline-offset: 3px; border-radius: 6px; }
.m-drawer__cta { display: flex; margin-top: 10px; font-size: 13px; padding: 12px 18px; width: 100%; /* кнопки сами не растягиваются flex-ом, в отличие от ссылок */ }
.m-drawer__cta:first-of-type { margin-top: 22px; }

/* Строка аккаунта — первая в меню, под топбаром (хендофф 22.09.2026, вместо
   зелёной «Войти в LiveBall» внизу). Гостю вся строка — кнопка входа:
   пунктирный аватар, «Войти», подсказка про синхронизацию, стрелка.
   Вошедшему — аватар-инициал, имя, «Telegram · @username» и кнопка «Выйти»;
   сама строка не нажимается (auth.js снимает data-modal-open), настройки —
   строками в «Сервисе». Обе подписи лежат рядом, показывает нужную
   html.is-authed. */
.m-drawer__account { display: flex; align-items: center; gap: 12px; padding: 14px 2px; border-bottom: 1px solid var(--line-soft); }
.m-drawer__account-main {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 12px;
  background: none;
  border: 0;
  padding: 0;
  color: var(--ink);
  text-align: start;
  font: inherit;
  cursor: pointer;
}
html.is-authed .m-drawer__account-main { cursor: default; }
html.is-authed .m-drawer__account-main .m-drawer__arrow { display: none; }
.m-drawer__account-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.m-drawer__account-name { font-family: var(--font-display); font-size: 14px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.m-drawer__account-sub { font-size: 12px; line-height: 1.4; font-weight: 500; color: var(--muted); }
.m-drawer__account-tg { display: none; align-items: center; gap: 5px; }
.m-drawer__account-tg svg { flex: none; width: 11px; height: 11px; color: var(--tg); }
html.is-authed .m-drawer__account-guest { display: none; }
html.is-authed .m-drawer__account-tg { display: inline-flex; }
.m-drawer__account .lb-auth__logout { flex: none; padding: 7px 13px; font-size: 12.5px; color: var(--muted); background: transparent; }
/* ---------- Мобильное окно поиска (m-search) ----------
   Отдельный полноэкранный экран из мобильного макета (handoff «Моб Поиск»):
   шапка с полем и «Отменой», ниже либо пустой экран (история + топ-блоки +
   подсказка), либо выдача группами. Поля поиска в меню нет — в макете его там
   тоже нет. Показывается только на мобилке (правило в 99-responsive).
   Разметка — _header.html, поведение — public/js/v2/search.js. */
.m-search {
  /* 1000 — как у дровера и модалок: рекламный брендос сидит на 999 и иначе
     перекрывает строку поиска сверху. */
  position: fixed; inset: 0; z-index: 1000;
  display: none; flex-direction: column;
  background: var(--bg);
}
.m-search[hidden] { display: none; }
.m-search__bar {
  flex: none; display: flex; align-items: center; gap: 12px;
  padding: 14px 16px 12px; background: var(--bg-header);
  border-bottom: 1px solid var(--line-soft);
}
/* Поле экрана поиска — своё, а не .lb-search из шапки: оно всегда «в фокусе»
   (зелёная рамка со свечением), потому что экран для того и открыт. */
.m-search__field {
  flex: 1; min-width: 0; display: flex; align-items: center; gap: 10px;
  background: var(--panel); border: 1px solid rgba(88, 219, 36, 0.55);
  box-shadow: 0 0 0 3px rgba(88, 219, 36, 0.1);
  border-radius: var(--r-pill); padding: 10px 14px;
}
.m-search__field > svg { flex: none; }
.m-search__field input {
  flex: 1; min-width: 0; padding: 0;
  background: transparent; border: 0; outline: none;
  font-family: inherit; font-size: 13.5px; font-weight: 600;
  color: var(--ink); caret-color: var(--green);
}
.m-search__field input::placeholder { color: var(--dim); font-weight: 500; }
.m-search__cancel {
  flex: none; background: none; border: 0; padding: 0; font-family: inherit;
  font-size: 13px; font-weight: 700; color: var(--green-soft); cursor: pointer;
}
.m-search__clear {
  flex: none; display: inline-flex; align-items: center; justify-content: center;
  width: 17px; height: 17px; border-radius: 50%; padding: 0;
  background: var(--dim); border: 0; color: var(--bg); cursor: pointer;
}
.m-search__clear[hidden] { display: none; }
/* Фильтры выдачи: строка чипов с горизонтальным скроллом. Скрыта, пока в
   ответе одна группа (см. _header.html). */
.m-search__filters {
  flex: none; display: flex; gap: 7px; overflow-x: auto;
  padding: 12px 16px; border-bottom: 1px solid var(--line-soft);
}
.m-search__filters[hidden] { display: none; }
.m-search__filter {
  flex: none; display: flex; align-items: center; gap: 6px;
  border-radius: var(--r-pill); padding: 7px 13px;
  background: var(--panel); border: 1px solid rgba(255, 255, 255, 0.1);
  font-family: inherit; font-size: 12px; font-weight: 700; color: var(--muted);
  cursor: pointer;
}
.m-search__filter span { font-size: 10.5px; opacity: 0.65; }
.m-search__filter.is-active { background: var(--green); border-color: var(--green); color: var(--on-green); }
.m-search__body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 16px 24px; }
.m-search__block, .m-search__group { margin-top: 18px; }
.m-search__block[hidden] { display: none; }
/* Появление группы выдачи — как в макете: 8px снизу вверх за 0.22s. */
.m-search__group { animation: mSearchUp 0.22s ease both; }
@keyframes mSearchUp {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}
.m-search__cap {
  display: flex; align-items: center; gap: 10px; margin: 0 2px 9px;
  font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--dim);
}
.m-search__capbtn {
  background: none; border: 0; padding: 0; font-family: inherit;
  font-size: 11.5px; font-weight: 600; letter-spacing: 0; text-transform: none;
  color: var(--dim); cursor: pointer;
}
.m-search__capbtn:hover { color: var(--green-soft); }
/* История поиска: строки без карточки, разделитель тоньше общего --line-soft. */
.m-search__recent { display: flex; flex-direction: column; }
.m-search__recent-item {
  display: flex; align-items: center; gap: 11px; width: 100%;
  padding: 11px 2px; background: none; border: 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.05);
  font-family: inherit; font-size: 13.5px; color: var(--ink);
  text-align: start; cursor: pointer;
}
.m-search__recent-item > span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.m-search__recent-item > svg { flex: none; color: var(--dim); }
.m-search__recent-item:hover { color: var(--ink-strong); }
/* Крестик 26px — хит-таргет из макета, уменьшать нельзя: рядом кликабельна
   вся строка, и промах по крестику откроет команду вместо удаления. */
.m-search__recent-rm {
  flex: none; width: 26px; height: 26px;
  display: inline-flex; align-items: center; justify-content: center;
  background: none; border: 0; padding: 0; color: var(--faint); cursor: pointer;
}
.m-search__recent-rm:hover { color: var(--muted); }
/* Карточка со строками — одна и та же у топ-блоков и у выдачи. */
.m-search__card {
  background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--r-card); overflow: hidden;
}
.m-search__row { display: flex; align-items: center; gap: 12px; padding: 12px 14px; color: var(--ink); }
.m-search__row + .m-search__row { border-top: 1px solid var(--line-soft); }
.m-search__row:hover { background: rgba(255, 255, 255, 0.03); }
.m-search__row-logo {
  width: 24px; height: 24px; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
}
.m-search__row-logo img { max-width: 100%; max-height: 100%; object-fit: contain; }
.m-search__row-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.m-search__row-name { font-size: 13.5px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Подсветка совпадения: <b> внутри имени — только цвет, вес уже 700. */
.m-search__row-name b { color: var(--green-soft); font-weight: inherit; }
.m-search__row-sub { font-size: 11px; color: var(--dim); }
.m-search__row-arrow { flex: none; color: var(--dim); }
.m-search__hint { margin: 20px 2px 26px; font-size: 11.5px; line-height: 1.6; color: var(--faint); text-align: center; }
/* Экран без выдачи: «начните вводить» и «ничего не нашлось». */
.m-search__state {
  display: flex; flex-direction: column; align-items: center; gap: 9px;
  padding: 72px 18px; text-align: center;
}
.m-search__state[hidden] { display: none; }
.m-search__state-title { font-size: 14px; font-weight: 700; color: var(--ink); }
.m-search__state-sub { font-size: 12px; line-height: 1.55; color: var(--dim); }
.m-search__reset {
  margin-top: 6px; background: var(--panel);
  border: 1px solid rgba(255, 255, 255, 0.14); border-radius: var(--r-pill);
  padding: 9px 17px; font-family: inherit; font-size: 12.5px; font-weight: 700;
  color: var(--ink); cursor: pointer;
}
.m-search__reset:hover { border-color: rgba(88, 219, 36, 0.55); color: var(--ink-strong); }
.m-drawer__copy { margin-top: 16px; font-size: 11px; color: var(--dim); text-align: center; }

/* ---------- 6. Страничные секции ---------- */

/* --- Сервисные страницы: О нас, Правообладателям, Реклама (doc-) --- */
.doc-section { width: 960px; margin: 0 auto; padding: 44px 0 24px; }
.doc-section--narrow { width: 760px; }
/* Во всю ширину контента, как у остальных страниц сайта (Реклама,
   Правообладателям). Ниже 1180px все doc-секции и так резиновые — блок
   @media в 99-responsive перебивает эту ширину, — так что модификатор
   работает на широком десктопе. */
.doc-section--wide { width: 1140px; }
.doc-kicker { margin-bottom: 14px; }
.doc-title { font-size: 30px; }  /* ограничение ширины — только у hero «О нас» (см. ниже) */
.doc-lead { font-size: 15px; line-height: 1.7; color: var(--ink-soft); margin: 18px 0 0; max-width: 720px; }
/* Узкие сервисные страницы (Правообладателям): лид на всю ширину, CTA ближе (как в макете) */
.doc-section--narrow .doc-lead { max-width: none; }
.doc-section--narrow .doc-cta { margin-top: 20px; }
/* На широкой странице лид не растягиваем до края: 900px — предел читаемой
   строки, дальше абзац рассыпается. CTA прижимаем так же, как у узких. */
.doc-section--wide .doc-lead { max-width: 900px; }
.doc-section--wide .doc-cta { margin-top: 20px; }

/* Карточка-хиро с зелёным свечением (О нас) */
.doc-hero {
  position: relative;
  overflow: hidden;
  padding: 40px 44px 44px;
}
.doc-hero::before {
  content: '';
  position: absolute;
  inset-inline-end: -80px;
  top: -120px;
  width: 480px;
  height: 340px;
  background: radial-gradient(closest-side, rgba(88, 219, 36, 0.16), transparent 72%);
  pointer-events: none;
}
.doc-hero > * { position: relative; }
.doc-hero .doc-title { font-size: 32px; max-width: 640px; }
.doc-hero .doc-lead { max-width: 640px; }

/* Сетка цифр */
.doc-stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
  margin-top: 20px;
}
.doc-stats--push { margin-top: 28px; }
.doc-stat { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-card); padding: 20px; }
.doc-stat__value { font-family: var(--font-display); font-size: 24px; font-weight: 700; color: var(--green); }
.doc-stat__label { font-size: 12.5px; font-weight: 600; color: var(--muted); margin-top: 6px; }

/* Блок «Как это работает» / форматы */
.doc-block { margin-top: 36px; }
.doc-block > .lb-h2 { margin-bottom: 14px; }
.doc-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.doc-card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-card); padding: 22px; }
.doc-card__num { font-family: var(--font-display); font-size: 13px; font-weight: 700; color: var(--green); }
.doc-card__title { font-size: 15px; font-weight: 800; color: var(--ink-strong); }
.doc-card__num + .doc-card__title { margin-top: 10px; }
.doc-card__text { font-size: 13.5px; line-height: 1.6; color: var(--muted); margin-top: 8px; }

/* Нумерованные пункты (Правообладателям) */
.doc-steps { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 26px; margin-top: 28px; }
.doc-steps > .lb-h3 { font-size: 16px; margin-bottom: 6px; }
.doc-step { display: flex; gap: 14px; padding: 14px 0; border-bottom: 1px solid var(--line-soft); }
.doc-step:last-child { border-bottom: none; }
.doc-step__num { font-family: var(--font-display); font-size: 13px; font-weight: 700; color: var(--green); flex: none; width: 24px; }
.doc-step__text { font-size: 14px; line-height: 1.6; color: #DFE5DB; }
.doc-step__text strong { font-weight: 700; color: var(--ink-strong); }

/* CTA-баннер с почтой */
.doc-cta {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 20px;
  align-items: center;
  border-radius: var(--r-lg);
  padding: 24px 26px;
  margin-top: 28px;
  background: linear-gradient(160deg, rgba(88, 219, 36, 0.16), rgba(88, 219, 36, 0.04)), var(--panel);
  border: 1px solid var(--line-green);
}
.doc-cta__title { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); }
.doc-cta__text { font-size: 13px; line-height: 1.6; color: var(--ink-soft); margin-top: 6px; }
.doc-cta .lb-btn { padding: 12px 24px; }

/* ===== partials/10-home.css ===== */
/* --- Главная (home-) --- */

/* Сайдбар: карточки-списки */
.home-side { padding: 8px; }
.home-side__head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 12px 8px;
}
.home-side__title { font-family: var(--font-display); font-size: 13.5px; font-weight: 700; color: var(--ink-strong); }

/* Поиск по странам в карточке сайдбара (разметка — _right_menu.html, контрол —
   .lb-find в 00-core, поведение — app.js). Фон --bg, а не --panel: карточка
   вокруг сама --panel, и поле на её фоне пропало бы. Отступы плотные — строка
   сайдбара 13.5px, поле не должно быть заметно выше неё. */
.home-side__search { margin: 0 4px 6px; padding: 8px 12px; background: var(--bg); }
/* «Ничего не нашлось» — строка внутри списка стран, показывает её фильтр. */
.home-side__empty { padding: 8px 12px 10px; font-size: 12.5px; font-weight: 500; color: var(--dim); }

/* Строка-ссылка в сайдбаре (лига или страна) */
.home-nav {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 12px;
  border-radius: var(--r-row);
  color: #DFE5DB;
  font-size: 13.5px;
  font-weight: 600;
}
.home-nav:hover { background: rgba(255, 255, 255, 0.04); color: #DFE5DB; }
.home-nav__ico { width: 22px; height: 22px; flex: none; display: inline-flex; }
.home-nav__ico img { width: 22px; height: 22px; object-fit: contain; }
/* Центрирование нужно нефлаговым иконкам (глобус «Мира» 14x14 в слоте 20x14);
   флаги-картинки заполняют слот целиком и центрирования не замечают. */
.home-nav__flag { width: 20px; height: 14px; flex: none; display: inline-flex; align-items: center; justify-content: center; }
.home-nav__name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.home-nav__chev { display: inline-flex; color: var(--dim); transition: transform 0.2s; }
/* Стрелка строки «Топ турниров» — только в мобильном макете (17-leagues). */
.home-nav__arrow { display: none; }

/* Сворачиваемая страна */
.home-country > .home-nav { cursor: pointer; }
.home-country__sub { display: none; flex-direction: column; padding-block: 0 6px; padding-inline: 42px 12px; }
.home-country.is-open .home-country__sub { display: flex; }
.home-country.is-open .home-nav__chev { transform: rotate(180deg); }
.home-country__sub a { font-size: 13px; font-weight: 500; color: var(--muted); padding: 6px 0; }
.home-country__sub a:hover { color: var(--green-pale); }

/* CTA-блок Telegram в сайдбаре */
.home-cta {
  border-radius: var(--r-card);
  padding: 20px;
  background: linear-gradient(160deg, rgba(88, 219, 36, 0.16), rgba(88, 219, 36, 0.04)), var(--panel);
  border: 1px solid var(--line-green);
}
.home-cta__title { font-family: var(--font-display); font-size: 14.5px; font-weight: 700; color: var(--ink-strong); line-height: 1.4; }
.home-cta__text { font-size: 12.5px; line-height: 1.55; color: var(--ink-soft); margin-top: 6px; }
.home-cta__btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  margin-top: 14px;
  background: var(--green);
  color: var(--on-green);
  font-weight: 700;
  font-size: 13.5px;
  border-radius: var(--r-pill);
  padding: 11px 18px;
}
.home-cta__btn:hover { background: var(--green-hover); color: var(--on-green); }

/* Хиро топ-матча */
.home-hero {
  display: block;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
  color: var(--ink);
}
.home-hero__head {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--line-soft);
}
.home-hero__badge {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: var(--green);
  color: var(--on-green);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  border-radius: var(--r-pill);
  padding: 6px 13px;
}
.home-hero__league-logo { width: 20px; height: 20px; object-fit: contain; }
.home-hero__league { font-size: 13px; font-weight: 600; color: var(--muted); }
.home-hero__when { margin-inline-start: auto; font-size: 13px; font-weight: 700; color: var(--ink); }
.home-hero__star { position: relative; z-index: 2; }
.home-hero__body { position: relative; overflow: hidden; }
.home-hero__glow {
  position: absolute;
  top: -100px;
  width: 380px;
  height: 320px;
  pointer-events: none;
}
.home-hero__glow--l { inset-inline-start: -120px; background: radial-gradient(closest-side, rgba(245, 247, 243, 0.13), transparent 72%); }
.home-hero__glow--r { inset-inline-end: -120px; background: radial-gradient(closest-side, rgba(116, 172, 223, 0.2), transparent 72%); }
.home-hero__grid {
  position: relative;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: 0 20px;
  align-items: start;
  padding: 30px 40px 24px;
}
/* команды занимают оба ряда; коэффициенты — второй ряд центральной колонки */
.home-hero__grid > .home-hero__team { grid-row: 1 / 3; }
.home-hero__center { grid-column: 2; grid-row: 1; }
.home-hero:hover { color: var(--ink); }  /* имена команд не должны зеленеть от a:hover */
.home-hero__team { display: flex; flex-direction: column; align-items: center; gap: 12px; min-width: 0; }
/* Без круглой подложки и рамки — только сам логотип (contain, чтобы не резать). */
.home-hero__team img { width: 76px; height: 76px; object-fit: contain; }
.home-hero__team-name { font-family: var(--font-display); font-size: 17px; font-weight: 700; color: var(--ink-strong); }
.home-hero__label--mobile { display: none; }  /* «Сегодня · 22:00» над таймером — только мобилка */
.home-hero__center { text-align: center; min-width: 220px; }
/* Live-состояние хиро — красная пилюля в дизайне live-бейджа макета
   (.sm-player__live: тёмная подложка, красная рамка и текст). display не
   трогаем: показ/скрытие --desktop/--mobile версий делает адаптив правилами
   меньшей специфичности; fit-content + auto-маргины дают пилюле ширину по
   содержимому в текстоцентрированной колонке. Счёт остаётся обычным. */
/* Без пилюли: на тёмной панели и подложка читалась «обводкой» — остался
   только красный текст с мигающей точкой над счётом. */
.home-hero__label.is-live {
  width: fit-content;
  /* 2px вниз без сдвига счёта: верхний маргин прибавлен, нижний убавлен */
  margin: 2px auto 10px;
  color: var(--red-live-text);
  font-weight: 800;
}
/* Точка — span с width/height: в блочном лейбле без inline-block размеры
   игнорируются и точка невидима (в строках матчей её спасает inline-flex
   родителя). Анимация мигания приходит из .lb-live-dot (lbPulse). */
.home-hero__label.is-live .lb-live-dot { display: inline-block; vertical-align: middle; margin-block: -1px 0; margin-inline: 0 3px; }
.home-hero__label {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--dim);
  margin-bottom: 10px;
}
.home-hero__timer {
  font-family: var(--font-display);
  font-size: 40px;
  font-weight: 700;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.03em;
  color: var(--ink-strong);
}
.home-hero__odds { grid-column: 2; grid-row: 2; align-self: start; display: flex; justify-content: center; gap: 8px; margin-top: 14px; }
.home-odd {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: rgba(88, 219, 36, 0.1);
  border: 1px solid rgba(88, 219, 36, 0.4);
  border-radius: var(--r-row);
  padding: 8px 16px;
  font-size: 13px;
  cursor: pointer;   /* кэф открывает окно выбора БК (app.js) */
}
.home-odd:hover { border-color: var(--green); background: rgba(88, 219, 36, 0.16); }
/* Нажатый исход остаётся подсвеченным под оверлеем — видно, за что ставим. */
.home-odd.is-active { background: rgba(88, 219, 36, 0.16); border-color: var(--green); }
.home-odd__k { color: var(--green-soft); font-weight: 700; }
.home-odd__v { font-weight: 800; color: var(--ink-strong); }

/* Топ-5 лиг */
.home-leagues__rows { display: flex; flex-direction: column; gap: 16px; }
.home-leagues__row { display: flex; gap: 16px; }
/* Стрелок у «Топ-5» нет ни на одном брейкпоинте (просьба заказчика): десктоп —
   статичная сетка 2+3, мобилка листается пальцем. Кнопок нет и в разметке. */
.home-lc {
  flex: 1;
  height: 150px;
  border-radius: var(--r-xl);
  overflow: hidden;
  position: relative;
  display: block;
}
/* Hover — подсветка всей карточки, как у «Топ лиг» хоккея/баскетбола
   (.sm-lc:hover из хендофф-сниппета top-ligi-basketball): один блок в трёх
   разделах не должен вести себя по-разному. */
.home-lc:hover { filter: brightness(1.08); }
.home-lc__wm {
  position: absolute;
  background: #FFFFFF;
  mask-repeat: no-repeat;
  -webkit-mask-repeat: no-repeat;
  mask-size: contain;
  -webkit-mask-size: contain;
  pointer-events: none;
}
.home-lc__photo {
  position: absolute;
  /* height: auto — высота идёт от ширины по натуральным пропорциям (боксы в
     макете совпадали с ними один в один), поэтому при сужении карточки
     футболист ужимается целиком, а не уезжает за правый край. */
  height: auto;
  object-fit: contain;
  filter: drop-shadow(0 8px 18px rgba(0, 0, 0, 0.35));
}
.home-lc__country {
  position: absolute;
  inset-inline-start: 18px;
  top: 16px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.85);
}
.home-lc__country img { height: 11px; border-radius: 2px; }
.home-lc__name {
  position: absolute;
  inset-inline-start: 18px;
  bottom: 46px;
  font-family: var(--font-display);
  font-size: 18px;
  font-weight: 700;
  color: #FFFFFF;
}
.home-lc__cta {
  position: absolute;
  inset-inline-start: 18px;
  bottom: 16px;
  font-size: 12.5px;
  font-weight: 700;
  color: #FFFFFF;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.55);
}
/* Малые карточки (второй ряд) — меньше шрифт названия/отступы */
.home-lc--sm .home-lc__country { inset-inline-start: 16px; top: 14px; gap: 6px; }
.home-lc--sm .home-lc__name { inset-inline-start: 16px; bottom: 44px; font-size: 15px; }
.home-lc--sm .home-lc__cta { inset-inline-start: 16px; bottom: 15px; font-size: 12px; }

/* Позиции фона/вотермарки/фото по лигам.
   Карточки резиновые (flex: 1), поэтому арт привязан к ПРАВОМУ краю, а ширины
   заданы в % от карточки: раньше left/width в px были посчитаны под макетную
   ширину, и при сужении экрана футболисты уезжали за правый край под overflow.
   Проценты пересчитаны из макета: большие карточки 420px, малые — 275px.

   По вертикали фото стоит на дне карточки (bottom: 0) и опущено ниже неё
   через translateY в % ОТ СВОЕЙ высоты — так вынос под нижнюю грань ужимается
   вместе с фото, и футболист всегда срезан низом карточки, а не висит над ней.
   Вотермаркам height задаёт aspect-ratio (span без контента), фото — height:auto. */
.home-lc--epl { background: #38003C; }
.home-lc--epl .home-lc__wm { inset-inline-end: 32.14%; top: 0; width: 32.14%; aspect-ratio: 135 / 150; opacity: 0.1; mask-image: url(/public/img/v2/wm/epl.svg); -webkit-mask-image: url(/public/img/v2/wm/epl.svg); }
.home-lc--epl .home-lc__photo { width: 40.71%; inset-inline-end: 1.19%; bottom: 0; transform: translateY(30.63%); }

.home-lc--laliga { background: #FF4B44; }
.home-lc--laliga .home-lc__country { color: rgba(255, 255, 255, 0.85); }
.home-lc--laliga .home-lc__wm { inset-inline-end: 26.19%; top: -8px; width: 45.24%; aspect-ratio: 190 / 170; opacity: 0.12; mask-image: url(/public/img/v2/wm/laliga.svg); -webkit-mask-image: url(/public/img/v2/wm/laliga.svg); }
.home-lc--laliga .home-lc__photo { width: 46.67%; inset-inline-end: -2.62%; bottom: 0; transform: translateY(34.76%); }

.home-lc--bundesliga { background: #DD3E4C; }
.home-lc--bundesliga .home-lc__wm { inset-inline-end: 7.27%; top: 3px; width: 70.91%; aspect-ratio: 195 / 147; opacity: 0.11; mask-image: url(/public/img/v2/wm/bundesliga.svg); -webkit-mask-image: url(/public/img/v2/wm/bundesliga.svg); }
.home-lc--bundesliga .home-lc__photo { width: 65.09%; inset-inline-end: -6.55%; bottom: 0; transform: translateY(17.88%); }

.home-lc--ligue1 { background: #1C3869; }
.home-lc--ligue1 .home-lc__wm { inset-inline-end: 7.64%; top: -20px; width: 74.18%; aspect-ratio: 204 / 191; opacity: 0.08; mask-image: url(/public/img/v2/wm/ligue1.svg); -webkit-mask-image: url(/public/img/v2/wm/ligue1.svg); }
.home-lc--ligue1 .home-lc__photo { width: 73.45%; inset-inline-end: -5.82%; bottom: 0; transform: translateY(25.74%); }

.home-lc--seriea { background: #49B2D3; }
.home-lc--seriea .home-lc__country { color: rgba(255, 255, 255, 0.9); text-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); }
.home-lc--seriea .home-lc__name { text-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); }
.home-lc--seriea .home-lc__wm { inset-inline-end: 25.45%; top: 8px; width: 54.55%; aspect-ratio: 150 / 134; opacity: 0.14; mask-image: url(/public/img/v2/wm/seriea.svg); -webkit-mask-image: url(/public/img/v2/wm/seriea.svg); }
.home-lc--seriea .home-lc__photo { width: 62.55%; inset-inline-end: -6.55%; bottom: 0; transform: translateY(12.21%); }

/* Секция «Матчи» — шапка ленты на страницах ЛИГ хоккея и баскетбола
   (заголовок, панель даты cal_bar). Ленты дня — главная, /hockey,
   /basketball — с 05.09.2026 на тулбаре .home-tb ниже. */
.home-matches__head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
/* Заголовок тянется — календарь прижимается к правому краю. Селектор по
   классу, а не по тегу: на страницах лиг хоккея и баскетбола «Матчи» — это
   <h1 class="lb-h2"> (главный заголовок для SEO), и правило на голый h2 его
   не ловило — календарь слипался слева у заголовка, справа оставалась
   пустота. */
.home-matches__head .lb-h2 { flex: 1; }

/* ---------- Тулбар ленты матчей (.home-tb) ----------
   Хендофф «блок с сортировками» (05.09.2026), разметка — _home_toolbar.html;
   один на три ленты дня: главная футбола, /hockey, /basketball (классы
   остались с префиксом home-, как у карточек лиг .home-group, которые эти
   ленты и так делят). Десктоп — две строки: заголовок + лента дней + поиск;
   сегменты статусов + тумблер трансляции + сортировка. Телефон (≤600,
   99-responsive.css) перекладывает те же элементы в три строки и прячет
   десктопные контролы: здесь они по умолчанию видны, телефонные (подпись
   дня, лупа, «Отмена», кнопка «Фильтры», заголовок выдачи) — спрятаны. */
.home-tb { display: flex; flex-direction: column; gap: 14px; margin-bottom: 14px; }
.home-tb__top { display: flex; align-items: center; gap: 10px; }
/* 14px до ленты дней по макету: 10 зазора + 4 своих. */
.home-tb__title { flex: none; margin-inline-end: 4px; }
.home-tb__date, .home-tb__today--top, .home-tb__lupa, .home-tb__cancel, .home-tb__filters, .home-tb__found { display: none; }

/* Лента дней: семь ячеек с сегодняшним в центре (три до, три после), каждая
   тянется поровну. Ячейка — ссылка на день. В списке лежат и ячейки
   телефонной раскладки (--m без --d) — здесь они спрятаны, на телефоне
   наоборот. */
.home-week { display: flex; align-items: center; gap: 2px; flex: 1; min-width: 0; }
.home-week__day {
  display: flex;
  flex-direction: column;
  align-items: center;
  flex: 1;
  min-width: 0;
  padding: 7px 0;
  border-radius: 12px;
  font-size: 11px;
  font-weight: 600;
  color: var(--dim);
  white-space: nowrap;
}
.home-week__day:hover { background: rgba(255, 255, 255, 0.05); color: var(--dim); }
.home-week__day:not(.home-week__day--d) { display: none; }
.home-week__num { font-size: 14px; font-weight: 700; color: #DFE5DB; }
.home-week__day.is-past .home-week__num { color: #9AA694; }
/* Сегодня, не выбран — зелёная подпись; выбранный день — зелёная ячейка. */
.home-week__day.is-today, .home-week__day.is-today:hover { color: var(--green-soft); }
.home-week__day.is-sel, .home-week__day.is-sel:hover { background: var(--green); color: var(--on-green); font-weight: 800; }
.home-week__day.is-sel .home-week__num { color: var(--on-green); }
/* У сегодняшней ячейки две подписи: «сегодня» — десктоп, день недели — телефон. */
.home-week__wd { text-transform: lowercase; }
.home-week__wd--w { display: none; }
/* Календарь: круглая кнопка после ленты; поповер — тот же .fav-cal__menu
   (15-favorites), что у чипа даты cal_bar. margin у обёртки свой: .fav-cal
   по умолчанию прижимается вправо auto-отступом, а здесь ячейки и так заняли
   всю ширину. */
.home-week .fav-cal { margin-inline-start: 4px; flex: none; }
.home-week__cal {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  flex: none;
  background: var(--panel);
  border: 1px solid rgba(255, 255, 255, 0.1);
  color: var(--green-soft);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: border-color .15s;
}
.home-week__cal:hover { border-color: var(--hover-green-line); }

/* Поиск по ленте — пилюля фиксированной ширины у правого края. Контрол общий
   (.lb-find, 00-core), здесь фон и отступы: строка стоит на фоне страницы, и
   провал --bg читался бы дырой. */
.home-tb__search { width: 220px; flex: none; padding: 9px 16px; background: var(--panel); border-color: rgba(255, 255, 255, 0.1); }
.home-tb__search input::placeholder { font-weight: 600; }

/* Строка 2. Переносится, а не режется: между 600 и ~800px сегменты и правый
   блок в одну строку не помещаются. Правый блок прижат auto-отступом, а не
   распоркой: распорка нулевой ширины была третьим элементом строки и
   приносила свой gap — строка ломалась на 8px раньше, чем кончалось место.
   На полной колонке (856px) при трёхзначных счётчиках дня этих 8px как раз
   не хватало, и «Сортировка: по времени» уносила блок на вторую строку.
   Перенёсшийся блок (600–800px) auto-отступ держит у правого края строки. */
.home-tb__bar { display: flex; align-items: center; gap: 8px; white-space: nowrap; flex-wrap: wrap; row-gap: 10px; }
.home-tb__right { display: flex; align-items: center; gap: 8px; margin-inline-start: auto; }

/* Сегментированный контроль статусов: контейнер-пилюля, активный сегмент —
   зелёный, у остальных прозрачный фон. Число — счётчик матчей; у активного
   гаснет в тон, у остальных приглушён. Паддинг сегмента 12px, а не 14 по
   макету (активный 14, а не 16): в макете счётчики двузначные, а на
   футбольном дне их три трёхзначных («Все 358 … Предстоящие 332»), и с
   макетными паддингами пилюля вместе с правым блоком оставляла колонке 856px
   запас 4px — хватило бы «Live 115», чтобы правый блок ушёл на вторую
   строку. Сейчас запас ~20px. Телефон и так жил на 12/14. */
.home-seg {
  display: inline-flex;
  flex: none;
  background: var(--panel);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-pill);
  padding: 3px;
  gap: 2px;
}
.home-seg__btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
  border-radius: var(--r-pill);
  padding: 7px 12px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--ink-soft);
}
.home-seg__btn:hover { color: var(--green-pale); }
.home-seg__btn.is-active, .home-seg__btn.is-active:hover { background: var(--green); color: var(--on-green); font-weight: 800; padding: 7px 14px; }
.home-seg__n { color: var(--dim); }
.home-seg__btn.is-active .home-seg__n { color: inherit; opacity: 0.6; }
/* Точка у Live — без пульса: в тулбаре она метка, а не сигнал. */
.home-seg__dot { width: 6px; height: 6px; border-radius: 50%; background: #FF4B4B; flex: none; }
/* «Предстоящие» ↔ «Скоро»: полное слово на десктопе, короткое на телефоне. */
.home-seg__short { display: none; }

/* Чип-статус другого дня: «● Предстоящие · 24 матча» / «● Завершённые · …». */
.home-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex: none;
  white-space: nowrap;
  background: var(--panel);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-pill);
  padding: 8px 14px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--ink-soft);
}
.home-chip__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--green-soft); flex: none; }
.home-chip--past .home-chip__dot { background: var(--dim); }
/* Точка «·» перед числом — CSS ::before, а не текст: слева от неё стоит
   flex-gap чипа (8px), и справа нужны те же 8px числом. Текстовый пробел
   давал ~3px, и точка липла к числу — та же история, что у страны лиги в
   шапке группы (.home-group__country). */
.home-chip__n::before { content: "·"; margin-inline-end: 8px; }
/* Текстовая ссылка «Сегодня» рядом с чипом (десктоп) и датой (телефон). */
.home-tb__today { flex: none; padding: 0 4px; font-size: 12.5px; font-weight: 700; color: var(--green-soft); }
.home-tb__today:hover { color: var(--green-pale); }

/* «Только с трансляцией» — подпись с тумблером (.lb-toggle, 00-core); включён
   — is-active на самой кнопке, его ставит app.js той же веткой, что раньше
   красила пилюлю. */
.home-tb__tv { display: inline-flex; align-items: center; gap: 9px; font-size: 12.5px; font-weight: 600; color: var(--ink-soft); user-select: none; }
.home-tb__tv:hover { color: var(--green-pale); }
.home-tb__sep { width: 1px; height: 22px; background: rgba(255, 255, 255, 0.1); margin: 0 6px; flex: none; }
/* «Сортировка: по лигам ▾» — клик переключает по лигам ↔ по времени. Оба
   значения в разметке, видимое выбирает is-active (app.js). Кнопка — грид, и
   оба значения лежат в ОДНОЙ ячейке (вторая колонка): ячейка берёт ширину
   длинного слова, и переключение не меняет ширину кнопки — иначе «по времени»
   (на ~17px шире «по лигам») на полной колонке уносило правый блок на вторую
   строку. Неактивное значение прячет visibility, а не display: скрытое через
   display в ширине ячейки не участвовало бы. Шеврон стоит после ячейки, как
   у select фиксированной ширины; ширину задаёт длинное слово ТЕКУЩЕГО языка,
   таблицы ширин по языкам не нужно. */
.home-tb__sort { display: inline-grid; grid-template-columns: auto auto auto; align-items: center; column-gap: 7px; font-size: 12.5px; font-weight: 600; color: #9AA694; user-select: none; }
.home-tb__sort:hover { color: var(--green-pale); }
.home-tb__sort-cap { grid-area: 1 / 1; }
.home-tb__sort-val { grid-area: 1 / 2; color: #DFE5DB; }
.home-tb__sort:hover .home-tb__sort-val { color: inherit; }
.home-tb__sort svg { grid-area: 1 / 3; }
.home-tb__sort-val--time, .home-tb__sort.is-active .home-tb__sort-val--league { visibility: hidden; }
.home-tb__sort.is-active .home-tb__sort-val--time { visibility: visible; }

/* Подсветка совпадения в строке ленты — поиск по ленте (app.js feedHighlight). */
.home-hl { color: var(--green-soft); }
/* «Нет нужного? Искать везде →» под лентой — телефон, режим поиска. */
.home-more { display: none; }

/* ---------- Шторки телефона (.home-sheet) ----------
   Фильтры (#home-filters) и календарь (#home-cal) — обычные .lb-modal внутри
   .lb-overlay: адаптив (99-responsive, ≤600) сам кладёт модалку к низу
   экрана, здесь — ручка, скругление 24 и фон по макету. Специфичность
   .lb-modal.home-sheet не прихоть: адаптив задаёт .lb-modal ширину и
   отступы ПОЗЖЕ этого файла, и одиночный класс проиграл бы ему. */
.lb-modal.home-sheet {
  width: 100%;
  max-width: 100%;
  background: #0E140C;
  border: 0;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 24px 24px 0 0;
  padding: 10px 16px calc(20px + env(safe-area-inset-bottom));
  box-shadow: 0 -20px 50px rgba(0, 0, 0, 0.5);
}
.home-sheet__grip { display: block; width: 40px; height: 4px; border-radius: 2px; background: rgba(255, 255, 255, 0.18); margin: 0 auto 14px; }
.home-sheet__head { display: flex; align-items: center; margin-bottom: 16px; }
.home-sheet__title { flex: 1; font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); }
.home-sheet__reset { font-size: 12.5px; font-weight: 700; color: var(--dim); }
.home-sheet__reset:hover { color: var(--green-pale); }
/* Строка «Только с трансляцией»: иконка в квадрате, подпись с сабтайтлом,
   тумблер. Вся строка — label, тап по любому месту переключает чекбокс. */
.home-sheet__row { display: flex; align-items: center; gap: 12px; padding: 14px 0; border-top: 1px solid var(--line); cursor: pointer; }
.home-sheet__ico {
  width: 34px;
  height: 34px;
  border-radius: 10px;
  background: rgba(139, 233, 106, 0.12);
  color: var(--green-soft);
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.home-sheet__text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.home-sheet__name { font-size: 13.5px; font-weight: 700; color: var(--ink-strong); }
.home-sheet__sub { font-size: 11.5px; color: var(--dim); }
/* Чекбокс спрятан, но остаётся в потоке фокуса; вид рисует соседний
   .lb-toggle по :checked (00-core). */
.home-sheet__cb { position: absolute; opacity: 0; width: 0; height: 0; margin: 0; pointer-events: none; }
.home-sheet__sec { padding: 14px 0 4px; border-top: 1px solid var(--line); }
.home-sheet__cap { display: block; font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
/* Сегмент сортировки во всю ширину шторки — две равные половины. */
.home-seg--fill { display: flex; margin-top: 10px; }
.home-seg--fill .home-seg__btn, .home-seg--fill .home-seg__btn.is-active { flex: 1; justify-content: center; padding: 8px 0; }
.home-sheet__apply {
  display: block;
  width: 100%;
  margin-top: 18px;
  background: var(--green);
  color: var(--on-green);
  font-size: 13.5px;
  font-weight: 800;
  border-radius: var(--r-pill);
  padding: 13px 0;
  text-align: center;
}
.home-sheet__apply:hover { background: var(--green-hover); }
/* Календарь в шторке: та же сетка cal_menu, что в поповере (рисует
   initCalendars), только поповерная обёртка .lb-menu развёрнута в поток и
   перерисована по макету шторки: круглые стрелки 32px, ячейки 44px,
   «Сегодня» — текстовая ссылка справа. Селекторы через .home-sheet: правила
   .fav-cal* из 15-favorites стоят в сборке позже и весят столько же. */
.home-sheet .fav-cal { display: block; position: static; margin: 0; }
.home-sheet .fav-cal__menu { display: flex; position: static; width: auto; padding: 0; background: none; border: 0; box-shadow: none; gap: 0; }
.home-sheet .fav-cal__nav { margin-bottom: 14px; }
.home-sheet .fav-cal__arr { width: 32px; height: 32px; border-radius: 50%; background: var(--panel); border: 1px solid rgba(255, 255, 255, 0.1); }
.home-sheet .fav-cal__arr svg { width: 12px; height: 12px; }
.home-sheet .fav-cal__title { font-family: var(--font-display); font-size: 14px; font-weight: 700; }
.home-sheet .fav-cal__dow { font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; padding: 0 0 9px; }
.home-sheet .fav-cal__dow:nth-child(6), .home-sheet .fav-cal__dow:nth-child(7) { color: #9AA694; }
.home-sheet .fav-cal__day {
  height: 44px;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: 12px;
  font-size: 14px;
  font-weight: 600;
  color: #DFE5DB;
}
.home-sheet .fav-cal__day.is-past { color: var(--dim); }
.home-sheet .fav-cal__day.is-today { color: var(--green-soft); }
.home-sheet .fav-cal__day.is-selected { background: var(--green); color: var(--on-green); font-weight: 800; }
.home-sheet .fav-cal__reset { align-self: flex-end; margin-top: 12px; padding: 0; background: none; border: 0; font-size: 11px; font-weight: 700; color: var(--green-soft); }
.home-date {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--panel);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-pill);
  padding: 8px 16px;
  font-size: 12.5px;
  font-weight: 700;
  color: #DFE5DB;
  cursor: pointer; /* чип — кнопка календаря */
}
.home-date:hover { border-color: rgba(139, 233, 106, 0.5); color: var(--green-pale); }
.home-date > svg:first-child { color: var(--green-soft); flex: none; }
.home-date__caret { color: var(--muted); flex: none; }
.home-date:hover .home-date__caret { color: inherit; }

/* Навигация по датам «‹ [дата] ›» — общий блок всех разделов (_cal.html,
   cal_bar). Стрелки взяты у слайдера (.lb-slider__arrow): тот же круг, та же
   рамка и тот же зелёный ховер, но без его тяжёлой тени — здесь кнопка стоит
   в строке, а не висит поверх карусели, и подложка ей не нужна. Размер
   подогнан под высоту чипа даты, чтобы все три элемента были одной высоты. */
.home-datenav { display: inline-flex; align-items: center; gap: 8px; }
.home-datenav__arr {
  width: 33px;  /* ровно высота чипа .home-date: 8+8 паддинга + строка + рамки */
  height: 33px;
  flex: none;
  border-radius: 50%;
  background: var(--panel);
  border: 1px solid var(--line-strong);
  color: var(--ink-soft);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: border-color .15s, color .15s, background .15s;
}
.home-datenav__arr:hover { background: var(--panel-2); border-color: var(--hover-green-line); color: var(--green-soft); }
.home-datenav__arr:active { transform: scale(0.94); }
/* Край диапазона: кнопка на месте (строка не прыгает), но гаснет и не ловит курсор. */
.home-datenav__arr.is-disabled { opacity: 0.3; pointer-events: none; }
/* Шевроны «‹ день ›» справа налево зеркальные: вчерашний день стоит справа
   и смотрит вправо — из строки наружу, как слева направо. */
[dir="rtl"] .home-datenav__arr svg { transform: scaleX(-1); }
.home-groups { display: flex; flex-direction: column; gap: 10px; }
.home-group__head {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 18px;
  cursor: pointer;
}
.home-group__logo { width: 22px; height: 22px; object-fit: contain; flex: none; }
/* Карточка «Избранное» — первая группа ленты дня, её собирает app.js из строк
   избранных матчей. Логотипа у неё нет: вместо <img> в том же месте закрашенная
   звезда, цветом активной .lb-star.is-on — она и связывает карточку со звёздами
   в строках. */
.home-group__logo--fav { display: inline-flex; align-items: center; justify-content: center; color: var(--green); }
.home-group__name { font-size: 14.5px; font-weight: 800; color: var(--ink-strong); }
/* Название лиги — ссылка на её страницу (тот же адрес, что у звезды). Цвет
   наследуется от заголовка, а не зелёный по умолчанию для <a>: название
   остаётся заголовком карточки, зелёным становится только на ховере — как
   лига в хиро матча (.mt-hero__league). Ссылкой обёрнут только текст (.lg),
   не весь .home-group__name: на телефоне тот растянут на всю свободную
   ширину (99-responsive), и ссылка во всю строку отобрала бы у тапа по
   шапке-коллапсу большую часть площади. */
.home-group__name a { color: inherit; }
.home-group__name a:hover { color: var(--green-soft); }
/* Страна лиги на месте тура (хендофф «страны в лигах»): «Ла Лига · флаг Испания»
   тем же вторичным .lb-round, что был у тура. Точка — не текстом, а ::before:
   так воздух вокруг неё задаётся числом с обеих сторон (слева — зазор
   заголовка, справа — отступ точки), а не пробелом; у тура было 5px и
   пробел — тесно. Флаг — строчная картинка внутри текста: 16×12, чуть ниже
   базовой линии, зазор до подписи 5px. */
.home-group__name.lb-titled:has(.home-group__country) { column-gap: 8px; }
.home-group__country::before { content: "·"; margin-inline-end: 8px; }
.home-group__flag { width: 16px; height: 12px; object-fit: cover; border-radius: 2px; vertical-align: -1px; margin-inline-end: 5px; }
/* Без звезды (хоккей/баскетбол) правый блок прижимает сам счётчик;
   при звезде auto-отступ у неё — у счётчика сбрасываем, иначе двойной auto. */
.home-group__count { font-size: 11px; font-weight: 700; color: var(--dim); margin-inline-start: auto; white-space: nowrap; }
.home-group__star { margin-inline-end: auto; }
.home-group__star ~ .home-group__count { margin-inline-start: 0; }
.home-group__chev { display: inline-flex; color: var(--green-soft); transition: transform 0.2s; }
.home-group.is-open .home-group__chev { transform: rotate(180deg); }
.home-group__rows { display: none; }
.home-group.is-open .home-group__rows { display: block; }

/* SEO-блок «О проекте» */
/* Отступ под заголовком секции «Топ-5 лиг» (как у «Матчей») */
.home-leagues__slider { margin-top: 14px; }

/* Время начала будущих матчей на главной — белым жирным (как в макете), а не приглушённым */
#home-match-list .lb-fixture[data-st="up"] .lb-fixture__time {
  color: var(--ink);
  font-size: 13px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
}

/* Контентная колонка главной: секции реже, чем базовые 20px ядра (как в макете) */
.home-col { gap: 28px; }

/* SEO-заголовок «О проекте» крупнее (23px, как в макете; обычный lb-h2 = 19px) */
.home-seo .lb-h2 { font-size: 23px; line-height: 1.35; }
.home-seo .lb-kicker { display: block; margin-bottom: 14px; }

.home-seo { border-top: 1px solid rgba(255, 255, 255, 0.07); margin-top: 32px; }
.home-seo__grid { width: 1140px; margin: 0 auto; display: grid; grid-template-columns: 380px 1fr; gap: 48px; padding: 44px 0; }
.home-seo__body { font-size: 15px; line-height: 1.7; color: var(--ink-soft); }
.home-seo__body p { margin: 0; }
.home-check { display: flex; align-items: flex-start; gap: 10px; margin: 14px 0; }
.home-check__ico { flex: none; margin-top: 2px; color: var(--green); }
.home-check strong { color: var(--ink-strong); font-weight: 700; }

/* ===== partials/11-league.css ===== */
/* --- Лига (lg-) --- */

/* Шапка лиги */
.lg-hero {
  position: relative;
  overflow: hidden;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  display: flex;
  align-items: center;
  gap: 22px;
  padding: 26px 28px;
}
/* Шапка футбольной лиги: overflow снят, иначе он обрезал бы меню сезона.
   Обрезку свечения и водяного знака по скруглённой карточке вместо контейнера
   делает внутренний слой __deco — глоу и знак лежат в нём. У хоккея/баскета
   меню нет, там остаётся базовый overflow: hidden без слоя. */
.lg-hero--season { overflow: visible; }
.lg-hero__deco {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  overflow: hidden;
  pointer-events: none;
}
/* Свечение шапки — фирменным цветом турнира: шаблон кладёт его в --league-glow
   инлайном (`style="--league-glow: #37003c"`). Цвет заведён не у всех лиг,
   поэтому в var() свой дефолт — прежний красный Ла Лиги, на котором рисовался
   макет.

   Три строки background — не копипаста, а лесенка деградации, последняя
   поддержанная выигрывает:
     1) прежний rgba() для браузеров без color-mix;
     2) цвет команды/лиги как есть;
     3) то же, но с полом яркости.
   Пол нужен из-за самих брендов: у АПЛ #37003c, у ЛЧ #0e1e5b — на тёмной
   панели такое свечение не видно вовсе. oklch(from …) поднимает ТОЛЬКО
   светлоту, оставляя тон и насыщенность, поэтому яркие цвета не трогает.
   Осветлять в данных нельзя: там лежит настоящий цвет бренда. */
/* Позиция свечения привязана к водяному знаку: считается из тех же
   переменных --wm-* (см. блок знака ниже), чтобы центр пятна совпадал с
   центром эмблемы у любой лиги. Дефолты подобраны так, что у лиг БЕЗ знака
   пятно остаётся на историческом месте (right:-60px). */
.lg-hero__glow {
  position: absolute;
  inset-inline-end: calc(var(--wm-right, 72px) + var(--wm-w, 216px) / 2 - 240px);
  top: calc(var(--wm-top, -14px) + var(--wm-h, 180px) / 2 - 165px);
  width: 480px;
  height: 330px;
  pointer-events: none;
  background: radial-gradient(closest-side, rgba(255, 75, 68, 0.32), transparent 72%);
  background: radial-gradient(closest-side, color-mix(in srgb, var(--league-glow, #ff4b44) 32%, transparent), transparent 72%);
  background: radial-gradient(closest-side, color-mix(in srgb, oklch(from var(--league-glow, #ff4b44) max(l, 0.62) c h) 32%, transparent), transparent 72%);
}
/* Водяной знак шапки — эмблема ИМЕННО этой лиги.
   Раньше маска была прибита к laliga.svg, то есть на странице АПЛ висел знак
   Ла Лиги (макет рисовался на Ла Лиге, и подстановка не доехала).

   Лигу выбирает атрибут data-wm со слагом, который шаблон ставит на .lg-hero,
   — весь список живёт здесь, в CSS: добавить лигу = положить svg в img/wm/ и
   дописать одно правило, Go-кода это не касается.

   Без своего правила знака НЕТ (display: none), и это осознанно. Эмблему лиги
   из БД маской не подставить: замер по 15 логотипам показал, что у трёх
   (Бундеслига, Серия А, Примейра) картинка непрозрачная целиком — маска дала бы
   не силуэт, а белую плашку во всю коробку. Пустая шапка лучше плашки.

   Параметры знака лига задаёт КАСТОМНЫМИ СВОЙСТВАМИ на .lg-hero[data-wm=…]:
   --wm (url маски, обязателен), --wm-w (ширина из пропорций svg при высоте
   --wm-h, дефолт 180px), --wm-top / --wm-right — точечная подгонка кадра,
   когда у эмблемы «смысловая» часть не по центру (морда льва, верх кубка).
   Переменные, а не свойства напрямую, потому что от тех же чисел считается
   позиция .lg-hero__glow — свечение должно стоять по центру эмблемы.
   Без --wm ширина знака 0 — у лиги без правила знака просто нет. */
.lg-hero__wm {
  position: absolute;
  inset-inline-end: var(--wm-right, 72px);
  top: var(--wm-top, -14px);
  height: var(--wm-h, 180px);
  width: var(--wm-w, 0px);
  background: #FFFFFF;
  opacity: 0.07;
  mask-image: var(--wm, none);
  -webkit-mask-image: var(--wm, none);
  mask-position: 0 0;
  mask-size: contain;
  mask-repeat: no-repeat;
  -webkit-mask-position: 0 0;
  -webkit-mask-size: contain;
  -webkit-mask-repeat: no-repeat;
  pointer-events: none;
  display: block;
}
.lg-hero[data-wm="epl"] { --wm: url(/public/img/v2/wm/epl.svg); --wm-w: 161px; --wm-h: 200px; --wm-top: -10px; }
.lg-hero[data-wm="la-liga"] { --wm: url(/public/img/v2/wm/laliga.svg); --wm-w: 200px; }
.lg-hero[data-wm="bundesliga"] { --wm: url(/public/img/v2/wm/bundesliga.svg); --wm-w: 239px; }
.lg-hero[data-wm="ligue-1"] { --wm: url(/public/img/v2/wm/ligue1.svg); --wm-w: 192px; }
.lg-hero[data-wm="seria-a"] { --wm: url(/public/img/v2/wm/seriea.svg); --wm-w: 214px; }
/* Еврокубки — официальные одноцветные эмблемы: ЛЧ — звёздный мяч (вектор с
   Wikimedia Commons), ЛЕ и ЛК — эмблемы ребрендинга 2024 (кубок в скобках),
   вытащенные из официальных лого без словесной части. ЛЧ крупнее остальных
   (мяч без «рамки» выглядит мельче при той же высоте), у кубков ЛЕ/ЛК кадр
   опущен, чтобы в панель попадала чаша, а не пустой верх скобок. */
.lg-hero[data-wm="champions-league"] { --wm: url(/public/img/v2/wm/ucl.svg); --wm-w: 214px; --wm-h: 214px; --wm-top: -26px; }
.lg-hero[data-wm="europa-league"] { --wm: url(/public/img/v2/wm/uel.svg); --wm-w: 159px; --wm-top: 8px; }
.lg-hero[data-wm="conference-league"] { --wm: url(/public/img/v2/wm/uecl.svg); --wm-w: 166px; --wm-top: 8px; }
/* Топ-10 клубных лиг по приоритету меню (top в /web/v1) — тоже официальные
   эмблемы: вектор с Commons/вики/сайта лиги либо трассировка официального
   растра potrace'ом; словесные и спонсорские части отброшены. Лев Премьершипа
   укрупнён и опущен — в кадре должна быть морда, а не грива с хвостом. */
.lg-hero[data-wm="rpl"] { --wm: url(/public/img/v2/wm/rpl.svg); --wm-w: 189px; }
.lg-hero[data-wm="pr-primeira-liga"] { --wm: url(/public/img/v2/wm/primeira.svg); --wm-w: 98px; --wm-right: 150px; --wm-top: 0px; }
.lg-hero[data-wm="eredivisie"] { --wm: url(/public/img/v2/wm/eredivisie.svg); --wm-w: 179px; }
.lg-hero[data-wm="ekstraklasa"] { --wm: url(/public/img/v2/wm/ekstraklasa.svg); --wm-w: 182px; }
.lg-hero[data-wm="at-bundesliga"] { --wm: url(/public/img/v2/wm/atbundesliga.svg); --wm-w: 180px; }
.lg-hero[data-wm="saudi-pro-league"] { --wm: url(/public/img/v2/wm/saudi.svg); --wm-w: 202px; }
.lg-hero[data-wm="sc-premiership"] { --wm: url(/public/img/v2/wm/premiership.svg); --wm-w: 160px; --wm-h: 230px; --wm-top: 4px; }
.lg-hero[data-wm="upl"] { --wm: url(/public/img/v2/wm/upl.svg); --wm-w: 178px; }
.lg-hero[data-wm="jupiler-pro-league"] { --wm: url(/public/img/v2/wm/jupiler.svg); --wm-w: 243px; }
.lg-hero[data-wm="tr-superleague"] { --wm: url(/public/img/v2/wm/superlig.svg); --wm-w: 152px; --wm-top: 8px; }
/* Турниры сборных — самые свежие официально представленные эмблемы на момент
   правки: ЧМ-2026, Евро-2028, Копа Америка 2024, АФКОН-2025, Кубок Азии 2027;
   у Лиги наций и Клубного ЧМ знаки постоянные; Олимпиада — официальные
   кольца (широкие, поэтому своя высота). Эмблемы розыгрышей устаревают со
   сменой цикла — при ребрендинге турнира файл обновляется тем же конвейером. */
.lg-hero[data-wm="world-cup"] { --wm: url(/public/img/v2/wm/worldcup.svg); --wm-w: 117px; }
.lg-hero[data-wm="euro"] { --wm: url(/public/img/v2/wm/euro.svg); --wm-w: 128px; --wm-h: 190px; --wm-top: -36px; }
.lg-hero[data-wm="copa-america"] { --wm: url(/public/img/v2/wm/copaamerica.svg); --wm-w: 173px; }
.lg-hero[data-wm="nations-league"] { --wm: url(/public/img/v2/wm/nationsleague.svg); --wm-w: 132px; --wm-h: 150px; --wm-top: -8px; }
.lg-hero[data-wm="africa-cup"] { --wm: url(/public/img/v2/wm/africacup.svg); --wm-w: 81px; --wm-right: 120px; }
.lg-hero[data-wm="club-world-cup"] { --wm: url(/public/img/v2/wm/clubwc.svg); --wm-w: 186px; }
.lg-hero[data-wm="asian-cup"] { --wm: url(/public/img/v2/wm/asiancup.svg); --wm-w: 129px; --wm-h: 230px; --wm-top: -22px; }
.lg-hero[data-wm="olympics-men"] { --wm: url(/public/img/v2/wm/olympics.svg); --wm-w: 251px; --wm-h: 116px; --wm-top: 2px; }

.lg-hero__logo {
  width: 64px;
  height: 64px;
  object-fit: contain;
  position: relative;
  filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.45));
}
.lg-hero__body { position: relative; display: flex; flex-direction: column; gap: 7px; }
.lg-hero__title { display: flex; align-items: center; gap: 12px; }
.lg-hero__title h1 { font-family: var(--font-display); font-size: 26px; font-weight: 700; }
.lg-hero__meta { display: flex; align-items: center; gap: 9px; font-size: 13px; font-weight: 600; color: var(--muted); }
.lg-hero__meta img { height: 12px; border-radius: 2px; }
.lg-hero__sep { color: var(--faint); }

/* Выбор сезона в шапке: кнопка выглядит как остальной текст меты
   (font/color: inherit), меню — общий .lb-menu из 00-core, здесь только
   позиционирование и вид пунктов. */
.lg-season-pick { position: relative; display: inline-flex; }
.lg-season-btn { display: inline-flex; align-items: center; gap: 6px; font: inherit; color: inherit; }
.lg-season-btn:hover { color: var(--green-soft); }
.lg-season-btn small { font-size: 9px; }
.lg-season-menu {
  top: calc(100% + 8px);
  left: 50%;
  transform: translateX(-50%);
  min-width: 110px;
  padding: 6px;
  /* ниже липкой шапки сайта, как у меню туров */
  z-index: 50;
  /* Высоту держим сами: список сезонов приходит от API и его длина не наша —
     раньше её ограничивал потолок «пять свежих» на сайте, теперь потолка нет.
     На мобильном 12 пунктов без этого перекрыли бы табы и таблицу и уехали за
     нижнюю границу экрана без возможности доскроллить. */
  max-height: 60vh;
  overflow-y: auto;
}
.lg-season-menu a {
  padding: 8px 14px;
  border-radius: var(--r-row);
  font: 500 13px/1.3 var(--font-text);
  color: var(--ink-soft);
  white-space: nowrap;
  text-align: center;
}
.lg-season-menu a:hover { background: rgba(255, 255, 255, 0.05); color: var(--green-soft); }
.lg-season-menu a.is-active { color: var(--green-pale); font-weight: 700; }

/* Мобильные табы лиги (Матчи/Таблица/Статистика).
   На десктопе скрыты, а секции .lg-sec видны сеткой (правила display нет). */
.lg-mtabs { display: none; }

/* Сетка: матчи+статистика / таблица */
.lg-grid { display: grid; grid-template-columns: 1fr 400px; gap: 20px; align-items: start; }
.lg-col { min-width: 0; }

/* Панель матчей: заголовок с навигацией по турам */
.lg-matches__head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.lg-matches__head h2 { flex: 1; }
.lg-round-nav {
  width: 32px;
  height: 32px;
  border-radius: var(--r-pill);
  background: var(--panel);
  border: 1px solid rgba(255, 255, 255, 0.1);
  color: var(--ink-soft);
  font-size: 15px;
  font-weight: 700;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.lg-round-nav:hover { border-color: var(--hover-green-line); color: var(--green-soft); }
.lg-round-btn {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: var(--green);
  color: var(--on-green);
  font-size: 12.5px;
  font-weight: 800;
  border-radius: var(--r-pill);
  padding: 8px 16px;
  min-width: 44px;
}
.lg-round-btn small { font-size: 9px; }

/* Карточка тура */
.lg-round__title {
  padding: 13px 18px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--dim);
}
.lg-day {
  padding: 10px 18px 8px;
  border-top: 1px solid var(--line-soft);
  background: rgba(255, 255, 255, 0.02);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--green-soft);
}
/* строки матчей — .lb-fixture из ядра, но счёт-колонка 60px */
.lg-round .lb-fixture { grid-template-columns: 18px 76px 1fr 60px 1fr 16px; }

/* Статистика */
.lg-stats { margin-top: 28px; }
.lg-stats__head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.lg-stats__head h2 { flex: 1; }
.lg-season {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  font-weight: 700;
  color: var(--muted);
}
/* Стадия еврокубка — своя строка над вкладками метрик (см. _league_stats.html).
   Прижата вправо, под подпись сезона: слева на этой высоте пилюли метрик, и у
   левого края кнопка вставала с ними в один столбец — снова читалась как
   первая вкладка ряда.

   Кнопка — обычная .lb-pill--sm с кареткой, меню — общий .lb-menu, как у
   выбора тура (.lg-round-menu) и сезона: пункты и наведение те же, отличается
   только привязка к правому краю. */
.lg-stats__stage { display: flex; justify-content: flex-end; margin-bottom: 12px; }
.lg-stage-pick { position: relative; display: inline-flex; }
.lg-stage-btn small { font-size: 9px; color: var(--muted); }
.lg-stage-menu { top: calc(100% + 8px); inset-inline-end: 0; min-width: 180px; }
.lg-stage-menu button {
  padding: 8px 12px;
  border-radius: var(--r-row);
  font: 500 13px/1.3 var(--font-text);
  color: var(--ink-soft);
  text-align: start;
  white-space: nowrap;
}
.lg-stage-menu button:hover { background: rgba(255, 255, 255, 0.05); color: var(--green-soft); }
.lg-stage-menu button.is-active { color: var(--green-pale); font-weight: 700; }
.lg-stats__tabs { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }
.lg-stats__body { display: grid; grid-template-columns: 260px 1fr; gap: 16px; align-items: start; }

/* Карточка лидера (по макету: панель со свечением сверху, всё по центру, липнет при скролле) */
.lg-leader {
  position: sticky;
  top: 16px;
  align-self: start;
  overflow: hidden;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: 22px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
}
.lg-leader::before {
  content: '';
  position: absolute;
  left: 50%;
  top: -90px;
  transform: translateX(-50%);
  width: 340px;
  height: 260px;
  background: radial-gradient(closest-side, rgba(88, 219, 36, 0.22), transparent 72%);
  pointer-events: none;
}
.lg-leader > * { position: relative; }
.lg-leader__kicker { font-size: 10.5px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--dim); margin-bottom: 16px; }
.lg-leader__photo { width: 112px; height: 112px; border-radius: 50%; object-fit: cover; object-position: top center; background: var(--bg); border: 2px solid var(--green-soft); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.45); }
.lg-leader__name { font-size: 17px; font-weight: 800; margin-top: 14px; color: var(--ink-strong); }
.lg-leader__team { display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 600; color: var(--muted); margin-top: 5px; }
.lg-leader__team img { width: 16px; height: 16px; object-fit: contain; }
.lg-leader__value { font-family: var(--font-display); font-size: 46px; font-weight: 700; line-height: 1; margin-top: 12px; color: var(--green-soft); }
.lg-leader__cap { font-size: 12px; font-weight: 600; color: var(--muted); margin-top: 6px; }
.lg-leader__mini { display: flex; gap: 14px; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--line-soft); }
.lg-leader__mini > span { display: flex; flex-direction: column; }
.lg-leader__mini b { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); }
.lg-leader__mini small { font-size: 9.5px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--dim); margin-top: 3px; }

/* Список бомбардиров */
.lg-ranks__head,
.lg-rank {
  display: grid;
  grid-template-columns: 26px 44px 1fr 74px;
  align-items: center;
  gap: 12px;
  padding: 8px 20px;
}
.lg-ranks__head { padding: 8px 20px 6px; color: var(--dim); font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; }
/* Строка — <button>: клик по ней переключает карточку слева на этого игрока
   (app.js, leaderPick / data-lst-row). От сброса кнопки в ядре остаётся
   cursor: pointer, а ширину, шрифт и выравнивание текста кнопка сама не
   наследует — задаём. Выбранная строка — тем же тоном, что своя команда в
   таблице (.lg-standings__row.is-me), наведение — как у строки матча
   (.lb-fixture:hover); рамки нет намеренно. */
.lg-rank { width: 100%; font: inherit; text-align: start; border-top: 1px solid var(--line-soft); transition: background 0.15s; }
.lg-rank:hover { background: rgba(255, 255, 255, 0.03); }
.lg-rank:focus-visible { outline: 2px solid var(--hover-green-line); outline-offset: -2px; }
.lg-rank.is-active { background: rgba(88, 219, 36, 0.07); }
.lg-rank.is-active .lg-rank__name b { color: var(--green-pale); }
.lg-rank__pos { font-family: var(--font-display); font-size: 11.5px; font-weight: 700; color: var(--green); }
.lg-rank__ava { position: relative; width: 44px; height: 38px; display: inline-flex; align-items: center; }
.lg-rank__ava img.p { width: 34px; height: 34px; border-radius: 50%; object-fit: cover; background: var(--bg); border: 1px solid rgba(255, 255, 255, 0.1); }
/* Эмблема клуба в углу фото игрока — без кружка-подложки и рамки (лого команд
   на сайте нигде не обводим). Чтобы она не терялась на светлом фото, вместо
   подложки — тень, как у логотипа в хиро команды. */
.lg-rank__ava img.c { position: absolute; inset-inline-end: 0; bottom: -2px; width: 18px; height: 18px; object-fit: contain; filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.75)); }
.lg-rank__name { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.lg-rank__name b { font-size: 13px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lg-rank__name small { font-size: 11px; color: var(--muted); }
.lg-rank__val { text-align: end; font-size: 15px; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }
/* Вкладки карточек: значения, свечение и обводка фото лидера — цветом самой
   карточки (маркер из lsCols: is-y — жёлтые, is-r — красные). Жёлтый — как
   иконка ЖК на матче (.mt-event__ico.yellow), красный — общий токен;
   альфа свечения — как у зелёного дефолта .lg-leader::before. */
.lg-leader__value.is-y, .lg-rank__val.is-y { color: #F5C542; }
.lg-leader__value.is-r, .lg-rank__val.is-r { color: var(--red-live-text); }
.lg-leader.is-y::before { background: radial-gradient(closest-side, rgba(245, 197, 66, 0.22), transparent 72%); }
.lg-leader.is-y .lg-leader__photo { border-color: #F5C542; }
.lg-leader.is-r::before { background: radial-gradient(closest-side, rgba(255, 107, 107, 0.22), transparent 72%); }
.lg-leader.is-r .lg-leader__photo { border-color: var(--red-live-text); }

/* Свёртки у списка нет: контракт отдаёт десятку, и кнопка «Показать всех»
   разворачивала восьмёрку до неё же — ради двух строк. Список открыт целиком
   (правила .lg-rank.is-extra / .lg-ranks__more удалены вместе с кнопкой). */

/* Турнирная таблица. Шапке задана высота строки шапки матчей слева (32px —
   кнопки туров): без этого заголовки двух колонок стояли на разных уровнях —
   «Таблица» прижималась к верху, а «Матчи» центрировались в своей строке. */
.lg-table__head { display: flex; align-items: center; min-height: 32px; margin-bottom: 14px; }
.lg-standings { overflow: hidden; }
/* Мультигрупповые standings (ЧМ, квалификации): карточки групп идут стопкой.
   В макете таблица одна — отступ добавлен по паттерну соседних стопок (14px). */
.lg-standings + .lg-standings { margin-top: 14px; }
.lg-standings__head,
.lg-standings__row {
  display: grid;
  grid-template-columns: 30px 24px 1fr 30px 28px 28px 28px 40px;
  align-items: center;
  gap: 8px;
  font-size: 12.5px;
}
.lg-standings__head { padding: 10px 8px; color: var(--dim); font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; }
/* «#» — над ЧИСЛОМ места, а не над зонной полоской: в строках перед числом
   идёт полоска зоны с зазором (3px + 7px), и без сдвига заголовок разъезжался
   с колонкой номеров (полоска к тому же прозрачная у лиг без зон). */
.lg-standings__head span:first-child { padding-inline-start: 10px; }
.lg-standings__row { padding: 6px 8px; border-top: 1px solid var(--line-soft); color: var(--ink); }
.lg-standings__row:hover { background: rgba(255, 255, 255, 0.02); }
.lg-standings__row.is-me { background: rgba(88, 219, 36, 0.07); }
.lg-pos { display: flex; align-items: center; gap: 7px; }
.lg-pos__bar { width: 3px; height: 14px; border-radius: 2px; background: transparent; flex: none; }
.lg-pos__bar.zone-cl { background: var(--green); }
.lg-pos__bar.zone-el { background: #49B2D3; }
.lg-pos__bar.zone-cf { background: #E5C453; }
.lg-pos__bar.zone-rel { background: var(--red-live); }
.lg-pos__n { font-weight: 700; color: var(--muted); font-variant-numeric: tabular-nums; }
.lg-standings__row img { width: 22px; height: 22px; object-fit: contain; }
.lg-standings__club { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lg-standings__num { text-align: center; color: var(--muted); font-variant-numeric: tabular-nums; }
.lg-standings__pts { text-align: center; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }

/* Легенда зон под таблицей (полоски — те же .lg-pos__bar) */
.lg-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 16px;
  margin-top: 12px;
  font-size: 11.5px;
  color: var(--muted);
}
.lg-legend > span { display: inline-flex; align-items: center; gap: 7px; }

/* SEO-блок «О турнире» */
.lg-seo { border-top: 1px solid rgba(255, 255, 255, 0.07); margin-top: 32px; }
.lg-seo .lb-kicker { display: block; margin-bottom: 14px; }
.lg-seo .lb-h2 { font-size: 23px; line-height: 1.35; }
.lg-seo__grid { width: 1140px; margin: 0 auto; display: grid; grid-template-columns: 380px 1fr; gap: 48px; padding: 44px 0; }
.lg-seo__body { font-size: 15px; line-height: 1.7; color: var(--ink-soft); }
.lg-seo__body p { margin: 0 0 12px; }

/* Обёртки страницы */
.lg-page { width: 1140px; margin: 0 auto; padding: 24px 0 12px; }
.lg-wrap { display: flex; flex-direction: column; gap: 24px; }

/* Время будущих матчей тура — белым жирным (как в макете лиги) */
.lg-round .lb-fixture[data-st="up"] .lb-fixture__time {
  font-size: 13px;
  font-weight: 800;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
/* Статус завершённых в туре чуть мельче базовых 12px (как в макете лиги) */
.lg-round .lb-fixture[data-st="fin"] .lb-fixture__time { font-size: 11.5px; }

/* --- Мобилка: секции переключаются табами (как в макете m-league) --- */
@media (max-width: 600px) {
  .lg-mtabs {
    display: flex; gap: 8px;
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
  }
  .lg-mtabs::-webkit-scrollbar { display: none; }
  .lg-mtabs > * { flex: none; }
  .lg-sec:not(.is-active) { display: none; }   /* видна только активная секция */
  .lg-wrap { gap: 14px; }

  /* --- Отступ вокруг ряда пилюль: 14px сверху и снизу на любой вкладке ---
     Колонки сетки прозрачны: секции лежат в двух .lg-col (слева матчи и
     статистика, справа таблица), и пустая колонка всё равно съедала зазор
     сетки — под табами выходило 34px у «Таблицы». С display: contents в
     сетке остаются только сами секции, а видна из них ровно одна.
     min-width переезжает на секцию: у прозрачной колонки его держать негде,
     а без него широкая таблица распирает страницу. */
  .lg-col { display: contents; }
  .lg-sec { min-width: 0; }
  /* Отбивка блока статистики от матчей сверху нужна только на десктопе, где
     они стоят друг под другом. На мобилке это соседние вкладки, и 28px
     превращались в 42px под табами. */
  .lg-stats { margin-top: 0; }

  /* --- Карточка лидера: в строку (передача «Моб Лидер статистики») ---
     Вертикальная композиция десктопа (фото по центру, значение отдельной
     строкой) съедала ~300px из первого экрана — список бомбардиров начинался
     за его пределами, а по бокам фото и цифры стояла пустота. Тот же контент
     в три колонки — ~150px, и под карточкой видно четыре строки списка.

     Раскладку задают grid-areas, а не обёртки: разметка общая с десктопом,
     детей у .lg-leader семь и все плоские. Пары «имя+клуб» и «значение+
     подпись» держатся вместе через align-self: end/start у соседних строк —
     обе группы центрируются относительно фото, которое их перекрывает. */
  .lg-leader {
    display: grid;
    grid-template-columns: 56px minmax(0, 1fr) auto;
    grid-template-areas:
      "kicker kicker kicker"
      "photo  name   value"
      "photo  team   cap"
      "mini   mini   mini";
    align-items: center;
    column-gap: 12px;
    row-gap: 3px;
    padding: 12px 14px;
    text-align: start;
  }
  /* Свечение — из центра в левый верхний угол: подсвечивает фото, а не пустоту */
  .lg-leader::before {
    inset-inline-start: -40px;
    top: -70px;
    transform: none;
    width: 220px;
    height: 180px;
  }
  .lg-leader__kicker { grid-area: kicker; font-size: 9.5px; margin-bottom: 7px; }
  /* Обводка остаётся цветом категории (как на десктопе), но тоньше и без тени:
     у 56px фото 2px кольцо с тенью выглядело кляксой. */
  .lg-leader__photo { grid-area: photo; width: 56px; height: 56px; border-width: 1px; box-shadow: none; }
  .lg-leader__name { grid-area: name; align-self: end; margin-top: 0; font-size: 14.5px; line-height: 1.15; }
  .lg-leader__team { grid-area: team; align-self: start; margin-top: 0; gap: 6px; font-size: 11px; }
  .lg-leader__team img { width: 14px; height: 14px; }
  .lg-leader__value { grid-area: value; align-self: end; justify-self: end; margin-top: 0; font-size: 27px; }
  /* Длинное значение («2988 (12)») уменьшаем, а не переносим: перенос ломает
     сетку, а значение обязано оставаться самым крупным элементом карточки.
     Класс ставит шаблон — в CSS длину строки не посчитать. */
  .lg-leader__value.is-long { font-size: 23px; }
  .lg-leader__cap {
    grid-area: cap;
    align-self: start;
    justify-self: end;
    margin-top: 0;
    font-size: 9px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--dim);
    text-align: end;
    /* Потолок ширины — страховка на длинные переводы: подпись стоит в колонке
       auto, и в одну строку она отъедала ширину у имени (на 320px «желтых
       карточек за сезон» съедала 156px, и «Э. Мартель» переносился). Период
       из подписи с тех пор убран, самая длинная сейчас — 105px, но у uk/ka/uz
       свои длины. 110px = ширина самого длинного значения («36 (10)» в 27px):
       колонка от подписи не растёт, лишнее уходит во вторую строку. */
    max-width: 110px;
    line-height: 1.3;
  }
  /* Мини-статы — равные колонки по центру, отделены линией. Максимум три:
     четвёртый показатель на 320px ломает подписи в две строки. Колонки не
     фиксированные repeat(3), а auto-flow: у карточек и ассистентов колонок
     всего две, и в жёсткой тройке они прижимались влево от пустой третьей. */
  .lg-leader__mini {
    grid-area: mini;
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    gap: 1px;
    margin-top: 9px;
    padding-top: 11px;
  }
  .lg-leader__mini > span { align-items: center; text-align: center; }
  .lg-leader__mini b { font-family: var(--font-text); font-size: 13.5px; font-weight: 800; font-variant-numeric: tabular-nums; }
  .lg-leader__mini small { font-size: 8.5px; margin-top: 2px; }
}

/* ===== partials/12-team.css ===== */
/* --- Команда (team-) --- */
.team-page { width: 1140px; margin: 0 auto; padding: 24px 0 12px; }
.team-wrap { display: flex; flex-direction: column; gap: 24px; }

/* Шапка команды */
.team-hero {
  position: relative; overflow: hidden;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg);
  display: flex; align-items: center; gap: 22px; padding: 26px 32px;
}
/* Свечение шапки — фирменным цветом клуба: шаблон кладёт его в --team-glow
   инлайном (`style="--team-glow: #da291c"`). Цвет заведён не у всех команд,
   поэтому в var() свой дефолт — прежний жёлтый.
   Лесенка деградации и пол яркости — как у .lg-hero__glow (11-league.css),
   там же объяснение: у клубов вроде ПСЖ #004170 свечение без пола на тёмной
   панели не видно. */
.team-hero__glow {
  position: absolute; inset-inline-end: -60px; top: -80px; width: 480px; height: 330px;
  pointer-events: none;
  background: radial-gradient(closest-side, rgba(235, 182, 35, 0.2), transparent 72%);
  background: radial-gradient(closest-side, color-mix(in srgb, var(--team-glow, #ebb623) 22%, transparent), transparent 72%);
  background: radial-gradient(closest-side, color-mix(in srgb, oklch(from var(--team-glow, #ebb623) max(l, 0.62) c h) 22%, transparent), transparent 72%);
}
.team-hero__logo { width: 68px; height: 68px; object-fit: contain; position: relative; filter: drop-shadow(0 6px 14px rgba(0, 0, 0, 0.45)); }
.team-hero__body { position: relative; display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.team-hero__title { display: flex; align-items: center; gap: 12px; }
.team-hero__title h1 { font-family: var(--font-display); font-size: 26px; font-weight: 700; }
.team-hero__meta { display: flex; align-items: center; flex-wrap: wrap; gap: 9px; font-size: 13px; font-weight: 600; color: var(--muted); }
.team-hero__meta img { height: 12px; border-radius: 2px; }
.team-hero__meta a { color: var(--green-soft); }
.team-hero__meta a:hover { color: var(--green-pale); }
.team-hero__sep { color: var(--faint); }
.team-hero__meta-extra { display: contents; }   /* на десктопе прозрачно, на мобилке скрывается */
/* Место в лиге — только мобильная строка (прототип m-team ставит его вместо
   года основания). Обе ветки в разметке, видна ровно одна. */
.team-hero__rank,
.team-hero__sep--rank { display: none; }
/* Цвет места нейтральный. Передача просит красить его по зоне (еврокубки —
   зелёным, вылет — красным), но зоны в контракте нет: мини-таблица команды
   отдаёт только rank/played/points (webdata.miniRow), а сколько мест в лиге
   еврокубковых и сколько вылетных, из неё не вывести. Придёт зона от API —
   красить будет чем. Зелёным «по умолчанию» не красим: у команды на 15-м
   месте это читалось бы как еврокубковая зона. */
.team-hero__rank { color: var(--muted); font-weight: 700; }
/* Форма — третий флекс-ребёнок хиро, прижат вправо. flex: none, иначе при
   длинном названии команды флекс ужимает блок и значки уезжают в padding. */
.team-hero__form { position: relative; display: flex; align-items: center; gap: 7px; margin-inline-start: auto; flex: none; }
.team-hero__form .lbl { font-size: 11px; font-weight: 700; color: var(--dim); text-transform: uppercase; letter-spacing: 0.1em; margin-inline-end: 9px; }
/* Значок формы — span либо <a> на страницу того матча (id приходит с формой):
   стили на обоих тегах, иначе у ссылки цвет буквы взял бы глобальный `a`.
   :not(.lbl) обязателен — иначе подпись «Форма» (тоже span) получала коробку
   26×26, её текст вылезал за неё на 12px с каждой стороны и наезжал на первый
   значок; между подписью и формой оставалось 0–4px вместо честного отступа. */
.team-hero__form span:not(.lbl),
.team-hero__form a { width: 26px; height: 26px; border-radius: 50%; font-size: 11px; font-weight: 800; display: inline-flex; align-items: center; justify-content: center; }
.team-hero__form .w { background: var(--form-w); color: var(--form-w-ink); }
.team-hero__form .d { background: var(--form-d); color: var(--form-d-ink); }
.team-hero__form .l { background: var(--form-l); color: var(--form-l-ink); }
.team-hero__form a:hover { filter: brightness(1.15); }

/* Табы */
.team-tabs { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* Шапка таба: h2 + подпись справа (Состав / Статистика / Трансферы) */
.team-tabhead { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 14px; }
.team-tabhead--lg { margin-bottom: 16px; }
.team-tabhead h2 { font-family: var(--font-display); font-size: 19px; font-weight: 700; }
.team-tabhead__note { font-size: 12px; font-weight: 600; color: var(--dim); }
.team-tabhead__note .in { color: var(--green-soft); }
.team-tabhead__note .out { color: var(--red-live-text); }

/* Календарь: сетка ближайшие/результаты + правая колонка */
.team-cal { display: grid; grid-template-columns: 1fr 400px; gap: 20px; align-items: start; }
.team-block + .team-block { margin-top: 24px; }
.team-block__head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 12px; }
.team-block__title { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); }
.team-block__link { font-size: 12.5px; font-weight: 700; color: var(--green-soft); }
.team-block__link:hover { color: var(--green-pale); }
.team-block__note { font-size: 12px; font-weight: 600; color: var(--dim); }

/* Мобильные пилюли календаря («Матчи»/«Результаты»/«Таблица») — только на
   узких экранах, см. @media в конце файла. */
.team-mtabs { display: none; }

/* Серии матчей по турнирам. На десктопе обёртка прозрачна, а шапка серии
   скрыта — список остаётся сплошным, каким и был, а турнир несёт каждая
   строка (марка ниже). Обе вещи оживают только на мобилке (блок @media ниже),
   где серия становится отдельной карточкой. */
.team-fix-group { display: contents; }
.team-fix-group__head { display: none; }

/* Строк .team-fix/.team-res больше нет: страница команды рисует матчи общим
   партиалом match_row (.lb-fixture) — тем же, что лента главной и лиги. Своя
   строка отличалась раскладкой и не имела звезды избранного, и один матч
   выглядел в двух местах по-разному. Правила .lb-fixture — в 00-core.css,
   мобильные — в 99-responsive.css; здесь только то, что добавляет страница
   команды: серии по турнирам и «Показать все».

/* Колонка времени шире ядровых 76px: рядом со временем и статусом стоит дата
   («21:30 · 22.08») — календарь команды идёт за месяцы, и группы по дню, как в
   ленте, здесь нет. Ровно та же правка сделана для избранного, там причина
   такая же (15-favorites.css). */
.team-fixes .lb-fixture { grid-template-columns: 18px 100px minmax(0, 1fr) 60px minmax(0, 1fr) 16px; }
/* Турнир в строке. Календарь команды — хронология по всем турнирам сразу, и у
   большого клуба лига и еврокубок идут через матч: шапок серий, как на
   мобилке, вышло бы почти столько же, сколько строк. Поэтому на десктопе
   турнир несёт сама строка — марка «лого + название» своей колонкой сразу за
   временем, как в ленте главной «По времени» (.home-group--time); стили
   марки — оттуда же, .lb-fixture__lg в 00-core.css.

   Колонка есть, только если турнир известен хоть одному матчу списка
   (team-fixes--lg ставит шаблон, render.teamHasLeagues): у результатов
   контракт `lg` пока не присылает, и пустая колонка там была бы дырой.

   container — ради правила ниже: ширину решает карточка, а не окно. В окне
   ~1000px, где справа ещё таблица, карточка уже, чем на планшете без неё. */
.team-fixes--lg { container-type: inline-size; }
.team-fixes--lg .lb-fixture { grid-template-columns: 18px 100px 128px minmax(0, 1fr) 60px minmax(0, 1fr) 16px; }
/* Узкая карточка (окно ~950–1100px, где справа ещё таблица, и планшет до
   ~730px): с названием турнира командам оставалось бы 50–130px (в окне
   1000px — 72), и даже «Реал Мадрид» не влезал бы. Марка сжимается до
   логотипа, полное название — в title. Блок стоит ДО мобильного @media:
   карточка на телефоне тоже уже порога, и мобильная сетка обязана перебить
   эту своим порядком. */
@container (max-width: 679px) {
  .team-fixes--lg .lb-fixture { grid-template-columns: 18px 100px 16px minmax(0, 1fr) 60px minmax(0, 1fr) 16px; }
  .team-fixes--lg .lb-fixture__lg span { display: none; }
}
/* Время будущих матчей — белым жирным, как на главной, лиге и в избранном */
.team-page .lb-fixture[data-st="up"] .lb-fixture__time {
  font-size: 13px; font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums;
}
/* Статус завершённых мельче базовых 12px — «Завершен · 24.05» в одну строку */
.team-page .lb-fixture[data-st="fin"] .lb-fixture__time { font-size: 11.5px; }

/* Скрытые строки + кнопка «Показать все · N» (data-collapsible / data-collapse) */
.team-fixes .lb-fixture.is-extra { display: none; }
.team-fixes.is-open .lb-fixture.is-extra { display: grid; }
.team-more {
  display: block; width: calc(100% - 36px); margin: 10px 18px;
  background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 10px;
  padding: 10px; font-size: 12.5px; font-weight: 700; color: var(--green-pale); text-align: center; cursor: pointer;
}
.team-more:hover { border-color: var(--hover-green-line); background: rgba(139, 233, 106, 0.07); }

/* Позиция в таблице (мини) */
.team-mini__row { display: grid; grid-template-columns: 24px 24px 1fr 34px 40px; align-items: center; gap: 8px; padding: 8px 14px; border-top: 1px solid var(--line-soft); font-size: 12.5px; color: #DFE5DB; }
.team-mini__row:hover { color: var(--ink); }
.team-mini__row.is-me { background: rgba(88, 219, 36, 0.07); }
.team-mini__pos { color: var(--muted); font-weight: 700; font-variant-numeric: tabular-nums; }
.team-mini__logo { width: 20px; height: 20px; object-fit: contain; }
.team-mini__club { font-weight: 700; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-mini__num { text-align: center; color: var(--muted); font-variant-numeric: tabular-nums; }
.team-mini__pts { text-align: center; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }

/* Состав (краткий, правая колонка календаря): № | флаг | имя | возраст */
.team-roster__group { padding: 12px 18px 6px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--green-soft); border-top: 1px solid var(--line-soft); }
.team-roster__row { display: grid; grid-template-columns: 44px 26px 1fr 70px; align-items: center; gap: 10px; padding: 8px 18px; font-size: 13.5px; }
.team-roster__row:hover { background: rgba(255, 255, 255, 0.03); }
.team-roster__num { font-family: var(--font-display); font-size: 12px; font-weight: 700; color: var(--green); font-variant-numeric: tabular-nums; }
.team-roster__name { font-weight: 700; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-roster__age { text-align: end; font-size: 12.5px; color: var(--dim); }

/* Состав · статистика игроков (таб): общий хедер + группы без повторных хедеров */
.team-squad__group { padding: 12px 18px 6px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--green-soft); border-top: 1px solid var(--line-soft); }
.team-squad__head, .team-squad__row {
  /* Четыре счётчика (Г/А/ЖК/КК) — одной ширины: раньше Г/А были 60px против
     50px у ЖК/КК, и колонки цифр шли с разным шагом. */
  display: grid; grid-template-columns: 44px 26px 1fr 70px 70px 84px 50px 50px 50px 50px; align-items: center; gap: 10px;
  padding: 8px 18px; font-size: 13px;
}
.team-squad__head { padding: 12px 18px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
.team-squad__row:hover { background: rgba(255, 255, 255, 0.03); }
.team-squad__num { font-family: var(--font-display); font-size: 12px; font-weight: 700; color: var(--green); font-variant-numeric: tabular-nums; }
.team-squad__name { font-weight: 700; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-squad__c { text-align: end; font-weight: 600; color: var(--ink-soft); font-variant-numeric: tabular-nums; }
.team-squad__c.age { font-size: 12.5px; font-weight: 400; color: var(--dim); }
.team-squad__c.g { font-weight: 800; color: var(--green-soft); }
.team-squad__c.y { color: #E5C453; }
.team-squad__c.r { color: var(--red-live-text); }

/* Статистика команды */
.team-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: stretch; }
.team-stat-card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-card); padding: 18px 20px; }
.team-stat-card h3 { font-family: var(--font-display); font-size: 14px; font-weight: 700; color: var(--ink-strong); }
.team-stats__col { display: flex; flex-direction: column; gap: 16px; }
.team-stat-card--grow { flex: 1; }

/* Форма · последние 10 (на всю ширину) */
.team-formline { grid-column: 1 / -1; display: flex; align-items: center; gap: 24px; }
.team-formline__left { display: flex; flex-direction: column; gap: 8px; }
.team-formline__lbl { font-size: 10.5px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.team-form10 { display: flex; gap: 5px; }
.team-form10 span { width: 24px; height: 24px; border-radius: 50%; font-size: 10.5px; font-weight: 800; display: inline-flex; align-items: center; justify-content: center; }
.team-form10 span.w { background: var(--form-w); color: var(--form-w-ink); }
.team-form10 span.d { background: var(--form-d); color: var(--form-d-ink); }
.team-form10 span.l { background: var(--form-l); color: var(--form-l-ink); }
.team-formline__div { width: 1px; align-self: stretch; background: var(--line); }
.team-formline__right { flex: 1; display: flex; flex-direction: column; gap: 8px; }
.team-formline__caps { display: flex; align-items: baseline; gap: 8px; }
.team-formline__caps .team-formline__lbl { flex: 1; }
.team-formline__caps .w { font-size: 11px; font-weight: 700; color: var(--green-soft); }
.team-formline__caps .d { font-size: 11px; font-weight: 700; color: #E5C453; }
.team-formline__caps .l { font-size: 11px; font-weight: 700; color: var(--red-live-text); }
.team-formline__bar { display: flex; gap: 3px; height: 14px; border-radius: 999px; overflow: hidden; }
.team-formline__bar span { display: inline-flex; align-items: center; justify-content: center; font-size: 9.5px; font-weight: 800; color: var(--on-green); }
/* Полоса долей побед/ничьих/поражений — не значок, а график: заливка плотная
   (полупрозрачные --form-* тут слились бы с фоном карточки). */
.team-formline__bar .w { background: var(--green); }
.team-formline__bar .d { background: #E5C453; }
.team-formline__bar .l { background: var(--red-live); }
.team-formline__runs { display: flex; gap: 14px; font-size: 11px; font-weight: 600; color: var(--muted); }
.team-formline__runs .w { color: var(--green-soft); font-weight: 800; }
.team-formline__runs .d { color: #E5C453; font-weight: 800; }
.team-formline__runs .l { color: var(--red-live-text); font-weight: 800; }

/* Голы по минутам: зеркальные бары */
.team-gmin__head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 14px; }
.team-gmin__head h3 { flex: 1; }
.team-gmin__head .gf { font-size: 10.5px; font-weight: 700; color: var(--green-soft); }
.team-gmin__head .ga { font-size: 10.5px; font-weight: 700; color: var(--red-live-text); }
.team-gmin__row { display: grid; grid-template-columns: 26px 1fr 64px 1fr 26px; align-items: center; gap: 8px; padding: 3px 0; }
.team-gmin__gf { font-size: 10.5px; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }
.team-gmin__ga { text-align: end; font-size: 10.5px; font-weight: 800; color: var(--red-live-text); font-variant-numeric: tabular-nums; }
.team-gmin__l { text-align: center; font-size: 10.5px; font-weight: 700; color: var(--dim); font-variant-numeric: tabular-nums; }
.team-gmin__bl { display: flex; justify-content: flex-end; min-width: 0; }
.team-gmin__br { min-width: 0; }
.team-gmin__bl span { display: block; height: 12px; background: var(--green); border-start-start-radius: 4px; border-start-end-radius: 0; border-end-end-radius: 0; border-end-start-radius: 4px; }
.team-gmin__br span { display: block; height: 12px; background: var(--red-live); border-start-start-radius: 0; border-start-end-radius: 4px; border-end-end-radius: 4px; border-end-start-radius: 0; }

/* Дома / В гостях (под-блок «Голы по минутам») */
.team-gha { border-top: 1px solid var(--line-soft); margin-top: 12px; padding-top: 12px; }
.team-gha__caps { display: grid; grid-template-columns: 1fr 96px 1fr; align-items: center; gap: 8px; margin-bottom: 8px; }
.team-gha__caps span { font-size: 10px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.team-gha__caps .r { text-align: end; }
.team-gha__row { display: grid; grid-template-columns: 30px 1fr 96px 1fr 30px; align-items: center; gap: 8px; padding: 4px 0; }
.team-gha__row .n { font-size: 11.5px; font-weight: 800; font-variant-numeric: tabular-nums; }
.team-gha__row.gf .n { color: var(--green-soft); }
.team-gha__row.ga .n { color: var(--red-live-text); }
.team-gha__row .n.r { text-align: end; }
.team-gha__cap { text-align: center; font-size: 10.5px; font-weight: 700; color: var(--muted); }
.team-gha__bl { display: flex; justify-content: flex-end; min-width: 0; }
.team-gha__br { min-width: 0; }
.team-gha__bl span, .team-gha__br span { display: block; height: 10px; }
.team-gha__bl span { border-start-start-radius: 4px; border-start-end-radius: 0; border-end-end-radius: 0; border-end-start-radius: 4px; }
.team-gha__br span { border-start-start-radius: 0; border-start-end-radius: 4px; border-end-end-radius: 4px; border-end-start-radius: 0; }
.team-gha__row.gf .team-gha__bl span, .team-gha__row.gf .team-gha__br span { background: var(--green); }
.team-gha__row.ga .team-gha__bl span, .team-gha__row.ga .team-gha__br span { background: var(--red-live); }
.team-gha__row.gf .team-gha__br span { opacity: 0.55; }   /* гостевые забитые — приглушены */
.team-gha__row.ga .team-gha__bl span { opacity: 0.55; }   /* домашние пропущенные — приглушены */
.team-gha__avg { display: grid; grid-template-columns: 30px 1fr 96px 1fr 30px; align-items: center; gap: 8px; }
.team-gha__avg.top { padding: 0 0 4px; }
.team-gha__avg .v { font-size: 9.5px; font-weight: 600; color: var(--dim); }
.team-gha__avg .v.r { text-align: end; }
.team-gha__avg .c { text-align: center; font-size: 9px; font-weight: 600; color: var(--faint); }

/* Пенальти: кольцо + плитки */
.team-pen { display: flex; align-items: center; gap: 20px; }
.team-pen__ring { position: relative; width: 86px; height: 86px; border-radius: 50%; background: conic-gradient(var(--green) 0% 100%); display: inline-flex; align-items: center; justify-content: center; flex: none; }
.team-pen__hole { width: 62px; height: 62px; border-radius: 50%; background: var(--panel); display: inline-flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; }
.team-pen__pct { font-size: 15px; font-weight: 800; color: var(--green-soft); }
.team-pen__cap { font-size: 8.5px; font-weight: 700; text-transform: uppercase; color: var(--dim); }
.team-pen__body { flex: 1; }
.team-pen__body h3 { margin-bottom: 8px; }
.team-pen__tiles { display: flex; gap: 8px; }
.team-pen__tile { flex: 1; background: var(--bg); border: 1px solid rgba(255, 255, 255, 0.07); border-radius: 10px; padding: 9px 6px; display: flex; flex-direction: column; gap: 2px; align-items: center; }
.team-pen__tile b { font-size: 14px; font-weight: 800; color: var(--ink-strong); }
.team-pen__tile.g b { color: var(--green-soft); }
.team-pen__tile.r b { color: var(--red-live-text); }
.team-pen__tile small { font-size: 9px; font-weight: 700; text-transform: uppercase; color: var(--dim); }

/* Карточки по минутам */
.team-cmin__head { display: flex; align-items: center; gap: 6px; margin-bottom: 12px; }
.team-cmin__head h3 { flex: 1; }
.team-cmin__pill-y { background: #E5C453; color: var(--on-green); font-size: 10.5px; font-weight: 800; border-radius: 999px; padding: 5px 11px; }
.team-cmin__pill-r { background: var(--bg); color: var(--ink-soft); border: 1px solid rgba(255, 255, 255, 0.1); font-size: 10.5px; font-weight: 600; border-radius: 999px; padding: 5px 11px; cursor: pointer; }
.team-cmin__pill-r:hover { border-color: rgba(255, 107, 107, 0.5); color: var(--red-live-text); }
.team-cmin__chart { display: flex; align-items: flex-end; gap: 8px; height: 104px; }
.team-cmin__col { flex: 1; display: flex; flex-direction: column; justify-content: flex-end; gap: 3px; height: 100%; }
.team-cmin__cnt { text-align: center; font-size: 10px; font-weight: 800; color: #E5C453; font-variant-numeric: tabular-nums; }
.team-cmin__bar { display: block; background: #E5C453; border-radius: 3px; }
.team-cmin__labels { display: flex; gap: 8px; margin-top: 6px; }
.team-cmin__labels span { flex: 1; text-align: center; font-size: 9px; font-weight: 700; color: var(--dim); font-variant-numeric: tabular-nums; }

/* Расстановки */
.team-fm h3 { margin-bottom: 10px; }
.team-fm__item { padding: 4px 0; }
.team-fm__cap { display: flex; align-items: baseline; gap: 8px; margin-bottom: 4px; }
.team-fm__n { font-size: 12px; font-weight: 700; color: var(--ink); }
.team-fm__g { margin-inline-start: auto; font-size: 11px; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }
.team-fm__track { height: 5px; border-radius: 3px; background: rgba(255, 255, 255, 0.06); overflow: hidden; }
.team-fm__track span { display: block; height: 100%; background: var(--green); }

/* Крупный счёт */
.team-big h3 { margin-bottom: 10px; }
.team-big__lbl { font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--green-soft); margin-bottom: 2px; }
.team-big__lbl.loss { color: var(--red-live-text); margin: 10px 0 2px; }
.team-big__row { display: grid; grid-template-columns: 52px 1fr 46px 1fr 12px; align-items: center; gap: 8px; padding: 9px 0; border-top: 1px solid rgba(255, 255, 255, 0.05); color: var(--ink); }
.team-big__row:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
.team-big__date { font-size: 10.5px; font-weight: 600; color: var(--dim); font-variant-numeric: tabular-nums; }
.team-big__home, .team-big__away { display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 700; min-width: 0; }
.team-big__home { justify-content: flex-end; text-align: end; }
.team-big__home span, .team-big__away span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-big__home img, .team-big__away img { width: 20px; height: 20px; object-fit: contain; flex: none; }
.team-big__score { text-align: center; font-size: 12.5px; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }
.team-big__row.loss .team-big__score { color: var(--red-live-text); }
.team-big__arrow { color: var(--dim); font-size: 12px; }
.team-big__foot { display: flex; flex-direction: column; gap: 8px; border-top: 1px solid var(--line-soft); margin-top: 12px; padding-top: 12px; }
.team-big__stat { display: flex; align-items: center; gap: 10px; }
.team-big__stat .lbl { font-size: 12px; font-weight: 600; color: var(--ink-soft); width: 110px; }
.team-big__stat .track { flex: 1; height: 6px; border-radius: 3px; background: rgba(255, 255, 255, 0.06); overflow: hidden; }
.team-big__stat .track span { display: block; height: 100%; }
.team-big__stat.cs .track span { background: var(--green); }
.team-big__stat.ng .track span { background: var(--red-live-text); }
.team-big__stat .val { font-size: 12px; font-weight: 800; width: 70px; text-align: end; }
.team-big__stat.cs .val { color: var(--green-soft); }
.team-big__stat.ng .val { color: var(--red-live-text); }

/* Трансферы: дата | игрок (резиновый) | стрелка | клуб | пилюля стоимости.
   Стоимости 160px — влезает «Возврат из аренды» целиком; игрок ужимается. */
.team-tr__head, .team-tr__row {
  display: grid; grid-template-columns: 74px 1fr 34px 220px 160px; align-items: center; gap: 12px;
  padding: 10px 18px;
}
.team-tr__head { padding: 12px 18px; font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
.team-tr__row { border-top: 1px solid var(--line-soft); }
.team-tr__row:hover { background: rgba(255, 255, 255, 0.03); }
.team-tr__date { font-size: 11.5px; font-weight: 600; color: var(--dim); font-variant-numeric: tabular-nums; }
.team-tr__player { display: flex; align-items: center; gap: 10px; min-width: 0; }
.team-tr__player img { width: 30px; height: 30px; border-radius: 50%; object-fit: cover; background: var(--bg); border: 1px solid rgba(255, 255, 255, 0.1); flex: none; }
.team-tr__player span { font-size: 13.5px; font-weight: 700; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-tr__dir { font-size: 15px; font-weight: 800; text-align: center; }
.team-tr__dir.in { color: var(--green-soft); }
.team-tr__dir.out { color: var(--red-live-text); }
.team-tr__club { display: flex; align-items: center; gap: 8px; min-width: 0; }
.team-tr__club img { width: 18px; height: 18px; object-fit: contain; flex: none; }
.team-tr__club span { font-size: 12.5px; font-weight: 600; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-tr__fee { text-align: end; min-width: 0; }
/* nowrap: колонка стоимости фиксированная, длинная подпись («Возврат из
   аренды» до сокращения локали) ломала пилюлю на две строки. inline-block +
   max-width + ellipsis — чтобы подпись длиннее колонки обрезалась, а не
   вылезала за карточку (min-width: 0 на ячейке даёт гриду её ужать);
   с inline-flex text-overflow не работает. */
.team-tr__pill { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; font-size: 11.5px; font-weight: 700; border-radius: 999px; padding: 4px 11px; background: rgba(255, 255, 255, 0.05); border: 1px solid var(--line-strong); color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.team-tr__pill.money { background: rgba(88, 219, 36, 0.1); border-color: rgba(88, 219, 36, 0.4); color: var(--green-soft); }
.team-tr__pill.loan { background: rgba(229, 196, 83, 0.1); border-color: rgba(229, 196, 83, 0.35); color: #E5C453; }

/* --- Адаптив страницы команды (поверх 99-responsive; специфичность .team-page) --- */
@media (max-width: 1180px) {
  .team-cal { grid-template-columns: 1fr 360px; }
}

@media (max-width: 600px) {
  .team-tabhead h2 { font-size: 17px; }

  /* --- Шапка команды по передаче «Моб Шапка команды» ---
     Форма стоит ТРЕТЬЕЙ СТРОКОЙ ПРАВОЙ КОЛОНКИ — под названием и строкой
     контекста, — а не отдельной строкой во всю ширину под гербом. Разница не
     только в отступе: герб центрируется по всей колонке из трёх строк, и
     карточка становится на два десятка пикселей ниже.

     Сделано сеткой, а не переносом флекса: в разметке форма — сосед
     .team-hero__body (на десктопе она уезжает вправо через margin-left: auto),
     и вложить её в колонку можно только сеткой родителя. margin у формы
     обнуляем — иначе auto-поле десктопа утащило бы её вправо и здесь. */
  .team-page .team-hero {
    display: grid;
    grid-template-columns: 52px minmax(0, 1fr);
    align-items: center;
    column-gap: 14px;
    /* 5px — тот же зазор, что между названием и строкой контекста внутри
       колонки; ещё 3px форма добирает своим margin-top. В передаче форма
       лежит в одной флекс-колонке с ними (gap 5) и имеет margin-top 3, а у
       нас она отдельная строка сетки — сумма обязана сойтись, иначе кружки
       липнут к строке контекста. */
    row-gap: 5px;
    padding: 18px 16px;
  }
  .team-page .team-hero__logo { grid-column: 1; grid-row: 1 / 3; }
  .team-page .team-hero__body { grid-column: 2; grid-row: 1; gap: 5px; }
  .team-page .team-hero__form { grid-column: 2; grid-row: 2; margin: 3px 0 0; }
  /* Год основания уступает место в лиге: в прототипе третьим пунктом строки
     стоит «1-е место», а год живёт только на десктопе. */
  .team-page .team-hero__founded,
  .team-page .team-hero__sep--founded { display: none; }
  .team-page .team-hero__rank { display: inline; }
  .team-page .team-hero__sep--rank { display: inline; }

  /* --- Вкладки: «Календарь» распадается на три пилюли (прототип m-team) ---
     Обёртка прозрачна, чтобы шесть пилюль лежали одной полосой, а не двумя
     группами. Стрелок-скроллеров у полосы нет: они перекрывали крайние
     пилюли, а ряд и так прокручивается свайпом (overflow-x у .team-tabs
     включает блок ≤940 в 99-responsive.css). */
  .team-mtabs { display: contents; }
  .team-tabs > [data-tab="calendar"] { display: none; }
  .team-page .team-block[data-cal-panel]:not(.is-active) { display: none; }
  /* Блоки календаря на мобилке не соседи, а вкладки — виден ровно один, и
     разделяющий их margin (.team-block + .team-block) добавлял «Результатам»
     лишние 24px сверху: под табами выходило 38px против 14px у «Матчей». */
  .team-page .team-block[data-cal-panel] { margin-top: 0; }
  /* Колонки календаря на мобилке прозрачны: блоки лежат в двух обёртках
     (слева матчи и результаты, справа таблица), и пустая обёртка всё равно
     съедала зазор сетки — у «Таблицы» под табами выходило 34px вместо 14px.
     С display: contents в сетке остаются только сами блоки, а виден из них
     ровно один. */
  .team-page .team-cal > div { display: contents; }
  /* Заголовки «Следующие» и «Результаты» на мобилке не нужны: их дословно
     повторяют пилюли «Матчи» и «Результаты» прямо над ними. У «Таблицы»
     заголовок остаётся — там не дубль, а название турнира и ссылка на полную
     таблицу. */
  .team-page .team-block[data-cal-panel="future"] > .team-block__head,
  .team-page .team-block[data-cal-panel="past"] > .team-block__head { display: none; }
  /* Отступ вокруг ряда вкладок — одинаковый сверху и снизу и мельче
     десктопных 24px; то же значение у страницы лиги (.lg-wrap). Раньше снизу
     выходило 56px: к зазору добавлялся снятый теперь заголовок блока. */
  .team-page .team-wrap { gap: 14px; }
  /* Превью состава в календаре — десктопный сайдбар; на мобилке для него нет
     своей пилюли, а полноценная вкладка «Состав» рядом. */
  .team-page #team-roster-block { display: none; }

  /* Строки матчей на мобилке — общие правила .lb-fixture из 99-responsive.css
     (две строки команд слева, время/счёт колонкой справа). Своих у страницы
     команды больше нет: она рисует матчи тем же партиалом match_row, что и
     лента главной, и повторять его раскладку здесь было бы расхождением
     ради расхождения.

     Мобильную сетку приходится повторить: десктопное правило выше идёт с
     `.team-fixes` (0,2,0) и перебило бы общее `.lb-fixture` (0,1,0) даже
     внутри @media. Ровно та же оговорка у избранного (15-favorites.css). */
  .team-fixes .lb-fixture { grid-template-columns: 18px minmax(0, 1fr) minmax(72px, auto); }
  /* Марка турнира в строке — десктопная: здесь турнир стоит в шапке
     карточки серии, и в строке он был бы вторым. */
  .team-fixes .lb-fixture__lg { display: none; }

  /* --- Серии по турнирам: каждая — своя карточка (прототип m-team) ---
     Карточкой становится группа, а не общий .lb-card: тот на мобилке
     распускается в обычную колонку, иначе получилась бы карточка в карточке. */
  .team-page .team-fixes {
    background: none;
    border: none;
    border-radius: 0;
    overflow: visible;
    display: flex;
    flex-direction: column;
    gap: 12px;
  }
  .team-page .team-fix-group {
    display: block;
    background: var(--panel);
    border: 1px solid var(--line);
    border-radius: var(--r-card);
    overflow: hidden;
  }
  .team-page .team-fix-group__head {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 10px 14px;
    border-bottom: 1px solid var(--line-soft);
    font-size: 12px;
    font-weight: 700;
    color: var(--muted);
  }
  .team-page .team-fix-group__head img { width: 18px; height: 18px; object-fit: contain; flex: none; }
  .team-page .team-fix-group__head span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* Разделитель между строками — внутри группы, а не поверх шапки: базовый
     border-top есть у каждой строки, и у первой он удваивал бы линию шапки. */
  .team-page .team-fix-group .lb-fixture { border-top: none; }
  .team-page .team-fix-group .lb-fixture + .lb-fixture { border-top: 1px solid var(--line-soft); }
  /* Группа целиком под «Показать все» — прячем вместе с шапкой, иначе под
     списком висела бы карточка из одного заголовка турнира. */
  .team-page .team-fix-group.is-extra { display: none; }
  .team-page .is-open .team-fix-group.is-extra { display: block; }

  /* Состав-таб: 10 колонок — горизонтальный скролл шире */
  .team-page .team-squad__group, .team-page .team-squad__head, .team-page .team-squad__row { min-width: 640px; }

  /* Статистика: форма-карточка в столбик */
  .team-formline { flex-direction: column; align-items: stretch; gap: 14px; }
  .team-formline__div { display: none; }

  /* Трансферы: горизонтальный скролл карточки */
  [data-panel="transfers"] .lb-card { overflow-x: auto; scrollbar-width: none; }
  [data-panel="transfers"] .lb-card::-webkit-scrollbar { display: none; }
  .team-tr__head, .team-tr__row { min-width: 560px; grid-template-columns: 64px 1fr 24px 150px 140px; gap: 8px; padding: 10px 14px; }
}

/* Селекты вкладки «Статистика» (турнир/сезон) — серверная добавка к макету */
.team-controls { display: inline-flex; gap: 8px; }
.team-controls select {
  background: var(--panel); color: var(--ink); border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 10px; padding-block: 8px; padding-inline: 12px 30px; font: inherit; font-size: 12.5px; font-weight: 600;
  appearance: none; -webkit-appearance: none; cursor: pointer; max-width: 240px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path d='M1 1l4 4 4-4' stroke='%239DA898' stroke-width='1.6' fill='none' stroke-linecap='round'/></svg>");
  background-repeat: no-repeat; background-position: right 11px center;
}
[dir="rtl"] .team-controls select { background-position: left 11px center; }
.team-controls select:hover { border-color: rgba(139, 233, 106, 0.5); }
/* Красный режим графика карточек + активная «красная» пилюля */
.team-cmin__bar.is-red { background: var(--red-live); }
/* На вкладке красных карточек цифра над столбиком тоже красная: жёлтое число
   над красным баром читалось как забытый кусок жёлтой вкладки. Текст ярче
   заливки бара — как у других красных подписей (team-big__lbl.loss). */
.team-cmin__cnt.is-red { color: var(--red-live-text); }
.team-cmin__pill-y.red { background: var(--red-live); color: #fff; }
/* Приглушение на время загрузки среза статистики */
#ts-wrap.ts-loading { opacity: 0.45; pointer-events: none; }

/* Фото игроков в таблице состава (просьба заказчика: только ПК; в макете
   этой колонки нет — на мобилке прячем, чтобы строки остались компактными) */
.team-squad__name { display: flex; align-items: center; gap: 10px; min-width: 0; }
.team-squad__name > span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.team-squad__photo {
  width: 28px; height: 28px; border-radius: 50%; object-fit: cover;
  background: var(--panel-2); flex: none;
}
.team-squad__photo--ph { display: inline-flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 800; color: var(--muted); }
@media (max-width: 600px) {
  .team-squad__photo { display: none; }
}

/* Мобильная сетка состава: фиксированные колонки уже, имя — гарантированные
   130px+ (на 640px десктопные ширины оставляли имени ~36px — текст пропадал) */
@media (max-width: 600px) {
  .team-page .team-squad__head, .team-page .team-squad__row {
    /* 58px под «Возраст»: в 48px шапка колонки не помещалась и наезжала на имя.
       Счётчики Г/А/ЖК/КК — одной ширины, как на десктопе (было 44/44/36/36). */
    grid-template-columns: 32px 22px minmax(130px, 1fr) 58px 44px 56px 36px 36px 36px 36px;
    gap: 8px; padding: 8px 12px;
  }
}

/* Мобилка: селекты статистики не влезают в строку заголовка — переносим
   на свою строку во всю ширину (row-gap — отступ тайтла от перенесённой строки) */
@media (max-width: 600px) {
  .team-tabhead--lg { flex-wrap: wrap; row-gap: 10px; }
  .team-controls { width: 100%; }
  .team-controls select { flex: 1; max-width: none; min-width: 0; }
}

/* ===== partials/13-match.css ===== */
/* --- Матч (mt-) --- */
.mt-page { width: 1140px; margin: 0 auto; padding: 12px 0; }
.mt-grid { display: grid; grid-template-columns: 1fr 348px; gap: 20px; align-items: start; }
.mt-col { display: flex; flex-direction: column; gap: 20px; min-width: 0; }

/* Верхней строки .mt-top («← Все матчи» + ряд соцкнопок) больше нет:
   шаринг живёт кнопкой «Поделиться» в шапке хиро (.lb-share, 00-core). */

/* Хиро матча */
.mt-hero { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; }
.mt-hero__head { display: flex; align-items: center; gap: 10px; padding: 12px 18px; border-bottom: 1px solid var(--line-soft); }
.mt-hero__head img { width: 18px; height: 18px; object-fit: contain; }
/* Название лиги — основное (как в шапке группы «Матчей»), тур рядом с ним
   вторичный (.lb-round). Размер строки хиро оставляем 12.5px: тур подхватывает
   его через font-size: inherit, иначе оказался бы крупнее самой лиги. */
.mt-hero__league { font-size: 12.5px; font-weight: 700; color: var(--ink-strong); }
.mt-hero__league .lb-round { font-size: inherit; }
.mt-hero__league:hover .lb-round { color: inherit; }  /* тур не отстаёт от зелёного ховера ссылки */
/* nowrap: дата не переносится в две строки («14 / августа») — в тесной шапке
   ужимается имя лиги (у него многоточие), а не дата. */
.mt-hero__date { margin-inline-start: auto; font-size: 12.5px; font-weight: 700; color: var(--ink); white-space: nowrap; }
.mt-hero__main { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 18px; padding: 20px 26px 18px; }
.mt-side { display: flex; align-items: center; gap: 13px; min-width: 0; }
.mt-side--home { justify-content: flex-end; text-align: end; }
.mt-side--away { justify-content: flex-start; }
/* object-fit: contain, а не cover: у хоккея логотипы приходят широкими
   (239×150), и cover срезал бы им бока. Футбольные и баскетбольные лого
   квадратные — для них это ничего не меняет.
   Без кружка-обводки: у эмблем свои очертания (щиты, овалы), и рамка вокруг
   прозрачных полей выглядела приклеенной. Правило общее для всех лого команд —
   см. остальные в этом файле. */
.mt-side img { width: 48px; height: 48px; object-fit: contain; flex: none; }
/* Лого — ссылка на команду наравне с названием. Обёртка нужна как флекс-
   элемент вместо самой картинки: иначе inline-<a> ломает выравнивание. */
.mt-side__logo { display: inline-flex; flex: none; }
.mt-side__box { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.mt-side--away .mt-side__box { align-items: flex-start; }
.mt-side--home .mt-side__box { align-items: flex-end; }
/* Цвет задан явно: у футбола имя команды — ссылка на страницу команды, и без
   этого правила оно красилось глобальным `a { color: var(--green) }`. */
.mt-side__name { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink); }
a.mt-side__name:hover { color: var(--green); }
/* Значок формы — span либо <a> на страницу того матча (id приходит с формой),
   поэтому размеры и цвета висят на обоих тегах: у ссылки иначе выиграл бы
   глобальный `a { color: var(--green) }` и буква на красном стала зелёной. */
.mt-form { display: flex; gap: 4px; }
.mt-form span,
.mt-form a {
  width: 16px; height: 16px; border-radius: 50%;
  font-size: 9px; font-weight: 800; color: #FFFFFF;
  display: inline-flex; align-items: center; justify-content: center;
}
.mt-form .w { background: var(--form-w); color: var(--form-w-ink); }
.mt-form .d { background: var(--form-d); color: var(--form-d-ink); }
.mt-form .l { background: var(--form-l); color: var(--form-l-ink); }
.mt-form a:hover { filter: brightness(1.15); }
.mt-hero__center { text-align: center; min-width: 170px; }
.mt-hero__score { font-family: var(--font-text); font-size: 38px; font-weight: 800; line-height: 1; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
/* Обёртка счёта — якорь для надстрочного итога серии пенальти. Стоит вокруг
   счёта ВСЕГДА, в любом статусе: серия доигрывается при открытой вкладке, и
   поллингу (live.js) нужно куда положить цифры, не пересобирая ячейку. */
/* display: block, а не inline-block: плашка статуса под счётом — inline-flex,
   и рядом с инлайновой обёрткой она вставала бы с ней в одну строку. */
.mt-hero__scoreline { position: relative; display: block; }
/* Надстрочный итог серии («2⁴ : ²2»). Живёт отдельным узлом РЯДОМ со счётом,
   а не внутри него: скрытие счёта (local-time.js) переписывает [data-score]
   через textContent и стёрло бы вложенные элементы насовсем.
   Отсюда и позиционирование от центра строки: у ничьей (а серия бывает только
   после неё) знаков слева и справа поровну, двоеточие ровно посередине, и
   отступ от центра — это половина ширины « : » плюс зазор. */
.mt-hero__pen {
  position: absolute; top: 2px;
  font-size: 17px; font-weight: 800; line-height: 1;
  font-variant-numeric: tabular-nums; color: var(--dim);
}
.mt-hero__pen.is-win { color: var(--green-soft); }
/* Отступ от центра — до внутреннего края цифры (ближнего к двоеточию):
   растёт цифра наружу, к своему числу счёта. Ставить её от края числа нельзя:
   ширина числа меняется вместе со счётом, а центр строки стоит на месте. */
.mt-hero__pen--home { inset-inline-end: 50%; margin-inline-end: 11px; }
.mt-hero__pen--away { inset-inline-start: 50%; margin-inline-start: 11px; }
/* Место под надстрочные цифры освобождает word-spacing: пробелы вокруг
   двоеточия в « : » раздвигаются, двоеточие остаётся ровно по центру. Только
   когда серия есть — обычному счёту лишняя разрядка ни к чему. */
.mt-hero__scoreline:has(.mt-hero__pen) .mt-hero__score { word-spacing: 12px; }
/* Счёт скрыт настройкой — прячем и надстрочный итог: маска «? : ?» рядом с
   живыми «4» и «2» выдавала бы ровно то, что настройка прячет. lb_spoiler
   вешает на [data-score] сам local-time.js, поэтому JS для этого не нужен. */
.mt-hero__score.lb_spoiler ~ .mt-hero__pen { visibility: hidden; }
/* Плашка статуса матча. Три состояния из макета (LiveBall Матч.dc.html):
   серая — матч завершён/не состоится, зелёная — ещё впереди, красная — идёт.
   БАЗА СЕРАЯ намеренно: статус без модификатора должен выглядеть нейтрально,
   а не кричать «LIVE» (до этой правки красным был залит вообще любой статус,
   включая «Матч окончен»). */
.mt-hero__status {
  display: inline-flex; align-items: center; gap: 7px; margin-top: 8px;
  padding: 5px 12px; border-radius: var(--r-pill);
  background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.16);
  font-size: 10.5px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--muted);
}
.mt-hero__status--live { background: rgba(229, 57, 53, 0.12); border-color: rgba(229, 57, 53, 0.45); color: var(--red-live-text); }
.mt-hero__status--up { background: rgba(88, 219, 36, 0.1); border-color: rgba(88, 219, 36, 0.35); color: var(--green-soft); }
/* Матч решён серией пенальти. Плашка зелёная, а не нейтральная серая: под
   счётом «2 : 2» серое «Матч окончен» читается как ничья, и главный итог
   матча пропадает. Отдельной строки со счётом серии здесь больше нет — он
   уехал надстрочными цифрами к самим числам (.mt-hero__pen). */
.mt-hero__status--pen { background: rgba(88, 219, 36, 0.1); border-color: rgba(88, 219, 36, 0.35); color: var(--green-soft); }
/* Обратный отсчёт живёт ВНУТРИ зелёной плашки. Разрядка у цифр меньше, чем у
   подписи: с 0.12em «14 : 39 : 23» расползается на пол-строки. */
.mt-hero__timer {
  font-size: 11.5px; font-weight: 800; letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums; color: var(--green-pale);
}

/* Полоса «Серия пенальти» — отдельная строка хиро под счётом.
   Кружок на каждый удар в порядке исполнения: зелёный ✓ — забит, тёмный с
   красной обводкой ✕ — не забит. Флагов в полосе нет намеренно: они уже стоят
   в двух шагах, в самой шапке, и команду здесь называет подпись слева. */
.mt-pens {
  display: flex; align-items: center; gap: 22px;
  padding: 13px 26px 15px; border-top: 1px solid var(--line-soft);
  background: rgba(88, 219, 36, 0.035);
}
/* Подпись переносится сама, а не по <br>: в uz и ka она заметно длиннее
   русской, и зашитый перенос рвал бы её не там. */
.mt-pens__cap {
  flex: none; max-width: 92px;
  font-size: 10.5px; font-weight: 800; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--dim); line-height: 1.3;
}
/* Сетка, а не две независимые флекс-строки: колонка кружков одна на оба ряда,
   поэтому итог у команды с четырьмя ударами стоит на том же уровне, что у
   команды с шестью. Флексом это не сделать — там ширина считается построчно, и
   цифры разъезжались тем сильнее, чем больше разница в числе ударов.
   1fr у кружков: на десктопе сетка сидит по max-content и колонка равна самому
   длинному ряду, на мобильном (rows шириной 100%) она тянется и прижимает итог
   к правому краю — то же правило закрывает оба случая. */
.mt-pens__rows { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 7px 10px; min-width: 0; }
.mt-pens__row { display: contents; }
.mt-pens__team {
  width: 96px; font-size: 12.5px; font-weight: 700; color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.mt-pens__row.is-win .mt-pens__team { color: var(--ink); }
/* Ряд НЕ переносится (flex-wrap не ставим): при внезапной смерти кружки просто
   продолжают строку — разорванный на две строки ряд ломает чтение «по порядку
   ударов», ради которого полоса и нужна. */
.mt-pens__shots { display: flex; gap: 5px; }
.mt-pens__shots i {
  width: 18px; height: 18px; border-radius: 50%; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  font-style: normal; font-size: 9.5px; font-weight: 800;
  border: 1px solid transparent;
}
.mt-pens__shots .is-goal { background: var(--green); border-color: var(--green); color: var(--on-green); }
.mt-pens__shots .is-miss { background: rgba(255, 255, 255, 0.04); border-color: rgba(255, 107, 107, 0.45); color: var(--red-live-text); }
.mt-pens__tot {
  margin-inline-start: 6px; font-size: 14px; font-weight: 800;
  font-variant-numeric: tabular-nums; color: var(--dim);
}
.mt-pens__row.is-win .mt-pens__tot { color: var(--green-soft); }
/* Галочка перед вердиктом есть только в мобильном макете («LiveBall Моб
   Пенальти»): на десктопе вердикт — короткая пилюля справа в строке, и знак
   в ней лишний. Разметка одна на оба размера, поэтому иконку гасит CSS. */
.mt-pens__ok { display: none; flex: none; color: var(--green-soft); }
.mt-pens__verdict {
  margin-inline-start: auto; flex: none; white-space: nowrap;
  padding: 7px 14px; border-radius: var(--r-pill);
  background: rgba(88, 219, 36, 0.1); border: 1px solid rgba(88, 219, 36, 0.3);
  font-size: 12.5px; font-weight: 700; color: var(--green-pale);
}
/* Счёт скрыт настройкой — полосы нет вовсе: кружки ударов это тот же счёт,
   только подробнее, и прятать один, оставив другой, бессмысленно. Класс
   lb_spoiler вешает на [data-score] сам local-time.js. */
.mt-hero:has(.mt-hero__score.lb_spoiler) .mt-pens { display: none; }

/* Прогноз «Кто победит» (внутри хиро) */
.mt-predict { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 12px 18px; border-top: 1px solid var(--line-soft); }
.mt-predict[hidden] { display: none; }
.mt-predict__q { font-size: 12.5px; font-weight: 700; color: var(--muted); }
.mt-predict__opts { display: flex; gap: 8px; margin-inline-start: auto; }
.mt-predict button {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  background: var(--bg); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: var(--r-pill);
  padding: 7px 14px; font-size: 12.5px; font-weight: 700; color: var(--ink);
}
.mt-predict button:hover { border-color: var(--hover-green-line); }
.mt-predict img { width: 16px; height: 16px; object-fit: contain; flex: none; }
.mt-predict .x { width: 16px; height: 16px; border-radius: 50%; background: rgba(255, 255, 255, 0.09); color: var(--ink-soft); display: inline-flex; align-items: center; justify-content: center; font-size: 7px; font-weight: 800; flex: none; }

/* Прогноз после голоса (_poll.html + match-poll.js): счётчик уезжает вправо на
   место кнопок, полоска с легендой переносится на свою строку. */
.mt-predict__count { margin-inline-start: auto; font-size: 11.5px; font-weight: 600; color: var(--dim); }
.mt-predict__count[hidden], .mt-predict__opts[hidden], .mt-predict__res[hidden] { display: none; }
.mt-predict__res { flex: 1 1 100%; }
.mt-predict__bar { display: flex; gap: 2px; height: 8px; border-radius: var(--r-pill); overflow: hidden; }
.mt-predict__seg { background: rgba(245, 247, 243, 0.4); transition: width .3s; }
.mt-predict__seg[data-poll-seg="away"] { background: rgba(116, 172, 223, 0.55); }
.mt-predict__seg.is-mine { background: var(--green); }
.mt-predict__legend { display: flex; gap: 18px; margin-top: 9px; }
.mt-predict__leg { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--ink); }
.mt-predict__leg b { font-weight: 800; font-variant-numeric: tabular-nums; }
.mt-predict__leg.is-mine { color: var(--green-soft); }
.mt-predict__mine {
  flex: none; white-space: nowrap;
  font-size: 9.5px; font-weight: 800; color: var(--on-green);
  background: var(--green); border-radius: var(--r-pill); padding: 2px 7px;
}
.mt-predict__mine[hidden] { display: none; }

/* Прогноз на матч — тихая строка в подвале хиро, последний ребёнок карточки,
   сразу под «Кто победит?» (хендофф prognoz_3a, 05.09.2026). Заменила
   отдельную зелёную плашку между карточкой и плеером: акцентный градиент с
   чёрной кнопкой оттягивал внимание сильнее, чем стоит рекламной ссылке.
   Вся строка — одна ссылка (на сайте ad/_prognoz_row.html); нижние углы
   скругляет overflow: hidden карточки. Цвета хендоффа — токены: #9DA898 =
   --muted, #C9D2C4 = --ink-soft, #C0F4A4 = --green-pale, #58DB24 = --green. */
.mt-prognoz {
  display: flex; align-items: center; gap: 8px;
  padding: 11px 18px;
  border-top: 1px solid var(--line-soft);
  background: rgba(255, 255, 255, 0.02);
  color: var(--muted);
  font-size: 12.5px; font-weight: 600;
}
.mt-prognoz:hover { background: rgba(255, 255, 255, 0.04); color: var(--ink-soft); }
.mt-prognoz svg { flex: none; color: var(--green); }
.mt-prognoz__t { min-width: 0; }
.mt-prognoz__go { margin-inline-start: auto; flex: none; font-weight: 700; color: var(--green-pale); white-space: nowrap; }

/* Плеер */
.mt-player { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; }
.mt-player__langs { display: flex; align-items: center; gap: 8px; padding: 10px 16px; border-bottom: 1px solid var(--line); font-size: 12.5px; color: var(--muted); }
.mt-player__langs svg { color: var(--green); flex: none; }
.mt-player__langs > span { font-weight: 700; margin-inline-end: 4px; }
.mt-player__langs button { padding: 7px 15px; border-radius: var(--r-pill); font-size: 12px; font-weight: 600; color: var(--ink-soft); background: var(--bg); border: 1px solid var(--line-strong); }
.mt-player__langs button:not(.is-active):hover { border-color: var(--hover-green-line); color: var(--green-pale); }
.mt-player__langs button.is-active { background: var(--green); color: var(--on-green); border-color: var(--green); font-weight: 800; }

/* Панели табов */
.mt-panel-card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 20px; }
.mt-panel-card__head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.mt-panel-card__head h2 { flex: 1; font-family: var(--font-display); font-size: 16px; font-weight: 700; }

/* События: двусторонняя лента — хозяева слева, гости справа, минута в
   центре (та же геометрия, что у шапки матча над панелью). Принадлежность
   события кодируется стороной, поэтому логотипы из строк ушли: одинаковая
   эмблема в дальнем правом углу каждой строки читалась хуже, чем положение.
   Иконка прижата к центральной колонке — тип и сторона видны одним взглядом. */
.mt-ev-filters { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.mt-ev-filters .lb-pill { padding: 6px 12px; font-size: 11.5px; }
.mt-ev-filters .lb-pill:not(.is-active) { background: var(--bg); }
.mt-ev-filters .n { font-size: 10px; font-weight: 700; color: var(--dim); }
.mt-ev-filters .is-active .n { font-weight: 800; color: inherit; opacity: 0.75; }
.mt-ev-teams { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 2px 6px 10px; }
.mt-ev-teams .t { display: flex; align-items: center; gap: 7px; min-width: 0; font-size: 12px; font-weight: 700; color: var(--muted); }
.mt-ev-teams .t > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-ev-teams .t img { width: 17px; height: 17px; object-fit: contain; flex: none; }
.mt-event { display: grid; grid-template-columns: minmax(0, 1fr) 56px minmax(0, 1fr); align-items: center; gap: 8px; padding: 9px 6px; border-top: 1px solid var(--line-soft); }
.mt-event__min { grid-row: 1; grid-column: 2; text-align: center; font-size: 13px; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }
.mt-event__body { grid-row: 1; grid-column: 1; min-width: 0; display: flex; align-items: center; justify-content: flex-end; gap: 8px; text-align: end; }
.mt-event.is-a .mt-event__body { grid-column: 3; flex-direction: row-reverse; justify-content: flex-end; text-align: start; }
.mt-event__ico { display: inline-flex; flex: none; }
.mt-event__ico.goal { color: var(--green); }
/* Автогол — тот же мяч, но красный: строка стоит на стороне команды, которой
   гол засчитан, и зелёным «Стоунз · (АГ)» под её флагом читался как гол её же
   игрока. Фильтр, счёт и карточка на мобилке у него общие с голом (data-st). */
.mt-event__ico.owngoal { color: var(--red-live-text); }
.mt-event__ico.yellow { color: #F5C542; }
/* Красный — как у стрелки «ушёл» замены ниже и карточек в лиге/составе.
   Правила не было вовсе (в демо макета нет удалений), и иконка КК
   наследовала белый цвет текста. */
.mt-event__ico.red { color: var(--red-live-text); }
.mt-event__ico.sub svg path:first-child { stroke: var(--green); }
.mt-event__ico.sub svg path:last-child { stroke: var(--red-live-text); }
.mt-event__text { font-size: 13.5px; min-width: 0; }
.mt-event__text b { font-weight: 700; color: var(--ink); }
.mt-event__text span { color: var(--muted); }
/* Замена читается «ушёл → вышел»: цвет тот же, что у стрелок иконки события —
   зелёный это тот, кто СЕЙЧАС на поле. Раньше оба имени были одинаково
   приглушённые, и кто кого меняет, приходилось выводить из предлога. */
.mt-event__text .mt-event__out { color: var(--muted); }
.mt-event__text .mt-event__arr { color: var(--dim); }
.mt-event__text .mt-event__in { color: var(--green-soft); font-weight: 600; }
/* Мобильная редакция строки (фамилия + уточнение) и бейдж клуба лежат в той же
   разметке и включаются в 99-responsive.css: сторона события на десктопе видна
   по колонке, а тип — по первому слову, так что здесь оба узла лишние. */
.mt-event__name, .mt-event__detail, .mt-event__club { display: none; }
.mt-event__score { flex: none; padding: 2px 8px; border-radius: 8px; background: var(--bg); border: 1px solid var(--line-ctl); font-size: 12px; font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
/* Разделитель таймов. data-st="break" в разметке — чтобы фильтры
   (Голы/Карточки/Замены) прятали его вместе с чужими строками:
   app.js скрывает все [data-st], не равные выбранному значению. */
.mt-ev-break { display: flex; justify-content: center; padding: 8px 6px; border-top: 1px solid var(--line-soft); }
.mt-ev-break span { padding: 3px 10px; border-radius: var(--r-pill); background: var(--bg); border: 1px solid var(--line-ctl); font-size: 10.5px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--dim); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* Составы: команды над полем */
.mt-lineups__teams { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.mt-lineups__team { display: flex; align-items: center; gap: 10px; min-width: 0; }
.mt-lineups__team img { width: 22px; height: 22px; object-fit: contain; flex: none; }
/* Название режется многоточием, а не переносится: в шапке 305px (телефон) два
   названия со схемами не помещаются физически — «Атлетико Паранаэнсе» одно
   занимает ~130px. Без overflow тесному флексу было всё равно: он ужимал бокс
   до 33px, и однословное «Ботафого» вылезало поверх схемы соседа.
   Ужимаются оба названия пропорционально своей длине, так что короткое теряет
   заметно меньше длинного. */
.mt-lineups__team .nm { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; font-weight: 800; }
/* Схема не переносится и не сжимается: дефисы в «4-2-3-1» — законные места
   переноса, и на узкой строке она рассыпалась по одной цифре в строку,
   растягивая шапку составов втрое. Остаток строки забирает название
   команды — его перенести не жалко. */
.mt-lineups__team .scheme { flex: none; white-space: nowrap; font-size: 12px; font-weight: 600; color: var(--dim); }

/* Составы: поле */
.mt-pitch {
  position: relative; height: 460px; border-radius: 14px; overflow: hidden;
  background: repeating-linear-gradient(90deg, #166322 0 64px, #125420 64px 128px);
  border: 1px solid var(--line);
}
.mt-pitch__lines { position: absolute; inset: 14px; border: 1.5px solid rgba(255, 255, 255, 0.45); border-radius: 4px; pointer-events: none; }
.mt-pitch__lines::before { content: ''; position: absolute; top: 0; bottom: 0; inset-inline-start: 50%; width: 1.5px; background: rgba(255, 255, 255, 0.45); }
.mt-pitch__lines::after { content: ''; position: absolute; left: 50%; top: 50%; width: 110px; height: 110px; transform: translate(-50%, -50%); border: 1.5px solid rgba(255, 255, 255, 0.45); border-radius: 50%; }
.mt-pitch__box { position: absolute; top: 50%; width: 86px; height: 218px; border: 1.5px solid rgba(255, 255, 255, 0.45); transform: translateY(-50%); pointer-events: none; }
.mt-pitch__box--l { inset-inline-start: 14px; border-inline-start: none; }
.mt-pitch__box--r { inset-inline-end: 14px; border-inline-end: none; }
/* Ширина фишки ≤ шага колонок lineupStyle: при схемах из четырёх линий
   (4-2-3-1 и т.п.) соседние колонки стоят через 9.33% и часто на одной
   высоте — без ограничения длинные фамилии наезжают на соседа. Имя при этом
   переносится на вторую строку (а не режется ellipsis'ом с первой) и живёт
   вне потока, иначе двухстрочные подписи сдвигали бы аватары своей линии. */
/* Координаты приходят переменными (--px — вдоль поля, от ворот к воротам;
   --py — поперёк), а не готовыми left/top: на телефоне поле разворачивается
   вертикально, и оси там меняются местами (см. блок 600px ниже в этом файле). */
.mt-chip { position: absolute; left: var(--px); top: var(--py); transform: translate(-50%, -50%); width: 9%; display: flex; flex-direction: column; align-items: center; }
/* Справа налево (/he) хозяева в шапке составов стоят справа — и на поле тоже.
   Поле для этого ПОВОРАЧИВАЕТСЯ на 180°, а не отражается: при отражении левый
   защитник оказался бы на правом фланге (см. поворот на телефоне ниже, та же
   история). Координаты у фишки поэтому физические (left/top), а не логические:
   логический inset-inline-start отразил бы только одну ось. */
[dir="rtl"] .mt-chip { left: calc(100% - var(--px)); top: calc(100% - var(--py)); }
.mt-chip__ava-wrap { position: relative; display: inline-flex; filter: drop-shadow(0 3px 10px rgba(0, 0, 0, 0.4)); }
.mt-chip__ava { width: 36px; height: 36px; border-radius: 50%; object-fit: cover; background: #1A2416; border: 2px solid; flex: none; }
.mt-chip--home .mt-chip__ava { border-color: #F5F7F3; }
.mt-chip--away .mt-chip__ava { border-color: #74ACDF; }
.mt-chip__name { position: absolute; top: calc(100% + 3px); inset-inline-start: 0; inset-inline-end: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: break-word; font-size: 10.5px; line-height: 1.2; font-weight: 700; color: #FFFFFF; text-shadow: 0 1px 4px rgba(0, 0, 0, 0.85); text-align: center; }
.mt-chip__no { opacity: 0.75; font-variant-numeric: tabular-nums; }

/* Составы: запасные под полем */
.mt-squad { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; margin-top: 18px; }
.mt-squad__col { min-width: 0; }
/* Шапка колонки: лого + название со схемой под ним. Заголовок колонки был
   объединённый («Запасные · Англия»), но по хендоффу плашка тренера стоит
   МЕЖДУ названием команды и словом «Запасные» — в одну строку это не
   складывается. Гостевая колонка зеркалится здесь же, разметка у обеих одна. */
.mt-squad__team { display: flex; align-items: center; gap: 8px; min-width: 0; margin-bottom: 12px; }
.mt-squad__team img { width: 20px; height: 20px; object-fit: contain; flex: none; }
.mt-squad__team .t { display: flex; flex-direction: column; min-width: 0; }
.mt-squad__team .nm { font-size: 13px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-squad__team .scheme { font-size: 10.5px; font-weight: 600; color: var(--dim); font-variant-numeric: tabular-nums; }
.mt-squad__col--away .mt-squad__team { flex-direction: row-reverse; }
.mt-squad__col--away .mt-squad__team .t { align-items: flex-end; }
.mt-squad__col h3 {
  display: flex; align-items: center; gap: 8px;
  font-size: 10.5px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--dim); margin-bottom: 10px;
}
.mt-squad__col--away h3 { justify-content: flex-end; }
.mt-squad__row { display: flex; align-items: center; gap: 10px; padding: 5px 0; }
.mt-squad__col--away .mt-squad__row { justify-content: flex-end; }
.mt-squad__row img { width: 26px; height: 26px; border-radius: 50%; object-fit: cover; background: #1A2416; border: 1px solid var(--line-strong); flex: none; }
.mt-squad__row .num { width: 20px; font-size: 11.5px; font-weight: 700; color: var(--dim); font-variant-numeric: tabular-nums; flex: none; text-align: end; }
.mt-squad__col--away .mt-squad__row .num { text-align: start; }
.mt-squad__row .nm { font-size: 13px; font-weight: 600; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-squad__col--away .mt-squad__row .nm { text-align: end; }
.mt-squad__row .sub { font-size: 11px; font-weight: 800; color: var(--green-soft); flex: none; }
/* Тренер стоит НАД списком запасных (порядок из хендоффа). На десктопе это
   пара «тайтл — фамилия», как и было, когда он был h3 со строкой; плашкой на
   подложке он становится только на телефоне (99-responsive.css). */
.mt-squad__coach { margin-bottom: 14px; }
.mt-squad__coach .lbl {
  display: block; margin-bottom: 3px;
  font-size: 10.5px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--dim);
}
.mt-squad__coach .nm { display: block; padding: 5px 0; font-size: 13px; font-weight: 600; color: var(--ink-soft); }
.mt-squad__col--away .mt-squad__coach { text-align: end; }

/* Статистика (бары от центра). Отступ под шапкой — базовые 14px, как у
   «Составов»: ужатие до 6px было под старую панель без легенды команд,
   с легендой заголовок липнул к ней заметно сильнее соседних блоков. */
.mt-stat { padding: 12px 0 4px; }
.mt-stat__row { display: flex; align-items: center; justify-content: space-between; font-size: 13px; margin-bottom: 8px; }
.mt-stat__row span { font-weight: 800; font-variant-numeric: tabular-nums; }
.mt-stat__row .lbl { color: var(--muted); font-weight: 600; }
.mt-stat__bar { display: flex; gap: 4px; height: 7px; }
.mt-stat__bar .h,
.mt-stat__bar .a { flex: 1; display: flex; background: rgba(255, 255, 255, 0.06); border-radius: var(--r-pill); overflow: hidden; }
.mt-stat__bar .h { justify-content: flex-end; }
.mt-stat__bar i { display: block; height: 100%; border-radius: var(--r-pill); }
.mt-stat__bar .h i { background: var(--green); }
.mt-stat__bar .a i { background: var(--muted); }

/* Очные встречи */
.mt-h2h__summary { display: grid; grid-template-columns: 1fr auto 1fr; gap: 14px; align-items: center; margin-bottom: 10px; }
.mt-h2h__summary .side { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.mt-h2h__summary .side.r { justify-content: flex-end; }
.mt-h2h__summary img { width: 22px; height: 22px; object-fit: contain; flex: none; }
.mt-h2h__summary b { font-family: var(--font-display); font-size: 20px; font-weight: 700; font-variant-numeric: tabular-nums; }
/* Счётчики и полоса очных встреч — фирменными цветами клубов: шаблон кладёт
   их в --h2h-h/--h2h-a инлайном, когда контракт прислал color. Лесенка из
   двух строк и пол яркости — как у .lg-hero__glow: тёмный клубный цвет (у
   ПСЖ #004170) на тёмной панели иначе не виден; oklch поднимает только
   светлоту.
   Из-за этого же пола цвета нельзя брать из контракта как есть: подъём
   светлоты сближает тёмный и светлый оттенки одного тона, и пара синих
   клубов (Динамо — Крылья Советов) красилась одинаково. Пару подбирает
   сервер (render.h2hColors): слившаяся сторона приезжает без переменной и
   садится на дефолт — здесь эти дефолты и работают.

   Дефолты — наш зелёный (--green) и орхидея. Раньше тут стояли демо-цвета
   макета (почти белый #F5F7F3 и синий), и у пары без цветов — а у женских
   команд, дублей и мелких лиг контракт color не отдаёт вовсе — при счёте
   вроде «5 : 0 : 0» от полосы оставался ОДИН сегмент почти белого на 75%
   прозрачности, то есть серая черта поперёк карточки.
   Значения ОБЯЗАНЫ совпадать с h2hFallbackHome/h2hFallbackAway в
   render/colorfuncs.go: сервер по ним решает, не сольётся ли клубный цвет с
   дефолтом соседней стороны. Зелёный тут литералом, а не var(--green):
   в Go-константе всё равно лежит значение, и два литерала рядом видно
   грепом, а «--green против hex» — нет. */
.mt-h2h__summary .h { color: #58DB24; color: oklch(from var(--h2h-h, #58DB24) max(l, 0.72) c h); }
.mt-h2h__summary .a { color: #E07CE6; color: oklch(from var(--h2h-a, #E07CE6) max(l, 0.72) c h); }
.mt-h2h__summary .side small { font-size: 11.5px; font-weight: 600; color: var(--muted); }
.mt-h2h__summary .mid { display: inline-flex; flex-direction: column; align-items: center; gap: 1px; }
.mt-h2h__summary .mid b { color: var(--muted); }
.mt-h2h__summary .mid small { font-size: 10px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.mt-h2h__strip { display: flex; gap: 3px; height: 8px; border-radius: var(--r-pill); overflow: hidden; margin-bottom: 16px; }
.mt-h2h__strip span { display: block; }
.mt-h2h__strip .h { width: 40%; background: #58DB24; background: oklch(from var(--h2h-h, #58DB24) max(l, 0.55) c h / alpha); }
.mt-h2h__strip .mid { width: 20%; background: rgba(255, 255, 255, 0.16); }
.mt-h2h__strip .a { width: 40%; background: #E07CE6; background: oklch(from var(--h2h-a, #E07CE6) max(l, 0.55) c h / alpha); }
/* Строка-ссылка на страницу матча: цвет фиксируем, чтобы глобальный a:hover не зеленил текст */
.mt-h2h__row { display: grid; grid-template-columns: 150px 1fr auto 1fr; align-items: center; gap: 12px; padding: 10px 6px; border-top: 1px solid var(--line-soft); color: var(--ink); }
.mt-h2h__row:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
.mt-h2h__date { min-width: 0; }
.mt-h2h__date b { display: block; font-size: 12.5px; font-weight: 700; font-variant-numeric: tabular-nums; }
.mt-h2h__date small { display: block; font-size: 11.5px; color: var(--dim); margin-top: 2px; }
.mt-h2h__team { display: flex; align-items: center; gap: 9px; font-size: 13.5px; font-weight: 600; min-width: 0; }
.mt-h2h__team.r { justify-content: flex-end; text-align: end; }
.mt-h2h__team img { width: 20px; height: 20px; object-fit: contain; flex: none; }
.mt-h2h__team.win { color: var(--green-soft); font-weight: 800; }
.mt-h2h__sc { font-size: 14px; font-weight: 800; font-variant-numeric: tabular-nums; }

/* Таблица (группы) */
.mt-groups { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.mt-groups > div { min-width: 0; }
/* Таблица одна (обе команды в одной группе) — на всю ширину: в половине колонки
   у полной таблицы лиги названия клубов сжимаются в многоточие. Две колонки
   нужны только плей-офф, где групп две. */
.mt-groups > div:only-child { grid-column: 1 / -1; }
.mt-gtable__head, .mt-gtable__row { display: grid; grid-template-columns: 22px 1fr 30px 30px 30px 30px 34px; align-items: center; gap: 4px; }
/* Горизонтальный отступ строк 12px с ОБЕИХ сторон подложки: место слева
   прижато к краю колонки, очки справа выровнены по правому краю (не по
   центру) — иначе у подсвеченной строки число сидело в 4px от края тинта,
   а очки висели в ~13px, и подложка выглядела кривой. Отступ шапки обязан
   совпадать с отступом строк, иначе колонки разъезжаются. */
.mt-gtable__head {
  padding: 0 12px 8px; border-bottom: 1px solid rgba(255, 255, 255, 0.07);
  font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim);
}
.mt-gtable__head .c:last-child { text-align: end; }
/* Заголовок таблицы — ОБЫЧНАЯ шапка панели (.mt-panel-card__head + h2), а не
   свой класс с теми же значениями: иначе типографика заголовков панелей матча
   живёт в двух местах. Панель своего «Таблица» больше не печатает (см.
   match.html) — заголовок с названием лиги теперь единственный, и стоит он НАД
   подписями колонок: пока он жил в той же сетке, что и буквы колонок, он
   накрывал собой первые две ячейки, и над местом и клубом подписей не было.
   Лига внутри заголовка — с логотипом и ссылкой на свою страницу: в макете это
   просто текст, но со страницы матча иначе в лигу не уйти. */
.mt-gtable__lg { display: flex; align-items: center; gap: 8px; min-width: 0; color: inherit; }
.mt-gtable__lg:hover { color: var(--green-soft); }
.mt-gtable__lg img { width: 16px; height: 16px; object-fit: contain; flex: none; }
.mt-gtable__lg span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-gtable__row { padding: 8px 12px; border-top: 1px solid rgba(255, 255, 255, 0.04); font-size: 13px; border-radius: 8px; }
/* Играющие в ЭТОМ матче команды подсвечены всегда — тем же зелёным тинтом,
   что «своя» команда в лиговой таблице (.lg-standings__row.is-me). Во время
   матча поверх ложится красный live-тинт с точкой (порядок правил важен). */
.mt-gtable__row.is-me { background: rgba(88, 219, 36, 0.07); }
.mt-gtable__row.is-live { background: rgba(229, 57, 53, 0.08); }
/* Номер места — без выделения топ-2 зелёным: это наследие демо группового
   этапа (топ-2 выходят из группы), в полной таблице лиги оно читалось как
   случайный акцент. */
.mt-gtable__row .pos { font-weight: 800; color: var(--dim); font-variant-numeric: tabular-nums; }
.mt-gtable__row .nm { display: flex; align-items: center; gap: 8px; font-weight: 600; min-width: 0; }
/* Имя-ссылка — обычным цветом текста, не глобальным зелёным ссылок: зелёные
   имена во всю колонку читались как выделение и глушили настоящую подсветку
   строк (is-me/is-live). Зелёный остаётся на hover. */
.mt-gtable__row .nm a { color: var(--ink); }
.mt-gtable__row .nm a:hover { color: var(--green-soft); }
.mt-gtable__row .nm img { width: 18px; height: 18px; object-fit: contain; flex: none; }
/* На сайте название клуба — ссылка на его страницу, в макете просто span.
   Многоточие нужно обоим: в полной таблице длинные имена иначе выдавливают
   колонки И/В/Н/П из сетки строки. */
.mt-gtable__row .nm span,
.mt-gtable__row .nm a { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-gtable__head .c,
.mt-gtable__row .c { text-align: center; }
.mt-gtable__row .c { color: var(--muted); font-variant-numeric: tabular-nums; }
.mt-gtable__row .p { text-align: end; font-weight: 800; font-variant-numeric: tabular-nums; }
.mt-gtable__legend { display: flex; align-items: center; gap: 8px; margin-top: 14px; font-size: 11.5px; color: var(--dim); }

/* Сайдбар: коэффициенты (двухэтажные ряды) — .sm-bk__* в 19-sports.css.
   Блок общий с UFC и Формулой-1, поэтому переехал в ядро спортивных разделов;
   здесь остался только этот указатель, чтобы правку не искали в 13-match. */

/* Голосование */
.mt-vote .mt-panel-card__head { margin-bottom: 4px; }
.mt-vote__count { font-size: 12px; font-weight: 600; color: var(--dim); margin-bottom: 12px; }
.mt-vote__btn { display: flex; align-items: center; gap: 10px; width: 100%; padding: 11px 14px; background: var(--bg); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: var(--r-ctl); margin-bottom: 8px; font-size: 13px; font-weight: 700; color: var(--ink); text-align: start; }
.mt-vote__btn:hover { border-color: var(--hover-green-line); }
.mt-vote__btn img { width: 16px; height: 16px; object-fit: contain; flex: none; }
.mt-vote__btn .x { width: 16px; height: 16px; border-radius: 50%; background: rgba(255, 255, 255, 0.09); color: var(--ink-soft); display: inline-flex; align-items: center; justify-content: center; font-weight: 800; font-size: 7px; flex: none; }

/* Живой опрос (_poll.html + match-poll.js). Список опций — обёртка вокруг тех
   же .mt-vote__btn; отступ по-прежнему на кнопках, gap здесь бы удвоил его. */
.mt-vote[hidden] { display: none; }
.mt-vote__opts[hidden], .mt-vote__res[hidden], .mt-vote__mine[hidden] { display: none; }
.mt-vote__opts .mt-vote__btn:last-child { margin-bottom: 0; }
.mt-vote__res { display: flex; flex-direction: column; gap: 8px; }
.mt-vote__row {
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: 10px;
  padding: 11px 14px; background: var(--bg);
  border: 1px solid var(--line); border-radius: var(--r-ctl);
  font-size: 13px; font-weight: 700; color: var(--ink);
}
/* Заливка — подложка на всю высоту строки, содержимое поднимаем над ней. */
.mt-vote__fill { position: absolute; inset-inline-start: 0; top: 0; bottom: 0; background: rgba(255, 255, 255, 0.05); transition: width .3s; }
.mt-vote__row > :not(.mt-vote__fill) { position: relative; }
.mt-vote__row img { width: 16px; height: 16px; object-fit: contain; flex: none; }
/* Название режется многоточием, а пилюля «Ваш голос» и проценты не сжимаются.
   Без этого длинное имя («Депортиво Ла-Корунья») переносилось на две строки, а
   заодно доламывало соседей: флекс отбирал ширину и у пилюли, и она вставала
   «Ваш / голос» в две строки, вытягивая строку с 40px до 56px. */
.mt-vote__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mt-vote__pct { flex: none; margin-inline-start: auto; font-weight: 800; font-variant-numeric: tabular-nums; }
.mt-vote__row.is-mine { border-color: rgba(88, 219, 36, 0.5); }
.mt-vote__row.is-mine .mt-vote__fill { background: rgba(88, 219, 36, 0.16); }
.mt-vote__row.is-mine .mt-vote__name { color: var(--green-soft); }
.mt-vote__mine {
  flex: none; white-space: nowrap;
  font-size: 9.5px; font-weight: 800; color: var(--on-green);
  background: var(--green); border-radius: var(--r-pill); padding: 2px 7px;
}
.mt-vote__note { font-size: 11.5px; font-weight: 600; color: var(--dim); }

/* Инфо о матче */
.mt-info .mt-panel-card__head { margin-bottom: 8px; }
.mt-info__row { display: flex; justify-content: space-between; gap: 12px; padding: 9px 0; border-top: 1px solid var(--line-soft); font-size: 13px; }
.mt-info__row:first-of-type { border-top: none; }
.mt-info__row .k { color: var(--dim); font-weight: 600; }
.mt-info__row .v { font-weight: 700; text-align: end; }

/* SEO */
.mt-seo { border-top: 1px solid rgba(255, 255, 255, 0.07); margin-top: 24px; }
.mt-seo__grid { width: 1140px; margin: 0 auto; display: grid; grid-template-columns: 380px 1fr; gap: 48px; padding: 36px 0 40px; }
.mt-seo__grid .lb-kicker { margin-bottom: 14px; }
.mt-seo__grid .lb-h2 { font-size: 21px; line-height: 1.4; }
.mt-seo__body { font-size: 14.5px; line-height: 1.7; color: var(--ink-soft); }
.mt-seo__body p { margin: 0 0 12px; }
.mt-seo__body p:last-child { margin-bottom: 0; color: var(--ink); font-weight: 600; }

/* --- Адаптив: 1:1 с мобильным макетом (m-match) --- */
@media (max-width: 600px) {
  /* Шапка матча — одна строка, имя лиги с многоточием */
  .mt-hero__head { padding: 11px 14px; gap: 8px; }
  .mt-hero__head img { width: 16px; height: 16px; }
  .mt-hero__league { font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .mt-hero__date { font-size: 11px; }

  /* Счёт: каждая команда вертикально (лого → имя → форма), счёт по центру */
  .mt-hero__main { align-items: start; gap: 10px; padding: 18px 14px 16px; }
  .mt-side { flex-direction: column; align-items: center; gap: 8px; }
  .mt-side--home { flex-direction: column-reverse; text-align: center; }
  .mt-side--away { flex-direction: column; }
  .mt-side--home .mt-side__box,
  .mt-side--away .mt-side__box { align-items: center; }
  .mt-side__name { font-size: 11px; line-height: 1.35; text-align: center; width: 100%; }
  .mt-form { gap: 3px; }
  .mt-form span,
  .mt-form a { width: 14px; height: 14px; font-size: 8px; }
  /* Плашка статуса в центре inline-flex, и на мобилке ей нужен столбик:
     иначе центральная колонка раздувалась до 236px, боковые схлопывались до
     30px, и форма с именами команд уезжала под обрезку карточки. */
  .mt-hero__center { min-width: 92px; display: flex; flex-direction: column; align-items: center; }
  .mt-hero__score { font-size: 29px; white-space: nowrap; }
  .mt-hero__status { margin-top: 8px; padding: 4px 10px; font-size: 9.5px; }
  /* Счёт мельче (29px вместо 38px) — вместе с ним едет и отступ надстрочных
     цифр от центра: он равен половине ширины « : » и от кегля зависит прямо. */
  .mt-hero__pen { font-size: 14px; }
  .mt-hero__pen--home { margin-inline-end: 8px; }
  .mt-hero__pen--away { margin-inline-start: 8px; }
  .mt-hero__scoreline:has(.mt-hero__pen) .mt-hero__score { word-spacing: 9px; }

  /* Полоса серии: подпись и вердикт уходят отдельными строками — в 375px
     ряд «подпись + кружки + итог + вердикт» не помещается ни при каких
     размерах. Итог прижимается вправо, имя команды режется многоточием.
     Размеры — из макета «LiveBall Моб Пенальти». */
  .mt-pens { flex-wrap: wrap; gap: 9px 8px; padding: 11px 14px 13px; }
  .mt-pens__cap { max-width: none; width: 100%; font-size: 9.5px; }
  /* Колонки другие, чем на десктопе: там имя фиксированное, а тянутся кружки;
     здесь наоборот — имя забирает остаток строки и режется многоточием, а итог
     стоит своей узкой колонкой у правого края. minmax, а не 13px из макета: во
     внезапной смерти итог бывает двузначным, и жёсткая колонка его обрежет. */
  .mt-pens__rows { width: 100%; grid-template-columns: 1fr auto minmax(13px, auto); gap: 8px; }
  .mt-pens__team { width: auto; min-width: 0; font-size: 11.5px; }
  .mt-pens__shots { gap: 4px; }
  .mt-pens__shots i { width: 16px; height: 16px; font-size: 8.5px; }
  /* Внезапная смерть: с девятого удара ряд перестаёт помещаться в 375px —
     ужимаем шаг, а не переносим кружки (перенос ломает чтение «по порядку»). */
  .mt-pens__shots:has(i:nth-child(9)) { gap: 3px; }
  /* Отступ задаёт колонка сетки: свой margin сдвинул бы итог с правого края. */
  .mt-pens__tot { margin-inline-start: 0; font-size: 13px; text-align: end; }
  /* Вердикт — своей строкой во всю ширину, с галочкой слева. Скругление 12px,
     а не пилюльное: на всю ширину 999px читается кнопкой, которой вердикт не
     является. */
  .mt-pens__ok { display: block; }
  .mt-pens__verdict {
    display: flex; align-items: center; gap: 7px;
    margin-inline-start: 0; width: 100%; white-space: normal;
    padding: 8px 12px; border-radius: 12px;
    font-size: 11.5px;
  }

  /* «Кто победит?» — заголовок + кнопки без флагов, имена по центру (перенос допускается).
     __q тянется по строке, а перенос кнопок/результата делает их flex 1 1 100%:
     так счётчик голосов после голоса встаёт справа от заголовка, а не отдельной строкой. */
  .mt-predict { flex-wrap: wrap; padding: 12px 14px 14px; gap: 6px; }
  .mt-predict__q { flex: 1 1 auto; font-size: 11.5px; margin-bottom: 2px; }
  .mt-predict__count { font-size: 10.5px; margin-bottom: 2px; }
  .mt-predict__opts { flex: 1 1 100%; gap: 6px; }
  .mt-predict button { flex: 1; padding: 8px; font-size: 11px; gap: 6px; line-height: 1.3; }
  .mt-predict img,
  .mt-predict .x { display: none; }
  .mt-predict__legend { gap: 12px; margin-top: 7px; }
  .mt-predict__leg { font-size: 11px; gap: 5px; }
  .mt-predict__mine { font-size: 9px; padding: 2px 6px; }

  /* Прогноз: строка не ниже 44px под палец, текст короче — хвост «и какой
     счёт ждать» скрыт (в хендоффе у мобилки своя, короткая формулировка),
     вместо ховера — нажатие. */
  .mt-prognoz { min-height: 44px; padding: 10px 14px; font-size: 11.5px; }
  .mt-prognoz:active { background: rgba(255, 255, 255, 0.05); }
  .mt-prognoz__more { display: none; }

  /* Языки трансляции — одна строка с горизонтальным скроллом (как ряды пилюль) */
  .mt-player__langs {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
  }
  .mt-player__langs::-webkit-scrollbar { display: none; }
  .mt-player__langs > * { flex: none; }

  /* События: фильтры уходят под заголовок и скроллятся */
  [data-panel="events"] .mt-panel-card__head { flex-wrap: wrap; }
  .mt-ev-filters { flex: 1 1 100%; min-width: 0; }

  /* ---- Очные встречи: строка перестроена по хендоффу ----
     На десктопе это одна строка «дата · хозяин — счёт — гость», зеркальная
     вокруг счёта. На 375px в неё не влезало ничего: под каждую команду
     оставалось ~90px, и имена резались в труху уже на «Атлетико».
     Теперь команды идут ДВУМЯ строками во всю ширину, а дата, турнир и счёт
     стоят узкой колонкой справа за разделителем. Разметка та же — ячейки
     расставлены по grid-area; порядок узлов (дата, хозяин, счёт, гость)
     раскладке не мешает. */
  .mt-h2h__row {
    grid-template-columns: minmax(0, 1fr) 84px;
    column-gap: 12px; row-gap: 0;
    padding: 10px 2px;
  }
  /* Хозяин встречи: в разметке «имя → лого» (десктопное зеркало), здесь
     разворачиваем — обе команды должны читаться одинаково, лого впереди.
     flex-end в развёрнутой оси — это левый край. */
  .mt-h2h__team.r {
    grid-area: 1 / 1 / 2 / 2;
    flex-direction: row-reverse; justify-content: flex-end; text-align: start;
  }
  .mt-h2h__team { grid-area: 2 / 1 / 3 / 2; font-size: 13px; gap: 8px; padding: 3px 0; }
  .mt-h2h__team > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .mt-h2h__team img { width: 18px; height: 18px; }
  /* Правая колонка: дата с турниром и счёт — два узла, но разделитель должен
     читаться одной линией, поэтому row-gap у строки нулевой, а воздух между
     строками команд даёт их собственный padding. */
  .mt-h2h__date,
  .mt-h2h__sc { border-inline-start: 1px solid rgba(255, 255, 255, 0.07); padding-inline-start: 10px; text-align: end; }
  .mt-h2h__date { grid-area: 1 / 2 / 2 / 3; }
  .mt-h2h__date b { font-size: 10.5px; }
  .mt-h2h__date small {
    font-size: 9.5px; font-weight: 600; margin-top: 1px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .mt-h2h__sc { grid-area: 2 / 2 / 3 / 3; font-size: 13px; align-self: stretch; }
  .mt-groups { grid-template-columns: 1fr; }
  /* ---- Поле на телефоне разворачивается вертикально ----
     В ландшафтной раскладке на 375px не помещается НИЧЕГО: у схемы из пяти
     линий (4-1-3-2 и т.п.) колонки идут через ~9% ширины, то есть через 32px,
     а фишка с фамилией занимает 48px — подписи наезжали друг на друга, и
     нападающие двух команд сходились в одну кашу по центру.

     Разворот делается только в CSS: сервер отдаёт координаты переменными
     (--px вдоль поля, --py поперёк), здесь они меняются местами. Хозяева
     занимают верхнюю половину, гости — нижнюю; поперёк поля места хватает на
     четыре фишки (шаг ~83px против 48px ширины). */
  /* 700px — не «на глаз»: фишка с двухстрочной подписью занимает 57px, а
     соседние линии схемы из пяти рядов стоят через 9.3% высоты поля. Чтобы
     подписи не наезжали друг на друга (9.3% ≥ 57px) и чтобы имя вратаря
     гостей (--px 94%) не вылезало за нижний край, высоты нужно ≈ 690px. */
  .mt-pitch {
    height: 700px;
    background: repeating-linear-gradient(0deg, #166322 0 56px, #125420 56px 112px);
  }
  /* Разворот поля — поворот на 90°, не обмен осей: поперечная ось
     отражается (calc(100% - …)). Обмен осей — отражение, с ним право и лево
     менялись бы местами, и на телефоне зеркальными были бы гости (14.09.2026,
     см. lineupStyle в render/funcs.go). */
  .mt-chip { width: 48px; left: calc(100% - var(--py)); top: var(--px); }
  /* Вертикальное поле не зависит от направления строки: хозяева сверху на
     любом языке. Правило для /he выше перебило бы этот поворот — возвращаем. */
  [dir="rtl"] .mt-chip { left: calc(100% - var(--py)); top: var(--px); }
  .mt-chip__ava { width: 32px; height: 32px; }
  .mt-chip__name { font-size: 9px; }
  /* Центральная линия — поперёк, а не вдоль. */
  .mt-pitch__lines::before { top: 50%; inset-inline-start: 0; inset-inline-end: 0; bottom: auto; width: auto; height: 1.5px; }
  /* Штрафные — у верхних и нижних ворот; открытая сторона смотрит в поле. */
  .mt-pitch__box {
    top: auto; left: 50%; right: auto;
    width: 218px; height: 86px; transform: translateX(-50%);
  }
  .mt-pitch__box--l { top: 14px; border-inline-start: 1.5px solid rgba(255, 255, 255, 0.45); border-top: none; }
  .mt-pitch__box--r { bottom: 14px; border-inline-end: 1.5px solid rgba(255, 255, 255, 0.45); border-bottom: none; }
}

/* ===== partials/14-beta.css ===== */
/* ============================================================
   Вход через Telegram: экран /login (калитка домена для участников; до
   04.10.2026 адрес был /beta, отсюда имя файла и классов) и те же
   блоки в модалке входа шапки (#lb-auth).

   Страница-калитка: ни .lb-header, ни .lb-footer на ней нет — только
   логотип и ссылка на открытую версию сайта. Поэтому свой каркас, а не
   .lb-layout, и своя мини-шапка.

   Дизайн — хендофф «Авторизация v3» (05.09.2026): слева брендинг и степпер
   «Как это работает», справа карточка входа с СЕГМЕНТНЫМ ПЕРЕКЛЮЧАТЕЛЕМ
   трёх способов (Telegram / QR-код / код из бота) — раскрыта одна панель.
   С 30.09.2026 из тех же блоков собрана и модалка входа в шапке (раньше там
   были три способа списком через «или») — стили её раскладки в конце файла.
   С 04.10.2026 на открытом домене модалка вместо блоков входа показывает
   переход на домен входа (.lb-move__*), а калитка — свой адрес (.beta-here).

   Общий корень блоков — .lb-login: на калитке это .beta-page, в модалке —
   .lb-auth__guest. На нём два атрибута, и всё переключение — на них:
     data-method     tg | qr | code — выбранный способ: одним атрибутом
                     подсвечивается сегмент, показывается панель и список
                     шагов с тем же data-for.
     data-started    человек нажал ссылку в бота (только у tg): кнопка
                     сменяется плашкой «ждём подтверждения», первый шаг
                     гаснет галочкой, второй загорается.
   Ставят их beta.js (калитка) и auth.js (модалка).

   У калитки есть третий атрибут, на .beta-page:
     data-beta-view  login | denied — какое состояние показать. Оба лежат в
                     разметке ОДНОВРЕМЕННО. Выбрать на сервере нельзя: HTML
                     отдаётся анонимно и кешируется CDN (CLAUDE.md §5.2) —
                     первый вошедший раздал бы своё «доступа нет» всем
                     остальным. Кто вошёл и пустили ли его, знает только
                     клиент по ответу /api/auth/me, он же и переставляет.
   ============================================================ */

/* Цвета блоков входа. На корне .lb-login, а не на .beta-page: те же
   блоки живут и в модалке шапки, где .beta-page нет. */
.lb-login {
  /* Фон калитки темнее общего --bg (#0C110B). Его же берёт текст на зелёном
     бейдже и на кнопке «Войти», чтобы он совпадал с фоном страницы, а не с
     --on-green. */
  --beta-bg: #070905;
  --beta-seg-active: #1C2618;
  --beta-err-fill: rgba(255, 107, 107, 0.12);
  --beta-err-line: rgba(255, 107, 107, 0.25);
  /* Подложки плашки ожидания и карточки числа сверки — телеграмный синий и
     жёлтый числа в прозрачности. Цвета те же, что --tg и --yellow, но rgba от
     переменной CSS не соберёт, поэтому числом. */
  --beta-tg-fill: rgba(42, 171, 238, 0.08);
  --beta-tg-line: rgba(42, 171, 238, 0.3);
  --beta-num-fill: rgba(255, 206, 58, 0.06);
  --beta-num-line: rgba(255, 206, 58, 0.4);
  --beta-num-chip: rgba(255, 206, 58, 0.12);
}

.beta-page {
  flex: 1;
  display: flex;
  flex-direction: column;
  /* Зелёное свечение — единственное украшение страницы, и рисует его САМА
     страница, а не левая панель. На панели оно упиралось бы в край
     контейнера: у широкого монитора слева от контейнера остаётся плоский
     фон, и подсвеченный прямоугольник обрывался бы по нему видимым швом. */
  background:
    radial-gradient(58% 62% at 24% 42%, rgba(88, 219, 36, 0.1) 0%, rgba(88, 219, 36, 0) 65%),
    var(--beta-bg);
}

/* ---------- Переключение способа ---------- */
/* Всё, что помечено data-for, живёт для одного способа: панель карточки,
   список шагов, хвост подписи степпера. Прячем НЕ совпадающие, а не
   показываем совпадающие: у элементов разный display (ol, div, span), и
   одно правило «показать» его бы затёрло. */
.lb-login[data-method="tg"] [data-for]:not([data-for="tg"]),
.lb-login[data-method="qr"] [data-for]:not([data-for="qr"]),
.lb-login[data-method="code"] [data-for]:not([data-for="code"]) { display: none; }

/* ---------- Десктоп / телефон ---------- */
/* У телефона (≤600px, 99-responsive.css) свои слова: короче и про действие.
   Оба текста лежат в разметке парой спанов, здесь виден десктопный. Блоки,
   которые есть только на телефоне (бейдж в шапке, текст QR-карточки,
   распорка), на десктопе спрятаны тут же; их вид задаёт адаптив. */
.beta-mob { display: none; }
.beta-top__badge,
.beta-qr__m,
.beta-spacer { display: none; }

/* ---------- Мини-шапка ---------- */
/* Полоса во всю ширину, содержимое — в контейнере: тот же приём и та же
   ширина 1140, что у .lb-header / .lb-header__inner на остальном сайте. */
.beta-top {
  flex: none;
  background: var(--bg-header);
  border-bottom: 1px solid var(--line-soft);
}
.beta-top__inner {
  width: 100%;
  max-width: 1140px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 18px 32px;
}
/* Логотип и бейдж «Вход» одной группой: бейдж живёт только на телефоне
   (см. ниже), на десктопе группа — просто логотип. Не сжимается: на узком
   экране флекс сплющивал логотип, место отдаёт ссылка справа. */
.beta-top__brand { flex: none; display: flex; align-items: center; gap: 8px; }
.beta-top__logo { display: block; height: 24px; }
.beta-top__back { font-size: 12.5px; font-weight: 700; color: var(--muted); }
.beta-top__back:hover { color: var(--ink); }
/* Стрелка «назад» — svg-шеврон (cal_ico_prev), как у ссылок «назад» по всему
   сайту с 22.09.2026, а не глиф «←»: глиф сидел на базовой линии и выглядел
   смещённым вниз. Ссылка строчная (на телефоне — блок с line-height), поэтому
   svg выравнивается vertical-align, а не флексом. */
.beta-top__back svg { width: 14px; height: 14px; vertical-align: -2px; margin-block: 0; margin-inline: -3px 2px; }
[dir="rtl"] .beta-top__back svg { transform: scaleX(-1); } /* «назад» справа налево — вправо */
/* Правая группа: язык и ссылка на открытую версию. На телефоне сжимается
   многоточием только ссылка (99-responsive.css), язык — никогда. */
.beta-top__end { display: flex; align-items: center; gap: 22px; min-width: 0; }

/* Язык (с 07.10.2026): кнопка «глобус, язык, шеврон» и под ней общий
   .lb-menu из 00-core — тот же список, что у выбора сезона и стадии на
   странице лиги, здесь только позиционирование и вид пунктов. До 13.10.2026
   это был системный <select> прозрачным поверх подписи, и его раскрытый
   список Chrome на Windows рисовал белым. Открытие — aria-expanded кнопки
   (ставит beta.js), по нему же шеврон и цвет. На телефоне от кнопки
   остаётся один глобус (99-responsive.css). */
.beta-lang { position: relative; flex: none; display: inline-flex; }
.beta-lang__btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--muted);
}
.beta-lang__btn:hover,
.beta-lang__btn[aria-expanded="true"] { color: var(--ink); }
.beta-lang__ico { width: 15px; height: 15px; }
.beta-lang__chev { width: 9px; height: 6px; transition: transform 0.15s; }
.beta-lang__btn[aria-expanded="true"] .beta-lang__chev { transform: rotate(180deg); }
/* Своё кольцо фокуса: для мыши и тапа гасим, для клавиатуры и пульта
   оставляем — брендовое, как у строк настроек. */
.beta-lang__btn:focus { outline: none; }
.beta-lang__btn:focus-visible { outline: 2px solid var(--hover-green-line); outline-offset: 4px; border-radius: 4px; }
/* По центру под кнопкой — физические left + translate (центрирование, §4.1):
   на телефоне кнопка — глобус между логотипом и ссылкой, и список,
   привязанный к краю, уезжал бы за экран с одной из сторон. */
.beta-lang__menu {
  top: calc(100% + 10px);
  left: 50%;
  transform: translateX(-50%);
  min-width: 160px;
  padding: 6px;
}
.beta-lang__menu a {
  padding: 8px 12px;
  border-radius: var(--r-row);
  font: 500 13px/1.3 var(--font-text);
  color: var(--ink-soft);
  text-align: start;
  white-space: nowrap;
}
.beta-lang__menu a:hover { background: rgba(255, 255, 255, 0.05); color: var(--green-soft); }
.beta-lang__menu a.is-active { color: var(--green-pale); font-weight: 700; }
/* Бейдж в шапке телефона: зелёная плашка «Вход» у логотипа. Показывает
   адаптив. */
.beta-top__badge {
  padding: 4px 9px;
  border-radius: var(--r-pill);
  background: var(--green);
  color: var(--beta-bg);
  font-size: 9.5px;
  font-weight: 800;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

/* ---------- Каркас: брендинг слева, карточка входа справа ---------- */
/* Ширина та же, что у контента остального сайта. В хендоффе сетка на весь
   экран (minmax(0,1.2fr) minmax(320px,480px)), но без потолка на широком
   мониторе левая колонка растягивалась на всё свободное место, и карточка
   входа уезжала от текста в другой конец экрана. В контейнере 1140 пропорция
   та же: 660 / 480. */
.beta-main {
  flex: 1;
  width: 100%;
  max-width: 1140px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 1fr) 480px;
}

.beta-brand {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 56px 72px;
  border-inline-end: 1px solid var(--line-soft);
}

.beta-title {
  margin: 22px 0 0;
  max-width: 560px;
  font-family: var(--font-display);
  font-size: clamp(28px, 3.4vw, 44px);
  font-weight: 700;
  line-height: 1.14;
  color: var(--ink-strong);
  text-wrap: pretty;
}

.beta-lead {
  margin: 18px 0 0;
  max-width: 460px;
  font-size: 16px;
  line-height: 1.6;
  color: var(--muted);
  text-wrap: pretty;
}

/* Адрес входа под лидом — «liveball.im — адрес для входа, сохраните его в
   закладки» (с 04.10.2026, шаблон выводит строку только на домене входа).
   Плашкой, а не ещё одним абзацем: это единственное на странице,
   что человек должен ЗАПОМНИТЬ, — окно «Войти» открытого домена теперь ведёт
   сюда, и в сплошном тексте лида адрес потерялся бы. Домен — шрифтом
   заголовков и зелёным, как у адреса входа в том окне (.lb-move__host--to). */
.beta-here {
  margin: 22px 0 0;
  max-width: 460px;
  padding: 12px 16px;
  border-radius: var(--r-menu);
  border: 1px solid var(--line-green);
  background: rgba(88, 219, 36, 0.06);
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--ink-soft);
  text-wrap: pretty;
}
.beta-here__host {
  font-family: var(--font-display);
  font-weight: 700;
  color: var(--green);
}

/* ---------- Степпер «как это работает» ---------- */
/* Три списка шагов лежат в разметке разом (по одному на способ), виден тот,
   чей data-for совпадает с data-method страницы — см. правило выше. Так шаги
   переводит сервер, а скрипту остаётся переставить атрибут. */
.beta-how { margin-top: 40px; max-width: 520px; }
.beta-how__cap {
  display: block;
  font-size: 10px;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--dim);
}
.beta-steps {
  list-style: none;
  margin: 14px 0 0;
  padding: 0;
}
.beta-step {
  display: grid;
  grid-template-columns: 32px minmax(0, 1fr);
  column-gap: 16px;
}
/* Колонка с кружком и линией под ним до следующего шага. Линия — псевдоэлемент
   рельса, а не отдельный span: ей нужно растянуться на всю высоту текста
   справа, и flex:1 в колонке это даёт сам. У последнего шага линии нет. */
.beta-step__rail {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.beta-step__rail::after {
  content: "";
  flex: 1;
  width: 2px;
  min-height: 18px;
  margin: 4px 0;
  background: rgba(255, 255, 255, 0.1);
}
.beta-step:last-child .beta-step__rail::after { display: none; }
.beta-step__n {
  flex: none;
  width: 32px;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 2px solid var(--line-strong);
  background: transparent;
  color: var(--dim);
  font-size: 13px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
}
.beta-step__body { padding: 5px 0 18px; }
.beta-step:last-child .beta-step__body { padding-bottom: 0; }
.beta-step__t {
  display: block;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.4;
  color: var(--muted);
}
.beta-step__d {
  display: block;
  margin-top: 3px;
  font-size: 13px;
  line-height: 1.5;
  color: var(--muted);
  text-wrap: pretty;
}

/* Состояния шага. По умолчанию текущий — первый; после нажатия ссылки в бота
   (data-started) первый становится пройденным, текущий — второй. Пройденных
   больше одного не бывает: третий шаг человек делает уже в боте, и страница
   узнаёт о нём только успехом входа — то есть уходом с калитки. */
.beta-step:first-child .beta-step__n,
.lb-login[data-started] .beta-step:nth-child(2) .beta-step__n {
  border-color: var(--green);
  background: rgba(88, 219, 36, 0.14);
  color: var(--green-soft);
}
.beta-step:first-child .beta-step__t,
.lb-login[data-started] .beta-step:nth-child(2) .beta-step__t { color: var(--ink-strong); }

.lb-login[data-started] .beta-step:first-child .beta-step__n {
  background: var(--green);
  color: var(--beta-bg);
}
.lb-login[data-started] .beta-step:first-child .beta-step__no { display: none; }
.lb-login[data-started] .beta-step:first-child .beta-step__n::after { content: "✓"; }
.lb-login[data-started] .beta-step:first-child .beta-step__rail::after { background: var(--green); }

/* Число сверки в третьем шаге. До ответа сервера на его месте многоточие,
   которое beta.js заменяет числом; сам номер шага при этом цветом не
   выделяем — выделить надо лишь одно число на экране, и оно в карточке ниже. */
.beta-step__t .beta-num { font-weight: 800; color: var(--ink-strong); }

/* ---------- Колонка состояний ---------- */
.beta-side {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 48px 44px;
}

/* Переключатель висит на обёртке, а не на самой карточке: карточки
   состояний различаются display (block у входа, flex-колонка у отказа), и
   общее правило затирало бы его. */
.beta-state { display: none; }
.beta-page[data-beta-view="login"] [data-beta-state="login"],
.beta-page[data-beta-view="denied"] [data-beta-state="denied"] { display: block; }

.beta-card {
  padding: 28px;
  border-radius: var(--r-xl);
  background: var(--panel);
  border: 1px solid var(--line);
}
.beta-card--center {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding: 36px 28px;
}
.beta-card--denied { border-color: var(--beta-err-line); }

.beta-card__title {
  margin: 0;
  font-family: var(--font-display);
  font-size: 19px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--ink-strong);
}
.beta-card--center .beta-card__title { margin-top: 20px; }

.beta-card__text {
  margin: 8px 0 0;
  font-size: 13px;
  line-height: 1.55;
  color: var(--muted);
  text-wrap: pretty;
}
.beta-card--center .beta-card__text { margin-top: 10px; max-width: 300px; }
/* Ник вошедшего — единственное, что человек должен вычитать из абзаца
   целиком, поэтому он набран цветом основного текста. */
.beta-card__text b { color: var(--ink); font-weight: 700; }
/* Имя из Telegram — направление берём из него самого (см. [data-account-name]). */
.beta-user { unicode-bidi: plaintext; }

/* ---------- Сегментный переключатель ---------- */
.beta-seg {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 6px;
  margin-top: 20px;
  padding: 4px;
  border-radius: var(--r-menu);
  background: rgba(255, 255, 255, 0.04);
}
.beta-seg__btn {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
  padding: 10px 6px;
  border-radius: 11px;
  color: var(--muted);
  text-align: center;
}
.beta-seg__btn:hover { color: var(--ink-strong); }
.beta-seg__label { font-size: 13px; font-weight: 800; }
.beta-seg__hint { font-size: 10.5px; font-weight: 600; opacity: 0.7; }
/* Активный сегмент — по data-method страницы, а не по классу на кнопке: так
   сегмент, панель и степпер переключаются одним атрибутом и разъехаться не
   могут. Тень внутрь сверху — блик, будто сегмент лежит поверх корыта. */
.lb-login[data-method="tg"] .beta-seg__btn[data-pick="tg"],
.lb-login[data-method="qr"] .beta-seg__btn[data-pick="qr"],
.lb-login[data-method="code"] .beta-seg__btn[data-pick="code"] {
  background: var(--beta-seg-active);
  color: var(--ink-strong);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 4px 12px rgba(0, 0, 0, 0.35);
}

/* ---------- Панели способов ---------- */
.beta-panel { margin-top: 22px; }

/* Подпись под кнопкой / под плашкой / под клетками: мелкая, по центру. Имя
   бота в ней полужирное цветом текста — единственное, что из неё вычитывают.
   Ссылка — обычная зелёная сайта (00-core). */
.beta-hint {
  margin: 10px 0 0;
  font-size: 11.5px;
  line-height: 1.5;
  color: var(--dim);
  text-align: center;
  text-wrap: pretty;
}
.beta-hint b { color: var(--ink); font-weight: 700; }

/* Панель Telegram: до нажатия — кнопка, после (data-started) — плашка. */
.lb-login[data-started] .beta-panel__idle { display: none; }
.lb-login:not([data-started]) .beta-panel__wait { display: none; }

/* Ссылка в бота именно ССЫЛКА, а не кнопка со скриптом (см. beta.html):
   подчёркивание снимаем, а пока адрес не приехал — гасим, иначе по ней можно
   нажать в первые полсекунды и уйти в никуда. */
.beta-tg {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  padding: 16px;
  border-radius: var(--r-menu);
  background: var(--tg);
  color: #FFFFFF;
  font-size: 15px;
  font-weight: 800;
  text-decoration: none;
  cursor: pointer;
}
/* Цвет на ховере задан явно: кнопка — <a>, и общий a:hover из 00-core
   (зелёный текст ссылок) перебивает .beta-tg по специфичности — выходил
   зелёный текст на голубом. */
.beta-tg:hover { background: var(--tg-hover); color: #FFFFFF; }
.beta-tg:active { transform: scale(0.985); }
.beta-tg svg { flex: none; width: 20px; height: 20px; }
.beta-tg:not([href]) { opacity: 0.55; pointer-events: none; }
.beta-tg-manual:not([href]) { opacity: 0.55; pointer-events: none; }

/* Плашка «бот открыт — ждём подтверждения». Телеграмная синяя, а не зелёная
   сайта: в отличие от прежнего экрана ожидания здесь ждут не ответа сайта, а
   нажатия в Telegram, и цвет говорит, где сейчас человек. */
.beta-wait {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 14px 16px;
  border-radius: var(--r-menu);
  background: var(--beta-tg-fill);
  border: 1px solid var(--beta-tg-line);
}
.beta-spin {
  flex: none;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 3px solid rgba(42, 171, 238, 0.2);
  border-top-color: var(--tg);
  animation: betaSpin 0.9s linear infinite;
}
@keyframes betaSpin { to { transform: rotate(360deg); } }
.beta-wait__text { flex: 1; min-width: 0; }
.beta-wait__t {
  display: block;
  font-size: 13.5px;
  font-weight: 800;
  color: var(--ink-strong);
}
.beta-wait__d {
  display: block;
  margin-top: 2px;
  font-size: 12px;
  color: var(--muted);
}
.beta-cancel {
  flex: none;
  padding: 8px 12px;
  border-radius: var(--r-row);
  border: 1px solid var(--line-ctl);
  background: rgba(255, 255, 255, 0.06);
  color: var(--ink);
  font-size: 11.5px;
  font-weight: 700;
}
.beta-cancel:hover { background: rgba(255, 255, 255, 0.1); }

/* ---------- Код устарел (data-stale на .lb-login) ----------
   Код живёт пять минут. Раньше по истечении QR исчезал (белая полоса на его
   месте), кнопка бота гасла, а под ними писалось «не получилось войти» —
   человек, оставивший вкладку открытой, не понимал, что делать. Теперь
   устаревший QR остаётся на месте, но гаснет, и поверх — кнопка новой
   попытки; в панели Telegram на месте погасшей кнопки — такая же. Ставит
   атрибут скрипт входа (beta.js / auth.js), снимает — новая попытка. */
.beta-panel__stale,
.beta-qr__renew { display: none; }
.lb-login[data-stale] .beta-panel__idle,
.lb-login[data-stale] .beta-panel__wait { display: none; }
.lb-login[data-stale] .beta-panel__stale { display: block; }

.beta-renew {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  padding: 16px;
  border-radius: var(--r-menu);
  background: var(--green);
  color: var(--beta-bg);
  font-size: 15px;
  font-weight: 800;
}
.beta-renew:hover { background: var(--green-hover); }
.beta-renew svg { flex: none; width: 18px; height: 18px; }

/* Обёртка матрицы — опора для кнопки поверх неё. flex:none — на телефоне
   панель QR горизонтальная, и обёртка там флекс-элемент рядом с текстом. */
.beta-qr__wrap { position: relative; flex: none; max-width: 100%; }
.lb-login[data-stale] .beta-qr svg { opacity: 0.12; filter: blur(1.5px); }
/* Кнопка — вся площадь матрицы: промахнуться мимо некуда. Подложка белая
   (сама матрица), поэтому текст тёмный, а действие — зелёная пилюля. */
.lb-login[data-stale] .beta-qr__renew {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: 12px;
  border-radius: var(--r-card);
  color: #0C110B;
  text-align: center;
}
.beta-qr__renew-t { font-size: 14px; font-weight: 800; }
.beta-qr__renew-go {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  border-radius: var(--r-pill);
  background: var(--green);
  color: #0C110B;
  font-size: 13px;
  font-weight: 800;
}
.beta-qr__renew:hover .beta-qr__renew-go { background: var(--green-hover); }
.beta-qr__renew-go svg { flex: none; width: 16px; height: 16px; }

/* Панель QR. Подложка под матрицей белая ВСЕГДА, мимо токенов темы: инверсный
   код читают не все сканеры, а тихая зона по краям обязана быть светлой — без
   неё сканер не находит границу кода вовсе. Четыре модуля тихой зоны заложены
   в самом SVG, padding здесь — запас поверх них. */
.beta-panel--qr {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.beta-qr {
  width: 224px;
  max-width: 100%;
  padding: 12px;
  border-radius: var(--r-card);
  background: #fff;
}
.beta-qr svg { display: block; }
/* Пустой контейнер (ответ ещё в пути или матрица не собралась) держит высоту
   матрицы, чтобы карточка не прыгала, когда та приедет. */
.beta-qr:empty { aspect-ratio: 1; }
/* Телевизор смотрят с дивана — код крупнее. Класс ставит beta.js по флагу tv
   из ответа /api/auth/start (детект на сервере, тот же, что у кликандера). */
.beta-panel--qr.is-tv .beta-qr { width: 344px; }
.beta-qr__hint {
  max-width: 320px;
  margin: 14px 0 0;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--muted);
  text-align: center;
  text-wrap: pretty;
}
/* Текст QR-карточки телефона: «сканируйте с другого устройства» и ссылка
   обратно в Telegram-способ (тот же data-pick, что у сегмента). Раскладка —
   в адаптиве, здесь только вид. */
.beta-qr__mt {
  display: block;
  font-size: 13px;
  font-weight: 800;
  color: var(--ink-strong);
}
.beta-qr__md {
  display: block;
  margin-top: 4px;
  font-size: 11.5px;
  line-height: 1.45;
  color: var(--muted);
  text-wrap: pretty;
}
/* Ссылка — кнопка без фона: цвет ссылок сайта, а зона нажатия дотянута до
   44px отрицательными полями, чтобы не раздвигать карточку. */
.beta-qr__go {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  margin: -8px 0 -12px;
  font-size: 12px;
  font-weight: 700;
  color: var(--green);
}
.beta-qr__go:hover { color: var(--green-soft); }

/* Панель кода из бота: карточка-ссылка на бота и шесть клеток. */
.beta-botcard {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 12px 14px;
  border-radius: 13px;
  border: 1px solid var(--line-ctl);
  background: rgba(255, 255, 255, 0.04);
  color: var(--ink);
}
.beta-botcard:hover { background: rgba(255, 255, 255, 0.07); color: var(--ink-strong); }
.beta-botcard__main { display: flex; align-items: center; gap: 10px; min-width: 0; }
.beta-botcard__ico {
  flex: none;
  width: 30px;
  height: 30px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--tg);
  color: #FFFFFF;
}
.beta-botcard__ico svg { width: 15px; height: 15px; }
.beta-botcard__text { min-width: 0; }
.beta-botcard__name { display: block; font-size: 13px; font-weight: 800; }
.beta-botcard__d { display: block; margin-top: 1px; font-size: 11px; color: var(--muted); }
.beta-botcard__go { flex: none; font-size: 11px; font-weight: 700; color: var(--muted); }

.beta-pin { display: block; }
.beta-pin__label {
  display: block;
  margin-top: 18px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--dim);
}
/* Шесть отдельных клеток: по ним видно, сколько цифр уже введено и на какой
   ошибся, — с одним полем этого не видно вовсе. Квадраты через aspect-ratio:
   ширина клетки зависит от ширины карточки, высота следует за ней. */
.beta-pin__row {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 8px;
  margin-top: 8px;
  direction: ltr; /* код набирается слева направо и на /he: первая цифра — в левой клетке, стрелки ← → ходят по клеткам физически */
}
.beta-pin__cell {
  width: 100%;
  min-width: 0;
  aspect-ratio: 1;
  padding: 0;
  border: 1px solid var(--line-strong);
  border-radius: var(--r-ctl);
  background: rgba(255, 255, 255, 0.04);
  color: var(--ink-strong);
  font-family: var(--font-display);
  font-size: 20px; /* меньше 16px — и Safari на iOS зумит страницу на фокусе */
  font-weight: 600;
  text-align: center;
}
/* Заполненная клетка — рамка заметнее пустой. placeholder у клетки — один
   пробел, ровно чтобы :placeholder-shown отличал пустую от заполненной без
   скрипта. Курсор — зелёная рамка, побеждает заполненность. */
.beta-pin__cell:not(:placeholder-shown) { border-color: rgba(255, 255, 255, 0.28); }
.beta-pin__cell:focus { outline: none; border-color: var(--green); }

.beta-pin__submit {
  display: block;
  width: 100%;
  margin-top: 14px;
  padding: 14px;
  border-radius: 13px;
  background: var(--green);
  color: var(--beta-bg);
  font-size: 14px;
  font-weight: 800;
}
.beta-pin__submit:hover { background: var(--green-hover); }
.beta-pin__submit:disabled {
  background: rgba(255, 255, 255, 0.06);
  color: var(--dim);
  cursor: default;
}

/* ---------- Число сверки ---------- */
/* Пунктирная рамка: карточка должна читаться как «сверьте это», а не как
   обычный текст. Жёлтый в палитре один и
   заведён ровно под это число (см. --yellow в 00-core). Крупно и табличными
   цифрами — его сверяют с тремя кнопками в боте одним взглядом; эмодзи здесь
   не годятся: браузер рисует их системным шрифтом, а Telegram своим, и на
   старом Windows сверять оказывалось нечего. */
.beta-verify {
  display: flex;
  align-items: center;
  gap: 16px;
  margin-top: 22px;
  padding: 14px 16px;
  border-radius: var(--r-menu);
  border: 1px dashed var(--beta-num-line);
  background: var(--beta-num-fill);
}
/* У пути с кодом из бота число не нужно: там его принимали за код для ввода. */
.lb-login[data-method="code"] .beta-verify { display: none; }
.beta-verify__code {
  flex: none;
  min-width: 56px;
  padding: 8px 10px;
  border-radius: var(--r-ctl);
  background: var(--beta-num-chip);
  font-family: var(--font-display);
  font-size: 26px;
  font-weight: 700;
  line-height: 1.2;
  text-align: center;
  color: var(--yellow);
  font-variant-numeric: tabular-nums;
}
.beta-verify__text { min-width: 0; }
.beta-verify__t {
  display: block;
  font-size: 13.5px;
  font-weight: 800;
  color: var(--ink-strong);
}
.beta-verify__d {
  display: block;
  margin-top: 2px;
  font-size: 12px;
  line-height: 1.5;
  color: var(--muted);
  text-wrap: pretty;
}

/* ---------- Подвал карточки ---------- */
.beta-note {
  margin: 18px 0 0;
  font-size: 10.5px;
  line-height: 1.5;
  color: var(--dim);
  text-align: center;
  text-wrap: pretty;
}
.beta-card--center .beta-note { margin-top: 16px; }

/* Строка ошибки входа. Появляется на месте, где до неё ничего нет, поэтому
   отступ тот же, что у сноски: иначе карточка подпрыгивала бы при первой
   неудачной попытке. Цвет — тот же, что у ошибки в модалке входа (00-core). */
.beta-err { color: var(--red-live-text); }


/* Кольцо ожидания крутится бесконечно — гасим так же, как точку live в
   00-core. Оно остаётся на месте: незакрашенный сектор читается как «идёт» и
   без вращения, а «ждём подтверждения» и так сказано словами. */
@media (prefers-reduced-motion: reduce) {
  .beta-spin { animation: none; }
}

/* ---------- Отказ ---------- */
.beta-cross {
  flex: none;
  width: 52px;
  height: 52px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--beta-err-fill);
}
.beta-cross svg { width: 20px; height: 20px; }

/* ---------- Те же блоки в модалке входа шапки (#lb-auth) ----------
   Модалка узкая (400px), поэтому шаги в ней компактные — те же размеры, что
   у калитки на телефоне (99-responsive, ≤600px), — и отступы между блоками
   мельче. Порядок блоков задаёт разметка (_header.html): переключатель →
   шаги → панель способа → число сверки. На телефоне модалка — отдельный
   экран, и там же в силу вступают мобильные правила калитки. */
.lb-auth .beta-seg { margin-top: 0; }
.lb-auth .beta-how { margin-top: 18px; max-width: none; }
.lb-auth .beta-steps { margin-top: 10px; }
.lb-auth .beta-step { grid-template-columns: 26px minmax(0, 1fr); column-gap: 12px; }
.lb-auth .beta-step__n { width: 26px; height: 26px; font-size: 11.5px; }
.lb-auth .beta-step__rail::after { min-height: 10px; margin: 3px 0; }
.lb-auth .beta-step__body { padding: 3px 0 12px; }
.lb-auth .beta-step__t { font-size: 13.5px; }
.lb-auth .beta-step__d { margin-top: 2px; font-size: 12px; line-height: 1.45; }
.lb-auth .beta-panel { margin-top: 16px; }
.lb-auth .beta-verify { margin-top: 16px; }

/* ---------- Вход на другом адресе (#lb-auth на открытом домене) ----------
   С 04.10.2026 вход только на домене входа (liveball.im): на открытом домене
   окно вместо блоков входа показывает переход «этот адрес → адрес входа» и
   ведёт туда (_header.html). Блоков .lb-login в этом варианте нет, поэтому и
   цветов оттуда (--beta-*) здесь нет: текст на зелёной кнопке — --on-green,
   как у прочих зелёных кнопок сайта.

   Адреса — плашками и шрифтом заголовков: человек должен узнать в них «где я
   сейчас» и «куда идти входить», а не прочитать ещё одну строку текста.
   Адрес входа зелёный, текущий — приглушённый, но НЕ зачёркнутый: этот сайт
   никуда не делся, без входа он работает как раньше (.lb-move__note). Длинное
   имя зеркала переносится внутри плашки, а не раздвигает окно. */
.lb-move__lead {
  margin: 4px 0 0;
  font-size: 15px;
  font-weight: 800;
  line-height: 1.4;
  color: var(--ink-strong);
  text-wrap: pretty;
}
.lb-move__route {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 10px;
  margin-top: 14px;
}
.lb-move__host {
  min-width: 0;
  padding: 8px 12px;
  border-radius: var(--r-ctl);
  border: 1px solid var(--line-ctl);
  background: rgba(255, 255, 255, 0.04);
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--muted);
  overflow-wrap: anywhere;
}
.lb-move__host--to {
  border-color: var(--line-green);
  background: rgba(88, 219, 36, 0.08);
  color: var(--green);
}
.lb-move__arrow { flex: none; font-size: 18px; line-height: 1; color: var(--dim); }
.lb-move__text {
  margin: 14px 0 0;
  font-size: 13px;
  line-height: 1.55;
  color: var(--muted);
  text-wrap: pretty;
}
.lb-move__text b { color: var(--ink); font-weight: 700; }
/* Переход — ссылка, а не кнопка со скриптом: адрес готов с сервера, и её
   можно открыть и в новой вкладке. Цвет на ховере задан явно — общий a:hover
   (зелёный текст ссылок) перебил бы его, как у .beta-tg. */
.lb-move__go {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
  margin-top: 18px;
  padding: 15px 16px;
  border-radius: var(--r-menu);
  background: var(--green);
  color: var(--on-green);
  font-size: 15px;
  font-weight: 800;
  text-align: center;
}
.lb-move__go:hover { background: var(--green-hover); color: var(--on-green); }
.lb-move__go:active { transform: scale(0.985); }
.lb-move__note {
  margin: 12px 0 0;
  font-size: 11.5px;
  line-height: 1.5;
  color: var(--dim);
  text-align: center;
  text-wrap: pretty;
}

/* ---------- Браузер без CSS Grid: телевизоры 2016–2019 ----------
   Встроенные браузеры телевизоров тех лет (Chromium 53–56 у LG webOS 4 и
   Samsung Tizen 4, ровесники на других движках) grid не знают: для них
   display:grid — неизвестное значение, и сетка молча становится обычным
   блоком. Каркас калитки складывался в колонку, карточка входа уезжала под
   первый экран, а телевизор с пульта не прокручивают — человек видел одну
   инструкцию «как войти», без кнопки, QR и кода (фото с телевизора,
   01.10.2026). Телевизор — главный адресат QR, поэтому четыре сетки калитки
   здесь повторены флексом; современным браузерам блок не достаётся вовсе.
   Колонку на ≤940px собирает 99-responsive.css.

   Стороны физические, с парой [dir="rtl"]: логические свойства
   (margin-inline-*) пришли в Chromium 69, и этим браузерам они так же
   неизвестны, как grid. Пропавший флексовый gap (Chromium 84) не
   возмещаем — блоки без него слипаются, но читаются; возмещены только
   промежутки самих сеток. */
@supports not (display: grid) {
  .beta-main { display: flex; }
  .beta-brand { flex: 1 1 0; min-width: 0; }
  .beta-side { flex: 0 0 480px; }

  .beta-step { display: flex; }
  .beta-step__rail { flex: none; width: 32px; margin-right: 16px; }
  .beta-step__body { flex: 1 1 0; min-width: 0; }
  .lb-auth .beta-step__rail { width: 26px; margin-right: 12px; }
  [dir="rtl"] .beta-step__rail { margin-right: 0; margin-left: 16px; }
  [dir="rtl"] .lb-auth .beta-step__rail { margin-right: 0; margin-left: 12px; }

  .beta-seg { display: flex; }
  .beta-seg__btn { flex: 1 1 0; min-width: 0; }
  .beta-seg__btn + .beta-seg__btn { margin-left: 6px; }
  [dir="rtl"] .beta-seg__btn + .beta-seg__btn { margin-left: 0; margin-right: 6px; }

  /* Ряд клеток всегда слева направо (direction: ltr у .beta-pin__row), поэтому
     пары для [dir="rtl"] у него нет. */
  .beta-pin__row { display: flex; }
  .beta-pin__cell { flex: 1 1 0; }
  .beta-pin__cell + .beta-pin__cell { margin-left: 8px; }
}

/* ===== partials/15-favorites.css ===== */
/* --- Избранное (fav-) --- */

/* Каркас по макету: сайдбар 260px (в ядре 264), секция с отступом снизу 40px.
   Специфичность как у .lb-layout — чтобы адаптив из 99-responsive перебивал. */
.fav-page { grid-template-columns: 260px 1fr; padding: 24px 0 40px; }
/* Вертикальный ритм контентной колонки: заголовок/фильтр/группы с шагом 14px */
.fav-page .lb-content { gap: 14px; }

/* Шапка страницы */
.fav-head { display: flex; align-items: center; gap: 14px; margin-bottom: 4px; }
.fav-head__ico {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; border-radius: 14px;
  background: linear-gradient(135deg, rgba(88, 219, 36, 0.25), rgba(88, 219, 36, 0.06));
  border: 1px solid rgba(120, 230, 80, 0.35);
  color: var(--green); flex: none;
}
.fav-head__text { display: flex; flex-direction: column; gap: 3px; }
.fav-head h1 { font-family: var(--font-display); font-size: 24px; font-weight: 700; }
.fav-head__count { font-size: 13px; font-weight: 600; color: var(--muted); }

/* Фильтр дат. Чип календаря — общий .home-date из 10-home (тот же, что в
   панели даты на главной и в разделах): свой .fav-date отличался только
   цифровым форматом даты и выбивался из общего вида. */
.fav-filter { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
/* Чип календаря живёт в ШАПКЕ страницы, справа от заголовка, а не в ряду
   пилюль: в ряду он занимал место, из-за которого «Прошедшие» уезжали под
   скролл, и на телефоне его приходилось липнуть к краю поверх пилюль. */
.fav-cal { margin-inline-start: auto; position: relative; display: inline-flex; }
.fav-cal[hidden] { display: none; }

/* Выпадающий календарь (открытие — data-menu-open, как у прочих .lb-menu в app.js) */
.fav-cal__menu {
  top: calc(100% + 8px); inset-inline-end: 0; z-index: 40;
  width: 264px; padding: 14px; gap: 10px;
}
.fav-cal__nav { display: flex; align-items: center; gap: 8px; }
/* Стрелки месяца — тот же шеврон, что у стрелок дня и слайдера; форма и размер
   по макету избранного (26px, скруглённый квадрат), внутри поповера круги
   смотрелись бы тяжело. */
.fav-cal__arr {
  width: 26px; height: 26px; border-radius: 8px;
  background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1);
  color: var(--ink-soft);
  display: inline-flex; align-items: center; justify-content: center;
  transition: border-color .15s, color .15s;
}
.fav-cal__arr svg { width: 14px; height: 14px; }
[dir="rtl"] .fav-cal__arr svg { transform: scaleX(-1); } /* см. .home-datenav__arr */
.fav-cal__arr:hover { border-color: rgba(139, 233, 106, 0.5); color: var(--green-pale); }
.fav-cal__title { flex: 1; font-size: 13px; font-weight: 800; color: var(--ink-strong); text-align: center; }
.fav-cal__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.fav-cal__dow { text-align: center; font-size: 10px; font-weight: 700; color: var(--dim); padding: 3px 0; }
.fav-cal__day {
  position: relative; background: transparent; border: 1px solid transparent; border-radius: 8px;
  padding: 6px 0 9px; font-size: 12px; font-weight: 700; color: #DFE5DB; text-align: center;
}
.fav-cal__day:hover { border-color: rgba(139, 233, 106, 0.6); }
.fav-cal__day.is-today { border-color: rgba(139, 233, 106, 0.55); color: var(--green-soft); }
.fav-cal__day.is-selected { background: var(--green); border-color: var(--green); color: var(--on-green); }
/* Дни вне диапазона [2022-01-01; сегодня+2 года] — сервер на них отдаёт 404. */
.fav-cal__day.is-disabled { color: var(--dim); opacity: 0.35; cursor: default; }
.fav-cal__day.is-disabled:hover { border-color: transparent; }
.fav-cal__arr:disabled { opacity: 0.3; cursor: default; }
.fav-cal__arr:disabled:hover { border-color: rgba(255, 255, 255, 0.1); color: var(--ink-soft); }
.fav-cal__dot {
  position: absolute; left: 50%; bottom: 3px; transform: translateX(-50%);
  width: 4px; height: 4px; border-radius: 50%; background: var(--green-soft);
}
.fav-cal__dot--live { background: var(--red-live-text); }
.fav-cal__dot--past { background: var(--muted); }
.fav-cal__reset {
  background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 9px; padding: 8px; font-size: 12px; font-weight: 700; color: var(--green-pale);
}
.fav-cal__reset:hover { border-color: rgba(139, 233, 106, 0.5); }

/* Сайдбар: карточки избранного */
.fav-side__head {
  display: flex; align-items: center; gap: 8px; padding: 10px 12px 8px;
  font-family: var(--font-display); font-size: 13.5px; font-weight: 700; color: var(--ink-strong);
}
.fav-side__head svg { color: var(--green); flex: none; }
/* Подсказка пустого списка (показывается, когда в карточке нет пунктов) */
.fav-side__hint { padding: 6px 12px 12px; font-size: 12px; line-height: 1.55; color: var(--dim); font-weight: 500; }
.fav-item { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: var(--r-row); color: #DFE5DB; font-size: 13.5px; font-weight: 600; }
.fav-item:hover { background: rgba(255, 255, 255, 0.04); color: var(--green-pale); }
.fav-item img { width: 22px; height: 22px; object-fit: contain; flex: none; }
.fav-item__mono { width: 22px; height: 22px; border-radius: 6px; background: var(--panel-2); color: var(--muted); font-size: 10px; font-weight: 800; display: inline-flex; align-items: center; justify-content: center; flex: none; }
.fav-item__name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Тур в строке сайдбара: размер строки (13.5px), а на ховере не отстаёт от неё. */
.fav-item__name .lb-round { font-size: inherit; }
.fav-item:hover .lb-round { color: inherit; }
/* Активная звезда в сайдбаре: hover красным — «убрать из избранного» */
.fav-side .lb-star.is-on:hover { color: var(--red-soft); }

/* Матчи избранного — сгруппированы по турнирам (сворачиваемые карточки, как в макете) */
#fav-groups { display: flex; flex-direction: column; gap: 14px; }
.fav-group__head { display: flex; align-items: center; gap: 12px; padding: 14px 18px; cursor: pointer; }
.fav-group__head:hover { background: rgba(255, 255, 255, 0.03); }
.fav-group__star { flex: none; }
.fav-group__logo { width: 22px; height: 22px; object-fit: contain; flex: none; }
.fav-group__name { flex: 1; min-width: 0; font-size: 14.5px; font-weight: 800; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fav-group__count { font-size: 11px; font-weight: 700; color: var(--dim); white-space: nowrap; }
.fav-group__chev { display: inline-flex; color: var(--green-soft); transition: transform 0.2s; flex: none; }
.fav-group.is-open .fav-group__chev { transform: rotate(180deg); }
.fav-group__body { display: none; }
.fav-group.is-open .fav-group__body { display: block; }

/* Строка матча избранного — общая .lb-fixture из ядра (её же рендерит сервер
   в _match_template.html, она же стоит в ленте дня и на лиге). Собственной
   .fav-row у страницы больше нет: это была четвёртая копия одной и той же
   строки, и правки дизайна ленты до избранного не доезжали.
   Колонка времени шире ядровых 76px: рядом со временем или статусом стоит дата
   («22:00 · 19.07») — матчи в одной карточке из разных дней. */
.fav-group__body .lb-fixture { grid-template-columns: 18px 100px minmax(0, 1fr) 60px minmax(0, 1fr) 16px; }
/* Время будущих матчей — белым жирным, как на главной и на лиге */
.fav-page .lb-fixture[data-st="up"] .lb-fixture__time {
  font-size: 13px; font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums;
}
/* Статус завершённых чуть мельче базовых 12px — «Завершен · 24.05» в одну строку */
.fav-page .lb-fixture[data-st="fin"] .lb-fixture__time { font-size: 11.5px; }

/* Карточки избранной команды (.fav-team) больше нет: её матчи лежат в группах
   .fav-group своих турниров (см. buildGroups в favorites.js), сама команда —
   в сайдбаре «Избранные команды». */

/* Строка тенниса в группе — .tn-fx из 27-tennis (та же строка-табло, что в
   лентах раздела): приезжает готовой с сервера (/api/favorites, партиал
   tn_row), своих правил у неё здесь нет — как и верхняя линия у первой
   строки: у .lb-fixture она тоже есть, карточка так и задумана. */

/* «Другое в избранном» и «Турниры и Гран-при»: простые строки [звезда][текст][→] */
.fav-other__head { padding: 14px 18px; font-size: 14.5px; font-weight: 800; color: var(--ink-strong); }
.fav-simple {
  display: grid; grid-template-columns: 18px minmax(0, 1fr) 16px; align-items: center; gap: 12px;
  padding: 13px 18px; border-top: 1px solid var(--line-soft); color: var(--ink);
}
.fav-simple:hover { background: rgba(255, 255, 255, 0.03); color: var(--green-pale); }
.fav-simple .lb-star.is-on:hover { color: var(--red-soft); }
.fav-simple__name { font-size: 13.5px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fav-simple__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fav-simple__body .fav-simple__name { color: var(--ink); }
.fav-simple__sub { font-size: 11.5px; font-weight: 600; color: var(--dim); }
.fav-simple__arrow { color: var(--dim); font-size: 14px; }

/* Пустые состояния («Пока пусто» / «На эту дату матчей нет») */
.fav-empty {
  background: var(--panel); border: 1px solid var(--line); border-radius: 18px;
  padding: 56px 20px; display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center;
}
.fav-empty__ico { display: inline-flex; color: rgba(255, 255, 255, 0.22); }
.fav-empty__title { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); }
.fav-empty__text { font-size: 13.5px; line-height: 1.6; color: var(--muted); max-width: 420px; }
.fav-empty__btn {
  margin-top: 8px; display: inline-flex; background: var(--green); color: var(--on-green);
  font-size: 13.5px; font-weight: 700; border-radius: var(--r-pill); padding: 11px 24px;
}
.fav-empty__btn:hover { background: var(--green-hover); color: var(--on-green); }
.fav-empty--date { padding: 40px 20px; gap: 10px; }
.fav-empty--date .fav-empty__ico { color: rgba(255, 255, 255, 0.25); }
.fav-empty--date .fav-empty__title { font-size: 15px; }
.fav-empty--date .fav-empty__text { font-size: 13px; line-height: 1.55; max-width: 380px; }
.fav-empty--date .fav-empty__btn { margin-top: 6px; padding: 10px 22px; font-size: 13px; }
/* Скрытые состояния не должны раскрываться собственным display: у атрибута
   [hidden] UA-стиль display:none проигрывает любому авторскому display. */
.fav-empty[hidden], .fav-side__hint[hidden], .fav-filter[hidden],
#fav-groups[hidden], .fav-ml__row[hidden], .fav-mlist[hidden],
.fav-group[hidden], .fav-other[hidden] { display: none !important; }

/* --- Мобильный единый список избранного «Лиги и команды» (как в макете m-fav) --- */
.fav-mlist { display: none; }
.fav-mlist__head {
  padding: 13px 16px; font-size: 11px; font-weight: 700;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim);
  border-bottom: 1px solid var(--line-soft);
}
.fav-ml__row {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 12px;
  padding: 14px 16px; border-top: 1px solid var(--line-soft); color: var(--ink);
}
.fav-ml__row:first-of-type { border-top: none; }
.fav-ml__row:hover { background: rgba(255, 255, 255, 0.02); }
.fav-ml__star { color: var(--green); display: inline-flex; flex: none; }
.fav-ml__body { min-width: 0; }
.fav-ml__name { display: block; font-size: 14px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; }
.fav-ml__type { display: block; font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); margin-top: 3px; }
.fav-ml__arrow { color: var(--dim); flex: none; }

@media (max-width: 600px) {
  /* Мобильный экран (макет m-fav): те же богатые группы, что на десктопе, в
     компактной сетке. Сайдбар со списками лиг и команд раньше здесь прятался —
     считалось, что его роль играют звёзды в группах. Не играют: группы
     собраны ПО ЛИГАМ, и звезда в шапке группы снимает лигу, а звезда в строке
     — матч. Команду с телефона снять было нечем вообще: она видна только
     своими матчами в чужих группах. Поэтому сайдбар остаётся, но уезжает под
     список матчей — управление избранным нужно после того, как посмотрел
     матчи, а не до. Телеграм-карточка при этом гаснет: она десктопный филлер
     колонки, а не часть управления. */
  .fav-page .lb-sidebar { order: 2; gap: 12px; }
  .fav-page .lb-content { order: 1; }
  .fav-page .lb-sidebar .home-cta { display: none; }
  .fav-head h1 { font-size: 19px; }
  .fav-head__ico { width: 40px; height: 40px; }

  /* Фильтр — горизонтальный скролл-ряд, пилюли компактнее */
  .fav-filter { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
  .fav-filter::-webkit-scrollbar { display: none; }
  .fav-filter > * { flex: none; }
  .fav-filter .lb-pill { font-size: 11.5px; padding: 7px 14px; }
  /* Липкости и fixed-поповера больше нет: чип уехал из скролл-ряда пилюль в
     шапку страницы, и обычный absolute-поповер под кнопкой снова работает —
     как на десктопе и как у чипа даты на главной. */
  .fav-cal__menu { width: 262px; }

  .fav-group__head { padding: 12px 14px; gap: 10px; }
  .fav-group__name { font-size: 13px; }
  /* Строка матча — мобильная раскладка .lb-fixture из 99-responsive (звезда,
     команды столбиком, время и счёт справа за разделителем). Ширину колонок
     возвращаем к ней руками: десктопное правило выше специфичнее ядрового
     (.fav-group__body .lb-fixture против .lb-fixture) и иначе перебило бы
     мобильную сетку шестью колонками. Остальное наследуется как есть. */
  /* Ширина колонки времени ФИКСИРОВАННАЯ, а не minmax(72px, auto): каждая
     строка — своя сетка, и при auto колонка мерилась по своему содержимому.
     Строка с датой («17:00 · 30.08») получала колонку шире соседней без даты,
     и вертикальный разделитель прыгал по карточке от строки к строке.
     100px — это измеренная ширина самого широкого содержимого («20:45 · 30.08»
     = 98px вместе с рамкой и отбивкой) плюс запас. Ужимать нельзя: при нехватке
     флекс с justify-content: flex-end выдавливает текст ВЛЕВО, в отбивку, и
     время прилипает к самому разделителю. */
  .fav-group__body .lb-fixture { grid-template-columns: 18px minmax(0, 1fr) 100px; }

  /* Единый список — только деградация без API (JS вешает .is-fallback на .fav-page) */
  .fav-mlist { display: none; }
  .is-fallback .fav-mlist:not([hidden]) { display: block; }
  .is-fallback #fav-groups { display: none; }
}

/* ===== partials/16-news.css ===== */
/* --- Новость (news-) --- */
.news-page { width: 1140px; margin: 0 auto; padding: 18px 0 12px; }

/* Верхнего ряда .news-topbar («← Все матчи» + ряд соцкнопок) больше нет:
   шаринг живёт кнопкой «Поделиться» (.lb-share, 00-core) в мета-строке
   статьи, справа. */
.news-grid { display: grid; grid-template-columns: 1fr 348px; gap: 20px; align-items: start; margin-top: 12px; }

/* Статья — карточка-панель */
.news-article { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 28px 32px 26px; min-width: 0; }

/* Мета: пилюля категории + дата · время чтения; «Поделиться» прижат справа */
.news-article__top { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.news-article__top .lb-share { margin-inline-start: auto; }
.news-article__cat {
  display: inline-flex; align-items: center; gap: 7px;
  background: rgba(88, 219, 36, 0.12); border: 1px solid rgba(88, 219, 36, 0.35);
  color: var(--green-soft); font-size: 10.5px; font-weight: 800;
  letter-spacing: 0.1em; text-transform: uppercase;
  border-radius: var(--r-pill); padding: 5px 12px;
}
.news-article__date { font-size: 12.5px; font-weight: 600; color: var(--dim); }
.news-article__dot { color: var(--faint); }

.news-article h1 { font-family: var(--font-display); font-size: 27px; font-weight: 700; line-height: 1.35; margin: 16px 0 0; color: var(--ink-strong); }
.news-article__lead { font-size: 16.5px; line-height: 1.65; font-weight: 600; color: #DFE5DB; margin: 16px 0 0; }

/* Фото */
.news-article__figure { margin: 22px 0 0; }
.news-article__media { height: 420px; border-radius: 14px; overflow: hidden; background: var(--bg); }
.news-article__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.news-article__cap { font-size: 12px; font-weight: 600; color: var(--dim); margin-top: 10px; }

/* Тело */
.news-article__body { font-size: 15px; line-height: 1.75; color: var(--ink-soft); }
.news-article__body h3 { font-family: var(--font-display); font-size: 17px; font-weight: 700; margin: 28px 0 0; color: var(--ink-strong); }
.news-article__body p { margin: 12px 0 0; }

/* Цитата — карточка с кавычками и атрибуцией */
.news-quote { background: var(--bg); border: 1px solid var(--line); border-radius: 14px; padding: 20px 22px; margin: 24px 0 0; }
.news-quote__mark { display: block; fill: var(--green); opacity: 0.85; }
.news-quote__text { font-size: 16px; line-height: 1.6; font-weight: 600; color: var(--ink); margin: 12px 0 0; }
.news-quote__author { font-size: 12.5px; font-weight: 700; color: var(--muted); margin-top: 12px; }

/* Карточка матча в статье */
.news-matchcard { display: block; background: var(--bg); border: 1px solid rgba(88, 219, 36, 0.3); border-radius: 14px; margin: 24px 0 0; overflow: hidden; color: var(--ink); }
.news-matchcard:hover { border-color: rgba(139, 233, 106, 0.6); color: var(--ink); }
.news-matchcard__head { display: flex; align-items: center; gap: 10px; padding: 11px 18px; border-bottom: 1px solid var(--line-soft); }
.news-matchcard__league { width: 18px; height: 18px; object-fit: contain; }
.news-matchcard__note { font-size: 12px; font-weight: 600; color: var(--muted); }
.news-matchcard__cta {
  margin-inline-start: auto; display: inline-flex; align-items: center; gap: 7px;
  font-size: 11px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--green-soft);
}
.news-matchcard__row { display: grid; grid-template-columns: 1fr auto 1fr; gap: 16px; align-items: center; padding: 16px 24px; }
.news-matchcard__team { display: flex; align-items: center; gap: 12px; font-size: 15px; font-weight: 800; }
.news-matchcard__team--home { justify-content: flex-end; }
.news-matchcard__team img { width: 34px; height: 34px; object-fit: contain; }
.news-matchcard__time { font-size: 15px; font-weight: 800; color: var(--dim); }

/* Теги */
.news-tags { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 26px 0 0; }
.news-tags a { font-size: 12px; font-weight: 600; color: var(--ink-soft); background: var(--bg); border: 1px solid var(--line-ctl); border-radius: var(--r-pill); padding: 7px 14px; }
.news-tags a:hover { border-color: var(--hover-green-line); color: var(--green-pale); }

/* Автор */
.news-author { display: flex; align-items: center; gap: 12px; margin: 24px 0 0; padding-top: 20px; border-top: 1px solid rgba(255, 255, 255, 0.07); }
.news-author__avatar {
  width: 40px; height: 40px; border-radius: 50%;
  background: rgba(88, 219, 36, 0.15); border: 1px solid rgba(88, 219, 36, 0.35);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 13px; font-weight: 800; color: var(--green-soft); flex: none;
}
.news-author__info { display: flex; flex-direction: column; gap: 2px; }
.news-author__name { font-size: 13.5px; font-weight: 700; color: var(--ink-strong); }
.news-author__date { font-size: 12px; font-weight: 600; color: var(--dim); }

/* Сайдбар */
.news-aside { display: flex; flex-direction: column; gap: 20px; min-width: 0; }

/* «Топ события» — по одному топ-событию на вид спорта (live → сегодня → скоро → завершён).
   Слева пара логотипов внахлёст: у круглых (флаги, бейджи) второй отсекает
   первого рамкой цвета панели. Справа столбик статуса: live-минута и счёт
   красные, предстоящее — серая подпись дня + зелёное время, завершённое —
   серая подпись + белый счёт. */
.news-top { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; }
.news-top__head { display: flex; align-items: center; gap: 8px; padding: 16px 20px 12px; }
.news-top__head h2 { font-family: var(--font-display); font-size: 16px; font-weight: 700; flex: 1; }

.news-top__row { display: flex; align-items: center; gap: 10px; padding: 13px 20px; border-top: 1px solid var(--line-soft); color: var(--ink); }
.news-top__row:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
.news-top__logos { display: inline-flex; align-items: center; flex: none; }
.news-top__logos > * + * { margin-inline-start: -6px; }
.news-top__logo { width: 20px; height: 20px; object-fit: contain; flex: none; }
.news-top__logo--round { border-radius: 50%; object-fit: cover; border: 1px solid rgba(255, 255, 255, 0.15); }
.news-top__logo--round + .news-top__logo--round { border-color: var(--panel); }
.news-top__logos .sm-badge { width: 20px; height: 20px; font-size: 6.5px; }
.news-top__logos .sm-badge + .sm-badge { border: 1px solid var(--panel); }
.news-top__main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.news-top__name { font-size: 13px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.news-top__cat { font-size: 10px; font-weight: 600; color: var(--dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.news-top__st { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; flex: none; }
.news-top__live { display: inline-flex; align-items: center; gap: 5px; font-size: 10px; font-weight: 800; color: var(--red-live-text); white-space: nowrap; }
.news-top__when { font-size: 10px; font-weight: 700; color: var(--dim); white-space: nowrap; }
.news-top__time { font-size: 12.5px; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }
.news-top__score { font-size: 13px; font-weight: 800; font-variant-numeric: tabular-nums; }
.news-top__score--live { color: var(--red-live-text); }

.news-top__all { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 13px 20px; border-top: 1px solid var(--line-soft); font-size: 12.5px; font-weight: 700; color: var(--green-soft); }
.news-top__all:hover { background: rgba(139, 233, 106, 0.06); color: var(--green-pale); }

/* ===== Страница кастомного события (/event/{id}) =====
   Вёрстка страницы — новостная (.news-page/.news-grid--live): у события нет
   ни счёта, ни составов, ни статистики, только заголовок, лига, время и эфир.
   Здесь — та немногая разница, ради которой заведены свои классы. */
.ev-meta {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin: 6px 0 14px;
  font-size: 13px;
  font-weight: 600;
  color: var(--dim);
}
.ev-meta__league { display: inline-flex; align-items: center; gap: 8px; }
.ev-meta__league img { width: 22px; height: 22px; flex: none; object-fit: contain; }
.ev-meta__when i { margin: 0 4px; font-style: normal; }
/* Канал ещё не назначен — это нормальное состояние, а не ошибка: событие
   часто заводят заранее. Поэтому строка спокойная, без красного. */
.ev-nostream { font-size: 13.5px; font-weight: 600; color: var(--dim); }
.ev-teams { margin-top: 14px; }
.ev-art { display: block; width: 100%; height: auto; border-radius: var(--r-lg); margin-top: 16px; }

/* --- Адаптив (брейкпоинты как в 99-responsive) --- */
@media (max-width: 600px) {
  .news-article { padding: 20px 16px 18px; }
  .news-article__media { height: 220px; }
  /* 99-responsive задаёт .news-matchcard { padding: 18px } под старую flex-карточку —
     новой блочной карточке с собственной шапкой внешний padding не нужен */
  a.news-matchcard { padding: 0; }
  .news-matchcard__row { padding: 14px 16px; }
}

/* ===== partials/17-leagues.css ===== */
/* --- Каталог лиг и турниров (lgc-) --- */
.lgc-page { width: 1140px; margin: 0 auto; padding: 32px 0 24px; }
.lgc-title { margin-bottom: 18px; }
/* minmax(0, 1fr), а не 1fr: строка «Северная и Центральная Америка» набрана
   в nowrap, её min-content (309px) распирал колонку, и на узких экранах
   (320px) карточка вылезала за правый край страницы. С нулевым минимумом
   колонка сжимается, а имя страны уходит в многоточие, как и задумано. */
.lgc-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 16px;
  align-items: start;
}
/* карточки Топ турниров / Стран переиспользуют .home-side из главной */

@media (max-width: 1180px) {
  /* width: 100%, а не auto — body флекс-колонка, см. 99-responsive.css */
  .lgc-page { width: 100%; max-width: 1140px; padding-inline-start: 20px; padding-inline-end: 20px; }
}
@media (max-width: 780px) {
  .lgc-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 600px) {
  .lgc-page { padding-inline-start: 14px; padding-inline-end: 14px; }

  /* Секции «Топ турниры» и «Страны» по мобильному макету: заголовок стоит НАД
     карточкой, сама карточка — только вокруг списка, а строки турниров
     разделены линиями (на десктопе заголовок внутри карточки, строки
     скруглённые — там макет другой). */
  .lgc-grid .home-side { background: none; border: 0; padding: 0; border-radius: 0; }
  .lgc-grid .home-side__head { padding: 0 2px 8px; }
  /* Поиск по странам — вровень со списком и на --panel: карточка на мобилке
     теряет фон, и поле на --bg читалось бы темнее соседнего списка. */
  .lgc-grid .home-side__search { margin: 0 0 10px; padding: 10px 16px; background: var(--panel); }
  .lgc-grid .home-side__list {
    background: var(--panel);
    border: 1px solid var(--line);
    border-radius: var(--r-card);
    overflow: hidden;
  }
  .lgc-grid .home-side__list > .home-nav { border-radius: 0; padding: 12px 14px; }
  .lgc-grid .home-side__list > .home-nav + .home-nav { border-top: 1px solid var(--line-soft); }
  .lgc-grid .home-nav__arrow { display: inline-flex; color: var(--dim); }
  /* «Страны» — раскрывающиеся строки, разделителей в макете нет: у списка свой
     внутренний отступ, строки остаются скруглёнными. */
  .lgc-grid .home-side__list--countries { padding: 6px; }
}

/* ===== partials/18-notfound.css ===== */
/* ---------- Страница 404 (nf-) ---------- */
/* Раньше эти правила лежали в 30-go-compat.css: страницы 404 в макете не было,
   вёрстка существовала только в Go-шаблоне. С новым дизайном макет появился
   (404.html), поэтому партиал страничный — как у остальных страниц. */

/* Герой во всю ширину: полосы и свечение обрезаются по краям экрана, а контент
   внутри держит те же 1140px, что подшапка и футер. */
.nf-hero {
  position: relative;
  overflow: hidden;
  border-bottom: 1px solid var(--line-soft);
}
/* Оба декоративных слоя не ловят клики: они лежат поверх фона, но под
   контентом, и без pointer-events кнопки героя перестали бы нажиматься. */
.nf-hero__stripes,
.nf-hero__glow {
  position: absolute;
  pointer-events: none;
}
.nf-hero__stripes {
  inset: 0;
  background: repeating-linear-gradient(90deg,
    rgba(255, 255, 255, 0.022) 0 96px,
    rgba(255, 255, 255, 0) 96px 192px);
}
.nf-hero__glow {
  top: -180px;
  left: 50%;
  transform: translateX(-50%);
  width: 900px;
  height: 420px;
  background: radial-gradient(closest-side, rgba(88, 219, 36, 0.18), rgba(88, 219, 36, 0));
}

/* Сетка героя. Порядок узлов в DOM — мобильный (киккер → 404 → заголовок →
   текст → кнопки), на десктопе цифра явным grid-column уезжает во вторую
   колонку. Так адаптиву не приходится переставлять блоки. */
.nf-hero__inner {
  position: relative;
  width: 1140px;
  margin: 0 auto;
  padding: 60px 0 62px;
  display: grid;
  grid-template-columns: 1fr 420px;
  /* Строки объявлены явно (по числу блоков левой колонки) не для красоты:
     `grid-row: 1 / -1` у цифры отсчитывает -1 от ЯВНОЙ сетки, а при неявной
     строке −1 схлопывается в первую же — цифра садилась в строку киккера и
     растягивала её до своей высоты, отрывая заголовок на добрую сотню
     пикселей. Появится шестой блок — он уедет в неявную строку, цифра
     останется отцентрованной по первым четырём. */
  grid-template-rows: repeat(4, auto);
  column-gap: 56px;
}
.nf-hero__inner > * { grid-column: 1; }

/* Типографику киккера и заголовка берём у общих .lb-kicker / .lb-h1 — здесь
   только то, чем 404 от них отличается. */
.nf-kicker { margin-bottom: 16px; }
.nf-code {
  grid-column: 2;
  grid-row: 1 / -1;
  justify-self: end;
  align-self: center;
  font-family: var(--font-display);
  font-size: 168px;
  font-weight: 700;
  line-height: 0.86;
  letter-spacing: -0.05em;
  /* Фолбэк color нужен: в браузерах без background-clip:text прозрачная
     заливка текста не применяется и цифра остаётся зелёной, а не пропадает. */
  color: var(--green);
  background: linear-gradient(165deg, #F4FFEE 8%, #8BE96A 46%, #3C9E16 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
.nf-title {
  font-size: 38px;
  line-height: 1.2;
  text-wrap: balance;
}
.nf-text {
  font-size: 15px;
  line-height: 1.7;
  color: var(--ink-soft);
  margin: 16px 0 0;
  max-width: 520px;
  text-wrap: pretty;
}
.nf-actions {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 28px;
}
.nf-actions .lb-btn { padding: 12px 24px; }
.nf-actions .lb-btn--green { padding: 13px 26px; }
/* Контурная и прозрачная кнопки живут только здесь, поэтому модификаторы
   страничные: в 00-core у .lb-btn есть только зелёный и телеграмный вариант. */
.nf-btn--line,
.nf-btn--ghost {
  border-color: var(--line-ctl);
  font-weight: 600;
}
.nf-btn--line { background: var(--panel); color: var(--ink-soft); }
.nf-btn--ghost { background: transparent; color: var(--muted); }
.nf-btn--line:hover,
.nf-btn--ghost:hover {
  border-color: var(--hover-green-line);
  color: var(--green-pale);
}
/* Точка live в кнопке крупнее строчной (.lb-live-dot 6px): рядом с текстом
   14px она иначе теряется. */
.nf-actions .lb-live-dot { width: 7px; height: 7px; }

/* Куда пойти дальше */
.nf-next {
  width: 1140px;
  margin: 0 auto;
  padding: 34px 0 6px;
}
/* Тот же .lb-kicker, но приглушённый: это подпись служебного блока, а не
   акцент героя. */
.nf-next__cap { color: var(--dim); margin-bottom: 14px; }
.nf-next__grid {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 12px;
}
/* Фон, рамка и радиус — от общего .lb-card (в разметке оба класса). */
.nf-card {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 18px;
  color: var(--ink);
}
.nf-card:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
/* Размер задаём стилями, а не атрибутами svg: иконки видов спорта — общий
   комплект с подшапкой, и там они 14px. Свой размер в разметке заставил бы
   держать две копии одного набора. */
.nf-card svg { width: 20px; height: 20px; color: var(--green-soft); }
.nf-card__name {
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
}
.nf-card__sub { font-size: 12px; color: var(--muted); }

/* ===== partials/19-sports.css ===== */
/* --- Общие компоненты спортивных разделов (sm-) ---
   Используются и хоккеем (hk-), и баскетболом (bb-): бейджи-кружки команд,
   карточки «Топ лиги», строки матчей, шапка счёта, статистика, H2H, коэффициенты,
   голосование, инфо. Цвета команд/лиг — в 20-hockey.css / 21-basketball.css. */

/* Бейдж-кружок команды/турнира (аббревиатура на цветном фоне) */
.sm-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  font-size: 8px;
  font-weight: 800;
  line-height: 1;
  color: #FFFFFF;
  background: var(--dim);
  flex: none;
  text-align: center;
}
.sm-badge--sm { width: 18px; height: 18px; font-size: 7px; }
.sm-badge--lg { width: 48px; height: 48px; font-size: 11px; font-weight: 700; border: 1px solid rgba(255, 255, 255, 0.15); }
.sm-badge--h2h { width: 20px; height: 20px; font-size: 7px; }
.sm-badge--vote { width: 26px; height: 26px; font-size: 8px; }
/* Бейдж + реальный логотип поверх (для клубов НБА) */
.sm-logo { position: relative; display: inline-flex; width: 24px; height: 24px; flex: none; }
.sm-logo .sm-badge { position: absolute; inset: 1px; width: auto; height: auto; }
/* В строках матчей лого/бейдж — 22px, как в макете (24 растягивало строку до 47px) */
.lb-fixture .sm-logo { width: 22px; height: 22px; }
.lb-fixture .sm-logo .sm-badge { inset: 0; }
.sm-logo__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }

/* ===== Хаб: карточки «Топ лиги» (2 крупные плитки) ===== */
/* .sm-toplg и .sm-toplg__row — один и тот же узел: обёртки под стрелки
   больше нет, стрелок тоже (ряд прокручивается пальцем, как на футболе). */
.sm-toplg__row { display: flex; gap: 16px; }
.sm-lc {
  flex: 1;
  height: 150px;
  border-radius: var(--r-xl);
  overflow: hidden;
  position: relative;
  display: block;
  color: #FFFFFF;
}
/* Hover — подсветка всей карточки (хендофф-сниппет top-ligi-basketball). */
.sm-lc:hover { color: #FFFFFF; filter: brightness(1.08); }
.sm-lc__wm {
  position: absolute;
  opacity: 0.1;
  filter: grayscale(1) brightness(2.6);
  pointer-events: none;
  /* Глобальный img { max-width: 100% } ужимал широкие лого (wordmark
     Евролиги 254×58) в ширину карточки — svg letterbox'ился и геометрия
     среза уезжала. В хендофф-сниппете у вотермарки явный max-width: none. */
  max-width: none;
}
.sm-lc__photo { position: absolute; object-fit: cover; pointer-events: none; }
.sm-lc__country {
  position: absolute;
  inset-inline-start: 18px;
  top: 16px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.85);
  z-index: 2;
}
.sm-lc__country img { height: 11px; border-radius: 2px; }
.sm-lc__name {
  position: absolute;
  inset-inline-start: 18px;
  bottom: 37px;
  font-family: var(--font-display);
  font-size: 18px;
  font-weight: 700;
  color: #FFFFFF;
  z-index: 2;
}
.sm-lc__cta {
  position: absolute;
  inset-inline-start: 18px;
  bottom: 14px;
  font-size: 12.5px;
  font-weight: 700;
  color: #FFFFFF;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.55);
  z-index: 2;
}

/* CTA Telegram, дублирующая сайдбарную для мобилки (сайдбар на моб скрыт).
   На десктопе скрыта — там CTA живёт в сайдбаре. */
.sm-cta-m { display: none; }

/* Строка матча у хоккея и баскетбола — общая .lb-fixture (00-core.css), та
   же, что у футбола: свой компонент .sm-fixture расходился с ней размерами
   логотипов и колонок. Две колонки шире футбольных и задаются переменными на
   контейнере ленты: счёт у баскетбола — --fx-scorew (.bb-groups), время у
   обоих — --fx-timew (.hk-groups, .bb-groups): live-статус здесь слово
   («1-й период», «1-я четверть»), а не минута. */

/* ===== Матч: сетка ===== */
.sm-mgrid {
  width: 1140px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 348px;
  gap: 20px;
  align-items: start;
  padding: 12px 0;
}
.sm-mcol { display: flex; flex-direction: column; gap: 20px; min-width: 0; }

.sm-card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); }
.sm-card--pad { padding: 20px; }
.sm-card__head { display: flex; gap: 12px; align-items: baseline; justify-content: space-between; margin-bottom: 4px; }
.sm-card__head h2 { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); margin: 0; }
.sm-card__note { font-size: 12px; font-weight: 600; color: var(--dim); }

/* Шапка счёта у хоккея и баскетбола — это .mt-hero футбола (13-match.css):
   один элемент на все виды спорта, поэтому собственных классов
   (.sm-mhead__*, .sm-side*, .sm-mscore*) здесь больше нет. Своя только
   разбивка по периодам — у футбола такой строки нет. */

/* Город под названием команды — есть в макетах хоккея и баскетбола (у футбола
   такой строки нет). Живёт внутри общего .mt-side__box. */
.mt-side__city { font-size: 11.5px; font-weight: 600; color: var(--dim); }

/* Разбивка по периодам/четвертям */
.sm-periods { display: flex; flex-wrap: wrap; gap: 18px; padding: 0 18px 16px; font-size: 12px; font-weight: 600; color: var(--dim); align-items: center; justify-content: center; }
.sm-periods b { font-weight: 800; color: var(--ink); }
.sm-periods .is-live { color: #FF6B6B; }

/* Плеер */
.sm-player__langs { display: flex; align-items: center; gap: 8px; padding: 10px 16px; border-bottom: 1px solid var(--line-soft); }
.sm-player__langs-label { font-size: 12.5px; font-weight: 700; color: var(--muted); }

/* Сцена-заглушка плеера. Лежала в 45-mockup-demo (сайт её пропускает): на
   хоккее и баскетболе вместо неё работает легаси-плеер из 30-go-compat.
   Переехала сюда, когда раздел UFC появился на сайте — там эфира ещё нет и
   Go выводит ровно эту заглушку. Пилюли языков (.sm-player__lang) тоже: на
   матчевых страницах их рисует .stream_lang_tab, на UFC — макетные кнопки. */
.sm-player__lang { padding: 7px 15px; border-radius: var(--r-pill); font-size: 12px; font-weight: 600; color: var(--ink-soft); border: 1px solid var(--line-strong); }
.sm-player__lang.is-active { background: var(--green); color: var(--on-green); border-color: var(--green); font-weight: 800; }
.sm-player__stage {
  position: relative;
  aspect-ratio: 16 / 9;  /* как в макете (было жёсткое 260px — сплющивало сцену) */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  background: radial-gradient(560px 320px at 50% 30%, rgba(88, 219, 36, 0.1), transparent 70%), var(--bg-header);
}
.sm-player__play { width: 76px; height: 76px; border-radius: 50%; background: var(--green); color: var(--on-green); display: inline-flex; align-items: center; justify-content: center; }
.sm-player__title { font-size: 14px; font-weight: 700; color: var(--ink); }
.sm-player__sub { font-size: 12px; color: var(--dim); }
.sm-player__live {
  position: absolute;
  inset-inline-start: 14px;
  top: 14px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 12px;
  border-radius: var(--r-pill);
  background: rgba(12, 17, 11, 0.8);
  border: 1px solid rgba(229, 57, 53, 0.45);
  font-size: 10.5px;
  font-weight: 800;
  color: #FF6B6B;
}

/* Статистика: зеркальные бары */
.sm-stat { padding: 12px 0 4px; }
.sm-stat__row { display: flex; align-items: center; justify-content: space-between; font-size: 13px; }
.sm-stat__row b { font-weight: 800; }
.sm-stat__row .lbl { font-weight: 600; color: var(--muted); }
.sm-stat__bar { display: flex; gap: 4px; height: 7px; margin-top: 8px; }
/* display:flex именно на базовом треке: заливка внутри — <span>, а к inline
   элементу не применяются ни width, ни height, и правая полоса пары просто
   не рисовалась (левая работала случайно — у неё flex был ради
   justify-content). Видно на статистике UFC и в макетах хоккея/баскетбола. */
.sm-stat__track { flex: 1; display: flex; background: rgba(255, 255, 255, 0.06); border-radius: var(--r-pill); overflow: hidden; }
.sm-stat__track--l { justify-content: flex-end; }
/* transition по ширине — ради поллинга UFC: он вписывает новые доли в те же
   узлы, и без него полоса перескакивала бы рывком каждые 15 секунд. На
   странице, которая только что загрузилась, он не виден: ширина ставится
   сервером, а не меняется.

   Правило жило прямо в собранном public/css/v2/style.css и в партиал не
   попало — то есть первый же `npm run css` его молча снёс бы (грабли №1). */
.sm-stat__fill { border-radius: var(--r-pill); height: 100%; transition: width 0.45s ease-out; }
@media (prefers-reduced-motion: reduce) {
  .sm-stat__fill { transition: none; }
}
.sm-legend { display: flex; gap: 16px; align-items: center; margin-top: 14px; font-size: 11.5px; color: var(--muted); }
.sm-legend span { display: inline-flex; align-items: center; gap: 7px; }
.sm-legend i { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }

/* Очные встречи */
/* Строка-ссылка на страницу матча: цвет фиксируем, чтобы глобальный a:hover не зеленил текст */
.sm-h2h__row { display: grid; grid-template-columns: 150px 1fr auto 1fr; align-items: center; gap: 12px; padding: 10px 6px; border-top: 1px solid var(--line-soft); color: var(--ink); }
.sm-h2h__row:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
.sm-h2h__row:first-of-type { border-top: none; }
/* Шапка карточки очных встреч ниже базовых 4px (в макете 12px) */
.sm-card__head:has(+ .sm-h2h__row) { margin-bottom: 12px; }
.sm-h2h__date { min-width: 0; }
.sm-h2h__date b { display: block; font-size: 12.5px; font-weight: 700; }
.sm-h2h__date small { display: block; font-size: 11.5px; color: var(--dim); margin-top: 2px; }
.sm-h2h__team { display: flex; align-items: center; gap: 9px; font-size: 13.5px; font-weight: 600; }
.sm-h2h__team.r { justify-content: flex-end; text-align: end; }
.sm-h2h__team.win { color: var(--green-soft); font-weight: 800; }
.sm-h2h__logo { width: 20px; height: 20px; object-fit: contain; flex: none; }
.sm-h2h__sc { font-size: 14px; font-weight: 800; color: var(--ink); font-variant-numeric: tabular-nums; text-align: center; white-space: nowrap; }

/* ---------- Ставки: карточка «логотип БК → бонус → кэфы или CTA» ----------
   ЕДИНЫЙ блок для всех разделов: футбол (_odds.html), UFC и Формула-1. За
   стандарт взят вариант со страницы матча — он единственный ездил на реальных
   офферах админки. У UFC и Формулы-1 были свои CTA (сплошная зелёная кнопка,
   причём двух разных размеров) и свои отступы, из-за чего один и тот же блок
   выглядел на трёх страницах по-разному. Новых вариантов здесь не заводим:
   разница между разделами — только в данных (есть кэфы или нет). */
.sm-bk__row { display: block; padding: 12px 0 10px; border-top: 1px solid var(--line-soft); color: var(--ink); }
.sm-bk__row:hover { color: var(--ink); }  /* строка не зеленеет — подсвечивается только ячейка/CTA */
.sm-bk__top { display: flex; align-items: center; gap: 9px; }
/* Логотип БК. Офферы приходят из рекламной админки, а там логотипы — широкие
   вордмарки (fonbet 928x168 и т.п.): имя букмекера написано на самой картинке,
   поэтому отдельной подписи рядом нет. Первый макет рисовал вместо логотипа
   цветную плитку 26x26 с инициалами и подпись рядом — от этой пары отказались,
   когда блок поехал на реальные данные. */
.sm-bk__logo { flex: none; }
.sm-bk__logo--img { width: auto; max-width: 104px; height: 22px; object-fit: contain; object-position: left center; }
[dir="rtl"] .sm-bk__logo--img { object-position: right center; }
/* Без nowrap: текст бонуса приходит из админки и бывает длинным («БОНУС ДО
   150К ГРН + 15К ГРН FREEBET») — несжимаемая однострочная плашка вылезала за
   край карточки. Длинный текст переносится на вторую строку целиком. */
.sm-bk__bonus {
  margin-inline-start: auto; font-size: 11px; font-weight: 700; color: var(--green-soft);
  background: rgba(88, 219, 36, 0.1); border: 1px solid rgba(88, 219, 36, 0.3);
  border-radius: var(--r-pill); padding: 3px 9px; text-align: center;
}
.sm-bk__nums { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 6px; margin-top: 9px; }
.sm-bk__nums span {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  background: var(--bg); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 8px;
  padding: 7px 0; font-size: 12.5px;
}
/* Подсвечивается только ячейка под курсором (единое поведение во всех видах спорта) */
.sm-bk__nums span:hover { border-color: var(--hover-green-line); }
.sm-bk__nums small { font-size: 12.5px; color: var(--dim); font-weight: 600; }
.sm-bk__nums b { font-weight: 800; font-variant-numeric: tabular-nums; }
/* CTA без заливки: сплошная зелёная кнопка спорила за внимание с контентом
   сайдбара. Призрачный стиль в семье .sm-bk__bonus (та же прозрачная
   зелень), на hover — чуть плотнее. */
.sm-bk__cta {
  display: flex; align-items: center; justify-content: center; gap: 7px; margin-top: 9px;
  background: transparent; color: var(--green-soft);
  border: 1px solid rgba(88, 219, 36, 0.3); border-radius: 8px;
  padding: 7px 0; font-size: 12.5px; font-weight: 800;
}
.sm-bk__row:hover .sm-bk__cta { background: rgba(88, 219, 36, 0.08); border-color: var(--hover-green-line); }
/* На матче карточка блока — .mt-panel-card с отбивкой шапки 14px; у .sm-card
   базовые 4px, и первый ряд с логотипом вплотную к заголовку выглядел иначе.
   Выравниваем именно здесь, а не в .sm-card__head: остальные карточки
   сайдбара живут с 4px. */
.sm-card__head:has(+ .sm-bk__row) { margin-bottom: 14px; }

/* Голосование */
.sm-vote__count { font-size: 12px; font-weight: 600; color: var(--dim); margin: 2px 0 12px; }
.sm-vote__grid { display: grid; grid-template-columns: var(--sm-vote-cols, 1fr 1fr 1fr); gap: 8px; }
.sm-vote__btn { display: flex; flex-direction: column; align-items: center; gap: 8px; background: var(--bg); border: 1px solid var(--line-strong); border-radius: 12px; padding: 13px 6px; color: var(--ink); }
.sm-vote__btn:hover { border-color: var(--hover-green-line); }
.sm-vote__btn > span:last-child { font-size: 12px; font-weight: 700; }
.sm-vote__x { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; background: rgba(255, 255, 255, 0.09); color: var(--ink-soft); font-size: 11px; font-weight: 800; }
.sm-vote__logo { width: 26px; height: 26px; object-fit: contain; }

/* Информация о матче */
.sm-info__row { display: flex; justify-content: space-between; gap: 12px; padding: 9px 0; font-size: 13px; border-bottom: 1px solid rgba(255, 255, 255, 0.05); }
.sm-info__row:last-child { border-bottom: none; }
.sm-info__row .k { font-weight: 600; color: var(--dim); }
.sm-info__row .v { font-weight: 700; text-align: end; }

/* SEO-блок матча */
.sm-mseo { border-top: 1px solid rgba(255, 255, 255, 0.07); margin-top: 24px; }
.sm-mseo .lb-kicker { display: block; margin-bottom: 14px; }
.sm-mseo__grid { width: 1140px; margin: 0 auto; display: grid; grid-template-columns: 380px 1fr; gap: 48px; padding: 36px 0 40px; }
.sm-mseo__grid h2 { font-family: var(--font-display); font-size: 21px; font-weight: 700; line-height: 1.4; color: var(--ink-strong); margin: 0; }
.sm-mseo__body { font-size: 14.5px; line-height: 1.7; color: var(--ink-soft); }
.sm-mseo__body p { margin: 0 0 12px; }
.sm-mseo__body p:last-child { margin-bottom: 0; }

/* ===== Хаб: SEO «О разделе» ===== */
.sm-seo { border-top: 1px solid rgba(255, 255, 255, 0.07); margin-top: 32px; }
.sm-seo .lb-kicker { display: block; margin-bottom: 14px; }
.sm-seo__grid { width: 1140px; margin: 0 auto; display: grid; grid-template-columns: 380px 1fr; gap: 48px; padding: 44px 0; }
.sm-seo__grid h2 { font-family: var(--font-display); font-size: 23px; font-weight: 700; line-height: 1.35; color: var(--ink-strong); margin: 0; }
.sm-seo__body { font-size: 15px; line-height: 1.7; color: var(--ink-soft); }
.sm-seo__body p { margin: 0; }
.sm-seo__body p + p { margin-top: 14px; font-weight: 600; color: var(--ink); }

/* ============================================================
   Адаптив общих спорт-компонентов (1:1 с мобильными макетами)
   ============================================================ */

/* Планшет: сетка матча в одну колонку, крошки/сетка резиновые */
@media (max-width: 1180px) {
  .sm-mgrid, .sm-mseo__grid, .sm-seo__grid {
    /* Именно 100%, а не auto — та же ловушка, что у .mt-page (99-responsive):
       body — флекс-колонка, и с `width: auto` обёртка с `margin: 0 auto`
       ужимается по содержимому. На странице матча хоккея контент вставал
       колонкой ~290px посреди телефона, а шапка и баннер шли во всю ширину. */
    width: 100%; max-width: 1140px; padding-inline-start: 20px; padding-inline-end: 20px;
  }
}
@media (max-width: 940px) {
  .sm-mgrid, .sm-mseo__grid, .sm-seo__grid { grid-template-columns: 1fr; }
}

@media (max-width: 600px) {
  .sm-mgrid, .sm-mseo__grid, .sm-seo__grid { padding-inline-start: 14px; padding-inline-end: 14px; }
  .sm-mseo__grid { padding-top: 24px; padding-bottom: 28px; }
  /* SEO «О разделе» на мобилке — как в футбольном «О проекте»: h2 16 / body 13 / kicker 10, gap 20 */
  .sm-seo__grid { gap: 20px; padding-top: 26px; padding-bottom: 36px; }
  .sm-seo__grid h2 { font-size: 16px; }
  .sm-seo .lb-kicker { font-size: 10px; }
  .sm-seo__body { font-size: 13px; }

  /* Бонус-плашка в две строки на узкой карточке — мельче, иначе логотип БК
     сжимается до нечитаемого. */
  .sm-bk__bonus { font-size: 10px; }

  /* Шапка счёта на мобилке — правила .mt-hero/.mt-side из блока футбола. */
  .sm-periods { gap: 10px 14px; font-size: 11px; padding: 0 12px 16px; }

  /* Сцена плеера на мобилке остаётся 16:9 от ширины (правило height:200px снято) */
  .sm-player__langs { flex-wrap: wrap; }

  /* H2H — сжать колонку даты */
  .sm-h2h__row { grid-template-columns: 96px 1fr auto 1fr; gap: 8px; }
  .sm-h2h__team { font-size: 12.5px; gap: 6px; }

  /* Топ лиги — горизонтальный ряд с прокруткой (стрелок нет, как на футболе) */
  .sm-toplg__row { overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; gap: 10px; }
  .sm-toplg__row::-webkit-scrollbar { display: none; }
  .sm-lc { flex: 0 0 240px; height: 136px; }

  /* CTA Telegram снизу основной колонки — как в мобильном макете */
  .sm-cta-m { display: block; }
}

/* ===== partials/20-hockey.css ===== */
/* --- Хоккей (hk-): цвета команд/турниров + специфика раздела ---
   Каркас общий — см. 19-sports.css (sm-). Хаб переиспользует home-* и lb-*. */

/* Основная колонка хаба (между «Топ лиги» / «Матчи» / «Новости» — gap 28) */
.hk-main { gap: 28px; }
.hk-block__head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 14px; }
/* Live-статус у хоккея — слово, а не минута: «1-й период», по-грузински
   «1-ლი პერიოდი» (84px текста + 6px точки + 6px зазора = 96px). В базовых
   76px он переносился на вторую строку. */
.hk-groups { --fx-timew: 96px; }

/* Цвета бейджей турниров/лиг (сайдбар «Топ турниры», группы матчей) */
.hk-nhl { background: #1B3B6F; }
.hk-khl { background: #B01E2F; }
.hk-chm { background: #2A6F4E; }
.hk-kg  { background: #E5C453; }
.hk-ks  { background: #9DA898; }

/* Карточки «Топ лиги» (вырезы хоккеистов — из image-slot'ов хендоффа:
   бокс 170x142 у правого-нижнего края, масштаб слота пересчитан в height) */
.hk-lc-nhl { background: #1E4785; }
.hk-lc-nhl .sm-lc__wm { inset-inline-start: 136px; top: -22px; height: 194px; }
.hk-lc-nhl .sm-lc__photo { inset-inline-end: 8px; bottom: 0; height: 151px; width: auto; object-fit: contain; }
.hk-lc-khl { background: #A62432; }
.hk-lc-khl .sm-lc__wm { inset-inline-start: 128px; top: -16px; height: 182px; }
.hk-lc-khl .sm-lc__photo { inset-inline-end: 0; bottom: 0; height: 146px; width: auto; object-fit: contain; }

/* ===== partials/21-basketball.css ===== */
/* --- Баскетбол (bb-): цвета команд/лиг + специфика раздела ---
   Каркас общий — см. 19-sports.css (sm-). Хаб переиспользует home-* и lb-*. */

/* Основная колонка хаба */
.bb-main { gap: 28px; }
.bb-block__head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 14px; }
/* Счёт НБА трёхзначный с обеих сторон («112 : 108») — колонка шире базовых 64px.
   Время — тоже: live-статус здесь слово («1-я четверть», по-грузински
   «1-ლი მეოთხედი» — 91px текста плюс точка с зазором), и в 76px он
   переносился на вторую строку. Четверть длиннее хоккейного периода, поэтому
   и колонка шире, чем у .hk-groups. */
.bb-groups { --fx-scorew: 72px; --fx-timew: 104px; }

/* Цвета бейджей турниров/лиг */
.bb-nba { background: #1D428A; }
.bb-el  { background: #FF8000; }
.bb-vtb { background: #2D71E8; }
.bb-chm { background: #E5C453; }

/* Карточки «Топ лиги» */
.bb-lc-nba { background: #1D428A; }
/* Белый силуэт лого НБА (как в макете: opacity .13, без перекраски) */
.bb-lc-nba .sm-lc__wm { inset-inline-start: 120px; top: 8px; height: 210px; opacity: 0.13; }
/* Вырез игрока — по хендофф-сниппету top-ligi-basketball (карточка 420px):
   left 199 / top 8 / height 142 — низ вровень с нижним краем (8+142=150).
   Привязка ПРАВЫМ краем (зазор 199+264×142/179 → 11px): спека требует при
   другой ширине карточки держать фото у правой части. */
.bb-lc-nba .sm-lc__photo { inset-inline-end: 11px; top: 8px; height: 142px; width: auto; }
.bb-lc-euro { background: #E8730C; }
/* Вотермарка — НЕ весь wordmark: спека кладёт лого в окно 174×174, в которое
   при height 174 попадает ровно круглая эмблема-мяч (левый квадрат лого,
   диаметр = высоте). Без среза полупрозрачный wordmark растягивался на всю
   карточку и читался как «другое лого». clip-path режет по тем же 174px. */
.bb-lc-euro .sm-lc__wm { inset-inline-start: 118px; top: -12px; height: 174px; opacity: 0.12; clip-path: inset(0 calc(100% - 174px) 0 0); }
/* Вырез Евролиги (PNG без фона, 1080×720) — окно 290×193 с cover,
   left 134 / top 5 при карточке 420: низ и правый край уходят под обрез —
   в спеке «так задумано». Привязка правым краем (свес 134+290−420 = 4px). */
.bb-lc-euro .sm-lc__photo { inset-inline-end: -4px; top: 5px; width: 290px; height: 193px; }
/* Планшет: карточка уже 420px, фикс-окно 290px накрывало бы тексты —
   держим долю дизайна (290/420, свес 4/420), высота не меняется (карточка
   всегда 150px). */
@media (max-width: 1180px) {
  .bb-lc-euro .sm-lc__photo { width: 69.05%; inset-inline-end: -0.95%; }
}

/* Мобилка: фото-вырезы прячем. Карточка сужается с 420px до 240px, а подписи
   остаются прежнего кегля и занимают уже половину ширины — фигура, у которой на
   десктопе есть свои 79% справа, здесь садится прямо на текст. Общим
   ограничением ширины это не лечится: композиция у каждой карточки своя,
   ручная, и от него фигуры вписываются в рамку с полями. Чтобы вернуть вырезы
   на телефон, нужны либо более широкие карточки, либо своя геометрия на
   карточку из дизайна. */
@media (max-width: 600px) {
  .sm-lc__photo { display: none; }
  .bb-lc-euro .sm-lc__wm { inset-inline-start: 112px; height: 160px; }
}

/* ===== partials/22-ufc.css ===== */
/* --- UFC: витрина раздела (ufc-) --- */
/* Хаб /ufc: афиша ближайшего турнира → рельс следующих → рейтинги →
   прошедшие → Telegram. Карда и сайдбара здесь больше нет — они живут на
   странице турнира (23-ufc-stream.css); до редизайна хаб дублировал её
   целиком, и два экрана раздела отличались только шапкой.

   Каркас: lb-container + свой флекс-столбец. Плашки .ufc-tag, силуэт
   октагона .ufc-octagon и метки углов — общие со страницей турнира и лежат
   здесь: этот партиал собирается первым. */

.ufc-page {
  display: flex;
  flex-direction: column;
  gap: 26px;
  padding: 24px 0 12px;
}

/* Красная пульсирующая точка в UFC-бейджах крупнее базовой (6px против 5px) */
.ufc-dot { width: 6px; height: 6px; }

/* ===== Плашки-метки (общие с /ufc/{slug}) ===== */
.ufc-tag {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: rgba(12, 17, 11, 0.8);
  border: 1px solid var(--line-strong);
  color: var(--ink-soft);
  font-size: 10.5px;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  border-radius: var(--r-pill);
  padding: 6px 13px;
  flex: none;
}
.ufc-tag--green { background: var(--green); border-color: var(--green); color: var(--on-green); }
/* Номерные турниры — золотом: это главные шоу месяца, и в рельсе они должны
   отличаться от Fight Night до чтения подписи. */
.ufc-tag--gold { border-color: rgba(229, 196, 83, 0.5); color: #E5C453; }
.ufc-tag--blue { border-color: rgba(73, 178, 211, 0.5); color: #49B2D3; }
.ufc-tag--live { border-color: rgba(229, 57, 53, 0.45); color: var(--red-live-text); background: rgba(12, 17, 11, 0.6); }
.ufc-tag--done { border-color: rgba(139, 233, 106, 0.4); color: var(--green-soft); background: rgba(12, 17, 11, 0.6); }
.ufc-tag--sm { font-size: 9.5px; padding: 5px 10px; gap: 6px; }

/* Флаг страны — прямоугольник h24 с CDN, общий для хаба и страницы турнира.
   Эмодзи-флаги не годятся: на Windows они не рисуются вовсе. */
.ufc-flag { height: 12px; border-radius: 2px; display: block; flex: none; }
.ufc-flag--sm { height: 11px; }

/* Силуэт октагона — фон карточек без афиши. Турниры без артворка попадаются
   постоянно (апстрим добавляет его за неделю до даты), и без подложки такие
   карточки выглядели бы как не загрузившиеся. */
.ufc-octagon {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  pointer-events: none;
}
.ufc-octagon polygon { stroke: #2A331F; }

/* ===== Заголовок секции ===== */
.ufc-sec__head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 14px;
  min-height: 32px;
}
.ufc-sec__head h2 {
  font-family: var(--font-display);
  font-size: 19px;
  font-weight: 700;
  margin: 0;
  color: var(--ink-strong);
}
.ufc-sec__grow { flex: 1; }
.ufc-sec__note { font-size: 12px; font-weight: 600; color: var(--dim); }
/* Стрелки рельса — в самой шапке секции, а не поверх ленты: общий
   .lb-slider__arrow позиционируется absolute по краям слайдера и на узком
   экране ложится прямо на первый постер. Скролл ведёт тот же app.js
   (data-slide-l/r), отличается только посадка кнопки. */
.ufc-sec__nav {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: var(--panel);
  border: 1px solid var(--line-strong);
  color: var(--ink-soft);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
}
.ufc-sec__nav:hover { border-color: var(--hover-green-line); color: var(--green-pale); }
/* Кнопки листают ленту ФИЗИЧЕСКИ (app.js: data-slide-l — влево, -r — вправо),
   и шеврон смотрит туда же. Справа налево шапка отражается, и пара встала бы
   «› ‹» — шевронами внутрь. Левую кнопку уводим в конец строки, то есть на
   левый край: снова «‹ ›», каждая смотрит туда, куда листает. */
[dir="rtl"] .ufc-sec__nav[data-slide-l] { order: 1; }

/* ===== Афиша ближайшего турнира ===== */
.ufc-hero {
  position: relative;
  box-sizing: border-box;
  height: 380px;
  overflow: hidden;
  border-radius: var(--r-xl);
  border: 1px solid var(--line);
  background: var(--bg-header);
  display: block;
  color: var(--ink);
}
.ufc-hero:hover { color: var(--ink); }
.ufc-hero__art {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Афиши UFC кадрируются под бойцов в верхней трети — центр по высоте
     срезал бы им головы. */
  object-position: center 28%;
  display: block;
}
.ufc-hero__shade {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(10, 14, 8, 0.97) 12%, rgba(10, 14, 8, 0.6) 55%, rgba(10, 14, 8, 0.35));
}
.ufc-hero__inner {
  position: relative;
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: 0 30px 28px;
}
.ufc-hero__row { display: flex; align-items: flex-end; gap: 40px; }
.ufc-hero__main { display: flex; flex-direction: column; gap: 10px; flex: 1; min-width: 0; }
.ufc-hero__tags { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ufc-hero__title {
  font-family: var(--font-display);
  font-size: 40px;
  font-weight: 700;
  color: var(--ink-strong);
  line-height: 1.05;
}
.ufc-hero__meta {
  display: flex;
  align-items: center;
  gap: 11px;
  flex-wrap: wrap;
  font-size: 14px;
  font-weight: 600;
  color: var(--ink-soft);
}
.ufc-hero__meta i { color: var(--dim); font-style: normal; }
.ufc-hero__place { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 4px; }
.ufc-hero__venue { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; color: var(--muted); }
.ufc-hero__when { font-size: 13px; font-weight: 700; color: var(--green-soft); }
/* Время прелимов и карда — отдельные узлы внутри строки даты, разделитель
   рисует CSS. Здесь это по-прежнему одна строка «дата · прелимы 00:00 · кард
   03:00»; на телефоне обёртка .ufc-hero__parts превращается в две плашки под
   датой (макет «UFC моб», 1a), и разделитель там гасится. Отступы у точки —
   полями, а не пробелами в content: между узлами в разметке пробелов нет, и
   точка липла к предыдущему слову («3 октября· прелимы»). */
.ufc-hero__part::before { content: '·'; margin-inline: 0.45em; }
.ufc-hero__parts:empty { display: none; }
/* Вариант подписи кнопки с отсчётом — только для телефона, где плитки
   д/ч/м/с скрыты. */
.ufc-hero__cta-cd { display: none; }
.ufc-hero__aside { display: flex; flex-direction: column; gap: 12px; align-items: stretch; flex: none; }
.ufc-hero__cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  background: var(--green);
  color: var(--on-green);
  font-weight: 800;
  font-size: 16px;
  border-radius: var(--r-pill);
  padding: 17px 34px;
  box-shadow: 0 12px 32px rgba(88, 219, 36, 0.28);
}
.ufc-hero__cta:hover { background: var(--green-hover); color: var(--on-green); }

/* Раздел без единого турнира: апстрим молчит или между сезонами пусто.
   Пустой первый экран хуже честной заглушки. */
.ufc-hero--empty {
  height: auto;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 60px 24px;
  text-align: center;
  font-size: 14px;
  font-weight: 600;
  color: var(--ink-soft);
  background: radial-gradient(620px 360px at 50% 30%, rgba(88, 219, 36, 0.07), transparent 70%), #0D120C;
}

/* ===== Обратный отсчёт ячейками ===== */
/* Ячейки заполняет app.js по data-cd="d|h|m|s" внутри [data-countdown-ts].
   Однострочный режим того же таймера — на странице турнира. */
.ufc-cd { display: flex; gap: 8px; }
.ufc-cd__cell {
  width: 64px;
  background: rgba(12, 17, 11, 0.7);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-ctl);
  padding: 10px 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
}
.ufc-cd__num {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 700;
  color: var(--ink-strong);
  font-variant-numeric: tabular-nums;
}
.ufc-cd__lbl { font-size: 9.5px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }

/* ===== Рельс «Следующие турниры» ===== */
/* Стрелки и скролл — общий .lb-slider из 00-core.css (тот же механизм, что у
   топ-матчей на главной), поэтому здесь только сами постеры. */
.ufc-rail__strip { display: flex; gap: 16px; }
.ufc-poster {
  position: relative;
  flex: none;
  width: 273px;
  height: 250px;
  border-radius: var(--r-card);
  overflow: hidden;
  background: radial-gradient(240px 160px at 50% 32%, rgba(88, 219, 36, 0.08), transparent 70%), #0F1510;
  border: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  color: var(--ink);
}
.ufc-poster:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
.ufc-poster__art { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.ufc-poster__shade { position: absolute; inset: 0; background: linear-gradient(to top, rgba(10, 14, 8, 0.96) 20%, rgba(10, 14, 8, 0.1) 70%); }
.ufc-poster__tag { position: absolute; top: 12px; inset-inline-start: 12px; }
.ufc-poster .ufc-octagon { top: 44px; }
.ufc-poster__body { position: relative; display: flex; flex-direction: column; gap: 5px; padding: 14px; min-width: 0; }
.ufc-poster__title { font-family: var(--font-display); font-size: 14.5px; font-weight: 700; color: var(--ink-strong); }
.ufc-poster__sub { font-size: 11.5px; font-weight: 600; color: var(--muted); }
.ufc-poster__when { font-size: 12px; font-weight: 700; color: var(--green-soft); font-variant-numeric: tabular-nums; }

/* ===== Рейтинги ===== */
/* Сегмент «Мужчины / Женщины» и вкладки дивизионов — общий механизм табов
   (data-tabs/data-panel в app.js): сервер рендерит все панели сразу, клиент
   только переключает. Так рейтинги не требуют ни одного запроса. */
.ufc-seg {
  display: inline-flex;
  background: var(--bg);
  border: 1px solid var(--line-strong);
  border-radius: 10px;
  padding: 3px;
  gap: 2px;
  flex: none;
}
.ufc-seg button {
  border-radius: 8px;
  padding: 6px 16px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--ink-soft);
}
.ufc-seg button:hover { color: var(--green-pale); }
.ufc-seg button.is-active { background: var(--green); color: var(--on-green); font-weight: 800; }
.ufc-seg button.is-active:hover { color: var(--on-green); }

/* Вкладки дивизионов — подчёркиванием, а не пилюлями: их до девяти в ряд,
   и пилюли в две строки съедали бы экран до карточки чемпиона. */
.ufc-divs {
  display: flex;
  flex-wrap: wrap;
  gap: 26px;
  margin-bottom: 18px;
  border-bottom: 1px solid var(--line);
}
.ufc-divs button {
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  padding: 2px 0 10px;
  font-size: 13px;
  font-weight: 600;
  color: var(--muted);
}
.ufc-divs button:hover { color: var(--green-pale); }
.ufc-divs button.is-active { border-bottom-color: var(--green); color: var(--ink-strong); font-weight: 800; }

.ufc-ranks__grid { display: grid; grid-template-columns: 300px 1fr; gap: 16px; align-items: stretch; }

/* Карточка чемпиона. Липкая: список топ-15 в развёрнутом виде вдвое выше
   карточки, и без sticky чемпион уезжал бы из поля зрения. */
.ufc-champ {
  position: sticky;
  top: 16px;
  align-self: start;
  overflow: hidden;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: 22px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
}
.ufc-champ__glow {
  position: absolute;
  left: 50%;
  top: -90px;
  transform: translateX(-50%);
  width: 340px;
  height: 260px;
  background: radial-gradient(closest-side, rgba(88, 219, 36, 0.22), transparent 70%);
  pointer-events: none;
}
.ufc-champ__kicker {
  position: relative;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--dim);
  margin-bottom: 16px;
}
.ufc-champ__ava {
  position: relative;
  width: 132px;
  height: 132px;
  border-radius: 50%;
  border: 2px solid rgba(139, 233, 106, 0.4);
  background: #141B12;
  object-fit: cover;
  /* Портреты рейтинга (listing-*.png) — поясные, лицо в верхней трети. */
  object-position: center 12%;
  box-shadow: 0 16px 40px rgba(0, 0, 0, 0.45);
}
.ufc-champ__body { position: relative; width: 100%; display: flex; flex-direction: column; align-items: center; min-width: 0; }
.ufc-champ__name { font-size: 17px; font-weight: 800; color: var(--ink-strong); margin-top: 14px; }
.ufc-champ__chips { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; width: 100%; margin-top: 20px; }
.ufc-champ__chip {
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.07);
  border-radius: var(--r-ctl);
  padding: 9px 6px;
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}
.ufc-champ__chip b { font-size: 14px; font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.ufc-champ__chip span { font-size: 9.5px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--dim); }
/* Вакантный титул: медальона нет, но дивизион из рейтингов не выбрасываем —
   список претендентов у него живой. В макете этого состояния нет: у всех
   дивизионов снапшота есть чемпион, а у P4P титул вакантным не бывает вовсе.
   Выводит только сервер (_ufc_rank_group.html), когда champion пришёл null. */
.ufc-champ--vacant .ufc-champ__name { color: var(--muted); font-weight: 700; }

.ufc-rank {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: 6px 0 10px;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
}
.ufc-rank__head,
.ufc-rank__row { display: grid; grid-template-columns: 26px 44px minmax(0, 1fr) auto; gap: 12px; align-items: center; }
.ufc-rank__head {
  padding: 8px 20px 6px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--dim);
}
.ufc-rank__row { padding: 8px 20px; border-top: 1px solid rgba(255, 255, 255, 0.05); }
.ufc-rank__num { font-family: var(--font-display); font-size: 11.5px; font-weight: 700; color: var(--green); }
.ufc-rank__ava {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: #1A2118;
  border: 1px solid var(--line-strong);
  object-fit: cover;
  object-position: top center;
}
/* Силуэт вместо фото бойца — один на раздел (_ufc_ava.html): медальоны
   рейтингов, карда, пары над статистикой и очных встреч. Размер, круг и фон
   даёт класс самого медальона, здесь только силуэт по центру: пустой кружок
   читался бы как незагрузившаяся картинка. Рамку приглушаем там, где она
   нейтральная; цветные рамки сторон в паре статистики объявлены в
   23-ufc-stream.css позже и остаются. */
.ufc-ava-none { display: flex; align-items: center; justify-content: center; border-color: rgba(255, 255, 255, 0.07); }
.ufc-ava-none svg { width: 45%; height: 45%; fill: #2E3826; }
.ufc-rank__name { font-size: 13.5px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ufc-rank__delta { font-size: 11px; font-weight: 800; color: var(--dim); font-variant-numeric: tabular-nums; }
.ufc-rank__delta.is-up { color: var(--green-soft); }
.ufc-rank__delta.is-down { color: var(--red-live-text); }

/* Разворот «Весь топ-15 / Свернуть» — общий data-collapsible из app.js:
   строки сверх первой пятёрки лежат в разметке и открываются классом. */
.ufc-rank__row--extra { display: none; }
.ufc-rank.is-open .ufc-rank__row--extra { display: grid; }
.ufc-rank__more {
  margin: 8px 20px 4px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 10px;
  padding: 10px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--green-pale);
}
.ufc-rank__more:hover { border-color: var(--hover-green-line); background: rgba(139, 233, 106, 0.07); }

/* ===== Прошедшие турниры ===== */
.ufc-past__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.ufc-past {
  display: flex;
  gap: 14px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: 14px;
  color: var(--ink);
}
.ufc-past:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
.ufc-past__media {
  position: relative;
  width: 96px;
  height: 64px;
  border-radius: 10px;
  overflow: hidden;
  background: radial-gradient(120px 70px at 50% 40%, rgba(88, 219, 36, 0.08), transparent 70%), #0F1510;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
/* Прошедшие приглушены: рядом с афишей ближайшего турнира они не должны
   спорить за внимание. */
.ufc-past__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; filter: saturate(0.75); }
.ufc-past__media .ufc-octagon { position: static; transform: none; }
.ufc-past__body { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ufc-past__title { font-family: var(--font-display); font-size: 13.5px; font-weight: 700; color: var(--ink-strong); }
.ufc-past__sub { font-size: 11.5px; font-weight: 600; color: var(--muted); }
.ufc-past__res { font-size: 11.5px; font-weight: 700; color: var(--green-soft); }

/* ===== Telegram в строку ===== */
/* Общий .home-cta (10-home.css) со сменой раскладки на горизонтальную:
   в сайдбаре страницы турнира он остаётся вертикальным. */
.ufc-tg { display: flex; align-items: center; gap: 20px; border-radius: var(--r-lg); padding: 20px 24px; }
.ufc-tg__text { display: flex; flex-direction: column; gap: 5px; flex: 1; min-width: 0; }
.ufc-tg .home-cta__text { margin-top: 0; }
.ufc-tg .home-cta__btn { margin-top: 0; flex: none; font-weight: 800; padding: 12px 26px; }

/* ============================================================
   Адаптив (зеркалим брейкпоинты проекта: 1180 / 940 / 600)
   ============================================================ */

@media (max-width: 940px) {
  .ufc-ranks__grid { grid-template-columns: 1fr; }
  /* Липкость на планшете вредна: карточка чемпиона встаёт над списком и,
     прилипнув, закрывала бы первые строки топа. */
  .ufc-champ { position: static; }
  .ufc-past__grid { grid-template-columns: 1fr 1fr; }
  .ufc-hero { height: 340px; }
  .ufc-hero__title { font-size: 30px; }
  .ufc-hero__row { flex-direction: column; align-items: stretch; gap: 18px; }
  .ufc-hero__aside { align-items: flex-start; }
}

@media (max-width: 600px) {
  /* ============================================================
     Телефон — по передаче «UFC моб», экран 1a.
     Афиша: арт сверху, текст под ним, время частей карда плашками, отсчёт
     внутри кнопки. Рейтинги: чемпион строкой, дивизионы скроллом.
     ============================================================ */
  .ufc-page { gap: 28px; padding: 14px 0 24px; }

  /* --- Афиша ближайшего турнира --- */
  /* Высоту задаёт содержимое, иначе длинная пара имён не влезает. */
  .ufc-hero { height: auto; border-radius: 18px; }
  .ufc-hero__art { object-position: center 25%; }
  .ufc-hero__shade { background: linear-gradient(to top, rgba(10, 14, 8, 0.97) 30%, rgba(10, 14, 8, 0.35)); }
  .ufc-hero__inner { padding: 132px 16px 16px; }
  /* Бейдж состояния уезжает в угол арта, название серии убираем совсем: два
     тега в ряд на 358px отжимают заголовок на третью строку, а серия и так
     написана в подшапке страницы турнира. */
  .ufc-hero__tags { position: absolute; top: 12px; inset-inline-start: 12px; }
  .ufc-hero__tags .ufc-tag { font-size: 9.5px; padding: 5px 11px; }
  .ufc-hero__series { display: none; }
  .ufc-hero__row { gap: 14px; }
  .ufc-hero__main { gap: 6px; }
  .ufc-hero__title { font-size: 22px; }
  .ufc-hero__meta { font-size: 12px; gap: 5px; }
  /* Роль и регламент главного боя: «Главный бой» повторяет бейдж афиши, а
     регламент на витрине второстепенен — остаётся «вес · сиды». */
  .ufc-hero__role,
  .ufc-hero__rounds { display: none; }

  /* Строка «дата · арена», под ней плашки таймингов. Обёртка даты
     разворачивается (display: contents), чтобы дата встала в один ряд с
     ареной, а плашки ушли на свою строку целиком (flex-basis: 100%). */
  .ufc-hero__place { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 8px 6px; margin-top: 0; }
  .ufc-hero__when { display: contents; }
  .ufc-hero__date { order: 1; font-size: 12px; font-weight: 600; color: var(--muted); }
  .ufc-hero__venue { order: 2; font-size: 12px; color: var(--muted); gap: 6px; }
  .ufc-hero__venue::before { content: '·'; }
  /* Флаг на телефоне лишний: город назван в той же строке словами. */
  .ufc-hero__venue .ufc-flag { display: none; }
  .ufc-hero__parts { order: 3; flex: 0 0 100%; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 2px; }
  .ufc-hero__part {
    display: flex;
    flex-direction: column-reverse;
    align-items: center;
    gap: 2px;
    background: rgba(12, 17, 11, 0.75);
    border: 1px solid var(--line-strong);
    border-radius: var(--r-ctl);
    padding: 9px 6px;
  }
  .ufc-hero__part::before { content: none; }
  .ufc-hero__part b { font-size: 14px; font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
  .ufc-hero__part-l { font-size: 9px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
  /* Основной кард выделен: именно его ждут, прелимы — контекст. */
  .ufc-hero__part--accent { background: rgba(88, 219, 36, 0.1); border-color: rgba(139, 233, 106, 0.35); }
  .ufc-hero__part--accent b { color: var(--green-soft); }

  .ufc-hero__aside { align-items: stretch; }
  /* Плитки «дней / часов / минут / секунд» уступили место таймингам карда —
     сам отсчёт переехал в подпись кнопки. */
  .ufc-cd { display: none; }
  .ufc-hero__cta { font-size: 13.5px; padding: 13px 20px; }
  .ufc-hero__cta-full { display: none; }
  .ufc-hero__cta-cd { display: inline; }

  /* --- Рельс следующих турниров --- */
  .ufc-sec__head { margin-bottom: 10px; }
  .ufc-sec__head h2 { font-size: 16px; }
  .ufc-sec__note { font-size: 11px; }
  /* Стрелки убираем: рельс листают пальцем, а две кнопки съедают строку
     заголовка. */
  .ufc-sec__nav { display: none; }
  .ufc-rail__strip { gap: 10px; }
  .ufc-poster { width: 200px; height: 150px; }
  .ufc-poster .ufc-octagon { top: 22px; }
  .ufc-poster__body { padding: 11px 12px; gap: 3px; }
  .ufc-poster__title { font-size: 12px; }
  /* Подзаголовок постера прячем: в 200px он не читается, а дата с временем
     важнее арены. */
  .ufc-poster__sub { display: none; }
  .ufc-poster__when { font-size: 10.5px; }

  /* --- Рейтинги --- */
  /* Подпись «8 дивизионов и P4P · обновлено…» на телефоне убираем: рядом с
     сегментом пола она отжимает заголовок в четыре строки. */
  .ufc-ranks .ufc-sec__note { display: none; }
  .ufc-seg button { padding: 5px 13px; font-size: 12px; }
  /* Полоса прокручивается по горизонтали, и по вертикали её прокручивать
     нельзя — иначе на телефоне она «гуляет» вверх-вниз при каждом свайпе.
     Само по себе `overflow-x: auto` этого не даёт: браузер поднимает вторую
     ось с visible до auto, а кнопка с `margin-bottom: -1px` (её подчёркивание
     ложится поверх линии полосы) торчит на этот самый 1px за низ контейнера —
     ровно на пиксель вертикального скролла. Гасим обе половины причины:
     padding-bottom забирает выступ внутрь, overflow-y — страховка на случай,
     если что-то вылезет снова. Порядок важен: без padding клип срезал бы
     половину зелёного подчёркивания активной вкладки. */
  .ufc-divs { gap: 18px; flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; padding-bottom: 1px; scrollbar-width: none; margin-bottom: 10px; }
  .ufc-divs::-webkit-scrollbar { display: none; }
  .ufc-divs button { flex: none; font-size: 12.5px; padding-bottom: 9px; }
  .ufc-divs button.is-active { font-weight: 800; }

  /* Карточка чемпиона на телефоне — строкой: медальон слева, подписи справа.
     Гридом, а не флексом: подпись лежит НЕ внутри .ufc-champ__body, а рядом с
     ним, и в строку они встали бы соседями, а не друг под другом. */
  .ufc-champ {
    display: grid;
    grid-template-columns: 76px minmax(0, 1fr);
    grid-template-areas: 'ava kicker' 'ava body';
    align-content: center;
    column-gap: 14px;
    row-gap: 4px;
    text-align: start;
    padding: 18px;
  }
  .ufc-champ__glow { inset-inline-start: -40px; top: -70px; transform: none; width: 220px; height: 200px; }
  .ufc-champ__ava { grid-area: ava; align-self: center; width: 76px; height: 76px; }
  /* Подпись становится зелёным бейджем, дивизион из неё уходит: его называет
     активная вкладка прямо над карточкой. */
  .ufc-champ__kicker {
    grid-area: kicker;
    align-self: end;
    justify-self: start;
    margin-bottom: 0;
    background: var(--green);
    color: var(--on-green);
    font-size: 9px;
    letter-spacing: 0.09em;
    border-radius: var(--r-pill);
    padding: 2.5px 8px;
  }
  .ufc-champ__kicker-d { display: none; }
  .ufc-champ__body { grid-area: body; align-self: start; align-items: flex-start; gap: 4px; }
  .ufc-champ__name { margin-top: 0; font-family: var(--font-display); font-size: 15px; font-weight: 700; }
  /* Рекорд и лимит веса — одной строкой через « · », как в передаче. */
  .ufc-champ__chips { display: flex; flex-wrap: wrap; gap: 0 5px; margin-top: 0; }
  .ufc-champ__chip { background: none; border: none; padding: 0; flex-direction: row; align-items: baseline; gap: 5px; }
  .ufc-champ__chip b { font-size: 11px; font-weight: 600; color: var(--muted); }
  .ufc-champ__chip + .ufc-champ__chip::before { content: '·'; font-size: 11px; font-weight: 600; color: var(--muted); }
  /* Подписи плиток на телефоне лишние: «15–3–0» и «до 120 кг» говорят сами за
     себя. Исключение — P4P: «Все» без «категорий» не читается, поэтому там
     подпись остаётся и встаёт в строку со значением. */
  .ufc-champ__chip span { display: none; }
  .ufc-champ__chip--phrase span {
    display: inline;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0;
    text-transform: none;
    color: var(--muted);
  }

  .ufc-rank__head { display: none; }
  .ufc-rank__row { grid-template-columns: 24px 38px minmax(0, 1fr) auto; gap: 10px; padding: 8px 14px; }
  .ufc-rank__ava { width: 38px; height: 38px; }
  .ufc-rank__more { margin: 8px 14px 6px; font-size: 12.5px; }

  .ufc-past__grid { grid-template-columns: 1fr; }

  /* Telegram строкой: подпись слева, пилюля справа — описание на телефоне
     уступает место самой кнопке. */
  .ufc-tg { gap: 12px; padding: 16px; }
  .ufc-tg .home-cta__title { font-size: 12.5px; }
  .ufc-tg .home-cta__text { display: none; }
  .ufc-tg .home-cta__btn { padding: 9px 16px; font-size: 12px; }
}

/* ===== partials/23-ufc-stream.css ===== */
/* --- UFC: страница турнира (ufcs-) --- */
/* /ufc/{slug} в трёх состояниях — анонс, эфир, завершён. Разметка одна,
   различия задаёт сервер по статусу турнира: меняются центр хиро-дуэли,
   содержимое левой колонки (заглушка → плеер → результаты) и набор карточек
   сайдбара.

   Каркас «контент + сайдбар» — общий sm-mgrid/sm-mcol (19-sports.css),
   карточки сайдбара — sm-card, зеркальные полосы статистики — sm-stat,
   плашки и силуэт октагона — .ufc-tag/.ufc-octagon из 22-ufc.css. Здесь
   только то, чего в общем словаре нет: дуэль, строки карда и разбор боя. */

.ufcs-page { display: flex; flex-direction: column; gap: 20px; padding: 24px 0 12px; }
/* Крошки «← Все турниры UFC» над дуэлью и её мобильной стрелки в полосе с
   23.09.2026 нет (убраны по всему сайту): в раздел ведёт пилюля в шапке. */
/* Кнопка раскрытия карда и голая стрелка вместо «Смотреть →» в афише
   следующего турнира — узлы мобильной раскладки: на десктопе кард открыт
   целиком, а у кнопки афиши есть подпись. */
.ufcs-card__more,
.ufcs-next__cta-a { display: none; }
/* Обёртки центра дуэли на десктопе прозрачны: дети остаются прямыми
   флекс-элементами столбца, и колонка выглядит ровно как до них. Разворачивает
   обёртки мобильная раскладка (см. блок 600px). */
.ufcs-center__label,
.ufcs-center__foot { display: contents; }
/* Своя сетка «контент + сайдбар», а не общий .sm-mgrid: тот сам держит
   ширину 1140 и центрируется, а здесь он лежал бы внутри .lb-container и
   спорил бы с ним за отступы. Колонки — общие .sm-mcol. */
.ufcs-grid { display: grid; grid-template-columns: minmax(0, 1fr) 348px; gap: 20px; align-items: start; }

/* ===== Хиро-дуэль ===== */
.ufcs-duel {
  position: relative;
  overflow: hidden;
  background: radial-gradient(700px 380px at 50% 115%, rgba(88, 219, 36, 0.14), transparent 72%), #0E140C;
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
}
/* Свечения углов: красный слева, синий справа — те же цвета, что у подписей
   «красный / синий угол», чтобы стороны читались до чтения текста. */
.ufcs-duel__glow { position: absolute; top: -160px; width: 520px; height: 420px; pointer-events: none; }
.ufcs-duel__glow--l { inset-inline-start: -100px; background: radial-gradient(closest-side, rgba(255, 69, 69, 0.16), transparent 72%); }
.ufcs-duel__glow--r { inset-inline-end: -100px; background: radial-gradient(closest-side, rgba(73, 178, 211, 0.14), transparent 72%); }

.ufcs-duel__top {
  position: relative;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--line-soft);
}
.ufcs-duel__name { font-family: var(--font-display); font-size: 13px; font-weight: 700; color: var(--ink-strong); }
.ufcs-duel__venue { font-size: 13px; font-weight: 600; color: var(--muted); }
.ufcs-duel__date { margin-inline-start: auto; font-size: 13px; font-weight: 700; color: var(--ink); }

.ufcs-duel__grid {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px minmax(0, 1fr);
  gap: 20px;
  align-items: end;
  padding: 26px 32px 0;
}
.ufcs-side { display: flex; align-items: stretch; gap: 18px; min-width: 0; }
.ufcs-side--red { justify-content: flex-end; }
.ufcs-side--blue { justify-content: flex-start; }
/* Проигравший приглушён целиком — вместе с фото: в завершённом турнире
   победитель должен читаться с первого взгляда. */
.ufcs-side.is-loser { opacity: 0.6; }
.ufcs-side.is-loser .ufcs-photo { filter: saturate(0.6); }

.ufcs-who { display: flex; flex-direction: column; justify-content: center; gap: 7px; min-width: 0; }
.ufcs-side--red .ufcs-who { align-items: flex-end; text-align: end; }
.ufcs-side--blue .ufcs-who { align-items: flex-start; }
.ufcs-corner { font-size: 10px; font-weight: 800; letter-spacing: 0.14em; text-transform: uppercase; }
.ufcs-corner--red { color: var(--red-live-text); }
.ufcs-corner--blue { color: #49B2D3; }
/* Имя в две строки: у полного имени в одну строку колонка расходится шире
   центральной, и дуэль перестаёт быть симметричной. */
.ufcs-name { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--ink-strong); line-height: 1.25; }
/* Подпись угла: флаг · страна · рекорд.
   Переносится по элементам, а не внутри них: «Соединенные Штаты» и «20–6–0»
   в колонке ~190px иначе оба сжимаются и рвутся посреди слова и посреди
   рекорда («20–6– / 0»). С nowrap на частях получается максимум две ровные
   строки: страна и под ней рекорд. */
.ufcs-meta { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 2px 7px; font-size: 12.5px; font-weight: 600; color: var(--muted); }
.ufcs-meta__country,
.ufcs-meta__rec { white-space: nowrap; }
.ufcs-side--red .ufcs-meta { justify-content: flex-end; }
.ufcs-photo {
  width: 150px;
  height: 230px;
  object-fit: contain;
  object-position: bottom;
  flex: none;
  display: block;
  align-self: flex-end;
}
/* Силуэт на месте ростового фото, когда портрета нет (_ufc_ava.html). Коробку
   даёт тот же .ufcs-photo, силуэт стоит у нижнего края — там, где стоял бы
   боец. Поллинг переключает его парой с <img> (ufc-live.js). */
.ufcs-photo--none { display: flex; align-items: flex-end; justify-content: center; }
.ufcs-photo--none svg { width: 100%; height: auto; fill: #232C1F; }

/* Форма «последние 5»: квадраты вместо букв В/Н/П — подписи углов и так
   плотные, а полоска читается как график. */
.ufcs-form { display: inline-flex; align-items: center; gap: 8px; }
.ufcs-form__lbl { font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
.ufcs-form__row { display: inline-flex; gap: 4px; }
.ufcs-form__i { width: 9px; height: 9px; border-radius: 2.5px; display: inline-block; background: var(--dim); }
.ufcs-form__i.is-w { background: var(--green); }
.ufcs-form__i.is-l { background: var(--red-live); }

.ufcs-center {
  align-self: stretch;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding-bottom: 14px;
  text-align: center;
}
/* «Главный бой» — подпись над регламентом: шапка дуэли следует за октагоном,
   и подпись говорит, кого именно показывают. Типографика — как у «Сейчас в
   октагоне» (__live) и «Победитель» (__win), цвет — акцентный зелёный.

   Правило какое-то время жило ТОЛЬКО в собранном public/css/v2/style.css
   (грабли №1), поэтому его переписали здесь заново — и параллельно перенесли
   в партиал ту, артефактную, версию с серым --muted. При слиянии осталась
   эта: зелёный — осознанное решение, под него же правился макет
   (ufc-stream-soon.html). Второго определения .ufcs-center__main быть не
   должно — оно молча перебивало бы цвет по каскаду. */
.ufcs-center__main { font-size: 10px; font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; color: var(--green-soft); }
.ufcs-center__wc { font-size: 10px; font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; color: var(--dim); white-space: nowrap; }
.ufcs-center__cd {
  font-family: var(--font-display);
  font-weight: 700;
  color: var(--ink-strong);
  font-size: 32px;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.ufcs-center__live { font-size: 10px; font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; color: var(--red-live-text); }
/* Имена пары посреди центра остались только в макете: на сайте шапка следует за
   октагоном, и они написаны крупно по бокам (см. _ufc_duel.html). */
.ufcs-center__bout { font-size: 22px; font-weight: 800; color: var(--ink-strong); line-height: 1.1; }
.ufcs-center__clock { font-size: 12.5px; font-weight: 600; color: var(--muted); font-variant-numeric: tabular-nums; }
.ufcs-center__hint { font-size: 11.5px; font-weight: 600; color: var(--dim); }
.ufcs-center__win { font-size: 10px; font-weight: 800; letter-spacing: 0.16em; text-transform: uppercase; color: var(--green-soft); }
.ufcs-center__method { font-family: var(--font-display); font-size: 34px; font-weight: 700; color: var(--ink-strong); line-height: 1; }
.ufcs-center__detail { font-size: 12px; font-weight: 600; color: var(--muted); }
.ufcs-center__ref { font-size: 11px; font-weight: 600; color: var(--dim); }
.ufcs-center__res { display: flex; flex-direction: column; align-items: center; gap: 6px; }

/* Ячейки под центром: время частей карда у анонса, раунд и время финиша у
   завершённого. */
.ufcs-cells { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; width: 262px; }
.ufcs-cell {
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--line);
  border-radius: var(--r-ctl);
  padding: 9px 6px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
}
.ufcs-cell b { font-size: 14px; font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.ufcs-cell span { font-size: 9px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
/* Основной кард выделен: именно его ждут, прелимы — контекст. */
.ufcs-cell--accent { background: rgba(88, 219, 36, 0.08); border-color: rgba(139, 233, 106, 0.3); }
.ufcs-cell--accent b { color: var(--green-soft); }

.ufcs-win {
  background: var(--green);
  color: var(--on-green);
  font-size: 9.5px;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  border-radius: var(--r-pill);
  padding: 3px 9px;
}

/* ===== Плеер и заглушки ===== */
/* Эфиров API не отдаёт, поэтому «плеер» — это сцена с октагоном (общий
   .sm-player__stage из 19-sports.css) или текстовая заглушка до начала. */
.ufcs-stage {
  position: relative;
  aspect-ratio: 16 / 9;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 14px;
  background: radial-gradient(560px 320px at 50% 30%, rgba(255, 69, 69, 0.09), transparent 70%), var(--bg-header);
}
.ufcs-stage__octagon { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); opacity: 0.06; pointer-events: none; }
.ufcs-stage__octagon polygon { stroke: #FFFFFF; }
.ufcs-stage > *:not(.ufcs-stage__octagon) { position: relative; }
.ufcs-stage__tag { position: absolute; top: 14px; inset-inline-end: 14px; }
.ufcs-wait {
  position: relative;
  min-height: 340px;
  overflow: hidden;
  background: radial-gradient(620px 360px at 50% 30%, rgba(88, 219, 36, 0.07), transparent 70%), #0D120C;
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 0 24px;
  font-size: 14px;
  font-weight: 600;
  color: var(--ink);
}

/* ===== Кард турнира ===== */
.ufcs-card__head { display: flex; align-items: baseline; gap: 10px; padding: 18px 20px 12px; }
.ufcs-card__head h2 { font-family: var(--font-display); font-size: 16px; font-weight: 700; margin: 0; flex: 1; }
.ufcs-card__note { font-size: 11.5px; font-weight: 600; color: var(--dim); }
.ufcs-card__foot {
  padding: 10px 20px 14px;
  border-top: 1px solid var(--line-soft);
  font-size: 10.5px;
  color: var(--dim);
  line-height: 1.5;
}

.ufcs-group {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 20px;
  border-top: 1px solid var(--line-soft);
  background: rgba(255, 255, 255, 0.02);
}
.ufcs-group__name { font-size: 11px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
.ufcs-group__meta { margin-inline-start: auto; font-size: 11.5px; font-weight: 600; color: var(--dim); font-variant-numeric: tabular-nums; }

.ufcs-bout {
  position: relative;
  display: grid;
  grid-template-columns: 150px minmax(0, 1fr) 100px minmax(0, 1fr);
  align-items: center;
  gap: 8px;
  padding: 13px 20px;
  border-top: 1px solid rgba(255, 255, 255, 0.05);
  color: var(--ink);
}
.ufcs-bout:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
/* Идущий бой подсвечен фоном, а не рамкой: рамка внутри списка ломала бы
   сетку строк. */
.ufcs-bout.is-live { background: rgba(229, 57, 53, 0.05); }
.ufcs-bout.is-live:hover { background: rgba(229, 57, 53, 0.09); }

.ufcs-bout__meta { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.ufcs-bout__wc { font-size: 10.5px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); }
.ufcs-bout__role { font-size: 10.5px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--green); }

.ufcs-bout__side { display: flex; align-items: center; gap: 10px; min-width: 0; }
.ufcs-bout__side--red { justify-content: flex-end; }
.ufcs-bout__side--blue { justify-content: flex-start; }
.ufcs-bout__side.is-loser { opacity: 0.55; }
.ufcs-bout__who { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ufcs-bout__side--red .ufcs-bout__who { align-items: flex-end; text-align: end; }
.ufcs-bout__name {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 14px;
  font-weight: 700;
  color: var(--ink-strong);
  min-width: 0;
}
.ufcs-bout__name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ufcs-bout__rec { font-size: 11px; font-weight: 600; color: var(--muted); }
.ufcs-bout__flag { width: 21px; height: 14px; border-radius: 2px; flex: none; object-fit: cover; background: #1A2118; }
.ufcs-bout__ava {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: #1A2118;
  object-fit: cover;
  /* headshot у апстрима — голова с плечами: кадрируем по верху, иначе в
     круг попадает грудь, а не лицо. */
  object-position: top center;
  flex: none;
}
.ufcs-bout__w {
  background: var(--green);
  color: var(--on-green);
  font-size: 9px;
  font-weight: 800;
  border-radius: 4px;
  padding: 1.5px 5px;
  flex: none;
}

.ufcs-bout__mid { display: flex; flex-direction: column; align-items: center; gap: 3px; text-align: center; min-width: 0; }
.ufcs-bout__rounds { font-size: 12px; font-weight: 600; color: var(--muted); }
/* Способ победы цветом — единый код на кард, результаты и легенду разбора:
   нокаут красный, сабмишен синий, решение нейтральное. */
.ufcs-bout__method { font-size: 11px; font-weight: 800; letter-spacing: 0.04em; line-height: 1.3; }
.ufcs-bout__method--ko { color: var(--red-live-text); }
.ufcs-bout__method--sub { color: #49B2D3; }
.ufcs-bout__method--dec { color: var(--ink-soft); }
.ufcs-bout__sub { font-size: 10.5px; font-weight: 600; color: var(--dim); line-height: 1.3; }
.ufcs-bout__live { display: inline-flex; align-items: center; gap: 6px; border: 1px solid rgba(229, 57, 53, 0.45); color: var(--red-live-text); font-size: 10px; font-weight: 800; letter-spacing: 0.08em; border-radius: var(--r-pill); padding: 2.5px 9px; white-space: nowrap; }
/* Часы идущего раунда: бледнее LIVE-чипа над ними — это уточнение, а не
   статус. Тикает app.js от момента конца раунда (data-countdown-fmt="mmss"). */
.ufcs-bout__clock { font-size: 10.5px; font-weight: 700; color: var(--red-soft); font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Раскрытие строки в статистику боя: <details> + <summary>, без своего JS.
   Шеврон лежит ПОВЕРХ строки, а не отдельной колонкой грида: колонка сдвигала
   бы имена только у раскрываемых строк, и кард переставал бы читаться единым
   списком. Место справа есть — синий угол прижат к началу своей колонки. */
.ufcs-bout-item { border-top: 1px solid rgba(255, 255, 255, 0.05); }
.ufcs-bout-item .ufcs-bout { border-top: 0; }
.ufcs-bout--exp { cursor: pointer; list-style: none; padding-inline-end: 30px; }
.ufcs-bout--exp::-webkit-details-marker { display: none; }
.ufcs-bout__chev {
  position: absolute;
  inset-inline-end: 12px;
  top: 50%;
  width: 8px;
  height: 8px;
  margin-top: -6px;
  /* Уголок из правой и нижней рамок, повёрнутый на 45°, — стрелка ВНИЗ. Рамки
     физические намеренно: логическая (border-inline-end) справа налево стала
     бы левой, и тот же поворот дал бы стрелку влево. */
  border-right: 1.6px solid var(--dim);
  border-bottom: 1.6px solid var(--dim);
  transform: rotate(45deg);
  transition: transform 0.15s ease;
}
.ufcs-bout-item[open] .ufcs-bout__chev { transform: rotate(-135deg); margin-top: -2px; }
.ufcs-bout-item[open] .ufcs-bout--exp { background: rgba(255, 255, 255, 0.02); }
/* Бой без цифр — is-empty ставит шаблон (ufc_bout_row), снимает поллинг
   ufc-live.js вместе с первой статистикой. Шаблон обещает «нет шеврона, не
   раскрывается», но правил под это не было: строка открывалась в пустую
   панель. pointer-events безопасен — внутри summary нет ссылок; открытие с
   клавиатуры гасят спрятанная панель и снятый фон [open]. */
.ufcs-bout-item.is-empty .ufcs-bout__chev { display: none; }
.ufcs-bout-item.is-empty .ufcs-bout--exp { cursor: default; pointer-events: none; }
.ufcs-bout-item.is-empty .ufcs-bout__panel { display: none; }
.ufcs-bout-item.is-empty[open] .ufcs-bout--exp { background: none; }
/* Второй набор тех же правил (через `> summary`) писался параллельно под
   поллинг и при слиянии удалён: summary И ЕСТЬ .ufcs-bout--exp, а
   ::-webkit-details-marker уже погашен выше вместе с list-style. */
/* Панель статистики: приглушённый фон, чтобы раскрытый бой читался как
   вложенный блок, а не как ещё одна строка карда. */
.ufcs-bout__panel { background: rgba(0, 0, 0, 0.18); padding: 4px 6px 14px; }
.ufcs-bout__panel .ufcs-stats__tabs { padding: 12px 14px 4px; }
.ufcs-bout__panel .ufcs-stats__pair { padding: 10px 14px 4px; }
.ufcs-bout__panel .ufcs-stats__rows { padding: 6px 14px; }
.ufcs-bout__panel .ufcs-body { padding: 14px 14px 6px; }

/* Результаты завершённого турнира: колонки веса нет (она уехала в подпись
   метода), зато под именем встаёт рекорд — на прошедшем турнире важнее, с
   чем боец подошёл к бою. */
.ufcs-bout--res { grid-template-columns: minmax(0, 1fr) 176px minmax(0, 1fr); gap: 6px; padding: 11px 20px; }
/* Метка способа не переносится (пилюля в две строки выглядит сломанной), а
   колонка под ней фиксированные 176px. Приём в метку поэтому не кладём (см.
   ufc.BadgeText), а на случай незнакомо длинного способа стоит страховка:
   лучше срезать хвост многоточием, чем наехать на фото бойцов. */
.ufcs-bout__badge {
  max-width: 100%;
  border: 1px solid var(--line-strong);
  color: var(--ink-soft);
  font-size: 10px;
  font-weight: 800;
  letter-spacing: 0.06em;
  border-radius: var(--r-pill);
  padding: 2.5px 9px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ufcs-bout__badge--ko { border-color: rgba(229, 57, 53, 0.45); color: var(--red-live-text); }
.ufcs-bout__badge--sub { border-color: rgba(73, 178, 211, 0.45); color: #49B2D3; }

/* «Отображать счёт: Выкл» — прячем исходы и не приглушаем проигравших
   (в пару к ядру: тот же тумблер гасит счёт в лентах матчей). */
body.hide-scores .ufcs-bout__w,
body.hide-scores .ufcs-bout__method,
body.hide-scores .ufcs-bout__badge,
body.hide-scores .ufcs-bout__sub,
body.hide-scores .ufcs-form,
body.hide-scores .ufcs-win,
body.hide-scores .ufcs-center__res { visibility: hidden; }
body.hide-scores .ufcs-bout__side.is-loser,
body.hide-scores .ufcs-side.is-loser { opacity: 1; }
body.hide-scores .ufcs-side.is-loser .ufcs-photo { filter: none; }

/* ===== «Турнир завершён» + афиша следующего ===== */
.ufcs-next { display: flex; flex-direction: column; overflow: hidden; color: var(--ink); }
.ufcs-next:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
.ufcs-next__top { display: flex; align-items: center; gap: 14px; padding: 14px 20px; border-bottom: 1px solid var(--line-soft); }
.ufcs-next__title { font-size: 13px; font-weight: 700; color: var(--ink); }
.ufcs-next__note { font-size: 12.5px; font-weight: 600; color: var(--muted); }
.ufcs-next__body { display: flex; align-items: stretch; gap: 20px; }
.ufcs-next__media { position: relative; width: 250px; flex: none; background: var(--bg-header); }
.ufcs-next__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
/* Афиша растворяется в карточке, а не обрывается рамкой. */
.ufcs-next__media::after { content: ''; position: absolute; inset: 0; background: linear-gradient(var(--to-end), rgba(17, 23, 15, 0), rgba(17, 23, 15, 0.55) 92%, var(--panel)); }
.ufcs-next__info { display: flex; flex-direction: column; justify-content: center; gap: 6px; min-width: 0; flex: 1; padding: 18px 0; }
.ufcs-next__tag { align-self: flex-start; }
.ufcs-next__pair { font-family: var(--font-display); font-size: 17px; font-weight: 700; color: var(--ink-strong); }
.ufcs-next__when { font-size: 12.5px; font-weight: 600; color: var(--muted); }
.ufcs-next__cd { font-size: 13.5px; font-weight: 800; font-variant-numeric: tabular-nums; color: var(--green-soft); }
.ufcs-next__cta {
  flex: none;
  align-self: center;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--green);
  color: var(--on-green);
  font-weight: 800;
  font-size: 12.5px;
  border-radius: var(--r-pill);
  padding: 11px 22px;
  margin-inline-end: 20px;
}

/* ===== Сайдбар ===== */
/* Блок «Ставки» — общий .sm-bk__* из 19-sports.css. Своих правил у него
   здесь больше нет: были сплошная зелёная CTA и подпись с названием турнира,
   из-за которых блок отличался от футбольного. */

/* Карточка «Прошлый турнир» — ссылка на результаты. */
.ufcs-prev { display: flex; flex-direction: column; gap: 8px; color: var(--ink); }
.ufcs-prev:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
.ufcs-prev__pair { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); }
.ufcs-prev__when { font-size: 12px; font-weight: 600; color: var(--muted); }
.ufcs-prev__cta { font-size: 12.5px; font-weight: 800; color: var(--green-soft); }

/* ===== Статистика боя в сайдбаре ===== */
.ufcs-stats__head { display: flex; align-items: center; gap: 10px; padding: 14px 18px 0; }
.ufcs-stats__head h2 { font-family: var(--font-display); font-size: 16px; font-weight: 700; margin: 0; flex: 1; }
.ufcs-stats__sub { padding: 6px 18px 0; font-size: 11px; font-weight: 600; color: var(--dim); }
.ufcs-stats__tabs { display: flex; gap: 6px; padding: 12px 18px 4px; flex-wrap: wrap; }
/* Пара бойцов над полосами: фамилии и медальоны — чтобы стороны полос не
   приходилось угадывать по цвету. */
.ufcs-stats__pair { display: flex; align-items: center; gap: 10px; padding: 12px 18px 4px; }
.ufcs-stats__name { font-size: 12.5px; font-weight: 700; color: var(--ink-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ufcs-stats__name--blue { margin-inline-start: auto; text-align: end; }
.ufcs-stats__ava {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: #1A2118;
  object-fit: cover;
  object-position: top center;
  flex: none;
}
.ufcs-stats__ava--red { border: 1.5px solid rgba(255, 69, 69, 0.55); }
.ufcs-stats__ava--blue { border: 1.5px solid rgba(73, 178, 211, 0.55); }
.ufcs-stats__rows { padding: 6px 18px 6px; }
.ufcs-stats__foot { padding: 10px 18px 14px; border-top: 1px solid var(--line-soft); font-size: 10.5px; color: var(--dim); line-height: 1.5; }
/* Полосы — общий sm-stat, но в сайдбаре плотнее: 6px вместо 7 и подпись
   мельче, иначе пять метрик занимают экран целиком. */
.ufcs-stats__rows .sm-stat { padding: 7px 0 3px; }
.ufcs-stats__rows .sm-stat__row { font-size: 12.5px; }
.ufcs-stats__rows .sm-stat__row .lbl { font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; }
.ufcs-stats__rows .sm-stat__bar { height: 6px; gap: 3px; margin-top: 6px; }
/* Подсветка сдвинувшейся цифры статистики: поллинг вписывает значения в те же
   узлы, ничего не перерисовывая, и без вспышки изменение проходит незаметно —
   счётчик ударов просто становится другим. Мягче голевой lbScoreBump: там одно
   событие за полчаса, здесь цифры едут каждые 15 секунд, и «прыжок» масштаба
   у полутора десятков строк читался бы как рябь.

   Полосы под цифрами не подсвечиваем: у них есть свой transition по ширине
   (.sm-stat__fill), и он показывает изменение лучше любой вспышки.

   Как и transition, правило жило только в собранном public/css/v2/style.css —
   в партиал его перенесли задним числом (грабли №1). */
@keyframes ufcsStatBump {
  0%   { color: var(--red-live-text); }
  60%  { color: var(--red-live-text); }
  100% { }
}
.ufcs-stat--bump { animation: ufcsStatBump 0.9s ease-out 1; }
@media (prefers-reduced-motion: reduce) {
  .ufcs-stat--bump { animation-name: none; }
}

.ufcs-stat--red { background: var(--red-live-text); }
.ufcs-stat--blue { background: #49B2D3; }

/* Карта попаданий: анатомический силуэт (спрайт ufc_body_defs, фигуры ссылаются
   на него через <use>) и три зоны поверх него. Заливку зон приходит из Go
   атрибутом fill-opacity — 0.12..1 от самой битой зоны бойца. */
.ufcs-body { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; padding: 16px 18px 8px; border-top: 1px solid var(--line-soft); margin-top: 10px; }
.ufcs-body__col { display: flex; align-items: center; gap: 12px; }
.ufcs-body__col--blue { justify-content: flex-end; }
/* Спрайт с геометрией: не display:none — из скрытого предка ссылка #id
   разрешается не во всех браузерах. */
.ufcs-body__defs { position: absolute; width: 0; height: 0; overflow: hidden; }
.ufcs-body__fig { flex: none; width: 42px; height: 108px; }
/* Пустое тело. opacity, а не fill-opacity: у контура есть обводка того же
   цвета — ею фигура утолщается, — и при fill-opacity края темнели бы вдвое. */
.ufcs-body__silh { fill: #FFFFFF; stroke: #FFFFFF; stroke-width: 6; opacity: 0.12; }
.ufcs-body__fig--red .ufcs-body__zone { fill: var(--red-live-text); }
.ufcs-body__fig--blue .ufcs-body__zone { fill: #49B2D3; }
/* Строки разнесены по высоте силуэта: голова у головы, ноги у ног — иначе
   рядом с фигурой в полный рост они читались бы как отдельный столбик цифр. */
.ufcs-body__list { display: flex; flex-direction: column; justify-content: space-between; align-self: stretch; min-width: 0; }
.ufcs-body__col--blue .ufcs-body__list { align-items: flex-end; }
.ufcs-body__row { display: flex; flex-direction: column; }
.ufcs-body__col--blue .ufcs-body__row { align-items: flex-end; }
.ufcs-body__k { font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
.ufcs-body__v { font-size: 12.5px; font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.ufcs-body__v small { font-size: 11px; font-weight: 600; color: var(--muted); }

/* ===== Разбор главного боя ===== */
.ufcs-h2h__pair {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  gap: 8px;
  align-items: center;
  padding: 14px;
  border-bottom: 1px solid var(--line-soft);
}
/* Боец столбиком: медальон сверху, под ним фамилия и рекорд. В строку («имя
   слева от медальона») они не помещаются НИ ПРИ КАКОЙ ширине окна: блок живёт
   в сайдбаре 348px, колонке угла достаётся 140, из них медальон с отбивкой
   забирает 38 — а «Нурмагомедов» в Unbounded занимает 134.

   Обрезать было нечем, хотя text-overflow: ellipsis у имени стоял: колонка
   выровнена по краю (align-items), поэтому имя получает ширину ПО СОДЕРЖИМОМУ
   и обрезать ему нечего — вместо усечения оно вылезало из своей ячейки наружу
   и срезалось краем карточки (.lb-card--clip) вместе с первой буквой фамилии.
   Столбиком имя получает всю колонку и переносится по словам: «Делла
   Маддалена» в строку не поместилась бы ни при каком кегле.

   column-reverse у красного угла — потому что в разметке у него сначала имя,
   а у синего сначала медальон; так у обоих медальон оказывается сверху. */
.ufcs-h2h__f { display: flex; flex-direction: column-reverse; align-items: center; justify-content: center; gap: 6px; min-width: 0; }
.ufcs-h2h__f--blue { flex-direction: column; }
.ufcs-h2h__who { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 4px; min-width: 0; max-width: 100%; }
.ufcs-h2h__name { font-family: var(--font-display); font-size: 13.5px; font-weight: 700; color: var(--ink-strong); line-height: 1.2; max-width: 100%; }
.ufcs-h2h__meta { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; color: var(--muted); white-space: nowrap; }
.ufcs-h2h__vs { font-family: var(--font-display); font-size: 13px; font-weight: 700; color: var(--dim); }

.ufcs-h2h__specs { display: flex; flex-direction: column; padding: 6px 16px 4px; }
.ufcs-h2h__spec {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 104px minmax(0, 1fr);
  align-items: center;
  padding: 10px 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.ufcs-h2h__spec:last-child { border-bottom: none; }
.ufcs-h2h__spec b { font-size: 13.5px; font-weight: 700; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.ufcs-h2h__spec b:first-child { text-align: end; }
.ufcs-h2h__spec span { font-size: 10.5px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--dim); text-align: center; }

.ufcs-h2h__sub { padding: 14px 16px 0; font-size: 10.5px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
.ufcs-h2h__bars { padding: 12px 16px 6px; }
.ufcs-h2h__bars .sm-stat { padding: 7px 0 3px; }
.ufcs-h2h__bars .sm-stat__row { font-size: 13.5px; }
.ufcs-h2h__bars .sm-stat__row .lbl { font-size: 10.5px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; }
.ufcs-h2h__bars .sm-stat__bar { height: 7px; gap: 3px; margin-top: 6px; }

/* «Как побеждает»: одна полоса на бойца, разбитая по способам финиша. */
.ufcs-h2h__fins { display: flex; flex-direction: column; gap: 11px; padding: 12px 16px 6px; }
.ufcs-h2h__fin { display: flex; align-items: center; gap: 10px; }
.ufcs-h2h__fin-name { width: 66px; font-size: 12.5px; font-weight: 700; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ufcs-h2h__fin-bar { flex: 1; display: flex; gap: 2px; height: 8px; border-radius: 4px; overflow: hidden; }
.ufcs-h2h__fin-bar i { display: block; height: 100%; }
.ufcs-h2h__fin-wins { width: 62px; text-align: end; font-size: 11px; font-weight: 600; color: var(--dim); }
.ufcs-fin--ko { background: var(--red-live-text); }
.ufcs-fin--sub { background: #49B2D3; }
.ufcs-fin--dec { background: var(--ink-soft); }
.ufcs-h2h__legend { display: flex; align-items: center; gap: 14px; padding: 3px 16px 4px; flex-wrap: wrap; }
.ufcs-h2h__legend span { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; color: var(--muted); }
.ufcs-h2h__legend i { width: 8px; height: 8px; border-radius: 2px; display: inline-block; }

/* Кнопка раскрытия — та же, что «Весь топ-15» в рейтингах. */
.ufcs-more {
  display: block;
  width: calc(100% - 32px);
  margin: 14px 16px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 10px;
  padding: 11px;
  font-size: 13px;
  font-weight: 700;
  color: var(--green-pale);
}
.ufcs-more:hover { border-color: var(--hover-green-line); background: rgba(139, 233, 106, 0.07); }
.ufcs-h2h__full { display: none; }
.ufcs-h2h.is-open .ufcs-h2h__full { display: block; }

/* ============================================================
   Адаптив (зеркалим брейкпоинты проекта: 1180 / 940 / 600)
   ============================================================ */

@media (max-width: 940px) {
  .ufcs-grid { grid-template-columns: 1fr; }
  .ufcs-duel__grid { grid-template-columns: minmax(0, 1fr) 240px minmax(0, 1fr); gap: 12px; padding: 20px 18px 0; }
  .ufcs-photo { width: 108px; height: 170px; }
  .ufcs-name { font-size: 16px; }
  .ufcs-center__cd { font-size: 24px; }
  .ufcs-center__method { font-size: 26px; }
  .ufcs-cells { width: 100%; }
  .ufcs-bout { grid-template-columns: 120px minmax(0, 1fr) 88px minmax(0, 1fr); }
  .ufcs-next__media { width: 180px; }
}

@media (max-width: 600px) {
  /* ============================================================
     Телефон — по передаче «UFC моб», экраны 1b (анонс), 1c (эфир),
     1d (завершён). Три состояния одной страницы: раскладку выбирает
     data-ufc-st на .ufcs-page — тот же атрибут обновляет поллинг, поэтому
     страница переключается по гонгу без перезагрузки.
     ============================================================ */

  /* ВСЕ КАРТОЧКИ СТРАНИЦЫ — ДЕТИ ОДНОЙ КОЛОНКИ: сетка «контент + сайдбар» и
     обе .sm-mcol разворачиваются (display: contents). Нужно это ради одного
     состояния — эфира: там статистика идущего боя обязана стоять сразу под
     плеером, а лежит она в сайдбаре, то есть в другой колонке. Переставить её
     порядком (order) можно, только когда она флекс-элемент того же столбца,
     что и плеер. */
  .ufcs-page { gap: 28px; padding: 0 0 24px; }
  .ufcs-grid,
  .ufcs-grid > .sm-mcol { display: contents; }

  /* --- Подшапка страницы турнира --- */
  /* Полоса во всю ширину, прижатая к шапке сайта. Отрицательный нижний отступ
     гасит колоночный gap 28px до 16px, как в передаче. */
  .ufcs-duel {
    margin: 0 -14px -12px;
    border-radius: 0;
    border-inline-start: 0;
    border-inline-end: 0;
    border-top: 0;
    background: radial-gradient(420px 240px at 50% 115%, rgba(88, 219, 36, 0.14), transparent 72%), #0E140C;
  }
  /* Свечения углов рассчитаны на широкую карточку — на 390px они заливают
     полосу целиком. */
  .ufcs-duel__glow { display: none; }
  .ufcs-duel__top {
    flex-wrap: nowrap;
    gap: 10px;
    padding: 10px 16px;
    background: var(--bg-header);
  }
  /* Порядок в полосе: название, статус, звезда. В разметке плашки статуса
     стоят перед названием — на десктопе это правильный порядок. Стрелки
     «назад» в начале полосы с 23.09.2026 нет — крошки убраны по всему сайту. */
  .ufcs-duel__name { order: 1; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .ufcs-duel__top .ufc-tag { order: 2; font-size: 9px; padding: 4px 9px; }
  .ufcs-duel__top lb-star { order: 3; }
  /* Арена и дата из полосы уходят: на 358px они не помещаются рядом со
     звездой, и обе написаны в карточке «Информация о турнире». */
  .ufcs-duel__venue,
  .ufcs-duel__date { display: none; }

  /* --- Хиро: пара бойцов плитками --- */
  /* В ЭФИРЕ ХИРО НЕТ ВОВСЕ — его место занимает плеер (экран 1c): кто сейчас
     в октагоне, сказано плашкой поверх плеера и в «Статистике боя», а двое в
     полный рост отняли бы весь первый экран. */
  .ufcs-page[data-ufc-st="live"] .ufcs-duel__grid { display: none; }
  .ufcs-page[data-ufc-st="live"] .ufcs-duel { border-bottom: 0; }

  .ufcs-duel__grid {
    grid-template-columns: 1fr 1fr;
    gap: 12px 10px;
    padding: 14px 16px 0;
    align-items: stretch;
  }
  /* Центр разворачивается: подпись боя встаёт НАД плитками, тайминги и исход —
     ПОД ними полосой во всю ширину. */
  .ufcs-center { display: contents; }
  .ufcs-center__label {
    display: flex;
    grid-column: 1 / -1;
    grid-row: 1;
    align-items: baseline;
    justify-content: center;
    gap: 5px;
    text-align: center;
  }
  .ufcs-center__main,
  .ufcs-center__live { font-size: 9.5px; letter-spacing: 0.14em; }
  .ufcs-center__wc { font-size: 9.5px; letter-spacing: 0.14em; color: var(--green-soft); }
  /* Разделитель только когда слева реально что-то есть: у завершённого
     турнира узла «Главный бой» в разметке нет вовсе, и точка повисла бы. */
  .ufcs-center__main:not([hidden]) ~ .ufcs-center__wc::before { content: '· '; }

  .ufcs-side {
    display: block;
    grid-row: 2;
    position: relative;
    height: 190px;
    border: 1px solid var(--line);
    border-radius: 18px;
    overflow: hidden;
  }
  .ufcs-side--red {
    grid-column: 1;
    background: radial-gradient(150px 120px at 50% 0%, rgba(255, 69, 69, 0.2), rgba(229, 57, 53, 0.04)), #141B12;
    border-color: rgba(255, 69, 69, 0.32);
  }
  .ufcs-side--blue {
    grid-column: 2;
    background: radial-gradient(150px 120px at 50% 0%, rgba(73, 178, 211, 0.18), rgba(73, 178, 211, 0.04)), #141B12;
    border-color: rgba(73, 178, 211, 0.32);
  }
  /* Фото в полный рост выходит за низ плитки и перекрывается подписью — так
     боец виден крупно, а не «поясным портретом в марке». */
  .ufcs-photo {
    position: absolute;
    left: 50%;
    top: 6px;
    transform: translateX(-50%);
    width: 150px;
    height: 230px;
    border-radius: 0;
    object-fit: cover;
    object-position: top;
    background: none;
    box-shadow: none;
  }
  .ufcs-side--red .ufcs-photo,
  .ufcs-side--blue .ufcs-photo { box-shadow: none; }
  /* Низ плитки перекрыт подписью: силуэт поднимаем в видимую часть. */
  .ufcs-photo--none { align-items: flex-start; padding-top: 12px; }
  .ufcs-photo--none svg { width: 76%; }
  .ufcs-who {
    position: absolute;
    inset-inline-start: 0;
    inset-inline-end: 0;
    bottom: 0;
    z-index: 1;
    gap: 2px;
    padding: 64px 10px 10px;
    background: linear-gradient(to top, rgba(10, 14, 8, 0.95) 32%, rgba(10, 14, 8, 0));
  }
  .ufcs-side--red .ufcs-who,
  .ufcs-side--blue .ufcs-who { align-items: center; text-align: center; }
  .ufcs-corner { font-size: 8.5px; letter-spacing: 0.1em; }
  /* Имя одной строкой: <br> из разметки погашен, пробел перед ним оставлен
     сервером и поллингом (см. _ufc_duel.html). Перенос по словам разрешён —
     страховка для длинных фамилий, обрезать их многоточием хуже. */
  .ufcs-name { font-family: inherit; font-size: 13px; line-height: 1.25; }
  .ufcs-name br { display: none; }
  .ufcs-meta { justify-content: center; gap: 0 5px; font-size: 10px; }
  /* Страна на телефоне уходит: «Соединенные Штаты · 20–6–0» в плитку 154px не
     влезает. Флаг остаётся — он ту же страну и называет. */
  .ufcs-meta__country { display: none; }
  .ufcs-who .ufc-flag { height: 8px; }
  /* Полоска формы поверх фото не читается, а места под ней в плитке нет. */
  .ufcs-form { display: none; }
  .ufcs-win { font-size: 8.5px; font-weight: 800; letter-spacing: 0; border-radius: 4px; padding: 1.5px 5px; }

  /* Бейдж «VS» — псевдоэлемент грида: отдельного узла под него в разметке нет,
     а как грид-элемент он ложится ровно в центр строки с плитками. */
  .ufcs-duel__grid::after {
    content: 'VS';
    grid-column: 1 / -1;
    grid-row: 2;
    justify-self: center;
    align-self: center;
    z-index: 2;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--bg);
    border: 1px solid rgba(255, 255, 255, 0.16);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-family: var(--font-display);
    font-size: 11px;
    font-weight: 700;
    color: var(--green);
  }

  /* Полоса под плитками: у анонса — прелимы / отсчёт / кард, у завершённого —
     раунд / исход / время. Во всю ширину карточки, поэтому отрицательные поля
     съедают горизонтальный padding грида. */
  .ufcs-center__foot {
    display: flex;
    grid-column: 1 / -1;
    grid-row: 3;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    margin: 4px -16px 0;
    padding: 12px 16px 16px;
    background: rgba(10, 14, 8, 0.72);
    border-top: 1px solid var(--line-soft);
  }
  /* Полоса исхода живёт только у завершённого турнира, полоса таймингов — у
     остальных. Иначе вторая (все узлы под hidden, но сама она пустой не
     считается) рисовала бы под первой ещё одну полосу фона. */
  .ufcs-center__foot--res { display: none; }
  .ufcs-page[data-ufc-st="done"] .ufcs-center__foot--res { display: flex; }
  .ufcs-page[data-ufc-st="done"] .ufcs-center__foot--soon { display: none; }

  /* Ячейки разворачиваются в ту же полосу: крайняя левая, крайняя правая, а
     между ними отсчёт или исход. */
  .ufcs-cells { display: contents; }
  .ufcs-cell {
    flex: 1;
    min-width: 0;
    flex-direction: column-reverse;
    align-items: flex-start;
    gap: 1px;
    background: none;
    border: 0;
    padding: 0;
  }
  .ufcs-cell:first-child { order: 1; }
  .ufcs-cell:nth-child(2) { order: 3; align-items: flex-end; text-align: end; }
  .ufcs-cell b { font-size: 13.5px; }
  .ufcs-cell span { font-size: 8.5px; }
  .ufcs-center__cd,
  .ufcs-center__res { order: 2; }
  .ufcs-center__cd {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1px;
    font-size: 20px;
  }
  /* Подпись «до начала» — псевдоэлементом из атрибута: текст самого узла
     app.js переписывает целиком каждую секунду (см. _ufc_centre.html). */
  .ufcs-center__cd::before {
    content: attr(data-cd-label);
    font-family: var(--font-text);
    font-size: 8.5px;
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--green-soft);
  }
  .ufcs-center__res { gap: 1px; }
  .ufcs-center__win { font-size: 8.5px; font-weight: 700; letter-spacing: 0.1em; }
  .ufcs-center__method { font-size: 20px; }
  .ufcs-center__detail { font-size: 9px; color: var(--dim); }
  .ufcs-center__ref { order: 4; flex: 0 0 100%; text-align: center; font-size: 9.5px; }
  /* Ориентировочное время главного боя — единственное, что можно потерять:
     оно и на десктопе подсказка второго плана. */
  .ufcs-center__hint { display: none; }

  /* --- Плеер и заглушка --- */
  .ufcs-wait { min-height: 170px; font-size: 12.5px; padding: 0 20px; }
  .ufcs-stage { gap: 10px; }
  .ufcs-stage .sm-player__play { width: 54px; height: 54px; box-shadow: 0 8px 26px rgba(88, 219, 36, 0.4); }
  .ufcs-stage .sm-player__play svg { width: 20px; height: 20px; }
  .ufcs-stage .sm-player__title { font-size: 12.5px; }
  .ufcs-stage .sm-player__sub { font-size: 11px; }
  .ufcs-stage__tag { top: 10px; inset-inline-end: 10px; font-size: 9px; padding: 4px 9px; }
  /* В эфире статистика идущего боя идёт сразу за плеером, а кард — под ней
     (экран 1c). Порядок задан явно только для этого состояния: у анонса и
     завершённого он и так совпадает с разметкой. */
  .ufcs-page[data-ufc-st="live"] .ufcs-duel { order: 1; }
  .ufcs-page[data-ufc-st="live"] .sm-mcol > * { order: 3; }
  /* :not(aside) — плеер, а не первая карточка сайдбара: у сайдбара первым
     стоит блок «Ставки». */
  .ufcs-page[data-ufc-st="live"] .sm-mcol:not(aside) > *:first-child,
  .ufcs-page[data-ufc-st="live"] [data-ufc-stats] { order: 2; }

  /* --- Кард турнира --- */
  .ufcs-card__head { padding: 14px 16px 10px; }
  .ufcs-card__head h2 { font-size: 14px; }
  .ufcs-card__note { font-size: 10.5px; }
  .ufcs-card__foot { padding: 10px 16px 14px; font-size: 10px; }
  .ufcs-group { padding: 9px 16px; }
  .ufcs-group__name { font-size: 10px; }
  .ufcs-group__meta { font-size: 10.5px; }

  /* Прелимы и ранние прелимы — под кнопкой: иначе до «Ставок» и статистики
     приходится прокручивать четырнадцать боёв. Раскрытие ведёт общий
     data-collapsible из app.js. */
  .ufcs-card__part--extra { display: none; }
  .sm-card.is-open .ufcs-card__part--extra { display: block; }
  .ufcs-card__more {
    display: block;
    width: calc(100% - 32px);
    margin: 10px 16px 14px;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.1);
    border-radius: 10px;
    padding: 10px;
    font-size: 12px;
    font-weight: 700;
    color: var(--green-pale);
  }

  /* Строка боя: шапка (вес, роль, статус) над парой, ниже — медальон, имя,
     «vs», имя, медальон. Шапка и статус делят строку колонками грида, а не
     margin-left:auto: длинный способ победы рядом с длинной весовой иначе
     наезжали бы друг на друга. */
  .ufcs-bout,
  .ufcs-bout--res {
    grid-template-columns: minmax(0, 1fr) 30px minmax(0, 1fr);
    grid-template-rows: auto auto;
    gap: 8px;
    padding: 12px 16px;
  }
  .ufcs-bout::after {
    content: 'vs';
    grid-column: 2;
    grid-row: 2;
    align-self: center;
    text-align: center;
    font-size: 10.5px;
    font-weight: 700;
    color: var(--dim);
  }
  /* Вес и метка боя в одну строку помещаются не всегда: «Ж. минимальный вес»
     рядом с «Ко-мейн» шире, чем половина телефона. Пока метка сжималась как
     обычный flex-элемент, она рвалась ПО ДЕФИСУ — «КО-» / «МЕЙН», — потому что
     минимальная ширина текста считается по самому длинному куску между
     возможными переносами. Поэтому метке flex: none (сжимать нечего, она
     ярлык), а переносится теперь строка целиком: не влезли рядом — метка
     уходит под весовую. Обрезать по ширине нельзя: у титульников метка длинная
     («Бой за временный титул»), и nowrap выдавил бы её за край. */
  .ufcs-bout__meta { grid-column: 1 / 3; grid-row: 1; flex-direction: row; align-items: center; flex-wrap: wrap; gap: 2px 6px; }
  .ufcs-bout__role { flex: none; }
  .ufcs-bout__wc,
  .ufcs-bout__role { font-size: 9.5px; }
  .ufcs-bout__mid {
    grid-column: 3;
    grid-row: 1;
    flex-direction: row;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: flex-end;
    gap: 2px 5px;
    text-align: end;
  }
  /* У результатов колонки веса нет — строка статуса занимает всю ширину. */
  .ufcs-bout--res .ufcs-bout__mid { grid-column: 1 / -1; }
  .ufcs-bout__side--red { grid-column: 1; grid-row: 2; flex-direction: row-reverse; justify-content: flex-end; gap: 8px; }
  .ufcs-bout__side--blue { grid-column: 3; grid-row: 2; flex-direction: row-reverse; justify-content: flex-start; gap: 8px; }
  .ufcs-bout__side--red .ufcs-bout__who { align-items: flex-start; text-align: start; }
  .ufcs-bout__side--blue .ufcs-bout__who { align-items: flex-end; text-align: end; }
  .ufcs-bout__ava { width: 34px; height: 34px; }
  /* Флаги в строке карда на телефоне лишние: они отнимают у имён по 30px, а
     страну бойца в карде никто не ищет. */
  .ufcs-bout__flag { display: none; }
  .ufcs-bout__name { font-size: 13px; line-height: 1.25; flex-wrap: wrap; gap: 0 5px; }
  /* Имя переносится по словам, а не режется многоточием: «Квиллан Салкиллд» в
     колонку 120px в одну строку не помещается ни при каком кегле. */
  .ufcs-bout__name span { white-space: normal; overflow: visible; text-overflow: clip; }
  /* Рекорд под именем в результатах на телефоне убираем — строка и так в две
     строки имени. */
  .ufcs-bout__rec { display: none; }
  .ufcs-bout__rounds,
  .ufcs-bout__sub,
  .ufcs-bout__method,
  .ufcs-bout__clock { font-size: 10px; }
  .ufcs-bout__live { font-size: 8.5px; padding: 2px 7px; gap: 4px; }
  .ufcs-bout__live .ufc-dot { width: 4px; height: 4px; }
  .ufcs-bout__badge { font-size: 9.5px; padding: 2px 8px; }
  /* Шеврон уезжает под «vs» — по центру нижнего края строки: справа теперь
     стоит медальон синего угла, и поверх него шеврон читался бы как его часть. */
  .ufcs-bout--exp { padding-inline-end: 16px; padding-bottom: 20px; }
  .ufcs-bout__chev {
    left: 50%;
    right: auto;
    top: auto;
    bottom: 7px;
    margin-top: 0;
    transform: translateX(-50%) rotate(45deg);
  }
  .ufcs-bout-item[open] .ufcs-bout__chev { margin-top: 0; bottom: 9px; transform: translateX(-50%) rotate(-135deg); }
  .ufcs-bout__panel { padding: 4px 0 12px; }
  .ufcs-bout__panel .ufcs-stats__tabs,
  .ufcs-bout__panel .ufcs-stats__pair,
  .ufcs-bout__panel .ufcs-stats__rows,
  .ufcs-bout__panel .ufcs-body { padding-inline-start: 16px; padding-inline-end: 16px; }

  /* --- Статистика боя --- */
  .ufcs-stats__head { padding: 14px 16px 0; }
  .ufcs-stats__head h2 { font-size: 14px; }
  .ufcs-stats__sub { padding: 4px 16px 0; font-size: 10.5px; }
  .ufcs-stats__tabs { padding: 10px 16px 2px; }
  .ufcs-stats__pair { padding: 10px 16px 2px; gap: 8px; }
  .ufcs-stats__ava { width: 30px; height: 30px; }
  .ufcs-stats__name { font-size: 12px; }
  .ufcs-stats__rows { padding: 12px 16px 2px; }
  .ufcs-stats__rows .sm-stat { padding: 0 0 11px; }
  .ufcs-stats__rows .sm-stat__row { font-size: 12px; }
  .ufcs-stats__rows .sm-stat__row .lbl { font-size: 9.5px; }
  .ufcs-stats__rows .sm-stat__bar { height: 5px; gap: 3px; margin-top: 4px; }
  .ufcs-stats__foot { padding: 10px 16px 14px; font-size: 10px; }

  /* --- «Турнир завершён» + афиша следующего --- */
  .ufcs-next__top { padding: 12px 16px; gap: 8px; }
  .ufcs-next__title { font-size: 12px; }
  .ufcs-next__note { font-size: 10.5px; }
  .ufcs-next__body { gap: 12px; }
  .ufcs-next__media { width: 110px; }
  .ufcs-next__info { padding: 12px 0; gap: 3px; }
  .ufcs-next__pair { font-size: 13.5px; }
  .ufcs-next__when { font-size: 10.5px; }
  .ufcs-next__cd { font-size: 11.5px; }
  /* Кнопка сжимается до стрелки: подпись «Смотреть» рядом со 110px афиши
     отнимает у названия турнира последние 60px. */
  .ufcs-next__cta {
    align-self: center;
    margin-block: 0; margin-inline: 0 14px;
    padding: 0;
    background: none;
    color: var(--green);
    font-size: 15px;
  }
  .ufcs-next__cta:hover { background: none; color: var(--green); }
  .ufcs-next__cta-t { display: none; }
  .ufcs-next__cta-a { display: inline; }

  /* --- Разбор главного боя --- */
  .ufcs-h2h__spec { grid-template-columns: minmax(0, 1fr) 88px minmax(0, 1fr); }
  .ufcs-body { grid-template-columns: 1fr 1fr; gap: 8px; padding: 14px 16px 6px; }
  .ufcs-body__col { gap: 8px; }
  .ufcs-body__fig { width: 34px; height: 88px; }

  /* --- Telegram строкой --- */
  .ufcs-page .home-cta { display: flex; align-items: center; gap: 12px; padding: 16px; }
  .ufcs-page .home-cta__title { flex: 1; min-width: 0; font-size: 12.5px; }
  .ufcs-page .home-cta__text { display: none; }
  .ufcs-page .home-cta__btn { flex: none; margin-top: 0; padding: 9px 16px; font-size: 12px; }
}

/* ===== partials/24-formula1.css ===== */
/* --- Формула 1 (f1-) --- */
/* Две страницы раздела: хаб /formula1 (ближайший этап, остаток сезона, лидеры,
   секция «Сезон» с вкладками) и Гран-при /formula1/{сезон}/{slug} в трёх
   состояниях — скоро / эфир / завершён. Дизайн v2 (04.09.2026): один хиро с
   одним действием, всё тяжёлое — под вкладками; шапка этапа общая для обеих
   страниц (на хабе — ссылка), внизу шапки — полоса уик-энда.

   Что берём готовым, а не пишем заново:
     .ufc-tag, .ufc-tag--live/--done  чипы состояния (22-ufc.css);
     .ufc-cd                          отсчёт четырьмя плашками — дизайн прямо
                                      требует единый вид с турнирами UFC;
     .ufc-sec__head/__note/__grow     заголовок секции (тот же кегль и отступ);
     .sm-card, .sm-card--pad          карточки сайдбара (19-sports.css);
     .sm-info__row + .k/.v            строки «ключ — значение» («Трасса»,
                                      «Итоги гонки»);
     .lb-pill--sm, .lb-tabs, .lb-panel вкладки секции «Сезон» и таблиц
                                      результатов;
     .home-cta                        карточка и баннер Telegram.
   Вторая копия этих правил разъехалась бы с первой при первой же правке. */

/* Каркас страницы: одна колонка 1140 без сайдбара слева. Между блоками 28px —
   у секций свои заголовки, и на 20px они липнут к предыдущей карточке. */
.f1-page {
  width: 1140px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: 28px;
  padding: 24px 0 12px;
}
/* Контент + сайдбар страницы Гран-при */
.f1-grid { display: grid; grid-template-columns: minmax(0, 1fr) 348px; gap: 20px; align-items: start; }

/* Фирменные цвета команд Ф1. Класс задаёт только переменную --f1-team: ею
   красятся бары в списках, полосы карточек подиума и заливка баров кубка
   конструкторов. Красить сразу background нельзя — тогда класс на строке
   залил бы её целиком. */
.f1-c-mer  { --f1-team: #27F4D2; }   /* Mercedes */
.f1-c-fer  { --f1-team: #E8002D; }   /* Ferrari */
.f1-c-rbr  { --f1-team: #3671C6; }   /* Red Bull */
.f1-c-mcl  { --f1-team: #FF8000; }   /* McLaren */
.f1-c-ast  { --f1-team: #229971; }   /* Aston Martin */
.f1-c-wil  { --f1-team: #1868DB; }   /* Williams */
.f1-c-alp  { --f1-team: #00A1E8; }   /* Alpine */
.f1-c-aud  { --f1-team: #00E701; }   /* Audi */
.f1-c-rb   { --f1-team: #6692FF; }   /* Racing Bulls */
.f1-c-haas { --f1-team: #B6BABD; }   /* Haas */
.f1-c-cad  { --f1-team: #CFB675; }   /* Cadillac */
/* Фиолетовый — быстрый круг (цвет F1, не команда) */
.f1-c-fastest { --f1-team: #C77BFF; }

/* Иконка «play» в кнопке эфира. Красится currentColor — та же иконка стоит и в
   зелёной кнопке, и в тёмной сцене плеера. */
.f1-play { flex: none; color: currentColor; }

/* Точка live 6px (в макете раздела крупнее базовой .lb-live-dot 5px) */
.f1-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--red-live);
  animation: lbPulse 1.2s ease infinite;
  flex: none;
}

/* Цветной бар команды перед названием. Незнакомая конюшня остаётся без цвета:
   серый бар лучше, чем чужой. */
.f1-bar { width: 3px; height: 16px; border-radius: 2px; flex: none; background: var(--f1-team, rgba(255, 255, 255, 0.14)); }
/* Флаг страны: этап, пилот, город трассы */
.f1-flag { height: 12px; border-radius: 2px; flex: none; }
.f1-flag--lg { height: 20px; border-radius: 3px; }
.f1-flag--sm { height: 11px; }
/* В карточке «ключ — значение» строка не флекс, а текст с выравниванием
   вправо — отступ и базовую линию флагу задаём сами. */
.sm-info__row .f1-flag { margin-inline-end: 6px; vertical-align: baseline; }

/* Заголовок карточки без внутреннего паддинга (.lb-card--clip) */
.f1-cardhead { display: flex; align-items: baseline; gap: 10px; padding: 18px 20px 12px; }
.f1-cardhead h2 {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 700;
  color: var(--ink-strong);
  margin: 0;
  flex: 1;
}
.f1-cardhead__note { font-size: 11.5px; font-weight: 600; color: var(--dim); }

/* Заголовок главной раздела: название и пилюли сезонов, пилюли справа
   отжимает сам заголовок. Подписи «Сезон 2026 · этап 12 из 23» нет с
   30.09.2026 ни здесь, ни на странице этапа: сезон назван активной пилюлей
   (на этапе — годом в названии), «из 23» — в плашке этапа хиро. */
.f1-head { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.f1-head h1 {
  font-family: var(--font-display);
  font-size: 26px;
  font-weight: 700;
  color: var(--ink-strong);
  margin: 0;
}
.f1-head--hub h1 { flex: 1; }
/* Пилюли сезонов — базовые .lb-pill, но кегль плотнее: их в ряду четыре */
.f1-season { font-size: 12.5px; padding: 8px 16px; }

/* ============================================================
   Шапка этапа (хаб и страница Гран-при)
   ============================================================ */

/* Обводки у шапки нет (ни обычной, ни красной у идущего этапа: состояние
   говорят плашка «В эфире» и зелёная ячейка полосы уик-энда). На хабе шапка —
   ссылка на этап целиком, и при наведении светлеет вся карточка — тот же
   приём, что у плиток «Топ лиг» на главной (.home-lc:hover): один и тот же
   жест «сюда можно нажать» не должен выглядеть в разделах по-разному. */
.f1-hero {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  background: var(--panel);
  border-radius: var(--r-lg);
  color: var(--ink);
}
a.f1-hero:hover { filter: brightness(1.08); color: var(--ink); }
/* Схема трассы фоном справа, приглушённая, и тень слева от неё, чтобы текст
   не ложился на линии секторов. Схема выводится как есть, без фильтров: у
   нынешних схем f1.com трасса нарисована цветными линиями секторов, а чёрная
   там только обводка-подложка, на нашем фоне она не видна. */
.f1-hero__art {
  position: absolute;
  inset-inline-end: -40px;
  top: -60px;
  width: 520px;
  height: 340px;
  object-fit: contain;
  opacity: 0.22;
  pointer-events: none;
}
.f1-hero__shade {
  position: absolute;
  inset-inline-end: 0;
  top: 0;
  height: 260px;
  width: 600px;
  background: linear-gradient(var(--to-end), var(--panel) 0%, rgba(17, 23, 15, 0) 60%);
  pointer-events: none;
}
.f1-hero__main { position: relative; display: flex; align-items: flex-end; gap: 28px; padding: 28px 32px 24px; }
.f1-hero__body { display: flex; flex-direction: column; gap: 12px; flex: 1; min-width: 0; }
.f1-hero__tags { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.f1-hero__tags .ufc-tag { padding: 5px 12px; }
.f1-hero__round {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
}
/* Официальное имя этапа (страница Гран-при) в подписи номера — обычным
   регистром; на телефоне прячется, не помещается ни в одну строку */
.f1-hero__official { text-transform: none; letter-spacing: 0; font-weight: 600; color: var(--dim); }
/* Звезда избранного — у названия: в ряду плашек она читалась ещё одной
   плашкой и на узком экране уезжала на вторую строку */
.f1-hero__title { display: flex; align-items: center; gap: 12px; min-width: 0; }
.f1-hero__title .lb-star { margin-inline-start: 2px; }
.f1-hero__name {
  font-family: var(--font-display);
  font-size: 30px;
  font-weight: 700;
  color: var(--ink-strong);
  line-height: 1.1;
}
.f1-hero__sub { font-size: 14px; font-weight: 600; color: var(--ink-soft); }
/* «Быстрее всех — Леклер · 1:21.310» под подписью, пока идёт практика */
.f1-hero__fast { font-size: 12.5px; font-weight: 700; color: var(--green-soft); }
/* Одна кнопка на карточку, прижата к низу правого края */
.f1-hero__cta { position: relative; display: flex; align-self: flex-end; flex: none; }
.f1-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  background: var(--green);
  color: var(--on-green);
  font-weight: 800;
  font-size: 15px;
  border-radius: var(--r-pill);
  padding: 16px 28px;
  white-space: nowrap;
}

/* Отсчёт до гонки — общий .ufc-cd, плитки крупнее, чем на афише UFC */
.f1-cd { margin-top: 8px; }
.f1-cd .ufc-cd__cell {
  width: 74px;
  height: 70px;
  padding: 0;
  justify-content: center;
  gap: 4px;
  background: rgba(12, 17, 11, 0.75);
  border-color: var(--line);
}
.f1-cd .ufc-cd__lbl { font-size: 9px; font-weight: 800; letter-spacing: 0.12em; }

/* Плашки идущей гонки на месте отсчёта: время в эфире (красная рамка) и кто
   впереди. Кругов нет намеренно — апстрим не дописывает протокол по ходу
   гонки, и круг показывался бы от прошлой. */
.f1-run { display: flex; gap: 8px; margin-top: 8px; }
.f1-run__box {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 4px;
  padding: 0 18px;
  height: 70px;
  border-radius: var(--r-ctl);
  background: rgba(12, 17, 11, 0.75);
  border: 1px solid var(--line);
}
.f1-run__box--red { background: rgba(229, 57, 53, 0.08); border-color: rgba(229, 57, 53, 0.35); }
.f1-run__num {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 700;
  color: var(--ink-strong);
  line-height: 1;
  font-variant-numeric: tabular-nums;
}
.f1-run__lbl { font-size: 9px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--dim); }
.f1-run__lbl--red { color: var(--red-live-text); }
.f1-run__who {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-display);
  font-size: 18px;
  font-weight: 700;
  color: var(--ink-strong);
  line-height: 1;
}

/* ===== Полоса уик-энда (низ шапки) ===== */
/* Пять ячеек — по одной на заезд, равной ширины: они читаются как ряд
   времени, а не как список. Полоса слева только у идущего заезда; у
   прошедших — ничего, только приглушённые цвета. */
.f1-wk {
  position: relative;
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  border-top: 1px solid rgba(255, 255, 255, 0.07);
  background: rgba(12, 17, 11, 0.5);
}
.f1-wk__note { grid-column: 1 / -1; padding: 14px 32px; font-size: 12.5px; font-weight: 600; line-height: 1.5; color: var(--muted); }
.f1-wk__cell {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 5px;
  padding-block: 14px; padding-inline: 22px 18px;
  border-inline-start: 1px solid var(--line-soft);
  min-width: 0;
}
.f1-wk__cell::before { content: ''; position: absolute; inset-inline-start: 0; top: 0; bottom: 0; width: 3px; background: transparent; }
.f1-wk__cell.is-live { background: rgba(88, 219, 36, 0.07); }
.f1-wk__cell.is-live::before { background: var(--green); }
.f1-wk__top { display: flex; align-items: baseline; gap: 8px; }
.f1-wk__time {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 700;
  color: var(--ink-strong);
  font-variant-numeric: tabular-nums;
  line-height: 1;
}
.f1-wk__cell.is-done .f1-wk__time { color: var(--dim); }
.f1-wk__day { font-size: 11px; font-weight: 600; color: var(--dim); }
.f1-wk__live {
  margin-inline-start: auto;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 9px;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--red-live-text);
}
.f1-wk__live .f1-dot { width: 5px; height: 5px; }
.f1-wk__name {
  font-size: 13px;
  font-weight: 700;
  color: var(--ink-strong);
  line-height: 1.2;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.f1-wk__cell.is-done .f1-wk__name { color: var(--muted); }
.f1-wk__sub {
  font-size: 11px;
  font-weight: 600;
  color: var(--dim);
  min-height: 13px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.f1-wk__run { color: var(--red-live-text); }

/* ===== Подиум завершённого этапа (в шапке, над полосой уик-энда) ===== */
.f1-podium { position: relative; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; padding: 0 32px 26px; }
.f1-pod {
  position: relative;
  display: flex;
  align-items: flex-end;
  height: 184px;
  border-radius: var(--r-card);
  overflow: hidden;
  background: rgba(12, 17, 11, 0.75);
  border: 1px solid var(--line);
}
.f1-pod.is-first { border-color: rgba(139, 233, 106, 0.4); }
/* Крупная позиция призраком в углу. Одинаково белая у всех трёх карточек:
   в цвете команды P1 и P3 казались разного размера. */
.f1-pod__ghost {
  position: absolute;
  inset-inline-end: 14px;
  top: 10px;
  font-family: var(--font-display);
  font-size: 64px;
  font-weight: 700;
  line-height: 0.85;
  letter-spacing: -0.03em;
  color: rgba(255, 255, 255, 0.12);
  pointer-events: none;
}
.f1-pod__photo {
  width: 126px;
  height: 184px;
  flex: none;
  object-fit: cover;
  object-position: top center;
  background: rgba(255, 255, 255, 0.04);
}
.f1-pod__body { position: relative; flex: 1; display: flex; align-items: flex-end; gap: 12px; padding-block: 0 16px; padding-inline: 14px 16px; min-width: 0; }
.f1-pod__bar { width: 3px; align-self: stretch; border-radius: 2px; background: var(--f1-team, var(--green)); flex: none; }
.f1-pod__info { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.f1-pod__name { font-family: var(--font-display); font-size: 19px; font-weight: 700; color: var(--ink-strong); line-height: 1.2; }
.f1-pod__team { font-size: 11.5px; font-weight: 600; color: var(--muted); }
.f1-pod__time { font-size: 15px; font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.f1-pod__gap { font-size: 12px; font-weight: 700; color: var(--green-soft); }

/* ============================================================
   Хаб раздела
   ============================================================ */

/* ===== Дальше в сезоне: пять плиток ===== */
.f1-cards { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 12px; }
.f1-card {
  display: flex;
  flex-direction: column;
  gap: 8px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 14px;
  padding: 14px 16px;
  color: var(--ink);
  min-width: 0;
}
.f1-card:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
.f1-card__top { display: flex; align-items: center; gap: 8px; min-width: 0; }
.f1-card__flag { height: 11px; width: auto; border-radius: 2px; flex: none; }
.f1-card__meta { display: inline-flex; align-items: center; gap: 8px; min-width: 0; }
.f1-card__country { font-size: 11px; font-weight: 700; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.f1-card__round { margin-inline-start: auto; font-family: var(--font-display); font-size: 11px; font-weight: 700; color: var(--dim); }
.f1-card__name { font-size: 14px; font-weight: 700; color: var(--ink-strong); line-height: 1.25; }
.f1-card__date { font-size: 12px; font-weight: 700; color: var(--green-soft); margin-top: auto; }
/* Этап без утверждённой даты: у апстрима raceDate = null */
.f1-card__date--tbd { color: var(--dim); }
/* Метка спринтового уик-энда — золотая, как метка текущего этапа */
.f1-sprint {
  border: 1px solid rgba(229, 196, 83, 0.45);
  color: #E5C453;
  font-size: 8.5px;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  border-radius: var(--r-pill);
  padding: 2px 7px;
  flex: none;
}

/* ===== Лидеры зачётов: две карточки-ссылки к вкладке «Зачёты» ===== */
.f1-leaders { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.f1-leader {
  display: flex;
  align-items: center;
  gap: 14px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: 16px 20px;
  color: var(--ink);
  min-width: 0;
}
.f1-leader:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
.f1-leader__main { display: flex; flex-direction: column; gap: 3px; flex: 1; min-width: 0; }
.f1-leader__k { font-size: 10px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--dim); }
.f1-leader__who { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.f1-leader__who .f1-bar { height: 18px; }
.f1-leader__name {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 700;
  color: var(--ink-strong);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.f1-leader__team { font-size: 12.5px; font-weight: 600; color: var(--dim); white-space: nowrap; }
/* Очки и отрыв — на десктопе два соседних узла карточки, на телефоне одна строка */
.f1-leader__nums { display: contents; }
.f1-leader__pts { font-family: var(--font-display); font-size: 22px; font-weight: 700; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.f1-leader__gap { font-size: 12px; font-weight: 600; color: var(--dim); white-space: nowrap; }
.f1-leader__btn {
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-pill);
  padding: 7px 14px;
  font-size: 12px;
  font-weight: 700;
  color: var(--green-pale);
  white-space: nowrap;
}
.f1-leader:hover .f1-leader__btn { border-color: var(--hover-green-line); }

/* ===== Секция «Сезон»: вкладки Результаты / Календарь / Зачёты ===== */
.f1-yr__tabs { gap: 8px; }

/* Результаты: строки прошедших этапов */
.f1-past__head,
.f1-past {
  display: grid;
  grid-template-columns: 44px minmax(0, 1fr) 132px minmax(0, 1fr) 110px 20px;
  align-items: center;
  gap: 14px;
  padding: 11px 20px;
}
.f1-past__head {
  padding: 12px 20px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--dim);
}
/* Строка прошедшего этапа подсвечена цветом конюшни победителя: по левой
   полосе видно, кто взял гонку, ещё до чтения фамилии. */
.f1-past { position: relative; border-top: 1px solid rgba(255, 255, 255, 0.05); color: var(--ink); }
.f1-past:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
.f1-past::before {
  content: '';
  position: absolute;
  inset-inline-start: 0;
  top: 0;
  bottom: 0;
  width: 3px;
  background: var(--f1-team, transparent);
}
.f1-past__round { font-family: var(--font-display); font-size: 12px; font-weight: 700; color: var(--dim); }
.f1-past__gp { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.f1-past__name {
  font-size: 13.5px;
  font-weight: 700;
  color: var(--ink-strong);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.f1-past__date { font-size: 12.5px; font-weight: 600; color: var(--muted); }
.f1-past__win { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.f1-past__winner { font-size: 13px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; }
.f1-past__team { font-size: 11.5px; font-weight: 600; color: var(--f1-team, var(--green-soft)); white-space: nowrap; }
.f1-past__time { font-size: 12.5px; font-weight: 700; color: var(--ink-soft); text-align: end; font-variant-numeric: tabular-nums; }
/* Этап без победителя в календаре (апстрим ещё не дописал протокол) */
.f1-past__time--soon { color: var(--dim); font-weight: 600; font-variant-numeric: normal; }

/* Календарь: строки оставшихся этапов */
.f1-cal {
  display: grid;
  grid-template-columns: 44px minmax(0, 1fr) minmax(0, 1fr) 160px 20px;
  align-items: center;
  gap: 14px;
  padding: 13px 20px;
  border-top: 1px solid rgba(255, 255, 255, 0.05);
  color: var(--ink);
}
.f1-cal:first-child { border-top: none; }
.f1-cal:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
.f1-cal__round { font-family: var(--font-display); font-size: 12px; font-weight: 700; color: var(--dim); }
.f1-cal__gp { display: inline-flex; align-items: center; gap: 10px; min-width: 0; }
.f1-cal__name { font-size: 14px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.f1-cal__where { font-size: 12.5px; font-weight: 600; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.f1-cal__date { font-size: 12.5px; font-weight: 700; color: var(--green-soft); text-align: end; white-space: nowrap; }
.f1-cal__date.is-tbd { color: var(--dim); }

/* Зачёты: две таблицы рядом, ниже 940px — вкладками */
.f1-stand__grid { display: grid; grid-template-columns: minmax(0, 1fr) 420px; gap: 20px; align-items: start; }
.f1-stand__col { min-width: 0; }
/* Вкладки «Пилоты / Конструкторы» нужны только на узком экране: на десктопе
   обе колонки стоят рядом и переключать нечего. */
.f1-stand__tabs { display: none; margin-bottom: 12px; }

.f1-drv__head,
.f1-drv {
  display: grid;
  grid-template-columns: 34px minmax(0, 1fr) 190px 84px 74px;
  align-items: center;
  gap: 12px;
  padding: 9px 20px;
}
.f1-drv__head {
  padding: 12px 20px 8px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--dim);
}
.f1-drv { border-top: 1px solid rgba(255, 255, 255, 0.05); }
.f1-drv:hover { background: rgba(255, 255, 255, 0.03); }
.f1-pos { font-family: var(--font-display); font-size: 12px; font-weight: 700; color: var(--dim); }
/* Тройка лидеров — зелёным: она читается первой в любой таблице раздела */
.f1-pos.is-top { color: var(--green); }
.f1-drv__who { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.f1-drv__flag { width: 15px; height: 10px; border-radius: 2px; flex: none; }
.f1-drv__name {
  font-size: 13.5px;
  font-weight: 700;
  color: var(--ink-strong);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.f1-drv__code { font-family: var(--font-display); font-size: 9.5px; font-weight: 700; color: var(--dim); flex: none; }
.f1-drv__team { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.f1-drv__team span:last-child {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--ink-soft);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.f1-drv__pts { font-size: 14px; font-weight: 800; color: var(--ink-strong); text-align: end; font-variant-numeric: tabular-nums; }
.f1-drv__gap { font-size: 12px; font-weight: 600; color: var(--dim); text-align: end; font-variant-numeric: tabular-nums; }
/* Хвост зачёта раскрывается по кнопке (общий механизм data-collapsible) */
.f1-drv.is-extra { display: none; }
.is-open > .f1-drv.is-extra { display: grid; }
/* Нижнее поле — как боковые, по той же причине, что у .f1-sidelink: кнопка
   почти всегда последняя в карточке без паддинга (зачёт, решётка, протокол
   без сноски), и при 4px она ложилась на нижнюю рамку. */
.f1-more {
  display: block;
  width: calc(100% - 40px);
  margin: 10px 20px 20px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-row);
  padding: 10px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--green-pale);
  text-align: center;
}
.f1-more:hover { border-color: var(--hover-green-line); background: rgba(139, 233, 106, 0.07); }
/* Кнопка, нужная только телефону (решётка: десять чипов из двадцати двух) */
.f1-more--m { display: none; }

.f1-con { display: flex; flex-direction: column; gap: 6px; padding: 9px 20px; border-top: 1px solid rgba(255, 255, 255, 0.05); }
.f1-con:hover { background: rgba(255, 255, 255, 0.03); }
.f1-con__top { display: flex; align-items: center; gap: 10px; }
.f1-con__pos { font-family: var(--font-display); font-size: 11.5px; font-weight: 700; color: var(--dim); width: 16px; }
.f1-con__name { font-size: 13.5px; font-weight: 700; color: var(--ink-strong); flex: 1; min-width: 0; }
.f1-con__pts { font-size: 14px; font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
/* Бар — доля от очков лидера кубка: разрыв между конюшнями виден до чтения цифр */
.f1-con__bar { height: 5px; border-radius: 3px; background: rgba(255, 255, 255, 0.06); overflow: hidden; margin-inline-start: 26px; }
.f1-con__fill { display: block; height: 5px; border-radius: 3px; background: var(--f1-team, var(--green)); }

/* Баннер Telegram: горизонтальный вариант общей .home-cta */
.f1-tg { display: flex; align-items: center; gap: 20px; border-radius: var(--r-lg); padding: 22px 26px; }
.f1-tg__text { display: flex; flex-direction: column; gap: 5px; flex: 1; min-width: 0; }
.f1-tg .home-cta__text { margin-top: 0; }
.f1-tg .home-cta__btn { margin-top: 0; flex: none; font-weight: 800; padding: 12px 24px; }

/* ============================================================
   Страница Гран-при
   ============================================================ */

/* ===== Эфир ===== */
/* Заглушка до начала трансляции по пропорции будущего плеера (16:9). */
.f1-wait {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  aspect-ratio: 16 / 9;
  background: radial-gradient(70% 80% at 50% 45%, rgba(88, 219, 36, 0.07), transparent 72%), #0E140C;
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: 20px;
  text-align: center;
}
.f1-wait__title { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); }
.f1-wait__sub { font-size: 13px; font-weight: 600; color: var(--muted); }
/* Полоса над сценой: какой заезд включён (и вкладки языков настоящего плеера).
   Отдельной строкой, а не подписью внутри сцены, — над плеером она остаётся
   видна и когда сцену заменит настоящий кадр эфира. */
.f1-player__bar {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  padding: 11px 16px;
  border-bottom: 1px solid var(--line-soft);
}
/* Подпись заезда слева, вкладки языков (у настоящего плеера) — справа */
.f1-player__langs { display: inline-flex; align-items: center; gap: 8px; margin-inline-start: auto; }
.f1-player__live {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 12px;
  font-weight: 800;
  color: var(--red-live-text);
}
/* Тот же слот полосы, но до старта заезда: ни точки, ни красного — иначе
   полоса объявляет «В эфире» над плеером, который в эту минуту пишет
   «трансляция начнётся примерно за 20 минут». */
.f1-player__live--next { color: var(--ink); }
.f1-player .sm-player__stage {
  height: auto;
  aspect-ratio: 16 / 9;
  background: radial-gradient(560px 320px at 50% 30%, rgba(255, 69, 69, 0.09), transparent 70%), var(--bg-header);
}
.f1-player__tag {
  position: absolute;
  top: 14px;
  inset-inline-end: 14px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: rgba(12, 17, 11, 0.8);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-pill);
  padding: 6px 12px;
  font-size: 10.5px;
  font-weight: 700;
  color: var(--ink-soft);
}

/* ===== Трасса ===== */
.f1-circuit { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 20px; padding: 0 20px 20px; align-items: center; }
.f1-map { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.f1-map__img { display: block; width: 100%; height: 180px; object-fit: contain; }

/* ===== Стартовая решётка / порядок на трассе ===== */
/* Шахматка: чётные чипы сдвинуты вниз — так пары видно как ряды решётки, а не
   как две независимые колонки. */
.f1-startgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 20px; padding: 6px 20px 20px; align-items: start; }
.f1-slot {
  display: grid;
  grid-template-columns: 26px minmax(0, 1fr) auto;
  align-items: center;
  gap: 10px;
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid rgba(255, 255, 255, 0.07);
  border-inline-start: 3px solid var(--f1-team, rgba(255, 255, 255, 0.14));
  border-radius: var(--r-row);
  padding: 9px 12px;
}
.f1-slot:nth-child(even) { margin-top: 22px; }
.f1-slot__pos { font-family: var(--font-display); font-size: 12.5px; font-weight: 700; color: var(--dim); }
.f1-slot__pos.is-top { color: var(--green); }
.f1-slot__who { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.f1-slot__name { font-size: 12.5px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.f1-slot__team { font-size: 10px; font-weight: 600; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.f1-slot__t { font-size: 11px; font-weight: 700; color: var(--muted); font-variant-numeric: tabular-nums; }
/* Сессии ещё не было — вместо пустой сетки объяснение */
.f1-empty { padding: 0 20px 20px; font-size: 13px; font-weight: 600; line-height: 1.5; color: var(--muted); }

/* ===== Результаты этапа ===== */
/* Ряд вкладок внутри карточки без внутреннего паддинга. Сам ряд — общий
   .lb-tabs: на мобилке он превращается в горизонтальный скролл (99-responsive),
   и пять вкладок ведут себя как везде на сайте. */
.f1-tabs { gap: 6px; padding: 0 20px 14px; }
.f1-res__head,
.f1-res {
  display: grid;
  grid-template-columns: 38px minmax(0, 1fr) 176px 62px 116px 58px;
  align-items: center;
  gap: 12px;
  padding: 10px 20px;
}
.f1-res__head {
  border-top: 1px solid var(--line-soft);
  background: rgba(255, 255, 255, 0.02);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--dim);
}
/* Вкладки с тремя равными колонками справа (квалификация, пит-стопы, быстрые
   круги): там стоят три времени подряд, и «узкая — широкая — узкая» из вкладки
   гонки ломает выравнивание цифр по строкам. */
.f1-res--even .f1-res__head,
.f1-res--even .f1-res { grid-template-columns: 38px minmax(0, 1fr) 150px 84px 84px 84px; }
/* Пит-стопы: у заезда нет позиции — первая колонка не нужна */
.f1-res--pits .f1-res__head,
.f1-res--pits .f1-res { grid-template-columns: minmax(0, 1fr) 150px 84px 84px 84px; }
.f1-res { position: relative; border-top: 1px solid rgba(255, 255, 255, 0.05); }
.f1-res:hover { background: rgba(255, 255, 255, 0.03); }
.f1-res::before {
  content: '';
  position: absolute;
  inset-inline-start: 0;
  top: 0;
  bottom: 0;
  width: 3px;
  background: var(--f1-team, transparent);
}
/* Сход и неявка: строка приглушена целиком, чтобы «DNF» не читался как время */
.f1-res.is-out { opacity: 0.5; }
.f1-res.is-out .f1-res__time { color: var(--red-live-text); }
.f1-res__who { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.f1-res__num { font-family: var(--font-display); font-size: 10px; font-weight: 700; color: var(--faint); width: 20px; flex: none; }
.f1-res__name { font-size: 13.5px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.f1-res__code { font-family: var(--font-display); font-size: 9.5px; font-weight: 700; color: var(--dim); flex: none; }
.f1-res__team { display: inline-flex; align-items: center; gap: 9px; min-width: 0; }
.f1-res__team span:last-child {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--ink-soft);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.f1-res__laps { font-size: 12.5px; font-weight: 600; color: var(--muted); text-align: end; font-variant-numeric: tabular-nums; }
.f1-res__time { font-size: 12.5px; font-weight: 700; color: var(--ink-soft); text-align: end; font-variant-numeric: tabular-nums; }
.f1-res__pts { font-size: 13px; font-weight: 800; color: var(--ink-strong); text-align: end; font-variant-numeric: tabular-nums; }
.f1-res__pts.is-zero { color: var(--faint); }
.f1-res.is-extra { display: none; }
.is-open > .f1-res.is-extra { display: grid; }
.f1-res__note { padding: 12px 20px 16px; border-top: 1px solid var(--line-soft); font-size: 10.5px; color: var(--dim); line-height: 1.5; }

/* ============================================================
   Сайдбар Гран-при
   ============================================================ */

/* Мини-зачёт сайдбара */
.f1-mini {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr) 52px;
  align-items: center;
  gap: 10px;
  padding: 9px 20px;
  border-top: 1px solid rgba(255, 255, 255, 0.05);
}
.f1-mini__pos { font-family: var(--font-display); font-size: 11.5px; font-weight: 700; color: var(--dim); }
.f1-mini__pos.is-top { color: var(--green); }
.f1-mini__who { display: inline-flex; align-items: center; gap: 8px; min-width: 0; }
.f1-mini__who .f1-bar { height: 15px; }
.f1-mini__name { font-size: 13px; font-weight: 700; color: var(--ink-strong); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.f1-mini__pts { font-size: 13px; font-weight: 800; color: var(--ink-strong); text-align: end; font-variant-numeric: tabular-nums; }
/* Ссылка-кнопка под списком («Весь зачёт сезона →»). Нижнее поле — как
   боковые: у карточки (.lb-card--clip) своего паддинга нет, и при 2px
   кнопка ложилась на нижний край рамки. */
.f1-sidelink {
  display: block;
  margin: 12px 20px 20px;
  text-align: center;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--r-row);
  padding: 10px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--green-pale);
}
.f1-sidelink:hover { border-color: var(--hover-green-line); color: var(--green-pale); }

/* Соседние этапы: прошлый и следующий, одинаковые карточки со звездой */
.f1-nbs { display: flex; flex-direction: column; gap: 20px; }
.f1-nb { display: flex; flex-direction: column; gap: 8px; padding: 18px 20px; color: var(--ink); }
.f1-nb:hover { border-color: rgba(139, 233, 106, 0.45); color: var(--ink); }
.f1-nb__top { display: flex; align-items: center; gap: 8px; }
.f1-nb__top .lb-star { margin-inline-start: auto; }
.f1-nb__k { font-size: 10px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.f1-nb--next .f1-nb__k { color: var(--green-soft); }
.f1-nb__name { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); }
.f1-nb__when { font-size: 12px; font-weight: 600; color: var(--muted); }

/* Блок «Ставки» — общий .sm-bk__* из 19-sports.css: кэфов на Гран-при
   апстрим не отдаёт, поэтому вместо сетки рисуется .sm-bk__cta. */

/* CTA Telegram в сайдбаре — как home-cta, но с радиусом 18 из макета */
.f1-cta { border-radius: var(--r-lg); }

/* ============================================================
   Адаптив Формулы 1 (брейкпоинты как у остальных разделов)
   ============================================================ */

/* Планшет: резиновый контейнер */
@media (max-width: 1180px) {
  /* 100%, а не auto: body — флекс-колонка, с auto обёртка ужимается по
     содержимому (см. .mt-page в 99-responsive и .sm-mgrid в 19-sports). */
  .f1-page { width: 100%; max-width: 1140px; padding-inline-start: 20px; padding-inline-end: 20px; }
  .f1-hero__art { inset-inline-end: -80px; }
}

/* Узкий десктоп / планшет: колонки в столбик */
@media (max-width: 940px) {
  .f1-grid,
  .f1-circuit { grid-template-columns: minmax(0, 1fr); }
  .f1-hero__main { flex-direction: column; align-items: stretch; gap: 18px; padding: 22px 20px 20px; }
  .f1-hero__cta { align-self: stretch; }
  .f1-hero__cta .f1-btn { flex: 1; }
  .f1-hero__shade { width: 100%; }
  .f1-podium { grid-template-columns: minmax(0, 1fr); padding: 0 20px 20px; }
  .f1-pod { height: 150px; }
  .f1-pod__photo { width: 104px; height: 150px; }
  .f1-pod__ghost { font-size: 48px; }
  .f1-cards { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  /* Карточка лидера и так целиком ссылка — кнопке внутри места нет */
  .f1-leader__btn { display: none; }
  /* Зачёты переключаются вкладками: две таблицы стопкой — это два экрана
     прокрутки подряд, между которыми нечего сравнивать. */
  .f1-stand__grid { grid-template-columns: minmax(0, 1fr); }
  .f1-stand__tabs { display: flex; }
  .f1-stand__col:not(.is-active) { display: none; }
  /* Результаты и календарь: дата и победитель (автодром) уезжают под название,
     время остаётся справа */
  .f1-past__head { display: none; }
  .f1-past {
    grid-template-columns: 24px auto minmax(0, 1fr) auto auto;
    grid-template-areas: "round gp gp time star" "round date win time star";
    gap: 2px 10px;
    padding-block: 11px; padding-inline: 16px 14px;
  }
  .f1-past__round { grid-area: round; }
  .f1-past__gp { grid-area: gp; }
  .f1-past__date { grid-area: date; font-size: 11px; }
  .f1-past__win { grid-area: win; gap: 6px; }
  .f1-past__winner,
  .f1-past__team { font-size: 11px; font-weight: 600; }
  .f1-past__winner { color: var(--muted); }
  .f1-past__time { grid-area: time; font-size: 11.5px; }
  .f1-past .lb-star { grid-area: star; }
  .f1-cal {
    grid-template-columns: 24px minmax(0, 1fr) auto auto;
    grid-template-areas: "round gp date star" "round where date star";
    gap: 2px 10px;
    padding: 11px 14px;
  }
  .f1-cal__round { grid-area: round; }
  .f1-cal__gp { grid-area: gp; }
  .f1-cal__where { grid-area: where; font-size: 11px; }
  .f1-cal__date { grid-area: date; font-size: 11.5px; }
  .f1-cal .lb-star { grid-area: star; }
}

/* Мобилка */
@media (max-width: 600px) {
  .f1-page { padding-inline-start: 16px; padding-inline-end: 16px; gap: 20px; }
  .f1-page--hub { gap: 24px; }
  .f1-head { gap: 8px; }
  .f1-head h1 { font-size: 19px; }
  /* Пилюли сезонов — справа от заголовка, на его строке (как в макете).
     Пилюль остаётся три: в 390px четыре рядом с заголовком не встают. */
  .f1-head h1 { flex: 1; }
  .f1-season { order: 2; font-size: 11.5px; padding: 6px 12px; }
  .f1-head .f1-season:nth-of-type(n + 4) { display: none; }

  /* Шапка этапа */
  .f1-hero__art { inset-inline-end: -90px; top: -40px; width: 340px; height: 220px; opacity: 0.18; }
  .f1-hero__shade { height: 230px; background: linear-gradient(var(--to-end), var(--panel) 0%, rgba(17, 23, 15, 0) 70%); }
  .f1-hero__main { padding: 16px 16px 14px; gap: 12px; }
  .f1-hero__body { gap: 10px; }
  .f1-hero__tags { gap: 8px; }
  .f1-hero__tags .ufc-tag { font-size: 9.5px; padding: 5px 10px; }
  .f1-hero__round { font-size: 10.5px; letter-spacing: 0.06em; }
  .f1-hero__official { display: none; }   /* официальное имя не помещается ни в одну строку */
  .f1-hero__name { font-size: 21px; line-height: 1.15; }
  .f1-hero__title .f1-flag--lg { height: 16px; }
  .f1-hero__sub { font-size: 12px; }
  .f1-btn { width: 100%; font-size: 13.5px; padding: 13px; }
  .f1-cd { margin-top: 4px; gap: 6px; }
  .f1-cd .ufc-cd__cell { flex: 1; width: auto; height: 60px; border-radius: 11px; gap: 3px; }
  .f1-cd .ufc-cd__num { font-size: 19px; }
  .f1-cd .ufc-cd__lbl { font-size: 8.5px; letter-spacing: 0.1em; }
  .f1-run { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 4px; }
  .f1-run__box { height: 60px; padding: 0 8px; border-radius: 11px; gap: 3px; }
  .f1-run__num { font-size: 19px; }
  .f1-run__who { font-size: 15px; }
  .f1-run__lbl { font-size: 8.5px; letter-spacing: 0.1em; }

  /* Полоса уик-энда — вертикальный список: время · день · название · статус */
  .f1-wk { display: flex; flex-direction: column; }
  .f1-wk__note { padding: 12px 16px; font-size: 12px; }
  .f1-wk__cell {
    display: grid;
    grid-template-columns: 52px 24px minmax(0, 1fr) auto;
    align-items: center;
    gap: 8px;
    padding-block: 10px; padding-inline: 18px 16px;
    border-inline-start: 0;
    border-top: 1px solid rgba(255, 255, 255, 0.05);
  }
  .f1-wk__top { display: contents; }
  .f1-wk__time { font-size: 14px; }
  .f1-wk__day { font-size: 10.5px; }
  .f1-wk__live { display: none; }   /* на телефоне идущий заезд помечает красная точка у статуса */
  .f1-wk__name { font-size: 12.5px; }
  .f1-wk__sub { min-height: 0; max-width: 130px; text-align: end; font-size: 10.5px; font-weight: 700; }
  .f1-wk__run { display: inline-flex; align-items: center; gap: 5px; }
  .f1-wk__run::before { content: ''; width: 5px; height: 5px; border-radius: 50%; background: var(--red-live); animation: lbPulse 1.2s ease infinite; flex: none; }
  .f1-wk__runk { display: none; }

  /* Подиум: карточки ниже, имя с фамилией в одну строку */
  .f1-podium { padding: 0 16px 16px; gap: 8px; }
  .f1-pod { height: 96px; border-radius: 14px; align-items: center; }
  .f1-pod__photo { width: 72px; height: 96px; }
  .f1-pod__ghost { font-size: 44px; inset-inline-end: 12px; top: 6px; }
  .f1-pod__body { align-items: center; padding-block: 0; padding-inline: 12px 14px; }
  .f1-pod__bar { align-self: auto; height: 60px; }
  .f1-pod__info { gap: 4px; }
  .f1-pod__name { font-size: 14px; }
  .f1-pod__name br { display: none; }
  .f1-pod__team { font-size: 10.5px; }
  .f1-pod__time { font-size: 12.5px; }
  .f1-pod__gap { font-size: 11px; }

  /* Дальше в сезоне — строки: этап · флаг · название · дата · звезда в первом
     ряду, под названием — .f1-card__meta (плашка «Спринт»; страны у сайта нет,
     апстрим её не отдаёт, в макете она демо). Всё, кроме метки, стоит в ПЕРВОМ
     ряду: раньше флаг, этап, дата и звезда центрировались по высоте обоих
     рядов, и у спринтовой карточки название уезжало вверх от флага и даты
     (отзыв 30.09.2026). В один ряд с названием метку не ставим: на телефоне
     «ГП Сингапура» рядом с ней обрезается многоточием. У карточки без метки
     второй ряд пустой и высоты не занимает. */
  .f1-cards { display: flex; flex-direction: column; gap: 8px; }
  .f1-card {
    display: grid;
    grid-template-columns: auto auto minmax(0, 1fr) auto auto;
    grid-template-areas: "round flag name date star" ". . meta . .";
    align-items: center;
    gap: 2px 11px;
    padding: 12px 14px;
  }
  .f1-card__top { display: contents; }
  .f1-card__round { grid-area: round; margin-inline-start: 0; font-size: 12px; }
  .f1-card__flag { grid-area: flag; height: 13px; }
  .f1-card__name { grid-area: name; font-size: 13.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .f1-card__meta { grid-area: meta; }
  .f1-card__date { grid-area: date; margin-top: 0; font-size: 11.5px; text-align: end; }
  .f1-card .lb-star { grid-area: star; }

  /* Лидеры — две компактные карточки в ряд */
  .f1-leaders { gap: 8px; }
  .f1-leader { flex-direction: column; align-items: flex-start; gap: 6px; padding: 12px 14px; border-radius: 14px; }
  .f1-leader__k { font-size: 9px; letter-spacing: 0.1em; }
  .f1-leader__who .f1-bar { height: 15px; }
  .f1-leader__name { font-size: 14px; white-space: normal; }
  .f1-leader__team { display: none; }
  .f1-leader__nums { display: flex; align-items: baseline; gap: 6px; min-width: 0; font-size: 12px; font-weight: 600; color: var(--muted); }
  .f1-leader__pts { font-family: var(--font-text); font-size: 12px; font-weight: 800; }
  .f1-leader__gap { white-space: normal; }
  .f1-leader__gap::before { content: '· '; }

  /* Сезон: заголовок над вкладками, вкладки на всю ширину */
  .f1-yr .ufc-sec__head { flex-direction: column; align-items: stretch; gap: 10px; margin-bottom: 10px; }
  .f1-yr__tabs { gap: 6px; flex-wrap: nowrap; }
  .f1-yr__tabs .lb-pill { flex: 1; justify-content: center; padding: 9px 0; font-size: 12px; }
  .f1-stand__tabs { margin-bottom: 10px; }
  .f1-stand__tabs .lb-pill { flex: 1; justify-content: center; padding: 8px 0; font-size: 11.5px; }

  .f1-drv__head { display: none; }
  /* Команда уезжает под фамилию, очки и отставание стопкой справа */
  .f1-drv {
    grid-template-columns: 22px minmax(0, 1fr) auto;
    grid-template-areas: "pos who pts" "pos team gap";
    row-gap: 2px;
    padding: 9px 14px;
  }
  .f1-pos { font-size: 11px; }
  /* grid-area — только внутри зачёта: .f1-pos стоит и в строках результатов
     Гран-при, а там именованных областей нет. Без области «pos» отправлял
     позицию в неявную пятую колонку второй строкой, фамилия вставала в
     колонку 32px и обрезалась до одной буквы. */
  .f1-drv .f1-pos { grid-area: pos; }
  .f1-drv__who { grid-area: who; }
  .f1-drv__team { grid-area: team; }
  .f1-drv__team .f1-bar { height: 11px; }
  .f1-drv__team span:last-child { font-size: 10.5px; }
  .f1-drv__pts { grid-area: pts; }
  .f1-drv__gap { grid-area: gap; font-size: 10px; }
  .f1-con { padding: 9px 14px; }
  .f1-more,
  .f1-sidelink { width: calc(100% - 28px); margin-inline-start: 14px; margin-inline-end: 14px; }
  .f1-more,
  .f1-sidelink { margin-block-end: 14px; }

  .f1-tg { flex-direction: column; align-items: flex-start; padding: 16px; gap: 10px; border-radius: var(--r-card); }
  .f1-tg .home-cta__btn { align-self: stretch; }

  /* Страница Гран-при */
  .f1-wait { gap: 6px; padding: 16px; border-radius: var(--r-card); }
  .f1-wait__title { font-size: 13.5px; }
  .f1-wait__sub { font-size: 12px; }
  .f1-player__bar { padding: 10px 12px; }
  .f1-cardhead { padding: 14px 16px 10px; }
  .f1-cardhead h2 { font-size: 14px; }
  /* Трасса: схема сверху, строки под ней */
  .f1-circuit { padding: 0 16px 16px; gap: 10px; }
  .f1-circuit .f1-map { order: -1; }
  .f1-map__img { height: 130px; }
  .sm-info__row .f1-flag { display: none; }
  /* Решётка: две колонки чипов без команды, первые десять, остальные по кнопке */
  .f1-startgrid { gap: 6px 10px; padding: 6px 16px 12px; }
  .f1-slot {
    grid-template-columns: 22px minmax(0, 1fr);
    grid-template-areas: "pos who" "pos t";
    gap: 1px 8px;
    padding: 7px 10px;
    border-radius: 9px;
  }
  .f1-slot:nth-child(even) { margin-top: 16px; }
  .f1-slot__pos { grid-area: pos; font-size: 11px; }
  .f1-slot__who { grid-area: who; }
  .f1-slot__name { font-size: 12px; }
  .f1-slot__team { display: none; }
  .f1-slot__t { grid-area: t; font-size: 9.5px; font-weight: 600; color: var(--dim); }
  .f1-gridbox:not(.is-open) .f1-slot:nth-child(n + 11) { display: none; }
  .f1-more--m { display: block; margin-top: 2px; }
  .f1-empty { padding: 0 16px 16px; }
  .f1-tabs { padding: 0 16px 12px; }

  /* Результаты: команда и первая из правых колонок уезжают, остаются позиция,
     пилот и два последних числа. Ширины правых колонок фиксированные (каждая
     строка — свой grid, auto разъехалось бы по строкам) и подобраны под самое
     широкое значение своей вкладки: гонка — «1:39:56.180» и очки; вкладки с
     тремя временами (квалификация, практики, пит-стопы) — «1:15.884» и
     «21.412 c»; быстрые круги — скорость с единицей «197,4 км/ч», ей нужно
     76px. Одна ширина на всех не годится: в 44px гонки времена не влезали и
     уходили под обрез карточки, а 76px на квалификации отнимали бы у фамилии
     16px, которых ей на 375px и так впритык. */
  .f1-res__head { display: none; }
  .f1-res { grid-template-columns: 32px minmax(0, 1fr) 86px 44px; padding: 10px 16px; gap: 8px; }
  .f1-res--even .f1-res { grid-template-columns: 32px minmax(0, 1fr) 60px 62px; }
  .f1-res--pits .f1-res { grid-template-columns: minmax(0, 1fr) 60px 62px; }
  .f1-res--wide .f1-res { grid-template-columns: 32px minmax(0, 1fr) 60px 76px; }
  /* Номер и трёхбуквенный код уезжают вместе с командой: без них фамилия
     помещается целиком, а с ними обрезалась до «Ландо …» */
  .f1-res__team,
  .f1-res__laps,
  .f1-res__num,
  .f1-res__code { display: none; }
  .f1-res__note { padding: 12px 16px 14px; }

  .f1-mini { padding: 8px 16px; }
  /* Соседние этапы — в ряд; единственная карточка (у завершённого этапа
     прошлого нет) занимает ряд целиком, а не половину */
  .f1-nbs { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
  .f1-nb:only-child { grid-column: 1 / -1; }
  .f1-nb { padding: 12px 14px; gap: 6px; border-radius: 14px; }
  .f1-nb__k { font-size: 9px; letter-spacing: 0.08em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .f1-nb__name { font-size: 12.5px; line-height: 1.25; }
  .f1-nb__when { font-size: 11px; }
  .f1-cta { border-radius: var(--r-card); }
}

/* ===== partials/27-tennis.css ===== */
/* ===== Теннис — раздел (tn-, tnm-) =====
   Дизайн v2 — хендофф «Теннис v2» от 15.09.2026 (design_handoff_tennis_v2):
   витрина /tennis как «эфирный хаб» (макет tennis.html), турнир
   (tennis-tournament.html), матч (tennis-match.html), рейтинги
   (tennis-rankings.html), календарь (tennis-calendar.html). Страницы игрока
   нет: имена в табло и рейтингах — текст, ссылок с них никуда не ведёт.

   Общее с соседями берём готовым: карточка турнира в ленте — .home-group
   футбола и хоккея (10-home), сегментный контрол — .home-seg, пилюли —
   .lb-pill, сайдбар — .sm-card / .sm-info / .sm-bk (19-sports), CTA Telegram —
   .home-cta. Своё здесь: афиша с табло кортов, строка матча (у тенниса нет
   логотипов команд, зато есть флаги, сеты по одному, очки в гейме и
   подающий), карточки событий, табло матча с мобильной «дуэлью», статистика,
   розыгрыши по очкам, подиум и таблица рейтинга, календарь. Плашка .tn-tag —
   копия .ufc-tag под своим именем: раздел не должен ломаться от правки UFC.

   Цвета вне токенов: ячейка табло кортов #080B07 (hover #0E130C) — темнее
   любой карточки, чтобы табло читалось врезкой в постер; золото Шлема,
   брейк-пойнта и прерванного матча #E5C453; второй игрок в статистике
   #49B2D3. Пять колонок сетов везде зарезервированы (кроме телефона):
   цифры должны стоять столбцами по всей ленте. */

.tn-page { display: flex; flex-direction: column; gap: 28px; padding: 24px 0 12px; }
.tn-page--tour, .tn-page--match { gap: 20px; }
.tn-page--cal, .tn-page--ranks { gap: 24px; }
.tn-head { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.tn-h1 { font-size: 26px; }
.tn-subnav { display: flex; align-items: center; gap: 8px; margin-inline-start: auto; }
.tn-sec { display: flex; flex-direction: column; }
.tn-sec__head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.tn-sec__head .lb-h2 { flex: 1; min-width: 0; }
.tn-sec__note { font-size: 12px; font-weight: 600; color: var(--dim); }
.tn-sec__link { font-size: 12px; font-weight: 700; color: var(--muted); white-space: nowrap; }
.tn-sec__link:hover { color: var(--green-pale); }
.tn-sec__link--m { display: none; }
.tn-empty { color: var(--dim); font-size: 14px; font-weight: 600; text-align: center; padding: 28px; }
.tn-flag { width: 16px; height: 12px; object-fit: cover; border-radius: 2px; flex: none; vertical-align: -1px; }
.tn-flag--sm { width: 14px; height: 10px; }
.tn-flag--xs { width: 12px; height: 9px; }
.tn-flag--lg { width: 20px; height: 15px; }

/* Плашка-метка — форма .ufc-tag: капс 10.5/800, пилюля с рамкой. */
.tn-tag {
  display: inline-flex; align-items: center; gap: 7px;
  background: rgba(12, 17, 11, 0.8); border: 1px solid var(--line-strong);
  color: var(--ink-soft); font-size: 10.5px; font-weight: 800;
  letter-spacing: 0.1em; text-transform: uppercase;
  border-radius: var(--r-pill); padding: 6px 13px; flex: none;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.tn-tag--green { background: var(--green); border-color: var(--green); color: var(--on-green); }
.tn-tag--gold { border-color: rgba(229, 196, 83, 0.5); color: #E5C453; }
.tn-tag--live { border-color: rgba(229, 57, 53, 0.45); color: var(--red-live-text); }
.tn-tag--done { border-color: rgba(139, 233, 106, 0.4); color: var(--green-soft); }
.tn-tag--soft { color: var(--ink-soft); }
.tn-tag--dim { color: var(--muted); }
.tn-tag .lb-live-dot { width: 6px; height: 6px; }

/* ===== Афиша турнира (витрина) и шапка турнира — один контейнер ===== */
.tn-hero {
  position: relative; overflow: hidden;
  background: radial-gradient(640px 320px at 12% 40%, rgba(88, 219, 36, 0.12), transparent 70%), var(--bg-header);
  border: 1px solid var(--line); border-radius: var(--r-xl); color: var(--ink);
}
.tn-hero__top { position: relative; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 28px; padding: 26px 32px 24px; }
.tn-tour .tn-hero__top { padding-bottom: 22px; }
.tn-hero__logo {
  width: 104px; height: 104px; flex: none; overflow: hidden;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(255, 255, 255, 0.04); border: 1px solid var(--line-strong); border-radius: 24px;
  color: var(--green-soft);
}
.tn-hero__logo.has-img { background: #FFFFFF; }
.tn-hero__logo img { width: 80px; height: 80px; object-fit: contain; }
.tn-hero__logo svg { width: 44px; height: 44px; }
.tn-hero__body { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.tn-hero__tags { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.tn-hero__sub { font-size: 12.5px; font-weight: 600; color: var(--muted); }
.tn-hero__star { flex: none; }
.tn-hero__title { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; font-family: var(--font-display); font-size: 34px; font-weight: 700; line-height: 1.1; color: var(--ink-strong); margin: 0; }
.tn-hero__title:hover { color: var(--ink-strong); }
.tn-hero__season { font-size: 20px; font-weight: 500; color: var(--dim); }
.tn-hero__meta { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; font-size: 14px; font-weight: 600; color: var(--ink-soft); }
.tn-hero__meta i { color: var(--dim); font-style: normal; }
.tn-hero__cta {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  background: var(--green); color: var(--on-green); font-weight: 800; font-size: 15px;
  border-radius: var(--r-pill); padding: 15px 30px; white-space: nowrap;
  box-shadow: 0 12px 32px rgba(88, 219, 36, 0.28);
}
.tn-hero__cta:hover { background: var(--green-hover); color: var(--on-green); }
/* Призрачная кнопка: «Эфир в 18:45 →» до окна, «Результаты ↓» у завершённого. */
.tn-hero__cta--ghost { background: rgba(255, 255, 255, 0.05); border: 1px solid var(--line-strong); color: var(--ink); padding: 14px 28px; box-shadow: none; }
.tn-hero__cta--ghost:hover { background: rgba(255, 255, 255, 0.05); border-color: var(--hover-green-line); color: var(--green-pale); }

/* ===== Табло кортов под постером ===== */
.tn-board { border-top: 1px solid rgba(255, 255, 255, 0.07); }
.tn-board__kicker { padding: 11px 22px 10px; background: #080B07; border-bottom: 1px solid rgba(255, 255, 255, 0.07); font-size: 10px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
/* gap в 1px на фоне линии даёт вертикальные разделители между ячейками. */
.tn-board__rows { display: flex; gap: 1px; background: var(--line-soft); }
.tn-board__cell {
  flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 7px;
  padding-block: 12px; padding-inline: 22px 20px; background: #080B07; color: var(--ink);
}
.tn-board__cell:hover { background: #0E130C; color: var(--ink); }
.tn-board__head { display: flex; align-items: center; gap: 8px; min-width: 0; font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); white-space: nowrap; }
.tn-board__st { display: inline-flex; align-items: center; gap: 5px; color: var(--muted); }
.tn-board__st .lb-live-dot { display: none; width: 5px; height: 5px; }
.tn-board__st.is-live { color: var(--red-live-text); }
.tn-board__st.is-live .lb-live-dot { display: inline-block; }
.tn-board__st.is-susp { color: #E5C453; }
.tn-board__when { color: var(--green-soft); }
.tn-board__cat { overflow: hidden; text-overflow: ellipsis; }
.tn-board__round, .tn-board__catfull { display: none; }
.tn-board__hot { margin-inline-start: auto; color: var(--green-soft); }
.tn-board__side { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: 10px; }
.tn-board__name { display: flex; align-items: center; gap: 7px; min-width: 0; font-size: 13px; font-weight: 700; color: var(--ink-strong); }
.tn-board__nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tn-board__srv { order: 0; margin-inline-start: 0; }
.tn-board__cells { display: flex; align-items: center; gap: 4px; font-variant-numeric: tabular-nums; }
.tn-board__sets, .tn-board__set, .tn-board__gp {
  display: inline-flex; align-items: center; justify-content: center; flex: none;
  font-family: var(--font-display); font-weight: 700; border-radius: 6px;
}
.tn-board__sets { width: 26px; height: 24px; font-size: 13px; background: rgba(255, 255, 255, 0.07); color: var(--ink); margin-inline-end: 4px; }
.tn-board__sets.is-lead { background: rgba(88, 219, 36, 0.14); color: var(--green-soft); }
.tn-board__set { width: 22px; height: 24px; font-size: 12px; background: rgba(255, 255, 255, 0.04); color: var(--ink); }
.tn-board__set.is-won { background: rgba(255, 255, 255, 0.09); color: var(--ink-strong); }
.tn-board__set.is-lost { background: rgba(255, 255, 255, 0.04); color: var(--dim); }
.tn-board__set.is-now { background: rgba(255, 69, 69, 0.12); color: var(--red-live-text); }
[data-susp] .tn-board__set.is-now { background: rgba(255, 255, 255, 0.06); color: var(--ink-soft); }
.tn-board__set sup { font-size: 8px; line-height: 0; margin-inline-start: 1px; color: var(--dim); font-family: var(--font-text); font-weight: 700; }
.tn-board__set sup[hidden] { display: none; }
.tn-board__gp { min-width: 30px; height: 24px; padding: 0 5px; margin-inline-start: 4px; font-family: var(--font-text); font-size: 11.5px; font-weight: 800; background: rgba(255, 255, 255, 0.05); color: var(--muted); }
.tn-board__gp.is-serving { background: rgba(255, 69, 69, 0.14); color: var(--red-live-text); }
/* Полоса (3+ кортов и фолбэк): только текущий/последний сет — прячем каждую
   ячейку сета, за которой есть ещё видимая. Поллинг, открыв ячейку нового
   сета, тем самым спрячет предыдущую. */
.tn-board--strip .tn-board__set:has(~ .tn-board__set:not([hidden])) { display: none; }
/* Две половины: все сеты, круг в шапке, крупнее ячейки. */
.tn-board--two .tn-board__cell { padding: 16px 28px 17px; gap: 9px; }
.tn-board--two .tn-board__head { font-size: 10.5px; }
.tn-board--two .tn-board__round { display: inline; }
.tn-board--two .tn-board__round::before { content: "·"; margin-inline-end: 8px; }
.tn-board--two .tn-board__side { column-gap: 16px; }
.tn-board--two .tn-board__name { font-size: 15px; gap: 9px; }
.tn-board--two .tn-board__name .tn-flag { width: 18px; height: 13px; }
.tn-board--two .tn-board__srv { width: 8px; height: 8px; }
.tn-board--two .tn-board__cells { gap: 5px; }
.tn-board--two .tn-board__sets { width: 34px; height: 32px; font-size: 16px; border-radius: 8px; margin-inline-end: 6px; }
.tn-board--two .tn-board__set { width: 30px; height: 32px; font-size: 15px; border-radius: 8px; }
.tn-board--two .tn-board__gp { min-width: 40px; height: 32px; padding: 0 7px; font-size: 13px; border-radius: 8px; margin-inline-start: 6px; }
/* Один корт — крупно на всю ширину: шапка становится левой колонкой. */
.tn-board--one .tn-board__cell { display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: 0; padding: 0; }
.tn-board--one .tn-board__head { grid-row: 1 / span 2; flex-direction: column; align-items: flex-start; justify-content: center; gap: 7px; padding: 20px 26px; border-inline-end: 1px solid var(--line-soft); white-space: normal; font-size: 10.5px; letter-spacing: 0.1em; }
.tn-board--one .tn-board__st .lb-live-dot { width: 6px; height: 6px; }
.tn-board--one .tn-board__cat { display: none; }
.tn-board--one .tn-board__round { display: block; font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--ink-strong); line-height: 1.1; text-transform: none; letter-spacing: 0; }
.tn-board--one .tn-board__catfull { display: block; font-family: var(--font-text); font-size: 12.5px; font-weight: 600; color: var(--muted); text-transform: none; letter-spacing: 0; }
.tn-board--one .tn-board__hot { margin: 4px 0 0; align-self: flex-start; border: 1px solid rgba(139, 233, 106, 0.45); border-radius: var(--r-pill); padding: 4px 10px; font-size: 10px; }
.tn-board--one .tn-board__side { padding: 18px 32px 0; column-gap: 24px; }
.tn-board--one .tn-board__side + .tn-board__side { padding: 10px 32px 18px; }
.tn-board--one .tn-board__name { font-family: var(--font-display); font-size: 21px; gap: 12px; line-height: 1.1; }
.tn-board--one .tn-board__name .tn-flag { width: 22px; height: 16px; border-radius: 3px; }
.tn-board--one .tn-board__srv { width: 9px; height: 9px; box-shadow: 0 0 0 4px rgba(88, 219, 36, 0.18); }
.tn-board--one .tn-board__cells { gap: 6px; }
.tn-board--one .tn-board__sets { width: 46px; height: 44px; font-size: 22px; border-radius: 10px; margin-inline-end: 10px; }
.tn-board--one .tn-board__set { width: 40px; height: 44px; font-size: 20px; border-radius: 10px; }
.tn-board--one .tn-board__set sup { font-size: 9px; margin-inline-start: 2px; }
.tn-board--one .tn-board__gp { min-width: 54px; height: 44px; padding: 0 10px; font-family: var(--font-display); font-size: 17px; font-weight: 700; border-radius: 10px; margin-inline-start: 10px; }

/* ===== Лента дня: карточка турнира, строка матча =====
   Тулбар над лентой (лента дней, поиск, сегменты, тумблер трансляции) —
   общий .home-tb из 10-home, тот же, что на главной, в хоккее и баскетболе
   (с 22.09.2026, «как на футболе, только без сортировки»); своих правил у
   него здесь нет. */
.tn-feed { gap: 12px; }
.tn-group__head { padding: 12px 18px; gap: 12px; }
.tn-group__logo { width: 22px; height: 22px; object-fit: contain; flex: none; border-radius: 5px; background: #FFFFFF; padding: 2px; }
.tn-group__ico { display: inline-flex; align-items: center; justify-content: center; background: none; padding: 0; color: var(--green-soft); }
.tn-group__ico svg { width: 18px; height: 18px; }
/* Название и подпись «разряд · флаг» — в одну строку через точку, как страна
   у лиги в футболе: общий .lb-titled (00-core) режет название и подпись по
   отдельности, точку рисует ::before общего .home-group__country (10-home).
   Второй строкой подпись шла до 22.09.2026 («вторую строчку пиши как в
   футболе рядом»). Название разводит шапку вправо (margin auto): у звезды
   тенниса нет home-group__star с его auto-отступом. Подпись не сжимается
   (flex: none, перебивает flex-shrink: 999 из .lb-titled): она короткая,
   а ужиматься должно название. Точка к тексту — 8px, как в футболе: 2px
   своих плюс 6px зазора инлайн-флекса, тот же зазор до флага. */
.tn-group__name { font-size: 14px; font-weight: 800; color: var(--ink-strong); margin-inline-end: auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tn-group__sub { display: inline-flex; align-items: center; gap: 6px; }
.tn-group__name .tn-group__sub { flex: none; }
.tn-group__sub::before { margin-inline-end: 2px; }
.tn-group__star { flex: none; }
/* Класс home-group__count у счётчика — защита от app.js (initGroupCounts
   дорисовывает свой, если этого класса в шапке нет); его margin-left:auto из
   10-home здесь гасится — вправо шапку разводит название (.tn-group__name). */
.tn-group__count { display: inline-flex; align-items: center; gap: 6px; margin-inline-start: 0; font-size: 11.5px; font-weight: 600; color: var(--muted); white-space: nowrap; }
.tn-group__live { display: inline-flex; align-items: center; gap: 5px; color: var(--red-live-text); font-weight: 800; }
.tn-group__live .lb-live-dot { width: 5px; height: 5px; }
.tn-group__chev { display: inline-flex; color: var(--dim); transition: transform 0.2s; }
.tn-group.is-open .tn-group__chev { transform: rotate(180deg); }

/* Строка матча — таблица на два ряда, по ряду на игрока (13.09.2026; до этого
   была одна строка «игрок — счёт — игрок», где сеты, геймы и очки стояли
   столбиком в одной колонке и различались только кеглем).

   Колонки: звезда · время/статус · имя · сеты · пять колонок геймов · очки в
   гейме · воздух · стрелка. Колонок геймов ровно пять (максимум матча) и
   ширина за ними закреплена даже когда сет не сыгран: цифры должны стоять
   столбцами по всей ленте, иначе таблица не читается. Имя ограничено 30ch,
   пустота уходит в отдельную колонку справа. Звезда, время и стрелка
   занимают оба ряда. */
.tn-fx {
  display: grid;
  grid-template-columns: 18px 68px minmax(0, 30ch) 24px repeat(5, 22px) 34px minmax(0, 1fr) 16px;
  grid-template-rows: auto auto;
  align-items: center; column-gap: 8px; row-gap: 2px; padding: 9px 18px;
  border-top: 1px solid var(--line-soft); color: var(--ink);
}
.tn-fx:hover { background: rgba(255, 255, 255, 0.02); color: var(--ink); }
.tn-fx__star { grid-column: 1; grid-row: 1 / span 2; }
/* Ячейка времени — строками, а не столбиком: дата (если есть) своей строкой,
   под ней часы или статус, и В ТУ ЖЕ строку — метка эфира пары. Столбиком
   метка вставала второй строкой вровень со вторым игроком и читалась как его
   статус: «Live» у Kazakhstan W, «Эфир» у Spain W (отзыв 23.09.2026: «такого
   быть не должно»). Не влезла пара в колонку — метка переносится, а не
   наезжает на имена. */
.tn-fx__time { grid-column: 2; grid-row: 1 / span 2; display: flex; flex-wrap: wrap; align-items: center; gap: 2px 5px; font-size: 12px; font-weight: 600; color: var(--dim); min-width: 0; }
.tn-fx__date { flex-basis: 100%; font-size: 10.5px; font-weight: 700; color: var(--faint); }
.tn-fx__clock { font-variant-numeric: tabular-nums; }
/* max-width — чтобы статус в строчной ячейке упирался в её край: короткая
   подпись телефона обрезается многоточием только внутри узкой коробки
   (раньше её сужал столбец). */
.tn-fx__st { display: inline-flex; align-items: center; gap: 5px; min-width: 0; max-width: 100%; font-size: 11px; font-weight: 700; }
.tn-fx__st .lb-live-dot { display: none; }
.tn-fx__st.is-live { color: var(--red-live-text); font-weight: 800; }
.tn-fx__st.is-live .lb-live-dot { display: inline-block; }
.tn-fx__st.is-susp { color: #E5C453; }
.tn-fx__st-short { display: none; }
/* Метка своего эфира пары (канал заведён на этот матч, а не на турнир).
   Зелёная и с треугольником — «LIVE» рядом означает, что играют, а эта
   метка, что показывают; одинаковый красный слил бы два разных факта. */
.tn-fx__air { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; font-weight: 800; letter-spacing: .02em; text-transform: uppercase; color: var(--green-soft); }
.tn-fx__air svg { flex: none; }
.tn-board__head .tn-fx__air { font-size: 10.5px; }
/* В строке матча метка — один треугольник рядом со статусом: слово «Эфир»
   в строку с «Live» в колонку времени не помещается. Слово остаётся для
   читалок экрана, глазу — подсказка title «В эфире». В шапке табло кортов
   метка по-прежнему со словом: там она и так стоит в строку. */
.tn-fx .tn-fx__air-txt { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.tn-fx__arrow { grid-column: -2; grid-row: 1 / span 2; color: var(--dim); font-size: 14px; }
/* Игрок: подающий помечен точкой. В паре имена стопкой — тогда ряд
   становится выше, и числовые ячейки центрируются по нему сами. */
.tn-fx__p { grid-column: 3; display: flex; align-items: center; gap: 8px; min-width: 0; font-size: 13.5px; font-weight: 600; }
.tn-fx__p--home { grid-row: 1; }
.tn-fx__p--away { grid-row: 2; }
.tn-fx__p.is-winner { color: var(--green-soft); font-weight: 700; }
.tn-fx__names { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }
.tn-fx__pl { display: flex; align-items: center; gap: 7px; min-width: 0; }
.tn-fx__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Точка подачи — СПРАВА от имени, у края колонки имён: так все точки ленты
   стоят в один столбец рядом со счётом, и видно подающего, не читая имён.
   Порядок правит CSS, а не разметка: в DOM точка идёт первой, чтобы там, где
   имя одно (табло), её можно было оставить рядом с ним. */
.tn-fx__srv { order: 2; margin-inline-start: auto; width: 7px; height: 7px; border-radius: 50%; background: var(--green); flex: none; box-shadow: 0 0 0 3px rgba(88, 219, 36, 0.18); }
.tn-fx__srv[hidden] { display: none; }
/* Числовые ячейки. Выигранные сеты — главная цифра строки: у идущего обе
   красные, у предстоящего прочерк, у доигранного победитель ярче
   проигравшего. Геймы серые, кроме текущего сета. */
.tn-fx__sets, .tn-fx__g, .tn-fx__gp { font-variant-numeric: tabular-nums; text-align: center; }
.tn-fx__sets { grid-column: 4; font-size: 14px; font-weight: 800; color: var(--muted); }
.tn-fx__sets.is-winner { color: var(--ink); }
.tn-fx__g { font-size: 12.5px; font-weight: 600; color: var(--dim); }
.tn-fx__g.is-now { color: var(--ink); font-weight: 800; }
.tn-fx__g sup { font-size: 9px; font-weight: 700; vertical-align: super; margin-inline-start: 1px; color: var(--faint); }
.tn-fx__g sup[hidden] { display: none; }
.tn-fx__gp { grid-column: 10; font-size: 12px; font-weight: 800; color: var(--dim); border-radius: 5px; padding: 1px 0; }
/* Очки подающего — бейджем: в теннисе подача решает, кто в гейме хозяин. */
.tn-fx__gp.is-serving { color: var(--red-live-text); background: rgba(233, 62, 62, 0.14); }
.tn-fx__gp[hidden] { display: none; }
/* Раскладка ячеек по рядам и колонкам — ТОЛЬКО внутри строки ленты: те же
   атрибуты data-tn-set / data-tn-gp носят табло кортов и матча. */
.tn-fx [data-tn-sets="home"], .tn-fx [data-tn-set^="home-"], .tn-fx [data-tn-gp="home"] { grid-row: 1; }
.tn-fx [data-tn-sets="away"], .tn-fx [data-tn-set^="away-"], .tn-fx [data-tn-gp="away"] { grid-row: 2; }
.tn-fx [data-tn-set$="-1"] { grid-column: 5; }
.tn-fx [data-tn-set$="-2"] { grid-column: 6; }
.tn-fx [data-tn-set$="-3"] { grid-column: 7; }
.tn-fx [data-tn-set$="-4"] { grid-column: 8; }
.tn-fx [data-tn-set$="-5"] { grid-column: 9; }
.tn-fx[data-st="live"] .tn-fx__sets { color: var(--red-live-text); }
.tn-fx[data-st="live"][data-susp] .tn-fx__sets { color: var(--muted); }
.tn-fx[data-st="up"] .tn-fx__sets { color: var(--faint); }
/* Первая строка карточки без верхней линии */
.tn-group .home-group__rows > .tn-fx:first-child, .tn-block__rows > .tn-fx:first-child, .tn-round__rows > .tn-fx:first-child { border-top: 0; }

/* Блок матчей без карточек лиг (турнир: «Сегодня на кортах», расписание) */
.tn-block__head { display: flex; align-items: baseline; gap: 12px; padding: 14px 18px 10px; }
.tn-block__head h2 { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); margin: 0; }
.tn-block__cat { font-size: 12px; font-weight: 600; color: var(--dim); }
.tn-block__note { font-size: 12px; font-weight: 600; color: var(--dim); margin-inline-start: auto; white-space: nowrap; }
.tn-block__day { padding: 10px 18px 4px; font-size: 11px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); border-top: 1px solid var(--line-soft); }
.tn-block__day + .tn-block__rows > .tn-fx:first-child { border-top: 0; }
/* Строки в сайдбаре (другие матчи дня): узко — без звезды, стрелки и колонок
   по сетам; остаются статус, имена, счёт по сетам и очки в гейме.
   Колонка статуса — 68px, как в ленте, и растёт под подпись длиннее: в 52px
   «Завершён» (56px) вылезал из колонки и почти упирался во флаг (отзыв
   23.09.2026), а подписи других языков доходят до 71px (ka «დასრულდა»). */
.tn-block__rows--aside .tn-fx { grid-template-columns: minmax(68px, max-content) minmax(0, 1fr) 22px 30px; padding: 9px 14px; column-gap: 8px; font-size: 12.5px; }
/* Колонка очков в гейме — только пока они есть хоть у одной строки списка:
   тогда она держит цифры столбцом у всех строк. Иначе пустые 30px с зазором
   отодвигали счёт от правого края на 38px (отзыв 23.09.2026). */
.tn-block__rows--aside:not(:has(.tn-fx__gp:not([hidden]))) .tn-fx { grid-template-columns: minmax(68px, max-content) minmax(0, 1fr) 22px; }
.tn-block__rows--aside .tn-fx__star, .tn-block__rows--aside .tn-fx__arrow, .tn-block__rows--aside .tn-fx__g { display: none; }
.tn-block__rows--aside .tn-fx__time { grid-column: 1; font-size: 11px; }
.tn-block__rows--aside .tn-fx__p { grid-column: 2; font-size: 12.5px; }
.tn-block__rows--aside .tn-fx__p .tn-flag { width: 15px; height: 11px; }
.tn-block__rows--aside .tn-fx__srv { width: 6px; height: 6px; box-shadow: none; }
.tn-block__rows--aside .tn-fx__sets { grid-column: 3; font-size: 13px; }
.tn-block__rows--aside .tn-fx__gp { grid-column: 4; font-size: 11.5px; }

/* ===== Карточки событий (турниры) ===== */
.tn-evs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.tn-ev {
  position: relative; display: flex; gap: 14px; align-items: flex-start;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-card);
  padding: 14px; color: var(--ink); min-width: 0;
}
/* Отклик подложкой, как у строк списков, а не рамкой (отзыв 14.09.2026). */
.tn-ev:hover { background: var(--panel-2); color: var(--ink); }
.tn-ev__logo { width: 52px; height: 52px; flex: none; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; background: var(--bg); border: 1px solid var(--line-soft); border-radius: 14px; color: var(--green-soft); }
.tn-ev__logo.has-img { background: #FFFFFF; }
.tn-ev--recent .tn-ev__logo.has-img { background: var(--bg); }
.tn-ev__logo img { width: 40px; height: 40px; object-fit: contain; }
.tn-ev__logo svg { width: 22px; height: 22px; }
.tn-ev__body { display: flex; flex-direction: column; gap: 6px; min-width: 0; padding-inline-end: 22px; }
.tn-ev__tags { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.tn-ev__tags .tn-tag { font-size: 9.5px; padding: 4px 9px; gap: 5px; background: none; }
.tn-ev__tags .tn-tag .lb-live-dot { width: 5px; height: 5px; }
.tn-ev__name { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); line-height: 1.25; }
.tn-ev__meta { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--muted); }
.tn-ev__dates { font-size: 12px; font-weight: 700; color: var(--green-soft); }
.tn-ev--recent .tn-ev__dates { color: var(--dim); }
.tn-ev__winners { display: flex; flex-wrap: wrap; gap: 6px 16px; }
.tn-ev__winner { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 700; color: var(--ink); }
.tn-ev__wcat { font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
.tn-ev__star { position: absolute; top: 12px; inset-inline-end: 12px; }

/* ===== Рейтинги: карточки топ-5, таблица, подиум ===== */
.tn-ranks { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.tn-rank__head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 18px; font-family: var(--font-display); font-size: 14.5px; font-weight: 700; color: var(--ink-strong); }
.tn-rank__head a { font-family: var(--font-text); font-size: 12px; font-weight: 700; color: var(--muted); white-space: nowrap; }
.tn-rank__head a:hover { color: var(--green-pale); }
.tn-rank__note { font-family: var(--font-text); font-size: 12px; font-weight: 600; color: var(--dim); }
.tn-rank__row {
  display: grid; grid-template-columns: 36px 40px minmax(0, 1fr) 24px 72px;
  align-items: center; gap: 10px; padding: 8px 18px;
  border-top: 1px solid var(--line-soft); font-size: 13.5px;
}
.tn-rank--full .tn-rank__row { grid-template-columns: 56px 52px minmax(0, 1fr) 28px 96px 110px; gap: 12px; padding: 9px 18px; }
.tn-rank--full .tn-rank__row:not(.tn-rank__row--head):hover { background: rgba(255, 255, 255, 0.02); }
.tn-rank__row--head { font-size: 10.5px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
.tn-rank__pos { font-weight: 800; font-variant-numeric: tabular-nums; color: var(--ink-strong); }
.tn-rank--full .tn-rank__pos { font-family: var(--font-display); font-size: 15px; font-weight: 700; }
/* Заголовок таблицы — тем же капсом, что и остальные колонки: правило стоит
   ПОСЛЕ крупных «Место»/«Очки» строк, иначе они его перебивают. */
.tn-rank--full .tn-rank__row--head .tn-rank__pos, .tn-rank--full .tn-rank__row--head .tn-rank__pts { font-family: var(--font-text); font-size: 10.5px; font-weight: 800; color: var(--dim); }
.tn-rank__mv { font-size: 11px; font-weight: 800; color: var(--faint); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tn-rank--full .tn-rank__mv { font-size: 11.5px; }
.tn-rank__mv.is-up { color: var(--green-soft); }
.tn-rank__mv.is-down { color: var(--red-live-text); }
.tn-rank__who { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.tn-rank__p { display: flex; align-items: center; gap: 10px; min-width: 0; color: var(--ink); font-weight: 600; }
.tn-rank--full .tn-rank__p { gap: 12px; font-size: 14px; }
.tn-rank__photo { width: 28px; height: 28px; border-radius: 50%; object-fit: cover; object-position: top; flex: none; background: var(--bg); }
.tn-rank--full .tn-rank__photo { width: 32px; height: 32px; }
.tn-rank__photo--empty { display: inline-flex; align-items: center; justify-content: center; color: var(--dim); border: 1px solid var(--line-soft); }
.tn-rank__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Страна под именем — только на телефоне (там колонки флага нет). */
.tn-rank__cty { display: none; }
.tn-rank__country { display: inline-flex; }
.tn-rank__tourn { text-align: end; color: var(--muted); font-weight: 600; font-variant-numeric: tabular-nums; }
.tn-rank__pts { text-align: end; font-weight: 800; font-variant-numeric: tabular-nums; }
.tn-rank--full .tn-rank__pts { font-family: var(--font-display); font-size: 14px; font-weight: 700; color: var(--ink-strong); }
/* Фильтры страниц календаря и рейтингов: сегменты + пилюли + подпись. */
.tn-filters { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.tn-seg .home-seg__btn { color: var(--ink-soft); }
.tn-seg .home-seg__btn:hover { color: var(--green-pale); }
.tn-seg .home-seg__btn.is-active, .tn-seg .home-seg__btn.is-active:hover { color: var(--on-green); }
.tn-seg--tour .home-seg__btn { padding: 6px 16px; }
.tn-seg--tour .home-seg__btn:hover { color: var(--ink-strong); }
.tn-filters__kinds { display: flex; gap: 6px; }
.tn-filters__kind { height: 32px; padding: 0 14px; font-size: 12.5px; }
.tn-filters__meta { margin-inline-start: auto; font-size: 12px; font-weight: 600; color: var(--dim); }
.tn-filters__now { display: inline-flex; align-items: center; gap: 7px; height: 32px; padding: 0 14px; border-radius: var(--r-pill); border: 1px solid rgba(229, 57, 53, 0.35); color: var(--red-live-text); font-size: 12.5px; font-weight: 700; }
.tn-filters__now:hover { background: rgba(255, 69, 69, 0.08); color: var(--red-live-text); }
/* Подиум мест 1–3 */
.tn-podium { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.tn-podium__card {
  position: relative; overflow: hidden; display: flex; align-items: center; gap: 16px; padding: 18px 20px;
  background: radial-gradient(320px 160px at 0% 100%, rgba(88, 219, 36, 0.10), transparent 70%), var(--bg-header);
  border: 1px solid var(--line); border-radius: var(--r-lg);
}
.tn-podium__wm { position: absolute; inset-inline-end: 14px; top: 2px; font-family: var(--font-display); font-size: 72px; font-weight: 700; line-height: 1; letter-spacing: -0.04em; color: rgba(255, 255, 255, 0.06); pointer-events: none; font-variant-numeric: tabular-nums; }
.tn-podium__photo { width: 64px; height: 64px; border-radius: 50%; overflow: hidden; flex: none; display: inline-flex; align-items: center; justify-content: center; background: var(--panel); border: 2px solid rgba(255, 255, 255, 0.1); color: var(--dim); }
.tn-podium__photo img { width: 100%; height: 100%; object-fit: cover; object-position: top; }
.tn-podium__photo svg { width: 26px; height: 26px; }
/* Подиум парной гонки (tennis_rankings.html, IsPair): два фото внахлёст —
   второе поверх первого, рамка круга отделяет их; имена по строке на
   игрока (каждая режется своим многоточием), страны обе через точку.
   Одна карточка на двоих, а не два фото в ряд: строка гонки — команда
   сезона, и ряд из двух кругов читался бы как два места. */
.tn-podium__photos { display: flex; align-items: center; flex: none; }
.tn-podium__photos .tn-podium__photo { width: 52px; height: 52px; }
.tn-podium__photos .tn-podium__photo + .tn-podium__photo { margin-inline-start: -14px; }
.tn-podium__name--pair { display: flex; flex-direction: column; gap: 1px; white-space: normal; font-size: 14.5px; }
.tn-podium__name--pair span { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tn-podium__cty i { font-style: normal; color: var(--dim); }
.tn-podium__cty--pair { flex-wrap: wrap; row-gap: 2px; }
/* Колонка страны в таблице (28px): у пары два флага столбиком — рядом они в
   колонку не влезают, а строка пары и так в два ряда по игроку. */
.tn-rank__country { flex-direction: column; align-items: center; gap: 4px; }
.tn-podium__body { position: relative; display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.tn-podium__pos { display: flex; align-items: center; gap: 8px; font-size: 10.5px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.tn-podium__no { color: var(--green-soft); }
.tn-podium__name { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tn-podium__cty { display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 600; color: var(--muted); }
.tn-podium__pts { display: flex; align-items: baseline; gap: 6px; margin-top: 2px; }
.tn-podium__pts b { font-family: var(--font-display); font-size: 22px; font-weight: 700; color: var(--ink-strong); line-height: 1; font-variant-numeric: tabular-nums; }
.tn-podium__pts span { font-size: 11px; font-weight: 700; color: var(--dim); }
/* Пейджер */
.tn-pager { display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px 18px; border-top: 1px solid var(--line-soft); }
.tn-pager__btn { height: 36px; padding: 0 18px; font-size: 13px; }
/* Шевроны пейджера — svg вместо глифов «←»/«→» (те же, что у ссылок «назад»
   по всему сайту с 22.09.2026); пилюля — инлайн-флекс, зазор её же. */
.tn-pager__btn svg { width: 14px; height: 14px; flex: none; }
.tn-pager .lb-pill.is-disabled { opacity: 0.35; pointer-events: none; }
.tn-pager__pos { font-size: 12.5px; font-weight: 700; color: var(--muted); }

/* ===== Турнир ===== */
.tn-tour__nav { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 14px 32px 16px; border-top: 1px solid rgba(255, 255, 255, 0.07); }
.tn-tour__draws { display: flex; gap: 8px; flex-wrap: wrap; }
.tn-tour__draw { height: 32px; padding: 0 14px; background: rgba(255, 255, 255, 0.04); }
.tn-tour__draw.is-active { background: var(--green); }
.tn-tour__seasons { display: flex; align-items: center; gap: 4px; margin-inline-start: auto; }
.tn-tour__cap { font-size: 12px; font-weight: 700; color: var(--dim); margin-inline-end: 6px; }
.tn-tour__yr { padding: 5px 10px; border-radius: 8px; font-size: 12.5px; font-weight: 700; color: var(--muted); }
.tn-tour__yr:hover { color: var(--green-pale); background: rgba(255, 255, 255, 0.04); }
.tn-tour__yr.is-active { background: rgba(88, 219, 36, 0.12); color: var(--green-soft); }
.tn-grid { display: grid; grid-template-columns: minmax(0, 1fr) 348px; gap: 20px; align-items: start; }
/* Плеер турнира: шапка с окном и «В эфире · до 23:00», видео, подпись. */
.tn-player { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden; }
.tn-player__head { display: flex; align-items: center; gap: 8px; padding: 10px 16px; border-bottom: 1px solid var(--line); }
.tn-player__title { font-size: 12.5px; font-weight: 700; color: var(--ink); flex: 1; min-width: 0; }
.tn-player__live { display: inline-flex; align-items: center; gap: 7px; font-size: 11.5px; font-weight: 700; color: var(--red-live-text); white-space: nowrap; }
.tn-player__live .lb-live-dot { width: 5px; height: 5px; }
.tn-player__box { border: 0; border-radius: 0; }
.tn-player__note { padding: 12px 16px 13px; border-top: 1px solid var(--line); font-size: 12px; font-weight: 600; color: var(--muted); line-height: 1.5; }
/* До эфира: отсчёт до окна */
.tn-soon {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px; aspect-ratio: 16 / 9;
  background: radial-gradient(70% 80% at 50% 45%, rgba(88, 219, 36, 0.07), transparent 72%), var(--bg-header);
  border: 1px solid var(--line); border-radius: var(--r-lg); padding: 20px; text-align: center;
}
.tn-soon__kicker { font-size: 11px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--green-soft); }
.tn-soon__time { font-family: var(--font-display); font-size: 22px; font-weight: 700; color: var(--ink-strong); }
.tn-soon__cd { display: flex; gap: 8px; margin-top: 4px; }
.tn-soon__box { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; width: 74px; height: 70px; border-radius: 12px; background: rgba(255, 255, 255, 0.05); border: 1px solid var(--line); }
.tn-soon__box b { font-family: var(--font-display); font-size: 22px; font-weight: 700; color: var(--ink-strong); line-height: 1; font-variant-numeric: tabular-nums; }
.tn-soon__box span { font-size: 9px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--dim); }
.tn-soon__note { font-size: 13px; font-weight: 600; color: var(--muted); }
/* Идёт без канала */
.tn-nochan { display: flex; align-items: center; gap: 16px; background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 18px 20px; }
.tn-nochan__ico { width: 44px; height: 44px; flex: none; border-radius: 12px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--line); display: inline-flex; align-items: center; justify-content: center; color: var(--dim); }
.tn-nochan__body { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 0; }
.tn-nochan__title { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); }
.tn-nochan__text { font-size: 12.5px; font-weight: 600; color: var(--muted); line-height: 1.5; }
/* Чемпионы завершённого турнира */
.tn-champs { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.tn-champ {
  position: relative; display: flex; flex-direction: column; justify-content: flex-end; gap: 6px; min-height: 150px; overflow: hidden;
  background: radial-gradient(320px 160px at 0% 100%, rgba(88, 219, 36, 0.10), transparent 70%), var(--bg-header);
  border: 1px solid var(--line); border-radius: var(--r-lg); padding: 18px 20px;
}
.tn-champ__wm { position: absolute; inset-inline-end: 16px; top: 8px; font-family: var(--font-display); font-size: 64px; font-weight: 700; line-height: 0.85; letter-spacing: -0.03em; color: rgba(255, 255, 255, 0.07); pointer-events: none; }
.tn-champ__kicker { font-size: 10px; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--green-soft); }
.tn-champ__name { display: flex; align-items: center; gap: 10px; font-family: var(--font-display); font-size: 21px; font-weight: 700; color: var(--ink-strong); line-height: 1.2; min-width: 0; }
.tn-champ__name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tn-champ__final { font-size: 13px; font-weight: 600; color: var(--ink-soft); }
.tn-champ__final b { font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
/* Результаты по кругам — аккордеон */
.tn-results { position: relative; }
.tn-rounds { display: flex; flex-direction: column; gap: 12px; }
.tn-round__head { width: 100%; display: flex; align-items: center; gap: 12px; padding: 13px 18px; background: none; border: 0; color: var(--ink); text-align: start; cursor: pointer; }
.tn-round__head:hover { background: rgba(255, 255, 255, 0.02); }
.tn-round__name { font-size: 14px; font-weight: 800; color: var(--ink-strong); }
.tn-round__date { font-size: 11.5px; font-weight: 600; color: var(--dim); }
.tn-round__count { margin-inline-start: auto; font-size: 11.5px; font-weight: 600; color: var(--muted); white-space: nowrap; }
.tn-round__chev { display: inline-flex; color: var(--dim); transition: transform 0.2s; }
.tn-round.is-open .tn-round__chev { transform: rotate(180deg); }
.tn-round__rows { display: none; }
.tn-round.is-open .tn-round__rows { display: block; }
.tn-results__note { padding: 12px 4px 0; font-size: 10.5px; color: var(--dim); line-height: 1.5; }
/* Информация: «Категория: Большой шлем» золотом */
.tn-info .v.is-gold { color: #E5C453; }
.tn-info .v .tn-flag { width: 15px; height: 11px; }
.tn-draw { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-top: 1px solid rgba(255, 255, 255, 0.05); color: var(--ink); font-size: 13px; }
.tn-draw:first-of-type { border-top: 0; }
.tn-draw:hover { color: var(--green-soft); }
.tn-draw__cat { font-weight: 700; flex: 1; min-width: 0; }
.tn-draw__w { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--muted); }
.tn-draw__w .tn-flag { width: 15px; height: 11px; }
.tn-draw__st { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 800; }
.tn-draw__st.is-live { color: var(--red-live-text); }
.tn-draw__arrow { color: var(--dim); font-size: 14px; flex: none; }
/* Расписание эфиров */
.tn-air { padding: 6px 0 8px; }
.tn-air__head { display: flex; align-items: center; gap: 10px; padding: 14px 20px 8px; }
.tn-air__head h2 { font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--ink-strong); margin: 0; flex: 1; }
.tn-air__day { padding: 8px 20px 4px; font-size: 10px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.tn-air__row { display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 8px 20px; border-top: 1px solid rgba(255, 255, 255, 0.05); }
.tn-air__time { font-family: var(--font-display); font-size: 12px; font-weight: 700; color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tn-air__row.is-live .tn-air__time { color: var(--ink-strong); }
.tn-air__note { font-size: 12.5px; font-weight: 600; color: var(--ink-soft); min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tn-air__tag { display: inline-flex; align-items: center; gap: 5px; font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--red-live-text); }
.tn-air__tag .lb-live-dot { width: 5px; height: 5px; }

/* ===== Матч ===== */
.tnm-hero { position: relative; overflow: hidden; background: var(--bg-header); border: 1px solid var(--line); border-radius: var(--r-xl); }
.tnm-hero__head { display: flex; align-items: center; gap: 12px; padding: 12px 22px; border-bottom: 1px solid rgba(255, 255, 255, 0.07); background: rgba(255, 255, 255, 0.02); }
.tnm-hero__tour { display: inline-flex; align-items: center; gap: 9px; color: var(--ink-strong); min-width: 0; font-family: var(--font-display); font-size: 13.5px; font-weight: 700; white-space: nowrap; }
.tnm-hero__tour:hover { color: var(--green-soft); }
.tnm-hero__tlogo { width: 24px; height: 24px; flex: none; display: inline-flex; align-items: center; justify-content: center; background: #FFFFFF; border-radius: 6px; overflow: hidden; }
.tnm-hero__tlogo img { width: 19px; height: 19px; object-fit: contain; }
/* В шапке после турнира — только покрытие: разряд, квалификация и круг стоят
   в левой колонке табло, и шапка их больше не повторяет (23.09.2026). */
.tnm-hero__surface { font-size: 12.5px; font-weight: 600; color: var(--muted); white-space: nowrap; }
.tnm-hero__date { margin-inline-start: auto; font-size: 12.5px; font-weight: 700; color: var(--ink); white-space: nowrap; font-variant-numeric: tabular-nums; }
.tnm-hero__main { position: relative; display: grid; grid-template-columns: 200px minmax(0, 1fr); }
.tnm-hero__main::before { content: ""; position: absolute; inset: 0; background: radial-gradient(520px 220px at 25% 50%, rgba(88, 219, 36, 0.08), transparent 70%); pointer-events: none; }
.tnm-hero__left { position: relative; display: flex; flex-direction: column; justify-content: center; gap: 8px; padding: 22px 24px; border-inline-end: 1px solid var(--line-soft); }
.tnm-hero__st, .tnm-hero__up { display: inline-flex; align-items: center; gap: 6px; font-size: 10.5px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.tnm-hero__st .lb-live-dot { display: none; width: 6px; height: 6px; }
.tnm-hero__st.is-live { color: var(--red-live-text); }
.tnm-hero__st.is-live .lb-live-dot { display: inline-block; }
.tnm-hero__st.is-susp { color: #E5C453; }
.tnm-hero__up { color: var(--green-soft); }
.tnm-hero__round { font-family: var(--font-display); font-size: 20px; font-weight: 700; color: var(--ink-strong); line-height: 1.1; }
.tnm-hero__cat { font-size: 12.5px; font-weight: 600; color: var(--muted); }
.tnm-hero__hot { margin-top: 4px; align-self: flex-start; display: inline-flex; align-items: center; border: 1px solid rgba(139, 233, 106, 0.45); color: var(--green-soft); font-size: 10px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; border-radius: var(--r-pill); padding: 4px 10px; }
.tnm-hero__hot[hidden] { display: none; }
.tnm-hero__time { margin-top: 4px; font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }
.tnm-hero__right { position: relative; display: flex; flex-direction: column; justify-content: center; gap: 8px; padding: 18px 30px 20px; min-width: 0; }
.tnm-hero__cols { display: flex; justify-content: flex-end; align-items: center; gap: 6px; font-size: 9.5px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--faint); }
.tnm-hero__col { width: 40px; text-align: center; }
.tnm-hero__col--sets { width: 46px; margin-inline-end: 10px; }
.tnm-hero__col--gp { width: 54px; margin-inline-start: 10px; }
.tnm-side { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: 24px; }
.tnm-side__photos { display: none; }
.tnm-side__who { display: flex; align-items: center; gap: 14px; min-width: 0; }
.tnm-side__photo { width: 48px; height: 48px; border-radius: 50%; overflow: hidden; flex: none; display: inline-flex; align-items: center; justify-content: center; background: var(--panel); border: 2px solid rgba(255, 255, 255, 0.1); color: var(--dim); }
.tnm-side__photo img { width: 100%; height: 100%; object-fit: cover; object-position: top; }
.tnm-side__photo svg { width: 20px; height: 20px; }
.tnm-side.is-winner .tnm-side__photo { border-color: var(--green); }
/* Фото стоят внутри .tnm-side__who первыми: на десктопе .tnm-side__photos
   пуст (display:none у обёртки), а сами фото рисует ::before — нет, проще:
   обёртка фото показывается и на десктопе, ниже переопределение. */
.tnm-side__photos { display: flex; gap: 6px; flex: none; }
.tnm-side { grid-template-columns: auto minmax(0, 1fr) auto; column-gap: 14px; }
.tnm-side__who { flex-direction: column; align-items: flex-start; gap: 4px; }
/* max-width: 100% обязателен: .tnm-side__who — колонка с align-items:
   flex-start, и без него строка имени берёт ширину по содержимому — у пары
   («Cabezas Dominguez E. / Gomez Pezuela Cano M.») она вылезала из колонки
   сетки на ячейки счёта, min-width: 0 в колонке этого не ограничивает. */
.tnm-side__name { display: flex; align-items: center; gap: 10px; min-width: 0; max-width: 100%; font-family: var(--font-display); font-size: 21px; font-weight: 700; color: var(--ink-strong); line-height: 1.1; }
.tnm-side__nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tnm-side.is-winner .tnm-side__name { color: var(--green-soft); }
.tnm-hero[data-st="fin"] .tnm-side:not(.is-winner) .tnm-side__name { color: var(--muted); }
.tnm-side__srv { order: 0; margin-inline-start: 0; width: 9px; height: 9px; box-shadow: 0 0 0 4px rgba(88, 219, 36, 0.18); }
.tnm-side__win { font-family: var(--font-text); font-size: 9.5px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--on-green); background: var(--green); border-radius: var(--r-pill); padding: 3px 9px; flex: none; }
.tnm-side__win[hidden] { display: none; }
.tnm-side__sub { display: inline-flex; align-items: center; gap: 7px; max-width: 100%; flex-wrap: wrap; font-size: 12.5px; font-weight: 600; color: var(--muted); }
.tnm-side__sub i { font-style: normal; color: var(--faint); }
.tnm-side__sub b { color: var(--ink); font-weight: 700; }
.tnm-side__cells { display: flex; align-items: center; gap: 6px; font-variant-numeric: tabular-nums; }
/* Ячейки счёта табло матча — те же, что на табло кортов, только крупнее. */
.tnm-cell { display: inline-flex; align-items: center; justify-content: center; flex: none; font-family: var(--font-display); font-weight: 700; border-radius: 10px; }
.tnm-cell--sets { width: 46px; height: 48px; font-size: 24px; background: rgba(255, 255, 255, 0.07); color: var(--ink); margin-inline-end: 10px; }
.tnm-cell--sets.is-lead { background: rgba(88, 219, 36, 0.14); color: var(--green-soft); }
.tnm-hero[data-st="up"] .tnm-cell--sets { background: rgba(255, 255, 255, 0.05); color: var(--faint); }
.tnm-cell--set { width: 40px; height: 48px; font-size: 22px; background: rgba(255, 255, 255, 0.04); color: var(--ink); }
.tnm-cell--set.is-won { background: rgba(255, 255, 255, 0.09); color: var(--ink-strong); }
.tnm-cell--set.is-lost { background: rgba(255, 255, 255, 0.04); color: var(--dim); }
.tnm-cell--set.is-now { background: rgba(255, 69, 69, 0.12); color: var(--red-live-text); }
[data-susp] .tnm-cell--set.is-now { background: rgba(255, 255, 255, 0.06); color: var(--ink-soft); }
.tnm-cell--set sup { font-size: 10px; line-height: 0; margin-inline-start: 2px; color: var(--dim); font-family: var(--font-text); font-weight: 700; }
.tnm-cell--set sup[hidden] { display: none; }
.tnm-cell--gp { min-width: 54px; height: 48px; padding: 0 10px; font-size: 18px; margin-inline-start: 10px; background: rgba(255, 255, 255, 0.05); color: var(--muted); }
.tnm-cell--gp.is-serving { background: rgba(255, 69, 69, 0.14); color: var(--red-live-text); }
.tnm-hero__foot { display: flex; flex-wrap: wrap; gap: 8px 22px; padding: 11px 22px 13px; border-top: 1px solid rgba(255, 255, 255, 0.07); font-size: 12.5px; color: var(--ink-soft); }
.tnm-hero__foot b { color: var(--dim); font-weight: 700; margin-inline-end: 4px; }
/* Мобильная дуэль — только на телефоне */
.tnm-duel { display: none; }
/* Вкладки матча и панель */
.tnm-tabs { display: flex; flex-direction: column; gap: 20px; }
.tnm-tabs__bar { gap: 8px; }
.tnm-panel { border-radius: var(--r-lg); overflow: hidden; }
.tnm-pane__head { display: flex; align-items: center; gap: 12px; padding: 18px 20px 0; }
.tnm-pane__head h2 { font-family: var(--font-display); font-size: 19px; font-weight: 700; color: var(--ink-strong); margin: 0; flex: 1; min-width: 0; }
.tnm-legend { display: inline-flex; align-items: center; gap: 14px; font-size: 11.5px; font-weight: 700; color: var(--ink-soft); white-space: nowrap; }
.tnm-legend > span { display: inline-flex; align-items: center; gap: 6px; }
.tnm-legend__dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.tnm-legend__dot--h { background: var(--green); }
.tnm-legend__dot--a { background: #49B2D3; }
.tnm-pane__body { padding: 6px 20px 14px; }
.tnm-pane__body[hidden] { display: none; }
.tnm-pane__empty { padding: 22px 20px 26px; text-align: center; font-size: 13px; font-weight: 600; color: var(--dim); }
.tnm-sub { display: flex; align-items: center; gap: 6px; margin: 14px 0 6px; flex-wrap: wrap; }
.tnm-sub__tabs { gap: 6px; flex-wrap: nowrap; }
.tnm-sub__note { margin-inline-start: auto; font-size: 11.5px; font-weight: 600; color: var(--dim); }
.tnm-sub__note--set { margin: 0 0 6px; }
.tnm-sub__note [hidden] { display: none; }
/* Статистика: группы и зеркальные полосы от центра */
.tnm-stats__group { padding: 14px 0 4px; font-size: 10.5px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.tnm-stat { padding: 10px 0 4px; }
.tnm-stat__row { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 13px; }
.tnm-stat__row b { font-weight: 800; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.tnm-stat__lbl { font-weight: 600; color: var(--muted); text-align: center; }
.tnm-stat__bar { display: flex; gap: 4px; height: 7px; margin-top: 8px; }
.tnm-stat__track { flex: 1; display: flex; background: rgba(255, 255, 255, 0.06); border-radius: var(--r-pill); overflow: hidden; }
.tnm-stat__track--l { justify-content: flex-end; }
.tnm-stat__fill { height: 100%; border-radius: var(--r-pill); transition: width 0.45s ease-out; }
.tnm-stat__fill--h { background: var(--green); }
.tnm-stat__fill--a { background: #49B2D3; }
/* Розыгрыши по очкам */
.tnm-games { display: flex; flex-direction: column; }
.tnm-game { display: grid; grid-template-columns: 76px minmax(0, 1fr) auto; align-items: center; gap: 12px; padding: 8px 8px; margin: 0 -8px; border-top: 1px solid var(--line-soft); border-radius: 8px; }
.tnm-game.is-break { background: rgba(88, 219, 36, 0.05); }
.tnm-game.is-now { background: rgba(255, 69, 69, 0.05); }
.tnm-game__score { display: inline-flex; align-items: center; gap: 8px; font-weight: 800; font-variant-numeric: tabular-nums; color: var(--ink); }
.tnm-game__srv { width: 6px; height: 6px; border-radius: 50%; background: var(--faint); flex: none; }
.tnm-game__srv--home { background: var(--green); }
.tnm-game__srv--away { background: #49B2D3; }
.tnm-game__pts { display: flex; flex-wrap: wrap; gap: 4px; }
.tnm-pt { font-size: 11px; font-weight: 700; color: var(--muted); background: var(--bg); border: 1px solid var(--line-soft); border-radius: 6px; padding: 2px 6px; font-variant-numeric: tabular-nums; }
.tnm-pt.is-bp { border-color: rgba(229, 196, 83, 0.5); color: #E5C453; }
.tnm-pt.is-sp, .tnm-pt.is-mp { border-color: rgba(229, 57, 53, 0.45); color: var(--red-live-text); }
.tnm-game__break { font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--green-soft); }
.tnm-game__now { display: inline-flex; align-items: center; gap: 5px; font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--red-live-text); }
.tnm-game__now .lb-live-dot { width: 5px; height: 5px; }
/* Очные встречи */
.tnm-h2h { padding: 16px 20px 12px; }
.tnm-h2h__head { display: flex; align-items: baseline; gap: 12px; margin: 0 0 6px; }
.tnm-h2h__head + .tnm-h2h__list + .tnm-h2h__head { margin-top: 18px; }
.tnm-h2h__title { flex: 1; font-size: 10.5px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
.tnm-h2h__note { font-size: 12px; font-weight: 600; color: var(--muted); }
.tnm-h2h__row { display: grid; grid-template-columns: 64px 160px minmax(0, 1fr) auto; align-items: center; gap: 12px; padding: 9px 0; border-top: 1px solid var(--line-soft); font-size: 12.5px; }
.tnm-h2h__date { color: var(--dim); font-weight: 700; font-variant-numeric: tabular-nums; }
.tnm-h2h__tour { color: var(--muted); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tnm-h2h__pair { font-weight: 600; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tnm-h2h__pair .me { color: var(--ink-strong); font-weight: 700; }
.tnm-h2h__res { display: inline-flex; align-items: center; gap: 8px; font-weight: 800; font-variant-numeric: tabular-nums; }
.tnm-h2h__wl { width: 18px; height: 18px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; color: var(--on-green); background: var(--dim); }
.tnm-h2h__row.is-w .tnm-h2h__wl { background: var(--green); }
.tnm-h2h__row.is-l .tnm-h2h__wl { background: var(--red-live); color: #FFFFFF; }

/* ===== Календарь ===== */
.tn-cal__month { display: flex; flex-direction: column; }
.tn-cal__cur { margin-inline-start: auto; font-size: 11px; font-weight: 800; letter-spacing: 0.1em; text-transform: uppercase; color: var(--green-soft); }
.tn-cal__row { display: grid; grid-template-columns: 184px 40px minmax(0, 1fr) 210px minmax(0, 1fr) 16px; align-items: center; gap: 14px; padding: 12px 18px; border-top: 1px solid var(--line-soft); color: var(--ink); }
.tn-cal__row:first-child { border-top: 0; }
.tn-cal__row:hover { background: rgba(255, 255, 255, 0.03); color: var(--ink); }
.tn-cal__row.is-now { background: rgba(88, 219, 36, 0.04); }
.tn-cal__when { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.tn-cal__dates { font-size: 13px; font-weight: 700; color: var(--green-soft); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tn-cal__row.is-fin .tn-cal__dates { color: var(--dim); }
.tn-cal__prog { display: flex; align-items: center; gap: 8px; }
.tn-cal__bar { width: 72px; height: 3px; border-radius: 2px; background: rgba(255, 255, 255, 0.08); overflow: hidden; display: inline-flex; flex: none; }
.tn-cal__bar span { display: block; height: 100%; border-radius: 2px; background: var(--green); }
.tn-cal__dayline { font-size: 10.5px; font-weight: 700; color: var(--green-soft); white-space: nowrap; }
.tn-cal__subline { font-size: 10.5px; font-weight: 700; color: var(--dim); }
.tn-cal__subline--fin { color: var(--faint); }
.tn-cal__logo { width: 40px; height: 40px; display: inline-flex; align-items: center; justify-content: center; overflow: hidden; background: var(--bg); border: 1px solid var(--line-soft); border-radius: 10px; color: var(--green-soft); }
.tn-cal__logo.has-img { background: #FFFFFF; }
.tn-cal__logo img { width: 30px; height: 30px; object-fit: contain; }
.tn-cal__logo svg { width: 16px; height: 16px; }
.tn-cal__name { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.tn-cal__title { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--ink-strong); line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tn-cal__sub { display: flex; align-items: center; gap: 6px; }
.tn-cal__sub .tn-tag { font-size: 9px; padding: 3px 8px; gap: 4px; background: none; }
.tn-cal__sub .tn-tag .lb-live-dot { width: 5px; height: 5px; }
.tn-cal__place { display: flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; color: var(--muted); min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tn-cal__surf { color: var(--dim); }
.tn-cal__surf::before { content: '·'; margin-inline-end: 7px; }
.tn-cal__winners { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.tn-cal__winners .tn-ev__winner { font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tn-cal__winners .tn-ev__wcat { width: 30px; flex: none; }
.tn-cal__go { font-size: 12px; font-weight: 600; color: var(--ink-soft); }
/* Короткие даты («14–20 сен») и подвал идущего турнира — только телефон
   (≤600, ниже): на десктопе даты полные, а полоса хода стоит в колонке дат. */
.tn-cal__dates-short, .tn-cal__foot { display: none; }

/* ===== Карточки эфиров из новостей (турнир без плеера) ===== */
.tn-bcasts { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }
.tn-card { display: flex; flex-direction: column; min-width: 0; background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-card); overflow: hidden; padding: 10px; color: var(--ink); }
.tn-card:hover { background: var(--panel-2); color: var(--ink); }
.tn-card__media { position: relative; display: block; border-radius: 10px; overflow: hidden; aspect-ratio: 16 / 9; background: var(--bg); }
.tn-card__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.tn-card__chip { position: absolute; top: 10px; inset-inline-start: 10px; }
.tn-card__body { display: flex; flex-direction: column; flex: 1; gap: 10px; padding: 11px 4px 4px; min-width: 0; }
.tn-card__title { font-size: 14px; font-weight: 700; line-height: 1.4; color: var(--ink); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.tn-card__foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: auto; }
.tn-card__time { font-size: 12.5px; font-weight: 800; color: var(--green-soft); font-variant-numeric: tabular-nums; }
.tn-card__live { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 800; color: var(--red-live-text); }
.tn-art--empty { display: flex; align-items: center; justify-content: center; color: var(--green-soft); background: radial-gradient(circle at 30% 30%, rgba(88, 219, 36, 0.22), rgba(12, 17, 11, 0) 60%), var(--panel-2); }
.tn-art--empty svg { width: 42px; height: 42px; opacity: 0.8; }

/* CTA Telegram — на витрине в строку, в сайдбаре колонкой */
.tn-tg { display: flex; align-items: center; gap: 20px; padding: 20px 24px; }
.tn-tg__text { flex: 1; min-width: 0; }
.tn-tg .home-cta__btn { flex: none; width: auto; margin-top: 0; }

/* Витрина с сайдбаром «Топ турниры» (tennis.html, tn_side_top). Сайдбар стоит
   только рядом с лентой дня: шапка и афиша выше него — на всю ширину, и всё,
   что ниже него, — тоже (отзывы 21.09.2026: «начинай этот блок от матчей»,
   «всё, что ниже, надо на весь экран»). Гриду .lb-layout такое не задать —
   колонка там либо есть на строке, либо нет, — поэтому обычный поток с
   флоатом: каждый блок (.tn-sec — флекс-контейнер, то есть свой
   форматирующий контекст) встаёт рядом с флоатом, не наезжая на него, пока
   тот не кончился, а ниже разворачивается на всю ширину. Это же спасает
   короткую ленту (воскресные финалы, межсезонье): следующий блок поднимается
   к сайдбару, а не оставляет под лентой дыру. flow-root — чтобы секция
   вмещала флоат, даже если он длиннее всего контента. Ритм тот же, что у
   .tn-page, но полями: флекс-gap с флоатом не работает (флоат внутри флекса
   становится его элементом). Область поллинга (data-tn-live) — вся секция.
   Строки сайдбара — общий .home-nav (10-home). */
.tn-layout { display: flow-root; padding: 24px 0 12px; }
.tn-layout > * + * { margin-top: 28px; }
.tn-side { float: left; width: 264px; margin-inline-end: 20px; }
/* float: inline-start поддержан только с Chrome 118 — справа налево явно. */
[dir="rtl"] .tn-side { float: right; }
/* Сколько колонок у карточек турниров, решает ширина самого блока, а не
   окна: рядом с сайдбаром блок 856px (на планшете уже), ниже сайдбара — вся
   колонка, и в CSS заранее не известно, где окажется блок. Порог 1139 —
   всё, что уже полной колонки 1140: на планшете (окно ≤1180, поля 20px)
   получаются те же две колонки, что и в медиа-правиле ниже, — оно остаётся
   запасным для браузеров без container queries. */
.tn-layout > .tn-sec { container-type: inline-size; }
@container (max-width: 1139px) {
  .tn-evs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.tn-top .home-nav__ico svg { width: 18px; height: 18px; margin: auto; color: var(--muted); }
/* Идущий турнир — красная точка, как у сегмента Live (.home-seg__dot);
   сыгранные приглушены, чтобы верх списка (идущие и ближайшие) читался как
   «впереди». Наведение возвращает обычный цвет строки. */
.tn-top__live { width: 7px; height: 7px; border-radius: 50%; background: #FF4B4B; flex: none; box-shadow: 0 0 0 3px rgba(255, 75, 75, 0.18); }
.tn-top.is-fin { color: var(--muted); }
.tn-top.is-fin:hover { color: #DFE5DB; }

/* ============================================================
   Адаптив (брейкпоинты сайта 1180 / 940 / 600)
   ============================================================ */
@media (max-width: 1180px) {
  .tn-evs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 940px) {
  .tn-grid, .tn-ranks, .tn-champs { grid-template-columns: 1fr; }
  .tn-podium { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
  .tn-hero__top { grid-template-columns: auto minmax(0, 1fr); }
  .tn-hero__cta { grid-column: 1 / -1; justify-self: start; }
  .tn-cal__row { grid-template-columns: 140px 40px minmax(0, 1fr) 16px; }
  .tn-cal__place, .tn-cal__winners { grid-column: 3; }
  .tnm-h2h__row { grid-template-columns: 64px minmax(0, 1fr) auto; }
  .tnm-h2h__tour { display: none; }
  .tnm-hero__main { grid-template-columns: 160px minmax(0, 1fr); }
  .tnm-hero__right { padding: 16px 20px 18px; }
}
@media (max-width: 600px) {
  .tn-page { gap: 20px; padding: 14px 0 24px; }
  .tn-layout { padding: 14px 0 24px; }
  .tn-layout > * + * { margin-top: 20px; }
  .tn-page--tour, .tn-page--match, .tn-page--cal, .tn-page--ranks { gap: 18px; }
  .tn-head { gap: 12px; }
  .tn-h1 { font-size: 22px; }
  .tn-subnav { margin: -4px 0 0; width: 100%; padding-bottom: 2px; }
  .tn-subnav .lb-pill { padding: 8px 14px; font-size: 12.5px; flex: none; }
  .tn-sec__head { margin-bottom: 10px; }
  .tn-sec__head .lb-h2 { font-size: 16px; }
  .tn-sec__link { font-size: 11.5px; }
  .tn-sec__link--m { display: inline; }
  .tn-sec__link--m ~ .tn-sec__note, .tn-sec__note + .tn-sec__link--m ~ * { display: none; }
  .tn-empty { padding: 22px 14px; font-size: 12.5px; }
  /* Афиша и шапка турнира: стопка, лого 56, название 20, CTA во всю ширину */
  .tn-hero { border-radius: var(--r-lg); background: radial-gradient(420px 240px at 10% 30%, rgba(88, 219, 36, 0.12), transparent 70%), var(--bg-header); }
  .tn-hero__top { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 12px; padding: 16px 16px 14px; }
  .tn-hero__logo { width: 56px; height: 56px; border-radius: 14px; }
  .tn-hero__logo img { width: 44px; height: 44px; }
  .tn-hero__logo svg { width: 26px; height: 26px; }
  .tn-hero__body { flex: 1; min-width: 0; gap: 7px; }
  .tn-hero__tags { gap: 6px; }
  .tn-hero__tags .tn-tag { font-size: 9.5px; padding: 4px 9px; background: none; }
  .tn-hero__tags .tn-tag .lb-live-dot { width: 5px; height: 5px; }
  .tn-hero__sub { order: 5; width: 100%; font-size: 12px; }
  .tn-hero__title { font-size: 20px; line-height: 1.15; gap: 8px; }
  .tn-hero__season { font-size: 13px; }
  .tn-hero__meta { font-size: 12.5px; gap: 7px; }
  .tn-hero__meta .tn-flag { width: 15px; height: 11px; }
  /* Даты — всегда своей строкой и без разделителя: рядом со страной и
     покрытием они на телефоне почти не помещались, и «·» повисала в конце
     первой строки. Точку прячем именно ту, что перед датами: на странице
     турнира дат может не быть, и последняя точка там стоит перед покрытием. */
  .tn-hero__dates { flex-basis: 100%; }
  .tn-hero__meta i:has(+ .tn-hero__dates) { display: none; }
  .tn-hero__cta { width: 100%; height: 44px; padding: 0 16px; font-size: 14px; box-shadow: 0 10px 26px rgba(88, 219, 36, 0.25); }
  .tn-hero__cta--ghost { box-shadow: none; }
  /* Табло: строки стопкой, только последний сет во всех режимах */
  .tn-board__kicker { padding: 10px 16px 9px; }
  .tn-board__rows { flex-direction: column; gap: 0; background: none; }
  .tn-board--one .tn-board__cell, .tn-board--two .tn-board__cell, .tn-board__cell { display: flex; grid-template-columns: none; gap: 6px; padding: 10px 16px 11px; border-top: 1px solid rgba(255, 255, 255, 0.05); }
  .tn-board__cell:first-child { border-top: 0; }
  .tn-board--one .tn-board__head, .tn-board--two .tn-board__head, .tn-board__head { flex-direction: row; align-items: center; padding: 0; border: 0; font-size: 10px; letter-spacing: 0.08em; white-space: nowrap; gap: 8px; }
  .tn-board--one .tn-board__cat, .tn-board__cat { display: inline; }
  .tn-board--one .tn-board__round, .tn-board__round { display: inline; font-family: var(--font-text); font-size: 10px; font-weight: 800; color: var(--dim); text-transform: uppercase; letter-spacing: 0.08em; line-height: inherit; }
  .tn-board__round::before { content: "·"; margin-inline-end: 8px; }
  .tn-board--one .tn-board__catfull { display: none; }
  .tn-board--one .tn-board__hot, .tn-board__hot { margin-block: 0; margin-inline: auto 0; border: 0; padding: 0; font-size: 10px; }
  /* Вторую сторону «одного корта» сбрасываем отдельно: десктопное правило с
     соседним селектором специфичнее, и на телефоне без этой строки второй
     игрок уезжал на 32px внутрь с обеих сторон — ячейки счёта не совпадали. */
  .tn-board--one .tn-board__side, .tn-board--one .tn-board__side + .tn-board__side, .tn-board--two .tn-board__side, .tn-board__side { padding: 0; column-gap: 10px; }
  .tn-board--one .tn-board__name, .tn-board--two .tn-board__name, .tn-board__name { font-family: var(--font-text); font-size: 13px; gap: 6px; line-height: 1.2; }
  .tn-board__name .tn-flag, .tn-board--one .tn-board__name .tn-flag, .tn-board--two .tn-board__name .tn-flag { width: 14px; height: 10px; border-radius: 2px; }
  .tn-board--one .tn-board__srv, .tn-board--two .tn-board__srv, .tn-board__srv { width: 6px; height: 6px; box-shadow: 0 0 0 3px rgba(88, 219, 36, 0.18); }
  .tn-board--one .tn-board__cells, .tn-board--two .tn-board__cells, .tn-board__cells { gap: 4px; }
  .tn-board--one .tn-board__sets, .tn-board--two .tn-board__sets, .tn-board__sets { width: 24px; height: 24px; font-size: 12.5px; border-radius: 6px; margin-inline-end: 4px; }
  .tn-board--one .tn-board__set, .tn-board--two .tn-board__set, .tn-board__set { width: 22px; height: 24px; font-size: 12px; border-radius: 6px; }
  .tn-board--one .tn-board__set sup, .tn-board__set sup { font-size: 7px; margin-inline-start: 1px; }
  .tn-board--one .tn-board__gp, .tn-board--two .tn-board__gp, .tn-board__gp { min-width: 30px; height: 24px; padding: 0 5px; font-family: var(--font-text); font-size: 11.5px; font-weight: 800; border-radius: 6px; margin-inline-start: 4px; }
  .tn-board__set:has(~ .tn-board__set:not([hidden])) { display: none; }
  /* Тулбар ленты на телефоне — три строки общего .home-tb (99-responsive). */
  .tn-feed { gap: 10px; }
  .tn-group__head { padding: 11px 14px; gap: 10px; }
  .tn-group__name { font-size: 13.5px; }
  .tn-group__star { display: none; }
  .tn-group__count { font-size: 11px; }
  /* Строка матча на телефоне: без звезды и стрелки, колонки сетов — только
     сыгранные (repeat(5, max-content) с нулевым gap: пустые треки схлопываются,
     воздух дают margin у видимых ячеек), статус — короткий. */
  .tn-fx { grid-template-columns: 46px minmax(0, 1fr) 20px repeat(5, max-content) max-content; column-gap: 0; row-gap: 3px; padding: 9px 14px; }
  .tn-fx__star, .tn-fx__arrow { display: none; }
  /* «● Live ▶» должен встать в 46px одной строкой и не прижаться к имени:
     зазор 4px и треугольник 8px оставляют до флага 8px, как у самой длинной
     короткой подписи («Отменён»). */
  .tn-fx__time { grid-column: 1; font-size: 11.5px; line-height: 1.15; column-gap: 4px; }
  .tn-fx .tn-fx__air svg { width: 8px; height: 8px; }
  .tn-fx__date { font-size: 10px; }
  .tn-fx__st { font-size: 10px; }
  .tn-fx__st.is-live { font-size: 10.5px; }
  .tn-fx__st .lb-live-dot { width: 5px; height: 5px; }
  .tn-fx__st-long { display: none; }
  .tn-fx__st-short { display: inline; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .tn-fx__st.is-live .tn-fx__st-long { display: inline; }
  .tn-fx__st.is-live .tn-fx__st-short { display: none; }
  /* Метка эфира на табло кортов на телефоне — одним треугольником: шапка
     ячейки там узкая. В строках матчей метка треугольником на любой ширине
     (см. .tn-fx .tn-fx__air-txt выше). */
  .tn-fx__air-txt { display: none; }
  .tn-fx__p { grid-column: 2; font-size: 13px; gap: 6px; margin: 0 6px; }
  .tn-fx__pl { gap: 6px; }
  .tn-fx__p .tn-flag { width: 14px; height: 10px; }
  .tn-fx__srv { width: 6px; height: 6px; }
  .tn-fx__sets { grid-column: 3; font-size: 13.5px; }
  .tn-fx__g { min-width: 17px; margin-inline-start: 6px; font-size: 12px; }
  .tn-fx__g sup { font-size: 8px; }
  .tn-fx [data-tn-set$="-1"] { grid-column: 4; }
  .tn-fx [data-tn-set$="-2"] { grid-column: 5; }
  .tn-fx [data-tn-set$="-3"] { grid-column: 6; }
  .tn-fx [data-tn-set$="-4"] { grid-column: 7; }
  .tn-fx [data-tn-set$="-5"] { grid-column: 8; }
  .tn-fx__gp { grid-column: 9; min-width: 28px; margin-inline-start: 6px; font-size: 11.5px; }
  /* Колонка статуса 44px, а не 40: в неё встаёт «● Live ▶» одной строкой
     (43.5px), иначе треугольник уходил под статус (23.09.2026). */
  .tn-block__rows--aside .tn-fx { grid-template-columns: 44px minmax(0, 1fr) 18px auto; column-gap: 8px; }
  /* Без очков в гейме — без их колонки, как на десктопе. Правило обязано
     стоять здесь: десктопное с :has() специфичнее мобильного выше и иначе
     вернуло бы телефону колонку статуса в 68px. */
  .tn-block__rows--aside:not(:has(.tn-fx__gp:not([hidden]))) .tn-fx { grid-template-columns: 44px minmax(0, 1fr) 18px; }
  .tn-block__rows--aside .tn-fx__p { margin: 0; }
  .tn-block__rows--aside .tn-fx__g { display: none; }
  .tn-block__rows--aside .tn-fx__gp { grid-column: 4; margin: 0; }
  .tn-block__head { padding: 12px 14px 8px; gap: 10px; }
  .tn-block__head h2 { font-size: 14px; }
  .tn-block__cat, .tn-block__note { font-size: 11px; }
  /* Карточки турниров: горизонтальная лента по 280px за поля экрана.
     Выступ — ровно на поле страницы (14px на телефоне, 99-responsive), так же
     у фильтра рейтингов и вкладок матча: при 16px ряд торчал за экран на 2px,
     и iOS позволяла таскать всю страницу вбок. */
  .tn-evs { display: flex; gap: 10px; overflow-x: auto; scrollbar-width: none; margin: 0 -14px; padding: 0 14px; }
  .tn-evs::-webkit-scrollbar { display: none; }
  .tn-ev { flex: 0 0 280px; padding: 12px; gap: 12px; }
  .tn-ev__logo { width: 44px; height: 44px; border-radius: 12px; }
  .tn-ev__logo img { width: 34px; height: 34px; }
  .tn-ev__logo svg { width: 20px; height: 20px; }
  .tn-ev__body { gap: 5px; }
  .tn-ev__tags .tn-tag { font-size: 9px; padding: 3px 8px; }
  .tn-ev__name { font-size: 14px; }
  .tn-ev__meta, .tn-ev__dates { font-size: 11.5px; }
  .tn-ev__star { top: 10px; inset-inline-end: 10px; }
  /* Недавние победители — список в одной карточке */
  .tn-evs--recent { display: flex; flex-direction: column; gap: 0; margin: 0; padding: 0; overflow: visible; background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-card); }
  .tn-evs--recent .tn-ev { flex: none; border: 0; border-radius: 0; border-top: 1px solid var(--line-soft); padding: 12px 14px; background: none; }
  .tn-evs--recent .tn-ev:first-child { border-top: 0; }
  .tn-evs--recent .tn-ev:hover { background: rgba(255, 255, 255, 0.02); }
  .tn-evs--recent .tn-ev__logo { width: 40px; height: 40px; border-radius: 11px; }
  .tn-evs--recent .tn-ev__logo img { width: 30px; height: 30px; }
  .tn-evs--recent .tn-ev__body { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; column-gap: 8px; row-gap: 4px; padding-inline-end: 0; }
  .tn-evs--recent .tn-ev__name { font-family: var(--font-text); font-size: 13.5px; font-weight: 800; grid-column: 1; grid-row: 1; }
  .tn-evs--recent .tn-ev__tags { grid-column: 2; grid-row: 1; }
  .tn-evs--recent .tn-ev__tags .tn-tag { border: 0; padding: 0; font-size: 10.5px; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--muted); }
  .tn-evs--recent .tn-ev__dates, .tn-evs--recent .tn-ev__meta { grid-column: 1 / -1; font-size: 11px; font-weight: 600; color: var(--dim); }
  .tn-evs--recent .tn-ev__meta { grid-row: 3; }
  .tn-evs--recent .tn-ev__dates { grid-row: 2; }
  .tn-evs--recent .tn-ev__winners { grid-column: 1 / -1; grid-row: 4; gap: 4px 14px; margin-top: 2px; }
  .tn-evs--recent .tn-ev__winner { font-size: 12px; }
  .tn-evs--recent .tn-ev__star { display: none; }
  /* Рейтинги на витрине: две карточки стопкой, ужатые строки */
  .tn-rank__head { padding: 12px 14px 8px; font-size: 13px; }
  .tn-rank__head a { display: none; }
  .tn-rank__row { grid-template-columns: 20px 26px minmax(0, 1fr) 16px 54px; gap: 10px; padding: 7px 14px; font-size: 13px; }
  .tn-rank__row .tn-rank__mv { display: none; }
  .tn-rank__row .tn-rank__photo { width: 26px; height: 26px; }
  .tn-rank__row .tn-rank__p { gap: 8px; }
  .tn-rank__row .tn-rank__country .tn-flag { width: 15px; height: 11px; }
  /* Полная таблица рейтинга: место · фото · имя со страной · движение · очки */
  .tn-rank--full .tn-rank__row { grid-template-columns: 24px 28px minmax(0, 1fr) 22px 56px; gap: 8px; padding: 7px 14px; }
  .tn-rank--full .tn-rank__row--head { display: none; }
  .tn-rank--full .tn-rank__pos { font-family: var(--font-text); font-size: 13px; font-weight: 800; }
  .tn-rank--full .tn-rank__row .tn-rank__mv { display: block; grid-column: 4; font-size: 10.5px; text-align: center; }
  .tn-rank--full .tn-rank__who { grid-column: 3; }
  .tn-rank--full .tn-rank__p { gap: 8px; font-size: 13px; }
  .tn-rank--full .tn-rank__photo { width: 28px; height: 28px; }
  .tn-rank--full .tn-rank__cty { display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 600; color: var(--dim); padding-inline-start: 36px; margin-top: -2px; }
  .tn-rank--full .tn-rank__country, .tn-rank--full .tn-rank__tourn { display: none; }
  .tn-rank--full .tn-rank__pts { grid-column: 5; font-family: var(--font-text); font-size: 13px; font-weight: 800; color: var(--ink); }
  .tn-filters { gap: 10px; }
  .tn-seg--tour .home-seg__btn { padding: 7px 18px; }
  .tn-filters__kinds { width: 100%; overflow-x: auto; scrollbar-width: none; margin: 0 -14px; padding: 0 14px; width: auto; }
  .tn-filters__kind { flex: none; height: auto; padding: 7px 13px; font-size: 12px; }
  .tn-filters__kind.is-active { background: rgba(88, 219, 36, 0.1); border-color: var(--hover-green-line); color: var(--green-pale); font-weight: 700; }
  .tn-filters__meta { display: none; }
  .tn-podium { gap: 8px; }
  .tn-podium__card { flex-direction: column; text-align: center; gap: 6px; padding: 12px 8px 10px; border-radius: 14px; background: radial-gradient(160px 90px at 50% 0%, rgba(88, 219, 36, 0.10), transparent 70%), var(--panel); }
  .tn-podium__wm { position: static; font-size: 14px; line-height: 1; color: var(--ink-strong); letter-spacing: 0; }
  .tn-podium__card.is-first .tn-podium__wm { color: #E5C453; }
  .tn-podium__photo { width: 46px; height: 46px; border-width: 1px; }
  .tn-podium__body { align-items: center; gap: 4px; width: 100%; }
  .tn-podium__pos { display: none; }
  .tn-podium__name { font-family: var(--font-text); font-size: 12px; max-width: 100%; }
  .tn-podium__cty { font-size: 10.5px; gap: 4px; max-width: 100%; }
  .tn-podium__cty .tn-flag { width: 13px; height: 9px; }
  .tn-podium__cty span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* Пара на телефоне: фото меньше, имена по строке, у стран — только флаги
     (два названия в карточку шириной ~110px не влезают). */
  .tn-podium__photos .tn-podium__photo { width: 38px; height: 38px; border-width: 1px; }
  .tn-podium__photos .tn-podium__photo + .tn-podium__photo { margin-inline-start: -10px; }
  .tn-podium__name--pair { font-size: 11.5px; }
  .tn-podium__cty--pair span, .tn-podium__cty--pair i { display: none; }
  .tn-podium__pts b { font-family: var(--font-text); font-size: 12px; font-weight: 800; color: var(--ink); }
  .tn-podium__pts span { display: none; }
  .tn-pager { justify-content: space-between; padding: 12px 14px; }
  .tn-pager__btn { height: 32px; padding: 0 14px; font-size: 12px; font-weight: 700; background: var(--bg); }
  .tn-pager__word { display: none; }
  .tn-pager__pos { font-size: 11.5px; }
  /* Турнир: разряды — ряд пилюль, сезоны переносом */
  .tn-tour__nav { padding: 12px 16px 14px; gap: 10px; }
  .tn-tour__draws { flex-wrap: nowrap; margin: 0 -16px; padding: 0 16px; width: calc(100% + 32px); }
  .tn-tour__draw { flex: none; height: auto; padding: 8px 14px; }
  .tn-tour__seasons { margin-inline-start: 0; flex-wrap: wrap; }
  .tn-player__head { padding: 10px 14px; }
  .tn-player__title { font-size: 12px; }
  .tn-soon { aspect-ratio: auto; gap: 12px; padding: 20px 16px; background: radial-gradient(300px 160px at 50% 0%, rgba(88, 219, 36, 0.12), transparent 70%), var(--panel); border-radius: var(--r-card); }
  .tn-soon__time { font-size: 20px; }
  .tn-soon__cd { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; width: 100%; margin: 0; }
  .tn-soon__cd .tn-soon__box:first-child[hidden] ~ .tn-soon__box { grid-column: auto; }
  .tn-soon__box { width: auto; height: auto; padding: 10px 6px; background: var(--bg); border-color: var(--line-soft); }
  .tn-soon__box span { font-size: 10px; font-weight: 600; letter-spacing: 0; text-transform: none; }
  .tn-soon__note { font-size: 12px; }
  .tn-nochan { gap: 12px; padding: 14px; border-radius: var(--r-card); }
  .tn-nochan__ico { width: 40px; height: 40px; border-radius: 11px; color: var(--muted); }
  .tn-nochan__title { font-family: var(--font-text); font-size: 13.5px; font-weight: 800; }
  .tn-nochan__text { font-size: 12px; line-height: 1.45; }
  .tn-champs { grid-template-columns: 1fr 1fr; gap: 10px; }
  .tn-champ { min-height: 0; gap: 6px; padding: 14px; border-radius: var(--r-card); background: radial-gradient(200px 120px at 0% 100%, rgba(88, 219, 36, 0.14), transparent 70%), var(--panel); }
  .tn-champ__wm { display: none; }
  .tn-champ__kicker { font-size: 9.5px; color: var(--dim); }
  .tn-champ__name { font-size: 14px; gap: 6px; }
  .tn-champ__name .tn-flag { width: 15px; height: 11px; }
  .tn-champ__final { font-size: 11px; color: var(--muted); }
  .tn-champ__final b { font-size: 12px; color: var(--green-soft); }
  .tn-rounds { gap: 10px; }
  .tn-round__head { padding: 12px 14px; gap: 10px; }
  .tn-round__date, .tn-round__count { font-size: 11px; }
  .tn-round__date { margin-inline-start: auto; }
  .tn-round__count { margin-inline-start: 0; }
  .tn-round__count::before { content: "·"; margin-inline-end: 6px; }
  .tn-results__note { padding-top: 8px; }
  .tn-info .sm-info__row { display: grid; grid-template-columns: 110px minmax(0, 1fr); gap: 10px; font-size: 12.5px; }
  .tn-info .sm-info__row .v { text-align: start; }
  .tn-air__head { padding: 12px 14px 4px; }
  .tn-air__head h2 { font-size: 14px; }
  .tn-air__day { padding: 8px 14px 4px; }
  .tn-air__row { grid-template-columns: auto minmax(0, 1fr) auto; padding: 8px 14px; }
  /* Матч: табло — дуэль */
  .tnm-hero { border-radius: var(--r-lg); }
  .tnm-hero__head, .tnm-hero__main, .tnm-hero__foot { display: none; }
  /* Очертаний корта на фоне (svg .tnm-duel__court из хендоффа) больше нет —
     отзыв 22.09.2026: «убери очертания корта сзади». */
  .tnm-duel { display: block; position: relative; }
  /* Поля строки статуса по 40px с обеих сторон: справа в них стоит звезда
     (12 + 20 + зазор), а левое такое же, чтобы строка оставалась по центру над
     счётом. */
  .tnm-duel__top { position: relative; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 12px 40px 4px; font-size: 10px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); text-align: center; flex-wrap: wrap; }
  /* Звезда избранного — в углу строки статуса: шапка табло со своей звездой
     на телефоне скрыта, а строки «‹ Турнир ☆» над карточкой с 23.09.2026 нет
     (крошки убраны по всему сайту). Стоит вровень с первой строкой, даже если
     статус перенёсся. */
  .tnm-duel__star { position: absolute; top: 8px; inset-inline-end: 12px; }
  .tnm-duel__top .tnm-hero__st { font-size: 10px; letter-spacing: 0.08em; }
  .tnm-duel__top .tnm-hero__st .lb-live-dot { width: 5px; height: 5px; }
  .tnm-duel__top .tnm-hero__st:not([hidden]) + .tnm-duel__crumb::before { content: "·"; margin-inline-end: 8px; }
  .tnm-duel__hot { color: var(--green-soft); }
  .tnm-duel__hot::before { content: "·"; margin-inline-end: 8px; color: var(--dim); }
  .tnm-duel__grid { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: start; gap: 8px; padding: 8px 14px 12px; }
  .tnm-duel__side { display: flex; flex-direction: column; align-items: center; gap: 6px; text-align: center; min-width: 0; }
  .tnm-duel__photo { width: 64px; height: 64px; border-radius: 50%; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; background: var(--panel); border: 2px solid rgba(255, 255, 255, 0.1); color: var(--dim); }
  .tnm-duel__photo img { width: 100%; height: 100%; object-fit: cover; object-position: top; }
  .tnm-duel__photo svg { width: 26px; height: 26px; }
  .tnm-duel__side.is-winner .tnm-duel__photo { border-color: var(--green); }
  .tnm-duel__name { display: flex; align-items: center; justify-content: center; gap: 5px; max-width: 100%; font-size: 13px; font-weight: 800; color: var(--ink-strong); line-height: 1.25; }
  .tnm-duel__name > span:first-child { overflow: hidden; text-overflow: ellipsis; }
  .tnm-duel__side.is-winner .tnm-duel__name { color: var(--green-soft); }
  .tnm-hero[data-st="fin"] .tnm-duel__side:not(.is-winner) .tnm-duel__name { color: var(--muted); }
  .tnm-duel__srv { order: 0; margin-inline-start: 0; width: 7px; height: 7px; }
  .tnm-duel__cty { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 600; color: var(--muted); }
  .tnm-duel__rank { font-size: 11px; font-weight: 800; color: var(--green-soft); }
  .tnm-duel__center { display: flex; flex-direction: column; align-items: center; gap: 6px; padding-top: 12px; min-width: 92px; }
  .tnm-duel__score { display: flex; align-items: baseline; gap: 6px; font-family: var(--font-display); font-size: 36px; font-weight: 700; line-height: 1; font-variant-numeric: tabular-nums; color: var(--ink); }
  .tnm-duel__score i { font-style: normal; font-size: 24px; color: var(--faint); }
  .tnm-duel__n.is-lead { color: var(--green-soft); }
  .tnm-hero[data-st="up"] .tnm-duel__n { color: var(--faint); }
  .tnm-duel__gp { display: inline-flex; align-items: center; padding: 3px 9px; border-radius: 6px; background: rgba(255, 69, 69, 0.12); font-size: 12.5px; font-weight: 800; font-variant-numeric: tabular-nums; color: var(--red-live-text); }
  .tnm-duel__gp[hidden] { display: none; }
  .tnm-duel__lbl { font-size: 10.5px; font-weight: 700; color: var(--muted); text-align: center; line-height: 1.35; }
  .tnm-duel__table { position: relative; display: flex; flex-direction: column; gap: 5px; padding: 10px 14px 14px; border-top: 1px solid rgba(255, 255, 255, 0.07); background: rgba(0, 0, 0, 0.3); }
  .tnm-duel__cols { display: flex; align-items: center; gap: 4px; font-size: 9.5px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
  .tnm-duel__cname { flex: 1; }
  .tnm-duel__cn { width: 28px; text-align: center; }
  .tnm-duel__cgp { width: 36px; text-align: center; margin-inline-start: 4px; }
  .tnm-duel__row { display: flex; align-items: center; gap: 4px; }
  .tnm-duel__rname { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 700; color: var(--ink-strong); }
  .tnm-duel__rname span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .tnm-duel__row .tnm-cell--set { width: 28px; height: 28px; font-size: 13px; border-radius: 7px; }
  .tnm-duel__row .tnm-cell--set sup { font-size: 7.5px; margin-inline-start: 1px; }
  .tnm-duel__row .tnm-cell--gp { min-width: 36px; width: 36px; height: 28px; padding: 0; font-family: var(--font-text); font-size: 12px; font-weight: 800; border-radius: 7px; margin-inline-start: 4px; }
  .tnm-duel__start { position: relative; display: flex; align-items: center; justify-content: center; gap: 6px; padding: 11px 14px; border-top: 1px solid rgba(255, 255, 255, 0.07); background: rgba(0, 0, 0, 0.3); font-size: 12px; font-weight: 700; color: var(--ink-soft); }
  .tnm-duel__start > span:first-child { color: var(--green-soft); }
  .tnm-tabs { gap: 16px; }
  .tnm-tabs__bar { flex-wrap: nowrap; margin: 0 -14px; padding: 0 14px; }
  .tnm-tabs__bar .lb-pill { flex: none; padding: 8px 14px; font-size: 12.5px; }
  .tnm-panel { border-radius: var(--r-card); }
  .tnm-pane__head { padding: 14px 14px 0; gap: 10px; }
  .tnm-pane__head h2 { font-size: 15px; }
  .tnm-legend { font-size: 10.5px; gap: 10px; }
  .tnm-legend__dot { width: 7px; height: 7px; }
  .tnm-pane__body { padding: 6px 14px 12px; }
  .tnm-sub { margin: 10px 0 4px; }
  .tnm-sub__tabs { width: 100%; margin: 0 -14px; padding: 0 14px; }
  .tnm-sub__tabs .lb-pill { flex: none; padding: 6px 12px; font-size: 11.5px; background: var(--bg); }
  .tnm-sub__tabs .lb-pill.is-active { background: var(--green); }
  .tnm-sub__note { margin-inline-start: 0; width: 100%; font-size: 11px; }
  .tnm-stats__group { padding: 10px 0 4px; font-size: 10px; color: var(--green-soft); }
  .tnm-stat { padding: 8px 0; border-top: 1px solid var(--line-soft); }
  .tnm-stat__row { align-items: baseline; font-size: 12px; }
  .tnm-stat__row b { font-weight: 700; }
  .tnm-stat__lbl { font-size: 11px; }
  .tnm-stat__bar { height: 4px; gap: 3px; margin-top: 5px; }
  .tnm-stat__track { border-radius: 2px; }
  .tnm-stat__fill { border-radius: 2px; }
  .tnm-game { display: flex; align-items: flex-start; gap: 8px; padding: 8px 6px; margin: 0 -6px; }
  .tnm-game__score { font-family: var(--font-display); font-size: 12px; font-weight: 700; width: 38px; flex: none; line-height: 17px; }
  .tnm-game__srv { width: 7px; height: 7px; }
  .tnm-game__pts { flex: 1; min-width: 0; }
  .tnm-pt { font-size: 10px; background: none; border-radius: 5px; padding: 1px 5px; line-height: 13px; }
  .tnm-game__break { font-size: 9.5px; margin-inline-start: auto; }
  .tnm-game__now { font-size: 10.5px; letter-spacing: 0; text-transform: none; }
  .tnm-h2h { padding: 12px 14px 10px; }
  .tnm-h2h__row { grid-template-columns: minmax(0, 1fr) auto; row-gap: 3px; }
  .tnm-h2h__date { grid-column: 1 / span 2; grid-row: 2; font-size: 10.5px; font-weight: 600; }
  .tnm-h2h__date::after { content: ""; }
  .tnm-h2h__tour { display: block; grid-column: 1 / span 2; grid-row: 3; font-size: 10.5px; color: var(--dim); }
  .tnm-h2h__pair { grid-row: 1; }
  .tnm-h2h__res { grid-row: 1; justify-self: end; }
  /* Календарь: строка — сетка 40px | название | мета (хендофф «Моб Теннис
     Календарь v2», 22.09.2026, артборд 1a). Даты и статус — в правой колонке,
     победители и ход турнира — подвалом на всю ширину. Прежняя стопка слева
     (всё под логотипом с отступом 52px) оставляла правую половину строки
     пустой. Правая колонка — auto и nowrap: длинное название переносится,
     а даты не сжимаются. */
  .tn-cal__cur { display: none; }
  .tn-cal__row {
    display: grid;
    grid-template-columns: 40px minmax(0, 1fr) auto;
    grid-template-areas: "logo name when" "logo place when" "foot foot foot";
    column-gap: 12px;
    row-gap: 5px;
    align-items: start;
    padding: 12px 14px;
  }
  .tn-cal__row.is-now { background: rgba(88, 219, 36, 0.04); }
  .tn-cal__logo { grid-area: logo; border-radius: 11px; }
  .tn-cal__logo svg { width: 18px; height: 18px; }
  .tn-cal__name { grid-area: name; gap: 5px; }
  .tn-cal__name .tn-cal__sub { order: -1; }
  .tn-cal__title { font-family: var(--font-text); font-size: 14px; font-weight: 800; white-space: normal; }
  .tn-cal__place { grid-area: place; font-size: 11.5px; }
  .tn-cal__when { grid-area: when; align-items: flex-end; text-align: end; gap: 5px; padding-top: 2px; }
  .tn-cal__dates { font-size: 11.5px; }
  .tn-cal__dates-long { display: none; }
  .tn-cal__dates-short { display: inline; }
  .tn-cal__prog .tn-cal__bar { display: none; } /* полоса — в подвале */
  .tn-cal__dayline { font-size: 11px; color: var(--ink-soft); }
  .tn-cal__subline { font-size: 11px; }
  /* Подвал: победители в две равные колонки. Без победителей подвала нет —
     у идущего и предстоящего в этом узле пусто либо только десктопная
     ссылка; :has() в проекте уже в ходу (.lb-header__adbet). */
  .tn-cal__winners { grid-area: foot; flex-direction: row; gap: 14px; margin-top: 5px; padding-top: 10px; border-top: 1px solid var(--line-soft); }
  .tn-cal__winners:not(:has(.tn-ev__winner)) { display: none; }
  .tn-cal__winners .tn-ev__winner { flex: 1 1 0; min-width: 0; }
  .tn-cal__winners .tn-ev__wcat { width: 28px; }
  .tn-cal__winners .tn-cal__go { display: none; }
  /* Подвал идущего: полоса на всю ширину и «Расписание и счёт →» — та же
     строка локали, что у десктопной ссылки, заглавная — ::first-letter. */
  .tn-cal__foot { grid-area: foot; display: flex; align-items: center; gap: 12px; margin-top: 5px; padding-top: 10px; border-top: 1px solid var(--line-soft); }
  .tn-cal__foot .tn-cal__bar { flex: 1; width: auto; height: 4px; }
  .tn-cal__foot .tn-cal__go { color: var(--green-soft); font-weight: 700; font-size: 11px; white-space: nowrap; }
  .tn-cal__foot .tn-cal__go::first-letter { text-transform: uppercase; }
  .tn-draw__arrow { display: none; }
  .tn-tg { flex-direction: column; align-items: stretch; gap: 12px; padding: 16px; }
  .tn-tg .home-cta__btn { width: 100%; height: 40px; padding: 0; }
  .tn-bcasts { grid-template-columns: 1fr; }
}

/* ===== partials/30-go-compat.css ===== */
/* ============================================================
   Go-порт: слой совместимости серверных виджетов со старого сайта
   с новой вёрсткой. Стилизует разметку, которую генерят серверные
   партиалы и легаси-скрипты (плеер cl.min.js/Playerjs, опрос
   match-poll.js, дропдаун поиска v2/search.js).
   ============================================================ */

/* ---------- Дропдаун поиска (v2/search.js) ---------- */
.lb-search { position: relative; }
.lb-search__res {
  position: absolute;
  top: calc(100% + 8px);
  inset-inline-start: 0;
  inset-inline-end: 0;
  background: var(--panel-2);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-menu);
  box-shadow: var(--shadow-menu);
  padding: 6px;
  z-index: 60;
  max-height: 320px;
  overflow: auto;
}
.lb-search__res[hidden] { display: none; }
/* Свой скроллбар дропдауна: системный (белый на Windows) вспарывал тёмную
   панель. Тонкий, трек прозрачный, ползунок в цвете рамок панелей.
   Firefox — scrollbar-width/color, WebKit — ::-webkit-scrollbar. */
.lb-search__res { scrollbar-width: thin; scrollbar-color: var(--line-strong) transparent; }
.lb-search__res::-webkit-scrollbar { width: 8px; }
.lb-search__res::-webkit-scrollbar-track { background: transparent; }
.lb-search__res::-webkit-scrollbar-thumb { background: var(--line-strong); border-radius: 999px; }
.lb-search__res::-webkit-scrollbar-thumb:hover { background: var(--dim); }
.lb-search__item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border-radius: var(--r-row);
  font: 500 13px/1.3 var(--font-text);
  color: var(--ink);
}
.lb-search__item:hover { background: rgba(255, 255, 255, 0.05); color: var(--green-soft); }
.lb-search__item img { width: 22px; height: 22px; object-fit: contain; flex: 0 0 auto; }

/* ---------- Плеер (cl.min.js / Playerjs / Video.js / iframe) ----------
   Серверный контейнер живёт внутри новой карточки плеера:
   #player_block > #player_hier > #player[ / #player2].
   Playerjs сам задаёт высоту по ширине; Video.js (стенды, src/player.js) и
   iframe растягиваем на 16:9. */
#player_block { width: 100%; }
/* Video.js: 16:9 по ширине колонки — как у сообщений плеера ниже, и вёрстка
   не прыгает, когда вместо «трансляция начнётся» встаёт видео. Свой радиус
   скина (1rem) рисовал бы второй угол внутри карточки — скругляет она.
   Цвета и шрифт — сайта, через переменные скина из справки Video.js
   «Customize skins»; contain вместо его cover — поток не 16:9 не обрезается,
   а встаёт с полями. */
#player_block live-video-minimal-skin {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  --media-border-radius: 0;
  --media-accent-color: var(--green);
  --media-accent-text-color: var(--on-green);
  --media-font-family: var(--font-text);
  --media-object-fit: contain;
  --media-object-position: center;
}
/* Большая ▶ поверх заставки (src/player.js) — та же круглая зелёная, что у
   сцены эфира (.sm-player__play). Это media-play-button Video.js: после
   первого запуска его атрибут data-started её прячет. Слой — 15: выше
   затемнения под панелью скина (10, с ним кнопка выходила тусклой), ниже его
   индикаторов, панели и окна ошибки (20–50) и слоя рекламы. */
#player_block .lb-play {
  position: absolute;
  top: 50%;
  left: 50%;
  translate: -50% -50%;
  z-index: 15;
  width: 76px;
  height: 76px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--green);
  color: var(--on-green);
  box-shadow: 0 8px 26px rgba(88, 219, 36, 0.4);
  cursor: pointer;
  transition: background-color .15s, scale .15s;
}
#player_block .lb-play:hover { background: var(--green-hover); scale: 1.06; }
#player_block .lb-play:focus-visible { outline: 2px solid var(--green-pale); outline-offset: 3px; }
#player_block .lb-play[data-started] { display: none; }
#player_block .lb-play svg { width: 28px; height: 28px; fill: currentColor; }
@media (max-width: 600px) {
  #player_block .lb-play { width: 56px; height: 56px; }
  #player_block .lb-play svg { width: 22px; height: 22px; }
}
/* Радиус у видео/iframe не свой (12px), а от карточки .mt-player (overflow
   hidden): свой радиус меньше карточного (18px) и по прижатым краям из-под
   углов видео выглядывал панельный фон. */
#player_block video { width: 100%; display: block; }
#player_block iframe {
  width: 100%;
  aspect-ratio: 16 / 9;
  height: auto;
  display: block;
  border: 0;
  background: #000;
}
/* Отступы мультиплеера — марджинами подписей, а НЕ gap контейнера: #player2
   в разметке есть всегда, в одиночном режиме он пустой (0px высоты), но
   flex-gap перед ним всё равно рисовал полоску панельного фона под видео.
   Пустые подписи скрыты (:empty ниже), пустые div без gap не занимают ничего. */
#player_hier { display: flex; flex-direction: column; }
#FirstplayerName { margin-bottom: 10px; }
#SecondplayerName { margin: 10px 0; }
#FirstplayerName, #SecondplayerName {
  font: 600 13px/1.3 var(--font-text);
  color: var(--muted);
}
#FirstplayerName:empty, #SecondplayerName:empty { display: none; }

/* Сообщения плеера (not_started / geo_blocked / фолбэк адблока).
   Высота — ровно как у видео (16:9 по ширине колонки, как у iframe выше):
   при появлении трансляции вёрстка не прыгает. Прежний min-height 240px
   не совпадал с плеером ни на одном брейкпоинте.
   По классу, а не по id: подсказку «плеер скрыт блокировщиком»
   (_player_fallback.html) рисуем СНАРУЖИ спрятанного #player_block, в таком
   же .player_block без id, и выглядеть она должна как остальные сообщения.
   Класс стоит на том же элементе, что и id, — существующая разметка не
   меняется. */
.player_block .warning,
.player_block .noTranslation {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  text-align: center;
  aspect-ratio: 16 / 9;
  padding: 24px;
  background: radial-gradient(120% 140% at 50% 0%, #17240E 0%, #0C110B 70%);
  border-radius: 12px;
  color: var(--ink-soft);
  font: 500 14px/1.55 var(--font-text);
}
.player_block .warning h2,
.player_block .noTranslation h2 {
  font: 600 17px/1.3 var(--font-display);
  color: var(--ink-strong);
  margin: 0;
}
.player_block .free_logo { max-width: 150px; height: auto; }
.player_block .free_a { color: var(--green-soft); font-weight: 700; text-decoration: underline; }
.player_block .free_a:hover { color: var(--green-pale); }
/* Таймер обратного отсчёта до матча внутри области плеера (PlayerCode not_started) */
.player_block .timer_player {
  font: 700 26px/1.2 var(--font-display);
  color: var(--green);
}

/* Табы мультитрансляций (_player*.html .stream_lang_tabs, JS по [data-stream]).
   Без собственных отступов: ряд всегда первый в карточке плеера и свои
   padding 10px 16px получает от .mt-player__langs / .sm-player__langs. Прежний
   margin-top: 10px не схлопывался (у .mt-player overflow:hidden — BFC) и
   удваивал зазор сверху: 20px над пилюлями против 10px под ними. */
.stream_lang_tabs {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
}
.stream_lang_label {
  font: 600 12px/1.2 var(--font-text);
  color: var(--dim);
}
.stream_lang_tab {
  cursor: pointer;
  padding: 6px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-ctl);
  background: var(--panel);
  color: var(--ink-soft);
  font: 600 12px/1.2 var(--font-text);
  transition: color .15s, border-color .15s;
}
.stream_lang_tab:hover { color: var(--green-soft); border-color: var(--hover-green-line); }
.stream_lang_tab.stream_lang_tab_active,
.stream_lang_tab.active {
  background: var(--green);
  border-color: var(--green);
  color: var(--on-green);
}

/* Опрос «Кто победит?» — стили живут рядом со своей вёрсткой, в 13-match.css:
   .mt-predict (полоска в хиро) и .mt-vote (карточка сайдбара). Старые классы
   .match_poll/.poll_* убраны вместе с их разметкой. */

/* ---------- Тело статьи новости (news.page_content — сырой HTML) ---------- */
.news-article__body p { margin: 0 0 12px; }
.news-article__body img { max-width: 100%; height: auto; border-radius: 12px; }
.news-article__body iframe { max-width: 100%; }
.news-article__body a { color: var(--green-soft); }
.news-article__body a:hover { color: var(--green-pale); }
.news-article__body ul, .news-article__body ol { margin: 0 0 12px; padding-inline-start: 20px; }
.news-article__body li { margin-bottom: 6px; }

/* Live-режим новости: плеер занимает колонку статьи */
.news-grid--live .news-article h1 { margin-bottom: 14px; }
.news-grid--live .mt-player { margin: 0 0 16px; }

/* Таймер до события в новости (dynamic_news, NewsShowTimer) */
.news-countdown {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  margin: 14px 0;
  padding: 16px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
}
.news-countdown__label {
  font: 600 12px/1.2 var(--font-text);
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: .06em;
}
.news-countdown__timer {
  font: 700 28px/1.2 var(--font-display);
  color: var(--green);
  font-variant-numeric: tabular-nums;
}

/* ---------- Разное ---------- */
/* Лига: скрытая панель типа статистики + дропдаун выбора тура */
.lg-stats__body--hidden { display: none !important; }
.lg-round-pick { position: relative; display: inline-flex; }
.lg-round-menu {
  position: absolute;
  top: calc(100% + 8px);
  left: 50%;
  transform: translateX(-50%);
  min-width: 220px;
  max-height: 320px;
  overflow: auto;
  display: none;
  flex-direction: column;
  background: var(--panel-2);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-menu);
  box-shadow: var(--shadow-menu);
  padding: 6px;
  z-index: 50;
}
.lg-round-menu.is-open { display: flex; }
.lg-round-menu a {
  padding: 8px 12px;
  border-radius: var(--r-row);
  font: 500 13px/1.3 var(--font-text);
  color: var(--ink-soft);
  white-space: nowrap;
}
.lg-round-menu a:hover { background: rgba(255,255,255,.05); color: var(--green-soft); }
.lg-round-menu a.is-active { color: var(--green-pale); font-weight: 700; }
/* Скроллбар меню — как у дропдауна поиска (.lb-search__res выше): у длинных
   турниров список туров упирается в max-height и системный скроллбар торчал
   серой колонной на тёмной панели. */
.lg-round-menu { scrollbar-width: thin; scrollbar-color: var(--line-strong) transparent; }
.lg-round-menu::-webkit-scrollbar { width: 8px; }
.lg-round-menu::-webkit-scrollbar-track { background: transparent; }
.lg-round-menu::-webkit-scrollbar-thumb { background: var(--line-strong); border-radius: 999px; }
.lg-round-menu::-webkit-scrollbar-thumb:hover { background: var(--dim); }
a.lg-round-nav { text-decoration: none; }

/* Пустое состояние списков */
.home-empty {
  padding: 28px;
  text-align: center;
  font: 600 14px/1.4 var(--font-text);
  color: var(--muted);
}

/* .home-showall («Показать все» под лентой хоккея и баскетбола) удалён:
   кнопка вела на /hockey/matches/{дата}, а разделы теперь сами показывают
   день целиком и переключают дни календарём. */
/* Блокировка скролла фона при открытой модалке настроек (local-time.js) */
body.settings_modal_open { overflow: hidden; }

/* Инструкция по отключению AdBlock (/adblock_disable) */
.adblock-doc .instruction-block {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: 18px 20px;
  margin-top: 14px;
  font: 400 14px/1.6 var(--font-text);
  color: var(--ink-soft);
}
.adblock-doc .instruction-block h2 {
  font: 600 15px/1.3 var(--font-display);
  color: var(--ink-strong);
  margin: 0 0 10px;
}
.adblock-doc .instruction-block h3 {
  font: 600 13.5px/1.3 var(--font-text);
  color: var(--ink);
  margin: 14px 0 8px;
}
.adblock-doc .instruction-block ol,
.adblock-doc .instruction-block ul { margin: 0 0 8px; padding-inline-start: 20px; }
.adblock-doc .instruction-block li { margin-bottom: 6px; }

/* Страница 404 переехала в 18-notfound.css: у неё появился макет
   (dist/untitled/404.html), а здесь живёт только то, чего в макете нет. */

/* Live-точка в заголовке группы на страницах лиг хоккея/баскета:
   .lb-live-dot вне flex-контейнера (inline) схлопывается в 0×0. */
.home-group__name .lb-live-dot { display: inline-block; vertical-align: middle; margin-inline-end: 6px; }

/* ---------- Брендинг adbetnet (слоты brand_ru / brand_no_ru) ---------- */
/* Формат «branding» сети: в div зоны приезжает <iframe> с картинкой на весь
   экран и прозрачный <a> для кликов — оба position: fixed без z-index в самом
   начале body. Сеть ждёт, что контент над ними поднимет сам сайт: её <style>
   в зоне делает это для старой разметки (header.align_center, main.main_div,
   footer), а в новой находит только footer, и статичные шапка, подшапка и
   секции уходили под картинку. Класс на <html> и обе переменные ставит скрипт
   в _header.html, когда в зоне появился такой iframe. Как устроено:
     1) шапка, подшапка, секции страницы и футер получают position: relative —
        позиционированные, они рисуются над фикс-слоями зоны в порядке
        документа. z-index им не нужен и нельзя: свой stacking context у шапки
        запер бы дропдаун поиска под подшапкой;
     2) под ленту креатива — отступ у подшапки (--lb-abn-gap): контент
        начинается на 364px от верха окна, как в старой разметке (верхняя
        панель 114 + лента 250 — настройки зоны в кабинете сети). Отступ —
        не бокс, клики в нём получает <a> зоны, как и на боковинах;
     3) подложка колонки с фоном страницы — ::after у обёртки зоны .advtest:
        в порядке документа он сразу за iframe и <a>, то есть над ними, но под
        всем контентом; абсолютный от body (отсюда position: relative у body)
        и тянется до низа документа, поэтому просветы между секциями и над
        прижатым футером не сквозят. Секции сами фон не получают: между ними
        отступы, а у SEO-блоков он ещё и снаружи рамки. Подложка шире колонки
        1140 на 20px с каждой стороны (--lb-abn-col): карточки новой вёрстки
        прижаты к краям обёртки, и на подложке ровно по колонке они упирались
        бы в боковины креатива — без воздуха, который сверху даёт padding
        секций. 20px — штатный боковой гаттер вёрстки там, где колонка не
        помещается (99-responsive). Сеть кладёт боковины вплотную к колонке
        1140, так что подложка накрывает их внутренние 20px: рисунок там и
        так уходит «под страницу» (в файлах креатива он обрезан по
        внутреннему краю), а кликабельная полоса сети становится уже на те
        же 20px;
     4) полноширинные SEO-секции и футер сужаются до подложки: иначе их
        прозрачный бокс лежал бы поверх боковин креатива и забирал у них
        клики.
   Числа 1140/114/250 — те же, что сеть шлёт креативу postMessage'ем
   (desktop_width/desktop_header/desktop_height); менять только вместе с
   настройками зоны в кабинете сети. В макете раскладки нет: слот — серверный. */
html.lb-abn-brand { --lb-abn-col: 1180px; }
html.lb-abn-brand body { position: relative; }
html.lb-abn-brand .lb-header,
html.lb-abn-brand .lb-nav,
html.lb-abn-brand body > section,
html.lb-abn-brand .lb-footer { position: relative; }
html.lb-abn-brand .lb-nav { margin-bottom: var(--lb-abn-gap, 242px); }
html.lb-abn-brand .advtest::after {
  content: '';
  position: absolute;
  top: var(--lb-abn-top, 364px);
  bottom: 0;
  left: 50%;
  width: min(var(--lb-abn-col), 100%);
  transform: translateX(-50%);
  background: var(--bg);
}
html.lb-abn-brand .home-seo,
html.lb-abn-brand .lg-seo,
html.lb-abn-brand .sm-seo,
html.lb-abn-brand .sm-mseo,
html.lb-abn-brand .lb-footer { width: min(var(--lb-abn-col), 100%); margin-inline-start: auto; margin-inline-end: auto; }

/* ===== partials/98-rtl.css ===== */
/* ============================================================
   Справа налево (/he, <html dir="rtl">): латиница внутри иврита
   ============================================================

   Вёрстка написана логическими свойствами и на иврите отражается сама;
   направленные мелочи (иконки, градиенты, фон селекта, поворот поля составов)
   разворачиваются правилами [dir="rtl"] рядом со своими LTR-правилами. Здесь —
   то, что касается многих партиалов сразу: имена из API и английские фразы
   раздела UFC.

   Иврита у апстримов нет (i18n.NameFallbacks), и на /he команды, игроки,
   лиги, пилоты и бойцы приходят ЛАТИНИЦЕЙ. Латинское имя, не влезшее в ячейку
   с text-overflow: ellipsis, в строке справа налево обрезалось бы с НАЧАЛА —
   «…FA Champions League», «…eissenhof»: у абзаца с направлением rtl
   многоточие стоит у левого края, а латиница упирается в него своим началом.

   unicode-bidi: plaintext берёт направление абзаца из самого текста:
   латиница обрезается с конца («UEFA Champions League Fi…»), а иврит — если
   апстрим начнёт отдавать `he` — останется справа налево. Слева направо
   правило ничего не меняет: кириллица и латиница и так ltr.

   Только ОДИНОЧНЫЕ имена. Составные подписи с ивритом внутри («UEFA Champions
   League · שלב הליגה») сюда не входят: по первой латинской букве весь абзац
   стал бы ltr, и читатель на иврите прочёл бы тур раньше лиги. Составной
   подписи из одной латиницы dir="ltr" ставит сервер (ltrText, render/
   i18nfuncs.go) — он видит текст и знает, есть ли в нём иврит.

   Выравнивание. У plaintext и start/end считаются от направления самого
   текста, то есть короткое латинское имя в ячейке во всю ширину прижалось бы
   влево — поперёк отражённой строки. Элементам, которые бывают шире своего
   текста (флекс с flex: 1, блоки), выравнивание задано физически — вправо,
   как у остальной строки. Флекс-элементы по содержимому (имена в строках
   матчей, счёт и т.п.) шириной всегда равны тексту или обрезаны — им хватает
   plaintext.

   Новое имя из API с text-overflow: ellipsis — строка сюда же. */

/* Имена-флекс-элементы: ширина равна тексту, выравнивать нечего. */
[dir="rtl"] :is(
  .lb-fixture__home span, .lb-fixture__away span, .lb-fixture__lg span, .lb-titled > .lg,
  .home-group__name, .home-hero__team-name,
  .m-search__row-name, .m-search__recent-item > span,
  .lb-account__name, .lb-modal__account-name, .m-drawer__account-name,
  .team-squad__name > span:last-child, .team-big__home span, .team-big__away span,
  .team-tr__player span, .team-tr__club span,
  .mt-ev-teams .t > span, .mt-lineups__team .nm, .mt-squad__team .nm, .mt-squad__row .nm,
  .mt-gtable__row .nm span, .mt-gtable__row .nm a, .mt-vote__name, .mt-h2h__team > span,
  .mt-pens__team, .mt-chip__name,
  .fav-item__name, .fav-group__name, .fav-simple__name, .fav-ml__name,
  .tn-fx__name, .tn-rank__name, .tn-podium__name, .tn-podium__name--pair span, .tn-podium__cty span,
  .tn-champ__name span, .tnm-side__nm, .tnm-duel__name > span:first-child, .tnm-duel__rname span,
  .tn-board__nm, .tn-group__name, .tnm-h2h__tour, .tnm-h2h__pair, .tnm-legend > span,
  .f1-leader__name, .f1-drv__name, .f1-slot__name, .f1-res__name, .f1-mini__name, .f1-past__name,
  .f1-cal__name, .f1-drv__team span:last-child, .f1-slot__team, .f1-res__team span:last-child,
  .ufcs-bout__name span, .ufcs-stats__name, .ufcs-h2h__fin-name, .ufcs-duel__name
) { unicode-bidi: plaintext; }

/* Имена, которые бывают шире текста: направление из текста, край — правый. */
[dir="rtl"] :is(
  .home-nav__name,
  .lg-rank__name b, .lg-standings__club,
  .team-mini__club, .team-roster__name,
  .tn-cal__title,
  .f1-card__name,
  .ufc-rank__name
) { unicode-bidi: plaintext; text-align: right; }

/* Раздел UFC на /he — английский: у раздела два языка, ru и en
   (ufc.LocaleFor), и ивриту, как грузинскому и узбекскому, достаётся
   английский. Его ФРАЗЫ — английские абзацы внутри зеркальной страницы, и
   без своего направления точка в конце уезжала в начало строки («.The stream
   starts…»). plaintext отдаёт абзацу направление его текста. SEO-блок
   раздела стоит вне .ufc-page/.ufcs-page, поэтому — по наличию их на
   странице: тот же .sm-seo у остальных разделов на /he ивритский и остаётся
   справа налево. */
[dir="rtl"] :is(.ufcs-card__foot, .ufcs-stats__foot, .ufcs-wait, .ufc-hero--empty),
[dir="rtl"] body:has(.ufc-page, .ufcs-page) .sm-seo :is(p, h2, .lb-kicker) { unicode-bidi: plaintext; }

/* ===== partials/99-responsive.css ===== */
/* ============================================================
   Адаптив (один файл = десктоп + мобилка).
   Собирается ПОСЛЕДНИМ партиалом — чтобы @media-переопределения
   перебивали страничные правила (media не повышает специфичность).
   ============================================================ */

/* Мобильные элементы шапки скрыты на десктопе */
.lb-header__burger {
  display: none;
  width: 40px; height: 40px; flex: none;
  border-radius: 50%; background: var(--panel); border: 1px solid var(--line-ctl);
  align-items: center; justify-content: center; color: var(--ink-soft);
}
.lb-header__burger:hover { border-color: var(--hover-green-line); color: var(--green-soft); }

/* Иконка поиска в шапке — только на мобилке (как в макете); открывает дровер с поиском */
.lb-header__msearch { display: none; }

/* Иконка вида спорта в чипах дровера */
.m-chip svg { width: 14px; height: 14px; }

/* --- Планшет: резиновые контейнеры --- */
@media (max-width: 1180px) {
  .lb-header__inner, .lb-nav__inner, .lb-footer__inner,
  .lb-container, .lb-layout,
  .lg-page, .lg-seo__grid, .team-page, .team-seo__grid,
  .mt-page, .mt-seo__grid, .news-page, .home-seo__grid,
  .hub, .doc-section, .nf-hero__inner, .nf-next {
    /* Именно 100%, а не auto: body — флекс-колонка (прибивка футера,
       см. 00-core.css), а `margin: 0 auto` у этих обёрток отменяет
       растягивание по поперечной оси. С `width: auto` флекс-элемент
       ужимается по содержимому — страница лиги с короткими названиями
       команд вставала колонкой ~350px посреди экрана, тогда как шапка и
       футер (без auto-полей) шли на всю ширину. */
    width: 100%;
    max-width: 1140px;
    padding-inline-start: 20px;
    padding-inline-end: 20px;
  }
}

/* --- Узкий десктоп / планшет: гриды в одну колонку --- */
@media (max-width: 940px) {
  .lb-layout,
  .lg-grid, .team-cal, .lg-stats__body,
  .mt-grid, .news-grid,
  .lg-seo__grid, .team-seo__grid, .mt-seo__grid, .news-seo__grid, .home-seo__grid,
  .doc-grid2 {
    grid-template-columns: 1fr;
  }
  .hub__grid { grid-template-columns: 1fr 1fr; }

  /* Вспомогательный сайдбар (Топ турниры / Страны / CTA на главной)
     на мобилке отсутствует — как в мобильном прототипе: контент идёт сразу с топ-матча */
  .lb-sidebar--aux { display: none; }

  /* Шапка становится мобильной */
  .lb-header__burger { display: inline-flex; }
  .lb-header__msearch { display: inline-flex; }               /* иконка поиска — как в макете */
  /* Настройки уезжают в дровер: в мобильном макете шестерёнки в шапке нет.
     Два селектора — разметка dist вешает data-modal-open, Go-шаблон класс. */
  .lb-header__inner > [data-modal-open="lb-settings"],
  .lb-header__settings { display: none; }
  .lb-search { display: none; }              /* поиск шапки — в своё окно (m-search) */
  .m-search:not([hidden]) { display: flex; }
  .lb-header__login { display: none; }        /* «Войти» — в дровере */
  .lb-header__tg-text { display: none; }      /* Telegram — только иконка */
  .lb-header__tg { padding: 0; width: 40px; height: 40px; border-radius: 50%; justify-content: center; }
  /* Только вертикаль: боковые 20px приходят из блока 1180 (шортхэнд их затирал) */
  .lb-header__inner { gap: 10px; padding-top: 12px; padding-bottom: 12px; }
  .lb-header__logo { margin-inline-end: auto; }
  .lb-header__logo img { height: 22px; }   /* лого мельче, как в моб. макете (десктоп 27px) */

  /* Ряд видов спорта — горизонтальный скролл */
  .lb-nav__inner { padding: 8px 20px; }
  /* Здесь избранное снова первое в ленте: прижатую вправо пилюлю в
     скроллящемся ряду пришлось бы докручивать до конца. */
  .lb-nav__fav { order: 0; margin-inline-start: 0; }

  /* ---- Вход: не модалка, а отдельный экран (макет m-login) ----
     Ставим на тот же брейкпоинт, где «Войти» уезжает в дровер: раньше на
     телефоне открывалась десктопная модалка. Разметка та же (#lb-auth) —
     меняются только слои: оверлей раскрывается на весь экран, у карточки
     появляется топбар со стрелкой «назад» и лого. Блоки способов входа — те
     же, что на экране /login (14-beta.css), вместе с их мобильными правилами.
     Селекторы двойные (.lb-overlay.lb-overlay--auth, .lb-modal.lb-auth), чтобы
     блок 600px ниже не превратил экран обратно в шторку снизу.
     Настройки шторкой снизу и остаются — их макет не менял. */
  .lb-overlay.lb-overlay--auth {
    align-items: stretch;
    justify-content: stretch;
    padding: 0;
    overflow-y: hidden;   /* прокручивается колонка .lb-auth__body */
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
  .lb-modal.lb-auth {
    display: flex;
    flex-direction: column;
    width: 100%;
    background: var(--bg);
    border: 0;
    border-radius: 0;
    padding: 0;
    box-shadow: none;
  }
  .lb-auth__bar {
    flex: none;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 16px 12px;
    background: var(--bg-header);
    border-bottom: 1px solid var(--line-soft);
  }
  [dir="rtl"] .lb-auth__back svg { transform: scaleX(-1); } /* «назад» справа налево — вправо */
  .lb-auth__back {
    flex: none;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--panel);
    border: 1px solid var(--line-ctl);
    color: var(--ink-soft);
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  .lb-auth__logo { height: 22px; display: block; }
  /* Колонка контента: на планшете (до 940px) не растягиваем на всю ширину */
  .lb-auth__body {
    flex: 1;
    min-height: 0;
    width: 100%;
    max-width: 480px;
    margin: 0 auto;
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: 28px 20px calc(28px + env(safe-area-inset-bottom));
  }
  .lb-auth .lb-modal__head { margin-bottom: 0; }
  .lb-auth .lb-modal__title { font-size: 21px; color: var(--ink-strong); }
  .lb-auth .lb-modal__x { display: none; }   /* закрывает стрелка «назад» */
  .lb-auth__hint { line-height: 1.6; margin: 8px 0 20px; }
  /* Плашка звезды гостя: шапка здесь без нижнего поля, и без своего верхнего
     плашка ложилась рамкой прямо под буквы заголовка. Её видит каждый гость,
     нажавший звезду. */
  .lb-auth__limit { margin-top: 14px; }
  /* Переход на домен входа (открытый домен): та же причина —
     шапка без нижнего поля, и подзаголовок прилип бы к заголовку. */
  .lb-move__lead { margin-top: 10px; }
}

/* --- Мобилка --- */
@media (max-width: 600px) {
  :root { --r-card: 14px; --r-lg: 16px; --r-xl: 16px; }

  .lb-h1 { font-size: 24px; }
  .lb-h2 { font-size: 17px; }

  .lb-header__inner, .lb-nav__inner, .lb-footer__inner,
  .lb-container, .lb-layout,
  .lg-page, .lg-seo__grid, .team-page, .team-seo__grid,
  .mt-page, .mt-seo__grid, .news-page, .home-seo__grid,
  .hub, .doc-section, .nf-hero__inner, .nf-next {
    padding-inline-start: 14px;
    padding-inline-end: 14px;
  }

  .hub__grid { grid-template-columns: 1fr; }

  /* Узкие экраны (iPhone SE, 320px): бургер 40 + лого 93 + две иконки 43 +
     Telegram 40 + четыре зазора 10 + поля 28 = 327px — кнопка Telegram
     вылезала за правый край. Ужимаем зазоры и поля шапки. */
  @media (max-width: 360px) {
    .lb-header__inner { gap: 7px; padding-inline-start: 10px; padding-inline-end: 10px; }
    .lb-header__logo img { height: 20px; }
  }

  /* Футер — в столбик */
  .lb-footer__row { flex-direction: column; align-items: flex-start; gap: 14px; }
  .lb-footer__links { flex-wrap: wrap; gap: 14px; }

  /* Модалки — почти на весь экран, прижаты книзу */
  .lb-overlay { align-items: flex-end; padding: 0; }
  .lb-modal, .lb-modal--sm {
    width: 100%;
    border-radius: var(--r-lg) var(--r-lg) 0 0;
    padding: 20px 18px calc(20px + env(safe-area-inset-bottom));
  }
  .lb-select select { width: 180px; }

  /* Строка матча — вертикальный блок, как в мобильном прототипе:
     [звезда] [две строки команд: лого+имя] | [время/статус + счёт через разделитель] */
  /* Колонка времени/статуса: не фиксированные 58px, а minmax(72px, auto).
     58px хватало только на «22:00»: «Перерыв», «Пенальти», «Завершен» и тем
     более «Матч перенесен» вылезали из ячейки влево и наезжали на названия
     команд. 72px закрывают все статусы ru/ua/ka, а auto оставляет запас на
     случай ещё более длинного перевода — колонка расширится, но текст никогда
     не поедет на соседа. */
  .lb-fixture,
  .lg-round .lb-fixture {
    grid-template-columns: 18px minmax(0, 1fr) minmax(72px, auto);
    grid-template-rows: auto auto;
    gap: 0 10px;
    padding: 12px 14px;
  }
  .lb-fixture > .lb-star { grid-column: 1; grid-row: 1 / 3; align-self: center; }
  .lb-fixture__home,
  .lb-fixture__away { grid-column: 2; font-size: 13px; }
  .lb-fixture__home {
    grid-row: 1;
    flex-direction: row-reverse;   /* в разметке имя+лого — визуально лого слева, как в макете */
    justify-content: flex-end;
    text-align: start;
    padding-bottom: 4px;
  }
  .lb-fixture__away { grid-row: 2; padding-top: 4px; }
  .lb-fixture__home span,
  .lb-fixture__away span { min-width: 0; }
  .lb-fixture__home img,
  .lb-fixture__away img { width: 18px; height: 18px; }
  .lb-fixture__time,
  .lb-fixture__score {
    grid-column: 3;
    display: flex;
    align-self: stretch;           /* тянемся на всю высоту строки → разделитель непрерывный (одна полоска, а не два куска) */
    justify-content: flex-end;
    text-align: end;
    border-inline-start: 1px solid rgba(255, 255, 255, 0.07);
    padding-inline-start: 10px;
  }
  .lb-fixture__time { grid-row: 1; align-items: flex-end; padding-bottom: 2px; }
  .lb-fixture__score { grid-row: 2; align-items: flex-start; padding-top: 2px; }
  /* статус завершённого матча — мелким (как в макете), чтобы узкая колонка совпадала по ширине с «22:00».
     Без white-space: nowrap — «Матч перенесен»/«Матч отменен» переносятся по
     словам внутри колонки, а не вылезают из неё одной строкой. */
  .lb-fixture[data-st="fin"] .lb-fixture__time { font-size: 10.5px; font-weight: 700; color: var(--dim); }
  /* лайв на мобилке: минута 10.5/800 коралловая + точка (5px, красная); счёт 13/800 коралловый — 1:1 с макетом */
  .lb-fixture[data-st="live"] .lb-fixture__time { font-size: 10.5px; font-weight: 800; color: #FF6B6B; gap: 5px; }
  .lb-fixture[data-st="live"] .lb-fixture__score { font-size: 13px; font-weight: 800; color: #FF6B6B; }
  /* будущий матч: только время, жирным по центру обеих строк (счёт-заглушка скрыт) */
  .lb-fixture[data-st="up"] .lb-fixture__time {
    grid-row: 1 / 3;
    align-items: center;
    padding-bottom: 0;
    font-size: 13px;
    font-weight: 700;
    color: var(--ink);
  }
  .lb-fixture[data-st="up"] .lb-fixture__score { display: none; }

  /* Событие: счёта нет ни при каком статусе, поэтому вторая строка колонки
     пустует — отдаём её времени целиком (так же выглядит будущий матч).
     Заголовок одиночного события занимает обе строки колонки команд. */
  .lb-fixture--ev[data-st] .lb-fixture__score { display: none; }
  .lb-fixture--ev .lb-fixture__time { grid-row: 1 / 3; align-items: center; padding-bottom: 0; }
  /* text-align: left — не наследство, а переопределение: в базовом правиле
     заголовок по центру (там ячейка стоит на месте счёта), а здесь он в
     колонке команд, и те выровнены по левому краю. */
  .lb-fixture__single { grid-column: 2; grid-row: 1 / 3; align-self: center; white-space: normal; text-align: start; }
  .lb-fixture__arrow { display: none; }

  /* варианты без колонки-звезды (избранное, сайдбар новости) */
  #fav-list .lb-fixture,
  .news-side__card .lb-fixture { grid-template-columns: minmax(0, 1fr) minmax(72px, auto); }
  #fav-list .lb-fixture__home, #fav-list .lb-fixture__away,
  .news-side__card .lb-fixture__home, .news-side__card .lb-fixture__away { grid-column: 1; }
  #fav-list .lb-fixture__time, #fav-list .lb-fixture__score,
  .news-side__card .lb-fixture__time, .news-side__card .lb-fixture__score { grid-column: 2; }

  /* строки, ведущие на внутренние страницы прототипа, подсвечены зелёным (как в макете) */
  .lb-fixture--inner .lb-fixture__home span,
  .lb-fixture--inner .lb-fixture__away span { color: var(--green); }

  /* Широкие таблицы — горизонтальный скролл внутри карточки */
  .lb-table-scroll { overflow-x: auto; scrollbar-width: none; }
  .lb-table-scroll::-webkit-scrollbar { display: none; }

  /* Ряды табов и пилюль — горизонтальный скролл вместо переноса */
  .lb-tabs, .lg-stats__tabs, .mt-ev-filters, .fav-filter, .home-matches__head .lb-tabs {
    flex-wrap: nowrap;
    overflow-x: auto;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .lb-tabs::-webkit-scrollbar, .lg-stats__tabs::-webkit-scrollbar,
  .mt-ev-filters::-webkit-scrollbar, .fav-filter::-webkit-scrollbar { display: none; }

  /* Дропдауны выбора тура и сезона на лиге: absolute-меню центрируется под
     кнопкой, а кнопка стоит в тесном ряду справа от заголовка — на 390px меню
     шириной 220px вылезало на 14px за правый край и добавляло СТРАНИЦЕ
     горизонтальную прокрутку. Делаем меню fixed: тогда его ставит и зажимает в
     экран placeFixedMenu из app.js (та же ветка data-menu-open, что у прочих
     меню), а не CSS вслепую. */
  .lg-round-menu,
  .lg-season-menu { position: fixed; inset-inline-start: auto; transform: none; max-width: calc(100vw - 24px); }
  .lb-tabs > *, .lg-stats__tabs > *, .mt-ev-filters > *, .fav-filter > * { flex: none; }

  /* ---- Лента событий матча: на телефоне она устроена иначе ----
     Хендофф «LiveBall Моб События матча». Десктопная двусторонняя лента здесь
     не ужимается, а заменяется: на 375px половинка строки — это ~130px, и в
     ней рвётся любое имя, а гол теряется среди замен, потому что все строки
     одной высоты. Мобильная лента — одна колонка, высота строки по важности
     события: гол — карточка со счётом (лента читается как история счёта),
     карточки и замены — фоновые однострочники. Сторона видна по бейджу клуба
     у правого края, а не по колонке.

     Разметка та же самая: .mt-event__body раскрывается display:contents, и её
     дети становятся ячейками сетки строки наравне с минутой. Текст в строке
     тоже есть в двух редакциях (см. EventRow.Name) — здесь гаснет десктопная
     и зажигается мобильная. */
  .mt-event { border-top: 0; }
  .mt-event__body { display: contents; text-align: start; }
  .mt-event__text > b, .mt-event__note, .mt-event__swap { display: none; }
  .mt-event__name { display: block; }
  .mt-event__detail { display: block; font-weight: 500; }
  /* Бейдж клуба: картинку даёт переменная контейнера ленты (её печатает
     _highlights.html), сторону выбирает is-a — тот же класс, что на десктопе
     двигал строку в правую колонку. */
  .mt-event__club { display: block; background: var(--ev-logo-h) center / contain no-repeat; }
  .mt-event.is-a .mt-event__club { background-image: var(--ev-logo-a); }

  /* Гол — карточка: иконка | автор и уточнение | счёт над минутой | клуб */
  .mt-event[data-st="goal"] {
    grid-template-columns: 20px minmax(0, 1fr) auto 22px;
    column-gap: 9px; row-gap: 3px;
    margin: 7px 0; padding: 10px 11px;
    border-radius: 13px;
    background: rgba(88, 219, 36, 0.07);
    border: 1px solid rgba(88, 219, 36, 0.25);
  }
  .mt-event[data-st="goal"] .mt-event__ico { grid-area: 1 / 1 / 3 / 2; }
  .mt-event[data-st="goal"] .mt-event__ico svg { width: 16px; height: 16px; }
  .mt-event[data-st="goal"] .mt-event__text { grid-area: 1 / 2 / 3 / 3; }
  /* Двойные фамилии в карточке гола переносятся, но не больше чем на две
     строки: третья растит карточку так, что перепад высот с фоновой
     строкой перестаёт читаться как важность события. */
  .mt-event[data-st="goal"] .mt-event__name {
    font-size: 13px; font-weight: 800; color: var(--ink); line-height: 1.3;
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;
  }
  .mt-event[data-st="goal"] .mt-event__detail { font-size: 10.5px; color: var(--muted); line-height: 1.3; margin-top: 2px; }
  /* Счёт после гола теряет чрому бейджа: в карточке он и так главный, а рамка
     спорила бы с рамкой самой карточки. Скрытие счёта не трогаем — маску
     «? : ?» вписывает local-time.js в тот же узел. */
  .mt-event[data-st="goal"] .mt-event__score {
    grid-area: 1 / 3 / 2 / 4;
    padding: 0; border: 0; background: none; border-radius: 0;
    font-size: 15px; font-weight: 800; color: var(--green-soft); line-height: 1; text-align: end;
  }
  .mt-event[data-st="goal"] .mt-event__min { grid-area: 2 / 3 / 3 / 4; text-align: end; font-size: 10px; color: var(--dim); }
  .mt-event[data-st="goal"] .mt-event__club { grid-area: 1 / 4 / 3 / 5; width: 22px; height: 22px; }

  /* Карточки и замены — фоновая строка: минута | иконка | имя | клуб */
  .mt-event:not([data-st="goal"]) {
    grid-template-columns: 34px 16px minmax(0, 1fr) 20px;
    gap: 8px; margin: 0 -2px; padding: 5px 4px; border-radius: 8px;
  }
  /* Ряд у фоновой строки один, и каждой ячейке он назван явно. Автоместо тут
     не годится: строка перечисляет ячейки в порядке разметки (текст, иконка,
     минута, клуб), то есть 3 → 2 → 1 → 4, а автоукладка не ходит назад — она
     заводит второй ряд, и строка выходит вдвое выше. */
  .mt-event:not([data-st="goal"]) .mt-event__min { grid-row: 1; grid-column: 1; text-align: start; font-size: 11px; color: var(--dim); }
  .mt-event:not([data-st="goal"]) .mt-event__ico { grid-row: 1; grid-column: 2; justify-content: center; opacity: 0.85; }
  .mt-event:not([data-st="goal"]) .mt-event__ico svg { width: 14px; height: 14px; }
  .mt-event:not([data-st="goal"]) .mt-event__score { display: none; }
  /* Уточнение идёт той же строкой и режется многоточием вместе с именем —
     высота фоновой строки обязана быть постоянной, иначе плотность, ради
     которой всё затевалось, рассыпается на длинных именах. */
  .mt-event:not([data-st="goal"]) .mt-event__text {
    grid-row: 1; grid-column: 3; min-width: 0; font-size: 11.5px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .mt-event:not([data-st="goal"]) .mt-event__name { display: inline; font-weight: 600; color: var(--ink-soft); }
  .mt-event:not([data-st="goal"]) .mt-event__detail { display: inline; color: var(--dim); }
  .mt-event:not([data-st="goal"]) .mt-event__detail::before { content: ' · '; }
  .mt-event:not([data-st="goal"]) .mt-event__club { grid-row: 1; grid-column: 4; width: 20px; height: 20px; opacity: 0.75; }
  /* Замена: ↓ у ушедшего с поля вместо предлога «вместо» — предлог требует
     родительного падежа имени, а в контракте имена именительные (та же
     причина, по которой на десктопе стоит стрелка, а не слово). */
  .mt-event[data-st="sub"] .mt-event__detail::before { content: ' · ↓ '; }
  /* Красная карточка — та же фоновая строка, но с подложкой и белым именем:
     иначе удаление читается как рядовая замена. Масть тут только у иконки:
     data-st у обеих карточек общий, «Карточки» — один фильтр на обе. */
  .mt-event:has(.mt-event__ico.red) { background: rgba(255, 69, 69, 0.08); }
  .mt-event:has(.mt-event__ico.red) .mt-event__name { color: var(--ink); }

  .mt-ev-break { border-top: 0; padding: 10px 6px 4px; }

  /* Шапка составов: что резать, когда два названия со схемами не влезают.
     По умолчанию флекс делит нехватку между блоками команд пропорционально их
     ширине — и короткое имя теряло почти половину («Ботафого» → «Бот…»), хотя
     виновато длинное. Раскрываем блоки команд — тогда шесть узлов
     (лого, имя, схема ×2) становятся ячейками одной строки, и делёж идёт МЕЖДУ
     ИМЕНАМИ: `flex: 1 1 0` даёт обоим поровну, `max-width: max-content` не даёт
     взять больше нужного и возвращает остаток соседу. Короткое имя остаётся
     целым, режется только то, что действительно не помещается.
     Зазор между командами держит auto-поле у схемы хозяев: justify-content с
     раскрытыми блоками растащил бы и лого от своего имени.

     Условие `:has(.scheme)` — не украшение: ту же пару .mt-lineups__team
     выводит легенда команд над статистикой (_statistics.html), схем там нет,
     и в строку она влезает целиком. */
  .mt-lineups__teams:has(.scheme) { gap: 8px; }
  .mt-lineups__teams:has(.scheme) .mt-lineups__team { display: contents; }
  .mt-lineups__teams:has(.scheme) .nm { flex: 1 1 0; max-width: max-content; }
  .mt-lineups__teams:has(.scheme) .mt-lineups__team:first-child .scheme { margin-inline-end: auto; }

  /* Легенда команд и чипы — по хендоффу: обе команды слева, лого крупнее.
     Ряд чипов уходит под края карточки (её паддинг 20px), чтобы прокрутка
     начиналась и кончалась у самой рамки, а не в 20px от неё. */
  .mt-ev-teams { justify-content: flex-start; gap: 14px; padding: 0 0 6px; }
  .mt-ev-teams .t { gap: 6px; font-size: 11px; font-weight: 600; }
  .mt-ev-teams .t:last-child { flex-direction: row-reverse; }
  .mt-ev-teams .t img { width: 20px; height: 20px; }
  .mt-ev-filters { gap: 6px; margin: 0 -14px; padding: 0 14px; }
  .mt-ev-filters .lb-pill { padding: 5px 11px; font-size: 11px; }
  .mt-ev-filters .n { font-size: 9.5px; }

  /* ---- Составы и таблица матча: хендофф «LiveBall Моб Составы и Таблица» ----
     Паддинг панели 14px вместо 20px — он общий у всех вкладок матча, и эти
     12px ширины нужны всем: и таблице, и подписям на поле, и шапке схем. */
  .mt-panel-card { padding: 14px; }

  /* Шапка схем над полем: мельче, схема зелёная — это значение, а не подпись. */
  .mt-lineups__team img { width: 18px; height: 18px; }
  .mt-lineups__team .nm { font-size: 11.5px; font-weight: 700; }
  .mt-lineups__team .scheme { font-size: 10px; font-weight: 700; color: var(--green-soft); }

  /* Разметка поля по хендоффу: кант 10px, круг 60px, штрафные 172×56, полосы
     через 60px. Само поле развёрнуто вертикально в 13-match.css — там же
     живут повороты линий, здесь только размеры. */
  .mt-pitch { background: repeating-linear-gradient(0deg, #166322 0 60px, #125420 60px 120px); }
  .mt-pitch__lines { inset: 10px; }
  .mt-pitch__lines::after { width: 60px; height: 60px; }
  .mt-pitch__box { width: 172px; height: 56px; }
  .mt-pitch__box--l { top: 10px; }
  .mt-pitch__box--r { bottom: 10px; }
  /* Фишка занимает всю свою колонку схемы: --pw — шаг именно ЭТОЙ линии
     (render/funcs.go, lineupStyle). Фиксированные 48px подгонялись под самую
     тесную схему, и в остальных фамилия зря ехала на вторую строку — на живом
     матче переносилась 21 подпись из 22. Фолбэк 16% — на случай, если из
     htmlcache прилетит партиал, отрендеренный до появления переменной. */
  .mt-chip { width: calc(var(--pw, 16%) - 6px); }
  .mt-chip__ava { width: 34px; height: 34px; }
  .mt-chip__name { font-size: 9.5px; }

  /* Запасные: без фото (кружок 26px съедал треть строки, фамилии оставалось
     ~90px), номер зелёный у левого края, строки разделены линиями. Зеркальность
     гостевой колонки снята — в узкой колонке «имя → номер» читается наоборот. */
  .mt-squad { gap: 14px; margin-top: 14px; }
  /* Зеркало гостевой колонки снимается целиком: на 152px «имя → номер → фото»
     и заголовок у правого края читаются задом наперёд. */
  .mt-squad__team { gap: 7px; margin-bottom: 10px; }
  .mt-squad__team .nm { font-size: 11.5px; }
  .mt-squad__team .scheme { font-size: 10px; }
  .mt-squad__col--away .mt-squad__team { flex-direction: row; }
  .mt-squad__col--away .mt-squad__team .t { align-items: flex-start; }
  .mt-squad__col h3 { font-size: 9px; letter-spacing: 0.08em; margin-bottom: 4px; }
  .mt-squad__col--away h3 { justify-content: flex-start; }
  .mt-squad__row { gap: 7px; padding: 4.5px 0; border-top: 1px solid rgba(255, 255, 255, 0.04); }
  /* У гостей узлы строки лежат зеркально (имя → номер → фото), поэтому мало
     сдвинуть строку влево — надо развернуть и порядок: row-reverse даёт
     «номер → имя», как в домашней колонке, а flex-end в развёрнутой оси —
     это левый край. */
  .mt-squad__col--away .mt-squad__row { flex-direction: row-reverse; justify-content: flex-end; }
  .mt-squad__row img { display: none; }
  .mt-squad__row .num { width: 16px; text-align: end; font-size: 10.5px; font-weight: 800; color: var(--green-soft); }
  .mt-squad__col--away .mt-squad__row .num { text-align: end; }
  .mt-squad__row .nm { font-size: 11.5px; color: #DFE5DB; }
  .mt-squad__col--away .mt-squad__row .nm { text-align: start; }
  /* Тренер — плашкой на подложке (порядок «шапка → тренер → запасные» задаёт
     сама разметка, см. _lineups.html). */
  .mt-squad__coach {
    margin-bottom: 10px; padding: 8px 10px;
    background: rgba(255, 255, 255, 0.04); border-radius: 10px;
  }
  .mt-squad__coach .lbl { font-size: 9px; letter-spacing: 0.08em; margin-bottom: 2px; }
  .mt-squad__coach .nm { padding: 0; font-size: 11.5px; font-weight: 700; color: var(--ink); }
  .mt-squad__col--away .mt-squad__coach { text-align: start; }

  /* Турнирная таблица: из семи колонок на 375px клубу оставалось ~105px.
     По хендоффу на телефоне остаются #, клуб, «И» и очки — В/Н/П прячутся
     (класс c--wdl проставлен в _table.html: прятать по номеру ячейки значило
     бы поймать следующую колонку, которую кто-нибудь добавит). */
  .c--wdl { display: none; }
  .mt-gtable__head,
  .mt-gtable__row { grid-template-columns: 20px minmax(0, 1fr) 26px 26px; gap: 6px; }
  /* Горизонтальные отступы у шапки и строк НЕ переопределяем — работают
     базовые 12px. Своих 2px тут не хватало: место прилипало к краю подложки
     (в макете его отодвигает полоса зоны с отбивкой, а у нас зоны нет —
     полей API). Заодно отступы шапки и строк не разъезжаются: они одни. */
  .mt-gtable__head { font-size: 9.5px; letter-spacing: 0.06em; }
  /* Очки по ЦЕНТРУ своей колонки, а не по правому краю: там и однозначные, и
     двузначные числа, и по правому краю ряд из «6» и «13» встаёт вразнобой.
     Из-за центрирования цифра стоит дальше от края строки, чем место слева, —
     это осознанно. */
  .mt-gtable__row { padding: 7px 12px; font-size: 12px; }
  .mt-gtable__row .pos { font-size: 11px; color: var(--muted); }
  .mt-gtable__row .c { font-size: 11px; font-weight: 600; }
  .mt-gtable__head .c:last-child { text-align: center; }
  .mt-gtable__row .p { text-align: center; font-size: 12px; }
  /* Команды этого матча — единственные белые и жирные в таблице: подсветкой
     фона на телефоне их уже почти не видно среди 20 строк. */
  .mt-gtable__row .nm a { color: var(--ink-soft); font-weight: 600; }
  .mt-gtable__row.is-me .nm a { color: var(--ink); font-weight: 800; }
}

/* Догоняющие правки адаптива */
@media (max-width: 720px) {
  .doc-stats { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 600px) {
  .doc-hero { padding: 26px 20px 28px; }
  .doc-title { font-size: 23px; }
  .doc-hero .doc-title { font-size: 25px; }
  .doc-cta { grid-template-columns: 1fr; gap: 14px; }
  .doc-cta .lb-btn { justify-self: start; }
  .doc-step__num { width: 24px; }   /* 20px мало: «02»…«04» Unbounded'ом занимают 23px */
  /* News: перенос длинных слов/тегов, чтобы не распирали */
  .news-article__body, .news-quote, .news-tags a { overflow-wrap: anywhere; }
  .news-share { flex-wrap: wrap; }
  .news-matchcard { flex-wrap: wrap; gap: 10px; padding: 18px; }
  .news-matchcard__team { font-size: 15px; }
}
@media (max-width: 600px) {
  /* Лига: статистика бомбардиров в столбик, карточка лидера сверху */
  .lg-stats__body { gap: 14px; }
  /* Лига: компактная горизонтальная шапка как в макете (m-league) */
  .lg-hero { flex-direction: row; align-items: center; gap: 14px; padding: 18px 16px; text-align: start; }
  .lg-hero__logo { width: 52px; height: 52px; }
  .lg-hero__body { gap: 6px; min-width: 0; }
  .lg-hero__title h1 { font-size: 19px; }
  .lg-hero__meta { flex-wrap: wrap; gap: 7px; font-size: 11px; }
  .lg-hero__meta img { height: 10px; }
  /* Таблица лиги и состав команды — горизонтальный скролл, чтобы колонки не сжимались */
  .lg-standings, [data-panel="squad"] .lb-card { overflow-x: auto; scrollbar-width: none; }
  .lg-standings::-webkit-scrollbar, [data-panel="squad"] .lb-card::-webkit-scrollbar { display: none; }
  .lg-standings__head, .lg-standings__row { min-width: 340px; }
  .team-squad__group { min-width: 460px; }
  .team-squad__head, .team-squad__row { min-width: 460px; }
  /* Команда: компактная горизонтальная шапка как в макете (m-team) */
  .team-hero { flex-direction: row; align-items: center; gap: 14px; padding: 18px 16px; }
  .team-hero__logo { width: 52px; height: 52px; }
  .team-hero__body { gap: 6px; }
  .team-hero__title h1 { font-size: 19px; }
  .team-hero__meta { flex-wrap: wrap; gap: 7px; font-size: 11px; }
  .team-hero__meta img { height: 10px; }
  .team-hero__meta-extra { display: none; }   /* стадион/тренер прячем — как в макете */
  .team-hero__form { gap: 4px; margin-top: 2px; }
  .team-hero__form .lbl { display: none; }     /* без подписи «Форма», только кружки */
  .team-hero__form span:not(.lbl),
  .team-hero__form a { width: 16px; height: 16px; border-radius: 50%; font-size: 9px; }

  /* Табы команды — одна строка с горизонтальным скроллом (как в макете) */
  .team-tabs {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
  }
  .team-tabs::-webkit-scrollbar { display: none; }
  .team-tabs > * { flex: none; }

  /* Строки календаря команды (.team-fix / .team-res) — в 12-team.css: правила
     там идут с `.team-page`, и дублировать их здесь бесполезно, специфичность
     всё равно за ними. Раньше в этом месте лежала вторая, более слабая версия
     той же раскладки — она не применялась НИКОГДА и вдобавок ссылалась на
     .team-fix__pair, которого нет в разметке. */

  /* Статистика команды — карточки в один столбец (иначе строки не влезают) */
  .team-stats { grid-template-columns: 1fr; }
  .team-form10 { flex-wrap: wrap; }
}

/* --- Главная: мобильная раскладка как в прототипе --- */
@media (max-width: 600px) {
  /* Топ-5 лиг — горизонтальный слайдер (5 карточек в ряд), а не 2+3 */
  .home-leagues__rows { flex-direction: row; flex-wrap: nowrap; overflow-x: auto; gap: 12px; padding-bottom: 4px; scrollbar-width: none; }
  .home-leagues__rows::-webkit-scrollbar { display: none; }
  .home-leagues__row { display: contents; }          /* разворачиваем оба ряда в один скролл */

  /* Карточка лиги в м-макете компактная: 240×136, r18 (не 82% ширины экрана) */
  .home-lc,
  .home-lc--sm { flex: 0 0 240px; height: 136px; border-radius: 18px; }
  .home-lc .home-lc__country,
  .home-lc--sm .home-lc__country { inset-inline-start: 14px; top: 13px; gap: 6px; font-size: 9px; }
  .home-lc .home-lc__country img { height: 10px; }
  .home-lc .home-lc__name,
  .home-lc--sm .home-lc__name { inset-inline-start: 14px; bottom: 40px; font-size: 16px; }
  .home-lc--sm .home-lc__name { font-size: 14px; }
  .home-lc .home-lc__cta,
  .home-lc--sm .home-lc__cta { inset-inline-start: 14px; bottom: 14px; font-size: 11.5px; }

  /* Позиции вотермарок и фото пересчитаны под 240px (значения из m-home).
     Карточка тут фиксированная, так что арт снова кладём от левого края и
     сверху: резиновая привязка к правому краю и вынос translateY (см. базовые
     правила) здесь не нужны. */
  .home-lc .home-lc__wm,
  .home-lc .home-lc__photo { inset-inline-end: auto; transform: none; }
  .home-lc--epl .home-lc__wm { inset-inline-start: 104px; top: 0; width: 112px; height: 136px; }
  .home-lc--epl .home-lc__photo { inset-inline-start: 116px; top: -4px; width: 140px; height: 182px; }
  .home-lc--laliga .home-lc__wm { inset-inline-start: 84px; top: -6px; width: 150px; height: 148px; }
  .home-lc--laliga .home-lc__photo { inset-inline-start: 112px; top: -2px; width: 152px; height: 180px; }
  .home-lc--bundesliga .home-lc__wm { inset-inline-start: 44px; top: 3px; width: 160px; height: 130px; }
  .home-lc--bundesliga .home-lc__photo { inset-inline-start: 100px; top: 2px; width: 146px; height: 146px; }
  .home-lc--ligue1 .home-lc__wm { inset-inline-start: 40px; top: -16px; width: 168px; height: 158px; }
  .home-lc--ligue1 .home-lc__photo { inset-inline-start: 86px; top: 0; width: 164px; height: 164px; }
  .home-lc--seriea .home-lc__wm { inset-inline-start: 46px; top: 8px; width: 126px; height: 112px; }
  .home-lc--seriea .home-lc__photo { inset-inline-start: 104px; top: -1px; width: 140px; height: 140px; }

  /* SEO «О проекте» на мобилке — мельче (как в макете: h2 16, текст 13), компактнее и с воздухом снизу */
  .home-seo .lb-h2 { font-size: 16px; }
  .home-seo .lb-kicker { font-size: 10px; }
  .home-seo__body { font-size: 13px; }
  .home-seo__grid { gap: 20px; padding-top: 26px; padding-bottom: 36px; }

  /* Хиро топ-матча — 1:1 с мобильным прототипом (m-home):
     шапка [лого 16][турнир 11px]…[ТОП МАТЧ][звезда];
     сетка [команда | «СЕГОДНЯ · 22:00» + таймер | команда], коэффициенты отдельным рядом */
  .home-hero__head { gap: 8px; padding: 12px 14px; }
  .home-hero__league-logo { order: 1; width: 16px; height: 16px; }
  .home-hero__league { order: 2; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; }
  .home-hero__badge { order: 3; font-size: 9.5px; padding: 5px 10px; }
  .home-hero__star { order: 4; }
  .home-hero__when { display: none; }          /* дата теперь в центре, над таймером */

  .home-hero__glow { width: 260px; height: 240px; top: -80px; }
  .home-hero__glow--l { inset-inline-start: -90px; }
  .home-hero__glow--r { inset-inline-end: -90px; }

  .home-hero__grid {
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    gap: 0 10px;
    padding: 20px 14px 16px;
  }
  .home-hero__grid > .home-hero__team { grid-row: 1; gap: 8px; }
  .home-hero__team img { width: 52px; height: 52px; }
  /* 10.5px, а не 11.5: имя набрано Unbounded — он широкий, и «Ференцварош»
     (110px) не влезал в колонку 106px. overflow-wrap: anywhere рвал его
     посреди слова («Ференцваро/ш»). На 10.5px однословные названия влезают
     строкой, а перенос остаётся страховкой для совсем длинных. */
  .home-hero__team-name {
    font-size: 10.5px;
    line-height: 1.35;
    text-align: center;
    width: 100%;
    /* hyphens: auto — на 320px даже 10.5px не спасают, и вместо рубленого
       «Ференцваро/ш» получаем перенос по слогам с дефисом (lang="ru" на html
       есть). break-word вместо anywhere: рвём только то, что реально не влезло. */
    overflow-wrap: break-word;
    hyphens: auto;
  }
  /* центр прижат к низу логотипов, как в прототипе (min-height = высота лого) */
  .home-hero__center {
    grid-row: 1;
    min-width: 96px;
    min-height: 52px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-end;
    align-self: start;
  }
  .home-hero__label--desktop { display: none; }
  .home-hero__label--mobile { display: block; font-size: 9px; letter-spacing: 0.14em; margin-bottom: 8px; white-space: nowrap; }
  .home-hero__timer { font-size: 18px; }

  /* коэффициенты — ряд на всю ширину, кнопки с радиусом 9px как в прототипе */
  .home-hero__odds { grid-column: 1 / -1; grid-row: 2; margin-top: 12px; gap: 6px; }
  .home-odd { flex: 1; justify-content: center; gap: 6px; border-radius: 9px; padding: 7px 12px; font-size: 12.5px; }

  /* Окно выбора БК на телефоне — шторка снизу (мобильный экран handoff). */
  .lb-bk-overlay { align-items: flex-end; padding: 0; }
  .lb-bk {
    width: 100%; max-width: none; max-height: 88vh;
    border-radius: 22px 22px 0 0; border-inline-start: 0; border-inline-end: 0; border-bottom: 0;
    box-shadow: 0 -20px 50px rgba(0, 0, 0, 0.5);
    animation: lbBkUp 0.22s cubic-bezier(0.2, 0.8, 0.2, 1) both;
  }
  @keyframes lbBkUp {
    from { transform: translateY(100%); }
    to { transform: none; }
  }
  .lb-bk__grip { display: block; width: 38px; height: 4px; border-radius: var(--r-pill); background: rgba(255, 255, 255, 0.22); margin: 10px auto 4px; }
  .lb-bk__head { padding: 6px 16px 14px; }
  .lb-bk__title { font-size: 15px; }
  .lb-bk__list { padding: 0 8px 8px; }
  .lb-bk__row { min-height: 56px; padding: 9px 8px; gap: 12px; border-radius: 13px; }
  .lb-bk__logo, .lb-bk__name { width: 84px; }
  /* Бейдж «Выбор LiveBall» на телефоне не помещается между вордмарком, бонусом
     и кнопкой — строка сжималась бы до нечитаемого. Порядок офферов и так
     задан админкой, первый стоит первым. */
  .lb-bk__badge { display: none; }
  /* CTA на мобилке контурная (в макете так — зелёная заливка на узкой строке
     перетягивает внимание с бонуса). */
  .lb-bk__cta { background: none; border: 1px solid rgba(255, 255, 255, 0.16); color: var(--ink-soft); padding: 9px 15px; }
  .lb-bk__row:hover .lb-bk__cta { background: none; }
  .lb-bk__note { padding: 11px 16px 20px; font-size: 10px; text-align: center; }

  /* «Матчи» на страницах лиг хоккея и баскетбола — как в прототипе:
     заголовок + дата в одной строке. Селектор по классу: там заголовок — h1
     (см. 10-home.css). Ленты дня разделов — на тулбаре ниже. */
  .home-matches__head { flex-wrap: wrap; row-gap: 12px; }
  .home-matches__head .lb-h2 { flex: 1 1 auto; }
  .home-date, .home-datenav { order: 1; }
  .home-matches__head .lb-tabs { order: 2; flex: 1 1 100%; }

  /* ---- Тулбар лент дня (.home-tb: главная, /hockey, /basketball) на
     телефоне: три строки ----
     Хендофф «LiveBall Моб Матчи тулбар» (05.09.2026). Строка 1 — заголовок,
     подпись дня («4 сентября, пт»), ссылка «Сегодня» на другой день, лупа;
     строка 2 — лента из шести дней и ячейки-календаря сеткой без скролла;
     строка 3 — сегменты со скроллом внутри пилюли и кнопка «Фильтры».
     Десктопные контролы (тумблер, сортировка, круглая кнопка календаря,
     поле поиска) спрятаны: тумблер и сортировка живут в шторке фильтров,
     календарь — в своей шторке, поле раскрывает лупа. Разметка та же, что на
     десктопе (_home_toolbar.html), меняется только видимость и раскладка. */
  .home-tb { gap: 12px; }
  .home-tb__top { flex-wrap: wrap; gap: 8px; row-gap: 12px; }
  .home-tb__title { font-size: 16px; margin-inline-end: 0; }
  .home-tb__date { display: block; flex: 1; min-width: 0; font-size: 12px; font-weight: 600; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .home-tb__today--top { display: inline-flex; font-size: 12px; padding: 0; }
  .home-tb__lupa {
    display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 34px; height: 34px; border-radius: 50%;
    background: var(--panel); border: 1px solid rgba(255, 255, 255, 0.1); color: var(--ink-soft);
  }
  .home-tb__search { display: none; }
  /* Лента дней — второй строкой шапки (order за всеми элементами первой),
     сеткой на семь колонок: шесть дней и календарь, всё влезает без скролла.
     Десктопные ячейки (без --m) и круглая кнопка календаря спрятаны, ячейка
     календаря (--cal) — наоборот. Селекторы двойные: базовое правило 10-home
     прячет всё без --d той же специфичностью, одиночный класс его не перебьёт. */
  /* align-items: stretch — иначе ячейка-календарь (в ней одна иконка) остаётся
     ниже соседей: десктопное правило центрирует элементы ленты по вертикали. */
  .home-week { flex: 1 1 100%; order: 5; display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; align-items: stretch; }
  .home-week__day:not(.home-week__day--m) { display: none; }
  .home-week__day.home-week__day--m, .home-week__day.home-week__day--cal { display: flex; }
  .home-week .fav-cal { display: none; }
  .home-week__day {
    padding: 8px 0 7px; border-radius: 14px;
    background: var(--panel); border: 1px solid var(--line);
    font-size: 10px;
  }
  .home-week__day:hover { background: var(--panel); }
  .home-week__day.home-week__day--cal { padding: 0; justify-content: center; color: var(--green-soft); }
  .home-week__num { font-size: 15px; }
  /* Сегодня, не выбран — зелёная рамка и зелёный текст; выбранный — зелёная
     ячейка, рамка в тон (иначе на зелёном видна серая). */
  .home-week__day.is-today { border-color: rgba(139, 233, 106, 0.45); color: var(--green-soft); font-weight: 800; }
  .home-week__day.is-today .home-week__num { color: var(--green-soft); font-weight: 800; }
  .home-week__day.is-sel, .home-week__day.is-sel:hover { background: var(--green); border-color: var(--green); color: var(--on-green); }
  .home-week__day.is-sel .home-week__num { color: var(--on-green); }
  .home-week__wd--t { display: none; }
  .home-week__wd--w { display: inline; }
  /* Строка 3: пилюля сегментов — по содержимому, как на десктопе, но
     сжимается до ширины строки, когда сегменты не помещаются (футбол: «Все
     358 · Live 12 · …»), — тогда они скроллятся ВНУТРИ неё (скроллбар скрыт).
     Раньше пилюля тянулась на всю строку (flex: 1), и с короткими подписями
     (теннис: «Все 39 · Live 0 · Завершенные 39 · Скоро 0») в её конце
     оставалась пустота (отзыв 22.09.2026). Справа кнопка «Фильтры»; на
     другой день чип не тянется, и правый блок держит auto-отступ базового
     правила (10-home.css). Паддинги сегментов те же 12/14, что на десктопе. */
  .home-tb__bar { flex-wrap: nowrap; }
  .home-seg { flex: 0 1 auto; min-width: 0; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
  .home-seg::-webkit-scrollbar { display: none; }
  .home-seg__btn { flex: none; font-size: 12px; }
  .home-seg__long { display: none; }
  .home-seg__short { display: inline; }
  .home-chip { font-size: 12px; }
  .home-tb__tv, .home-tb__sep, .home-tb__sort, .home-tb__today--bar { display: none; }
  .home-tb__right { flex: none; }
  .home-tb__filters {
    display: inline-flex; align-items: center; gap: 6px; flex: none;
    height: 36px; padding: 0 12px; border-radius: var(--r-pill);
    background: var(--panel); border: 1px solid rgba(255, 255, 255, 0.1); color: var(--ink-soft);
  }
  /* Точка — применён хоть один фильтр (is-on ставит app.js). */
  .home-tb__filters-dot { display: none; width: 6px; height: 6px; border-radius: 50%; background: var(--green); }
  .home-tb__filters.is-on .home-tb__filters-dot { display: inline-block; }
  /* Режим поиска (.is-search, ставит лупа в app.js): поле с «Отмена» на месте
     шапки, лента дней и сегменты скрыты, под полем заголовок выдачи
     «МАТЧИ НА 4 СЕНТЯБРЯ · N». Поле всегда «в фокусе» (зелёная рамка со
     свечением) — как у экрана поиска сайта (.m-search__field). */
  .home-tb.is-search { margin-bottom: 10px; }
  .home-tb.is-search .home-tb__title, .home-tb.is-search .home-tb__date, .home-tb.is-search .home-tb__today--top,
  .home-tb.is-search .home-tb__lupa, .home-tb.is-search .home-week, .home-tb.is-search .home-tb__bar { display: none; }
  .home-tb.is-search .home-tb__search {
    display: flex; flex: 1; width: auto; padding: 9px 14px; gap: 10px;
    border-color: rgba(88, 219, 36, 0.55); box-shadow: 0 0 0 3px rgba(88, 219, 36, 0.1); color: var(--green-soft);
  }
  .home-tb.is-search .home-tb__cancel { display: inline-flex; flex: none; font-size: 13px; font-weight: 700; color: var(--green-soft); }
  .home-tb.is-search .home-tb__found { display: flex; align-items: center; gap: 8px; }
  .home-tb__found-cap { font-size: 10.5px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--dim); }
  .home-tb__found-n { margin-inline-start: auto; font-size: 11px; font-weight: 700; color: #9AA694; }
  /* «Нет нужного? Искать везде →» под лентой; hidden снимает app.js вместе
     с режимом поиска. Своё display:none у [hidden] обязательно — авторский
     display перебивает UA-правило (см. начало 00-core). */
  .home-more { display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 4px; font-size: 12px; color: var(--dim); }
  .home-more[hidden] { display: none; }
  .home-more__btn { font-size: 12px; font-weight: 700; color: var(--green-soft); }
  /* Лента одним списком: на телефоне у строки три колонки и два ряда (звезда |
     команды | время), четвёртой колонки под марку лиги нет — она встаёт
     третьим рядом под командами, мелким и приглушённым.
     Колонки перечислены заново не для красоты: правило выше набрано списком
     («.lb-fixture, .lg-round .lb-fixture»), и его первый селектор весит 0,1,0 —
     легче, чем .home-group--time .lb-fixture из 00-core. Без этой строки на
     телефоне остаётся семиколоночная десктопная сетка, и названия команд
     сжимаются до «Фран…». */
  .home-group--time .lb-fixture {
    grid-template-columns: 18px minmax(0, 1fr) minmax(72px, auto);
    grid-template-rows: auto auto auto;
  }
  .home-group--time .lb-fixture__lg {
    grid-column: 2;
    grid-row: 3;
    padding-top: 4px;
    font-size: 10.5px;
  }
  .home-group--time .lb-fixture > .lb-star { grid-row: 1 / 4; }
  .home-group--time .lb-fixture[data-st="up"] .lb-fixture__time { grid-row: 1 / 4; }
  /* Разделитель колонки времени рисуется её border-left, поэтому нижняя ячейка
     должна доходить до низа строки — иначе под ним остаётся зазор в высоту
     ряда с лигой, и линия выглядит оборванной. */
  .home-group--time .lb-fixture__score { grid-row: 2 / 4; }
  /* Узкий экран: чип даты жмётся, стрелки — нет (в них и так только иконка). */
  .home-datenav { gap: 6px; }
  .home-date { padding: 8px 12px; }

  /* Шапка группы матчей: счётчик — голое число (подпись « матч(а)» скрыта).
     Звезда избранного на телефоне ОСТАЁТСЯ: прототип её прятал, и добавить
     лигу в избранное с телефона из ленты было негде. Название растёт
     (flex: 1 ниже), поэтому звезда встаёт справа, перед счётчиком. */
  .home-group__count-cap { display: none; }
  .home-group__name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
}

/* --- 404: цифра встаёт над заголовком, кнопки в столбик --- */
@media (max-width: 940px) {
  /* Вторая колонка под цифру исчезает, и 404 попадает в общий поток — ровно
     туда, где стоит в разметке (киккер → 404 → заголовок). Поэтому адаптиву
     нечего переставлять, достаточно снять явные grid-координаты. */
  /* Только вертикаль: боковые поля приходят из блоков 1180/600, шортхэнд
     padding их затирал — контент упирался в край экрана. */
  .nf-hero__inner {
    grid-template-columns: 1fr;
    grid-template-rows: none;
    padding-top: 40px;
    padding-bottom: 44px;
  }
  .nf-code {
    grid-column: 1;
    grid-row: auto;
    justify-self: start;
    align-self: start;
    font-size: 128px;
  }
  .nf-kicker { margin-bottom: 8px; }
  .nf-title { font-size: 30px; margin-top: 16px; }
  .nf-next__grid { grid-template-columns: repeat(3, 1fr); }
}

@media (max-width: 600px) {
  .nf-hero__inner { padding-top: 26px; padding-bottom: 22px; }
  .nf-kicker { font-size: 10px; }
  .nf-code { font-size: 104px; line-height: 0.9; }
  .nf-title { font-size: 22px; }
  .nf-text { font-size: 13.5px; line-height: 1.65; margin-top: 10px; }

  /* Кнопки во всю ширину, высота 48px — как в мобильном макете. */
  .nf-actions { flex-direction: column; align-items: stretch; gap: 9px; margin-top: 20px; }
  .nf-actions .lb-btn,
  .nf-actions .lb-btn--green { min-height: 48px; padding: 0 20px; font-size: 14.5px; }
  /* «Избранное» на телефоне убрано (как в мобильном макете): оно и так есть в
     подшапке и в дровере, а третья кнопка во всю ширину растаскивает
     внимание с главной пары «на главную / в эфире». */
  .nf-actions .nf-btn--ghost { display: none; }

  .nf-next { padding-top: 20px; padding-bottom: 4px; }
  .nf-next__cap { font-size: 10.5px; letter-spacing: 0.1em; margin-bottom: 11px; }
  /* Сетка 2×2, пятая карточка (Формула 1) — во всю ширину. */
  .nf-next__grid { grid-template-columns: 1fr 1fr; gap: 9px; }
  .nf-card {
    flex-direction: row;
    align-items: center;
    gap: 10px;
    min-height: 52px;
    padding: 0 14px;
  }
  .nf-card:last-child { grid-column: span 2; }
  .nf-card svg { flex: none; width: 18px; height: 18px; }
  /* Строка раздела становится однострочной кнопкой: подпись не помещается,
     а название набирается текстовым шрифтом, а не дисплейным. */
  .nf-card__name { font-family: var(--font-text); font-size: 13.5px; }
  .nf-card__sub { display: none; }
}
/* --- Страница входа: контейнер упёрся в края экрана --- */
@media (max-width: 1180px) {
  /* Правая колонка держит свои 480px, поэтому всё сжатие достаётся левой —
     72px полей у неё становятся заметной долей ширины. */
  .beta-brand { padding-inline-start: 40px; padding-inline-end: 40px; }
  .beta-top__inner { padding-inline-start: 20px; padding-inline-end: 20px; }
}

/* --- Страница входа: сплит схлопывается в колонку --- */
@media (max-width: 940px) {
  .beta-main { grid-template-columns: 1fr; }
  /* Браузер без grid: две колонки ему собирает флекс (14-beta.css, конец
     файла), а колонку — обычный блок. */
  @supports not (display: grid) {
    .beta-main { display: block; }
  }
  /* Свечение переезжает наверх страницы: колонки, слева от которой оно
     стояло, больше нет. */
  .beta-page {
    background:
      radial-gradient(120% 45% at 50% 0%, rgba(88, 219, 36, 0.09) 0%, rgba(88, 219, 36, 0) 60%),
      var(--beta-bg);
  }
  .beta-brand {
    border-inline-end: 0;
    padding: 44px 32px 0;
  }
  .beta-how { margin-top: 32px; }
  .beta-side { padding: 28px 32px 40px; }
  /* Карточка входа не растягивается на всю ширину: 480px — её ширина в
     десктопном макете, и читать строку длиннее незачем. */
  .beta-state { max-width: 480px; }
}

@media (max-width: 600px) {
  /* --- Телефон: мобильный макет хендоффа (375) --- */

  /* Шапка без полосы: слева логотип с бейджем «Вход», справа ссылка на
     открытую версию — в мобильном макете её не было, оставлена по просьбе
     заказчика: это единственный путь назад для того, кто войти не может.
     Ссылка не переносится, а на совсем узком экране (320) обрезается
     многоточием; зона нажатия дотянута до 44px отрицательными полями, чтобы
     не поднимать строку шапки. */
  .beta-top { background: none; border-bottom: 0; }
  .beta-top__inner { padding: 20px 20px 0; }
  .beta-top__logo { height: 22px; }
  .beta-top__badge { display: inline-block; }
  /* Блок с line-height, а не inline-flex: многоточие text-overflow рисует
     только блочный контейнер, у флекса текст просто обрезался бы. */
  .beta-top__back {
    display: block;
    min-width: 0;
    margin: -11px 0;
    font-size: 11px;
    line-height: 44px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* Язык — одним глобусом: шапка и без него занята логотипом с бейджем и
     ссылкой, а язык страницы видно по ней самой. С подписью ссылка на 375px
     обрезалась многоточием. Зона нажатия добрана полями до 44px в высоту и
     до соседей в ширину. */
  .beta-top__inner,
  .beta-top__end { gap: 10px; }
  .beta-lang__btn { padding-block: 14px; padding-inline: 10px; margin-block: -14px; margin-inline: -10px; }
  .beta-lang__ico { width: 16px; height: 16px; }
  .beta-lang__cur,
  .beta-lang__chev { display: none; }

  /* Свои слова телефона — короче и про действие. */
  .beta-dsk { display: none; }
  .beta-mob { display: inline; }

  /* ПОРЯДОК ЭКРАНА: заголовок → лид → переключатель → степпер → число сверки
     → распорка → действие выбранного способа → ошибка → подвал. В разметке
     степпер лежит в брендинговой панели (на десктопе он часть левой колонки),
     переключатель и действия — в карточке. Обычным order их не переставить,
     родители разные: display:contents убирает из потока обе колонки, обёртку
     состояния и саму карточку, и все блоки становятся детьми одного
     флекс-контейнера .beta-main. Карточка на телефоне подложки не имеет —
     фон карточки здесь получают только QR-панель и экран отказа.

     Раз карточка распакована, order обязан стоять у КАЖДОГО её прямого
     ребёнка, который на телефоне виден: блок без order уезжает в самое начало
     (по умолчанию 0) — выше заголовка страницы. Так уже терялись блоки; список
     ниже — полный, добавляешь блок в карточку — добавляй и сюда. */
  .beta-brand,
  .beta-side,
  .beta-page[data-beta-view="login"] [data-beta-state="login"],
  .beta-page[data-beta-view="login"] [data-beta-state="login"] .beta-card { display: contents; }
  .beta-main {
    display: flex;
    flex-direction: column;
    padding: 0 20px 24px;
  }

  .beta-how__cap,
  [data-beta-state="login"] .beta-card > .beta-card__title,
  [data-beta-state="login"] .beta-card > .beta-card__text,
  .beta-panel__idle .beta-hint,
  .beta-panel__wait .beta-hint,
  .beta-qr__hint,
  .beta-pin__label,
  .beta-pin .beta-hint { display: none; }

  .beta-title { order: 1; margin-top: 26px; max-width: none; font-size: 24px; line-height: 1.2; }
  .beta-lead { order: 2; margin-top: 10px; max-width: none; font-size: 13.5px; line-height: 1.55; }
  /* Адрес входа — сразу под лидом (тот же order, порядок разметки). На
     телефоне строки адреса браузера почти не видно, поэтому плашка нужна
     здесь больше, чем на десктопе. */
  .beta-here { order: 2; margin-top: 14px; max-width: none; padding: 10px 12px; font-size: 12.5px; }
  .beta-seg { order: 3; margin-top: 22px; gap: 4px; }
  .beta-how { order: 4; margin-top: 22px; max-width: none; }
  .beta-verify { order: 5; }
  .beta-spacer { order: 6; display: block; flex: 1 1 0; }
  .beta-panel { order: 7; margin-top: 20px; }
  .beta-err { order: 8; margin-top: 12px; }

  /* Переключатель: сегменты выше (зона нажатия ≥44px), подпись не переносится. */
  .beta-seg__btn { min-height: 48px; padding: 8px 4px; gap: 2px; }
  .beta-seg__hint { font-size: 10px; white-space: nowrap; }

  /* Степпер компактнее: кружки 26px, шаги ближе. Подписи над ним нет. */
  .beta-steps { margin-top: 0; }
  .beta-step { grid-template-columns: 26px minmax(0, 1fr); column-gap: 12px; }
  .beta-step__n { width: 26px; height: 26px; font-size: 11.5px; }
  .beta-step__rail::after { min-height: 10px; margin: 3px 0; }
  .beta-step__body { padding: 3px 0 12px; }
  .beta-step__t { font-size: 13.5px; }
  .beta-step__d { margin-top: 2px; font-size: 12px; line-height: 1.45; }

  /* Число сверки — компактная карточка сразу под степпером. */
  .beta-verify { margin-top: 18px; gap: 14px; padding: 12px 14px; }
  .beta-verify__code { min-width: 48px; padding: 6px 8px; border-radius: 11px; font-size: 22px; }
  .beta-verify__t { font-size: 12.5px; }
  .beta-verify__d { font-size: 11.5px; line-height: 1.45; }

  /* Действие Telegram: кнопка выше, плашка ожидания плотнее. */
  .beta-tg { min-height: 52px; padding: 15px; }
  .beta-wait { gap: 12px; padding: 12px 14px; }
  .beta-spin { width: 26px; height: 26px; }
  .beta-wait__t { font-size: 13px; }
  .beta-wait__d { margin-top: 1px; font-size: 11.5px; }
  .beta-cancel { min-height: 36px; }

  /* QR — горизонтальная карточка: матрица 96px слева, справа «сканируйте с
     другого устройства» и ссылка обратно в Telegram. Свой же экран не
     отсканируешь, поэтому матрица здесь второстепенна и маленькая; вырастить
     её телевизору на телефоне не бывает (is-tv гасим на всякий случай). */
  .beta-panel--qr {
    flex-direction: row;
    align-items: center;
    gap: 14px;
    padding: 14px;
    border-radius: var(--r-card);
    background: var(--panel);
    border: 1px solid var(--line);
  }
  .beta-qr,
  .beta-panel--qr.is-tv .beta-qr { flex: none; width: 108px; padding: 6px; border-radius: var(--r-row); }
  /* Устаревший код на матрице в 108px: подпись и слово не помещаются —
     остаётся круглая кнопка со стрелкой (имя у неё в aria-label). */
  .beta-qr__renew-t,
  .beta-qr__renew-l { display: none; }
  .beta-qr__renew-go { padding: 11px; }
  .beta-qr__renew-go svg { width: 18px; height: 18px; }
  .beta-qr__m { display: block; min-width: 0; }

  /* Код из бота: карточка бота ниже, без подписи над клетками, кнопка выше;
     «Запросить ещё раз» опущено ради высоты экрана. */
  .beta-botcard { min-height: 48px; padding: 10px 12px; }
  .beta-botcard__ico { width: 28px; height: 28px; }
  .beta-botcard__ico svg { width: 14px; height: 14px; }
  .beta-botcard__name { font-size: 12.5px; }
  .beta-botcard__d { font-size: 10.5px; }
  .beta-pin__row { margin-top: 12px; gap: 6px; }
  .beta-pin__submit { min-height: 50px; margin-top: 12px; font-size: 14.5px; }

  /* Отказ занимает экран целиком: брендинг и шаги там только оттягивают
     внимание от единственного действия. Карточка отказа остаётся карточкой. */
  .beta-page:not([data-beta-view="login"]) .beta-title,
  .beta-page:not([data-beta-view="login"]) .beta-lead,
  .beta-page:not([data-beta-view="login"]) .beta-here,
  .beta-page:not([data-beta-view="login"]) .beta-how { display: none; }
  .beta-page:not([data-beta-view="login"]) .beta-state { margin: auto 0; max-width: none; }
  .beta-card--center { padding: 32px 20px; }

  .beta-cross { width: 56px; height: 56px; }
  .beta-cross svg { width: 22px; height: 22px; }
  .beta-card--center .beta-card__title { font-size: 20px; margin-top: 24px; }
  .beta-card--center .beta-card__text { font-size: 13.5px; max-width: 280px; }
}

