:root {
  --bg: #10131a;
  --card: #191e29;
  --line: #2b3243;
  --ink: #f2f5fb;
  --dim: #98a2b8;
  --ok: #34d17c;
  --no: #ff6b5e;
  --accent: #ffb020;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: system-ui, "Segoe UI", Roboto, sans-serif;
  -webkit-text-size-adjust: 100%;
}

.wrap { max-width: 640px; margin: 0 auto; padding: 20px 16px 48px; }

h1 { font-size: 1.6rem; margin: 0 0 4px; }
h2 { font-size: 1.1rem; margin: 24px 0 8px; color: var(--dim); font-weight: 600; }
p { line-height: 1.5; }
.dim { color: var(--dim); }

.card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: 14px;
  padding: 16px;
  margin: 12px 0;
}

label { display: block; margin: 14px 0 6px; font-weight: 600; }

input, select, button {
  width: 100%;
  font: inherit;
  padding: 14px;
  border-radius: 10px;
  border: 1px solid var(--line);
  background: #0d1017;
  color: var(--ink);
}

input:focus, select:focus { outline: 2px solid var(--accent); }

button {
  background: var(--accent);
  color: #1a1200;
  font-weight: 700;
  border: none;
  margin-top: 20px;
  cursor: pointer;
}

button.ghost { background: transparent; color: var(--ink); border: 1px solid var(--line); }
button.small { width: auto; padding: 8px 14px; margin: 4px 6px 0 0; font-size: .95rem; }

.row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.check { display: flex; gap: 10px; align-items: flex-start; margin-top: 16px; }
.check input { width: 22px; height: 22px; flex: none; margin-top: 2px; }
.check label { margin: 0; font-weight: 400; font-size: .95rem; color: var(--dim); }

