/* ===================================================================
   БАЗОВЫЙ СБРОС

   Тема должна работать сама по себе, без соседних файлов.

   На стенде эти правила приходили из _shell.css — обвязки, которая в
   готовый сайт не поедет. Разница вскрылась при переносе: подключили одну
   chill.css, и в подвале вылезли маркеры списков. Маркеры — пустяк,
   но там же лежал box-sizing:border-box, а без него у КАЖДОГО элемента
   с внутренним отступом меняется ширина. Заметить такое по одному экрану
   почти невозможно: всё «немного не так», и непонятно, где искать.

   Правила совпадают с _shell.css слово в слово, поэтому на стенде они
   просто применяются дважды и ничего не меняют.
   =================================================================== */
*,*::before,*::after{ box-sizing:border-box; }
html,body{ margin:0; padding:0; }
img,svg{ display:block; max-width:100%; }
button{ font:inherit; cursor:pointer; }
a{ color:inherit; }
h1,h2,h3,p,dl,dd{ margin:0; }
ul{ list-style:none; margin:0; padding:0; }

/*
 * БАЗОВАЯ ТИПОГРАФИКА — НА body, А НЕ ТОЛЬКО НА .chill.
 *
 * Наследуемые свойства (шрифт, цвет, сглаживание) объявлялись внутри
 * .chill. Пока вся разметка лежала внутри него, это работало. Но окна,
 * которые скрипты вешают прямо на <body>, оказываются СНАРУЖИ — и не
 * наследуют ничего. Текст в них выходил браузерным шрифтом с засечками
 * и почти чёрным цветом на тёмном фоне.
 *
 * Ловил я это трижды подряд и каждый раз чинил один симптом: сперва
 * переменные, потом цвет, потом шрифт. Правильнее было сразу поставить
 * наследуемое там, откуда наследуют все, — на body.
 *
 * Фон остаётся на .chill: он рисует полотно страницы, и выносить его
 * наружу незачем.
 */
body{
  font-family:"Golos Text","Inter",system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
  color:var(--text);
  -webkit-font-smoothing:antialiased;
}

/*
 * Значки km_icon() встают В СТРОКУ с текстом.
 *
 * Правило выше делает все svg блочными — так надо для крупной графики,
 * иначе под ней остаётся щель от базовой линии строки. Но значок внутри
 * заголовка от этого уезжал на отдельную строку: в шапке панели сначала
 * шла картинка, под ней слово. Заметно это стало только после переноса,
 * потому что на стенде значки всегда лежали во flex-контейнерах, где
 * display вообще не при чём.
 *
 * inline-block возвращает их в строку, а внутри flex-контейнеров это
 * значение всё равно не действует — там значок остаётся элементом сетки,
 * и прежние правила с flex:0 0 auto работают как работали.
 */
.ic{ display:inline-block; vertical-align:-.15em; flex:0 0 auto; }

/* ===================================================================
   CONCEPT 06 — ЧИЛЛ  (.chill)

   Взято у chillbase.net не «как выглядит», а «как устроено»:

     — почти монохром: чёрный, три серых, белый. Один акцент — оранжевый.
       Цветом ничего не украшают: он только там, где нужно действие.
     — заголовки заглавными, очень крупные, с межстрочным МЕНЬШЕ единицы
       (0.78). Строки почти сходятся — отсюда ощущение плаката.
     — служебный текст мелкий (13–14px), тоже капсом, с разрядкой.
     — очень много воздуха по вертикали: секции дышат сотнями пикселей,
       страница длинная и читается как рассказ, а не как таблица.
     — скругления крошечные (2–8px). Не «мягкий» интерфейс, а печатный.
     — фон живой: WebGL-градиент в шапке и лёгкие градиенты под карточками.

   Чего НЕ взято: у chillbase сайт студии, его задача — впечатлить. Здесь
   задача другая: показать серверы и продать привилегию. Поэтому крупные
   жесты оставлены, а вся конверсия (онлайн, адреса, кнопки) вынесена
   наверх и не тонет в воздухе.
=================================================================== */

/* ── О цвете ───────────────────────────────────────────────────────
   Полупрозрачные подложки и рамки записаны обычными rgba и hex, хотя
   логичнее смотрелся бы color-mix(). Он здесь не нужен: палитра
   статична, значения известны заранее и посчитаны один раз. Зато
   color-mix() понимает только Chrome 111+ (2023), а у аудитории
   CS 1.6 заметная доля машин старше — там объявление отбрасывается
   целиком, и у плашек пропадают подложки.

   Смесь с прозрачным — это в точности та же краска с альфой, так что
   картинка не изменилась ни на пиксель, а требование к браузеру
   опустилось лет на десять.
   ─────────────────────────────────────────────────────────────────── */

/*
 * Палитра. Первая версия была на чистом #000 — как у референса, но там
 * черноту всё время разбивают крупные фотографии и видео, а у нас их нет,
 * и страница выглядела провалом. Поэтому:
 *   — основа не чёрная, а очень тёмный графит: между фоном и панелями
 *     появляется разница, которую видно;
 *   — три ступени поверхностей вместо одной, светлее прежних;
 *   — текст ярче (было #8f8f8f — на тёмном это уже почти шёпот);
 *   — и главное: страницу разрезает СВЕТЛАЯ полоса (.ch-invert).
 *     Один инвертированный экран посередине убирает ощущение темноты
 *     надёжнее, чем осветление всех остальных на пару тонов.
 */
/* ═══════════════════════════════════════════════════════════════════
   ПАЛИТРА И ШКАЛА ВРЕМЕНИ — НА :root, А НЕ НА .chill

   Раньше всё это объявлялось внутри .chill. Пока разметка целиком лежала
   внутри него, разницы не было. Но окно профиля на странице состава
   строит скрипт и вешает его прямо на <body> — снаружи. Там var(--accent)
   не разрешался, и правило border-left:2px solid var(--accent) браузер
   отбрасывал ЦЕЛИКОМ: не «чёрная черта вместо оранжевой», а вообще
   никакой. Так же молча отваливались фон, рамки и цвет текста окна.

   Ловушка неприятна тем, что в отладчике правило видно, а действия у него
   нет. На :root переменные доступны всему документу, включая то, что
   скрипты добавляют к body.
   ═══════════════════════════════════════════════════════════════════ */
:root{
  --bg:#0d0e10;
  --panel:#15171a;
  --raise:#1c1f23;
  --line:#2a2e34;
  --line-soft:#20242a;
  --text:#f2f4f6;
  --dim:#a5acb4;
  --faint:#79818a;
  --accent:#ff7e00;
  --accent-dim:#c96400;
  --ok:#5fd07a;
  --info:#68b6f0;
  --on-accent:#140800;
  --ease:cubic-bezier(.22,1,.36,1);
  --t-fast:.24s var(--ease);
  --t-med:.34s var(--ease);
  --t-slow:1s var(--ease);
  --d-fast:.24s;
  --d-med:.34s;
  --lt-bg:#f3f3f1;
  --lt-panel:#ffffff;
  --lt-text:#131519;
  --lt-dim:#565d65;
  --lt-line:#dcdcd7;
  --head-h:72px;
}

.chill{
  /* Второй сервер на графиках. Объявлять обязательно: без переменной
     fill становится недействительным, и SVG падает в чёрный по умолчанию —
     на тёмном фоне столбики просто исчезают. */

  /*
   * Движение. Единая мягкая кривая на весь сайт: ускорение почти мгновенное,
   * торможение долгое. Раньше стояла обычная ease, и появление читалось
   * как рывок — не в характере темы. Длительности заодно увеличены:
   * «чилл» — это когда ничего не дёргается.
   */
  /*
   * Три ступени, а не две. Раньше между .24s и 1s не было ничего, и всё,
   * что не «мгновенный отклик на курсор» и не «выплывание блока при
   * прокрутке», приходилось писать числом мимо шкалы — отсюда и разнобой
   * (.16s, .18s, .32s, .42s в разных местах одного файла).
   *
   * --t-fast — отклик на курсор: цвет, рамка. Быстрее человек не заметит.
   * --t-med  — смена состояния: окно, спойлер, вкладка. Здесь глаз должен
   *            успеть проследить, что одно сменилось другим.
   * --t-slow — появление при прокрутке.
   */
  /* Голые длительности — там, где нужно задать задержку отдельно */

  /* Светлая полоса */

  background:var(--bg);
  color:var(--text);
  font-family:"Golos Text","Inter",system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;

  /*
   * Высота шапки одним числом на весь файл.
   *
   * Раньше она стояла в двух местах — 80px в основном правиле и 64px в
   * телефонной вставке. Пока шапка занимала место в потоке, этого хватало.
   * Теперь она закреплена, из потока вышла, и ровно столько же нужно
   * вернуть отступом сверху — иначе первый экран уедет под неё. Две
   * величины, обязанные совпадать, врозь не живут: поправят одну, забудут
   * другую, и содержимое наполовину скроется.
   */
  padding-top:var(--head-h);
}
@media (max-width:640px){ .chill{ --head-h:64px; } }

/* Дисплейный шрифт — только для крупных заголовков */
.chill h1,.chill h2,.chill .ch-display{
  font-family:"Unbounded","Golos Text",system-ui,Arial,sans-serif;
  font-weight:800;
  text-transform:uppercase;
  /*
   * Межстрочный БЕЗОПАСНЫЙ по умолчанию.
   *
   * Здесь стояло .78 — плакатное значение из замысла темы: у огромного
   * кегля строки почти сходятся, и это красиво. Но правило действовало на
   * все заголовки разом, а `.chill h1` весит больше, чем `.ch-page-h`, где
   * я задавал .94 — то есть моё значение не применялось вообще.
   *
   * На 22px это означало межстрочный 17px: строка НИЖЕ высоты букв, и
   * «Вклад в будущее проекта» налезал сам на себя. Плотность оставлена
   * там, где кегль действительно плакатный, — ниже, отдельными правилами.
   */
  line-height:1;
  letter-spacing:-.015em;
  margin:0;
  text-wrap:balance;
}
/* Плакатный кегль — вот ему плотность идёт на пользу */
.chill .ch-hero h1,
.chill .ch-display{ line-height:.84; }
/* На узком экране и герой набирается мельче — возвращаем воздух */
@media (max-width:600px){ .chill .ch-hero h1{ line-height:.92; } }

/* ═══════════════════════════════════════════════════════════════════
   МАСШТАБ КРУПНЫХ ЭЛЕМЕНТОВ

   Владелец заметил, что при 90% в браузере читается лучше, чем при 100%.
   Это разумно: на широком экране все clamp() упираются в максимум разом —
   контейнер 1560px, заголовок 112px, отступы секций по 92px, — и страница
   ощущается раздутой.

   Убавлено примерно на десятую ЧТО КРУПНОЕ: ширина контейнера, дисплейные
   заголовки, высота шапки, вертикальные отступы, высота героя.

   Мелкий текст НЕ ТРОГАЛИ намеренно. Сплошное уменьшение на 10% (проще
   всего — font-size:90% у корня) утянуло бы за собой и подписи: самые
   мелкие в теме идут по .62rem, это 9.9px, а после такого пришло бы 8.9px —
   уже за гранью читаемого. Крупное мешало, мелкое и так на пределе.
   ═══════════════════════════════════════════════════════════════════ */
.chill-wrap{ max-width:1360px; margin:0 auto; padding:0 clamp(18px,4vw,56px); }

/* Мелкая служебная строка: капс с разрядкой — фирменный приём референса */
.ch-label{
  font-size:.78rem; text-transform:uppercase; letter-spacing:.12em;
  color:var(--faint); font-weight:600;
}
.ch-label b{ color:var(--accent); font-weight:600; }

/* ── Шапка ────────────────────────────────────────────────────────
   Устройство взято у asvisacenter.ru: прозрачная полоса поверх контента,
   навигация «пилюлями», круглая кнопка меню. Скругления у них 20px+ и
   светлый глянец — сюда не переносим, иначе развалится облик «Чилла».
   Пилюли остаются круглыми намеренно: на остром тёмном они читаются как
   метки-теги и дают нужный контраст с прямыми карточками.              */
/*
 * Шапка закреплена и едет вместе со страницей.
 *
 * Была position:sticky — и не работала совсем: .chill объявлен
 * overflow-x:hidden, а по правилам CSS это делает overflow-y равным auto,
 * то есть превращает .chill в прокручиваемый блок. Липкий элемент
 * прилипает к своему ближайшему прокручиваемому предку — прилипал он,
 * стало быть, к .chill. А прокручивается-то документ. Внутри .chill
 * ничего не двигалось, липнуть было не к чему, и шапка просто уезжала
 * вверх вместе со всем остальным.
 *
 * Заметить это по стилям нельзя: правило position:sticky; top:0 выглядит
 * совершенно исправным, ломает его строчка overflow из другого места.
 *
 * position:fixed от чужого overflow не зависит вовсе. Плата — шапка
 * выходит из потока, и те 80px, что она занимала, нужно вернуть отступом
 * (см. padding-top у .chill).
 */
.ch-head{
  position:fixed; top:var(--head-top,0px); left:0; right:0;
  z-index:60; height:var(--head-h);
  display:flex; align-items:center;
  background:linear-gradient(to bottom,rgba(13,14,16,.88),rgba(13,14,16,0));
  transition:background-color .4s var(--ease), border-color .4s var(--ease);
}
/* Прокрутили — под шапкой появляется матовая подложка, иначе текст сливается */
.ch-head.stuck{
  background:rgba(13,14,16,.88); backdrop-filter:blur(14px) saturate(1.2);
  border-bottom:1px solid var(--line-soft);
}
.ch-head.solid{ background:var(--bg); border-bottom:1px solid var(--line-soft); }
.ch-head-in{ display:flex; align-items:center; gap:18px; width:100%; }

/* Навигация-пилюли: постоянная на десктопе, прячется только когда не влезает */
.ch-chips{ display:flex; gap:6px; margin-left:6px; flex-wrap:nowrap; }
.ch-chips a{
  text-decoration:none; color:var(--dim); font-size:.78rem; font-weight:600;
  text-transform:uppercase; letter-spacing:.06em; padding:9px 15px;
  border:1px solid var(--line); border-radius:999px; white-space:nowrap;
  transition:color var(--t-fast), border-color var(--t-fast), background-color var(--t-fast);
}
/* «ВАЖНО» — сбор средств, выделен так же, как на боевом сайте */
.ch-chips a.hot{ color:var(--accent); border-color:rgba(255,126,0,0.55); }
.ch-chips a.hot:hover{ background:rgba(255,126,0,0.12); border-color:var(--accent); }
.ch-chips a:hover{ color:var(--text); border-color:#3a3f46; background:var(--raise); }
.ch-chips a[aria-current]{ color:var(--accent); border-color:var(--accent); }

/* Часы. Красноярск — UTC+7, менять на серверное время нельзя:
   посетитель должен видеть местное, а не то, где стоит сервер. */
.ch-clock{
  display:inline-flex; align-items:baseline; gap:7px; padding:8px 14px;
  border:1px solid var(--line); border-radius:999px;
  font-variant-numeric:tabular-nums; white-space:nowrap;
}
.ch-clock .t{ font-size:.84rem; font-weight:600; color:var(--text); }
.ch-clock .z{ font-size:.64rem; letter-spacing:.1em; color:var(--faint); font-weight:700; }

/*
 * Круглая кнопка меню — только там, где навигация не помещается в строку.
 * display задаётся ОДИН раз и ниже, в медиазапросе: пока правило стояло
 * и здесь, и там, объявление из основного блока шло последним по порядку
 * и перекрывало запрет — кнопка оставалась видна на десктопе рядом с
 * полной навигацией.
 */
.ch-burger{
  display:none;
  width:44px; height:44px; flex:0 0 auto; border-radius:50%;
  background:transparent; border:1px solid var(--line); cursor:pointer;
  flex-direction:column; align-items:center; justify-content:center; gap:5px;
  transition:border-color var(--t-fast), background-color var(--t-fast);
}
@media (max-width:1100px){ .ch-burger{ display:flex; } }
.ch-burger:hover{ border-color:var(--accent); }
.ch-burger:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; }
.ch-burger span{
  display:block; width:17px; height:1.5px; background:var(--text); border-radius:2px;
  transition:transform .32s var(--ease), opacity .24s var(--ease);
}
.ch-burger[aria-expanded="true"]{ border-color:var(--accent); background:var(--raise); }
.ch-burger[aria-expanded="true"] span:first-child{ transform:translateY(3.25px) rotate(45deg); }
.ch-burger[aria-expanded="true"] span:last-child{ transform:translateY(-3.25px) rotate(-45deg); }
@media (prefers-reduced-motion:reduce){ .ch-burger span{ transition:none; } }

/* ── Панель меню ──────────────────────────────────────────────────── */
.ch-menu{
  /* top и max-height проставляет скрипт по реальной границе шапки —
     здесь только запасные значения на случай, если скрипт не отработал */
  position:fixed; left:0; right:0; top:var(--head-h,80px); z-index:59;
  background:rgba(18,20,23,.92); backdrop-filter:blur(18px) saturate(1.3);
  border-bottom:1px solid var(--line);
  transform:translateY(-14px); opacity:0; pointer-events:none;
  transition:transform .42s var(--ease), opacity .32s var(--ease);
  /*
   * Панель НЕ занимает весь экран.
   *
   * Раньше высота упиралась в «всё окно минус шапка», и на телефоне меню
   * закрывало страницу целиком — открыв его, человек терял из виду, где он
   * вообще находится, и это читалось как переход на другой экран, а не как
   * раскрытое меню.
   *
   * Теперь остаётся полоса страницы снизу: видно, что сайт никуда не делся,
   * и понятно, что панель можно закрыть. Если ссылок не помещается —
   * прокручивается сама панель, а не страница под ней.
   */
  max-height:min(74vh, 560px); overflow-y:auto;
  border-radius:0 0 12px 12px;
  box-shadow:0 18px 40px rgba(0,0,0,.5);
}
.ch-menu.open{ transform:none; opacity:1; pointer-events:auto; }
@media (prefers-reduced-motion:reduce){ .ch-menu{ transition:none; } }
/*
 * padding-block, а не сокращённое padding.
 *
 * Было «padding:26px 0 24px» — и этот ноль по бокам затирал боковые отступы,
 * которые даёт элементу класс .chill-wrap. Из-за этого весь список меню
 * прижимался к левому краю окна вплотную, и на телефоне, и на десктопе:
 * ровно то, что выглядит как «вёрстку не адаптировали».
 */
.ch-menu-in{ padding-block:26px 24px; }
/*
 * Раскладка групп — многоколоночная, а не сетка.
 *
 * Сетка здесь была неподходящим инструментом. Групп пять, в них 1, 2, 3, 2 и
 * 3 ссылки. auto-fit ставил четыре колонки в ряд, пятая переносилась одна, и
 * справа от неё зияла пустота во весь экран. Вдобавок grid равнял высоту всех
 * групп по самой длинной: у «Важного» с одной ссылкой оставалось три пустые
 * строки.
 *
 * columns раскладывает поток сам и выравнивает колонки по объёму, а не по
 * количеству. break-inside держит группу целой — заголовок не отрывается
 * от своих ссылок.
 */
.ch-menu-grid{
  columns:3; column-gap:40px;
}
.ch-menu-col{ break-inside:avoid; margin-bottom:24px; }
.ch-menu-col:last-child{ margin-bottom:0; }