/* билет */
.qr { width: min(78vw, 320px); height: auto; display: block; margin: 0 auto;
      background: #fff; padding: 10px; border-radius: 12px; }
.code { font-size: 2rem; letter-spacing: .12em; text-align: center; margin: 14px 0 0;
        font-variant-numeric: tabular-nums; }

/* табло */
.board { min-height: 100vh; display: flex; flex-direction: column; justify-content: center;
         padding: 3vh 4vw; }
.board .name { font-size: clamp(2rem, 7vw, 5rem); font-weight: 700; }
.board .score { font-size: clamp(6rem, 34vw, 26rem); font-weight: 800; line-height: .9;
                font-variant-numeric: tabular-nums; }
.board .timer { font-size: clamp(2rem, 10vw, 7rem); font-weight: 700; color: var(--accent);
                font-variant-numeric: tabular-nums; }
.board .idle { font-size: clamp(1.4rem, 4vw, 3rem); color: var(--dim); }
.flash { animation: flash .6s ease-out; }
@keyframes flash { from { background: #34d17c33; } to { background: transparent; } }

/* панель судьи */
table { width: 100%; border-collapse: collapse; font-size: .95rem; }
th, td { text-align: left; padding: 8px 6px; border-bottom: 1px solid var(--line); }
th { color: var(--dim); font-weight: 600; }
.pill { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: .85rem; }
.pill.ok { background: #34d17c22; color: var(--ok); }
.pill.no { background: #ff6b5e22; color: var(--no); }

/* ======================================================================
   ОБОЛОЧКА И ДИЗАЙН-СИСТЕМА
   Всё, что ниже, — достройка. Переменные и классы выше (.card, .pill,
   .board, .qr, .flash) страницы уже используют, они не тронуты.
   Порядок mobile-first: сначала правила для телефона, широкий экран —
   в media-query в конце файла, потому что с телефона смотрит больше
   половины зала.
   ====================================================================== */

/* Второй блок переменных, а не правка первого: базовая палитра принята
   и работает, а это добавки для новых элементов. Так видно, что чем. */
:root {
  --bg-top: #141926;   /* шапка и подвал: на тон светлее фона, чтобы отделялись без линейки */
  --hover: #222a3a;    /* наведение и чётные строки таблицы */
  --gold:  #f2c14e;    /* первые три места. Медальные цвета вместо иконок —  */
  --silver:#c9d1e0;    /* иконочный шрифт пришлось бы тянуть из сети, а её нет */
  --bronze:#c98a5a;
}

/* Ссылки по умолчанию: подчёркивание убрано, но цвет остаётся читаемым.
   Подчёркивание возвращаем при наведении — на плотных таблицах сплошные
   подчёркивания превращают страницу в кашу (урок HLTV). */
a { color: var(--ink); text-decoration: none; }
a:hover { text-decoration: underline; }

/* Видимый фокус нужен всем интерактивным элементам: судья на площадке
   работает с планшета, но администратор — с клавиатуры. */
a:focus-visible, button:focus-visible, summary:focus-visible,
input:focus-visible, select:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Текст только для скринридера. display:none не годится — тогда его
   не прочитают вслух. */
.sr-only {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}

/* ---- каркас страницы --------------------------------------------------
   Колонка на всю высоту экрана: подвал прижат вниз, даже когда
   содержимого мало. Пустых страниц в день запуска будет много. */
.site { display: flex; flex-direction: column; min-height: 100vh; min-height: 100dvh; }
.site-main { flex: 1 0 auto; }

/* ---- шапка ------------------------------------------------------------
   Не sticky: на телефоне закреплённая шапка съедает пятую часть экрана
   у таблицы рейтинга, а переходят по меню редко — раз за визит. */
.site-head {
  background: var(--bg-top);
  border-bottom: 1px solid var(--line);
}
.head-in {
  max-width: 1040px; margin: 0 auto; padding: 10px 16px;
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
}

.brand { font-weight: 800; font-size: 1.05rem; letter-spacing: .01em; margin-right: auto; }
.brand:hover { text-decoration: none; }
.brand .b-dim { color: var(--dim); font-weight: 600; }

/* ---- бутерброд без JS -------------------------------------------------
   Чекбокс уведён за край экрана, но остаётся в потоке фокуса: с клавиатуры
   меню открывается пробелом. display:none убил бы и фокус, и озвучку. */
.nav-toggle {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: 0;
  opacity: 0; pointer-events: none;
}
.nav-btn {
  display: flex; flex-direction: column; justify-content: center; gap: 4px;
  width: 42px; height: 38px; padding: 0 9px; cursor: pointer;
  border: 1px solid var(--line); border-radius: 10px; background: var(--card);
}
.nav-btn i { display: block; height: 2px; background: var(--ink); border-radius: 2px; }
.nav-toggle:focus-visible + .nav-btn { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Само меню: на телефоне занимает всю ширину под шапкой и раскрывается
   только при отмеченном чекбоксе. Никакой высотной анимации — раскрытие
   должно быть мгновенным, единственная анимация в проекте это .flash. */
.nav { display: none; width: 100%; flex-direction: column; gap: 2px; padding: 6px 0 10px; }
.nav-toggle:checked ~ .nav { display: flex; }
.nav a {
  padding: 11px 12px; border-radius: 10px; color: var(--dim); font-weight: 600;
}
.nav a:hover { background: var(--hover); color: var(--ink); text-decoration: none; }
/* Текущий раздел отмечается aria-current, а не классом: разметка тогда
   сама объясняет, где мы находимся, и скринридеру, и стилям. */
.nav a[aria-current="page"] { color: var(--ink); background: var(--hover); }
.nav a.cta { color: #1a1200; background: var(--accent); }

/* ---- переключатель языка ---------------------------------------------
   Три коротких кода в ряд, а не выпадающий список: выпадающий требует
   либо JS, либо select с обработчиком. Ссылки работают всегда. */
.lang { display: flex; gap: 4px; }
.lang a {
  padding: 6px 9px; border-radius: 8px; font-size: .82rem; font-weight: 700;
  color: var(--dim); text-transform: uppercase; letter-spacing: .04em;
}
.lang a:hover { background: var(--hover); text-decoration: none; }
.lang a.on { background: var(--hover); color: var(--accent); }

/* ---- подвал ----------------------------------------------------------- */
.site-foot {
  background: var(--bg-top); border-top: 1px solid var(--line);
  color: var(--dim); font-size: .85rem;
}
.foot-in { max-width: 1040px; margin: 0 auto; padding: 18px 16px 26px; }
.foot-in a { color: var(--dim); }
.foot-in p { margin: 4px 0; line-height: 1.45; }

/* Ссылка «к содержимому» для клавиатуры: видна только когда в фокусе. */
.skip { position: absolute; left: -9999px; }
.skip:focus { left: 8px; top: 8px; z-index: 9; background: var(--accent);
              color: #1a1200; padding: 10px 14px; border-radius: 10px; }

/* ---- ширина полосы ----------------------------------------------------
   .wrap остаётся узким (640) — он рассчитан на форму регистрации и билет
   с телефона. Спискам и таблицам нужно больше, отсюда модификатор. */
.wrap.wide { max-width: 1040px; }

/* Заголовок раздела со ссылкой справа: «Рекорды дня … все». */
.section-head { display: flex; align-items: baseline; gap: 12px; margin: 24px 0 8px; }
.section-head h2 { margin: 0; flex: 1; }
.section-head a { color: var(--accent); font-size: .9rem; }

/* ======================================================================
   .person-card — карточка участника
   Ключевой повторяемый элемент: из него собраны рейтинг, страница матча
   и профиль. Один вид во всех трёх местах, поэтому место и очки — слоты,
   которые можно не заполнять (в профиле места нет, в матче нет очков).
   Вместо фото — инициалы: фотографий участников у нас нет и не будет,
   на кадрах лицо всегда закрыто (docs/PERSDANNYE.md).
   ====================================================================== */
.person-card {
  display: flex; align-items: center; gap: 12px;
  background: var(--card); border: 1px solid var(--line); border-radius: 12px;
  padding: 10px 12px; margin: 8px 0;
}
a.person-card { color: inherit; }
a.person-card:hover { background: var(--hover); text-decoration: none; }

.person-card .rank {
  min-width: 2ch; text-align: right; font-size: 1.05rem; font-weight: 800;
  color: var(--dim); font-variant-numeric: tabular-nums;
}
.person-card .rank.r1 { color: var(--gold); }
.person-card .rank.r2 { color: var(--silver); }
.person-card .rank.r3 { color: var(--bronze); }

.person-card .ava {
  flex: none; width: 40px; height: 40px; border-radius: 10px;
  display: flex; align-items: center; justify-content: center;
  background: var(--hover); color: var(--dim);
  font-weight: 800; font-size: .95rem; letter-spacing: .02em;
}

/* min-width:0 обязателен: без него длинное имя распирает флекс-строку
   и очки уезжают за край телефона. */
.person-card .who { flex: 1; min-width: 0; }
.person-card .pname {
  display: block; font-weight: 700; font-size: 1.02rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* display:block обязателен: строки под именем набирают спанами, а спаны
   встали бы в одну строку и слиплись — категория с локацией. */
.person-card .meta {
  display: block;
  color: var(--dim); font-size: .82rem; line-height: 1.35;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.person-card .meta .sep { opacity: .5; padding: 0 4px; }

.person-card .pts {
  flex: none; text-align: right; font-size: 1.5rem; font-weight: 800;
  font-variant-numeric: tabular-nums; line-height: 1.1;
}
.person-card .pts .unit { display: block; font-size: .68rem; font-weight: 600;
                          color: var(--dim); letter-spacing: .04em; }

/* Свой результат в общем списке подсвечен слева: человек ищет себя
   и должен найти, не вчитываясь. */
.person-card.me { border-color: var(--accent); box-shadow: inset 3px 0 0 var(--accent); }

/* ======================================================================
   .table-lb — плотная таблица рейтинга
   Там, где карточек слишком много (сотня строк на дисциплину), карточка
   становится длинной простынёй. Таблица показывает вдвое больше строк
   на экран — за это HLTV и держат таблицами.
   ====================================================================== */

/* Обёртка: таблица на телефоне не сжимается до нечитаемости, а уезжает
   вбок. -webkit-overflow-scrolling для инерции на iOS. */
.scroll-x { overflow-x: auto; -webkit-overflow-scrolling: touch; }

.table-lb { font-size: .9rem; min-width: 420px; }
.table-lb th, .table-lb td { padding: 7px 8px; white-space: nowrap; }
.table-lb thead th {
  font-size: .74rem; text-transform: uppercase; letter-spacing: .05em;
  border-bottom: 1px solid var(--line);
}
/* Зебра еле заметная: она нужна, чтобы глаз не съезжал на соседнюю
   строку, а не чтобы её было видно. */
.table-lb tbody tr:nth-child(even) { background: #ffffff06; }
.table-lb tbody tr:hover { background: var(--hover); }
.table-lb tbody tr.me td { background: #ffb02016; }

/* Все числа моноширинные и вправо: столбец очков читается как столбик,
   а не как рваный текст. Это главное правило таблицы. */
.table-lb .num, .table-lb td.num, .table-lb th.num {
  text-align: right; font-variant-numeric: tabular-nums;
}
.table-lb .num.big { font-weight: 800; font-size: 1rem; }
.table-lb .pos { width: 3ch; text-align: right; color: var(--dim);
                 font-variant-numeric: tabular-nums; }
.table-lb .pos.r1 { color: var(--gold); font-weight: 800; }
.table-lb .pos.r2 { color: var(--silver); font-weight: 800; }
.table-lb .pos.r3 { color: var(--bronze); font-weight: 800; }
/* Имя — единственная колонка, которой можно занимать остаток ширины. */
.table-lb .who { white-space: normal; width: 99%; }

/* ======================================================================
   .stat — плитка «число и подпись»
   Личный рекорд, всего заездов, место. Число крупное, подпись мелкая:
   с расстояния читается число, подпись дочитывают уже вблизи.
   ====================================================================== */
.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
         gap: 8px; margin: 12px 0; }
.stat {
  background: var(--card); border: 1px solid var(--line); border-radius: 12px;
  padding: 12px; text-align: center;
}
.stat b { display: block; font-size: 1.7rem; font-weight: 800; line-height: 1.1;
          font-variant-numeric: tabular-nums; }
.stat span { display: block; margin-top: 2px; color: var(--dim); font-size: .78rem;
             letter-spacing: .02em; }
.stat.hi b { color: var(--accent); }   /* рекорд и прочее, чем стоит гордиться */

/* ======================================================================
   .badge — постоянная метка
   Отличие от .pill: пилюля показывает СОСТОЯНИЕ прямо сейчас (кольцо
   на связи / молчит), бейдж — свойство записи, которое никуда не денется
   (рекорд площадки, серия, заезд был офлайн). Поэтому бейдж не заливной,
   а обведённый, прописными и мельче — он не должен спорить с именем.
   ====================================================================== */
.badge {
  display: inline-block; padding: 2px 7px; border-radius: 6px;
  border: 1px solid var(--line); color: var(--dim);
  font-size: .68rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: .06em; vertical-align: middle; white-space: nowrap;
}
.badge + .badge { margin-left: 4px; }
.badge.rec     { border-color: #f2c14e66; color: var(--gold); }      /* рекорд площадки */
.badge.streak  { border-color: #34d17c66; color: var(--ok); }        /* серия попаданий */
/* Офлайн-заезд помечается всегда: результат, приехавший с задержкой,
   должен быть отличим от засчитанного при судье — тихих поправок нет. */
.badge.offline { border-color: #98a2b866; color: var(--dim); }
.badge.live    { border-color: #ff6b5e66; color: var(--no); }        /* идёт прямо сейчас */

/* ======================================================================
   .empty — «здесь пока пусто»
   В день запуска пустых страниц будет больше, чем полных. Пунктирная
   рамка говорит «место есть, содержимое будет», сплошная карточка без
   содержимого читалась бы как поломка.
   ====================================================================== */
.empty {
  border: 1px dashed var(--line); border-radius: 12px;
  padding: 26px 18px; margin: 12px 0; text-align: center; color: var(--dim);
}
.empty b { display: block; color: var(--ink); font-size: 1rem; margin-bottom: 4px; }
.empty p { margin: 0; font-size: .9rem; line-height: 1.45; }
.empty a { color: var(--accent); }

/* ======================================================================
   .frames — лента кадров с кольца
   Кадры приходят по одному и их бывает много. Ряд с прокруткой вбок
   и привязкой к кадру: пролистывается пальцем и не ломает высоту
   страницы, как ломала бы сетка.
   Лицо на кадре всегда закрыто на стороне кольца — сюда приходит уже
   обработанная картинка, CSS ничего не прячет и прятать не должен.
   ====================================================================== */
.frames {
  display: flex; gap: 8px; overflow-x: auto; -webkit-overflow-scrolling: touch;
  scroll-snap-type: x proximity; padding: 4px 0 10px; margin: 8px 0;
}
.frames .frame { flex: none; width: 132px; scroll-snap-align: start; }
.frames .frame img, .frames .frame .ph {
  display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover;
  border-radius: 10px; border: 1px solid var(--line);
  /* Фон-заглушка на время загрузки: кадры идут по местной сети, но
     сеть на площадке моргает — дыра в ленте выглядела бы как сбой. */
  background: var(--hover);
}
.frames .frame .ph { display: flex; align-items: center; justify-content: center;
                     color: var(--dim); font-size: .75rem; }
.frames .frame .t { margin-top: 4px; color: var(--dim); font-size: .72rem;
                    font-variant-numeric: tabular-nums; text-align: center; }
.frames .frame.hit img { border-color: var(--ok); }   /* кадр с попаданием */

/* ---- мелочи, нужные на нескольких страницах --------------------------- */
.nums { font-variant-numeric: tabular-nums; }
.right { text-align: right; }
.muted-box { background: var(--card); border: 1px solid var(--line);
             border-radius: 12px; padding: 12px; }

/* ======================================================================
   ГЛАВНАЯ СТРАНИЦА И КНОПКИ
   Второй слой достройки. Всё выше — служебные экраны: рейтинг, билет,
   табло. Ниже — то, что видит родитель, который пришёл на сайт первый
   раз и ещё ничего про нас не знает. Тон другой: крупнее, спокойнее,
   меньше цифр. Но палитра, скругления и отступы те же — это одна
   площадка, а не две.
   ====================================================================== */

/* ======================================================================
   .nav-sub — ряд категорий под заголовком раздела
   Разметка (`<nav class="nav-sub">` в rating.html) была, стилей не было:
   ссылки шли сплошной строкой и читались как одно длинное слово.
   Перенос, а не только прокрутка: категорий немного и все короткие,
   а спрятанная за краем вкладка на телефоне просто не находится —
   полосы прокрутки там не видно, пока не потянешь. Прокрутка оставлена
   страховкой на случай длинного названия в EN/FR, где «Junior league»
   в одну ширину телефона не встаёт.
   ====================================================================== */
.nav-sub {
  display: flex; flex-wrap: wrap; gap: 6px;
  overflow-x: auto; -webkit-overflow-scrolling: touch;
  margin: 0 0 14px; padding-bottom: 2px;
}
.nav-sub a {
  flex: none;                       /* иначе длинные названия сжимаются в кашу */
  padding: 8px 14px; border-radius: 999px;
  border: 1px solid var(--line); background: var(--card);
  color: var(--dim); font-size: .9rem; font-weight: 600; white-space: nowrap;
  transition: background .12s ease, color .12s ease;
}
.nav-sub a:hover { background: var(--hover); color: var(--ink); text-decoration: none; }
/* Выбранная категория — заливкой, а не подчёркиванием: рейтинг смотрят
   по диагонали, и вопрос «а это чей список?» должен сниматься с одного
   взгляда. Тот же приём, что и у активного пункта верхнего меню, только
   ярче: там выбор один на визит, здесь его щёлкают подряд. */
.nav-sub a[aria-current="page"] {
  background: var(--accent); border-color: var(--accent); color: #1a1200; font-weight: 700;
}

/* ======================================================================
   .btn — кнопка-ссылка
   `button` в проекте уже стилизован, но он растянут на всю ширину формы
   и с верхним отступом — это кнопка отправки, а не кнопка вообще.
   На главной кнопки чаще ссылки. `.btn` делает `<a>` и `<button>`
   неотличимыми: сбрасывает ширину и отступ, задаёт inline-flex, чтобы
   текст стоял по центру при любой длине.
   ====================================================================== */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  width: auto; margin: 0;
  padding: 13px 20px; border-radius: 10px;
  border: 1px solid transparent; background: var(--accent); color: #1a1200;
  font: inherit; font-weight: 700; line-height: 1.25; text-align: center;
  cursor: pointer; white-space: nowrap;
  transition: background .12s ease, border-color .12s ease;
}
a.btn:hover { text-decoration: none; }   /* глобальное подчёркивание ссылок кнопке не идёт */
.btn:hover { background: #ffc04a; }
/* Второстепенное действие: обводка вместо заливки. Двух заливных кнопок
   рядом быть не должно — тогда непонятно, какая главная. */
.btn.ghost { background: transparent; color: var(--ink); border-color: var(--line); }
.btn.ghost:hover { background: var(--hover); border-color: var(--dim); }
.btn.big { padding: 16px 26px; font-size: 1.08rem; }

/* Ряд кнопок. На телефоне — столбиком и во всю ширину: попадать большим
   пальцем в половинку экрана неудобно, а двух действий рядом на 360 px
   всё равно не помещается. `.hero-btns` — тот же ряд, но абзацем: в hero
   кнопки лежат в <p>, у которого свои поля, их и сбрасываем. */
.btn-row, .hero-btns { display: flex; flex-direction: column; gap: 10px; }
.btn-row { margin-top: 18px; }
.hero-btns { margin: 20px 0 0; }
.btn-row .btn, .hero-btns .btn { width: 100%; }

/* ======================================================================
   .hero — первый экран
   Аудитория — родители детей 5–15, а не зрители киберспорта: ни рамок
   со свечением, ни прописных вразрядку. Работают только размер шрифта
   и воздух. Одна фраза подзаголовком — если её не хватает объяснить,
   что это такое, проблема в фразе, а не в вёрстке.
   ====================================================================== */
/* Первый экран — полоса во всю ширину с полосой содержимого внутри,
   поэтому фон задаётся секции, а поля — вложенному .wrap. Заливка не
   ровная, а стекающая в фон страницы: ровная полоса с чёткой нижней
   границей делит страницу пополам, а hero должен переходить в текст,
   а не отгораживаться от него. Градиент — не картинка, наружу
   не ходит. */
.hero {
  background: linear-gradient(180deg, var(--bg-top), var(--bg));
  border-bottom: 1px solid var(--line);
}
.hero .wrap { padding-top: 26px; padding-bottom: 30px; }
.hero h1 {
  font-size: clamp(1.75rem, 7.5vw, 2.6rem); line-height: 1.12;
  margin: 0 0 10px; letter-spacing: -.01em;
}
.hero .sub, .hero-sub {
  color: var(--dim); font-size: 1.05rem; line-height: 1.5;
  margin: 0; max-width: 34em;   /* строка длиннее 34 знакомест читается тяжело */
}
/* Надзаголовок («Челябинск · сезон 2026») мелкий и дымчатый: он
   ориентирует, но не спорит с заголовком. */
.hero .kicker {
  display: block; margin: 0 0 8px;
  color: var(--accent); font-size: .8rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .08em;
}

/* ======================================================================
   .next-event — ближайший этап
   Самый заметный элемент после hero, и это не про красоту: девять из
   десяти приходят с одним вопросом — «когда и куда везти ребёнка».
   Ответ должен читаться, не листая. Акцентная полоса сверху — тот же
   приём, что у `.person-card.me`: система уже умеет говорить «вот это».
   ====================================================================== */
.next-event {
  background: var(--card);
  border: 1px solid #ffb02055;
  border-radius: 16px;
  box-shadow: inset 0 3px 0 var(--accent);
  padding: 18px 16px 16px; margin: 18px 0;
}
.next-event .lbl {
  display: block; margin-bottom: 6px;
  color: var(--dim); font-size: .72rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .07em;
}
/* Дата крупная, место рядом помельче и дымчатым — одна строка отвечает
   на «когда и куда». Внутри строки дата выделена <b>, поэтому размер
   задан абзацу, а не только жирному куску. */
.next-event .ev-when, .next-event .when {
  display: block; font-size: 1.3rem; line-height: 1.3; color: var(--dim);
  margin: 0;
}
.next-event .ev-when b, .next-event .when b { color: var(--ink); font-weight: 800; }
.next-event .where { display: block; color: var(--dim); font-size: .98rem; line-height: 1.45; }
/* Абзацы внутри карточки жмутся: карточка должна читаться одним куском,
   а не тремя разъехавшимися строчками. */
.next-event p { margin: 8px 0 0; }
.next-event p:first-of-type { margin-top: 0; }
.next-event .note { color: var(--dim); font-size: .9rem; }
/* h2 в проекте по умолчанию дымчатый и с большим верхним отступом — это
   верно для заголовка раздела и неверно внутри карточки. */
.next-event h2, .next-event h3 { color: var(--ink); font-size: 1.15rem; margin: 0 0 8px; }
.next-event .btn { width: 100%; margin-top: 6px; }
.next-event .chips { margin-top: 10px; }
/* Пусто внутри карточки — без второй рамки: пунктир поверх акцентной
   рамки читается как две вложенные ошибки. */
.next-event .empty { border: none; padding: 6px 0; text-align: left; }

/* ======================================================================
   .steps — «как это устроено», три шага
   Порядок здесь важнее оформления: человек боится не сложности, а того,
   что чего-то не знает заранее. Поэтому номер крупный и первым —
   он обещает, что шагов ровно три и они кончатся.
   Номер рисует счётчик, а не разметка: шаги лежат в <ol>, порядок там
   уже записан смыслом, и дублировать его цифрой в тексте значит завести
   вторую правду — при перестановке пунктов она разойдётся с первой.
   Родной маркер списка для этого не годится: его не увеличить и не
   покрасить отдельно от текста.
   ====================================================================== */
.steps {
  display: grid; grid-template-columns: 1fr; gap: 12px; margin: 16px 0;
  padding: 0; list-style: none; counter-reset: step;
}
.steps > li, .steps .step {
  background: var(--card); border: 1px solid var(--line); border-radius: 14px;
  padding: 16px;
}
.steps > li::before {
  counter-increment: step; content: counter(step);
  display: block; margin-bottom: 6px;
  color: var(--accent); font-size: 1.9rem; font-weight: 800; line-height: 1;
  font-variant-numeric: tabular-nums;
}
/* Если шаг когда-нибудь соберут не списком, а div-ами — номер пишется
   руками в .n и выглядит так же. */
.steps .step .n {
  display: block; margin-bottom: 6px;
  color: var(--accent); font-size: 1.9rem; font-weight: 800; line-height: 1;
  font-variant-numeric: tabular-nums;
}
/* Заголовок шага — жирная строка, пояснение под ним. Оба блочные:
   спанами набранное пояснение иначе прилипло бы к заголовку в строку. */
.steps > li b, .steps .step h3 {
  display: block; color: var(--ink); font-size: 1.05rem; font-weight: 700;
  margin: 0 0 4px; line-height: 1.3;
}
.steps > li span, .steps .step p {
  display: block; margin: 0; color: var(--dim); font-size: .95rem; line-height: 1.5;
}

/* ======================================================================
   .media — карточка-ссылка на видео
   Ни iframe, ни превью с чужого сервера. Две причины, и обе важнее
   красивой картинки: на площадке нет интернета — пустая рамка ютуба
   выглядела бы как сбой; и на страницу, куда ходят родители детей,
   чужой трекер не ставится ни при каких удобствах.
   Треугольник рисуется рамкой: элемент нулевого размера, три прозрачные
   стороны из четырёх, видна только левая — она и есть треугольник,
   смотрящий вправо. Это единственный способ получить фигуру без файла
   и без SVG в разметке.
   ====================================================================== */
.media {
  display: flex; align-items: center; gap: 14px;
  background: var(--card); border: 1px solid var(--line); border-radius: 14px;
  padding: 14px; margin: 12px 0; color: inherit;
  transition: background .12s ease;
}
a.media:hover { background: var(--hover); text-decoration: none; }
.media .play {
  flex: none; width: 54px; height: 54px; border-radius: 50%;
  background: var(--accent);
  display: flex; align-items: center; justify-content: center;
}
.media .play::before {
  content: ""; display: block;
  width: 0; height: 0;
  border-style: solid;
  border-width: 10px 0 10px 17px;                      /* верх, право, низ, лево */
  border-color: transparent transparent transparent #1a1200;
  margin-left: 4px;      /* оптический центр треугольника правее середины круга */
}
/* Текстовая половина: заголовок и подпись под ним. min-width:0 — та же
   защита, что в .person-card: длинное название иначе распирает строку
   и круг с треугольником уезжает за край телефона. */
.media .media-txt { min-width: 0; }
.media .t, .media .media-txt b {
  display: block; font-weight: 700; font-size: 1.02rem; line-height: 1.3;
}
.media .cap, .media .media-txt span {
  display: block; margin-top: 3px; color: var(--dim); font-size: .87rem; line-height: 1.4;
}
/* Ссылка на канал под карточкой — обычная строка, а не вторая кнопка:
   двух призывов подряд быть не должно. */
.media + p { margin: 8px 0 0; font-size: .92rem; }
.media + p a { color: var(--accent); }
/* Если захочется вида «постер» — прямоугольник 16:9 с кругом посередине.
   Заливка ровная: это честная заглушка, а не подгружаемый кадр. */
.media.poster { flex-direction: column; align-items: stretch; }
.media .shot {
  display: flex; align-items: center; justify-content: center;
  aspect-ratio: 16 / 9; border-radius: 10px;
  background: var(--hover); border: 1px solid var(--line); margin-bottom: 10px;
}

/* ======================================================================
   .partners — кто помогает провести
   Ряд плиток одного размера: партнёры стоят рядом на равных, разнобой
   в величине логотипов читается как ранжирование, которого мы не
   объявляли. Логотипы лежат в /static на нашем же сервере — наружу
   страница по-прежнему не ходит.
   ====================================================================== */
.partners { display: flex; flex-wrap: wrap; gap: 10px; margin: 12px 0; }
.partner {
  display: flex; align-items: center; justify-content: center;
  min-height: 60px; padding: 10px 16px;
  background: var(--card); border: 1px solid var(--line); border-radius: 12px;
  color: var(--dim); font-size: .95rem; font-weight: 700;
  transition: background .12s ease;
}
a.partner:hover { background: var(--hover); text-decoration: none; }
/* Белая подложка под картинку: фирменные знаки почти всегда нарисованы
   тёмным по прозрачному фону и на нашей тёмной теме просто пропадают.
   Перекрашивать чужой логотип фильтром нельзя — это его порча. */
.partner img {
  display: block; max-height: 40px; max-width: 160px; width: auto; height: auto;
  border-radius: 8px;
}

/* ======================================================================
   .cta — полоса призыва в конце страницы
   Тот, кто дочитал до низа, уже согласен. Ему нужна не новая порция
   доводов, а кнопка под рукой, чтобы не листать обратно наверх.
   ====================================================================== */
.cta {
  background: var(--bg-top);
  border-top: 1px solid var(--line);
  margin-top: 28px; text-align: center;
}
/* Полоса во всю ширину, поля — на вложенном .wrap: скруглённая коробка,
   упирающаяся в края экрана, читается как недоделанная вёрстка. */
.cta .wrap { padding-top: 28px; padding-bottom: 34px; }
.cta h2 { color: var(--ink); font-size: 1.35rem; margin: 0 0 8px; }
.cta p { margin: 0 auto 18px; max-width: 38em; color: var(--dim); }
.cta .btn { width: 100%; }
.cta .btn-row { justify-content: center; }

/* ======================================================================
   .chips — ряд мелких меток
   Отличие от `.badge`: бейдж — свойство одной записи («рекорд площадки»),
   чип — фильтр или признак предложения («5–15 лет», «бесплатно»).
   Стилизуется потомок любого вида, чтобы разметка могла быть и списком
   `<ul><li>`, и строкой спанов — это ряд слов, семантику выбирает автор.
   ====================================================================== */
.chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0; padding: 0; list-style: none; }
.chips > * {
  display: inline-block; padding: 4px 11px; border-radius: 999px;
  background: var(--hover); color: var(--dim);
  font-size: .82rem; font-weight: 600; white-space: nowrap;
}
.chips > .on { background: #ffb02022; color: var(--accent); }

/* ---- простые сетки ----------------------------------------------------
   На телефоне всегда один столбец: два столбца на 360 px — это два
   столбца по 170, где не помещается ни одно название категории. */
.grid-2, .grid-3 { display: grid; grid-template-columns: 1fr; gap: 12px; margin: 12px 0; }

/* ======================================================================
   Широкий экран. Всё выше написано под телефон, здесь — только то,
   что меняется на планшете и мониторе.
   ====================================================================== */
@media (min-width: 720px) {
  /* Меню всегда развёрнуто и в строку. Состояние чекбокса тут просто
     не спрашивается — потому checkbox-hack и выбран: с details
     раскрытость пришлось бы навязывать атрибутом, а его без JS
     не поставишь. */
  .nav-btn { display: none; }
  .nav {
    display: flex; flex-direction: row; width: auto; gap: 4px; padding: 0;
  }
  /* На телефоне кнопка-бутерброд стоит справа, а языки левее — так привычнее
     большому пальцу. На мониторе привычнее обратное: сначала разделы,
     языки в самом углу. Переставляем порядком флекса, а не второй копией
     разметки — переключатель в HTML один. */
  .lang { order: 3; margin-left: 4px; }
  .nav a { padding: 8px 12px; }
  .head-in { padding: 12px 20px; gap: 16px; flex-wrap: nowrap; }
  .brand { font-size: 1.15rem; margin-right: 8px; }

  .wrap { padding: 24px 20px 56px; }
  .person-card { padding: 12px 14px; gap: 14px; }
  .person-card .ava { width: 46px; height: 46px; font-size: 1.05rem; }
  .person-card .pname { font-size: 1.1rem; }
  .person-card .pts { font-size: 1.8rem; }
  .table-lb { font-size: .95rem; }
  .table-lb th, .table-lb td { padding: 8px 10px; }
  .frames .frame { width: 168px; }

  /* ---- главная на широком экране --------------------------------------
     Кнопки встают в ряд и сжимаются до своей ширины: растянутая
     на 1040 px кнопка «Записаться» выглядит как ошибка вёрстки. */
  .btn-row, .hero-btns { flex-direction: row; flex-wrap: wrap; }
  .btn-row .btn, .hero-btns .btn, .next-event .btn, .cta .btn { width: auto; }
  .hero-btns { gap: 12px; }

  .hero .wrap { padding-top: 48px; padding-bottom: 46px; }
  .hero .sub, .hero-sub { font-size: 1.15rem; }

  .next-event { padding: 22px 24px; }
  .next-event .ev-when, .next-event .when { font-size: 1.55rem; }

  .steps { grid-template-columns: repeat(3, 1fr); gap: 14px; }
  .steps .step { padding: 18px; }

  .media { padding: 16px; gap: 16px; }
  .media .play { width: 62px; height: 62px; }
  .media .play::before { border-width: 12px 0 12px 20px; }

  .cta .wrap { padding-top: 40px; padding-bottom: 46px; }
  .cta h2 { font-size: 1.6rem; }
  .steps > li::before, .steps .step .n { font-size: 2.1rem; }

  .grid-2 { grid-template-columns: repeat(2, 1fr); gap: 14px; }
  .grid-3 { grid-template-columns: repeat(3, 1fr); gap: 14px; }
}

/* Единственную анимацию проекта выключаем тем, кто просил у системы
   меньше движения. Вспышка при попадании — приятная деталь, а не
   способ сообщить результат: счёт виден и без неё. */
@media (prefers-reduced-motion: reduce) {
  .flash { animation: none; }
  /* Плавность на наведении — тоже движение. Просили меньше — убираем
     и её: цвет меняется мгновенно, смысл не теряется. */
  .btn, .nav-sub a, .media { transition: none; }
}


/* ---- Подложка под логотипами -------------------------------------------

   Знак RoboZoom смешанный: слева белая фигура с красным, справа ЧЁРНАЯ
   надпись. На тёмном фоне сайта пропадает надпись, на белой подложке —
   вся левая половина. Посчитано по самому файлу, доля пикселей знака,
   сливающихся с фоном (контраст ниже 1,6):

       фон сайта #10131a  — 18,3 %   (пропадает надпись)
       белый     #ffffff  — 55,0 %   (пропадает знак — хуже, чем без подложки)
       #a8a4a2            —  0,1 %

   Отсюда тёплый средне-серый, а не белый: он единственный держит и белое,
   и чёрное, и красный акцент. Оттенок правится здесь одной строкой. */
:root { --logo-plate: #a8a4a2; }

.brand img,
.partner img {
  background: var(--logo-plate);
  border-radius: 8px;
  padding: 4px 7px;
}
.brand img { padding: 3px 6px; }

/* Чужой знак может быть рассчитан на белое — перекрашивать его фильтром
   нельзя, это нарушение гайдлайна владельца. Даём белое тому, кому нужно. */
.partner.on-white img { background: #fff; }