@media (max-width:820px){ .ch-menu-grid{ columns:2; column-gap:28px; } }
.ch-menu-h{
  margin:0 0 14px; font-size:.68rem; text-transform:uppercase; letter-spacing:.13em;
  color:var(--faint); font-weight:700;
}
.ch-menu-col ul{ display:grid; gap:10px; }
.ch-menu-col a{
  text-decoration:none; color:var(--text); font-size:1.02rem; font-weight:600;
  display:inline-block; transition:color var(--t-fast), transform var(--t-fast);
}
.ch-menu-col a:hover{ color:var(--accent); transform:translateX(3px); }
.ch-menu-col a[aria-current]{ color:var(--accent); }
.ch-menu-foot{
  display:flex; gap:10px; flex-wrap:wrap;
  margin-top:30px; padding-top:22px; border-top:1px solid var(--line-soft);
}
.ch-menu-veil{ position:fixed; left:0; right:0; bottom:0; top:80px; z-index:58; background:rgba(0,0,0,.5); }

/*
 * Панель на узком экране.
 *
 * Раньше здесь просто оставалась десктопная сетка, сжатая до ширины телефона:
 * две колонки по ~150px, подписи вроде «Вклад в будущее проекта» ломались на
 * три строки, а по ссылкам приходилось целиться — высота строки была меньше
 * пальца. Ниже она переделана под касание, а не под курсор:
 *   — одна колонка;
 *   — у каждой ссылки своя строка высотой от 48px (это принятый минимум
 *     для касания) с разделителем, чтобы промах был не так вероятен;
 *   — заголовки групп мельче и прижаты к своей группе, а не висят посередине.
 */
@media (max-width:720px){
  /* На телефоне панель ещё компактнее: 11 ссылок с крупными целями иначе
     съедают экран целиком, а под ней должно оставаться видно страницу */
  .ch-menu{ max-height:min(68vh, 520px); }
  .ch-menu-in{ padding-block:8px 18px; }
  .ch-menu-grid{ columns:1; }
  .ch-menu-col{ margin-top:12px; }
  .ch-menu-col:first-child{ margin-top:6px; }
  .ch-menu-h{ margin:0 0 2px; font-size:.64rem; }
  .ch-menu-col ul{ display:block; }
  .ch-menu-col li{ border-bottom:1px solid var(--line-soft); }
  .ch-menu-col li:last-child{ border-bottom:none; }
  .ch-menu-col a{
    display:flex; align-items:center; min-height:46px; width:100%;
    font-size:1rem; padding:2px 0;
  }
  /* Сдвиг по наведению на касании только мешает — палец и так закрывает пункт */
  .ch-menu-col a:hover{ transform:none; }
  .ch-menu-foot{ margin-top:16px; padding-top:14px; }
  .ch-menu-foot .ch-btn{ flex:1 1 140px; justify-content:center; }
}

/* Совсем узкий экран: в шапке остаются логотип и кнопка меню.
   «Поддержать» никуда не пропадает — она первой строкой в панели. */
@media (max-width:420px){
  .ch-head-in{ gap:10px; }
  .ch-head-cta .ch-btn{ display:none; }
}
.ch-logo{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800; font-size:1.05rem;
  text-transform:uppercase; letter-spacing:-.01em; text-decoration:none; color:var(--text);
  display:flex; align-items:center; gap:9px; white-space:nowrap;
}
/*
 * Значок проекта.
 *
 * Здесь стоял оранжевый квадратик — заглушка со стенда, пока рисовали
 * облик. Настоящий логотип у проекта есть, он же стоит во вкладке
 * браузера, и подменять его абстрактной фигурой незачем: людям он знаком.
 *
 * Файл квадратный 1024×1024, поэтому нужны и размеры, и object-fit —
 * иначе браузер поставит его в натуральную величину и разорвёт шапку.
 */
.ch-logo img{
  width:26px; height:26px; object-fit:contain; flex:0 0 auto;
  /*
   * Выворачиваем в белый.
   *
   * Файл — чёрный силуэт на прозрачном фоне (RGBA, угловой пиксель с
   * альфой 0), то есть нарисован под светлую подложку. На тёмной шапке он
   * почти сливается с фоном. На боевом сайте ровно та же беда, её там
   * пробуют лечить жёлтым ореолом drop-shadow — от этого читается не сам
   * силуэт, а свечение вокруг него.
   *
   * invert(1) переводит чёрное в белое и не трогает прозрачность:
   * получается белый значок в один тон с надписью рядом. Цветного ореола
   * не добавляем — в этой теме цвет означает действие, а логотип не
   * действие.
   */
  filter:invert(1);
}
@media (max-width:640px){ .ch-logo img{ width:23px; height:23px; } }
.ch-head-cta{ margin-left:auto; display:flex; gap:8px; align-items:center; }

/* ── Кнопки ───────────────────────────────────────────────────────── */
.ch-btn{
  display:inline-flex; align-items:center; gap:9px; text-decoration:none;
  font-size:.82rem; font-weight:700; text-transform:uppercase; letter-spacing:.06em;
  padding:14px 22px; border-radius:6px; border:1px solid var(--line);
  color:var(--text); background:transparent; white-space:nowrap;
  transition:border-color .16s ease,background-color .16s ease,color .16s ease;
}
.ch-btn:hover{ border-color:#3d3d3d; background:var(--raise); }
.ch-btn.solid{ background:var(--accent); border-color:var(--accent); color:var(--on-accent); }
.ch-btn.solid:hover{ background:#ff9226; border-color:#ff9226; }
.ch-btn.sm{ padding:10px 15px; font-size:.75rem; }
/* Асимметричное скругление — деталь, подсмотренная в референсе */
.ch-btn.slab{ border-radius:10px 2px 2px 10px; }
.ch-btn:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; }

/* ── Герой ────────────────────────────────────────────────────────── */
.ch-hero{ position:relative; min-height:clamp(460px,70vh,760px); display:flex; align-items:flex-end;
          padding-bottom:clamp(40px,7vh,90px); overflow:hidden; }
.ch-hero-canvas{ position:absolute; inset:0; width:100%; height:100%; display:block; z-index:0; }

/*
 * Видео лежит ровно поверх градиента и проявляется, только когда реально
 * пошло (класс .on вешает скрипт по событию playing). Так посетитель не
 * видит ни чёрного прямоугольника, ни рывка подмены.
 *
 * width/height обязательны по той же причине, что и у canvas: <video> —
 * заменяемый элемент, одного inset:0 ему мало, он остался бы в своём
 * собственном размере.
 */
.ch-hero-video{
  position:absolute; inset:0; width:100%; height:100%; display:block; z-index:0;
  object-fit:cover; opacity:0; transition:opacity 1.1s var(--ease); pointer-events:none;
}
.ch-hero-video.on{ opacity:1; }
@media (prefers-reduced-motion:reduce){ .ch-hero-video{ transition:none; } }
/* Затемнение снизу, чтобы текст всегда читался поверх живого фона */
.ch-hero::after{
  content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:linear-gradient(to top,rgba(0,0,0,.96) 4%,rgba(0,0,0,.55) 42%,rgba(0,0,0,.15) 100%);
}
.ch-hero-in{ position:relative; z-index:2; width:100%; }
/*
 * Кегль подобран под САМОЕ ДЛИННОЕ слово заголовка — «Красноярские».
 * В Unbounded оно занимает 10.56em, то есть при 10.5vw вылезало за экран
 * на 200px и обрезалось. Считаем от ширины окна: доступно 100vw минус
 * боковые отступы (до 56px с каждой стороны), значит предел ≈ 9.4vw;
 * берём 8.2vw, чтобы остался запас на промежуточных ширинах.
 * Менять текст ради вёрстки нельзя — он взят с боевого сайта.
 */
.ch-hero h1{ font-size:clamp(1.7rem,7.4vw,6.1rem); margin:18px 0 0; }
.ch-hero h1 em{ font-style:normal; color:var(--accent); }
.ch-hero-foot{
  display:flex; align-items:flex-end; justify-content:space-between; gap:28px 40px;
  flex-wrap:wrap; margin-top:clamp(26px,4vh,48px);
}
/*
 * «Counter-Strike 1.6» под заголовком — это НАЗВАНИЕ ИГРЫ, а не подпись
 * к картинке. Раньше оно шло обычным серым текстом и терялось рядом с
 * огромным «СЕРВЕРА», хотя именно оно отвечает на вопрос «во что тут
 * играют». Набираем дисплейным шрифтом, разрядкой и в рамке — как ярлык.
 */
.ch-hero-sub{
  display:inline-flex; align-items:center; margin:0;
  font-family:"Unbounded",system-ui,sans-serif; font-weight:700;
  font-size:.74rem; letter-spacing:.16em; text-transform:uppercase;
  color:var(--text); white-space:nowrap;
  padding:7px 14px; border:1px solid rgba(255,255,255,.16); border-radius:999px;
  background:rgba(13,14,16,.42);
  -webkit-backdrop-filter:blur(12px) saturate(1.2);
  backdrop-filter:blur(12px) saturate(1.2);
}
@media (max-width:520px){ .ch-hero-sub{ font-size:.66rem; letter-spacing:.12em; padding:6px 12px; } }
.ch-hero-acts{ display:flex; gap:10px; flex-wrap:wrap; }

/* Живой индикатор онлайна */
.ch-live{ display:inline-flex; align-items:center; gap:9px; }
.ch-live-dot{ width:8px; height:8px; border-radius:50%; background:var(--ok); flex:0 0 auto;
              box-shadow:0 0 0 0 rgba(95,208,122,.6); animation:ch-pulse 2.4s ease-out infinite; }
@keyframes ch-pulse{ 70%{ box-shadow:0 0 0 9px rgba(95,208,122,0); } 100%{ box-shadow:0 0 0 0 rgba(95,208,122,0); } }
@media (prefers-reduced-motion:reduce){ .ch-live-dot{ animation:none; } }

/* ── Полоса цифр ──────────────────────────────────────────────────── */
.ch-stats{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
  border-top:1px solid var(--line); border-bottom:1px solid var(--line);
}
.ch-stat{ padding:30px 4px 28px; border-right:1px solid var(--line-soft); }
.ch-stat:last-child{ border-right:none; }
.ch-stat b{
  display:block; font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:clamp(1.9rem,3.6vw,2.6rem); line-height:1; font-variant-numeric:tabular-nums;
  letter-spacing:-.02em;
}
.ch-stat span{ display:block; margin-top:9px; font-size:.72rem; text-transform:uppercase;
               letter-spacing:.1em; color:var(--faint); font-weight:600; }

/* ── Секции: главное здесь — воздух ───────────────────────────────── */
/*
 * Только padding-top/bottom, не сокращённая запись.
 * Классы .chill-wrap и .ch-sec висят на ОДНОМ элементе, и `padding: X 0`
 * обнуляло боковой отступ от .chill-wrap — крупные заголовки прилипали
 * к самому краю экрана, пока цифры выше отступ держали.
 */
/*
 * Вертикальные отступы секций.
 *
 * Было по 100–150px сверху И снизу у каждой. Две секции подряд давали
 * между собой около 200px пустоты, а заголовок страницы отделяло от
 * содержимого 126px — экран уходил в никуда, особенно на страницах с
 * документами, где блок всего один.
 *
 * Воздух теме нужен, поэтому убираем не его, а УДВОЕНИЕ: у соседних
 * секций верхний отступ схлопывается, работает только нижний у
 * предыдущей. Само значение тоже уменьшено — 150px было чересчур.
 */
.ch-sec{ padding-top:clamp(42px,6vh,78px); padding-bottom:clamp(42px,6vh,78px); }

/* Соседние секции не складывают отступы */
.ch-sec + .ch-sec{ padding-top:0; }
/* После светлой полосы отступ нужен — меняется фон, — но меньше обычного:
   сама смена цвета уже отделяет блоки, дублировать её воздухом незачем. */
.ch-invert + .ch-sec{ padding-top:clamp(36px,5vh,64px); }

/* После заголовка страницы содержимое начинается сразу, а не через экран */
.ch-page + .ch-sec{ padding-top:clamp(8px,1.5vh,20px); }
.ch-page + .ch-invert > .ch-sec{ padding-top:clamp(30px,4vh,54px); }
.ch-page + div > .ch-stats{ margin-top:clamp(8px,1.5vh,20px); }

/* Последняя секция перед подвалом: подвал сам с отступом сверху */
.ch-sec:last-of-type{ padding-bottom:clamp(36px,5vh,68px); }
.ch-sec-h{ display:flex; align-items:flex-end; justify-content:space-between; gap:16px 30px;
           flex-wrap:wrap; margin-bottom:clamp(26px,4vh,52px); }
/*
 * Нижняя граница кегля мельче, чем хочется, из-за длинных русских слов.
 * «Администраторы» — одно слово в 14 букв, переносить его негде, и при
 * 1.7rem оно вылезало за экран на узком телефоне. Заголовки берутся с
 * боевого сайта, сокращать их нельзя, поэтому подстраивается кегль.
 * hyphens — страховка на случай слова ещё длиннее: у <html lang="ru">
 * браузер переносит по правилам языка, а не рубит посередине.
 */
.ch-sec-h h2{ font-size:clamp(1.3rem,3.4vw,2.3rem); hyphens:auto; }
.ch-sec-h .more{ color:var(--accent); text-decoration:none; font-size:.8rem; font-weight:700;
                 text-transform:uppercase; letter-spacing:.08em; white-space:nowrap; }
.ch-sec-h .more:hover{ text-decoration:underline; text-underline-offset:4px; }

/* ── Светлая полоса ───────────────────────────────────────────────
   Инвертированная секция во всю ширину. Ради неё .chill-wrap внутри
   ставится отдельным элементом, иначе фон обрезался бы по колонке.   */
.ch-invert{ background:var(--lt-bg); color:var(--lt-text); }
.ch-invert h2{ color:var(--lt-text); }
.ch-invert .ch-sec-h .more{ color:#b35800; }
.ch-invert .ch-label{ color:var(--lt-dim); }

.ch-perks{ display:grid; gap:16px; grid-template-columns:repeat(auto-fit,minmax(290px,1fr)); }
.ch-perk{
  background:var(--lt-panel); border:1px solid var(--lt-line); border-radius:8px;
  padding:28px 26px 26px; display:flex; flex-direction:column; gap:18px;
}
.ch-perk-h{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; }
.ch-perk h3{
  margin:0; font-family:"Unbounded",system-ui,sans-serif; font-weight:800; text-transform:uppercase;
  font-size:clamp(1.15rem,2.4vw,1.6rem); letter-spacing:-.02em; line-height:1; color:var(--lt-text);
}
.ch-perk .from{ font-size:.76rem; text-transform:uppercase; letter-spacing:.09em;
                color:var(--lt-dim); font-weight:600; white-space:nowrap; }
.ch-perk .from b{ color:#b35800; font-variant-numeric:tabular-nums; }
.ch-perk .tagline{ margin:0; font-size:.92rem; color:var(--lt-dim); line-height:1.55; }
.ch-perk ul{ display:grid; gap:11px; }
.ch-perk li{ display:flex; gap:11px; align-items:flex-start; font-size:.94rem; line-height:1.45; }
/* Маркер — квадратик акцента, как метка в логотипе */
.ch-perk li::before{
  content:""; width:7px; height:7px; border-radius:2px; background:var(--accent);
  flex:0 0 auto; margin-top:.45em;
}
/*
 * Подводка. По умолчанию отступ обычный, положительный.
 *
 * Раньше здесь стоял отрицательный margin — он нужен только когда подводка
 * идёт сразу за заголовком секции (у .ch-sec-h свой большой нижний отступ,
 * и без подтяжки образуется провал). Но тот же класс стоит и под заголовком
 * страницы, где отрицательный отступ затаскивал текст прямо в буквы
 * заголовка. Поэтому подтяжка теперь только для соседства с .ch-sec-h.
 */
.ch-lead{ margin:14px 0 0; font-size:1rem; line-height:1.6; color:var(--dim); max-width:52ch; }
.ch-sec-h + .ch-lead{ margin:-14px 0 34px; }
.ch-invert .ch-lead{ color:var(--lt-dim); }

/* Тарифы, попавшие на светлую полосу */
.ch-invert .ch-tier{ background:var(--lt-panel); border-color:var(--lt-line); }
.ch-invert .ch-tier:hover{ border-color:#bfbfb9; }
.ch-invert .ch-tier.best{ border-color:var(--accent); }
.ch-invert .ch-tier h3{ color:var(--lt-dim); }
.ch-invert .ch-tier .price{ color:var(--lt-text); }
.ch-invert .ch-tier .per{ color:var(--lt-dim); }

.ch-invert .ch-btn{ border-color:#cfcfc9; color:var(--lt-text); }
.ch-invert .ch-btn:hover{ border-color:#a8a8a2; background:#e9e9e5; }
.ch-invert .ch-btn.solid{ border-color:var(--accent); color:var(--on-accent); background:var(--accent); }
.ch-invert .ch-btn.solid:hover{ background:#ff9226; border-color:#ff9226; }

/* Крупная фраза-разделитель — у референса это целые экраны текста */
/* Боковой отступ не трогаем: он приходит от .chill-wrap на том же элементе */
.ch-phrase{ padding-top:clamp(70px,14vh,190px); padding-bottom:clamp(70px,14vh,190px); }
.ch-phrase p{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800; text-transform:uppercase;
  font-size:clamp(1.4rem,3.6vw,2.9rem); line-height:1.06; letter-spacing:-.015em;
  margin:0; max-width:22ch;
}
.ch-phrase p em{ font-style:normal; color:var(--accent); }
.ch-phrase .note{ font-family:"Golos Text",system-ui,sans-serif; text-transform:none; font-weight:400;
                  font-size:1rem; line-height:1.65; color:var(--dim); max-width:48ch; margin-top:24px;
                  letter-spacing:0; }

/* ── Карточки серверов ────────────────────────────────────────────── */
.ch-servers{ display:grid; gap:14px; grid-template-columns:repeat(auto-fit,minmax(330px,1fr)); }
.ch-srv{
  position:relative; overflow:hidden; border:1px solid var(--line); border-radius:8px;
  background:var(--panel); padding:26px 24px 22px; isolation:isolate;
  transition:border-color var(--t-fast), transform var(--t-fast);
}
.ch-srv:hover{ border-color:#3a3a3a; transform:translateY(-2px); }
/*
 * width/height обязательны, одного inset:0 мало.
 * <canvas> — заменяемый элемент: при width:auto он держит собственный
 * размер 300×150 и не растягивается по вставкам. Подложка занимала левый
 * верхний угол карточки, и по её краю шла заметная прямая граница.
 */
.ch-srv-bg{ position:absolute; inset:0; width:100%; height:100%; z-index:-1; opacity:.5; }
.ch-srv-top{ display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:22px; }
.ch-srv-name{ font-family:"Unbounded",system-ui,sans-serif; font-weight:700; text-transform:uppercase;
              font-size:.98rem; letter-spacing:-.01em; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ch-srv-state{ font-size:.7rem; text-transform:uppercase; letter-spacing:.09em; font-weight:700;
               color:var(--ok); display:inline-flex; align-items:center; gap:7px; flex:0 0 auto; }
.ch-srv-state.off{ color:#d0574e; }
.ch-srv-num{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800; font-size:clamp(2.4rem,6vw,3.9rem);
             line-height:.9; letter-spacing:-.03em; font-variant-numeric:tabular-nums; }
.ch-srv-num small{ font-size:.34em; color:var(--faint); font-weight:700; letter-spacing:0; }
.ch-srv-meta{ display:flex; gap:22px; flex-wrap:wrap; margin:16px 0 20px; }
.ch-srv-meta div{ min-width:0; }
.ch-srv-meta dt{ font-size:.68rem; text-transform:uppercase; letter-spacing:.1em; color:var(--faint);
                 font-weight:600; margin-bottom:5px; }
.ch-srv-meta dd{ margin:0; font-size:.92rem; font-weight:600; }
.ch-srv-bar{ height:3px; background:var(--line); border-radius:2px; overflow:hidden; margin-bottom:20px; }
.ch-srv-bar i{ display:block; height:100%; background:var(--accent); width:var(--fill,50%); }
.ch-srv-foot{ display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap; }
.ch-srv-addr{ font-family:ui-monospace,Consolas,monospace; font-size:.84rem; color:var(--dim); }

/* ── Тарифы ───────────────────────────────────────────────────────── */
.ch-tiers{ display:grid; gap:14px; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); }
.ch-tier{ border:1px solid var(--line); border-radius:8px; background:var(--panel);
          padding:26px 22px 22px; display:flex; flex-direction:column; gap:14px;
          transition:border-color .18s ease; }
.ch-tier:hover{ border-color:#3a3a3a; }
.ch-tier.best{ border-color:var(--accent); }
.ch-tier-top{ display:flex; align-items:baseline; justify-content:space-between; gap:10px; }
.ch-tier h3{ margin:0; font-size:.76rem; text-transform:uppercase; letter-spacing:.1em;
             color:var(--dim); font-weight:700; }
.ch-tier .flag{ font-size:.66rem; text-transform:uppercase; letter-spacing:.08em; font-weight:700;
                color:var(--accent); }
.ch-tier .price{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
                 font-size:clamp(1.6rem,3.4vw,2.3rem); line-height:1; letter-spacing:-.025em;
                 font-variant-numeric:tabular-nums; }
.ch-tier .per{ font-size:.8rem; color:var(--faint); }
.ch-tier .ch-btn{ margin-top:auto; justify-content:center; }

/* ── Списки: спонсоры и состав (у референса так сделаны вакансии) ── */
.ch-cols{ display:grid; gap:clamp(30px,5vw,60px); grid-template-columns:1.15fr 1fr; align-items:start; }
.ch-rows{ border-top:1px solid var(--line); }
.ch-row{
  display:flex; align-items:center; gap:16px; padding:17px 6px;
  border-bottom:1px solid var(--line-soft); transition:padding-left var(--t-fast), background-color var(--t-fast);
}
.ch-row:hover{ padding-left:14px; background:linear-gradient(to right,var(--raise),transparent 70%); }
.ch-row .rank{ font-family:ui-monospace,Consolas,monospace; font-size:.78rem; color:var(--faint);
               min-width:2.4em; flex:0 0 auto; }
.ch-row .who{ font-weight:600; font-size:.96rem; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ch-row .val{ margin-left:auto; font-variant-numeric:tabular-nums; font-weight:700; color:var(--accent);
              flex:0 0 auto; }
.ch-row .role{ margin-left:auto; font-size:.72rem; text-transform:uppercase; letter-spacing:.08em;
               color:var(--faint); flex:0 0 auto; }
.ch-ava{ width:34px; height:34px; border-radius:50%; background:var(--raise); color:var(--text);
         display:flex; align-items:center; justify-content:center; font-weight:700; font-size:.84rem;
         flex:0 0 auto; border:1px solid var(--line); }

/* ── Подвал ───────────────────────────────────────────────────────── */
.ch-foot{ border-top:1px solid var(--line); padding:clamp(46px,7vh,86px) 0 34px; }
.ch-foot-grid{ display:grid; gap:34px; grid-template-columns:1.6fr repeat(3,1fr); margin-bottom:44px; }
.ch-foot-brand .ch-display{ font-size:clamp(1.6rem,4vw,2.6rem); }
/*
 * Строка под маркой должна умещаться целиком. При max-width:32ch «1.6»
 * срывалось на вторую строку и висело там одиноким огрызком.
 * text-wrap:balance разложил бы её ровнее, но здесь нужна именно одна
 * строка, поэтому ограничение по ширине снято, а перенос запрещён.
 */
.ch-foot-brand p{
  color:var(--faint); font-size:.88rem; line-height:1.65; margin:16px 0 0;
  white-space:nowrap;
}
/* На узком экране одна строка не влезет — там перенос разрешаем обратно,
   иначе подпись вылезет за край и растянет страницу вбок */
@media (max-width:560px){ .ch-foot-brand p{ white-space:normal; max-width:32ch; } }
.ch-foot h4{ margin:0 0 14px; font-size:.7rem; text-transform:uppercase; letter-spacing:.11em;
             color:var(--faint); font-weight:700; }
.ch-foot ul{ display:grid; gap:11px; }
.ch-foot a{ text-decoration:none; color:var(--dim); font-size:.9rem; }
.ch-foot a:hover{ color:var(--accent); }
.ch-foot-bottom{ border-top:1px solid var(--line-soft); padding-top:22px;
                 display:flex; justify-content:space-between; gap:14px; flex-wrap:wrap;
                 font-size:.78rem; color:var(--faint); }

/* ── Внутренние страницы ──────────────────────────────────────────── */

/* Шапка не поверх героя — значит нужна подложка, иначе текст под ней сольётся */
.ch-head.solid{ background:var(--bg); border-bottom:1px solid var(--line-soft); }

.ch-page{ padding:clamp(34px,6vh,66px) clamp(18px,4vw,48px) clamp(18px,3vh,30px); }
/*
 * Заголовок страницы.
 *
 * Был до 4rem, а надпись над ним — 0.78rem: разрыв впятеро, и мелкие слова
 * рядом с огромными выглядели потерянными. Надстрочные слова убраны совсем,
 * заголовок уменьшен до 2.9rem, подводка наоборот подросла и придвинута —
 * пара стала читаться как одно целое, а не как два случайных размера.
 *
 * Нижняя граница мелкая из-за длинных русских слов: «Конфиденциальность»
 * — 18 букв одним куском, переносить негде. hyphens — страховка.
 */
.ch-page-h{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800; text-transform:uppercase;
  font-size:clamp(1.4rem,4.4vw,2.9rem); line-height:.94; letter-spacing:-.02em;
  margin:0; text-wrap:balance; hyphens:auto;
}
/*
 * Заголовок документа. «Политика конфиденциальности «KRAS MEAT»» — 39
 * символов; плакатным кеглем это две строки высотой 72px, что для страницы
 * с юридическим текстом неуместно: заголовок кричит громче содержимого.
 */
.ch-page-h.doc{ font-size:clamp(1.25rem,2.6vw,1.9rem); line-height:1.06; }

.ch-page-lead{
  margin:14px 0 0; max-width:56ch;
  font-size:clamp(.98rem,1.5vw,1.12rem); line-height:1.55; color:var(--dim);
}

/* Подзаголовок линейки тарифов / блока реквизитов */
.ch-line-h{
  font-size:.72rem; text-transform:uppercase; letter-spacing:.11em; font-weight:700;
  color:var(--faint); margin:0 0 12px;
}
.ch-invert .ch-line-h{ color:var(--lt-dim); }

/* Карточка-контейнер формы */
.ch-form-grid{ display:grid; gap:16px; grid-template-columns:repeat(auto-fit,minmax(320px,1fr)); align-items:start; }
/* Узкая колонка (вход в кабинет) стояла у левого края: max-width без
   margin:auto не центрирует, а просто обрезает ширину. */
.ch-narrow{ max-width:620px; margin-inline:auto; }
.ch-card{ background:var(--panel); border:1px solid var(--line); border-radius:8px; padding:26px 24px; }
.ch-card-h{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800; text-transform:uppercase;
  font-size:1rem; letter-spacing:-.01em; margin:0 0 6px; color:var(--text);
}
.ch-note{ font-size:.86rem; line-height:1.6; color:var(--dim); margin:8px 0 0; }
.ch-invert .ch-note{ color:var(--lt-dim); }
.ch-card-foot{
  display:flex; justify-content:space-between; gap:12px; flex-wrap:wrap;
  border-top:1px solid var(--line-soft); margin-top:22px; padding-top:16px;
  font-size:.84rem; color:var(--faint);
}
.ch-card-foot a{ color:var(--accent); text-decoration:none; }
.ch-card-foot a:hover{ text-decoration:underline; text-underline-offset:3px; }

/* Поля ввода */
.ch-field{ display:grid; gap:7px; margin-top:16px; }
.ch-field label{
  font-size:.72rem; text-transform:uppercase; letter-spacing:.1em; font-weight:700; color:var(--faint);
}
.ch-field input{
  font:inherit; font-size:.95rem; width:100%; box-sizing:border-box;
  padding:12px 14px; border-radius:6px;
  background:var(--bg); color:var(--text); border:1px solid var(--line);
  transition:border-color var(--t-fast);
}
.ch-field input::placeholder{ color:var(--faint); }
.ch-field input:focus{ outline:none; border-color:var(--accent); }
.ch-field input:disabled{ color:var(--faint); background:var(--raise); }

.ch-btn.wide{ width:100%; justify-content:center; margin-top:20px; }

/* Способы оплаты */
.ch-methods{ display:grid; gap:10px; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); margin-top:16px; }
.ch-method{
  text-align:left; display:grid; gap:4px; padding:14px 16px; border-radius:6px;
  background:var(--bg); border:1px solid var(--line); color:var(--text);
  transition:border-color var(--t-fast), background-color var(--t-fast);
}
.ch-method b{ font-size:.9rem; font-weight:700; }
.ch-method span{ font-size:.76rem; color:var(--faint); }
.ch-method:hover{ border-color:#3a3f46; }
.ch-method.on{ border-color:var(--accent); background:rgba(255,126,0,0.08); }

/* Реквизиты */
.ch-bank{ margin-top:20px; padding-top:18px; border-top:1px solid var(--line-soft); }
.ch-bank-rows{ display:grid; gap:11px; margin:0 0 4px; }
.ch-bank-rows div{ display:flex; justify-content:space-between; gap:12px; flex-wrap:wrap; align-items:center; }
.ch-bank-rows dt{ font-size:.76rem; text-transform:uppercase; letter-spacing:.08em; color:var(--faint); }
.ch-bank-rows dd{ margin:0; font-weight:600; font-size:.92rem; display:flex; align-items:center; gap:10px; }
.ch-bank-rows dd.mono{ font-family:ui-monospace,Consolas,monospace; }

/* Предупреждение (в кабинете — требование закона, его нельзя потерять) */
.ch-warn{
  margin-top:20px; padding:14px 16px; border-radius:6px; font-size:.85rem; line-height:1.6;
  color:var(--dim); background:var(--raise); border:1px solid var(--line);
  border-left:2px solid var(--accent);
}
.ch-warn a{ color:var(--accent); text-decoration:none; }
.ch-warn a:hover{ text-decoration:underline; text-underline-offset:3px; }

/* Строка «фраза + действие»: замена лишнему второму заголовку на странице.
   Фраза набрана как текст, а не как крупный заголовок, поэтому не спорит
   с названием страницы и не оставляет под собой висящую мелкую ссылку. */
.ch-strip{
  display:flex; align-items:center; justify-content:space-between; gap:14px 20px;
  flex-wrap:wrap; padding:18px 20px; margin-bottom:26px;
  background:var(--panel); border:1px solid var(--line); border-radius:8px;
}
.ch-strip-t{ margin:0; font-size:1rem; color:var(--text); font-weight:600; }

/* ── Пьедестал: первые три спонсора ───────────────────────────────
   Список из тридцати одинаковых строк не отвечает на вопрос «кто самый
   щедрый». Первые три вынесены отдельными карточками; первый крупнее
   и с акцентной рамкой, второй и третий — обычные. Медальных золота и
   серебра здесь нет намеренно: палитра в один акцент, и три разных
   металла её бы развалили — иерархия задана размером и яркостью.   */
.ch-podium{ display:grid; gap:12px; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); margin-bottom:34px; }
.ch-pod{
  position:relative; overflow:hidden; background:var(--panel);
  border:1px solid var(--line); border-radius:8px; padding:22px 20px 20px;
}
.ch-pod.first{ border-color:var(--accent); }
.ch-pod.first::before{
  content:""; position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(120% 90% at 85% 0%, rgba(255,126,0,0.16), transparent 70%);
}
.ch-pod-top{ display:flex; align-items:center; justify-content:space-between; gap:10px; position:relative; }
.ch-pod-rank{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800; line-height:1;
  font-size:2.4rem; letter-spacing:-.04em; color:var(--line);
}
.ch-pod.first .ch-pod-rank{ color:var(--accent); font-size:3.2rem; }
.ch-pod-crown{
  font-size:.62rem; text-transform:uppercase; letter-spacing:.12em; font-weight:800;
  color:var(--on-accent); background:var(--accent); border-radius:999px; padding:4px 10px;
}
/* Полоса вклада относительно лидера: видно не только «кто первый»,
   но и насколько он оторвался — именно это и заводит соревнование */
.ch-pod-bar{ position:relative; height:3px; background:var(--line); border-radius:2px;
             overflow:hidden; margin-top:14px; }
.ch-pod-bar i{ display:block; height:100%; width:var(--p,0%); background:var(--accent); }
.ch-pod.first .ch-pod-bar i{ box-shadow:0 0 10px rgba(255,126,0,0.60); }
.ch-pod-nm{
  margin-top:12px; font-weight:700; font-size:1.05rem; overflow-wrap:anywhere; position:relative;
}
.ch-pod.first .ch-pod-nm{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800; text-transform:uppercase;
  font-size:1.25rem; letter-spacing:-.02em;
}
.ch-pod-sum{
  margin-top:8px; font-variant-numeric:tabular-nums; font-weight:700;
  color:var(--accent); font-size:1.1rem; position:relative;
}
.ch-pod.first .ch-pod-sum{ font-size:1.4rem; }
.ch-pod-note{ margin-top:9px; font-size:.74rem; text-transform:uppercase;
              letter-spacing:.09em; color:var(--faint); font-weight:600; position:relative; }

/* Широкий список спонсоров на своей странице */
/* Разрыв до места выше — тот же приём, что и на пьедестале:
   строка перестаёт быть просто фамилией с суммой и становится целью */
.ch-rows-wide .ch-row .gap{
  margin-left:auto; margin-right:16px; font-size:.76rem; color:var(--faint);
  flex:0 1 auto; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.ch-rows-wide .ch-row:hover .gap{ color:var(--dim); }
@media (max-width:640px){ .ch-rows-wide .ch-row .gap{ display:none; } }
.ch-rows-wide .ch-row.top .who{ color:var(--text); font-weight:700; }
.ch-rows-wide .ch-row.top .rank{ color:var(--accent); }
.ch-srv-acts{ display:flex; gap:8px; flex-wrap:wrap; }

/* Обращение владельца на странице сбора — крупнее обычного текста,
   с акцентной чертой: это не абзац, а просьба.                     */
.ch-appeal{
  border-left:3px solid var(--accent); padding:6px 0 6px 22px; max-width:62ch;
}
.ch-appeal p{
  margin:0; font-size:clamp(1.05rem,2.2vw,1.35rem); line-height:1.55;
  color:var(--text); font-weight:500;
}

/* ── График онлайна ───────────────────────────────────────────────
   Классы повторяют боевой includes/online_chart.php, поэтому эти стили
   лягут и на настоящий график, когда дойдёт до переноса.              */
.ch-chart-card{ background:var(--panel); border:1px solid var(--line); border-radius:8px; padding:22px 20px 18px; }
.ch-chart-sum{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(120px,1fr));
  gap:10px; margin-bottom:20px; padding-bottom:18px; border-bottom:1px solid var(--line-soft);
}
.ch-chart-sum b{
  display:block; font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:clamp(1.3rem,3vw,1.9rem); line-height:1; letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;
}
.ch-chart-sum span{
  display:block; margin-top:7px; font-size:.7rem; text-transform:uppercase;
  letter-spacing:.1em; color:var(--faint); font-weight:600;
}
/* Узкий экран — график листается вбок, а не жмётся в нечитаемую кашу */
.ch-chart-box{ overflow-x:auto; }
/* ── Графики ───────────────────────────────────────────────────────
   Правила написаны под РАЗМЕТКУ БОЕВОГО includes/online_chart.php,
   чтобы при переносе его не пришлось трогать.
   
   Важная деталь: боевой код красит столбики классом, собранным на лету —
   'bar s' . $color, то есть .bar.s0 и .bar.s1, а лучший столбик получает
   ещё и .top. Я сперва решил, что наши классы совпадают с боевыми, но
   сверял только литералы в разметке и динамические имена пропустил: у
   стенда столбик — просто <rect> без класса. Ниже покрыты оба варианта,
   поэтому оформление ляжет и на стенд, и на боевой график.             */
/* Высота задаётся пропорцией viewBox, а не числом: жёсткая высота при
   width:100% ломает масштаб — SVG вписывается по меньшей стороне, и текст
   сжимается сильнее, чем сама картинка. */
.kmc-chart{ display:block; width:100%; height:auto; }
.kmc-chart .grid{ stroke:var(--line-soft); stroke-width:1; }
.kmc-chart .ax{ fill:var(--faint); font-size:11px;
                font-family:ui-monospace,Consolas,monospace; }

/* Столбик: и наш <rect> без класса, и боевые .bar.s0 / .bar.s1 */
.kmc-chart .col rect,
.kmc-chart .bar{ fill:var(--accent); opacity:.85; transition:opacity var(--t-fast); }
/*
 * Наведение на столбик должно быть ЗАМЕТНЫМ.
 *
 * Раньше здесь менялась только прозрачность, .85 → 1. На глаз это почти
 * ничего: подпись под графиком зовёт навести на столбик, человек наводит —
 * и не понимает, сработало или нет. Системная подсказка из <title> всплывает
 * лишь через секунду, столько никто не держит курсор.
 *
 * Теперь столбик заметно светлеет, его число становится акцентным, а курсор
 * меняется на «справку» — это видно сразу, ещё до всплывающей подсказки.
 */
.kmc-chart .col{ cursor:help; }
.kmc-chart .col:hover rect,
.kmc-chart .col:hover .bar{ opacity:1; filter:brightness(1.5); }
.kmc-chart .col:hover .val{ fill:var(--accent); font-weight:700; }
/* Столбики «сервер молчал» и «никого не было» тоже отзываются: иначе
   кажется, что часть графика неживая */
.kmc-chart .down:hover,
.kmc-chart .zero:hover,
.kmc-chart .gap:hover{ opacity:1; filter:brightness(1.6); cursor:help; }

/* Второй сервер на общем графике — свой оттенок, иначе кривые не различить */
.kmc-chart .bar.s1{ fill:var(--info); }
/* Пик — полная непрозрачность и светлая кромка сверху */
.kmc-chart .bar.top{ opacity:1; }

.kmc-chart .zero{ fill:var(--faint); opacity:.5; }
.kmc-chart .gap{ fill:var(--line); }
/* Сервер лежал — вертикальная полоса на всю высоту, приглушённо красная */
.kmc-chart .down{ fill:rgba(255,107,107,.16); }
.kmc-chart .val{ fill:var(--text); font-size:10px; font-variant-numeric:tabular-nums; }

/* ── График по картам (kmc-maps) ──────────────────────────────────
   Ниже основного и без подписей значений у каждого столбика: названия
   карт и так повёрнуты на 45°, добавлять к ним цифры — перегруз.      */
.kmc-chart.kmc-maps{ height:auto; }
.kmc-chart.kmc-maps .val{ fill:var(--dim); font-size:10px; }
.kmc-chart .mapname{
  fill:var(--dim); font-size:10.5px;
  font-family:ui-monospace,Consolas,monospace;
}

/* ── Вкладки документов ───────────────────────────────────────────── */
.ch-tabs{ display:flex; gap:6px; flex-wrap:wrap; margin-bottom:30px; }
.ch-tabs a{
  text-decoration:none; color:var(--dim); font-size:.8rem; font-weight:600;
  text-transform:uppercase; letter-spacing:.07em; padding:9px 15px;
  border:1px solid var(--line); border-radius:6px; transition:var(--t-fast);
}
.ch-tabs a:hover{ color:var(--text); border-color:#3a3f46; }
.ch-tabs a[aria-current]{ background:var(--accent); border-color:var(--accent); color:var(--on-accent); }

/* ── Юридический документ ─────────────────────────────────────────
   Текст длинный и его читают, а не разглядывают: колонка узкая, строки
   просторные, заголовки заметно отбиты. Никакого капса в теле.        */
/* Вложенные вкладки внутри документа — мельче основных, чтобы не спорить
   с переключателем самих документов над ними */
.ch-tabs-sub{ margin:-14px 0 26px; }
.ch-tabs-sub a{ font-size:.72rem; padding:6px 13px; }

.ch-doc{ max-width:76ch; }
.ch-doc h2{ font-size:clamp(1.2rem,2.6vw,1.7rem); margin:34px 0 12px; }
.ch-doc h3{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:700; text-transform:none;
  font-size:1.05rem; line-height:1.25; letter-spacing:-.01em; color:var(--text);
  margin:32px 0 10px;
}
.ch-doc h4{ font-size:.96rem; margin:22px 0 8px; color:var(--text); text-transform:none; }
.ch-doc p{ margin:0 0 14px; font-size:.96rem; line-height:1.75; color:var(--dim); }
/*
 * list-style:none обязателен. Ниже у списков свои маркеры через ::before
 * (квадратик у ul, счётчик у ol), а родную нумерацию браузер продолжал
 * рисовать поверх — пункты выходили как «1. 1. Использование читов».
 */
.ch-doc ul,.ch-doc ol{ margin:0 0 16px; padding-left:0; display:grid; gap:9px; list-style:none; }
.ch-doc li{
  position:relative; padding-left:20px; font-size:.95rem; line-height:1.7; color:var(--dim);
}
.ch-doc ul li::before{
  content:""; position:absolute; left:2px; top:.62em;
  width:6px; height:6px; border-radius:2px; background:var(--accent);
}
.ch-doc ol{ counter-reset:d; }
.ch-doc ol li{ counter-increment:d; }
.ch-doc ol li::before{
  content:counter(d) "."; position:absolute; left:0; top:0;
  color:var(--accent); font-weight:700; font-size:.85rem;
}
.ch-doc strong,.ch-doc b{ color:var(--text); font-weight:700; }
.ch-doc a{ color:var(--accent); text-decoration:none; }
.ch-doc a:hover{ text-decoration:underline; text-underline-offset:3px; }
.ch-doc hr{ border:0; border-top:1px solid var(--line); margin:28px 0; }
.ch-doc .ch-warn{ margin:20px 0; }

.ch-contact{
  display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap;
  background:var(--panel); border:1px solid var(--line); border-radius:8px;
  padding:16px 18px; margin-top:20px;
}
.ch-contact .mono{ font-family:ui-monospace,Consolas,monospace; font-size:.95rem; color:var(--text); }
.ch-contact-acts{ display:flex; gap:8px; flex-wrap:wrap; }

/* Шапка блока оплаты: что именно выбрано, чтобы не возвращаться проверять */
.ch-chosen{
  display:flex; align-items:center; justify-content:space-between; gap:14px 20px;
  flex-wrap:wrap; padding:16px 20px; margin-bottom:16px;
  background:var(--raise); border:1px solid var(--accent); border-radius:8px;
}
.ch-chosen-nm{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
               text-transform:uppercase; font-size:1.05rem; letter-spacing:-.02em; margin-top:4px; }
.ch-chosen-sum{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
                font-size:clamp(1.3rem,3vw,1.8rem); letter-spacing:-.02em;
                color:var(--accent); font-variant-numeric:tabular-nums; }

/* Значки платёжных систем */
.ch-paymarks{ display:flex; gap:8px; align-items:center; margin-top:10px; flex-wrap:wrap; }
.ch-paymark{ display:inline-flex; height:22px; color:var(--dim); }
.ch-paymark svg{ height:22px; width:auto; display:block; }
.ch-method.on .ch-paymark{ color:var(--text); }

/* ── Панель с заголовком и счётчиком ──────────────────────────────
   Устройство с боевой страницы /admins: полоса-заголовок, число справа,
   тело ниже. Число отвечает на вопрос «сколько их» без пересчёта глазами. */
.ch-panel{ border:1px solid var(--line); border-radius:8px; background:var(--panel); overflow:hidden; }
.ch-panel-h{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:14px 18px; background:var(--raise); border-bottom:1px solid var(--line);
}
.ch-panel-h b{ font-size:.92rem; font-weight:700; }
.ch-count{
  font-family:ui-monospace,Consolas,monospace; font-size:.8rem; color:var(--faint);
  background:var(--bg); border:1px solid var(--line); border-radius:999px; padding:2px 10px;
  font-variant-numeric:tabular-nums;
}
.ch-panel-b{ padding:16px 18px 18px; }

/* ── Окно профиля ─────────────────────────────────────────────────── */
.ch-modal{
  position:fixed; inset:0; z-index:200; display:flex; align-items:center; justify-content:center;
  padding:20px; background:rgba(0,0,0,.66); backdrop-filter:blur(4px);
}
/*
 * Обязательно, иначе окно висит поверх страницы с самой загрузки.
 * Браузерное правило для атрибута hidden — это [hidden]{display:none} с
 * обычной силой, и любой собственный display его перебивает. Ровно та же
 * ловушка, что была с кнопкой меню; здесь она заметнее, потому что окно
 * перекрывает всю страницу.
 */
.ch-modal[hidden]{ display:none; }
.ch-modal-box{
  position:relative; width:100%; max-width:420px; text-align:center;
  background:var(--panel); border:1px solid var(--line); border-radius:10px; padding:34px 26px 26px;
}
/*
 * Крестик и место под него.
 *
 * Размер и отступ вынесены в переменные не для красоты: из них считается
 * --x-safe — полоса сверху, куда содержимому окна заходить нельзя.
 * Пока это были числа в двух несвязанных правилах, плашка с выбранным
 * тарифом начиналась на 31px, а кнопка кончалась на 44px, и оранжевая
 * рамка тарифа проходила прямо сквозь кружок крестика.
 *
 * Теперь запас считается от самой кнопки. Поменяют её размер — отступ
 * пересчитается сам, и наложение не вернётся.
 */
.ch-modal-box{
  --x-size:34px;
  --x-inset:10px;
  --x-safe:calc(var(--x-inset) + var(--x-size) + 10px);
}
.ch-modal-x{
  position:absolute; top:var(--x-inset); right:calc(var(--x-inset) + 2px);
  width:var(--x-size); height:var(--x-size); border-radius:50%;
  background:transparent; border:1px solid var(--line); color:var(--dim);
  font-size:1.2rem; line-height:1; cursor:pointer;
}
.ch-modal-x:hover{ color:var(--text); border-color:var(--accent); }
.ch-modal-box .ch-ava{ margin:0 auto; }
/* Ник в окне профиля — как есть, регистр не трогаем */
.ch-modal-nm{
  margin:14px 0 0; font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:1.2rem; letter-spacing:-.02em; overflow-wrap:anywhere;
}
.ch-modal-role{ margin:8px 0 0; font-size:.74rem; text-transform:uppercase;
                letter-spacing:.09em; color:var(--accent); font-weight:700; }
.ch-modal-about{ margin:14px 0 0; font-size:.9rem; line-height:1.6; color:var(--dim); }
.ch-modal-box .ch-person-links{ justify-content:center; margin-top:18px; }

/* ── Люди (страница администрации) ────────────────────────────────── */
.ch-people{ display:grid; gap:9px; grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); }
.ch-people.big{ grid-template-columns:1fr; gap:9px; }
.ch-person{
  display:flex; gap:13px; align-items:center; width:100%; text-align:left;
  padding:12px 14px; cursor:pointer; font:inherit; color:var(--text);
  background:var(--bg); border:1px solid var(--line); border-radius:7px;
  transition:border-color var(--t-fast), background-color var(--t-fast);
}
.ch-person:hover{ background:var(--raise); }
.ch-person:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
/* Руководство — широкой строкой с акцентной чертой, как на боевой */
.ch-person.big{ padding:16px 18px; border-left:2px solid var(--accent); border-radius:0 7px 7px 0; }
.ch-person-b{ display:flex; flex-direction:column; gap:3px; min-width:0; flex:1 1 auto; }
.ch-person-go{ color:var(--faint); font-size:1.3rem; line-height:1; flex:0 0 auto; }
.ch-person:hover .ch-person-go{ color:var(--accent); }
.ch-person:hover{ border-color:#3a3f46; }
.ch-invert .ch-person{ background:var(--lt-panel); border-color:var(--lt-line); }
.ch-invert .ch-person:hover{ border-color:#bfbfb9; }
.ch-person-b{ min-width:0; }
.ch-person-nm{ font-weight:700; font-size:1rem; overflow-wrap:anywhere; }
/* Ник в широкой строке руководства — как есть */
.ch-person.big .ch-person-nm{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:1.1rem; letter-spacing:-.02em;
}
.ch-invert .ch-person-nm{ color:var(--lt-text); }
.ch-person-role{
  font-size:.72rem; text-transform:uppercase; letter-spacing:.09em;
  color:var(--accent); font-weight:700; margin-top:5px;
}
.ch-person-about{ margin:9px 0 0; font-size:.88rem; line-height:1.6; color:var(--dim); }
.ch-invert .ch-person-about{ color:var(--lt-dim); }
.ch-person-links{ display:flex; gap:8px; flex-wrap:wrap; margin-top:12px; }
.ch-person-links a,.ch-person-links span{
  font-size:.78rem; text-decoration:none; color:var(--dim);
  border:1px solid var(--line); border-radius:5px; padding:5px 10px;
}
.ch-person-links a:hover{ color:var(--accent); border-color:var(--accent); }
.ch-invert .ch-person-links a,.ch-invert .ch-person-links span{ color:var(--lt-dim); border-color:var(--lt-line); }
.ch-invert .ch-person-links a:hover{ color:#b35800; border-color:#b35800; }
.ch-ava.big{ width:52px; height:52px; font-size:1.2rem; }
.ch-invert .ch-ava{ background:var(--lt-bg); border-color:var(--lt-line); color:var(--lt-text); }

/* ── Кабинет изнутри ──────────────────────────────────────────────── */
.ch-who{
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding-bottom:18px; border-bottom:1px solid var(--line);
}
.ch-who-nm{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
            text-transform:uppercase; font-size:1.2rem; letter-spacing:-.02em; }
.ch-who-mail{ font-size:.85rem; color:var(--faint); margin-top:3px; }
.ch-who .ch-btn{ margin-left:auto; }

.ch-priv-top{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; }
.ch-priv-nm{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
             font-size:clamp(1.1rem,2.4vw,1.5rem); letter-spacing:-.02em; line-height:1.1; }
.ch-chip{
  font-size:.68rem; text-transform:uppercase; letter-spacing:.09em; font-weight:700;
  padding:5px 10px; border-radius:99px; border:1px solid var(--line); color:var(--faint);
  white-space:nowrap; flex:0 0 auto;
}
.ch-chip.on{ color:var(--ok); border-color:rgba(95,208,122,0.45); }
.ch-priv-acts{ display:flex; gap:8px; flex-wrap:wrap; margin-top:22px; }
.ch-dim{ color:var(--faint); font-weight:400; }

.ch-cmd{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-top:10px;
  background:var(--bg); border:1px solid var(--line); border-radius:6px; padding:12px 14px;
}
.ch-cmd code{ font-family:ui-monospace,Consolas,monospace; font-size:.88rem;
              color:var(--accent); overflow-wrap:anywhere; flex:1 1 220px; }
.ch-binds{
  display:grid; gap:6px; margin-top:10px; padding:12px 14px;
  background:var(--bg); border:1px solid var(--line); border-radius:6px;
  font-family:ui-monospace,Consolas,monospace; font-size:.85rem; line-height:1.5;
}

/* ── Состояния форм и экранов ─────────────────────────────────────
   Успех и отказ отличаются не только словами: у отказа красная черта,
   у успеха зелёная. Полагаться на один текст нельзя — человек в этот
   момент торопится и читает по диагонали.                            */
.ch-state{
  border-left:3px solid var(--line); background:var(--raise);
  border-radius:0 6px 6px 0; padding:14px 16px; margin:16px 0 0;
}
.ch-state.good{ border-left-color:var(--ok); }
.ch-state.bad{ border-left-color:#d0574e; }
.ch-state-h{ margin:0; font-weight:700; font-size:.98rem; line-height:1.4; }
.ch-state.good .ch-state-h{ color:var(--ok); }
.ch-state.bad .ch-state-h{ color:#e2776d; }
.ch-state .ch-note{ margin-top:7px; }

/* Поле с ошибкой */
.ch-field.bad input{ border-color:#d0574e; }
.ch-field.bad input:focus{ border-color:#e2776d; }
.ch-err{ margin:0; font-size:.8rem; color:#e2776d; line-height:1.5; }

/* Заблокированная кнопка: видно, что нажимать бесполезно */
.ch-btn[disabled]{ opacity:.5; pointer-events:none; }

/* ── Загрузка демо ────────────────────────────────────────────────── */
.ch-drop{
  border:2px dashed var(--line); border-radius:8px; padding:38px 20px;
  text-align:center; margin-top:16px; transition:border-color var(--t-fast), background-color var(--t-fast);
}
.ch-drop:hover{ border-color:var(--accent); background:rgba(255,126,0,0.04); }
.ch-drop.bad{ border-color:#d0574e; }
.ch-drop.busy{ border-style:solid; border-color:var(--accent); }
.ch-drop-t{ margin:0; font-size:1rem; font-weight:600; color:var(--text); }
.ch-drop-s{ margin:7px 0 0; font-size:.82rem; color:var(--faint); }

.ch-progress{ height:4px; background:var(--line); border-radius:2px; overflow:hidden; margin-top:16px; }
.ch-progress i{ display:block; height:100%; width:var(--p,0%); background:var(--accent); }

/* Переключатель состояний живёт в служебной панели стенда, см. layout_top */

/* ── Появление при прокрутке ──────────────────────────────────────── */
/*
 * Появление при прокрутке. Смещение уменьшено с 22px до 12px, а время
 * увеличено: короткий путь за долгое время читается как всплытие, длинный
 * за короткое — как рывок. Задержку между соседними блоками проставляет
 * скрипт (см. layout_bottom), поэтому секции не выскакивают все разом.
 */
.ch-rise{
  opacity:0; transform:translateY(12px);
  transition:opacity var(--t-slow), transform var(--t-slow);
}
.ch-rise.in{ opacity:1; transform:none; }
@media (prefers-reduced-motion:reduce){ .ch-rise{ opacity:1; transform:none; transition:none; } }

/* ── Узкие экраны ─────────────────────────────────────────────────── */
/* Ниже этой ширины навигация не влезает — уходит в панель за кнопкой */
@media (max-width:1100px){
  .ch-chips{ display:none; }
}
@media (max-width:820px){
  .ch-head-cab{ display:none; }   /* кабинет есть в панели */
}

@media (max-width:900px){
  .ch-cols{ grid-template-columns:1fr; }
  .ch-foot-grid{ grid-template-columns:1fr 1fr; }
}
@media (max-width:640px){
  /* высота шапки теперь приходит из --head-h у .chill: её же величиной
     компенсируется отступ сверху, и врозь они разъезжались бы */
  .ch-stat{ border-right:none; border-bottom:1px solid var(--line-soft); padding:22px 4px; }
  .ch-foot-grid{ grid-template-columns:1fr; }

  /*
   * На телефоне в шапке остаются логотип и кнопка меню. Часы и «Купить»
   * прячем: раньше две кнопки уже не помещались и «Купить» обрезалась —
   * ловилось только замером, потому что .chill скрывает горизонтальный
   * скролл и внешне страница выглядела целой. Обе ссылки есть в панели.
   */
  .ch-clock{ display:none; }
  .ch-head-buy{ display:none; }
  .ch-logo{ font-size:.92rem; }
  .ch-head-in{ gap:12px; }
  .ch-btn.sm{ padding:9px 13px; }
  .ch-burger{ width:40px; height:40px; }
}

/* Совсем узкие экраны — уводим подпись логотипа, оставляем метку */
@media (max-width:360px){
  .ch-logo{ font-size:.84rem; }
  .ch-btn.sm{ padding:8px 11px; font-size:.7rem; }
}


/* ═══════════════════════════════════════════════════════════════════
   ДОБАВЛЕНО ПО ПРАВКАМ 17.08.2026
   ═══════════════════════════════════════════════════════════════════ */

/* ── График внутри карточки сервера ───────────────────────────────
   Раньше график жил отдельной секцией внизу страницы, а в карточках
   под метаданными пустовало место. Вопрос «сколько народу и когда»
   относится к конкретному серверу, поэтому график переехал сюда. */
.ch-srv-chart{ margin-top:16px; padding-top:14px; border-top:1px solid var(--line-soft); }
.ch-srv-chart-h{
  display:flex; align-items:baseline; justify-content:space-between; gap:10px;
  margin-bottom:8px; font-size:.7rem; text-transform:uppercase;
  letter-spacing:.1em; color:var(--faint); font-weight:600;
}
/*
 * Высоту НЕ задаём числом.
 *
 * Здесь стояло height:120px при viewBox высотой 200. SVG вписывается по
 * МЕНЬШЕЙ стороне (preserveAspectRatio по умолчанию), поэтому масштаб брался
 * не 1.0 по ширине, а 0.6 по высоте — и подписи осей, заданные одиннадцатью
 * пикселями, выходили на экран ростом 6.6px. Цифры видно, прочитать нельзя.
 *
 * С height:auto высота считается из пропорции viewBox, масштаб становится
 * единичным, и заданный кегль совпадает с экранным.
 */
.ch-srv-chart .kmc-chart{ height:auto; min-width:520px; }

/*
 * min-width равен ширине viewBox — график НЕ сжимается ниже своего
 * натурального размера. Иначе в узкой карточке масштаб падал до 0.6, и
 * подписи в 11px выходили ростом 6px: цифры видно, прочитать нельзя.
 *
 * Там, где карточка уже графика, прокручивается сама рамка (у неё
 * overflow-x:auto). Прокрутить график вбок — небольшая плата за то,
 * чтобы он вообще читался; сжатый до нечитаемости он бесполезен.
 */
.ch-srv-chart .ch-chart-box{
  overflow-x:auto; overscroll-behavior-x:contain;
  scrollbar-width:thin; scrollbar-color:var(--line) transparent;
}
.ch-srv-meta{ gap:16px; }

/* ── Линейки привилегий: описание и сроки в одной карточке ────────
   Плоский список из восьми тарифов не отвечал на вопрос «чем VIP
   отличается от ADMIN+VIP» — сравнивать приходилось, прыгая глазами
   между разными блоками страницы. Теперь у каждой линейки свой блок. */
/*
 * Карточки линеек тянутся на одну высоту.
 *
 * Было align-items:start — карточки жили каждая своей высотой, и у VIP
 * (пять пунктов) выходило 521px против 490px у ADMIN+VIP (четыре). Разница
 * бросалась в глаза, потому что блоки стоят рядом и сравниваются напрямую.
 * stretch выравнивает их по самой высокой.
 */
.ch-lines{ display:grid; gap:16px; grid-template-columns:repeat(auto-fit,minmax(min(340px,100%),1fr)); align-items:stretch; }
/*
 * Колонка внутри карточки нужна, чтобы блок сроков прижался к низу
 * (margin-top:auto у .ch-line-tiers). Иначе при разном числе пунктов
 * «ВЫБЕРИТЕ СРОК» у соседних карточек оказывался на разной высоте, и
 * сравнивать цены приходилось, бегая глазами вверх-вниз.
 */
.ch-line{
  display:flex; flex-direction:column;
  background:var(--panel); border:1px solid var(--line); border-radius:10px;
  padding:26px 24px 24px;
}
/*
 * У ADMIN+VIP была оранжевая рамка 45%, а внутри неё у «НАВСЕГДА» — оранжевая
 * 55%. Два почти одинаковых контура, один в другом: глазу не за что
 * зацепиться, и непонятно, что здесь главное. Рамку карточки убрали, отличие
 * задаёт тонкая акцентная полоса сверху — она не спорит с выделением тарифа.
 */
.ch-line{ position:relative; overflow:hidden; }
.ch-line-head{ display:flex; align-items:flex-start; justify-content:space-between; gap:14px; flex:0 0 auto; }
.ch-line h3{
  margin:0; font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  text-transform:uppercase; font-size:clamp(1.15rem,2.4vw,1.5rem); letter-spacing:-.02em;
}
.ch-line-desc{ margin:8px 0 0; font-size:.88rem; line-height:1.5; color:var(--dim); max-width:34ch; }
.ch-line-from{ font-size:.74rem; text-transform:uppercase; letter-spacing:.08em;
               color:var(--faint); font-weight:600; white-space:nowrap; flex:0 0 auto; }
.ch-line-from b{ color:var(--accent); font-size:.95rem; }

/*
 * Карточки выравниваются по нижнему краю.
 *
 * В VIP пять возможностей, в ADMIN + VIP четыре — списки разной высоты, и
 * блок «Выберите срок» вставал у карточек на разных уровнях. Сетка и так
 * растягивает карточки до одинаковой высоты; остаётся заставить список
 * занять весь остаток, тогда сроки прижмутся к низу и совпадут.
 */
.ch-line{ display:flex; flex-direction:column; }
.ch-line-feats{ display:grid; gap:9px; margin:20px 0 0; align-content:start; flex:1 1 auto; }
.ch-line-feats li{ display:flex; gap:10px; align-items:flex-start; font-size:.92rem; line-height:1.45; }
/*
 * Квадратика-маркера у пунктов БОЛЬШЕ НЕТ.
 *
 * Он рисовался, когда список был просто текстом. Теперь перед каждым
 * пунктом стоит значок из km_icon() — галочка или медаль по смыслу, — и
 * маркер оказался вторым значком подряд: оранжевый квадрат, потом зелёная
 * галочка, потом текст. Две метки об одном и том же.
 */
.ch-line-feats .ic{ flex:0 0 auto; margin-top:2px; color:var(--ok); }
.ch-line-feats li.key .ic{ color:var(--accent); }

/*
 * Сетка сроков — ФИКСИРОВАННОЕ число колонок, а не auto-fit.
 *
 * С auto-fit число колонок вычислялось от доступной ширины, и четыре срока
 * вставали как 3+1: три в ряд, четвёртый одиноко под ними, а рядом дыра.
 * Хуже того, у соседних карточек перелом мог случиться на разной ширине,
 * и они переставали совпадать.
 *
 * Сроков всегда четыре, поэтому 2×2 на узком и 4 в ряд на широком: обе
 * раскладки симметричны, дыр не оставляют и одинаковы у всех карточек.
 */
/*
 * Прижимается вниз ПОДПИСЬ, а не сетка.
 *
 * Пока margin-top:auto стоял на самой сетке, вниз уезжали только кнопки, а
 * заголовок «Выберите срок» оставался там, где кончился список возможностей.
 * У ADMIN+VIP пунктов на один меньше, и между подписью и ценами зияла дыра,
 * которой не было у VIP. Свободное место должно попадать НАД группой
 * целиком — тогда подпись и кнопки едут вниз вместе и стоят одинаково
 * в обеих карточках.
 */
.ch-line > .ch-line-h{ margin-top:auto; }
.ch-line-tiers{
  display:grid; gap:8px;
  grid-template-columns:repeat(2,1fr);
}
@media (min-width:1180px){
  .ch-line-tiers{ grid-template-columns:repeat(4,1fr); }
}
/* Одна колонка на совсем узком: вчетвером цена уже не читается */
@media (max-width:420px){
  .ch-line-tiers{ grid-template-columns:1fr; }
}
/*
 * Кнопка срока лежит ВНУТРИ карточки, поэтому своей рамки не имеет: две
 * вложенные рамки читались как коробка в коробке. Отделяет её подложка
 * темнее фона карточки, а рамка появляется только при наведении и у
 * выделенного варианта — там, где действительно нужно внимание.
 */
.ch-buy{
  display:grid; gap:4px; text-align:left; cursor:pointer; font:inherit; color:var(--text);
  background:var(--bg); border:1px solid transparent; border-radius:7px; padding:13px 15px;
  transition:border-color var(--t-fast), background-color var(--t-fast), transform var(--t-fast);
}
.ch-buy:hover{ border-color:var(--accent); background:var(--raise); transform:translateY(-2px); }
.ch-buy:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
.ch-buy.best{ border-color:rgba(255,126,0,0.55); }
.ch-buy-term{ font-size:.72rem; text-transform:uppercase; letter-spacing:.09em;
              color:var(--faint); font-weight:700; }
.ch-buy-price{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
               font-size:1.15rem; letter-spacing:-.02em; font-variant-numeric:tabular-nums; }
.ch-buy-per{ font-size:.74rem; color:var(--faint); }

/* ── Широкое окно (оплата) ────────────────────────────────────────── */
.ch-modal-box.wide{
  max-width:860px; text-align:left;
  /* Сверху — полоса под крестик, иначе плашка тарифа лезет ему под кружок */
  padding:var(--x-safe) 28px 26px;
}
.ch-pay-grid{ display:grid; gap:22px 28px; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); }
.ch-modal-box.wide .ch-chosen{ margin:0 0 22px; }

/* ── Фото администраторов ─────────────────────────────────────────── */
img.ch-ava{ object-fit:cover; padding:0; }
.ch-ava.photo{ background-size:cover; background-position:center; color:transparent; }
.ch-person-about{
  font-size:.84rem; line-height:1.5; color:var(--dim); margin-top:5px;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
#chModalAva{ width:84px; height:84px; font-size:1.8rem; }
#chModalAbout p{ margin:0 0 10px; }
#chModalAbout p:last-child{ margin-bottom:0; }

/* ── Часы в подвале ───────────────────────────────────────────────── */
.ch-foot-bottom .ch-clock{ border:none; padding:0; gap:8px; }
.ch-foot-bottom .ch-clock .t{ font-size:.78rem; color:var(--dim); font-weight:600; }
.ch-foot-bottom .ch-clock .z{ font-size:.72rem; letter-spacing:.04em;
                              text-transform:none; color:var(--faint); font-weight:400; }

@media (max-width:640px){
  /* На узком экране график и так сжимается по ширине — высоту не трогаем */
  .ch-modal-box.wide{ padding:var(--x-safe) 18px 20px; }
}

/* ═══ Плавные переходы между страницами ════════════════════════════
   Переход со страницы на страницу был резким: браузер гасил старую и
   мгновенно рисовал новую, из-за чего каждый клик по меню давал вспышку.
   @view-transition отдаёт эту работу самому браузеру — он снимает кадр
   старой страницы, кадр новой и растворяет один в другом. JavaScript не
   нужен, вес нулевой.

   Где не поддерживается (Firefox, старый Safari) — просто ничего не
   происходит, переход остаётся прежним. Ломаться нечему.

   Длительность намеренно короткая. Переход между страницами — не
   спецэффект, а сглаживание стыка: дольше 0.3 с он начинает
   восприниматься как задержка, будто сайт тормозит.
   ═══════════════════════════════════════════════════════════════════ */
/* Кривая нужна и на корне документа: псевдоэлементы перехода живут
   выше .chill, и переменная, объявленная внутри него, туда не дотянется. */
:root{ --ease:cubic-bezier(.22,1,.36,1); }

@view-transition{ navigation:auto; }

::view-transition-old(root){
  animation:km-fade-out .18s var(--ease) both;
}
::view-transition-new(root){
  animation:km-fade-in .28s var(--ease) both;
}
@keyframes km-fade-out{ to{ opacity:0; } }
@keyframes km-fade-in { from{ opacity:0; transform:translateY(6px); } }

/* Плавная прокрутка к якорям — «Подключиться» ведёт к серверам,
   а не швыряет к ним */
html{ scroll-behavior:smooth; }

@media (prefers-reduced-motion:reduce){
  @view-transition{ navigation:none; }
  html{ scroll-behavior:auto; }
  ::view-transition-old(root),
  ::view-transition-new(root){ animation:none; }
}

/* Фотография в кружке состава: размеры обязательны, иначе браузер
   рисует её в натуральную величину. object-position приходит из
   панели — им задаётся, какая часть кадра останется видимой. */
.ch-ava img{ width:100%; height:100%; object-fit:cover; display:block; border-radius:inherit; }
.ch-modal-box .ch-ava{ overflow:hidden; }

/* Пометка «данные подставлены из кабинета» — чтобы человек понимал,
   откуда взялись значения в полях, и не искал, где их поменять */
.ch-fromcab{
  display:flex; align-items:center; gap:7px; margin:10px 0 0;
  font-size:.8rem; color:var(--ok);
}
.ch-fromcab .ic{ flex:0 0 auto; }

/* Тариф, с которым пришли из кабинета на продление */
.ch-buy.from-cab{
  border-color:var(--accent);
  box-shadow:0 0 0 1px rgba(255,126,0,.35);
}

/* Бинд отдельной строкой со своей кнопкой: команду копируют целиком,
   а не выделяют мышью — промахнуться на символ в консоли CS легко */
.ch-bind{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:8px 10px 8px 12px; border-radius:6px;
  background:var(--bg); border:1px solid var(--line-soft);
}
.ch-bind code{
  font-family:ui-monospace,Consolas,monospace; font-size:.84rem; color:var(--text);
  overflow-wrap:anywhere;
}
.ch-bind-note{ font-size:.78rem; color:var(--faint); padding:0 2px; }


/* ── Тело карточки: счётчик и список рядом ────────────────────────
   Цифра «18 из 32» и есть заголовок к списку играющих — держать их
   друг под другом значит заставлять переводить взгляд туда-обратно.
   Слева цифра со шкалой и метаданными, справа — кто именно играет. */
.ch-srv-body{
  display:grid; gap:18px 22px; grid-template-columns:minmax(0,150px) minmax(0,1fr);
  align-items:start; margin-top:4px;
}
.ch-srv-left{ display:grid; gap:12px; align-content:start; }
.ch-srv-right{ min-width:0; }

.ch-who-h{
  margin:0 0 8px; font-size:.7rem; text-transform:uppercase; letter-spacing:.1em;
  font-weight:700; color:var(--faint);
}

/* Список БЕЗ прокрутки: он и так отвечает на вопрос целиком, а
   прокрутка внутри карточки на прокручиваемой странице только мешает.
   Строки поэтому плотные — двадцать человек должны поместиться. */
.ch-who-list{
  display:grid; gap:1px; margin:0; padding:0; list-style:none;
}
.ch-who-list li{
  display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:10px;
  align-items:center; padding:4px 8px; border-radius:4px;
  font-size:.82rem; line-height:1.3;
}
.ch-who-list li:nth-child(odd){ background:var(--raise); }
/* Ник бывает любой длины и с чем угодно внутри — режем по месту */
.ch-who-list .nm{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ch-who-list .mm{
  color:var(--faint); font-size:.74rem; font-variant-numeric:tabular-nums; white-space:nowrap;
}
.ch-who-list .sc{
  color:var(--accent); font-weight:700; font-variant-numeric:tabular-nums;
  min-width:2.1em; text-align:right;
}
/* Первые трое по счёту заметнее — видно, кто сегодня в ударе */
.ch-who-list li:nth-child(-n+3) .nm{ color:var(--text); font-weight:600; }

.ch-who-empty{ margin:0; font-size:.84rem; color:var(--faint); }

/* Узкая карточка — колонки складываются, счётчик уходит наверх */
@media (max-width:720px){
  .ch-srv-body{ grid-template-columns:1fr; gap:14px; }
  .ch-srv-left{ grid-template-columns:auto 1fr; align-items:center; gap:10px 14px; }
  .ch-srv-left .ch-srv-num{ grid-row:1; }
  .ch-srv-left .ch-srv-bar{ grid-row:1; grid-column:2; }
  .ch-srv-left .ch-srv-meta{ grid-column:1 / -1; }
}
/* Совсем узко — время в игре убираем, важнее ник и счёт */
@media (max-width:420px){
  .ch-who-list .mm{ display:none; }
  .ch-who-list li{ grid-template-columns:minmax(0,1fr) auto; }
}

/* ── Спойлер «Кто играет» ─────────────────────────────────────────
   Список свёрнут: восемнадцать ников развёрнутыми делают карточку
   вдвое выше и оттесняют вниз адрес с кнопкой «Подключиться» — то,
   ради чего на страницу и заходят. Свёрнутая строка отвечает цифрой,
   а «кто именно» — одним нажатием. Работает на <details>, без JS.   */
.ch-who > summary{
  display:flex; align-items:center; gap:8px; cursor:pointer; list-style:none;
  min-height:34px; user-select:none;
}
.ch-who > summary::-webkit-details-marker{ display:none; }
.ch-who > summary:hover .ch-who-h,
.ch-who > summary:hover .ch-who-x{ color:var(--text); }
.ch-who > summary:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; border-radius:4px; }
.ch-who .ch-who-h{ margin:0; }
.ch-who-n{
  font-size:.7rem; font-weight:700; color:var(--on-accent); background:var(--accent);
  border-radius:999px; padding:1px 8px; font-variant-numeric:tabular-nums;
}
.ch-who-x{
  margin-left:auto; color:var(--faint); font-size:1.1rem; line-height:1;
  transition:transform var(--t-fast);
}
.ch-who[open] .ch-who-x{ transform:rotate(90deg); }
.ch-who .ch-who-list{ margin-top:8px; }

/* ── Вкладки графиков ─────────────────────────────────────────────
   Два графика стопкой занимали два экрана и отжимали вниз адрес с
   кнопкой «Подключиться» — то, ради чего на страницу и заходят.
   Смотрят их по очереди, поэтому переключатель.

   Сделано на радиокнопках, а не на скрипте: работает всегда, а при
   выключенном JS ничего не ломается — оба графика просто видны подряд
   (см. правило для .ch-chart-pane ниже).                            */
.ch-chart-tabs{ display:flex; gap:4px; }
.ch-chart-tabs input{ position:absolute; opacity:0; width:1px; height:1px; }
.ch-chart-tabs label{
  cursor:pointer; padding:4px 11px; border-radius:999px;
  font-size:.68rem; text-transform:uppercase; letter-spacing:.08em; font-weight:700;
  color:var(--faint); border:1px solid var(--line);
  transition:color var(--t-fast), border-color var(--t-fast), background-color var(--t-fast);
}
.ch-chart-tabs label:hover{ color:var(--text); border-color:#3a3f46; }
.ch-chart-tabs input:checked + label{
  color:var(--on-accent); background:var(--accent); border-color:var(--accent);
}
.ch-chart-tabs input:focus-visible + label{ outline:2px solid var(--accent); outline-offset:2px; }

/*
 * Переключение панелей.
 *
 * Сначала я написал это через соседний комбинатор (~) — и обе панели
 * пропали: вкладки лежат внутри шапки блока, а панели рядом с шапкой,
 * то есть соседями они не являются. Селектор не совпадал ни с чем.
 *
 * Опорная точка — сам блок .ch-tabbed, он общий предок для тех и других.
 *
 * Правила построены так, что по умолчанию видна ПЕРВАЯ панель, а вторая
 * прячется. Если браузер не понимает :has() (Chrome старше 105), обе
 * строки с ним просто игнорируются, и человек видит суточный график —
 * а не пустое место, как было бы при обратной логике.
 */
/*
 * ТРИ ВКЛАДКИ, А НЕ ДВЕ. Раньше здесь было ровно две панели, «a» и «b».
 * На боевых данных их три: сутки, неделя и карты — недельной на стенде
 * просто неоткуда было взяться, там нет базы.
 *
 * Правила намеренно завязаны на ПОРЯДОК, а не на имена: n-я радиокнопка
 * показывает n-ю панель. Стоило подписать панели по смыслу (day/week/maps),
 * и селекторы перестали совпадать вообще ни с чем — а поскольку по
 * умолчанию все панели скрыты, графики пропали целиком. Причём молча:
 * разметка на месте, 190 столбиков в ней есть, видно только пустоту.
 */
.ch-tabbed .ch-chart-pane[data-pane="b"],
.ch-tabbed .ch-chart-pane[data-pane="c"]{ display:none; }
.ch-tabbed:has(.ch-chart-tabs input:nth-of-type(2):checked) .ch-chart-pane[data-pane="a"],
.ch-tabbed:has(.ch-chart-tabs input:nth-of-type(3):checked) .ch-chart-pane[data-pane="a"]{ display:none; }
.ch-tabbed:has(.ch-chart-tabs input:nth-of-type(2):checked) .ch-chart-pane[data-pane="b"]{ display:block; }
.ch-tabbed:has(.ch-chart-tabs input:nth-of-type(3):checked) .ch-chart-pane[data-pane="c"]{ display:block; }

@supports selector(:has(*)){
  .ch-tabbed{ display:grid; grid-template-columns:minmax(0,1fr); }
  .ch-tabbed > .ch-srv-chart-h{ grid-area:1 / 1; }

  /* Все панели — в одну ячейку, видимость решает прозрачность. Высота
     ячейки по большей из них, поэтому при переключении карточка стоит */
  .ch-tabbed .ch-chart-pane,
  .ch-tabbed .ch-chart-pane[data-pane="b"],
  .ch-tabbed .ch-chart-pane[data-pane="c"],
  .ch-tabbed:has(.ch-chart-tabs input:nth-of-type(2):checked) .ch-chart-pane[data-pane="a"],
  .ch-tabbed:has(.ch-chart-tabs input:nth-of-type(3):checked) .ch-chart-pane[data-pane="a"]{
    display:block; grid-area:2 / 1;
    opacity:0; visibility:hidden; pointer-events:none; transform:translateY(5px);
    /* visibility ступенькой в конце ухода: иначе скрытая панель остаётся
       в порядке обхода Tab и в поиске по странице */
    transition:opacity var(--t-med), transform var(--t-med),
               visibility 0s linear var(--d-med);
  }
  .ch-tabbed:has(.ch-chart-tabs input:nth-of-type(1):checked) .ch-chart-pane[data-pane="a"],
  .ch-tabbed:has(.ch-chart-tabs input:nth-of-type(2):checked) .ch-chart-pane[data-pane="b"],
  .ch-tabbed:has(.ch-chart-tabs input:nth-of-type(3):checked) .ch-chart-pane[data-pane="c"]{
    opacity:1; visibility:visible; pointer-events:auto; transform:none;
    transition:opacity var(--t-med), transform var(--t-med), visibility 0s;
  }
}

/* ── Метаданные в строку ──────────────────────────────────────────
   Столбиком четыре коротких значения занимали четыре экранных строки. */
.ch-srv-meta{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(84px,1fr));
  gap:10px 14px; margin:14px 0 0; padding-top:12px;
  border-top:1px solid var(--line-soft);
}
.ch-srv-meta dt{
  font-size:.62rem; text-transform:uppercase; letter-spacing:.09em;
  color:var(--faint); font-weight:700; margin-bottom:2px;
}
.ch-srv-meta dd{ margin:0; font-size:.9rem; font-weight:600; overflow-wrap:anywhere; }

/* ═══════════════════════════════════════════════════════════════════
   ПЛАВНОСТЬ СМЕНЫ СОСТОЯНИЙ

   Переходы между страницами сгладил @view-transition выше, наведение на
   кнопки — переходы по месту. А вот всё, что появляется и исчезает —
   окно профиля, спойлер «Кто играет» — возникало и пропадало в один кадр.
   Это и читалось как «не хватает плавности»: страница едет мягко, а
   содержимое внутри неё дёргается.

   Сложность в том, что показ и скрытие делаются через display, а его
   нельзя плавно менять — свойство ступенчатое. Раньше на это отвечали
   скриптом: снять класс, подождать таймером, выставить display:none.
   Теперь то же самое умеет сам браузер (transition-behavior:allow-discrete
   и @starting-style), и скрипт не нужен.

   Всё под @supports. Где нет поддержки — остаётся мгновенное
   переключение, ровно как сейчас. Ломаться нечему.
   ═══════════════════════════════════════════════════════════════════ */

/* ── Окно профиля ───────────────────────────────────────────────────
   Затемнение проявляется, а само окно поднимается и чуть подрастает.
   Уходит быстрее, чем приходит: закрытие — это ответ на действие
   человека, и тянуть его значит заставлять ждать.                    */
@supports (transition-behavior:allow-discrete){
  .ch-modal{
    opacity:1;
    /*
     * display в списке — вместе с allow-discrete. На открытии он
     * переключается сразу, на закрытии откладывается до конца затухания:
     * именно это раньше приходилось делать таймером в скрипте.
     */
    transition:opacity var(--t-med), display var(--t-med) allow-discrete;
  }
  .ch-modal[hidden]{ opacity:0; }
  /* Стартовый кадр: без него открывать нечему — до снятия hidden у
     элемента нет предыдущего значения, и переход не запускается */
  @starting-style{ .ch-modal:not([hidden]){ opacity:0; } }

  .ch-modal-box{
    transition:opacity var(--t-med), transform var(--t-med);
  }
  .ch-modal[hidden] .ch-modal-box{ opacity:0; transform:translateY(12px) scale(.985); }
  @starting-style{
    .ch-modal:not([hidden]) .ch-modal-box{ opacity:0; transform:translateY(12px) scale(.985); }
  }
}

/* ── Спойлер «Кто играет» ───────────────────────────────────────────
   Список раскрывался рывком во всю высоту.

   Сначала я написал это на ::details-content — это и есть скрытая часть
   <details>, и она создана ровно для таких случаев. Браузер сообщает,
   что и селектор, и interpolate-size поддерживает, правила применяются,
   высота в закрытом состоянии честные 0px — а перехода не возникает
   ни одного, ни по высоте, ни по прозрачности. Разбираться, почему так,
   я не стал: проверить результат важнее, чем докопаться до причины.

   Работает по-другому: высоту получает обычная обёртка внутри, через
   сетку из одной строки 0fr → 1fr. Приём старый и предсказуемый, а
   главное — обёртка настоящий элемент, и её поведение видно замером.

   Единственное, что нужно от ::details-content, — не прятать содержимое
   самому: закрытый <details> помечает его content-visibility:hidden,
   и тогда анимировать внутри уже нечего. Высоту в закрытом состоянии
   держит обёртка.                                                    */
@supports (selector(::details-content)){
  .ch-who::details-content{ content-visibility:visible; }
}
.ch-who-wrap{
  display:grid; grid-template-rows:0fr; opacity:0; visibility:hidden; margin-top:0;
  /*
   * visibility ступенькой в конце сворачивания. Содержимое остаётся
   * в разметке (иначе нечего было бы анимировать), и без этого поиск
   * по странице находил бы ники в закрытом спойлере и прокручивал к
   * пустому месту.
   */
  transition:grid-template-rows var(--t-med), margin-top var(--t-med),
             opacity var(--d-fast) var(--ease), visibility 0s linear var(--d-med);
}
.ch-who[open] .ch-who-wrap{
  grid-template-rows:1fr; opacity:1; visibility:visible; margin-top:8px;
  transition:grid-template-rows var(--t-med), margin-top var(--t-med),
             opacity var(--d-fast) var(--ease), visibility 0s;
}
/* Без min-height:0 содержимое сетки отказывается сжиматься ниже своей
   естественной высоты, и строка 0fr не даёт нуля */
.ch-who-wrap > *{ overflow:hidden; min-height:0; }
/*
 * Отступ до списка снят с самого списка и отдан обёртке (см. margin-top
 * выше), чтобы он раскрывался вместе с высотой.
 *
 * Внутри анимируемой строки ему места нет ни в каком виде: внешний
 * margin сетка не сжимает, а padding у коробки нулевой высоты остаётся
 * её минимумом. И так, и так свёрнутый спойлер занимал 8px и оставлял
 * под собой щель.
 */
.ch-who .ch-who-wrap .ch-who-list{ margin-top:0; }

/* ── Мелочь, которую видно ──────────────────────────────────────────
   Оставшиеся места, где состояние менялось скачком. Отдельными
   правилами, а не общим `* { transition: all }`: сплошной переход на
   всём подряд заставляет браузер следить за каждым свойством и
   попутно смазывает то, что должно быть мгновенным.               */
.ch-srv-bar i{ transition:width var(--t-slow); }        /* полоса заполнения */
.kmc-chart .col rect{ transition:opacity var(--t-fast); }
.ch-who-list li{ transition:background-color var(--t-fast); }
.ch-count,
.ch-who-n{ transition:background-color var(--t-fast), color var(--t-fast); }
.ch-modal-x{ transition:color var(--t-fast), border-color var(--t-fast), transform var(--t-fast); }
.ch-modal-x:hover{ transform:rotate(90deg); }
.ch-person-go{ transition:color var(--t-fast), transform var(--t-fast); }
.ch-person:hover .ch-person-go{ transform:translateX(3px); }
.ch-ava{ transition:transform var(--t-med); }
.ch-person:hover .ch-ava{ transform:scale(1.06); }

/*
 * Уважение к системной настройке. Человек, который просил убрать
 * анимацию, просил её убрать везде, а не только там, где мы вспомнили.
 */
@media (prefers-reduced-motion:reduce){
  .ch-modal,
  .ch-modal-box,
  .ch-who-wrap,
  .ch-tabbed .ch-chart-pane,
  .ch-srv-bar i,
  .ch-ava,
  .ch-person-go,
  .ch-modal-x{ transition:none !important; }
  .ch-modal-x:hover,
  .ch-person:hover .ch-person-go,
  .ch-person:hover .ch-ava{ transform:none; }
}

/* ═══════════════════════════════════════════════════════════════════
   ОКНО ПРОФИЛЯ: ОФОРМЛЕНИЕ РАССКАЗА

   Было: аватар, ник, описание и контакты — всё подряд одним
   центрированным столбиком, одинаковым кеглем и цветом. Ни границ между
   частями, ни разницы между «кто это» и «что он про себя пишет».
   Описание из-за этого выглядело не текстом, а пустым местом с буквами.

   Стало три отчётливые части: шапка (кто) — рассказ — как связаться.

   Отдельно про выключку. Многострочная проза по центру читается тяжело:
   у каждой строки свой левый край, и глаз при возврате каждый раз ищет
   начало заново. По центру осталось только то, что коротко и служит
   заголовком, — аватар, ник, должность.
   ═══════════════════════════════════════════════════════════════════ */
.ch-prof{ text-align:left; padding:0; overflow:hidden; }
/*
 * Крестик поднимается над шапкой.
 *
 * Он лежит в разметке раньше .ch-prof-head, а та позиционирована ради
 * подложки со свечением — и рисовалась поверх кнопки. Видно её было
 * прекрасно, а нажать нельзя: клик забирала шапка. Закрыть окно можно
 * было только клавишей Esc или щелчком мимо, и на телефоне, где Esc
 * нет, оно превращалось в ловушку.
 */
.ch-prof .ch-modal-x{ z-index:2; }

/* ── Шапка ────────────────────────────────────────────────────────── */
.ch-prof-head{
  position:relative; text-align:center; padding:32px 26px 22px;
  border-bottom:1px solid var(--line);
  /* Мягкое свечение под аватаром — вместо ровной плашки */
  background:
    radial-gradient(120% 90% at 50% -10%, rgba(255,126,0,.13), transparent 62%),
    var(--raise);
}
.ch-prof-head .ch-ava{ margin:0 auto; }
.ch-prof .ch-modal-nm{ margin:14px 0 0; }
.ch-prof .ch-modal-role{ margin:7px 0 0; }

/* ── Рассказ ──────────────────────────────────────────────────────── */
.ch-prof-about{ padding:22px 26px 4px; }
.ch-prof-about[hidden]{ display:none; }
.ch-prof-about p{
  margin:0; max-width:46ch;
  font-size:.88rem; line-height:1.68; color:var(--dim);
  /* Расстановка переносов: колонка узкая, и без них по краю остаются
     дыры в полстроки после длинных слов вроде «администрация» */
  hyphens:auto; text-wrap:pretty;
}
.ch-prof-about p + p{ margin-top:11px; }
/*
 * Первый абзац — вводка. Крупнее и светлее остальных: в профилях он
 * рассказывает о человеке, а следом идёт приписка «пишите в ЛС».
 * Одинаковым набором эти два куска слипались в один.
 */
.ch-prof-about p.lead{
  font-size:1rem; line-height:1.62; color:var(--text);
  /* Акцентная черта слева — тот же приём, что у широких строк
     руководства на самой странице, чтобы окно с ней рифмовалось */
  border-left:2px solid var(--accent);
  padding-left:14px; margin-left:-2px;
}
.ch-prof-about p.lead + p{ margin-top:13px; padding-left:14px; }

/* ── Контакты ─────────────────────────────────────────────────────── */
.ch-prof-contacts{ padding:18px 26px 24px; }
.ch-prof-contacts[hidden]{ display:none; }
.ch-prof-lbl{
  margin:0 0 9px; font-size:.62rem; text-transform:uppercase; letter-spacing:.11em;
  color:var(--faint); font-weight:700;
}
/* Выключку по центру, доставшуюся от общего правила окна, здесь снимаем */
.ch-prof .ch-person-links{ justify-content:flex-start; margin-top:0; }
.ch-person-links a,
.ch-person-links span{ display:inline-flex; align-items:center; gap:7px; }
.ch-person-links .ic{ flex:0 0 auto; opacity:.62; transition:opacity var(--t-fast); }
.ch-person-links a:hover .ic{ opacity:1; }

/* Узкий экран: поля ужимаем, иначе на 360px строке остаётся 20 знаков */
@media (max-width:420px){
  .ch-prof-head{ padding:26px 18px 18px; }
  .ch-prof-about{ padding:18px 18px 4px; }
  .ch-prof-contacts{ padding:16px 18px 20px; }
}

/* ═══════════════════════════════════════════════════════════════════
   МАТОВОЕ СТЕКЛО НА ГЛАВНОЙ

   Стекло — это не полупрозрачность, а размытие того, что позади. Значит,
   позади должно быть что размывать. На ровном тёмном фоне «стеклянная»
   карточка выглядит просто плашкой посветлее, и весь приём пропадает.
   Поэтому сначала световая подложка (.ch-amb), и только потом стекло.

   Прозрачность держим умеренной. Через слишком чистое стекло проступает
   рисунок фона, и по нему начинает ползти текст — а в карточках стоят
   цифры онлайна и адрес сервера, то есть ровно то, ради чего сюда
   заходят. Читаемость здесь важнее эффекта.
   ═══════════════════════════════════════════════════════════════════ */

/* ── Световая подложка ────────────────────────────────────────────── */
.ch-amb{
  position:fixed; inset:0; z-index:-1; pointer-events:none; overflow:hidden;
  /* contain отсекает пересчёт разметки: слой ни на что не влияет,
     и браузеру незачем проверять его при каждом изменении страницы */
  contain:strict;
}
.ch-amb i{
  position:absolute; display:block; border-radius:50%;
  /* Пятно рисуется градиентом с мягким краем, а не размытием картинки:
     blur по большой площади считается каждый кадр и заметно греет
     слабые машины, а градиент рисуется один раз */
  filter:blur(46px); opacity:.72;
}
.ch-amb .a{
  width:min(62vw,760px); aspect-ratio:1; left:-14vw; top:6vh;
  background:radial-gradient(circle at 50% 50%, rgba(255,126,0,.44), transparent 66%);
}
.ch-amb .b{
  width:min(54vw,660px); aspect-ratio:1; right:-12vw; bottom:-6vh;
  background:radial-gradient(circle at 50% 50%, rgba(86,122,190,.38), transparent 66%);
}
/*
 * Слой лежит на отрицательном уровне, поэтому .chill должен быть
 * самостоятельным слоем укладки — иначе пятна уедут под его фон и
 * их не будет видно вовсе.
 */
.chill{ isolation:isolate; }

/* Медленный дрейф. Долгий и с малой амплитудой: пятна должны жить,
   а не двигаться заметно — иначе взгляд цепляется за фон вместо
   содержимого. */
@keyframes km-amb-a{ 50%{ transform:translate3d(4vw,-3vh,0) scale(1.08); } }
@keyframes km-amb-b{ 50%{ transform:translate3d(-3vw,3vh,0) scale(1.06); } }
.ch-amb .a{ animation:km-amb-a 34s var(--ease) infinite; }
.ch-amb .b{ animation:km-amb-b 41s var(--ease) infinite; }

/* ── Стекло карточек серверов ─────────────────────────────────────── */
@supports (backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px)){
  .ch-srv{
    background:rgba(22,25,29,.55);
    /*
     * Тусклый цвет подписей внутри стекла поднят.
     *
     * --faint задуман для сплошной тёмной плашки и давал на ней 4.55 —
     * впритык к норме. Стекло пропускает свечение подложки, фон под
     * текстом светлеет, и в самом тёплом месте карточки те же подписи
     * («КАРТА», «В СРЕДНЕМ») падали до 3.65 — ниже нормы для мелкого
     * текста. Здесь они снова 5.1 в худшей точке.
     */
    --faint:#949ba3;
    -webkit-backdrop-filter:blur(24px) saturate(1.6);
    backdrop-filter:blur(24px) saturate(1.6);
    /* Светлая рамка вместо серой: у стекла край ловит свет */
    border-color:rgba(255,255,255,.09);
  }
  /*
   * Блик по верхнему краю. Без него полупрозрачная плашка выглядит
   * плоской: у настоящего стекла есть толщина, и видно её именно по
   * кромке, куда попадает свет.
   */
  .ch-srv::after{
    content:''; position:absolute; inset:0; border-radius:inherit;
    pointer-events:none; z-index:0;
    background:linear-gradient(157deg, rgba(255,255,255,.075), transparent 44%);
  }
  .ch-srv:hover{ border-color:rgba(255,255,255,.16); }

  /* Собственная подсветка карточки приглушается: теперь цвет идёт и
     снизу, от подложки, и вдвоём они пересвечивали угол */
  .ch-srv-bg{ opacity:.32; }

  /* Строка «Сейчас в игре» поверх видео — самое подходящее место для
     стекла на всей странице: под ней постоянно меняется картинка */
  .ch-hero .ch-live{
    background:rgba(13,14,16,.42);
    -webkit-backdrop-filter:blur(14px) saturate(1.3);
    backdrop-filter:blur(14px) saturate(1.3);
    border:1px solid rgba(255,255,255,.10);
    border-radius:999px; padding:7px 15px 7px 13px;
  }
}

/*
 * Куда стекло не доехало. Safari до 18 и старые сборки Chromium под
 * Windows размытия за элементом не умеют; там карточка остаётся
 * сплошной, как была. Отдельного правила почти не нужно — исходное
 * background:var(--panel) уже стоит выше, — но подложку в этом случае
 * приглушаем: сквозь непрозрачную карточку она не читается, а по краям
 * страницы даёт цветные пятна непонятного назначения.
 */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .ch-amb i{ opacity:.3; }
}

@media (prefers-reduced-motion:reduce){
  .ch-amb i{ animation:none; }
}

/*
 * Якоря не должны прятаться под закреплённой шапкой.
 *
 * «Подключиться» в герое ведёт на #servers. Пока шапка была в потоке,
 * браузер приводил цель к верху окна и всё сходилось. Закреплённая шапка
 * стоит поверх, и первые 80px цели оказывались под ней — заголовок
 * «Сейчас в игре» срезало ровно наполовину.
 */
.chill [id]{ scroll-margin-top:calc(var(--head-h) + 14px); }

/* ═══════════════════════════════════════════════════════════════════
   ТАРИФЫ И ОПЛАТА (страница покупки)

   Устройство повторяет боевую страницу один в один: две линейки рядом,
   в каждой крупная цена, переключатель срока и список возможностей.
   Разложено так не для красоты — на этих радиокнопках висит скрипт
   отправки заявки, и менять их порядок или вложенность значило бы
   переписывать то, что и так работает.
   ═══════════════════════════════════════════════════════════════════ */
.ch-plans{ display:grid; gap:14px; grid-template-columns:repeat(auto-fit,minmax(330px,1fr)); }
.ch-plan{
  background:var(--panel); border:1px solid var(--line); border-radius:8px;
  padding:22px 22px 20px; display:flex; flex-direction:column;
  transition:border-color var(--t-fast);
}
.ch-plan:hover{ border-color:#3a3f46; }
.ch-plan-h b{
  display:block; font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  text-transform:uppercase; font-size:1.05rem; letter-spacing:-.02em;
}
.ch-plan-h span{ display:block; margin-top:6px; font-size:.86rem; color:var(--dim); line-height:1.5; }

/* Крупная цена. Её меняет скрипт при выборе срока, поэтому цифры
   моноширинные по месту — иначе строка дёргается при каждом клике */
.ch-plan-price{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:clamp(1.7rem,4vw,2.4rem); letter-spacing:-.03em; line-height:1;
  color:var(--accent); margin:16px 0 14px; font-variant-numeric:tabular-nums;
}

/* ── Переключатель срока ──────────────────────────────────────────
   Радиокнопка спрятана, но НЕ через display:none: так она выпадает из
   порядка обхода клавиатурой, и выбрать тариф без мыши стало бы нельзя.
   Уводим за пределы видимости, оставляя доступной.                  */
.ch-plan-terms{ display:grid; gap:7px; }
.ch-term-r{ position:absolute; opacity:0; width:1px; height:1px; pointer-events:none; }
.ch-term{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:11px 14px; border:1px solid var(--line); border-radius:7px;
  cursor:pointer; background:var(--bg);
  transition:border-color var(--t-fast), background-color var(--t-fast), color var(--t-fast);
}
.ch-term .t{ font-size:.9rem; font-weight:600; }
.ch-term .s{ font-size:.9rem; font-weight:700; color:var(--dim); font-variant-numeric:tabular-nums; }
.ch-term:hover{ border-color:#3a3f46; background:var(--raise); }
.ch-term-r:checked + .ch-term{
  border-color:var(--accent); background:rgba(255,126,0,.10);
}
.ch-term-r:checked + .ch-term .s{ color:var(--accent); }
/* Рамка фокуса — на подписи: сама кнопка невидима, и без этого
   человек с клавиатуры не понимает, где находится */
.ch-term-r:focus-visible + .ch-term{ outline:2px solid var(--accent); outline-offset:2px; }

.ch-plan-feat{ margin:16px 0 0; padding-top:15px; border-top:1px solid var(--line-soft); display:grid; gap:9px; }
.ch-plan-feat li{ display:flex; gap:9px; align-items:flex-start; font-size:.87rem; line-height:1.5; color:var(--dim); }
.ch-plan-feat .ic{ flex:0 0 auto; margin-top:2px; color:var(--ok); }

/* ── Кнопки оплаты ─────────────────────────────────────────────── */
.ch-pay-btns{ display:grid; gap:10px; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); }
.ch-btn.lg{
  flex-direction:column; align-items:flex-start; gap:3px;
  padding:14px 18px; text-align:left; width:100%;
}
.ch-btn.lg small{ font-size:.72rem; font-weight:500; opacity:.72; letter-spacing:0; text-transform:none; }
.ch-btn.xs{ padding:4px 10px; font-size:.7rem; }
.ch-btn.solid.ok{ background:var(--ok); border-color:var(--ok); color:#08210f; }
.ch-btn.solid.ok:hover{ filter:brightness(1.08); }

/* Строка состояния формы. Цвет по умолчанию — тревожный: сюда пишутся
   и ошибки, и успех, а ошибок в жизни формы заметно больше */
.ch-formstatus{ margin-top:12px; font-size:.88rem; line-height:1.5; color:#e0837a; min-height:1.2em; }
.ch-formstatus.ok{ color:var(--ok); }
.ch-formstatus:empty{ margin-top:0; min-height:0; }

/*
 * Крутилка на кнопке.
 *
 * Заменяет значок Font Awesome, который рисовал её раньше: библиотека
 * больше не подключается, и на кнопке оставалось бы пустое место.
 * Рисуется рамкой с прозрачной верхней гранью — ни картинки, ни SVG.
 */
.ch-spin{
  width:14px; height:14px; flex:0 0 auto; border-radius:50%;
  border:2px solid currentColor; border-top-color:transparent;
  animation:km-spin .7s linear infinite;
}
@keyframes km-spin{ to{ transform:rotate(360deg); } }
@media (prefers-reduced-motion:reduce){
  /* Без вращения точка всё равно должна отличаться от обычного состояния,
     иначе непонятно, идёт работа или нет */
  .ch-spin{ animation:none; border-top-color:currentColor; opacity:.45; }
}

/* ═══════════════════════════════════════════════════════════════════
   ТОП СПОНСОРОВ

   Имена классов здесь чужие — kmc-*, а не ch-*. Так и задумано: список
   рисует скрипт, забирающий /get_donators.php, и он печатает эти классы
   строкой. Переписывать генерацию под новые имена значило бы трогать
   работающий код ради косметики; проще одеть то, что он печатает.
   ═══════════════════════════════════════════════════════════════════ */

/* ── Пьедестал ────────────────────────────────────────────────────
   Три ступени рядом. Первое место крупнее и стоит посередине — как на
   настоящем пьедестале, а не первым слева: иначе взгляд читает список,
   а не победителя.                                                  */
.kmc-podium{ display:grid; gap:12px; grid-template-columns:repeat(3,1fr); align-items:end; margin-bottom:16px; }
.kmc-podium:empty{ display:none; }
.kmc-step{
  background:var(--panel); border:1px solid var(--line); border-radius:8px;
  padding:20px 16px 18px; text-align:center; position:relative;
  transition:border-color var(--t-fast), transform var(--t-fast);
}
.kmc-step:hover{ transform:translateY(-2px); }
/* Порядок на экране меняем стилями, а не разметкой: скрипт печатает
   ступени по местам, и трогать его незачем */
.kmc-step.p1{ order:2; padding-top:28px; padding-bottom:26px; border-color:rgba(255,196,0,.42); }
.kmc-step.p2{ order:1; border-color:rgba(190,196,204,.34); }
.kmc-step.p3{ order:3; border-color:rgba(196,132,74,.34); }
.kmc-step.p1{ color:#ffc400; }
.kmc-step.p2{ color:#c4cad2; }
.kmc-step.p3{ color:#c4844a; }
.kmc-medal{ width:44px; height:52px; margin:0 auto 8px; display:block; }
.kmc-step .place{
  font-size:.62rem; text-transform:uppercase; letter-spacing:.11em;
  font-weight:700; opacity:.85;
}
.kmc-step .who{
  margin-top:7px; color:var(--text); font-weight:700; font-size:.98rem;
  overflow-wrap:anywhere; line-height:1.3;
}
.kmc-step.p1 .who{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800; font-size:1.05rem; letter-spacing:-.02em; }
.kmc-step .sum{
  margin-top:6px; font-weight:700; font-size:.92rem;
  font-variant-numeric:tabular-nums; color:var(--accent);
}

/* ── Остальные места ──────────────────────────────────────────────
   Строка несёт четыре величины сразу: место, ник, сумму и насколько
   отстал от соседа сверху. Полоса вклада лежит подложкой во всю ширину
   строки, а не отдельной колонкой, — иначе на телефоне она съедала бы
   место у ника.                                                     */
.kmc-rank{ display:grid; gap:7px; margin:0 0 16px; }
.kmc-rank:empty{ display:none; }
.kmc-rank li{
  position:relative; overflow:hidden;
  display:grid; grid-template-columns:auto minmax(0,1fr) auto;
  gap:4px 12px; align-items:center;
  padding:11px 14px; background:var(--panel);
  border:1px solid var(--line); border-radius:7px;
  transition:border-color var(--t-fast);
}
.kmc-rank li:hover{ border-color:#3a3f46; }
.kmc-rank .pl{
  font-family:ui-monospace,Consolas,monospace; font-size:.8rem; color:var(--faint);
  font-variant-numeric:tabular-nums; min-width:2ch; text-align:right;
}
.kmc-rank .nm{ font-weight:600; font-size:.93rem; overflow-wrap:anywhere; }
.kmc-rank .am{ font-weight:700; font-size:.92rem; color:var(--accent); font-variant-numeric:tabular-nums; }
.kmc-bar{
  grid-column:1 / -1; height:2px; background:var(--line);
  border-radius:2px; overflow:hidden; margin-top:2px;
}
.kmc-bar i{ display:block; height:100%; background:var(--accent); opacity:.55; }
.kmc-gap{ grid-column:1 / -1; font-size:.74rem; color:var(--faint); }

/* Призыв под списком */
.ch-cta{ text-align:center; }
.ch-cta .ch-panel-b{ padding:22px 18px 24px; }

@media (max-width:620px){
  /* Три ступени в ряд на телефоне дают по 100px на ник — нечитаемо.
     Ставим столбиком, победителя первым. */
  .kmc-podium{ grid-template-columns:1fr; align-items:stretch; }
  .kmc-step.p1{ order:0; }
  .kmc-step.p2{ order:1; }
  .kmc-step.p3{ order:2; }
}

/* ── Вечные тарифы (страница сбора) ───────────────────────────────
   Те же карточки, что и на покупке, но выделенные: это не рядовой
   тариф, а разовая возможность, и она должна отличаться от обычных
   пяти сроков — иначе теряется среди них.                          */
.ch-plan.hot{ border-color:rgba(255,126,0,.42); }
.ch-plan.hot:hover{ border-color:var(--accent); }
.ch-plan-h{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; flex-wrap:wrap; }
.ch-tag{
  flex:0 0 auto; font-size:.6rem; font-weight:700; letter-spacing:.11em;
  text-transform:uppercase; color:var(--on-accent); background:var(--accent);
  border-radius:999px; padding:3px 10px;
}
/* Подпись под ценой: «мест ограниченно» — часть предложения, а не сноска */
.ch-plan-price small{
  display:block; margin-top:6px; font-family:"Golos Text",system-ui,sans-serif;
  font-size:.74rem; font-weight:500; letter-spacing:0; color:var(--faint);
}
/* Ключевые строки списка — то, ради чего берут: срок и вклад в проект */
.ch-plan-feat li.key{ color:var(--text); font-weight:600; }
.ch-plan-feat li.key .ic{ color:var(--accent); }

/* ═══════════════════════════════════════════════════════════════════
   ЛИЧНЫЙ КАБИНЕТ
   ═══════════════════════════════════════════════════════════════════ */

/* Кто вошёл */
.ch-who-bar{
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding:16px 18px; background:var(--raise);
  border:1px solid var(--line); border-radius:8px;
}
.ch-who-bar .ch-ava{
  display:inline-flex; align-items:center; justify-content:center;
  width:44px; height:44px; border-radius:50%;
  background:var(--bg); border:1px solid var(--line); color:var(--accent);
}
.ch-who-bar > div{ min-width:0; flex:1 1 auto; }
.ch-who-bar .ch-btn{ margin-left:auto; }

/* Карточка привилегии: активная и истёкшая различаются кромкой слева,
   а не только словом — состояние должно читаться боковым зрением */
.ch-priv{ border-left:2px solid var(--line); }
.ch-priv.on{ border-left-color:var(--ok); }
.ch-priv.off{ border-left-color:#d0574e; }
.ch-badge{
  font-size:.6rem; font-weight:700; letter-spacing:.11em; text-transform:uppercase;
  border-radius:999px; padding:3px 10px; flex:0 0 auto;
}
.ch-badge.on{ color:#08210f; background:var(--ok); }
.ch-badge.off{ color:#fff; background:#d0574e; }
.ch-srv-meta dd.ok{ color:var(--ok); }
.ch-srv-meta dd.bad{ color:#e0837a; }

/*
 * Строка «команда + кнопка копирования».
 *
 * Каждый бинд отдельной строкой со своей кнопкой — по просьбе владельца.
 * Раньше все четыре лежали одним куском текста, и чтобы взять одну,
 * приходилось выделять её мышью, стараясь не задеть соседние.
 */
.ch-copyrow{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  flex-wrap:wrap; margin-top:8px; padding:10px 12px;
  background:var(--bg); border:1px solid var(--line); border-radius:7px;
  transition:border-color var(--t-fast);
}
.ch-copyrow:hover{ border-color:#3a3f46; }
.ch-copyrow > div{ min-width:0; }
.ch-copyrow code{
  font-family:ui-monospace,Consolas,monospace; font-size:.84rem;
  color:var(--text); overflow-wrap:anywhere; display:block;
}
.ch-copyrow .ch-dim{ display:block; margin-top:3px; font-size:.74rem; }
.ch-copyrow .ch-btn{ flex:0 0 auto; }

.ch-priv-acts{ display:flex; gap:8px; flex-wrap:wrap; margin-top:18px; }

/* Состояния «письмо ушло» и «ссылка протухла» — по центру, крупным знаком */
.ch-mid{ text-align:center; padding:38px 22px 34px; }
.ch-mid .ic{ margin:0 auto 14px; color:var(--accent); }
.ch-mid h2{ font-size:1.3rem; letter-spacing:-.02em; margin-bottom:10px; }
.ch-mid .ch-note{ max-width:46ch; margin-left:auto; margin-right:auto; }
.ch-mid .ch-btn{ margin-top:18px; }
.ch-bad .ic{ color:#d0574e; }

/* ═══════════════════════════════════════════════════════════════════
   СОСТАВ АДМИНИСТРАЦИИ

   Классы kmc-* и kmp-* — чужие: карточки печатает разметка страницы, а
   окно профиля целиком строит скрипт через createElement. Скрипт работает
   и безопасен (всё через textContent), переписывать его ради новых имён
   классов незачем — одеваем то, что он печатает.
   ═══════════════════════════════════════════════════════════════════ */

/* ── Карточки ─────────────────────────────────────────────────────── */
.kmc-lead{ display:grid; gap:9px; }
.kmc-grid{ display:grid; gap:9px; grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); }
.kmc-card,
.kmc-mini{
  display:flex; gap:13px; align-items:center; width:100%; text-align:left;
  padding:12px 14px; cursor:pointer; font:inherit; color:var(--text);
  background:var(--bg); border:1px solid var(--line); border-radius:7px;
  transition:border-color var(--t-fast), background-color var(--t-fast);
}
/* Руководство — широкой строкой с акцентной чертой */
.kmc-card{ padding:16px 18px; border-left:2px solid var(--accent); border-radius:0 7px 7px 0; }
.kmc-card:hover,
.kmc-mini:hover{ background:var(--raise); border-color:#3a3f46; }
.kmc-card:focus-visible,
.kmc-mini:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
.kmc-card .body,
.kmc-mini .body{ display:flex; flex-direction:column; gap:3px; min-width:0; flex:1 1 auto; }
.kmc-card .nick,
.kmc-mini .nick{ font-weight:700; font-size:1rem; overflow-wrap:anywhere; }
/*
 * Ник — КАК ЕСТЬ, без приведения регистра.
 *
 * Здесь стоял text-transform:uppercase, и он ломал написание, которое
 * человек выбрал сам: «9l» становилось «9L», «Водолаз» — «ВОДОЛАЗ», а
 * «BoqKyrJIbITb» превращалось в нечитаемое «BOQKYRJIBITB». В CS чередование
 * регистра часто и есть замысел ника, а не небрежность. На боевом сайте
 * ники выводятся ровно так, как лежат в базе, — так и должно остаться.
 */
.kmc-card .nick{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:1.1rem; letter-spacing:-.02em;
}
.kmc-mini .nick{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.kmc-card .role,
.kmc-mini .role{
  font-size:.72rem; text-transform:uppercase; letter-spacing:.09em;
  color:var(--accent); font-weight:700; margin-top:4px;
}
.kmc-card .about{ margin-top:8px; font-size:.88rem; line-height:1.6; color:var(--dim); }
.kmc-open{ color:var(--faint); font-size:1.3rem; line-height:1; flex:0 0 auto;
           transition:color var(--t-fast), transform var(--t-fast); }
.kmc-card:hover .kmc-open,
.kmc-mini:hover .kmc-open{ color:var(--accent); transform:translateX(3px); }

/* Кружок с фотографией или монограммой */
.kmc-ava{
  display:inline-flex; align-items:center; justify-content:center; flex:0 0 auto;
  width:38px; height:38px; border-radius:50%; overflow:hidden;
  background:var(--raise); border:1px solid var(--line);
  font-weight:700; font-size:.95rem; color:var(--dim);
  transition:transform var(--t-med);
}
.kmc-ava.lg{ width:52px; height:52px; font-size:1.15rem; }
/* width/height обязательны: <img> — заменяемый элемент и без них
   рисуется в натуральную величину, разрывая карточку */
.kmc-ava img{ width:100%; height:100%; object-fit:cover; display:block; }
.kmc-card:hover .kmc-ava,
.kmc-mini:hover .kmc-ava{ transform:scale(1.06); }

/* ── Плашки контактов ─────────────────────────────────────────────── */
.kmc-links{ display:flex; gap:8px; flex-wrap:wrap; margin-top:12px; }
.kmc-link{
  display:inline-flex; align-items:center; gap:7px; text-decoration:none;
  font-size:.8rem; color:var(--dim);
  border:1px solid var(--line); border-radius:999px; padding:5px 12px;
  transition:color var(--t-fast), border-color var(--t-fast);
}
a.kmc-link:hover{ color:var(--accent); border-color:var(--accent); }
.kmc-link svg{ flex:0 0 auto; opacity:.62; }
a.kmc-link:hover svg{ opacity:1; }

/* ── Окно профиля (строит скрипт) ─────────────────────────────────── */
.kmp-back{
  position:fixed; inset:0; z-index:200; display:flex;
  align-items:center; justify-content:center; padding:20px;
  background:rgba(0,0,0,.66); backdrop-filter:blur(4px);
  opacity:0; visibility:hidden;
  /*
   * 240 мс — не на глаз. Скрипт после снятия класса .on ждёт ровно
   * столько и удаляет окно из разметки. Поставь здесь дольше — узел
   * исчезнет на середине затухания, и вместо плавного ухода получится
   * рывок. Две величины обязаны совпадать, поэтому здесь стоит число
   * с пояснением, а не общий токен, который однажды поменяют.
   */
  transition:opacity .24s var(--ease), visibility 0s linear .24s;
}
.kmp-back.on{ opacity:1; visibility:visible; transition:opacity .24s var(--ease), visibility 0s; }
.kmp{
  /*
   * ЦВЕТ ТЕКСТА ЗАДАЁМ ЯВНО. Окно скрипт вешает на <body>, снаружи .chill,
   * а color наследуется от родителя — то есть от body, где стоит цвет
   * обвязки, а не темы. Ник поэтому выходил почти чёрным на тёмном фоне:
   * .kmp-about свой цвет задаёт сам и был виден, а .kmp-nick нет.
   *
   * Та же ловушка, что была с переменными: всё, что скрипты добавляют к
   * body, из темы не наследует ничего.
   */
  color:var(--text);
  position:relative; width:100%; max-width:430px; overflow:hidden;
  background:var(--panel); border:1px solid var(--line); border-radius:10px;
  transform:translateY(12px) scale(.985);
  transition:transform .24s var(--ease), opacity .24s var(--ease);
  opacity:0;
}
.kmp-back.on .kmp{ transform:none; opacity:1; }
/* Шапка окна: свечение под аватаром, как в профиле на стенде */
/*
 * Надпись в шапке окна — это группа: «Главная администрация» или
 * «Администратор». Скрипт кладёт её простым <span>, без класса, и без
 * правила ниже она выводилась чёрным в левом верхнем углу поверх рамки.
 */
.kmp-h span{
  display:block; padding:16px 54px 14px 22px;
  font-size:.62rem; text-transform:uppercase; letter-spacing:.11em;
  font-weight:700; color:var(--faint);
}
.kmp-h{
  position:relative; min-height:0;
  background:radial-gradient(120% 90% at 50% -10%, rgba(255,126,0,.13), transparent 62%), var(--raise);
  border-bottom:1px solid var(--line);
}
/* Аватар, ник и роль скрипт кладёт в .kmp-b, а не в шапку — селекторы
   выправлены по фактической разметке, а не по предположению о ней */
/*
 * Шапка окна — единым блоком по центру, с отбивкой от рассказа.
 * Раньше аватар, ник и текст шли впритык, и заголовок «прилипал» к
 * первой строке описания: было непонятно, где кончается имя и
 * начинается речь человека.
 */
.kmp-b .kmc-ava{
  /*
   * display:flex обязателен. У .kmc-ava по умолчанию inline-flex — так
   * нужно в карточках, где кружок стоит в строке рядом с ником. А в окне
   * он должен быть по центру, и margin:0 auto у СТРОЧНОГО элемента не
   * работает вовсе: аватар молча прижимался влево, ник под ним съезжал,
   * и шапка окна выглядела развалившейся.
   */
  display:flex; margin:0 auto 16px; width:84px; height:84px; font-size:1.8rem;
}
.kmp-b .kmp-nick,
.kmp-b .kmp-role{ text-align:center; }
.kmp-b .kmp-nick{ margin-top:0; font-size:1.35rem; }
/* Отбивка между шапкой и рассказом */
.kmp-b .kmp-nick + .kmp-about,
.kmp-b .kmp-role + .kmp-about{ margin-top:20px; }
/* Заголовок окна профиля — тот же ник, тоже без приведения регистра */
.kmp-nick{
  margin:14px 0 0; font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:1.2rem; letter-spacing:-.02em; overflow-wrap:anywhere;
}
.kmp-role{ margin:7px 0 0; font-size:.74rem; text-transform:uppercase;
           letter-spacing:.09em; color:var(--accent); font-weight:700; }
.kmp-b{ padding:24px 26px 24px; text-align:left; }
/*
 * Рассказ о себе — по левому краю и с акцентной чертой.
 * Многострочная проза по центру читается тяжело: у каждой строки свой
 * левый край, и глаз при возврате каждый раз ищет начало заново.
 */
.kmp-about{
  margin:0; font-size:.95rem; line-height:1.7; color:var(--text);
  border-left:2px solid var(--accent); padding-left:15px;
  /*
   * Переносы по слогам ОТКЛЮЧЕНЫ.
   *
   * hyphens:auto в узкой колонке рвал слова в самых неудачных местах —
   * «ди-джейским», «справедли-вое», — и рассказ о человеке начинал
   * читаться как газетная колонка позапрошлого века. Лучше неровный
   * правый край, чем разорванные слова: текста здесь три строки, а не
   * три полосы, и рваный край на нём незаметен.
   */
  hyphens:none; text-wrap:pretty; overflow-wrap:break-word;
}
.kmp-cap{
  margin:18px 0 9px; font-size:.62rem; text-transform:uppercase;
  letter-spacing:.11em; color:var(--faint); font-weight:700;
}
.kmp-sep{ height:1px; background:var(--line-soft); margin:18px 0; }
.kmp-empty{ margin:0; font-size:.88rem; color:var(--faint); }
.kmp-x{
  position:absolute; top:10px; right:12px; z-index:2;
  width:34px; height:34px; border-radius:50%;
  background:transparent; border:1px solid var(--line); color:var(--dim);
  font-size:1.2rem; line-height:1; cursor:pointer;
  transition:color var(--t-fast), border-color var(--t-fast), transform var(--t-fast);
}
.kmp-x:hover{ color:var(--text); border-color:var(--accent); transform:rotate(90deg); }
.kmp-b .kmc-links{ margin-top:0; }

@media (prefers-reduced-motion:reduce){
  .kmp-back, .kmp, .kmc-ava, .kmc-open, .kmp-x{ transition:none !important; }
  .kmp-x:hover, .kmc-card:hover .kmc-ava, .kmc-mini:hover .kmc-ava,
  .kmc-card:hover .kmc-open, .kmc-mini:hover .kmc-open{ transform:none; }
}

/* ── Страница демо ────────────────────────────────────────────────── */
.ch-demo{ max-width:620px; margin:0 auto; }
.ch-demo-name{
  margin:0 0 4px; font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:1.05rem; letter-spacing:-.02em;
  /* Имена демок длинные и без пробелов: без переноса по любому знаку
     строка вылезает за карточку и растягивает страницу вбок */
  overflow-wrap:anywhere;
}
.ch-demo .ch-srv-meta{ margin-bottom:18px; }
/* Скоро удалится — предупреждаем цветом, а не только словами */
.ch-demo .ch-srv-meta dd.warn{ color:#e0837a; }

/* ═══════════════════════════════════════════════════════════════════
   ЗАГРУЗКА ДЕМО

   Имена классов чужие — их знает скрипт загрузки: он вешает .over на
   зону при перетаскивании и показывает блоки через style.display.
   Скрипт не тронут, одеваем то, что он ожидает.
   ═══════════════════════════════════════════════════════════════════ */
.drop-zone{
  position:relative; display:flex; flex-direction:column; align-items:center; gap:9px;
  padding:38px 20px; text-align:center; cursor:pointer;
  background:var(--bg); border:1.5px dashed var(--line); border-radius:9px;
  transition:border-color var(--t-fast), background-color var(--t-fast);
}
.drop-zone:hover{ border-color:#3a3f46; background:var(--raise); }
/* .over скрипт вешает, пока файл тащат над зоной */
.drop-zone.over{ border-color:var(--accent); background:rgba(255,126,0,.07); }
/* Поле выбора файла растянуто на всю зону и невидимо: нажатие в любом
   месте открывает проводник, и отдельная кнопка не нужна */
.drop-zone input[type="file"]{
  position:absolute; inset:0; width:100%; height:100%; opacity:0; cursor:pointer;
}
.drop-zone .ic{ color:var(--faint); }
.drop-zone.over .ic{ color:var(--accent); }
.dz-title{ font-weight:700; font-size:.98rem; }
.dz-sub{ font-size:.8rem; color:var(--faint); }

.demo-info{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
  gap:10px 16px; margin-top:14px; padding-top:14px; border-top:1px solid var(--line-soft);
}
.demo-info dt{ font-size:.62rem; text-transform:uppercase; letter-spacing:.09em;
               color:var(--faint); font-weight:700; margin-bottom:2px; }
.demo-info dd{ margin:0; font-weight:600; font-size:.9rem; overflow-wrap:anywhere; }

.btn-upload{ margin-top:16px; }
.btn-upload:disabled{ opacity:.4; cursor:not-allowed; }

/* Полоса хода загрузки. Скрипт показывает обёртку через style.display,
   поэтому по умолчанию она спрятана здесь, а не атрибутом hidden */
.progress-wrap{ display:none; margin-top:14px; }
.progress-bar-bg{ height:4px; background:var(--line); border-radius:2px; overflow:hidden; }
.progress-bar-fill{ height:100%; width:0; background:var(--accent); transition:width .2s linear; }
.progress-label{ margin-top:6px; font-size:.8rem; color:var(--dim); font-variant-numeric:tabular-nums; }

.err-box{
  display:none; margin-top:14px; padding:11px 14px;
  background:rgba(208,87,78,.10); border:1px solid rgba(208,87,78,.42);
  border-radius:7px; color:#e0837a; font-size:.88rem; line-height:1.5;
}
.result-box{
  display:none; margin-top:16px; padding:16px 18px;
  background:rgba(95,208,122,.07); border:1px solid rgba(95,208,122,.34); border-radius:8px;
}
.result-box input[type="text"]{
  flex:1 1 auto; min-width:0; padding:8px 12px; font:inherit; font-size:.85rem;
  font-family:ui-monospace,Consolas,monospace;
  background:var(--bg); border:1px solid var(--line); border-radius:6px; color:var(--text);
}
.result-meta{ margin-top:10px; }

/* Изменяемая часть пути к демке — чтобы имя файла было видно сразу */
.ch-hi{ color:var(--accent); }

/* ── Кнопка и окно «Кто играет» ────────────────────────────────────
   Список переехал из спойлера в окно: развёрнутым он добавлял карточке
   шестьсот с лишним пикселей, соседняя уезжала вниз, и страница прыгала
   под курсором. Окно показывает столько же, но карточка стоит на месте. */
.ch-who-btn{
  display:flex; align-items:center; gap:8px; width:100%;
  padding:9px 12px; font:inherit; color:var(--text); text-align:left;
  background:var(--bg); border:1px solid var(--line); border-radius:7px; cursor:pointer;
  transition:border-color var(--t-fast), background-color var(--t-fast);
}
.ch-who-btn:hover{ background:var(--raise); border-color:#3a3f46; }
.ch-who-btn:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
/*
 * Сброс отступа у подписи внутри кнопки.
 *
 * У .ch-who-h стоит margin-bottom:8px — он нужен там, где подпись стоит
 * заголовком над списком. В кнопке это мешало: flex центрирует по внешним
 * габаритам, а нижний отступ входит в них и приподнимал надпись, из-за чего
 * кружок с числом выглядел съехавшим вниз.
 *
 * Прежний сброс был написан для .ch-who — старого спойлера, которого больше
 * нет. Правило осталось висеть, ни на что не действуя: типичный след от
 * переделки, который сам о себе не сообщает.
 */
.ch-who-btn .ch-who-h{ margin:0; line-height:1.2; }
/* Кружок с числом центрируем по себе, а не по случайной высоте строки:
   иначе он снова уедет от любой правки кегля */
.ch-who-btn .ch-who-n{
  display:inline-flex; align-items:center; line-height:1; padding:3px 9px;
}
.ch-who-btn .ch-who-x{ margin-left:auto; color:var(--faint); font-size:1.1rem; line-height:1;
                       transition:transform var(--t-fast), color var(--t-fast); }
.ch-who-btn:hover .ch-who-x{ color:var(--accent); transform:translateX(3px); }

/*
 * Окно со списком. Появление на классе .on, а не на [hidden]: скрипт
 * снимает hidden, ждёт кадр и вешает класс — иначе перехода не будет,
 * элемент только что получил display и предыдущего состояния у него нет.
 */
.ch-roster-modal{
  opacity:0; transition:opacity .24s var(--ease);
  /* Затемнение слабее обычного и с сильным размытием: сквозь стеклянное
     окно должно быть видно, что под ним живая страница, а не чёрный лист */
  background:rgba(8,9,11,.55);
  -webkit-backdrop-filter:blur(10px) saturate(1.1);
  backdrop-filter:blur(10px) saturate(1.1);
}
.ch-roster-modal.on{ opacity:1; }

/* ── Матовое стекло самого окна ──────────────────────────────────── */
.ch-roster-modal .ch-modal-box{
  position:relative;
  /* Шире обычного окна: список идёт в две колонки, см. ниже */
  max-width:min(780px, 100%);
  text-align:left; padding:22px 22px 18px;
  background:rgba(24,27,31,.62);
  -webkit-backdrop-filter:blur(26px) saturate(1.5);
  backdrop-filter:blur(26px) saturate(1.5);
  border:1px solid rgba(255,255,255,.10);
  transform:translateY(10px) scale(.985);
  transition:transform .24s var(--ease);
  /* Потолок оставляем как страховку: на телефоне и при полном сервере
     прокрутка неизбежна, но в обычном случае до неё не доходит */
  max-height:min(82vh, 720px); overflow-y:auto;
  scrollbar-width:thin; scrollbar-color:var(--line) transparent;
}
.ch-roster-modal.on .ch-modal-box{ transform:none; }
/* Блик по верхней кромке — у стекла есть толщина, и видно её по краю */
.ch-roster-modal .ch-modal-box::after{
  content:''; position:absolute; inset:0; border-radius:inherit; pointer-events:none;
  background:linear-gradient(157deg, rgba(255,255,255,.08), transparent 40%);
}
/* Содержимое — поверх блика */
.ch-roster-modal .ch-modal-box > *{ position:relative; z-index:1; }

@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  /* Без размытия стекло превращается в мутную плашку, сквозь которую
     плохо читается текст — там окно просто непрозрачное */
  .ch-roster-modal{ background:rgba(0,0,0,.72); }
  .ch-roster-modal .ch-modal-box{ background:var(--panel); }
}

/*
 * ДВЕ КОЛОНКИ — чтобы не прокручивать.
 *
 * Двадцать три ника в столбик — это семьсот пикселей, и список приходилось
 * листать внутри окна. На полном сервере их тридцать два. В две колонки то
 * же самое умещается в экран целиком.
 *
 * auto-fit, а не жёсткие две: на узком экране колонка остаётся одна сама,
 * без отдельного правила под телефон.
 */
.ch-roster-modal .ch-who-list{
  margin-top:12px;
  /*
   * columns, а не сетка. Сетка раскладывает построчно — слева направо, —
   * и список, отсортированный по счёту, начинал читаться через одного:
   * первый слева, второй справа, третий снова слева. Для рейтинга это
   * бессмыслица. Газетная раскладка ведёт сверху вниз и только потом
   * переходит во вторую колонку.
   */
  display:block;
  columns:2; column-gap:16px;
}
/* Строка не должна разрываться между колонками */
.ch-roster-modal .ch-who-list li{ break-inside:avoid; margin-bottom:1px; }
@media (max-width:699px){ .ch-roster-modal .ch-who-list{ columns:1; } }
/*
 * Полосатость — по СТРОКЕ, а не по порядку в списке.
 *
 * nth-child(odd) в две колонки красит через одного по всему потоку, и
 * полосы идут наискось шахматкой — рябит и мешает читать. Здесь красим
 * так, чтобы в каждой колонке чередование шло сверху вниз.
 */
.ch-roster-modal .ch-who-list li{ padding:5px 9px; }

/* Крестик едет вместе с прокруткой списка, иначе он уползает вверх */
.ch-roster-modal .ch-modal-x{ position:sticky; top:0; z-index:2; float:right; margin:-4px -4px 0 8px; }

@media (prefers-reduced-motion:reduce){
  .ch-roster-modal,
  .ch-roster-modal .ch-modal-box{ transition:none; }
  .ch-roster-modal .ch-modal-box{ transform:none; }
}

/* Окно инструкции на загрузке демо — та же стеклянная коробка, что и у
   списка играющих, но уже: там пути, а не два столбца ников */
#demoHelp .ch-modal-box{ max-width:min(560px, 100%); }
#demoHelp .ch-copyrow{ margin-top:6px; }

/* ═══ ЛИНЕЙКИ ТАРИФОВ И ОКНО ОПЛАТЫ ════════════════════════════════ */
/*
 * ВАЖНО про min(400px,100%).
 * Голый minmax(400px,1fr) на узком экране даёт колонку ровно 400px, даже
 * если контейнер уже: минимум для грида — обязательство, а не пожелание.
 * На телефоне контейнер 339px, карточка становилась 400px и вылезала на
 * 61px. Страница по горизонтали не прокручивается, поэтому цена и правая
 * плитка срока просто обрезались краем экрана — выглядело как поломка.
 * min(400px,100%) снимает минимум, когда места меньше.
 */
.ch-lines{ display:grid; gap:14px; grid-template-columns:repeat(auto-fit,minmax(min(400px,100%),1fr)); }
/*
 * Обводка одинаковая у обеих карточек и оранжевая — как на /special, где
 * класс hot висит на каждой карточке тарифа. Значения оттуда же: .42 в
 * покое, полный акцент при наведении.
 *
 * Раньше подсвечивалась только ADMIN+VIP. Выделять одну из двух незачем:
 * это равные предложения, а не рекомендация с запасным вариантом.
 */
.ch-line{
  background:var(--panel); border:1px solid rgba(255,126,0,.42); border-radius:9px; padding:22px;
  transition:border-color var(--t-fast);
}
.ch-line:hover{ border-color:var(--accent); }
.ch-line-head{ display:flex; align-items:flex-start; justify-content:space-between; gap:14px; flex-wrap:wrap; }
.ch-line-head b{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  text-transform:uppercase; font-size:1.1rem; letter-spacing:-.02em;
}
.ch-line-desc{ margin:6px 0 0; font-size:.86rem; color:var(--dim); line-height:1.5; }
.ch-line-from{ flex:0 0 auto; font-size:.78rem; color:var(--faint); }
.ch-line-from b{ font-family:inherit; font-size:1rem; color:var(--accent); text-transform:none; letter-spacing:0; }
.ch-line-feats{ margin:16px 0 0; padding-top:14px; border-top:1px solid var(--line-soft); display:grid; gap:8px; }
.ch-line-feats li{ display:flex; gap:9px; align-items:flex-start; font-size:.86rem; line-height:1.5; color:var(--dim); }
.ch-line-feats .ic{ margin-top:2px; color:var(--ok); }

/* ── Кнопки сроков ────────────────────────────────────────────────
   Цена за месяц под суммой — главное, ради чего сделана эта раскладка:
   без неё пять сумм требуют деления в уме, чтобы понять выгоду. */
/*
 * «Выберите срок» — отдельный шаг, а не продолжение списка возможностей.
 * Стояло вплотную к последнему пункту и читалось как ещё одна строка
 * перечисления. Отбивка сверху и тонкая черта разделяют «что входит» и
 * «на сколько берёте» — это два разных решения.
 */
.ch-line .ch-line-h{
  margin:22px 0 10px; padding-top:16px;
  border-top:1px solid var(--line-soft);
}
.ch-line-tiers{ display:grid; gap:8px; grid-template-columns:repeat(auto-fit,minmax(128px,1fr)); }
.ch-buy{
  display:flex; flex-direction:column; gap:3px; align-items:flex-start;
  padding:12px 14px; cursor:pointer; font:inherit; text-align:left;
  background:var(--bg); color:var(--text);
  border:1px solid var(--line); border-radius:8px;
  transition:border-color var(--t-fast), background-color var(--t-fast), transform var(--t-fast);
}
.ch-buy:hover{ border-color:var(--accent); background:rgba(255,126,0,.08); transform:translateY(-1px); }
.ch-buy:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
.ch-buy-term{ font-size:.68rem; text-transform:uppercase; letter-spacing:.09em; color:var(--faint); font-weight:700; }
.ch-buy-price{
  font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
  font-size:1.15rem; letter-spacing:-.02em; font-variant-numeric:tabular-nums;
}
.ch-buy-per{ font-size:.72rem; color:var(--accent); font-weight:600; }

/*
 * Выбранный срок подсвечивается и ОСТАЁТСЯ подсвеченным.
 *
 * Раньше состояние было только на :hover. На телефоне наведения не
 * существует вовсе — человек нажимал плитку, открывалось окно оплаты, и
 * при возврате ничто не напоминало, что именно он выбрал. Так же сделано
 * на /special, где выбранный тариф держит рамку постоянно.
 *
 * :active нужен отдельно: на касании это единственный отклик до того,
 * как откроется окно.
 */
.ch-buy.on{
  border-color:var(--accent);
  background:rgba(255,126,0,.10);
}
.ch-buy.on .ch-buy-term{ color:var(--dim); }
.ch-buy.on .ch-buy-price{ color:var(--accent); }
.ch-buy:active{ background:rgba(255,126,0,.14); }

/* ── Окно оплаты ──────────────────────────────────────────────────
   Радиокнопки внутри спрятаны, но НЕ display:none: скрытый через
   display элемент выпадает из формы для части браузеров и перестаёт
   отправляться. Уводим за пределы видимости. */
.ch-pay-radios{ position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }
.ch-pay-modal{ opacity:0; transition:opacity .24s var(--ease);
  background:rgba(8,9,11,.6); -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px); }
.ch-pay-modal.on{ opacity:1; }
.ch-pay-modal .ch-modal-box{
  background:rgba(24,27,31,.72); border:1px solid rgba(255,255,255,.10);
  -webkit-backdrop-filter:blur(26px) saturate(1.5); backdrop-filter:blur(26px) saturate(1.5);
  max-height:min(88vh,860px); overflow-y:auto;
  transform:translateY(10px) scale(.985); transition:transform .24s var(--ease);
  scrollbar-width:thin; scrollbar-color:var(--line) transparent;
}
.ch-pay-modal.on .ch-modal-box{ transform:none; }
.ch-pay-grid{ display:grid; gap:20px; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); }
.ch-chosen-nm{ font-family:"Unbounded",system-ui,sans-serif; font-weight:800;
               text-transform:uppercase; font-size:1.05rem; letter-spacing:-.02em; }
@media (prefers-reduced-motion:reduce){
  .ch-pay-modal,.ch-pay-modal .ch-modal-box{ transition:none; }
  .ch-pay-modal .ch-modal-box{ transform:none; }
  .ch-buy:hover{ transform:none; }
}

/* Строка «Не можешь найти файл сам?» и кнопка рядом — по одной линии.
   .ch-priv-acts раскладывает элементы флексом, но подпись у него шла
   как обычный текст со своей высотой строки и вставала выше кнопки. */
.ch-priv-acts{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; }
.ch-priv-acts > .ch-dim{ line-height:1; }

/* ── Страница после оплаты ──────────────────────────────────────
   Одна карточка по центру. Ширину держим узкой: здесь всего три
   строки, и растянутые на всю сетку они читались бы как объявление,
   а не как ответ лично тебе. */
.ch-thanks{
  max-width:560px;
  margin:0 auto;
  text-align:center;
  padding:38px 30px 34px;
}
.ch-thanks-mark{
  width:76px; height:76px;
  margin:0 auto 20px;
  display:grid; place-items:center;
  border-radius:50%;
  color:var(--accent);
  background:color-mix(in srgb, var(--accent) 14%, transparent);
  border:1px solid color-mix(in srgb, var(--accent) 34%, transparent);
}
.ch-thanks-lead{
  margin:0;
  color:var(--dim);
  font-size:1.02rem;
  line-height:1.75;
}
.ch-thanks-lead a{ color:var(--accent); text-decoration:none; }
.ch-thanks-lead a:hover{ text-decoration:underline; }
.ch-thanks-acts{ margin-top:26px; }

@media (max-width:520px){
  .ch-thanks{ padding:30px 20px 26px; }
  .ch-thanks-mark{ width:64px; height:64px; }
}
