/* ==========================================================================
   ОСНОВНЫЕ СТИЛИ САЙТА

   Порядок подключения в index.html важен и намеренный:

     styles.css        этот файл — общее оформление и раскладка
     games.css         игровые экраны (свои токены --gx-*, container queries)
     slots.css         каталог слотов
     referral.css      партнёрка
     bonus-enhanced.css  окно ежедневного бонуса
     legal.css         документы
     mobile.css        ПОСЛЕДНИМ — слой мобильных переопределений

   ПРАВИЛО: всё, что касается узких экранов, пишется в mobile.css, а не
   блоком @media здесь. Мобильные правила уже были размазаны по этому файлу
   шестнадцатью @media с пересекающимися брейкпоинтами и войной !important —
   правка в одном месте молча ломала другое. Разделы 25 и 27 ниже остались
   от той поры; новые не добавляйте.

   Игровые экраны сюда не лезут: у них своя система в games.css на
   container queries, поэтому игра перестраивается по ширине СВОЕГО блока, а
   не окна — и одинаково работает и на телефоне, и в узкой колонке.

   Разделы (по порядку в файле):
     0–2    сброс, toast, кнопки
     3      шапка и навигация
     4–6    карточки, дашборд, баннеры главной
     7–13   игры-витрина, статистика, меню, правая колонка
     14–24  игровые экраны (общее), мины, bubbles, честность
     25,27  СТАРЫЕ мобильные блоки — не расширять, см. mobile.css
     26     SPA-страницы
     28     авторизация
     29     профиль игрока
     30–32  касса
     далее  бонусы, уровни, промокоды, экран загрузки
   ========================================================================== */

/* ==========================================================================
   ТОКЕНЫ ТЕМЫ ПЕРЕЕХАЛИ В theme.css

   Он подключается раньше этого файла и на всех страницах со своим <head>,
   включая документы, где styles.css не нужен. Все цвета ниже берутся
   оттуда через var(--…); не возвращайте объявления сюда.
   ========================================================================== */


/* ------------------------------------------------------------------------
   ТЁМНАЯ ТЕМА ДЛЯ ЛОКАЛЬНЫХ ТОКЕНОВ

   У карточек бонусов и лестницы уровней свои переменные — они появились
   раньше общей темы. Светлыми там были только подложки; их и
   перенацеливаем на общую палитру.

   Без этого выходило самое неприятное сочетание: подложка оставалась
   светлой (--lv-soft: #f1f5f9), а текст на ней брал var(--text), который в
   тёмной теме светлый. Белым по белому — карточка уровня читалась как
   пустая.

   Остальные локальные токены (--lv-ink, --lvb-ink, янтарь ВИПа) НЕ трогаем:
   это белый текст и фирменные градиенты на цветных плашках, они одинаковы
   в обеих темах.

   Список повторяется дважды — для системной настройки и ручного выбора.
   ------------------------------------------------------------------------ */

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) .bx-card { --bx-accent-soft: var(--surface-accent); }
    :root:not([data-theme="light"]) .lv-step { --lv-soft: var(--surface-2); }
}

:root[data-theme="dark"] .bx-card { --bx-accent-soft: var(--surface-accent); }
:root[data-theme="dark"] .lv-step { --lv-soft: var(--surface-2); }

/* ======================================================================== */
/* 1. БАЗОВЫЕ СТИЛИ И СБРОС */
/* ======================================================================== */

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: 'Inter', sans-serif;
}

body {
    background-color: var(--bg);
    color: var(--text);

    /* Плавное переключение темы. Только фон и текст: анимировать всё подряд —
       значит получить заметную волну перерисовки на слабых телефонах. */
    transition: background-color var(--theme-switch), color var(--theme-switch);
    padding: 16px;
    min-height: 100vh;
}

.app-container {
    width: 100%;
    max-width: 100%;
    background: var(--surface);
    border-radius: clamp(16px, 2vw, 32px);
    padding: clamp(16px, 2vw, 32px);
    box-shadow: 0 4px 24px rgba(0, 20, 40, 0.04);
    min-height: 100vh;
}

/* ======================================================================== */
/* 0. TOAST */
/* ======================================================================== */

.toast-container {
    position: fixed;
    top: 20px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 3000;
    display: flex;
    flex-direction: column;
    gap: 10px;
    pointer-events: none;
}

.toast {
    padding: 12px 20px;
    border-radius: 12px;
    color: #ffffff;
    font-weight: 600;
    font-size: 14px;
    line-height: 1.3;
    opacity: 0;
    transform: translateY(-12px);
    transition: all 0.25s ease;
    pointer-events: auto;
    box-shadow: 0 10px 24px rgba(15, 23, 42, 0.18);
    text-align: center;
    max-width: 90vw;
}

.toast-show {
    opacity: 1;
    transform: translateY(0);
}

/* ТОСТ С ДЕЙСТВИЕМ. Появляется, когда сообщение не просто уведомляет, а
   предлагает выход, — например «доиграйте раунд в Минах, нажмите, чтобы
   перейти». Нажимаемость обязана быть видна: молча кликабельная плашка
   ничем не отличается от обычной, и нажать на неё никто не догадается.

   :hover перебивает transform у .toast-show по специфичности (два класса
   против одного) — иначе подсветка не сдвинула бы плашку. */
.toast-action {
    cursor: pointer;
}

.toast-action:hover,
.toast-action:focus-visible {
    filter: brightness(1.08);
    transform: translateY(1px);
}

.toast-action:focus-visible {
    outline: 2px solid #ffffff;
    outline-offset: 2px;
}

.toast-info {
    background: var(--accent);
}

.toast-success {
    background: var(--ok);
}

.toast-error {
    background: var(--danger);
}

/* ======================================================================== */
/* 2. КНОПКИ И УТИЛИТЫ */
/* ======================================================================== */

.btn-primary {
    background: var(--accent);
    color: #fff;
    border: none;
    padding: 14px 32px;
    border-radius: 40px;
    font-weight: 600;
    font-size: 15px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 12px;
    transition: all 0.2s ease;
}

.btn-primary:hover {
    background: var(--accent-hover);
    transform: translateY(-2px);
    box-shadow: 0 8px 20px rgba(37, 99, 235, 0.25);
}

.btn-ghost {
    background: transparent;
    color: var(--accent);
    border: 1px solid var(--border);
    padding: 8px 18px;
    border-radius: 20px;
    font-weight: 500;
    font-size: 13px;
    cursor: pointer;
    transition: all 0.2s ease;
}

.btn-ghost:hover {
    background: var(--surface-2);
    border-color: var(--accent);
}

.btn-arrow {
    transition: transform 0.2s ease;
}

.btn-primary:hover .btn-arrow {
    transform: translateX(4px);
}

/* ======================================================================== */
/* 3. НАВИГАЦИЯ (Header) */
/* ======================================================================== */

.top-nav {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 24px;
    border-bottom: 1px solid var(--border-soft);
    margin-bottom: 24px;
}

.logo {
    font-size: 22px;
    font-weight: 700;
    color: var(--text);
    display: flex;
    align-items: center;
    gap: 12px;
    cursor: pointer;
}

.logo img {
    height: 32px;
    width: auto;
}

.nav-center {
    display: flex;
    align-items: center;
    gap: 8px;
    background: var(--surface-2);
    padding: 6px;
    border-radius: 40px;
}

.nav-link {
    text-decoration: none;
    padding: 10px 24px;
    border-radius: 30px;
    color: var(--text-dim);
    font-weight: 500;
    font-size: 14px;
    display: flex;
    align-items: center;
    gap: 10px;
    transition: all 0.2s ease;
    cursor: pointer;
}

/* Иконки пунктов — svg. Цвет наследуется через currentColor, поэтому
   активный и наведённый пункт красят значок вместе с подписью: у прежних
   png так не получалось, там менялась только прозрачность.
   flex: none — иначе значок сжимается, когда подписи не хватает места. */
.nav-link svg {
    width: 19px;
    height: 19px;
    flex: none;
    opacity: 0.55;
    transition: opacity 0.2s ease;
}

.nav-link:hover {
    color: var(--accent);
}

.nav-link.active {
    background: var(--surface);
    color: var(--accent);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
}

.nav-link:hover svg,
.nav-link.active svg {
    opacity: 1;
}

.nav-right {
    display: flex;
    align-items: center;
    gap: 20px;
}

/* Баланс с кассой по бокам.
 *
 * Вместо картинки банка на 1.1 МБ (она рисовалась в 18 px) — две кнопки:
 * слева вывод, справа пополнение. Пополнение справа и оно же единственное
 * цветное: это основное действие, и взгляд заканчивает движение на нём.
 * Поменять местами — переставить два блока в разметке, стили завязаны на
 * модификаторы --in / --out, а не на позицию.
 *
 * Разметка живёт в index.html и в balancePillHtml() внутри auth.js. */

.balance-pill {
    background: var(--surface);
    border: 1px solid var(--border);
    padding: 4px 5px;
    border-radius: 30px;
    display: flex;
    align-items: center;
    gap: 4px;
    font-weight: 600;
    font-size: 14px;
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.balance-pill:hover {
    border-color: var(--border-strong);
    box-shadow: 0 4px 14px rgba(15, 23, 42, 0.06);
}

.balance-pill__sum {
    color: var(--accent);
    padding: 0 6px;
    min-width: 62px;
    text-align: center;
    /* Цифры не должны прыгать при каждом обновлении баланса */
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.balance-pill__btn {
    width: 30px;
    height: 30px;
    flex: none;
    padding: 0;
    border: 0;
    border-radius: 50%;
    display: grid;
    place-items: center;
    cursor: pointer;
    transition: all 0.18s ease;
}

.balance-pill__btn svg {
    width: 15px;
    height: 15px;
}

.balance-pill__btn:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

.balance-pill__btn:active {
    transform: scale(0.92);
}

/* Пополнить — основное действие */
.balance-pill__btn--in {
    background: var(--accent);
    color: #ffffff;
    box-shadow: 0 2px 8px rgba(37, 99, 235, 0.28);
}

.balance-pill__btn--in:hover {
    background: var(--accent-hover);
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.38);
}

/* Вывести — второстепенное, поэтому без заливки */
.balance-pill__btn--out {
    background: var(--surface-3);
    color: var(--text-dim);
}

.balance-pill__btn--out:hover {
    background: var(--border);
    color: var(--text);
}

.avatar {
    width: 44px;
    height: 44px;
    background: var(--surface-accent);
    color: var(--accent);
    border-radius: 50%;
    display: flex;
    justify-content: center;
    align-items: center;
    font-weight: 600;
    font-size: 18px;
    cursor: pointer;
    transition: all 0.2s ease;
    border: 2px solid transparent;
    position: relative;
}

.avatar:hover {
    border-color: var(--accent);
    transform: scale(1.05);
    box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.1);
}

.avatar.clickable::after {
    content: '';
    position: absolute;
    bottom: -2px;
    right: -2px;
    width: 12px;
    height: 12px;
    background: #22c55e;
    border: 2px solid var(--surface);
    border-radius: 50%;
}

/* ======================================================================== */
/* МЕНЮ ПРОФИЛЯ (аватар в шапке)                                            */
/*                                                                          */
/* Раздела «Игры» здесь больше нет: те же Мины, Бабл и Дайс стоят в левом    */
/* меню и в нижней панели, третья копия ничего не добавляла.                 */
/* ======================================================================== */

.pmenu {
    position: absolute;
    /* Выше залипающей шапки (1000), но ниже модалок (2000): из меню
       открываются касса и колесо, они должны лечь поверх. */
    z-index: 1500;
    width: 292px;
    padding: 8px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 20px;
    box-shadow: 0 24px 48px rgba(15, 23, 42, 0.16);
    animation: pmenuIn 0.18s ease;
}

@keyframes pmenuIn {
    from {
        opacity: 0;
        transform: translateY(-8px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.pmenu__head {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 10px 14px;
}

.pmenu__avatar {
    width: 42px;
    height: 42px;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--surface-accent);
    color: var(--accent);
    font-size: 17px;
    font-weight: 700;
}

.pmenu__id {
    min-width: 0;      /* иначе длинная почта распирает меню */
}

.pmenu__name {
    font-size: 14px;
    font-weight: 700;
    color: var(--text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.pmenu__role {
    font-size: 12px;
    color: var(--text-faint);
    font-weight: 500;
    margin-top: 2px;
}

.pmenu__balance {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 12px 14px;
    border-radius: 16px;
    background: var(--surface-accent);
    border: 1px solid var(--border);
}

.pmenu__balance-main {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.pmenu__balance-label {
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text-faint);
}

.pmenu__balance-value {
    font-size: 19px;
    font-weight: 800;
    color: var(--text);
    letter-spacing: -0.4px;
}

.pmenu__fs {
    flex: none;
    padding: 5px 10px;
    border-radius: 20px;
    background: var(--surface);
    border: 1px solid var(--border);
    color: var(--violet);
    font-size: 12px;
    font-weight: 700;
}

.pmenu__pay {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
    margin: 8px 0;
}

.pmenu__pay-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    min-height: 42px;
    padding: 10px 12px;
    border: 1px solid var(--border);
    border-radius: 14px;
    background: var(--surface);
    color: var(--text-2);
    font-family: inherit;
    font-size: 13.5px;
    font-weight: 700;
    cursor: pointer;
    transition: all 0.18s ease;
}

.pmenu__pay-btn:hover {
    background: var(--surface-2);
    border-color: var(--border-strong);
    color: var(--text);
}

.pmenu__pay-btn--in {
    background: var(--accent);
    border-color: var(--accent);
    color: #ffffff;
}

.pmenu__pay-btn--in:hover {
    background: var(--accent-hover);
    border-color: var(--accent-hover);
    color: #ffffff;
}

.pmenu__list {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding-top: 6px;
    border-top: 1px solid var(--border-soft);
}

.pmenu__item {
    display: flex;
    align-items: center;
    gap: 10px;
    width: 100%;
    min-height: 42px;
    padding: 10px 12px;
    border: none;
    border-radius: 12px;
    background: transparent;
    color: var(--text-2);
    font-family: inherit;
    font-size: 14px;
    font-weight: 600;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease;
}

.pmenu__item:hover {
    background: var(--surface-3);
    color: var(--text);
}

.pmenu__icon {
    width: 18px;
    height: 18px;
    flex: none;
    color: var(--text-faint);
}

.pmenu__item:hover .pmenu__icon {
    color: var(--accent);
}

.pmenu__item--exit {
    margin-top: 6px;
    padding-top: 10px;
    border-top: 1px solid var(--border-soft);
    border-radius: 0 0 12px 12px;
    color: var(--danger);
}

.pmenu__item--exit:hover {
    background: var(--danger-soft);
    color: var(--danger);
}

.pmenu__item--exit:hover .pmenu__icon {
    color: var(--danger);
}

.pmenu__pay-btn .pmenu__icon {
    width: 15px;
    height: 15px;
    color: currentColor;
}

.auth-nav-btn {
    background: var(--accent);
    color: #fff;
    border: none;
    padding: 10px 20px;
    border-radius: 30px;
    font-weight: 600;
    font-size: 14px;
    cursor: pointer;
    transition: all 0.2s ease;
}

.auth-nav-btn:hover {
    background: var(--accent-hover);
    transform: translateY(-1px);
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.25);
}

/* ======================================================================== */
/* 4. КАРТОЧКИ */
/* ======================================================================== */

.card {
    background: var(--surface);
    border-radius: 24px;
    padding: 24px;
    border: 1px solid var(--border);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    position: relative;
    overflow: hidden;
}

.card::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.8), transparent);
    opacity: 0;
    transition: opacity 0.3s ease;
}

.card:hover::before {
    opacity: 1;
}

.card-interactive:hover {
    transform: translateY(-2px);
    box-shadow: 0 12px 40px rgba(0, 0, 0, 0.06);
    border-color: rgba(37, 99, 235, 0.1);
}

.section-title {
    font-size: 11px;
    color: var(--text-faint);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    margin-bottom: 18px;
    display: flex;
    align-items: center;
    gap: 8px;
}

.section-title::after {
    content: '';
    flex: 1;
    height: 1px;
    background: var(--surface-3);
}

/* ======================================================================== */
/* 5. МАКЕТ ДАШБОРДА */
/* ======================================================================== */

/* КОЛОНКИ ПЛАВНЫЕ, А НЕ СТУПЕНЯМИ — и это не украшательство.
 *
 * Раньше ширины боковых колонок переключались по @media на 1280, 1100 и 1024.
 * Каждая такая ступень идёт ВВЕРХ с ростом окна, и на её границе средняя
 * колонка проваливалась: при 1280px игра получала 657px, а при 1281px — 582.
 * То есть расширение окна на один пиксель ДЕЛАЛО ИГРУ УЖЕ на семьдесят пять.
 *
 * Ступенями это неизбежно: как ни подбирай числа, скачок ширины рельсов
 * всегда съедает больше, чем добавляет пиксель окна. Поэтому clamp — ширина
 * средней колонки растёт непрерывно, и провалов нет ни на одной ширине от
 * 860 до 1920 (проверено перебором по пикселю).
 *
 * Побочный, но главный выигрыш: при 1280px игре достаётся 694px вместо 657,
 * при 1366 — 758 вместо 663. Двухколоночная раскладка стола включается
 * с 1221px вместо прежних 1440 — то есть на всех обычных ноутбуках. */
.dashboard-layout {
    display: grid;
    grid-template-columns:
        clamp(196px, 14.8vw, 240px)
        minmax(0, 1fr)
        clamp(258px, 19.6vw, 320px);
    gap: clamp(18px, 1.9vw, 28px);
}

/* Правое меню есть не у всех страниц: у профиля и партнёрки оно пустое.
   Без этого колонка всё равно занимала свои 320px, и контент прижимался
   влево, оставляя справа полосу пустого места. */
.sidebar-right:empty {
    display: none;
}

/* Только на широком экране. Без min-width правило перебило бы одноколоночную
   раскладку телефона: у :has() специфичность выше, чем у .dashboard-layout
   в мобильных @media, и порядок в файле тут не спасает.
   851px — на пиксель выше мобильного брейкпоинта (см. mobile.css). */
@media (min-width: 851px) {
    .dashboard-layout:has(.sidebar-right:empty) {
        grid-template-columns: clamp(196px, 14.8vw, 240px) minmax(0, 1fr);
    }
}

/* ======================================================================== */
/* 5.1 НОУТБУЧНАЯ РАСКЛАДКА: 851–1439px                                     */
/* ======================================================================== */

/* ОБЕ БОКОВЫЕ КОЛОНКИ УХОДЯТ ВНИЗ, ИГРА ЗАБИРАЕТ ВСЮ ШИРИНУ.
 *
 * Зачем. Три колонки съедали столько, что средней оставалось меньше 640px, и
 * стол сваливался в один столб: панель настроек во всю ширину, доска под
 * сгибом. Игрок открывал мины и не видел ни одной клетки — ради чего пришёл,
 * оказывалось за нижним краем экрана.
 *
 * Сузить рельсы было нечем: категории с подписями вроде «Ice Fishing» и
 * карточки «Ваши раунды» ниже двухсот пикселей нечитаемы. Поэтому они не
 * ужимаются, а переезжают вниз — там ширины сколько угодно, и обе разложатся
 * в ряд вместо столбца.
 *
 * ПОРЯДОК: игра, история раундов, категории. Игра первой, потому что за ней и
 * пришли. Категории последними — это навигация, к ней возвращаются после игры,
 * а не до.
 *
 * ГРАНИЦА 1439, А НЕ 1279. Сначала я поставил её на 1280: стол там получает
 * 694px, две колонки складываются, формально всё хорошо. Но 694px — это ещё
 * и ширина сетки игр на главной, а в неё влезает ровно две карточки по 337px
 * вместо трёх по 230. Полоса 1280–1439 оказалась худшей из возможных: игре
 * тесно, карточкам просторно. За 1439 таких мест уже нет.
 *
 * ВСЕ СЕЛЕКТОРЫ ЗДЕСЬ НАЧИНАЮТСЯ С .dashboard-layout — И ЭТО ОБЯЗАТЕЛЬНО.
 *
 * Блок стоит в файле РАНЬШЕ базовых правил боковых колонок (.sidebar-right на
 * 1966-й строке, .category-list на 1610-й). Медиазапрос веса не добавляет, у
 * голых имён классов вес тот же — и побеждает то, что ниже по файлу, то есть
 * базовое. Первая версия этого блока так и не сработала: display: grid у
 * правой колонки проиграл базовому display: flex, зато align-items: start
 * применился (его в базовом нет) — и карточки, вместо ряда, встали столбцом
 * шириной по содержимому, оставив справа пустоту.
 *
 * Дополнительный класс поднимает вес и снимает зависимость от порядка строк. */
@media (min-width: 851px) and (max-width: 1439px) {
    .dashboard-layout,
    .dashboard-layout:has(.sidebar-right:empty) {
        grid-template-columns: minmax(0, 1fr);
        gap: 20px;
    }

    .dashboard-layout > .content-area  { order: 1; }
    .dashboard-layout > .sidebar-right { order: 2; }
    .dashboard-layout > .sidebar-left  { order: 3; }

    /* Карточки правого меню — в ряд, а не столбцом: во всю ширину столбец
       растянул бы страницу на два экрана пустотой по бокам. auto-fit, а не
       фиксированное число колонок: карточек на разных страницах разное
       количество, от одной до четырёх. */
    .dashboard-layout > .sidebar-right {
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
        gap: 20px;
        align-items: start;
    }

    /* Карточка тянется на всю высоту своей колонки: у «Ваших раундов» строк
       десяток, у «Статистики» четыре, и без этого нижние края шли лесенкой. */
    .dashboard-layout > .sidebar-right > * { height: 100%; }

    /* Категории лентой. height: 100% из обычной раскладки здесь ни к чему —
       карточка больше не тянется до низа соседней колонки. */
    .dashboard-layout .sidebar-left .card {
        height: auto;
        display: grid;
        grid-template-columns: minmax(0, 1fr) minmax(220px, 280px);
        gap: 18px;
        align-items: center;
    }

    .dashboard-layout .sidebar-left .section-title {
        grid-column: 1 / -1;
        margin-bottom: 0;
    }

    .dashboard-layout .category-list {
        flex-direction: row;
        flex-wrap: wrap;
        gap: 8px;
    }

    /* Пункт становится чипом: подпись рядом со значком, стрелка не нужна — она
       указывала вправо в вертикальном списке, а в ленте не значит ничего. */
    .dashboard-layout .category-item {
        justify-content: flex-start;
        padding: 10px 16px;
        border-radius: 14px;
        border: 1px solid var(--border);
    }

    /* Сдвиг вправо при наведении был уместен в столбце, где пункты стоят друг
       под другом. В ленте он толкает чип на соседа. */
    .dashboard-layout .category-item:hover {
        transform: none;
        background: var(--surface-2);
    }

    .dashboard-layout .category-item::before,
    .dashboard-layout .cat-arrow { display: none; }

    /* Плитка бонуса встаёт справа от ленты и не растягивается: во всю ширину
       она превратилась бы в баннер и перетянула внимание с самих категорий. */
    .dashboard-layout .sidebar-left .promo-block { margin-top: 0; }
}

/* ======================================================================== */
/* 6. БАННЕР */
/* ======================================================================== */

.banner {
    background: linear-gradient(135deg, #1e3a8a 0%, #2563eb 50%, #3b82f6 100%);
    border-radius: 28px;
    padding: 44px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 32px;
    position: relative;
    overflow: hidden;
    color: #fff;
    box-shadow: 0 8px 32px rgba(37, 99, 235, 0.2);
}

.banner::before {
    content: '';
    position: absolute;
    top: -80px;
    right: -40px;
    width: 300px;
    height: 300px;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.15) 0%, transparent 60%);
    border-radius: 50%;
    animation: float 6s ease-in-out infinite;
}

.banner::after {
    content: '';
    position: absolute;
    bottom: -60px;
    left: 20%;
    width: 200px;
    height: 200px;
    background: radial-gradient(circle, rgba(251, 191, 36, 0.2) 0%, transparent 60%);
    border-radius: 50%;
}

@keyframes float {
    0%,
    100% {
        transform: translate(0, 0);
    }
    50% {
        transform: translate(-20px, 20px);
    }
}

.banner-content {
    max-width: 420px;
    position: relative;
    z-index: 2;
}

.banner-title {
    font-size: 36px;
    font-weight: 800;
    margin-bottom: 12px;
    color: #ffffff;
    line-height: 1.2;
    letter-spacing: -0.5px;
    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.banner-desc {
    color: rgba(255, 255, 255, 0.9);
    font-size: 16px;
    margin-bottom: 28px;
    line-height: 1.6;
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}

.banner-image img {
    width: 180px;
    position: relative;
    z-index: 2;
    filter: drop-shadow(0 12px 24px rgba(0, 0, 0, 0.2));
    animation: float 4s ease-in-out infinite;
}

.banner .btn-primary {
    /* Числом, а НЕ токеном: кнопка лежит на баннере, который цветной в
       обеих темах. Токен поверхности сделал бы её тёмной на синем фоне. */
    background: #ffffff;
    color: #2563eb;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
}

/* ======================================================================== */
/* 6.1 ПАРА БАННЕРОВ НА ГЛАВНОЙ                                             */
/*                                                                          */
/* Отдельный компонент, а не вариант .banner: тот же класс используют        */
/* профиль, партнёрка и слоты как шапку страницы, и правки под главную       */
/* поехали бы туда же.                                                      */
/*                                                                          */
/* Слева широкий, справа узкий — пропорция 1.9 : 1. Оба баннера кликабельны  */
/* целиком и сделаны ссылками, а не <div> с onclick: так работают клавиатура,*/
/* средняя кнопка мыши и «открыть в новой вкладке». Именно ссылками, а не    */
/* кнопками: <button> по спецификации принимает только фразовый контент, а   */
/* внутри лежат заголовок и абзац.                                           */
/* ======================================================================== */

.promo-banners {
    display: grid;
    grid-template-columns: minmax(0, 1.9fr) minmax(0, 1fr);
    gap: 20px;
    margin-bottom: 32px;
}

.promo-banner {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 18px;
    min-height: 232px;
    padding: 32px;
    border: none;
    border-radius: 28px;
    overflow: hidden;
    color: #ffffff;
    font-family: inherit;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: transform 0.25s ease, box-shadow 0.25s ease;
}

.promo-banner:hover {
    transform: translateY(-3px);
}

.promo-banner:active {
    transform: translateY(-1px);
}

.promo-banner__body {
    position: relative;
    z-index: 2;
    min-width: 0;
}

.promo-banner__title {
    font-size: clamp(20px, 2vw, 30px);
    font-weight: 800;
    line-height: 1.18;
    letter-spacing: -0.5px;
    margin-bottom: 10px;
    color: #ffffff;
}

.promo-banner__desc {
    font-size: 15px;
    line-height: 1.5;
    color: rgba(255, 255, 255, 0.88);
    margin-bottom: 22px;
    max-width: 34ch;
}

/* Кнопка нарисованная, а не настоящая: весь баннер уже кликабелен, а вложить
   button в a или в другой button нельзя — разметка станет невалидной. */
/* Правило писалось под <span> внутри ссылки — тот наследовал шрифт, курсор
   и отсутствие рамки от родителя. В баннере Telegram это теперь настоящая
   <button>, а ей браузер рисует собственную рамку и системный шрифт, поэтому
   здесь нужны явные сбросы. Ссылкам они не мешают. */
.promo-banner__btn {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    min-height: 44px;
    padding: 12px 26px;
    border: none;
    border-radius: 40px;
    /* Числом, а НЕ токеном: кнопка лежит на баннере, который цветной в
       обеих темах. Токен поверхности сделал бы её тёмной на синем фоне. */
    background: #ffffff;
    font-family: inherit;
    font-size: 14px;
    font-weight: 700;
    line-height: 1;
    cursor: pointer;
    box-shadow: 0 6px 18px rgba(15, 23, 42, 0.14);
    transition: gap 0.2s ease;
}

.promo-banner:hover .promo-banner__btn {
    gap: 14px;
}

.promo-banner__art {
    position: relative;
    z-index: 2;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
}

/* Правило под растровые картинки убрано: в баннерах их больше нет —
   и самолётик, и знак партнёрки теперь svg со своим оформлением ниже.
   Оставленное, оно бы вводило в заблуждение при следующей правке. */

/* --- Telegram --- */

.promo-banner--tg {
    background: linear-gradient(135deg, #1c94cf 0%, #2aabee 52%, #63c8f5 100%);
    box-shadow: 0 10px 30px rgba(42, 171, 238, 0.28);
}

.promo-banner--tg:hover {
    box-shadow: 0 16px 38px rgba(42, 171, 238, 0.34);
}

.promo-banner--tg .promo-banner__btn {
    color: #1c94cf;
}

/* Строка состояния бонуса — то же, что .bonus-tile__stat на странице бонусов,
   но на цветной подложке баннера: там тёмный текст на белом, здесь светлый
   на синем. Стоит между описанием и кнопкой. */
/* НАГРАДА — ПЛАШКОЙ, а не строкой мельче объяснения.

   Была набрана 13-м кеглем под трёхстрочным описанием и терялась совсем,
   хотя «100 ₽» — единственная причина нажать кнопку. Описание объясняет,
   награда убеждает; вес у них должен быть разный. */
.promo-banner__stat {
    display: inline-block;
    margin-bottom: 16px;
    padding: 6px 12px;
    border-radius: 999px;
    background: rgba(255, 255, 255, .16);
    border: 1px solid rgba(255, 255, 255, .2);
    font-size: 13.5px;
    font-weight: 800;
    color: #fff;
    font-variant-numeric: tabular-nums;
}

/* Бонус доступен — подсвечиваем. Модификатор .is-ready общий с плиткой на
   странице бонусов: состояние одно, а блока два, и заводить под каждый свой
   класс значило бы держать их в синхроне вручную. */
/* Бонус доступен — плашка становится тёплой и заметной. Пока идёт проверка
   или бонус уже получен, она остаётся нейтральной. */
.promo-banner__stat.is-ready {
    background: rgba(251, 191, 36, .22);
    border-color: rgba(251, 191, 36, .45);
    color: #fff7e0;
}

/* Кнопка выключается, когда бонус получен или нужно войти. Держите её
   именно <button>: у ссылки состояния :disabled не бывает. */
.promo-banner__btn:disabled {
    opacity: 0.6;
    cursor: default;
    box-shadow: none;
}

.promo-banner:hover .promo-banner__btn:disabled {
    gap: 10px;
}

/* Мягкие блики вместо картинки: своего ассета под Telegram в проекте нет,
   а тянуть ещё один PNG на мегабайт ради подложки незачем. */
.promo-banner--tg::before {
    content: '';
    position: absolute;
    top: -90px;
    right: -30px;
    width: 320px;
    height: 320px;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.22) 0%, transparent 62%);
    border-radius: 50%;
}

.promo-banner--tg::after {
    content: '';
    position: absolute;
    bottom: -70px;
    left: 24%;
    width: 220px;
    height: 220px;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.14) 0%, transparent 62%);
    border-radius: 50%;
}

.promo-banner__plane {
    /* Подстраховка к расширенному viewBox: у svg по умолчанию
       overflow: hidden, и любой выступ за область срезается. */
    overflow: visible;
    width: 132px;
    height: 132px;
    padding: 26px;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.16);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28);
    color: #ffffff;
    animation: float 5s ease-in-out infinite;
}

/* --- Партнёрка --- */

.promo-banner--ref {
    background: linear-gradient(150deg, #5b21b6 0%, #7c3aed 48%, #a855f7 100%);
    box-shadow: 0 10px 30px rgba(124, 58, 237, 0.28);
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    padding: 28px;
}

.promo-banner--ref:hover {
    box-shadow: 0 16px 38px rgba(124, 58, 237, 0.34);
}

.promo-banner--ref .promo-banner__btn {
    color: #6d28d9;
}

.promo-banner--ref .promo-banner__title {
    font-size: clamp(19px, 1.5vw, 23px);
}

/* ЧИСЛА, РАДИ КОТОРЫХ БАННЕР И СТОИТ. Заголовок объясняет, плашки —
   убеждают, поэтому у них свой вес и своя подложка. */
.promo-stats {
    display: flex;
    gap: 10px;
    margin-bottom: 18px;
    position: relative;
    z-index: 1;
}

.promo-stat {
    padding: 8px 12px;
    border-radius: 12px;
    background: rgba(255, 255, 255, .14);
    border: 1px solid rgba(255, 255, 255, .16);
}

.promo-stat b {
    display: block;
    font-size: 20px;
    font-weight: 900;
    line-height: 1.1;
    letter-spacing: -.4px;
    color: #fff;
}

/* Подпись узкая намеренно: в две строки она держит плашку компактной, а
   в одну растянула бы её на пол-баннера. */
.promo-stat span {
    display: block;
    margin-top: 2px;
    max-width: 108px;
    font-size: 11px;
    line-height: 1.3;
    color: rgba(255, 255, 255, .8);
}

.promo-banner--ref .promo-banner__desc {
    font-size: 13.5px;
    margin-bottom: 18px;
}

/* СВЕЧЕНИЕ ВМЕСТО ЛУЧЕЙ.

   Здесь был веер из тонких белых полос (repeating-conic-gradient). Он
   читается как оформление начала десятых, спорит с текстом за внимание и
   на слабых экранах рябит — тонкие лучи ложатся на пиксельную сетку
   неровно.

   Два мягких пятна дают ту же глубину и не отнимают взгляд у чисел. Тот же
   приём, что на карточке уровня, — баннеры и карточки должны выглядеть
   одной рукой сделанными. */
.promo-banner--ref::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
        radial-gradient(60% 80% at 88% 12%, rgba(255, 255, 255, .20) 0%, transparent 60%),
        radial-gradient(70% 90% at 6% 96%, rgba(56, 189, 248, .18) 0%, transparent 62%);
    pointer-events: none;
}

/* Знак уводим в правый нижний угол: колонка узкая, в строку с текстом он
   не встаёт — отнял бы у заголовка половину ширины. */
.promo-banner--ref .promo-banner__art {
    position: absolute;
    right: 10px;
    bottom: 10px;
    z-index: 1;
}

/*
 * ТРЕБОВАНИЯ К ИЛЛЮСТРАЦИИ ДЛЯ ЭТОГО БАННЕРА
 *
 * Блок сейчас пуст: контурный svg рядом с насыщенным фиолетовым фоном
 * выглядел бедно, а прежний png с монетой был нарисован в другой манере,
 * чем самолётик соседнего баннера.
 *
 *   формат   — PNG с прозрачным фоном (не JPG: фон баннера градиентный)
 *   размер   — 480×480, показывается как 116px, запас на плотные экраны
 *   вес      — до 120 КБ, иначе баннер тормозит загрузку главной
 *   свет     — сверху слева, как у 23_Подарок.png и 25_Фишка.png
 *   палитра  — тёплая (золото, оранжевый): фон фиолетовый #7c3aed,
 *              холодные оттенки на нём теряются
 *   поля     — 8% пустоты по краям, иначе при обрезке углом срежется край
 *
 * Что изобразить: две-три фигурки людей и поток монет между ними —
 * баннер про друзей, а не про деньги вообще. Прежняя одинокая монета
 * этого не передавала.
 *
 * Когда картинка появится — положить в /images и вернуть <img> в
 * .promo-banner__art (app.js, баннер promo-banner--ref), плюс правило
 * ширины ниже.
 */
.promo-banner--ref .promo-banner__art img {
    width: 116px;
    filter: drop-shadow(0 14px 26px rgba(15, 23, 42, 0.28));
    animation: float 5s ease-in-out infinite;
    /* Со сдвигом фазы: две картинки, качающиеся в такт с самолётиком,
       выглядели бы как сбой отрисовки, а не как оживление. */
    animation-delay: -1.6s;
}

/* Планшет: узкая колонка перестаёт вмещать заголовок в две строки */
@media (max-width: 1100px) {
    .promo-banners {
        grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
        gap: 16px;
    }

    .promo-banner {
        min-height: 210px;
        padding: 26px;
    }

    .promo-banner__plane {
        width: 108px;
        height: 108px;
        padding: 22px;
    }

    .promo-banner--ref .promo-banner__art img { width: 98px; }
}

.banner .btn-primary:hover {
    background: #f8fafc;
    transform: translateY(-2px);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
}

.banner .btn-arrow {
    color: #2563eb;
}

/* ======================================================================== */
/* 7. СЕКЦИЯ ИГР (Cards) */
/* ======================================================================== */

/* КОЛОНКИ ПО ШИРИНЕ САМОЙ СЕТКИ, А НЕ ПО ШИРИНЕ ОКНА.
 *
 * Раньше число колонок задавалось медиазапросами: четыре по умолчанию, две
 * ниже 1024px. Это работало, пока средняя колонка макета была узкой полосой
 * между двумя рельсами — её ширина шла за шириной окна.
 *
 * С раскладкой 851–1279px (см. блок 5.1) рельсы уходят вниз, и контент
 * занимает всю ширину. Связь порвалась: при окне 1024px сетке достаётся уже
 * не 458px, а 951 — и две колонки давали карточки по 465px, вдвое крупнее
 * задуманного. Пропорция 3/4 растягивала их до 620px в высоту, и на экран
 * помещались полторы игры.
 *
 * auto-fill сам считает, сколько колонок влезет: карточка держится около
 * 260–300px при любой ширине сетки, и правило переживает любую перестановку
 * колонок макета — ему всё равно, откуда взялась ширина.
 *
 * min(260px, 100%) вместо голых 260px: на очень узком контейнере минимум
 * колонки не должен оказаться больше самого контейнера, иначе сетка вылезет
 * за край. */
.games-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(230px, 100%), 1fr));
    gap: 20px;
    margin-bottom: 32px;
}

.game-card {
    aspect-ratio: 3 / 4;
    border-radius: 20px;
    overflow: hidden;
    cursor: pointer;
    position: relative;
    transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.04);
    border: 1px solid var(--border-soft);
}

.game-card:hover {
    transform: translateY(-6px);
    box-shadow: 0 20px 50px rgba(37, 99, 235, 0.12);
    border-color: rgba(37, 99, 235, 0.15);
}

/* ВЕРХНИЙ БЛИК — тонкая светлая дуга по краю карточки.
 *
 * Появился, потому что карточки выглядели плоскими наклейками: прямоугольник
 * с картинкой и текстом, без единого признака объёма. Блик по верхней кромке
 * — самый дешёвый способ дать его: один псевдоэлемент, никаких лишних узлов
 * в разметке и никакой работы для браузера при прокрутке.
 *
 * pointer-events: none ОБЯЗАТЕЛЕН. Слой лежит поверх всей карточки, включая
 * её кликабельную площадь; без этого он перехватывал бы нажатия, и половина
 * карточки перестала бы открывать игру. */
.game-card::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    pointer-events: none;
    z-index: 3;
    background: linear-gradient(to bottom,
        rgba(255, 255, 255, 0.14) 0%,
        rgba(255, 255, 255, 0) 22%);
    opacity: 0.9;
    transition: opacity 0.35s ease;
}

.game-card:hover::after {
    opacity: 1;
}

.game-card img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    position: absolute;
    inset: 0;
    transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}

.game-card:hover img {
    transform: scale(1.06);
}

/* ЗАТЕМНЕНИЕ ПОД ТЕКСТОМ.
 *
 * Стало плотнее и ниже по карточке — не ради красоты, а потому что текста
 * теперь три строки вместо одной: название, описание и плашки с числами.
 * Прежний градиент рассчитывался на один заголовок и к середине уже
 * растворялся, из-за чего описание ложилось прямо на картинку и на светлых
 * участках (лёд у Ice Fishing, блики у слотов) читалось с трудом.
 *
 * Две остановки у самого низа (0% и 32%) держат ровную плотную подложку под
 * блоком текста, дальше затемнение быстро сходит на нет, открывая картинку.
 * Так текст читается при любой подложке, а иллюстрация остаётся видна —
 * ради неё карточка и сделана. */
.game-card-overlay {
    position: absolute;
    inset: 0;
    background: linear-gradient(to top,
        rgba(10, 15, 30, 0.94) 0%,
        rgba(10, 15, 30, 0.88) 32%,
        rgba(15, 23, 42, 0.45) 58%,
        rgba(15, 23, 42, 0.10) 80%,
        rgba(15, 23, 42, 0) 100%);
    z-index: 1;
    transition: background 0.35s ease;
}

.game-card:hover .game-card-overlay {
    background: linear-gradient(to top,
        rgba(10, 15, 30, 0.96) 0%,
        rgba(10, 15, 30, 0.92) 38%,
        rgba(15, 23, 42, 0.55) 62%,
        rgba(15, 23, 42, 0.18) 84%,
        rgba(15, 23, 42, 0.02) 100%);
}

.game-card-content {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    padding: 20px;
    z-index: 2;
    color: #ffffff;
    transform: translateY(0);
    transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}

.game-card:hover .game-card-content {
    transform: translateY(-4px);
}

/* НАЗВАНИЕ. Крупнее и плотнее прежнего: под ним теперь две строки помельче,
   и разница в размере — то единственное, что задаёт порядок чтения. Когда
   заголовок был 18px, а описание 12.5px, блок читался как сплошная масса. */
.game-card h4 {
    font-size: 20px;
    font-weight: 800;
    color: #ffffff;
    margin-bottom: 4px;
    letter-spacing: -0.4px;
    line-height: 1.15;
    text-shadow: 0 2px 8px rgba(0, 0, 0, 0.55);
}

/* ОПИСАНИЕ РЕЖИМА — одна строка под названием.
 *
 * Появилось вместе с характеристиками ниже и по той же причине: под
 * названием была пустая полоса. Строка отвечает на вопрос «а что здесь
 * вообще делают», который у половины наших режимов не решается названием:
 * «Bubbles» и «Кено» не говорят новичку ничего.
 *
 * ОДНА СТРОКА И БЕЗ ПЕРЕНОСА. Карточка узкая, и описание в два-три ряда
 * съело бы картинку, ради которой она и сделана. Тексты подобраны так,
 * чтобы влезать целиком; для узких экранов на всякий случай стоит
 * многоточие. */
.game-card .game-desc {
    font-size: 12px;
    line-height: 1.35;
    color: rgba(226, 232, 240, 0.72);
    margin-bottom: 10px;
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Строка под описанием: счётчик игроков и характеристики режима.
 *
 * min-height ЗДЕСЬ БОЛЬШЕ НЕ НУЖЕН, и это не упрощение, а следствие.
 * Он резервировал высоту под плашку счётчика, которая появляется и исчезает
 * по данным с сервера, — иначе название дёргалось бы при каждом обновлении
 * онлайна. Но за столом обычно пусто, плашка скрыта, и зарезервированные
 * 22px превращались в пустую полосу на всех шести карточках сразу.
 *
 * Теперь рядом всегда стоят характеристики (paintModeStats в app.js), и
 * высоту держат они — настоящим содержимым, а не пустотой.
 *
 * flex-wrap обязателен: на узкой карточке счётчик и характеристики не
 * помещаются в ряд, и без переноса второй элемент вылезал бы за край. */
.game-card .game-meta {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px 8px;
    font-size: 12px;
    color: rgba(255, 255, 255, 0.8);
    font-weight: 500;
    margin-bottom: 10px;
}

/* ХАРАКТЕРИСТИКИ РЕЖИМА — контейнер. Сам по себе невидим, всё оформление
   на плашках внутри. */
.game-card .game-stat {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    flex-wrap: wrap;
}

.game-card .game-stat[hidden] {
    display: none;
}

/* ПЛАШКА С ЧИСЛОМ: «до ×5.1M», «от 10 ₽».
 *
 * Оформлена ИНАЧЕ, чем счётчик игроков рядом, и разница намеренная.
 * У счётчика светлая заливка и пульсирующая точка — это значит «число
 * живое, оно меняется прямо сейчас». Здесь постоянные свойства игры:
 * контур без заливки, ровный тон, никакого движения. Сделай мы их
 * одинаковыми — счётчик потерял бы единственный признак, которым
 * отличается от статики.
 *
 * Тёмная подложка, а не светлая: под плашками лежит картинка, и на светлых
 * участках (лёд, блики) белый контур без фона исчезал бы. */
.game-card .game-chip {
    display: inline-flex;
    align-items: center;
    padding: 3px 8px;
    border-radius: var(--radius-pill);
    background: rgba(15, 23, 42, 0.42);
    border: 1px solid rgba(255, 255, 255, 0.16);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    font-size: 11px;
    font-weight: 700;
    color: rgba(255, 255, 255, 0.92);
    letter-spacing: 0.2px;
    white-space: nowrap;
    line-height: 1.4;
}

/* Закрытый режим. Красным не красим: техработы — это не ошибка игрока и не
   поломка, а плановое состояние, и пугать им не за что. */
.game-card .game-stat.is-off {
    display: inline-flex;
    padding: 3px 10px;
    border-radius: var(--radius-pill);
    background: rgba(180, 83, 9, 0.45);
    border: 1px solid rgba(253, 224, 71, 0.35);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    font-size: 11px;
    font-weight: 700;
    color: rgba(254, 240, 138, 0.98);
    letter-spacing: 0.2px;
}

/* ЖИВОЙ СЧЁТЧИК ИГРОКОВ.
 *
 * Пришёл на место двух выдуманных вещей: зашитого в разметку числа
 * («2 450», которое не менялось никогда) и бейджа HOT/TOP/NEW/FAST,
 * расставленного на глаз — HOT стоял сразу у двух игр, TOP ещё у двух.
 * Показывать нарисованные отличия там, где у вас есть настоящие данные,
 * значит обесценивать и эти данные тоже.
 *
 * Точка пульсирует: это признак того, что число живое и обновляется, а не
 * ещё одна декоративная плашка. */
.game-card .game-online {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 10px 3px 8px;
    border-radius: var(--radius-pill);
    background: rgba(255, 255, 255, 0.18);
    backdrop-filter: blur(8px);
    border: 1px solid rgba(255, 255, 255, 0.25);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.2px;
    white-space: nowrap;
}

/* [hidden] сам по себе даёт display: none, но объявленный выше inline-flex
   его перебивает — свойство display у правила с классом сильнее. Поэтому
   скрытие приходится задавать явно. */
.game-card .game-online[hidden] {
    display: none;
}

.game-card .game-online::before {
    content: '';
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #4ade80;
    box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.7);
    animation: game-online-pulse 2.4s ease-out infinite;
}

@keyframes game-online-pulse {
    0%   { box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.6); }
    70%  { box-shadow: 0 0 0 6px rgba(74, 222, 128, 0); }
    100% { box-shadow: 0 0 0 0 rgba(74, 222, 128, 0); }
}

/* Людям, которым движение мешает, анимация не нужна — точка просто горит. */
@media (prefers-reduced-motion: reduce) {
    .game-card .game-online::before { animation: none; }
}

.game-card .play-hint {
    font-size: 13px;
    color: #ffffff;
    font-weight: 600;
    opacity: 0;
    transform: translateY(8px);
    transition: all 0.3s ease;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--accent);
    padding: 6px 14px;
    border-radius: 20px;
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3);
}

.game-card:hover .play-hint {
    opacity: 1;
    transform: translateY(0);
}

/* ======================================================================== */
/* 8. СТАТИСТИКА */
/* ======================================================================== */

/* Блоки «Рекордные выигрыши» и «Онлайн сейчас» с графиком удалены вместе с
   их разметкой. Рекорды были выдуманы и прибиты в код, график рисовал линию,
   которая ничего не решала. На их месте — лента настоящих раундов. */

.feed-card { grid-column: 1 / -1; }

.feed-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
}

/* Число онлайна переехало сюда из отдельной карточки. Рядом с лентой оно
   к месту: «сколько нас» и «во что играют» читаются одним взглядом, и ради
   одной цифры больше не нужен целый блок. */
.feed-online {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    flex: none;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--text-dim);
}

.feed-online b { color: var(--text); font-variant-numeric: tabular-nums; }

/* Точка дышит — это единственное, что говорит «данные живые». */
.feed-online__dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: #10b981;
    box-shadow: 0 0 0 0 rgba(16, 185, 129, .5);
    animation: feedPulse 2s ease-out infinite;
}

@keyframes feedPulse {
    0%   { box-shadow: 0 0 0 0 rgba(16, 185, 129, .5); }
    70%  { box-shadow: 0 0 0 6px rgba(16, 185, 129, 0); }
    100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); }
}

.feed-list { margin-top: 14px; }

/* СТРОКА ЛЕНТЫ.

   ТРИ КОЛОНКИ, А НЕ ЧЕТЫРЕ. Раньше значок, имя, множитель и суммы стояли
   отдельными колонками, и на широком экране между именем и деньгами зиял
   провал в пол-экрана: глаз перепрыгивал его на каждой строке.

   Теперь множитель и суммы собраны в ОДИН блок справа. Пустота осталась, но
   стала осмысленной: слева «кто и во что», справа «чем кончилось», и между
   ними воздух, а не дыра посреди данных. */
.feed-row {
    display: grid;
    grid-template-columns: 38px minmax(0, 1fr) auto;
    align-items: center;
    gap: 12px;
    padding: 9px 12px;
    border-radius: 14px;
    transition: background .15s ease;
}

.feed-row:hover { background: var(--surface-2); }

/* Выигрышная строка подсвечена целиком и помечена полосой слева. Без этого
   выигрыши приходилось выискивать по цвету одной цифры в правом краю. */
.feed-row.is-win {
    background: linear-gradient(90deg, rgba(16, 185, 129, .09) 0%, rgba(16, 185, 129, 0) 70%);
    box-shadow: inset 3px 0 0 #10b981;
}

.feed-row.is-win:hover {
    background: linear-gradient(90deg, rgba(16, 185, 129, .15) 0%, rgba(16, 185, 129, .02) 70%);
}

/* Значок режима — из того же набора, что в меню (GAME_ICONS). Лента
   становится просматриваемой: режим узнаётся формой, не читая подпись. */
.feed-row__icon {
    display: grid;
    place-items: center;
    width: 38px;
    height: 38px;
    border-radius: 12px;
    background: var(--surface-2);
    border: 1px solid var(--border);
    color: var(--text-dim);
}

.feed-row__icon svg { width: 20px; height: 20px; }

.feed-row.is-win .feed-row__icon {
    background: rgba(16, 185, 129, .14);
    border-color: rgba(16, 185, 129, .3);
    color: #10b981;
}

.feed-row__who { display: flex; flex-direction: column; min-width: 0; gap: 1px; }

.feed-row__who b {
    font-size: 13.5px;
    font-weight: 700;
    color: var(--text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.feed-row__who span { font-size: 11.5px; color: var(--text-faint); }

/* ПРАВЫЙ БЛОК: множитель и суммы вместе. */
.feed-row__right {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    white-space: nowrap;
}

/* Множитель — плашка, а не голый текст: он самое заметное число в строке и
   должен выглядеть наградой. Пустая у проигрышей, но место держит, иначе
   суммы в соседних строках вставали бы на разной вертикали. */
.feed-row__mult {
    min-width: 62px;
    text-align: center;
    padding: 3px 0;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 800;
    font-variant-numeric: tabular-nums;
    color: #10b981;
    background: rgba(16, 185, 129, .12);
}

.feed-row__mult:empty { background: transparent; }

.feed-row__sums {
    display: inline-flex;
    align-items: baseline;
    gap: 8px;
    font-variant-numeric: tabular-nums;
}

.feed-row__bet { font-size: 13px; font-weight: 600; color: var(--text-dim); }
.feed-row__arrow { font-style: normal; font-size: 11px; color: var(--text-faint); }

/* Проигрыш — прочерк и приглушённый, выигрыш — зелёный и жирный. Скрывать
   проигрыши нельзя: лента из одних плюсов это те же выдуманные рекорды,
   только с настоящими именами. */
.feed-row__win {
    font-size: 14px;
    font-weight: 800;
    color: var(--text-faint);
    min-width: 82px;
    text-align: right;
}

.feed-row.is-win .feed-row__win { color: #10b981; }

/* На узком экране множитель уходит: суммы важнее, а вместе они не влезают. */
@media (max-width: 560px) {
    .feed-row { grid-template-columns: 34px minmax(0, 1fr) auto; gap: 9px; }
    .feed-row__mult { display: none; }
    .feed-row__win { min-width: 0; }
}

/* ======================================================================== */
/* 9. КАТЕГОРИИ (ЛЕВОЕ МЕНЮ) */
/* ======================================================================== */

.sidebar-left .card {
    padding: 20px;
    height: 100%;
}

.category-list {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.category-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px 14px;
    border-radius: 16px;
    cursor: pointer;
    transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
    position: relative;
}

.category-item::before {
    content: '';
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    width: 3px;
    height: 0;
    background: var(--accent);
    border-radius: 0 3px 3px 0;
    transition: height 0.2s ease;
}

.category-item:hover {
    background: var(--surface-2);
    transform: translateX(4px);
}

.category-item.active {
    background: var(--surface-accent);
}

.category-item.active::before {
    height: 60%;
}

.cat-left {
    display: flex;
    align-items: center;
    gap: 14px;
    font-size: 14px;
    font-weight: 500;
    color: var(--text);
    position: relative;
    z-index: 1;
}

.cat-left img {
    width: 28px;
    height: 28px;
    object-fit: contain;
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.05));
    transition: transform 0.2s ease;
}

.category-item:hover .cat-left img {
    transform: scale(1.1);
}

/* Держатель значка режима. Сам svg вставляет paintGameIcons() из общего
   набора GAME_ICONS — здесь только место под него.

   flex: none обязателен: иконка не должна сжиматься, когда название длинное
   («Ice Fishing» шире остальных). */
.cat-icon {
    display: block;
    width: 28px;
    height: 28px;
    flex: none;
    color: var(--accent);
    transition: transform 0.2s ease;
}

.cat-icon svg { width: 100%; height: 100%; display: block; }

.category-item:hover .cat-icon {
    transform: scale(1.1);
}

.cat-arrow {
    color: var(--text-faint);
    font-size: 16px;
    transition: all 0.2s ease;
    opacity: 0;
    transform: translateX(-8px);
}

.category-item:hover .cat-arrow,
.category-item.active .cat-arrow {
    opacity: 1;
    transform: translateX(0);
}

.category-item.active .cat-arrow {
    color: var(--accent);
}

/* Метка «скоро» у режимов в разработке */
.cat-soon {
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.4px;
    text-transform: uppercase;
    color: var(--text-faint);
    background: var(--surface-3);
    border-radius: 999px;
    padding: 3px 8px;
    white-space: nowrap;
}

/* ======================================================================== */
/* 9.1 КНОПКА ЕЖЕДНЕВНОГО БОНУСА */
/* ======================================================================== */

.promo-block {
    /* цвета вынесены в переменные: состояние «спинов нет» перекрашивает карточку,
       не переопределяя сам градиент */
    --promo-a: #3b82f6;
    --promo-b: #1d4ed8;
    position: relative;
    display: flex;
    flex-direction: column;
    gap: 14px;
    width: 100%;
    margin-top: 20px;
    padding: 16px;
    border: 0;
    border-radius: 20px;
    background: linear-gradient(140deg, var(--promo-a) 0%, var(--promo-b) 100%);
    box-shadow: 0 12px 26px -12px rgba(29, 78, 216, 0.75);
    font: inherit;
    text-align: left;
    color: #ffffff;
    cursor: pointer;
    overflow: hidden;
    isolation: isolate;
    transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1),
                box-shadow 0.25s cubic-bezier(0.4, 0, 0.2, 1),
                background 0.3s ease;
}

/* мягкий блик в углу — псевдоэлементом, чтобы не плодить узлы в разметке */
.promo-block::before {
    content: '';
    position: absolute;
    top: -55px;
    right: -45px;
    width: 150px;
    height: 150px;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.38) 0%, transparent 68%);
    pointer-events: none;
    transition: transform 0.35s ease;
}

.promo-block:hover {
    transform: translateY(-3px);
    box-shadow: 0 18px 34px -14px rgba(29, 78, 216, 0.85);
}

.promo-block:hover::before {
    transform: scale(1.35);
}

.promo-block:active {
    transform: translateY(-1px) scale(0.99);
}

.promo-block:focus-visible {
    outline: 3px solid #bfdbfe;
    outline-offset: 2px;
}

/* пробегающий блик */
.promo-shine {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    width: 55%;
    background: linear-gradient(100deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%);
    transform: translateX(-150%) skewX(-18deg);
    pointer-events: none;
    animation: promoShine 5s ease-in-out infinite;
}

@keyframes promoShine {
    0%, 62%   { transform: translateX(-150%) skewX(-18deg); }
    92%, 100% { transform: translateX(320%) skewX(-18deg); }
}

/* колонка, а не строка: в сайдбаре ~200px заголовок рядом с иконкой переносится */
.promo-top {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
    min-width: 0;
}

.promo-icon {
    flex: none;
    display: grid;
    place-items: center;
    width: 44px;
    height: 44px;
    border-radius: 14px;
    background: rgba(255, 255, 255, 0.18);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28);
}

.promo-icon svg {
    width: 26px;
    height: 26px;
    color: #fff;
    transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}

/* Было .promo-icon img — правило перестало срабатывать, когда картинку
   заменили на svg, и подсказка при наведении молча пропала. Ошибки такое
   не даёт: селектор просто перестаёт находить узлы. */
.promo-block:hover .promo-icon svg {
    transform: scale(1.12) rotate(-6deg);
}

/* пульс — только когда вращения реально есть */
.promo-block.is-ready .promo-icon {
    animation: promoPulse 2.6s ease-in-out infinite;
}

@keyframes promoPulse {
    0%, 100% { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28), 0 0 0 0 rgba(255, 255, 255, 0.5); }
    55%      { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.38), 0 0 0 10px rgba(255, 255, 255, 0); }
}

.promo-text {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.promo-title {
    font-size: 14px;
    font-weight: 800;
    line-height: 1.2;
    color: #ffffff;
}

.promo-desc {
    font-size: 11.5px;
    line-height: 1.3;
    color: rgba(255, 255, 255, 0.82);
}

/* Кнопка НЕ берёт цвета из палитры темы — и это принципиально.
 *
 * Здесь стояло background: var(--surface); color: var(--accent-hover). В
 * светлой теме выходила белая таблетка с синей надписью, в тёмной —
 * #151b25 на синей карточке, то есть почти чёрная дыра с голубым текстом
 * поверх. Карточка-то синяя ВСЕГДА, она не следует за темой; значит и
 * кнопка на ней не должна. Токены страницы тут просто не к месту.
 *
 * Не заменяйте эти числа на переменные обратно, не проверив обе темы. */
.promo-cta {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 10px 12px;
    border-radius: 12px;
    background: #ffffff;
    color: #1e40af;
    font-size: 12.5px;
    font-weight: 800;
    box-shadow: 0 6px 14px -6px rgba(2, 32, 90, 0.55);
    transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.promo-block:hover .promo-cta {
    transform: translateY(-1px);
    box-shadow: 0 9px 18px -7px rgba(2, 32, 90, 0.65);
}

.promo-cta__count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    height: 20px;
    padding: 0 6px;
    border-radius: 999px;
    background: #1e40af;
    color: #ffffff;
    font-size: 11px;
    font-weight: 800;
    font-variant-numeric: tabular-nums;
}

/* [hidden] сам по себе проигрывает display из правила выше */
.promo-cta__count[hidden] {
    display: none;
}

/* вращений не осталось — карточка гаснет, но остаётся кликабельной */
.promo-block.is-empty {
    --promo-a: #94a3b8;
    --promo-b: #64748b;
    box-shadow: 0 10px 22px -14px rgba(71, 85, 105, 0.8);
}

.promo-block.is-empty:hover {
    box-shadow: 0 14px 28px -14px rgba(71, 85, 105, 0.85);
}

.promo-block.is-empty .promo-shine {
    display: none;
}

.promo-block.is-empty .promo-cta {
    background: rgba(255, 255, 255, 0.18);
    color: #ffffff;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
}

@media (prefers-reduced-motion: reduce) {
    .promo-shine,
    .promo-block.is-ready .promo-icon {
        animation: none;
    }
    .promo-block,
    .promo-block::before,
    .promo-cta,
    .promo-icon svg {
        transition: none;
    }
    .promo-block:hover {
        transform: none;
    }
}

/* ======================================================================== */
/* 10. ПРАВАЯ КОЛОНКА */
/* ======================================================================== */

.sidebar-right {
    display: flex;
    flex-direction: column;
    gap: 24px;
}

/* ТРИ В РЯД, А НЕ ЧЕТЫРЕ. Режимов стало шесть, и при четырёх колонках вторая
   строка выходила полупустой — две плитки и дыра. Три на два ложатся ровно, и
   седьмой режим начнёт третью строку так же аккуратно. */
.quick-start-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin-top: 16px;
}

.quick-item {
    display: block;
    width: 100%;
    font-family: inherit;
    text-align: center;
    cursor: pointer;
    padding: 14px 6px;
    border-radius: 16px;
    transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
    background: var(--surface-2);
    border: 1px solid transparent;
}

.quick-item:hover {
    background: var(--surface);
    border-color: var(--border);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.04);
    transform: translateY(-3px);
}

/* Держатель значка: сам svg вставляет JS, и размер задаётся здесь, а не в
   разметке — иначе он повторялся бы в каждом месте вставки. */
.quick-item__icon {
    display: block;
    width: 34px;
    height: 34px;
    margin: 0 auto 8px auto;
    color: var(--text-dim);
    transition: transform 0.2s ease, color 0.2s ease;
}

.quick-item__icon svg { width: 100%; height: 100%; display: block; }

/* На наведении значок красится акцентом и чуть подрастает. Поворот, который
   был у картинок, убран: контурная линия при повороте на 5° выглядит
   расфокусированной — сглаживание ложится на диагональ. */
.quick-item:hover .quick-item__icon {
    transform: scale(1.1);
    color: var(--accent);
}

.quick-item span {
    font-size: 13px;
    font-weight: 600;
    color: var(--text-2);
    transition: color 0.2s ease;
}

.quick-item:hover span {
    color: var(--accent);
}

.level-card {
    padding-bottom: 24px;
}

.level-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 12px;
}

.level-title {
    font-size: 24px;
    font-weight: 800;
    color: var(--text);
    letter-spacing: -0.5px;
}

.level-sub {
    font-size: 13px;
    color: var(--text-faint);
    font-weight: 500;
    margin-top: 2px;
}

/* Держатель значка ступени. Внутрь JS кладёт svg по ключу уровня, поэтому
   размеры и цвет заданы снаружи: сам значок ничего о своём месте не знает. */
.level-icon {
    display: block;
    width: 60px;
    height: 60px;
    flex: none;
    color: var(--accent);
    transition: transform 0.3s ease;
}

.level-icon svg { width: 100%; height: 100%; display: block; }

.level-card:hover .level-icon {
    transform: rotate(-8deg) scale(1.05);
}

.progress-container {
    height: 8px;
    background: var(--border);
    border-radius: 10px;
    position: relative;
    overflow: hidden;

    /* Вдавленность внутренней тенью. На тёмной теме её попросту не видно —
       и это нормально: дорожку там отделяет от карточки сам цвет --border,
       который светлее подложки. Оставлено ради светлой темы. */
    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.05);
}

/*
 * Заливка прогресса.
 *
 * Градиент собран ИЗ ТОКЕНОВ, а не из чисел, — в отличие от баннеров. Разница
 * принципиальная: баннер сам по себе цветной прямоугольник и одинаков в обеих
 * темах, а эта полоска лежит на карточке и обязана светлеть вместе с ней.
 * Прежние #2563eb → #7c3aed на тёмном фоне выглядели глухо.
 *
 * Два стопа вместо трёх: третьим стоял #a855f7, у которого нет пары в тёмной
 * палитре. Пара «акцент → фиолетовый» даёт тот же переход и меняется вместе
 * с темой.
 */
.progress-fill {
    height: 100%;
    background: linear-gradient(90deg, var(--accent) 0%, var(--violet) 100%);
    border-radius: 10px;
    width: 60%;
    position: relative;

    /* ОБРЕЗКА ОБЯЗАТЕЛЬНА. Блик ниже (::after) ездит по полосе на ±100%
       ширины, и без неё он выезжал за край заливки: обрезала его только
       дорожка целиком, то есть вместе с ПУСТОЙ частью.

       На светлой теме этого не видно — пустая дорожка сама светлая. На
       тёмной белая полоса ехала по тёмному фону и читалась как посторонняя
       засветка справа от заливки. */
    overflow: hidden;

    /* Свечение под полосой. Числом намеренно: rgba не умеет брать канал из
       var(), а заводить ради одной тени отдельный токен --accent-rgb — лишнее.
       Синий ореол уместен под синей полосой в обеих темах. */
    box-shadow: 0 0 12px rgba(37, 99, 235, 0.3);
    animation: pulse-glow 2s ease-in-out infinite;
}

.progress-fill::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    /* Блик приглушён: 0.4 подбирались на светлой теме, где он ложится на
       светлую подложку и почти теряется. На тёмной та же прозрачность даёт
       заметно более резкую вспышку — фон под ней темнее. */
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.26), transparent);
    animation: shimmer 2.6s infinite;
}

@keyframes shimmer {
    0% {
        transform: translateX(-100%);
    }
    100% {
        transform: translateX(100%);
    }
}

@keyframes pulse-glow {
    0%,
    100% {
        box-shadow: 0 0 12px rgba(37, 99, 235, 0.3);
    }
    50% {
        box-shadow: 0 0 20px rgba(37, 99, 235, 0.5);
    }
}

/* ======================================================================== */
/* 11. БОНУСЫ В ПРАВОМ МЕНЮ ГЛАВНОЙ                                         */
/*                                                                          */
/* Заняли место блока «События». Там лежали три выдуманные акции,           */
/* одинаковые у всех: «Турнир Недели», «Кэшбэк выходного дня — вернём до    */
/* 20%» и «VIP розыгрыш». Таймеры («2д 14ч») были обычным текстом и не      */
/* шли, ссылка «Все» вела в href="#", а обещание про 20% расходилось с      */
/* настоящим кешбэком — 3% в месяц и только на ВИП.                          */
/* ======================================================================== */

.home-bonus__main {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}

.home-bonus__num {
    font-size: 32px;
    font-weight: 900;
    line-height: 1;
    letter-spacing: -1px;
    color: var(--text);
    font-variant-numeric: tabular-nums;
}

.home-bonus__label {
    margin-top: 4px;
    font-size: 12.5px;
    color: var(--text-faint);
}

.home-bonus__icon {
    width: 42px;
    height: 42px;
    flex: none;
    color: var(--accent);
}

.home-bonus__hint {
    margin-top: 14px;
    padding: 9px 12px;
    border-radius: 10px;
    background: var(--surface-2);
    border: 1px solid var(--border);
    font-size: 12.5px;
    line-height: 1.45;
    color: var(--text-dim);
}

/* Вращения есть — подсвечиваем, это призыв к действию. Та же зелёная гамма,
   что у готового к прокрутке колеса на странице бонусов. */
.home-bonus__hint.is-ready {
    background: var(--ok-soft);
    border-color: var(--ok);
    color: var(--ok);
    font-weight: 600;
}

/* ======================================================================== */
/* 12. VIP КАРТОЧКА */
/* ======================================================================== */

/* КАРТОЧКА СЛЕДУЮЩЕГО УРОВНЯ.

   Была плоской заливкой с алмазом по центру и абзацем текста. Стало:
   главное число крупно, полоса под ним, награда строкой, алмаз — крупным
   украшением в углу, наполовину за краем.

   Текст выровнен ВЛЕВО, а не по центру. По центру читается плакат, а тут
   данные: сумма, полоса и награда должны начинаться от одной вертикали,
   иначе глаз ищет каждую заново. */
.vip-card {
    position: relative;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
    color: #fff;
    border: 1px solid rgba(129, 140, 248, .28);
    background:
        radial-gradient(120% 90% at 100% 0%, rgba(129, 140, 248, .45) 0%, transparent 55%),
        radial-gradient(90% 70% at 0% 100%, rgba(56, 189, 248, .18) 0%, transparent 60%),
        linear-gradient(150deg, #1e1b4b 0%, #312e81 55%, #3730a3 100%);
    box-shadow: 0 12px 36px rgba(49, 46, 129, .35);
}

/* Мягкое свечение сверху справа — оттуда же, откуда «падает свет» на
   алмаз. Заменило вращавшийся круг: тот крутился вечно и на слабых
   телефонах грел батарею ради эффекта, которого почти не видно. */
.vip-card::before {
    content: '';
    position: absolute;
    top: -70px;
    right: -60px;
    width: 220px;
    height: 220px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 255, 255, .16) 0%, transparent 65%);
    pointer-events: none;
}

/* Алмаз крупный и наполовину за краем: так он читается как фактура карточки,
   а не как картинка, которую поставили по центру, потому что было пусто. */
.vip-gem {
    position: absolute;
    top: -18px;
    right: -22px;
    width: 132px;
    height: 132px;
    color: #fff;
    opacity: .13;
    pointer-events: none;
}

.vip-eyebrow {
    position: relative;
    z-index: 1;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .8px;
    text-transform: uppercase;
    color: rgba(199, 210, 254, .75);
}

.vip-title {
    position: relative;
    z-index: 1;
    margin-top: 2px;
    font-size: 20px;
    font-weight: 800;
    letter-spacing: -.3px;
    color: #fff;
}

/* ГЛАВНОЕ ЧИСЛО. Раньше оно стояло третьим по счёту внутри абзаца и
   терялось между двумя другими суммами. */
.vip-amount {
    position: relative;
    z-index: 1;
    margin-top: 14px;
}

.vip-amount b {
    display: block;
    font-size: 27px;
    font-weight: 900;
    letter-spacing: -.6px;
    line-height: 1.1;
    font-variant-numeric: tabular-nums;
    color: #fff;
}

.vip-amount span {
    display: block;
    margin-top: 2px;
    font-size: 12px;
    color: rgba(199, 210, 254, .8);
}

.vip-bar {
    position: relative;
    z-index: 1;
    width: 100%;
    height: 6px;
    margin-top: 12px;
    border-radius: 999px;
    background: rgba(255, 255, 255, .14);
    overflow: hidden;
}

.vip-bar i {
    display: block;
    height: 100%;
    border-radius: inherit;
    background: linear-gradient(90deg, #fbbf24 0%, #f59e0b 100%);
    transition: width .6s cubic-bezier(.4, 0, .2, 1);
}

/* Награда — отдельной плашкой, а не хвостом предложения: это второе
   по важности число, и оно должно находиться взглядом, а не вычитываться. */
.vip-reward {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 14px;
    padding: 7px 11px 7px 8px;
    border-radius: 10px;
    background: rgba(255, 255, 255, .1);
    font-size: 12.5px;
    font-weight: 600;
    color: rgba(255, 255, 255, .92);
}

.vip-reward[hidden] { display: none; }

.vip-reward__ico {
    display: grid;
    place-items: center;
    width: 24px;
    height: 24px;
    flex: none;
    color: #fbbf24;
}

.vip-reward__ico svg { width: 18px; height: 18px; }

/* Кнопка на всю ширину и с отступом сверху: карточка теперь выровнена по
   левому краю, и кнопка по своему тексту висела бы посреди пустоты. */
.vip-card .btn-primary {
    width: 100%;
    margin-top: 16px;
    background: linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%);
    color: #1e1b4b;
    box-shadow: 0 4px 20px rgba(245, 158, 11, 0.3);
    position: relative;
    z-index: 1;
    font-weight: 700;
}

.vip-card .btn-primary:hover {
    background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
    transform: translateY(-2px);
    box-shadow: 0 8px 28px rgba(245, 158, 11, 0.4);
}

.vip-card .btn-arrow {
    color: #1e1b4b;
}

/* ======================================================================== */
/* 13. ЗАГОЛОВКИ СЕКЦИЙ */
/* ======================================================================== */

.section-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    margin-bottom: 24px;
    padding-bottom: 16px;
    border-bottom: 1px solid var(--border-soft);
    position: relative;
}

.section-header::after {
    content: '';
    position: absolute;
    bottom: -1px;
    left: 0;
    width: 60px;
    height: 2px;
    background: var(--accent);
    border-radius: 2px;
}

.section-header-left h2 {
    font-size: 22px;
    font-weight: 800;
    color: var(--text);
    letter-spacing: -0.5px;
    margin-bottom: 6px;
    line-height: 1.2;
}

.section-header-left p {
    font-size: 14px;
    color: var(--text-dim);
    font-weight: 500;
    line-height: 1.4;
}

.link-view {
    font-size: 14px;
    color: var(--accent);
    text-decoration: none;
    font-weight: 600;
    transition: all 0.2s ease;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 16px;
    border-radius: 12px;
    background: transparent;
    cursor: pointer;
}

.link-view:hover {
    background: var(--surface-accent);
    gap: 10px;
}

.link-view .arrow {
    transition: transform 0.2s ease;
    font-size: 16px;
}

.link-view:hover .arrow {
    transform: translateX(3px);
}

/* ======================================================================== */
/* 14. СТИЛИ ДЛЯ ИГР (ОБЩИЕ) */
/* ======================================================================== */

.game-wrapper {
    background: var(--surface);
    border-radius: 24px;
    padding: 24px;
    border: 1px solid var(--border);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    position: relative;
    overflow: hidden;
}

.game-wrapper::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.8), transparent);
    opacity: 0;
    transition: opacity 0.3s ease;
}

.game-wrapper:hover::before {
    opacity: 1;
}

.game-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 24px;
    padding-bottom: 20px;
    border-bottom: 1px solid var(--border-soft);
    position: relative;
}

.game-header::after {
    content: '';
    position: absolute;
    bottom: -1px;
    left: 0;
    width: 64px;
    height: 2px;
    background: var(--accent);
    border-radius: 2px;
}

.game-title-wrap {
    display: flex;
    align-items: center;
    gap: 16px;
    cursor: pointer;
}

.game-title-wrap:hover .game-title-icon-wrap {
    transform: scale(1.05);
}

.game-title-icon-wrap {
    width: 50px;
    height: 50px;
    background: linear-gradient(135deg, var(--surface-accent) 0%, var(--violet-soft) 100%);
    border-radius: 18px;
    display: flex;
    justify-content: center;
    align-items: center;
    border: 1px solid var(--border);
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.08);
    transition: all 0.3s ease;
}

.game-title-icon-wrap img {
    width: 30px;
    height: 30px;
    object-fit: contain;
}

.game-title-text h1 {
    font-size: 24px;
    font-weight: 800;
    color: var(--text);
    letter-spacing: -0.3px;
}

.game-title-text p {
    font-size: 14px;
    color: var(--text-dim);
    margin-top: 4px;
    font-weight: 500;
}

/* ======================================================================== */
/* 15. БАЛАНС В ИГРАХ */
/* ======================================================================== */

.game-balance-wrap {
    display: flex;
    align-items: center;
    gap: 10px;
    background: linear-gradient(180deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.6) 100%);
    padding: 8px 14px 8px 18px;
    border-radius: 40px;
    border: 1px solid var(--border);
    box-shadow: 0 4px 18px rgba(37, 99, 235, 0.06);
    backdrop-filter: blur(10px);
    transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}

.game-balance-wrap:hover {
    border-color: rgba(37, 99, 235, 0.35);
    box-shadow: 0 8px 28px rgba(37, 99, 235, 0.12);
    transform: translateY(-1px);
}

.game-balance-text {
    font-size: 11px;
    font-weight: 700;
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.8px;
}

.game-balance-num {
    font-size: 16px;
    font-weight: 800;
    color: var(--text);
    letter-spacing: -0.2px;
    background: linear-gradient(135deg, #0f172a 0%, #2563eb 100%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
}

.game-balance-btn {
    background: rgba(255, 255, 255, 0.7);
    border: 1px solid var(--border);
    width: 30px;
    height: 30px;
    border-radius: 50%;
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
    font-size: 16px;
    color: var(--text-dim);
    transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
    font-weight: 700;
}

.game-balance-btn:hover {
    background: rgba(37, 99, 235, 0.08);
    border-color: rgba(37, 99, 235, 0.35);
    color: var(--accent);
    transform: scale(1.1);
    box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.06);
}

.game-balance-btn.highlight {
    background: rgba(37, 99, 235, 0.08);
    border-color: rgba(37, 99, 235, 0.35);
    color: var(--accent);
}

.game-balance-btn.highlight:hover {
    background: rgba(37, 99, 235, 0.14);
    color: var(--accent-hover);
    box-shadow: 0 0 0 6px rgba(37, 99, 235, 0.1);
}

/* ======================================================================== */
/* 16. КОНТРОЛЫ ИГР (ОБЩИЕ) */
/* ======================================================================== */

.game-controls {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    align-items: center;
    gap: 18px;
    background: var(--surface);
    border-radius: 20px;
    padding: 18px 24px;
    margin-bottom: 28px;
    border: 1px solid var(--border);
    box-shadow: 0 8px 28px rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(37, 99, 235, 0.04);
}

.control-group {
    display: flex;
    align-items: center;
    gap: 10px;
    position: relative;
}

.control-group + .control-group::before {
    content: '';
    position: absolute;
    left: -9px;
    top: 20%;
    height: 60%;
    width: 1px;
    background: linear-gradient(180deg, transparent, #94a3b8, transparent);
    opacity: 0.35;
}

.control-label {
    font-size: 11px;
    font-weight: 700;
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.7px;
    white-space: nowrap;
}

.control-select {
    width: 100%;
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 12px;
    padding: 10px 32px 10px 14px;
    font-weight: 600;
    font-size: 14px;
    color: var(--text);
    cursor: pointer;
    outline: none;
    appearance: none;
    transition: all 0.2s ease;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10'%3E%3Cpath fill='%2364748b' d='M5 7L0 2h10z'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 12px center;
}

.control-select:hover {
    border-color: var(--accent);
    background: var(--surface);
    box-shadow: 0 2px 10px rgba(37, 99, 235, 0.1);
}

.control-select:focus {
    border-color: var(--accent);
    box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.08);
}

.stepper-wrap {
    display: flex;
    align-items: center;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 12px;
    overflow: hidden;
    transition: all 0.2s ease;
    width: 100%;
}

.stepper-wrap:hover {
    border-color: var(--accent);
    box-shadow: 0 2px 12px rgba(37, 99, 235, 0.1);
}

.stepper-btn {
    background: transparent;
    border: none;
    padding: 10px 16px;
    font-size: 18px;
    cursor: pointer;
    color: var(--text-dim);
    font-weight: 700;
    transition: all 0.2s ease;
    line-height: 1;
}

.stepper-btn:hover {
    background: var(--surface-accent);
    color: var(--accent);
}

.stepper-val {
    flex: 1;
    padding: 10px 6px;
    font-weight: 700;
    font-size: 14px;
    color: var(--text);
    text-align: center;
    border-left: 1px solid var(--border-soft);
    border-right: 1px solid var(--border-soft);
    background: var(--surface);
}

.next-win-display {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 16px;
    background: linear-gradient(135deg, var(--surface-accent) 0%, var(--surface-2) 100%);
    border-radius: 12px;
    border: 1px solid var(--border);
}

.next-win-display span {
    font-size: 13px;
    color: var(--text-dim);
    font-weight: 500;
}

.next-win-display strong {
    font-size: 18px;
    font-weight: 700;
    color: var(--ok);
}

/* ======================================================================== */
/* 17. ИГРОВОЕ ПОЛЕ (МИНЫ) */
/* ======================================================================== */

.game-board {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 14px;
    max-width: 520px;
    margin: 0 auto 40px auto;
}

.cell {
    aspect-ratio: 1 / 1;
    border-radius: 18px;
    background: linear-gradient(145deg, var(--surface-2) 0%, var(--surface-3) 100%);
    border: 1px solid var(--border);
    display: flex;
    justify-content: center;
    align-items: center;
    transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
    cursor: pointer;
    font-size: 28px;
    font-weight: 700;
}

.cell:hover:not(.revealed-bomb):not(.revealed-safe) {
    transform: translateY(-3px);
    border-color: var(--accent);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
}

.cell.revealed-bomb {
    background: linear-gradient(145deg, var(--danger-soft) 0%, var(--danger-soft) 100%);
    border-color: var(--danger-border);
    animation: shake 0.5s ease-in-out;
}

.cell.revealed-bomb img {
    width: 55%;
    height: 55%;
    object-fit: contain;
    animation: pop-bomb 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}

.cell.revealed-safe {
    background: linear-gradient(145deg, var(--ok-soft) 0%, var(--ok-soft) 100%);
    border-color: var(--ok-border);
}

.cell.revealed-safe::after {
    content: '✓';
    color: var(--ok);
    font-weight: 700;
    font-size: 24px;
}

@keyframes shake {
    0%,
    100% {
        transform: translateX(0);
    }
    20% {
        transform: translateX(-4px);
    }
    40% {
        transform: translateX(4px);
    }
    60% {
        transform: translateX(-4px);
    }
    80% {
        transform: translateX(4px);
    }
}

@keyframes pop-bomb {
    0% {
        transform: scale(0) rotate(-180deg);
        opacity: 0;
    }
    70% {
        transform: scale(1.1) rotate(10deg);
    }
    100% {
        transform: scale(1) rotate(0deg);
        opacity: 1;
    }
}

/* ======================================================================== */
/* 18. СТАТИСТИКА ИГР */
/* ======================================================================== */

.mines-coefficients {
    margin-top: 16px;
    padding: 16px;
    background: var(--surface-2);
    border-radius: 16px;
    border: 1px solid var(--border-soft);
}

.mines-coefficients-title {
    font-size: 13px;
    font-weight: 700;
    color: var(--text-2);
    text-transform: uppercase;
    letter-spacing: 0.8px;
    margin-bottom: 12px;
}

.mines-coefficients-table {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(70px, 1fr));
    gap: 8px;
}

.mines-coefficient-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 8px 4px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 10px;
    font-size: 12px;
    color: var(--text-dim);
    font-weight: 600;
    transition: all 0.2s ease;
    cursor: pointer;
    user-select: none;
    transform-origin: center center;
}

.mines-coefficient-item.rotated {
    transform: rotate(360deg);
}

.mines-coefficient-item.active {
    border-color: var(--accent);
    color: var(--accent);
    background: var(--surface-accent);
}

.mines-coefficient-item.rotated {
    transform: rotate(360deg);
}

.mines-coefficient-item.active {
    border-color: var(--accent);
    color: var(--accent);
    background: var(--surface-accent);
}

.mines-coefficient-item .coeff-val {
    font-size: 16px;
    font-weight: 800;
    color: var(--text);
}

.mines-coefficient-item.active .coeff-val {
    color: var(--accent);
}

.game-footer-stats {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-top: 24px;
    border-top: 1px solid var(--border-soft);
}

.stat-item {
    display: flex;
    flex-direction: column;
    gap: 8px;
    text-align: center;
}

.stat-label {
    font-size: 12px;
    color: var(--text-dim);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.8px;
}

.stat-value {
    font-size: 26px;
    font-weight: 800;
    color: var(--text);
}

.stat-value.highlight {
    background: linear-gradient(135deg, #2563eb 0%, #7c3aed 100%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
}

/* ======================================================================== */
/* 19. ИСТОРИЯ ИГР (ТАБЛИЦА) */
/* ======================================================================== */

.history-table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 8px;
}

.history-table tr {
    border-bottom: 1px solid var(--border-soft);
    transition: all 0.2s ease;
}

.history-table tr:last-child {
    border-bottom: none;
}

.history-table td {
    padding: 12px 0;
    font-size: 13px;
    vertical-align: middle;
}

.history-table td:first-child {
    font-weight: 700;
}

.history-badge {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 8px;
    font-size: 11px;
    font-weight: 600;
}

.history-badge.win {
    background: var(--ok-soft);
    color: var(--ok);
}

.history-badge.lose {
    background: var(--danger-soft);
    color: var(--danger);
}

.btn-show-all {
    display: block;
    width: 100%;
    margin-top: 16px;
    padding: 12px;
    border: none;
    background: var(--surface-2);
    border-radius: 16px;
    font-weight: 600;
    color: var(--accent);
    font-size: 14px;
    cursor: pointer;
    transition: all 0.2s ease;
}

.btn-show-all:hover {
    background: var(--surface-accent);
}

/* ======================================================================== */
/* 20. FAIRNESS (ЧЕСТНАЯ ИГРА) */
/* ======================================================================== */

.fairness-block {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 8px 0;
}

.fairness-block p {
    font-size: 13px;
    color: var(--text-dim);
    line-height: 1.6;
    max-width: 200px;
}

.fairness-block .shield-icon {
    width: 40px;
    height: 40px;
    background: var(--surface-accent);
    border-radius: 50%;
    display: flex;
    justify-content: center;
    align-items: center;
    color: var(--accent);
    font-size: 20px;
}

.btn-details {
    width: 100%;
    margin-top: 12px;
    padding: 12px;
    border: 1px solid var(--border);
    background: transparent;
    border-radius: 16px;
    font-weight: 600;
    font-size: 14px;
    cursor: pointer;
    transition: all 0.2s ease;
    color: var(--text);
}

.btn-details:hover {
    background: var(--surface-2);
    border-color: var(--accent);
}

/* ======================================================================== */
/* 21. СТАТИСТИКА (ПРАВАЯ ПАНЕЛЬ) */
/* ======================================================================== */

.stats-info {
    display: flex;
    flex-direction: column;
    gap: 12px;
    margin-top: 8px;
}

.stat-row {
    display: flex;
    justify-content: space-between;
    font-size: 14px;
}

.stat-row .label {
    color: var(--text-dim);
}

.stat-row .value {
    font-weight: 600;
    color: var(--text);
}

/* Раздел «ONLINE STATS (В ИГРАХ)» удалён целиком: ни один из его классов
   не встречался в разметке. Остался от блока онлайна, который убран с
   главной вместе с графиком. */

/* ======================================================================== */
/* ======================================================================== */
/* 23. БАБЛС (BUBBLES) */
/* ======================================================================== */

.bubble-scene-card {
    background: var(--surface-2);
    border-radius: 20px;
    border: 1px solid var(--border-soft);
    padding: 20px;
    margin-bottom: 16px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 16px;
}

.bubble-stage {
    position: relative;
    width: 100%;
    max-width: 320px;
    height: 260px;
    display: flex;
    justify-content: center;
    align-items: center;
}

.bubble-main {
    width: 160px;
    height: 160px;
    background: linear-gradient(135deg, var(--surface) 0%, var(--surface-accent) 100%);
    border-radius: 50%;
    display: flex;
    justify-content: center;
    align-items: center;
    box-shadow: 0 16px 48px rgba(37, 99, 235, 0.12), inset 0 -8px 16px rgba(0, 0, 0, 0.02);

    /* Обводка по токену, а не белым. Белая рамка на светлой теме сливалась
       с подложкой и ничего не давала, а на тёмной превращалась в яркое
       кольцо вокруг тёмного круга — та же ошибка, что была у блика
       скелетона: цвет не зависел от того, на чём лежит. */
    border: 1px solid var(--border);
    transition: transform 0.1s linear;
}

.bubble-main .multiplier {
    font-size: 44px;
    font-weight: 800;
    color: var(--accent);
    letter-spacing: -0.5px;
    text-shadow: 0 2px 8px rgba(37, 99, 235, 0.15);
}

.bubble-stats-row {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 12px;
    width: 100%;
}

.bubble-stat {
    background: var(--surface);
    border-radius: 16px;
    border: 1px solid var(--border-soft);
    padding: 12px;
    text-align: center;
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.bubble-stat .lbl {
    font-size: 11px;
    color: var(--text-faint);
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

.bubble-stat .val {
    font-size: 18px;
    font-weight: 700;
    color: var(--text);
}

.bubble-stat .val.green {
    color: var(--ok);
}

.bubble-control-card {
    background: var(--surface);
    border-radius: 20px;
    border: 1px solid var(--border);
    padding: 20px;
    margin-bottom: 16px;
    display: flex;
    flex-direction: column;
    gap: 16px;
    box-shadow: 0 8px 28px rgba(0, 0, 0, 0.04);
}

.bet-field {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.bet-field-label {
    font-size: 12px;
    font-weight: 700;
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.7px;
}

.bet-input-wrap {
    display: flex;
    align-items: center;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 4px;
    transition: all 0.2s ease;
}

.bet-input-wrap:focus-within {
    border-color: var(--accent);
    box-shadow: 0 2px 12px rgba(37, 99, 235, 0.1);
}

.bet-input-wrap input {
    flex: 1;
    border: none;
    outline: none;
    padding: 12px 16px;
    font-size: 16px;
    font-weight: 700;
    color: var(--text);
    background: transparent;
    width: 100%;
}

.bet-input-wrap input::-webkit-outer-spin-button,
.bet-input-wrap input::-webkit-inner-spin-button {
    -webkit-appearance: none;
}

.bet-input-wrap .currency {
    padding-right: 14px;
    font-weight: 700;
    color: var(--text);
    font-size: 14px;
}

.bet-quick-btns {
    display: flex;
    gap: 8px;
}

.bet-quick-btns button {
    flex: 1;
    padding: 8px 0;
    border-radius: 12px;
    border: 1px solid var(--border);
    background: var(--surface);
    font-size: 13px;
    font-weight: 600;
    color: var(--text-2);
    cursor: pointer;
    transition: all 0.2s ease;
}

.bet-quick-btns button:hover,
.bet-quick-btns button.active {
    background: var(--surface-2);
    border-color: var(--accent);
    color: var(--accent);
}

.btn-big-play {
    width: 100%;
    padding: 16px;
    font-size: 17px;
    font-weight: 700;
    border: none;
    border-radius: 16px;
    background: var(--accent);
    color: #fff;
    cursor: pointer;
    transition: all 0.2s ease;
    box-shadow: 0 4px 16px rgba(37, 99, 235, 0.2);
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
}

.btn-big-play:hover {
    background: var(--accent-hover);
    transform: translateY(-1px);
}

.btn-big-play:disabled {
    background: var(--border-strong);
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
}

.btn-big-play .shortcut {
    font-size: 12px;
    opacity: 0.7;
    font-weight: 500;
}

.autowin-group {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}

.autowin-label {
    font-size: 12px;
    font-weight: 700;
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.7px;
}

.stepper-horizontal {
    display: flex;
    align-items: center;
    gap: 8px;
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 12px;
    padding: 4px;
}

.stepper-horizontal button {
    width: 32px;
    height: 32px;
    border: none;
    background: transparent;
    border-radius: 8px;
    cursor: pointer;
    font-size: 16px;
    color: var(--text-dim);
    transition: all 0.2s ease;
}

.stepper-horizontal button:hover {
    background: var(--surface-accent);
    color: var(--accent);
}

.stepper-horizontal .val {
    min-width: 48px;
    text-align: center;
    font-weight: 700;
    font-size: 14px;
    color: var(--text);
}

.bubble-advanced {
    background: var(--surface);
    border-radius: 20px;
    border: 1px solid var(--border);
    margin-bottom: 16px;
    overflow: hidden;
}

.bubble-advanced summary {
    padding: 16px 20px;
    font-weight: 600;
    font-size: 14px;
    color: var(--text);
    cursor: pointer;
    list-style: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    transition: background 0.2s ease;
}

.bubble-advanced summary::-webkit-details-marker {
    display: none;
}

.bubble-advanced summary:hover {
    background: var(--surface-2);
}

.bubble-advanced summary::after {
    content: '+';
    font-size: 18px;
    color: var(--accent);
    font-weight: 700;
}

.bubble-advanced[open] summary::after {
    content: '−';
}

.bubble-advanced-body {
    padding: 0 20px 20px;
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.bubble-advanced-body .dice-hash-row {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}

.bubble-advanced-body .dice-hash-label {
    font-size: 12px;
    color: var(--text-dim);
    font-weight: 600;
    white-space: nowrap;
}

.bubble-advanced-body .dice-hash-code {
    flex: 1;
    min-width: 0;
    font-family: monospace;
    font-size: 12px;
    color: var(--text-2);
    background: var(--surface-2);
    padding: 8px 10px;
    border-radius: 8px;
    border: 1px solid var(--border-soft);
    word-break: break-all;
}

.bubble-advanced-body .dice-icon-btn {
    background: transparent;
    border: none;
    cursor: pointer;
    font-size: 16px;
    padding: 4px;
    transition: transform 0.2s ease;
}

.bubble-advanced-body .dice-icon-btn:hover {
    transform: scale(1.1);
}

.bubble-advanced-body .dice-verify-btn {
    width: 100%;
    padding: 10px;
    background: transparent;
    border: 1px solid var(--accent);
    color: var(--accent);
    border-radius: 12px;
    font-weight: 600;
    font-size: 14px;
    cursor: pointer;
    transition: all 0.2s ease;
}

.bubble-advanced-body .dice-verify-btn:hover {
    background: var(--surface-accent);
}

.recent-bubbles {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}

.recent-bubble-item {
    padding: 6px 10px;
    border-radius: 10px;
    font-size: 12px;
    font-weight: 700;
}

.recent-bubble-item.blue {
    color: var(--accent);
    background: var(--surface-accent);
}

.recent-bubble-item.red {
    color: var(--danger);
    background: var(--danger-soft);
}

.recent-bubble-item.green {
    color: var(--ok);
    background: var(--ok-soft);
}
/* 25. АДАПТИВНОСТЬ */
/* ======================================================================== */

/* Блоков про ширину колонок на 1280, 1100 и 1024 здесь больше нет: ширины
   задаются через clamp в самом .dashboard-layout (см. выше). Ступени давали
   провал средней колонки на каждой границе. */

@media (max-width: 1024px) {
    /* Правила .games-grid здесь больше нет: число колонок считается из ширины
       самой сетки (auto-fill выше), а не из ширины окна. Две колонки по
       медиазапросу давали на этой ширине карточки по 465px — вдвое крупнее
       нужного, потому что контент теперь идёт во всю ширину. */
    .game-board {
        max-width: 100%;
        gap: 10px;
    }
}

@media (max-width: 850px) {
    .dashboard-layout {
        grid-template-columns: 1fr;
    }
    .top-nav {
        flex-wrap: wrap;
        gap: 16px;
        justify-content: center;
    }
    .nav-center {
        width: 100%;
        justify-content: space-around;
    }
    .bubble-control-card {
        grid-template-columns: 1fr;
    }
    .bubble-scene-card {
        flex-direction: column;
    }
    .bubble-stats-row {
        grid-template-columns: 1fr;
    }
    .dice-controls {
        grid-template-columns: 1fr 1fr;
    }
    .dice-main-card {
        grid-template-columns: 1fr;
    }
    .how-to-play .steps {
        grid-template-columns: 1fr;
    }
}

@media (max-width: 768px) {
    .dashboard-layout {
        grid-template-columns: 1fr;
    }
    .top-nav {
        flex-wrap: wrap;
        gap: 16px;
        justify-content: center;
    }
    .nav-center {
        width: 100%;
        justify-content: space-around;
    }
    .banner {
        flex-direction: column;
        text-align: center;
        padding: 32px 24px;
    }
    .banner-content {
        margin-bottom: 24px;
        max-width: 100%;
    }
    .banner-image img {
        width: 120px;
    }
    .games-grid {
        grid-template-columns: repeat(2, 1fr);
    }
    .quick-start-grid {
        grid-template-columns: repeat(3, 1fr);
    }
    .game-header {
        flex-direction: column;
        align-items: flex-start;
        gap: 16px;
    }

    .game-controls {
        grid-template-columns: minmax(0, 1fr);
    }
    .game-footer-stats {
        flex-wrap: wrap;
        justify-content: space-around;
        gap: 16px;
    }
}

/* ======================================================================== */
/* 26. SPA (Страницы) */
/* ======================================================================== */

.page {
    display: none;
    animation: fadeIn 0.3s ease;
}

.page.active {
    display: block;
}

@keyframes fadeIn {
    from {
        opacity: 0;
        transform: translateY(10px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* ======================================================================== */
/* 27. МОБИЛЬНАЯ ВЕРСИЯ */
/* ======================================================================== */

.hamburger {
    display: none;
    flex-direction: column;
    gap: 6px;
    background: transparent;
    border: none;
    cursor: pointer;
    padding: 10px;
    z-index: 1001;
    -webkit-tap-highlight-color: transparent;
    border-radius: 12px;
    transition: all 0.2s ease;
}

.hamburger:hover {
    background: var(--surface-3);
}

.hamburger span {
    display: block;
    width: 24px;
    height: 2px;
    background: var(--text);
    border-radius: 2px;
    transition: all 0.3s ease;
    transform-origin: center;
}

.hamburger.active span:nth-child(1) {
    transform: rotate(45deg) translate(5px, 6px);
}

.hamburger.active span:nth-child(2) {
    opacity: 0;
    transform: scaleX(0);
}

.hamburger.active span:nth-child(3) {
    transform: rotate(-45deg) translate(5px, -6px);
}

.mobile-overlay {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.5);
    z-index: 998;
    opacity: 0;
    transition: opacity 0.3s ease;
    -webkit-tap-highlight-color: transparent;
}

.mobile-overlay.mobile-open {
    display: block;
    opacity: 1;
}

.mobile-bottom-nav {
    display: none;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    background: var(--surface);
    border-top: 1px solid var(--border);
    padding: 8px 8px;
    padding-bottom: max(10px, env(safe-area-inset-bottom));
    z-index: 1000;
    box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.08);
    -webkit-backdrop-filter: blur(12px);
    backdrop-filter: blur(12px);
}

.mobile-nav-item {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    background: transparent;
    border: none;
    cursor: pointer;
    padding: 8px 4px;
    color: var(--text-faint);
    transition: all 0.2s ease;
    font-size: 11px;
    font-weight: 600;
    border-radius: 14px;
    position: relative;
    -webkit-tap-highlight-color: transparent;
}

.mobile-nav-item img {
    width: 24px;
    height: 24px;
    opacity: 0.6;
    transition: all 0.2s ease;
    filter: grayscale(0.3);
}

/* «Профиль» нарисован svg, а не картинкой: он красится currentColor и
   поэтому подхватывает активный цвет пункта сам, без правил на opacity
   и grayscale, которыми приходится вытягивать png. */
.mobile-nav-item svg {
    width: 24px;
    height: 24px;
    flex: none;
    color: var(--text-dim);
    transition: color 0.2s ease;
}

.mobile-nav-item[aria-expanded="true"] svg {
    color: var(--accent);
}

.mobile-nav-item.active {
    color: var(--accent);
}

.mobile-nav-item.active::before {
    content: '';
    position: absolute;
    top: 2px;
    left: 50%;
    transform: translateX(-50%);
    width: 20px;
    height: 3px;
    background: var(--accent);
    border-radius: 2px;
}

.mobile-nav-item.active img {
    opacity: 1;
    filter: grayscale(0);
}

/* Активный значок красится вместе с подписью. Ради этого все кнопки нижнего
   меню и переведены на контурные svg: картинка так не умеет — её пришлось бы
   держать в двух состояниях или гасить фильтром, что и делалось выше. */
.mobile-nav-item.active svg { color: var(--accent); }

.mobile-nav-item:active {
    transform: scale(0.92);
    background: var(--surface-2);
}

.sidebar-close-btn {
    display: none;
}

@media (max-width: 768px) {
    .dashboard-layout {
        grid-template-columns: 1fr;
        gap: 16px;
    }

    .sidebar-left {
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        max-height: 85vh;
        overflow-y: auto;
        z-index: 999;
        background: var(--surface);
        padding: 16px;
        border-radius: 0 0 24px 24px;
        box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
        transform: translateY(-100%);
        transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);
    }

    .sidebar-left.mobile-open {
        transform: translateY(0);
    }

    .sidebar-close-btn {
        display: flex;
    }

    .sidebar-left .card {
        padding: 0;
    }

    .sidebar-right {
        display: none;
    }

    .top-nav {
        flex-wrap: nowrap;
        gap: 12px;
        padding: 10px 16px;
        position: sticky;
        top: 0;
        background: var(--surface);
        backdrop-filter: blur(12px);
        z-index: 1000;
        border-bottom: 1px solid var(--border-soft);
    }

    .logo {
        font-size: 18px;
    }

    .logo img {
        height: 24px;
    }

    .hamburger {
        display: flex;
    }

    .nav-center {
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        flex-direction: column;
        background: var(--surface);
        padding: 0;
        gap: 4px;
        transform: translateX(-100%);
        transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
        z-index: 999;
        justify-content: flex-start;
        box-shadow: 4px 0 24px rgba(15, 23, 42, 0.12);
    }

    .nav-center.mobile-open {
        transform: translateX(0);
    }

    .nav-link {
        width: 100%;
        padding: 16px 20px;
        font-size: 16px;
        justify-content: flex-start;
        border-radius: 16px;
        transition: all 0.2s ease;
        gap: 12px;
        margin: 0 12px;
    }

    .nav-link:hover {
        background: var(--surface-2);
    }

    .nav-link.active {
        background: var(--surface-accent);
        color: var(--accent);
    }

    .nav-right {
        margin-left: auto;
    }

    /* Обрезки суммы здесь БЫТЬ НЕ ДОЛЖНО: баланс — главная цифра шапки, и
       «1 234 5…» вместо неё бессмысленно. Размеры пилюли на узких экранах
       задаёт mobile.css; там сумме проставлен flex: none, чтобы под
       давлением ужимался логотип, а не деньги. */
    .balance-pill__sum {
        min-width: 0;
        white-space: nowrap;
    }

    .game-wrapper {
        padding: 16px;
        border-radius: 20px;
    }

    .game-header {
        flex-direction: column;
        align-items: flex-start;
        gap: 12px;
    }

    .game-controls {
        grid-template-columns: 1fr;
        gap: 12px;
        padding: 16px;
    }

    .control-group + .control-group::before {
        display: none;
    }

    .dice-controls {
        grid-template-columns: 1fr;
        gap: 16px;
    }

    .dice-main-card {
        grid-template-columns: 1fr;
        gap: 16px;
    }

    .bubble-scene-card {
        flex-direction: column;
    }

    .bubble-stage {
        height: 260px;
    }

    .bubble-main {
        width: 140px;
        height: 140px;
    }

    .bubble-main .multiplier {
        font-size: 40px;
    }

    .bubble-stage .axis-line {
        font-size: 10px;
    }

    .bubble-stats-row {
        width: 100%;
        flex-direction: row;
        gap: 12px;
    }

    .bubble-stat {
        flex: 1;
    }

    .bubble-control-card {
        grid-template-columns: 1fr;
        gap: 16px;
    }

    .recent-bubbles {
        flex-wrap: wrap;
    }

    .bubble-advanced {
        margin-bottom: 16px;
    }

    .dice-controls {
        grid-template-columns: 1fr;
        gap: 16px;
    }

    .dice-result-card {
        flex-direction: row;
        flex-wrap: wrap;
        gap: 12px;
        text-align: left;
        align-items: center;
    }

    .dice-result-label {
        width: 100%;
        margin-bottom: 4px;
    }

    .dice-result-value {
        font-size: 28px;
        margin-bottom: 0;
    }

    .dice-actions {
        width: 100%;
    }

    .dice-number-display {
        padding: 14px;
    }

    .dice-number-value {
        font-size: 36px;
    }

    .dice-main-card {
        grid-template-columns: 1fr;
        gap: 16px;
    }

    .dice-advanced {
        margin-bottom: 16px;
    }

    .input-group input {
        font-size: 16px;
    }

    .app-container {
        padding-bottom: 80px;
    }

    .mobile-bottom-nav {
        display: flex;
    }
}

@media (max-width: 480px) {
    .balance-pill {
        padding: 3px 4px;
        gap: 2px;
    }

    .balance-pill__btn {
        width: 26px;
        height: 26px;
    }

    .balance-pill__btn svg {
        width: 13px;
        height: 13px;
    }

    /* max-width убран — см. комментарий в блоке 768px выше. */
    .balance-pill__sum {
        font-size: 12px;
        min-width: 0;
        padding: 0 3px;
    }

    .avatar {
        width: 36px;
        height: 36px;
        font-size: 14px;
    }

    .quick-start-grid {
        grid-template-columns: repeat(2, 1fr);
    }

    .bubble-stage {
        height: 220px;
    }

    .bubble-main {
        width: 110px;
        height: 110px;
    }

    .bubble-main .multiplier {
        font-size: 30px;
    }

    .bubble-stage .axis-line {
        font-size: 9px;
        padding: 0 4px;
    }

    .bubble-small-1,
    .bubble-small-2,
    .bubble-small-3 {
        display: none;
    }

    .bubble-scene-card {
        padding: 16px;
    }

    .dice-result-value {
        font-size: 24px;
    }

    .dice-result-label {
        font-size: 12px;
    }

    .games-grid {
        grid-template-columns: 1fr;
        gap: 12px;
    }

    .game-card {
        aspect-ratio: 4 / 3;
        border-radius: 16px;
    }

    .game-card h4 {
        font-size: 16px;
    }

    .game-card-content {
        padding: 14px;
    }

    .mini-btn {
        padding: 5px 4px;
        font-size: 11px;
    }

    .quick-row {
        gap: 4px;
    }

    .dice-controls {
        gap: 12px;
    }

    .game-footer-stats {
        flex-direction: column;
        align-items: flex-start;
    }

    .recent-bubbles {
        gap: 8px;
    }

    .recent-bubble-item {
        font-size: 12px;
        padding: 6px 10px;
    }

    .quick-row {
        margin-top: 6px;
    }

    .dice-field-label {
        font-size: 10px;
        letter-spacing: 0.5px;
    }

    .bet-quick-btns button {
        padding: 5px 2px;
        font-size: 11px;
    }

    .bubble-control-card {
        padding: 14px;
        gap: 12px;
    }

    .btn-big-play {
        padding: 14px;
        font-size: 16px;
    }

    .game-wrapper {
        padding: 12px;
        border-radius: 16px;
    }

    .game-header {
        margin-bottom: 16px;
        padding-bottom: 14px;
    }

    .game-title-text h1 {
        font-size: 20px;
    }

    .game-title-wrap {
        gap: 10px;
    }

    .game-title-icon-wrap {
        width: 40px;
        height: 40px;
    }

    .dice-field {
        gap: 6px;
    }

    .input-group input {
        font-size: 15px;
        padding: 10px 12px;
    }

    .input-group .currency-suffix,
    .input-group .percent-suffix {
        font-size: 14px;
        padding-right: 10px;
    }

    .hash-box {
        padding: 10px 14px;
    }

    .hash-box .hash-text {
        font-size: 11px;
    }

    .main-action-btn {
        padding: 14px;
        font-size: 16px;
    }

    body {
        padding: 0;
    }

    .app-container {
        padding: 0;
        border-radius: 0;
    }

    .dashboard-layout {
        padding: 12px;
    }
}

/* ======================================================================== */
/* 28. АВТОРИЗАЦИЯ (МОДАЛКА) */
/* ======================================================================== */

.auth-modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.45);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    z-index: 2000;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 20px;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.25s ease;
}

.auth-modal-overlay.open {
    opacity: 1;
    pointer-events: auto;
}

.auth-modal {
    background: var(--surface);
    border-radius: clamp(20px, 3vw, 28px);
    padding: 0;
    max-width: 440px;
    width: 100%;
    box-shadow: 0 24px 60px rgba(15, 23, 42, 0.18), 0 0 0 1px rgba(255, 255, 255, 0.6);
    transform: translateY(12px) scale(0.97);
    transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
    position: relative;
    overflow: hidden;
}

.auth-modal-overlay.open .auth-modal {
    transform: translateY(0) scale(1);
}

.auth-modal-close {
    position: absolute;
    top: 16px;
    right: 16px;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    border: 1px solid var(--border);
    background: var(--surface);
    color: var(--text-dim);
    font-size: 20px;
    line-height: 1;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.2s ease;
    z-index: 2;
}

.auth-modal-close:hover {
    background: var(--surface-2);
    border-color: var(--accent);
    color: var(--accent);
    transform: rotate(90deg);
}

.auth-container {
    padding: 32px;
    display: flex;
    flex-direction: column;
    gap: 18px;
}

.auth-header {
    text-align: center;
    margin-bottom: 4px;
}

.auth-title {
    font-size: 22px;
    font-weight: 800;
    color: var(--text);
    letter-spacing: -0.3px;
    margin: 0 0 6px;
}

.auth-subtitle {
    font-size: 14px;
    color: var(--text-dim);
    margin: 0;
    line-height: 1.4;
}

.auth-tabs {
    display: flex;
    background: var(--surface-2);
    border-radius: 14px;
    padding: 4px;
    position: relative;
}

.auth-tab {
    flex: 1;
    padding: 10px 0;
    border: none;
    background: transparent;
    color: var(--text-dim);
    font-weight: 600;
    font-size: 14px;
    cursor: pointer;
    border-radius: 12px;
    transition: color 0.2s ease;
    position: relative;
    z-index: 1;
}

.auth-tab.active {
    color: var(--text);
}

.auth-tab-indicator {
    position: absolute;
    top: 4px;
    left: 4px;
    width: calc(50% - 4px);
    height: calc(100% - 8px);
    background: var(--surface);
    border-radius: 12px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(226, 232, 240, 0.8);
    transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
    z-index: 0;
}

.auth-tab[data-mode="register"].active ~ .auth-tab-indicator {
    transform: translateX(100%);
}

.auth-body {
    display: flex;
    flex-direction: column;
    gap: 16px;
}

#regularAuthForm,
#telegramAuthBlock {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.auth-message {
    padding: 12px 14px;
    border-radius: 12px;
    font-size: 14px;
    font-weight: 600;
    text-align: center;
    display: none;
    animation: fadeIn 0.2s ease;
}

.auth-message.success {
    display: block;
    background: var(--ok-soft);
    color: var(--ok);
}

.auth-message.error {
    display: block;
    background: var(--danger-soft);
    color: var(--danger);
}

.auth-field {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.auth-label {
    font-size: 12px;
    font-weight: 700;
    color: var(--text-2);
    text-transform: none;
    letter-spacing: 0.2px;
}

.auth-input-wrap {
    display: flex;
    align-items: center;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 12px;
    padding: 4px;
    transition: all 0.2s ease;
}

.auth-input-wrap:focus-within {
    border-color: var(--accent);
    box-shadow: 0 2px 12px rgba(37, 99, 235, 0.1);
}

.auth-input-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    color: var(--text-faint);
    flex-shrink: 0;
}

.auth-input {
    flex: 1;
    border: none;
    outline: none;
    padding: 10px 4px;
    font-size: 15px;
    font-weight: 600;
    color: var(--text);
    background: transparent;
    width: 100%;
    min-width: 0;
}

.auth-input::placeholder {
    color: var(--text-faint);
    font-weight: 500;
}

.auth-password-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border: none;
    background: transparent;
    color: var(--text-faint);
    cursor: pointer;
    border-radius: 10px;
    transition: all 0.2s ease;
    flex-shrink: 0;
}

.auth-password-toggle:hover {
    background: var(--surface-2);
    color: var(--accent);
}

.auth-field-footer {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-top: 2px;
}

.auth-link {
    font-size: 13px;
    font-weight: 600;
    color: var(--accent);
    text-decoration: none;
    cursor: pointer;
    background: none;
    border: none;
    padding: 0;
}

.auth-link:hover {
    text-decoration: underline;
}

.auth-submit {
    width: 100%;
    padding: 14px;
    border: none;
    border-radius: 14px;
    background: var(--accent);
    color: #ffffff;
    font-weight: 700;
    font-size: 15px;
    cursor: pointer;
    transition: all 0.2s ease;
    box-shadow: 0 4px 16px rgba(37, 99, 235, 0.2);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    margin-top: 4px;
}

.auth-submit:hover {
    background: var(--accent-hover);
    transform: translateY(-1px);
    box-shadow: 0 8px 24px rgba(37, 99, 235, 0.25);
}

.auth-submit:active {
    transform: translateY(0);
}

.auth-submit:disabled {
    background: var(--border-strong);
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
}

.auth-btn-icon {
    display: inline-flex;
    transition: transform 0.2s ease;
}

.auth-submit:hover .auth-btn-icon {
    transform: translateX(3px);
}

.auth-loader {
    width: 18px;
    height: 18px;
    border: 2px solid rgba(255, 255, 255, 0.3);
    border-top-color: #ffffff;
    border-radius: 50%;
    animation: auth-spin 0.8s linear infinite;
}

@keyframes auth-spin {
    to {
        transform: rotate(360deg);
    }
}

.auth-divider {
    display: flex;
    align-items: center;
    gap: 12px;
    color: var(--text-faint);
    font-size: 12px;
    font-weight: 600;
    text-transform: lowercase;
}

.auth-divider::before,
.auth-divider::after {
    content: '';
    flex: 1;
    height: 1px;
    background: var(--surface-3);
}

.auth-socials {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 16px;
}

.auth-social-btn {
    width: 48px;
    height: 48px;
    border-radius: 50%;
    border: 1px solid var(--border);
    background: var(--surface);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: all 0.2s ease;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02);
}

.auth-social-btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 20px rgba(0, 0, 0, 0.06);
    /* border-color: #2563eb; */
}

.auth-footer {
    text-align: center;
    font-size: 14px;
    color: var(--text-dim);
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    flex-wrap: wrap;
}

.auth-footer-text {
    font-weight: 500;
}

.auth-footer-link {
    font-weight: 700;
    color: var(--accent);
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    font-size: 14px;
}

.auth-footer-link:hover {
    text-decoration: underline;
}

@media (max-width: 480px) {
    .auth-container {
        padding: 24px;
    }

    .auth-modal {
        max-width: 100%;
        border-radius: 20px;
    }
}

.auth-telegram-loader {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 16px;
    padding: 24px 0;
    color: var(--text-dim);
    font-size: 14px;
    font-weight: 600;
}

.auth-telegram-spinner {
    width: 36px;
    height: 36px;
    border: 3px solid var(--border);
    border-top-color: var(--accent);
    border-radius: 50%;
    animation: auth-spin 0.8s linear infinite;
}

.auth-back-btn {
    margin-top: 12px;
    padding: 10px 14px;
    border: 1px solid var(--border);
    border-radius: 12px;
    background: var(--surface);
    color: var(--text-2);
    font-weight: 600;
    font-size: 13px;
    cursor: pointer;
    transition: all 0.2s ease;
    display: inline-flex;
    align-items: center;
    gap: 6px;
}

.auth-back-btn:hover {
    background: var(--surface-2);
    border-color: var(--accent);
    color: var(--accent);
}

.auth-telegram-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 12px;
    padding: 4px 0;
}

.auth-telegram-icon {
    width: 56px;
    height: 56px;
    border-radius: 50%;
    background: var(--surface-accent);
    color: #0ea5e9;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.auth-telegram-title {
    font-size: 16px;
    font-weight: 700;
    color: var(--text);
    margin: 0;
}

.auth-telegram-subtitle {
    font-size: 13px;
    color: var(--text-dim);
    margin: 0;
    line-height: 1.4;
}

.auth-telegram-code-row {
    display: flex;
    align-items: center;
    gap: 10px;
    width: 100%;
}

.auth-telegram-input {
    flex: 1;
    padding: 12px 14px;
    border: 1.5px dashed var(--border-strong);
    border-radius: 12px;
    background: var(--surface-2);
    font-size: 18px;
    font-weight: 800;
    letter-spacing: 1.5px;
    color: var(--text);
    text-align: center;
    outline: none;
    min-width: 0;
}

.auth-telegram-copy {
    width: 42px;
    height: 42px;
    border-radius: 12px;
    border: 1px solid var(--border);
    background: var(--surface);
    color: var(--text-2);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: all 0.2s ease;
    flex-shrink: 0;
}

.auth-telegram-copy:hover {
    border-color: var(--accent);
    color: var(--accent);
    background: var(--surface-accent);
}

.auth-telegram-btn {
    width: 100%;
    padding: 12px;
    border-radius: 14px;
    border: none;
    background: #26A5E4;
    color: #ffffff;
    font-weight: 700;
    font-size: 14px;
    cursor: pointer;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    transition: all 0.2s ease;
    box-shadow: 0 4px 14px rgba(38, 165, 228, 0.25);
}

.auth-telegram-btn:hover {
    background: #1e96c8;
    transform: translateY(-1px);
    box-shadow: 0 8px 20px rgba(38, 165, 228, 0.3);
}

.auth-telegram-btn svg {
    flex-shrink: 0;
}

/* ======================================================================== */
/* РЕГИСТРАЦИЯ В 1 КЛИК                                                     */
/* ======================================================================== */

/* Кнопка намеренно не синяя: рядом стоит .auth-submit («Войти» / «Создать
   аккаунт»), и две одинаково яркие кнопки подряд спорят друг с другом. */
.auth-quick {
    width: 100%;
    padding: 13px;
    border: 1.5px solid var(--accent);
    border-radius: 14px;
    background: var(--surface-accent);
    color: var(--accent-hover);
    font-weight: 700;
    font-size: 14px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 9px;
    transition: all 0.2s ease;
}

.auth-quick:hover {
    background: var(--accent);
    color: #ffffff;
    transform: translateY(-1px);
    box-shadow: 0 8px 20px rgba(37, 99, 235, 0.22);
}

.auth-quick:active {
    transform: translateY(0);
}

.auth-quick:disabled {
    opacity: 0.65;
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
}

.auth-quick__icon {
    display: inline-flex;
    flex-shrink: 0;
}

/* Крутилка внутри кнопки светлая — на голубом фоне белая не видна */
.auth-quick .auth-loader {
    border-color: rgba(37, 99, 235, 0.25);
    border-top-color: var(--accent);
}

.auth-quick__hint {
    margin: 8px 0 0;
    font-size: 12px;
    line-height: 1.45;
    color: var(--text-faint);
    text-align: center;
}

.auth-quick__hint a {
    color: var(--text-dim);
    text-decoration: underline;
}

.auth-quick__hint a:hover {
    color: var(--accent);
}

/* ==================== СОГЛАСИЕ ПРИ РЕГИСТРАЦИИ ==================== */

.auth-consent {
    margin: 4px 0 2px;
}

.auth-consent__row {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    cursor: pointer;
}

.auth-consent__box {
    width: 18px;
    height: 18px;
    margin: 1px 0 0;
    flex-shrink: 0;
    accent-color: #2563eb;
    cursor: pointer;
}

.auth-consent__text {
    font-size: 12.5px;
    line-height: 1.45;
    color: var(--text-dim);
}

.auth-consent__text a {
    color: var(--accent);
    text-decoration: none;
}

.auth-consent__text a:hover {
    text-decoration: underline;
}

.auth-quick__field {
    width: 100%;
    text-align: left;
}

.auth-quick__field .auth-label {
    display: block;
    margin-bottom: 6px;
}

/* Логин и пароль показываются один раз — предупреждение должно быть заметным,
   но не кричащим: это не ошибка, а инструкция. */
.auth-quick__warn {
    width: 100%;
    margin: 0;
    padding: 10px 12px;
    border-radius: 12px;
    border: 1px solid var(--warn-border);
    background: var(--warn-soft);
    color: var(--warn-strong);
    font-size: 12px;
    line-height: 1.45;
    text-align: left;
}

.auth-quick__copy-all {
    width: 100%;
    padding: 11px;
    border: 1px solid var(--border);
    border-radius: 12px;
    background: var(--surface);
    color: var(--text-2);
    font-weight: 600;
    font-size: 13px;
    cursor: pointer;
    transition: all 0.2s ease;
}

.auth-quick__copy-all:hover {
    border-color: var(--accent);
    color: var(--accent);
    background: var(--surface-accent);
}

.quick-icon {
    background: linear-gradient(135deg, #22c55e, #16a34a);
    box-shadow: 0 8px 20px rgba(22, 163, 74, 0.25);
}

/* ======================================================================== */
/* СТРАНИЦА БОНУСОВ                                                         */
/* ======================================================================== */

/* Страница построена на классах профиля (pf-hero, pf-tiles, pf-grid,
   pf-card) — здесь только то, чего в них нет. */

/* ======================================================================== */
/* СТРАНИЦА БОНУСОВ                                                         */
/*                                                                          */
/* У каждого способа получить бонус свой акцент: колесо — янтарь,          */
/* Telegram — его синий, промокод — фиолетовый.                             */
/*                                                                          */
/* Цвет задаётся ОДНОЙ переменной --bx-accent на карточке; иконка, кнопка   */
/* и полоса сверху берут её. Красьте элементы по отдельности — они          */
/* разъедутся при первой же правке.                                         */
/* ======================================================================== */

/* ---------------------------------------------------------------- ШАПКА */

.bx-hero {
    position: relative;
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    gap: 28px;
    padding: 32px 34px;
    margin-bottom: 18px;
    border-radius: 26px;
    overflow: hidden;
    color: #ffffff;
    background: linear-gradient(135deg, #172554 0%, #1e40af 48%, #2563eb 100%);
    box-shadow: 0 14px 38px rgba(23, 37, 84, 0.28);
}

/* Тёплое свечение из-под колеса — связывает шапку с янтарным акцентом
   карточки ежедневного бонуса ниже. */
.bx-hero::before {
    content: '';
    position: absolute;
    top: -30%;
    right: -6%;
    width: 460px;
    height: 460px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(251, 191, 36, 0.28) 0%, transparent 62%);
    pointer-events: none;
}

.bx-hero__body {
    position: relative;
    z-index: 1;
    max-width: 460px;
}

.bx-hero__kicker {
    display: inline-block;
    padding: 5px 12px;
    margin-bottom: 14px;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.14);
    border: 1px solid rgba(255, 255, 255, 0.22);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 1.2px;
    text-transform: uppercase;
}

.bx-hero__title {
    font-size: clamp(24px, 3vw, 34px);
    font-weight: 800;
    line-height: 1.15;
    letter-spacing: -0.6px;
    color: #ffffff;
}

.bx-hero__sub {
    margin-top: 10px;
    font-size: 14.5px;
    line-height: 1.55;
    color: rgba(255, 255, 255, 0.78);
}

/* Счётчик вращений — главное число страницы */
.bx-hero__spins {
    display: flex;
    align-items: center;
    gap: 12px;
    margin: 22px 0 18px;
}

.bx-hero__num {
    font-size: 46px;
    font-weight: 900;
    line-height: 1;
    letter-spacing: -1.5px;
    color: #fbbf24;
    font-variant-numeric: tabular-nums;
    text-shadow: 0 0 30px rgba(251, 191, 36, 0.45);
}

.bx-hero__unit {
    font-size: 12.5px;
    font-weight: 600;
    line-height: 1.35;
    color: rgba(255, 255, 255, 0.72);
}

.bx-hero__btn {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    min-height: 48px;
    padding: 0 26px;
    border: 0;
    border-radius: 14px;
    background: #fbbf24;
    color: #451a03;
    font-family: inherit;
    font-size: 15px;
    font-weight: 800;
    cursor: pointer;
    box-shadow: 0 8px 22px rgba(251, 191, 36, 0.32);
    transition: all 0.2s ease;
}

.bx-hero__btn:hover {
    background: #f59e0b;
    transform: translateY(-2px);
    box-shadow: 0 12px 28px rgba(251, 191, 36, 0.42);
}

.bx-hero__btn svg {
    width: 17px;
    height: 17px;
    transition: transform 0.2s ease;
}

.bx-hero__btn:hover svg { transform: translateX(3px); }

/* ------------------------------------------------------------- КОЛЕСО */

.bx-hero__art {
    position: relative;
    z-index: 1;
    display: grid;
    place-items: center;
}

/* Веер призовых карточек. Колесо отсюда убрано: оно уже стоит в карточке
   ежедневного бонуса ниже, а его подписи в размер шапки не читались.
   Здесь вместо украшения — ответ на вопрос «что я вообще выиграю». */

.bx-prizes {
    display: grid;
    /* Все три в одной ячейке — веер собирается поворотом, а не сеткой */
    place-items: center;
    width: 260px;
    height: 190px;
}

.bx-prize {
    grid-area: 1 / 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    width: 128px;
    height: 128px;
    border-radius: 22px;
    color: #ffffff;
    text-align: center;
    border: 1px solid rgba(255, 255, 255, 0.28);
    box-shadow: 0 16px 34px rgba(8, 20, 55, 0.34);
    animation: bxPrizeFloat 6s ease-in-out infinite;
}

.bx-prize__val {
    font-size: 26px;
    font-weight: 900;
    letter-spacing: -0.8px;
    line-height: 1;
    font-variant-numeric: tabular-nums;
}

.bx-prize__unit {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.4px;
    opacity: 0.82;
}

/* Три карточки веером. Задержка анимации у каждой своя — иначе они
   покачиваются синхронно и выглядят одним куском. */
.bx-prize--cash {
    transform: rotate(-15deg) translate(-58px, 12px);
    background: linear-gradient(150deg, #3b82f6 0%, #1d4ed8 100%);
    animation-delay: 0s;
}

.bx-prize--fs {
    transform: rotate(14deg) translate(58px, 4px);
    background: linear-gradient(150deg, #22d3ee 0%, #0891b2 100%);
    animation-delay: 1.1s;
}

/* Джекпот в центре и крупнее — он тут главный */
.bx-prize--gold {
    z-index: 1;
    width: 142px;
    height: 142px;
    transform: translateY(-14px);
    background: linear-gradient(150deg, #fcd34d 0%, #d97706 100%);
    color: var(--warn-strong);
    border-color: rgba(255, 255, 255, 0.5);
    box-shadow: 0 20px 44px rgba(180, 83, 9, 0.42);
    animation-delay: 0.5s;
}

.bx-prize--gold .bx-prize__val { font-size: 29px; }
.bx-prize--gold .bx-prize__unit { opacity: 0.72; }

/* Покачивание — от текущего положения карточки, поэтому в кадрах указан
   только сдвиг по вертикали через отдельное свойство translate. */
@keyframes bxPrizeFloat {
    0%, 100% { translate: 0 0; }
    50%      { translate: 0 -9px; }
}

/* -------------------------------------------------------------- ПЛИТКИ */

.bx-stats {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
    gap: 12px;
    margin-bottom: 18px;
}

.bx-stat {
    display: flex;
    flex-direction: column;
    gap: 5px;
    padding: 16px 18px;
    border: 1px solid var(--border);
    border-radius: 16px;
    background: var(--surface);
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.bx-stat:hover {
    border-color: var(--border);
    box-shadow: 0 6px 18px rgba(15, 23, 42, 0.05);
}

.bx-stat__label {
    font-size: 11.5px;
    font-weight: 600;
    color: var(--text-faint);
}

.bx-stat__value {
    font-size: 22px;
    font-weight: 800;
    letter-spacing: -0.5px;
    color: var(--text);
    font-variant-numeric: tabular-nums;
}

/* ------------------------------------------------------------ КАРТОЧКИ */

.bx-grid {
    display: grid;
    grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
    align-items: start;
    gap: 16px;
}

.bx-col {
    display: flex;
    flex-direction: column;
    gap: 16px;
}

.bx-card {
    --bx-accent: #2563eb;
    --bx-accent-soft: #eff6ff;

    position: relative;
    display: flex;
    flex-direction: column;
    padding: 22px;
    border: 1px solid var(--border);
    border-radius: 20px;
    background: var(--surface);
    overflow: hidden;
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

/* Полоса акцента сверху — вместе с иконкой и кнопкой единственное, что
   различает карточки по цвету. */
.bx-card::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 3px;
    background: var(--bx-accent);
}

.bx-card:hover {
    border-color: var(--border);
    box-shadow: 0 10px 28px rgba(15, 23, 42, 0.06);
}

.bx-card--promo  { --bx-accent: #7c3aed; --bx-accent-soft: #f5f3ff; }
.bx-card--wheel  { --bx-accent: #f59e0b; --bx-accent-soft: #fffbeb; }
.bx-card--tg     { --bx-accent: #2aabee; --bx-accent-soft: #eff9fe; }

/* ------------------------------------------------ БАННЕР «УРОВНИ» */

/* На всю ширину под сеткой, а не карточкой внутри неё: колонок две, и
   третья карточка вставала во вторую колонку, вытесняя колесо с Telegram
   вниз влево. По смыслу тут тоже уместнее — блок ведёт на другую страницу,
   а не выдаёт бонус, и логично стоит последним.
 *
 * Заливкой, а не белой карточкой: после трёх цветных карточек белая полоса
 * читалась как недоделанный четвёртый блок, а бледный прямоугольник
 * прогресса висел между текстом и кнопкой сам по себе.
 *
 * Цвет — по текущему уровню игрока, как в шапке страницы уровней, куда
 * баннер и ведёт. Класс вешает loadLevelsTeaser() из app.js. */

.bx-levels {
    --lvb-a: #60a5fa;
    --lvb-b: #1d4ed8;
    --lvb-ink: #ffffff;

    position: relative;
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    grid-template-areas:
        "icon text btn"
        "prog prog prog";
    align-items: center;
    gap: 16px 18px;
    margin-top: 16px;
    padding: 22px 24px;
    border-radius: 22px;
    overflow: hidden;
    color: var(--lvb-ink);
    background: linear-gradient(135deg, var(--lvb-a) 0%, var(--lvb-b) 100%);
    box-shadow: 0 14px 34px rgba(15, 23, 42, 0.2);
}

/* Блик — иначе крупная заливка выглядит плоской заплаткой */
.bx-levels::before {
    content: '';
    position: absolute;
    top: -70%;
    right: -5%;
    width: 320px;
    height: 320px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0%, transparent 62%);
    pointer-events: none;
}

.bx-levels--novice  { --lvb-a: #60a5fa; --lvb-b: #1d4ed8; }
.bx-levels--premium { --lvb-a: #a78bfa; --lvb-b: #6d28d9; }

/* Вип золотой, поэтому текст тёмный: белый по золоту не читается */
.bx-levels--vip {
    --lvb-a: #fcd34d;
    --lvb-b: #d97706;
    --lvb-ink: #451a03;
}

.bx-levels__icon {
    grid-area: icon;
    position: relative;
    z-index: 1;
    display: grid;
    place-items: center;
    width: 50px;
    height: 50px;
    border-radius: 15px;
    background: rgba(255, 255, 255, 0.16);
    border: 1px solid rgba(255, 255, 255, 0.24);
}

/* Значок наследует currentColor от .bx-levels, а тот меняется вместе с
   уровнем: белый на синем и фиолетовом, тёмный на золоте ВИП. Ради этого
   картинка и заменена на svg — png оставался светлым и на золоте пропадал. */
.bx-levels__icon svg {
    width: 28px;
    height: 28px;
}

.bx-levels__text {
    grid-area: text;
    position: relative;
    z-index: 1;
    min-width: 0;
}

.bx-levels__title {
    font-size: 17px;
    font-weight: 800;
    letter-spacing: -0.3px;
    color: var(--lvb-ink);
}

.bx-levels__sub {
    margin-top: 3px;
    font-size: 12.5px;
    line-height: 1.45;
    opacity: 0.78;
}

/* Кнопка светлая на заливке: акцентная в цвет фона на нём же потерялась бы */
.bx-levels__btn {
    grid-area: btn;
    position: relative;
    z-index: 1;
    min-height: 44px;
    padding: 0 22px;
    border: 0;
    border-radius: 13px;
    background: var(--surface);
    color: var(--lvb-b);
    font-family: inherit;
    font-size: 14px;
    font-weight: 700;
    white-space: nowrap;
    cursor: pointer;
    box-shadow: 0 6px 18px rgba(8, 20, 55, 0.2);
    transition: all 0.2s ease;
}

.bx-levels__btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 10px 24px rgba(8, 20, 55, 0.28);
}

/* ---- текущий уровень и прогресс ---- */

.bx-level {
    grid-area: prog;
    position: relative;
    z-index: 1;
    padding: 13px 16px;
    border-radius: 14px;
    background: rgba(255, 255, 255, 0.14);
    border: 1px solid rgba(255, 255, 255, 0.2);
}

.bx-level__row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 9px;
}

.bx-level__name {
    font-size: 15px;
    font-weight: 900;
    letter-spacing: 0.5px;
    color: var(--lvb-ink);
    white-space: nowrap;
}

.bx-level__next {
    font-size: 12px;
    font-weight: 600;
    text-align: right;
    opacity: 0.78;
    font-variant-numeric: tabular-nums;
}

.bx-level__track {
    height: 8px;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.22);
    overflow: hidden;
}

.bx-level__fill {
    height: 100%;
    border-radius: 999px;
    background: var(--lvb-ink);
    box-shadow: 0 0 14px rgba(255, 255, 255, 0.5);
    transition: width 0.5s ease;
}

.bx-card__head {
    display: flex;
    align-items: flex-start;
    gap: 13px;
    margin-bottom: 16px;
}

.bx-card__icon {
    flex: none;
    display: grid;
    place-items: center;
    width: 44px;
    height: 44px;
    border-radius: 13px;
    background: var(--bx-accent-soft);
    color: var(--bx-accent);
}

/* Правила под <img> здесь больше нет: все значки карточек — svg. Мёртвое
   правило под картинку тем и опасно, что молча ждёт: вернёт кто-нибудь png,
   и он подхватит чужие размеры вместо того, чтобы сразу выглядеть неверно. */
.bx-card__icon svg {
    width: 24px;
    height: 24px;
}

.bx-card__title {
    font-size: 16.5px;
    font-weight: 800;
    letter-spacing: -0.3px;
    color: var(--text);
}

.bx-card__sub {
    margin-top: 3px;
    font-size: 12.5px;
    line-height: 1.45;
    color: var(--text-faint);
}

/* Второстепенная ссылка под кнопкой карточки — «Открыть канал» рядом с
   «Получить бонус». Ссылкой, а не второй кнопкой: два одинаковых по весу
   элемента спорили бы за то, какой из них основной. */
.bx-card__link {
    align-self: center;
    margin-top: 10px;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--bx-accent);
    text-decoration: none;
    border-bottom: 1px dashed currentColor;
    padding-bottom: 1px;
    transition: opacity 0.2s ease;
}

.bx-card__link:hover { opacity: 0.75; }

.bonus-tile__desc {
    margin: 0 0 14px;
    font-size: 13.5px;
    line-height: 1.55;
    color: var(--text-dim);
}

/* Класс подставляет loadDailyBonusTile() из app.js вместе с модификатором
   --ready, поэтому имя оставлено прежним. */
.bonus-tile__stat {
    align-self: flex-start;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--text-faint);
    padding: 7px 12px;
    border-radius: 10px;
    background: var(--surface-2);
    border: 1px solid var(--border);
    margin-bottom: 16px;
}

/* Бонус доступен — подсвечиваем, это призыв к действию.
   Два селектора: --ready остался у плитки ежедневного бонуса, где класс
   ставится целой строкой через className, а .is-ready — общий модификатор
   для блоков, которых больше одного (бонус за Telegram показан и здесь,
   и баннером на главной). */
.bonus-tile__stat--ready,
.bonus-tile__stat.is-ready {
    color: var(--ok-strong);
    background: var(--ok-soft);
    border-color: var(--ok-border);
}

/* --------------------------------------------------------------- КНОПКИ */

.bx-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 46px;
    padding: 0 22px;
    border: 0;
    border-radius: 13px;
    font-family: inherit;
    font-size: 14px;
    font-weight: 700;
    cursor: pointer;
    text-decoration: none;
    transition: all 0.2s ease;
}

/* Кнопка карточки прижата к низу: при разной длине описания соседние
   карточки иначе получают кнопки на разных уровнях. */
.bx-btn--wide {
    width: 100%;
    margin-top: auto;
}

.bx-btn--accent {
    background: var(--bx-accent);
    color: #ffffff;
}

.bx-btn--accent:hover {
    filter: brightness(0.93);
    transform: translateY(-1px);
}

.bx-btn--accent:disabled {
    background: var(--border-strong);
    cursor: not-allowed;
    transform: none;
    filter: none;
}

/* ------------------------------------------------------------- АДАПТИВ */

@media (max-width: 900px) {
    .bx-grid {
        grid-template-columns: minmax(0, 1fr);
    }

    /* Колесо и Telegram выше промокода: в одну колонку форма с историей
       активаций вырастает надолго, и до бесплатного ежедневного вращения
       приходилось скроллить мимо неё. */
    .bx-grid .bx-col { order: -1; }

    /* Кнопка уезжает под текст: рядом с ним на планшете ей остаётся места
       ровно под подпись, и заголовок начинает переноситься. */
    .bx-levels {
        grid-template-columns: auto minmax(0, 1fr);
        grid-template-areas:
            "icon text"
            "prog prog"
            "btn  btn";
        row-gap: 14px;
    }

    .bx-levels__btn { width: 100%; }
}

@media (max-width: 700px) {
    .bx-hero {
        grid-template-columns: minmax(0, 1fr);
        gap: 18px;
        padding: 24px 20px;
        text-align: center;
    }

    .bx-hero__body { max-width: none; }

    .bx-hero__spins { justify-content: center; }

    /* Колесо над текстом и мельче: на телефоне оно украшение, а не якорь */
    .bx-hero__art { order: -1; }

    /* Веер ужимаем: на телефоне он под текстом и не должен занимать экран */
    .bx-prizes {
        width: 230px;
        height: 150px;
    }

    .bx-prize {
        width: 104px;
        height: 104px;
        border-radius: 18px;
    }

    .bx-prize--gold { width: 116px; height: 116px; }
    .bx-prize--cash { transform: rotate(-15deg) translate(-48px, 10px); }
    .bx-prize--fs   { transform: rotate(14deg) translate(48px, 4px); }

    .bx-prize__val { font-size: 21px; }
    .bx-prize--gold .bx-prize__val { font-size: 23px; }

    .bx-hero__btn { width: 100%; justify-content: center; }
}

@media (max-width: 480px) {
    .bx-hero__num { font-size: 38px; }
    .bx-stat__value { font-size: 19px; }
    .bx-card { padding: 18px; }

    .bx-levels {
        padding: 18px;
        border-radius: 18px;
        gap: 12px 14px;
    }

    .bx-levels__icon {
        width: 42px;
        height: 42px;
        border-radius: 13px;
    }

    .bx-levels__icon svg { width: 23px; height: 23px; }
    .bx-levels__title { font-size: 15.5px; }

    /* Название уровня и остаток до следующего в строку не помещаются —
       ставим друг под друга. */
    .bx-level__row {
        flex-direction: column;
        align-items: flex-start;
        gap: 2px;
    }

    .bx-level__next { text-align: left; }
}

/* Покачивание карточек декоративно — под reduce его быть не должно */
@media (prefers-reduced-motion: reduce) {
    .bx-prize { animation: none; }
}
/* ======================================================================== */
/* СИСТЕМА УРОВНЕЙ                                                          */
/*                                                                          */
/* У каждого уровня своя гамма: новичок — синий, премиум — фиолетовый,     */
/* вип — золото. Цвет задаётся ПАРОЙ ПЕРЕМЕННЫХ на модификаторе            */
/* (.lv-step--vip и т.д.), всё остальное берёт их оттуда.                   */
/*                                                                          */
/* Добавляете уровень в services/levels.js — заведите здесь и модификатор,  */
/* иначе ступень останется без цвета.                                       */
/* ======================================================================== */

/* Строка «До ВИП — 350 000 ₽» под полосой прогресса в правом меню главной.
   К самой странице уровней отношения не имеет. */
.level-next {
    margin-top: 10px;
}

/* ---------------------------------------------------------------- ШАПКА */

.lv-hero {
    --lv-a: #3b82f6;
    --lv-b: #1d4ed8;
    --lv-ink: #ffffff;

    position: relative;
    padding: 26px 28px;
    margin-bottom: 16px;
    border-radius: 24px;
    overflow: hidden;
    color: var(--lv-ink);
    background: linear-gradient(135deg, var(--lv-a) 0%, var(--lv-b) 100%);
    box-shadow: 0 14px 34px rgba(15, 23, 42, 0.2);
}

/* Блик — иначе крупная заливка выглядит плоской заплаткой */
.lv-hero::before {
    content: '';
    position: absolute;
    top: -55%;
    right: -12%;
    width: 380px;
    height: 380px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.2) 0%, transparent 62%);
    pointer-events: none;
}

.lv-hero--novice  { --lv-a: #60a5fa; --lv-b: #1d4ed8; }
.lv-hero--premium { --lv-a: #a78bfa; --lv-b: #6d28d9; }

/* Вип золотой, поэтому текст тёмный: белый по золоту не читается */
.lv-hero--vip {
    --lv-a: #fcd34d;
    --lv-b: #d97706;
    --lv-ink: #451a03;
}

.lv-hero__top {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    gap: 18px;
}

/* Значки уровней стали контурными (LEVEL_ICONS в app.js): object-fit здесь
   больше не при чём, а цвет теперь наследуется от карточки. */
.lv-hero__icon {
    width: 60px;
    height: 60px;
    flex: none;
    color: currentColor;
    filter: drop-shadow(0 6px 14px rgba(15, 23, 42, 0.3));
}

.lv-hero__label {
    display: block;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 1.2px;
    text-transform: uppercase;
    opacity: 0.7;
}

.lv-hero__name {
    margin-top: 2px;
    font-size: clamp(24px, 3vw, 32px);
    font-weight: 900;
    line-height: 1.1;
    letter-spacing: 0.5px;
    color: var(--lv-ink);
}

.lv-hero__wagered {
    margin-top: 6px;
    font-size: 13px;
    opacity: 0.82;
}

.lv-hero__wagered b {
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

/* ---------------------------------------------------- ПРОГРЕСС В ШАПКЕ */

.lv-progress {
    position: relative;
    z-index: 1;
    margin-top: 22px;
    padding-top: 18px;
    border-top: 1px solid rgba(255, 255, 255, 0.2);
}

.lv-progress__row {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 12px;
    font-size: 13.5px;
    margin-bottom: 9px;
    opacity: 0.9;
}

.lv-progress__row strong { font-weight: 800; }

.lv-progress__left {
    font-weight: 800;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.lv-progress__bar {
    height: 10px;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.22);
    overflow: hidden;
}

.lv-progress__bar span {
    display: block;
    height: 100%;
    border-radius: 999px;
    background: var(--surface);
    box-shadow: 0 0 16px rgba(255, 255, 255, 0.55);
    transition: width 0.5s ease;
}

.lv-progress__hint {
    margin-top: 8px;
    font-size: 12px;
    opacity: 0.72;
    font-variant-numeric: tabular-nums;
}

.lv-progress--max {
    text-align: center;
    font-size: 13.5px;
    font-weight: 700;
    opacity: 0.9;
}

/* ------------------------------------------------------------- ОТЫГРЫШ */

/* Янтарный, а не красный: бонус уже начислен и им можно играть — ограничен
   только вывод. Это состояние счёта, а не ошибка игрока. */
.lv-wager {
    padding: 18px 20px;
    margin-bottom: 16px;
    border-radius: 18px;
    background: var(--warn-soft);
    border: 1px solid var(--warn-border);
}

.lv-wager__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 10px;
}

.lv-wager__title {
    font-size: 13.5px;
    font-weight: 700;
    color: var(--warn-strong);
}

.lv-wager__sum {
    font-size: 20px;
    font-weight: 900;
    color: var(--warn-strong);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.lv-wager__bar {
    height: 8px;
    border-radius: 999px;
    background: var(--warn-soft);
    overflow: hidden;
}

.lv-wager__bar span {
    display: block;
    height: 100%;
    border-radius: 999px;
    background: linear-gradient(90deg, #fbbf24, #f59e0b);
    transition: width 0.5s ease;
}

.lv-wager__hint {
    margin-top: 7px;
    font-size: 12px;
    font-weight: 600;
    color: var(--warn-strong);
    font-variant-numeric: tabular-nums;
}

.lv-wager__text {
    margin: 10px 0 0;
    font-size: 12.5px;
    line-height: 1.5;
    color: var(--warn-strong);
}

/* -------------------------------------------------------------- КЕШБЭК */

/* Зелёный, а не янтарный как отыгрыш: это деньги, которые возвращаются
   игроку, а не условие, которое его ограничивает. */
.lv-cashback[hidden] { display: none; }

.lv-cashback {
    padding: 18px 20px;
    margin-bottom: 16px;
    border-radius: 18px;
    background: var(--ok-soft);
    border: 1px solid var(--ok-border);
}

/* Уровень ещё не открыт — та же карточка, но нейтральная: обещание, а не
   доступные деньги. */
.lv-cashback--locked {
    background: var(--surface-2);
    border-color: var(--border);
}

.lv-cashback__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 14px;
}

.lv-cashback__title {
    font-size: 14px;
    font-weight: 800;
    color: var(--ok-strong);
}

.lv-cashback--locked .lv-cashback__title { color: var(--text); }

.lv-cashback__pct {
    flex: none;
    padding: 4px 11px;
    border-radius: 999px;
    background: var(--ok);
    color: #ffffff;
    font-size: 12.5px;
    font-weight: 800;
}

.lv-cashback--locked .lv-cashback__pct {
    background: var(--border);
    color: var(--text-dim);
}

.lv-cashback__text {
    margin: 0;
    font-size: 13px;
    line-height: 1.55;
    color: var(--text-dim);
}

.lv-cashback__text b { color: var(--text); }

/* Расчёт в три колонки: игрок видит, из чего сложилась сумма, а не одно
   итоговое число — к нему меньше вопросов. */
.lv-cashback__calc {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1px;
    border-radius: 12px;
    overflow: hidden;
    background: var(--ok-soft);
    border: 1px solid var(--ok-border);
}

.lv-cashback__calc > div {
    padding: 11px 12px;
    background: var(--surface);
    text-align: center;
    min-width: 0;
}

.lv-cashback__calc span {
    display: block;
    font-size: 11px;
    color: var(--text-faint);
    margin-bottom: 3px;
}

.lv-cashback__calc b {
    font-size: 13.5px;
    font-weight: 800;
    color: var(--text);
    font-variant-numeric: tabular-nums;
    overflow-wrap: anywhere;
}

.lv-cashback__sum {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-top: 14px;
}

.lv-cashback__sum span {
    font-size: 13px;
    font-weight: 600;
    color: var(--ok-strong);
}

.lv-cashback__sum b {
    font-size: 24px;
    font-weight: 900;
    color: var(--ok-strong);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.lv-cashback__btn {
    width: 100%;
    min-height: 46px;
    margin-top: 14px;
    border: 0;
    border-radius: 13px;
    background: var(--ok);
    color: #ffffff;
    font-family: inherit;
    font-size: 14px;
    font-weight: 700;
    cursor: pointer;
    transition: all 0.2s ease;
}

.lv-cashback__btn:hover {
    background: var(--ok);
    transform: translateY(-1px);
}

.lv-cashback__btn:disabled {
    background: var(--border-strong);
    cursor: not-allowed;
    transform: none;
}

.lv-cashback__done,
.lv-cashback__none {
    margin-top: 14px;
    padding: 11px 14px;
    border-radius: 12px;
    font-size: 13px;
    font-weight: 600;
    text-align: center;
}

.lv-cashback__done {
    background: var(--ok-soft);
    color: var(--ok-strong);
}

.lv-cashback__none {
    background: var(--surface-3);
    color: var(--text-dim);
}

/* Сразу под заголовком: у него уже есть margin-bottom, и собственный
   отступ этих блоков давал бы двойной. Встречается, когда забирать нечего
   и списка месяцев между ними нет. */
.lv-cashback__head + .lv-cashback__done,
.lv-cashback__head + .lv-cashback__none {
    margin-top: 0;
}

/* Месяцы списком: незабранный кешбэк не сгорает, и их может накопиться
   несколько. Каждый — своя карточка со своим расчётом и своей кнопкой:
   начисляются они по одному, и общая кнопка «Забрать всё» врала бы про то,
   что придёт на баланс за одно нажатие. */
.lv-cashback__months {
    display: flex;
    flex-direction: column;
    gap: 12px;
    margin-top: 14px;
}

/* Подложка светлее фона карточки: месяцев может быть три-четыре подряд, и
   без границы между ними расчёты сливаются в одну простыню цифр. */
.lv-cbm {
    padding: 14px;
    border-radius: 14px;
    background: var(--surface);
    border: 1px solid var(--ok-border);
}

.lv-cbm__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 10px;
}

.lv-cbm__period {
    font-size: 13.5px;
    font-weight: 800;
    color: var(--text);
}

.lv-cbm__amount {
    flex: none;
    font-size: 18px;
    font-weight: 900;
    color: var(--ok-strong);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* Внутри месяца расчёт уже на своей подложке — вторая рамка вокруг него
   даёт рамку в рамке. */
.lv-cbm .lv-cashback__calc {
    border: 0;
    background: var(--ok-border);
}

.lv-cbm .lv-cashback__calc > div {
    background: var(--surface-2);
}

.lv-cbm .lv-cashback__btn {
    margin-top: 12px;
    min-height: 42px;
}

/* Прошлое начисление — сноской, а не полноценным блоком: подтверждение
   нужно, но соперничать за внимание с неполученными деньгами не должно. */
.lv-cashback__past {
    margin-top: 12px;
    font-size: 12px;
    color: var(--text-faint);
    text-align: center;
}

/* ------------------------------------------------------------ ЛЕСТНИЦА */

.lv-ladder {
    padding: 22px;
    border: 1px solid var(--border);
    border-radius: 20px;
    background: var(--surface);
}

.lv-ladder__title {
    font-size: 16px;
    font-weight: 800;
    letter-spacing: -0.3px;
    color: var(--text);
    margin-bottom: 18px;
}

.lv-steps {
    display: flex;
    flex-direction: column;
    gap: 14px;
}

.lv-step {
    --lv-a: #94a3b8;
    --lv-soft: #f1f5f9;

    position: relative;
    padding-left: 30px;
}

.lv-step--novice  { --lv-a: #3b82f6; --lv-soft: #eff6ff; }
.lv-step--premium { --lv-a: #7c3aed; --lv-soft: #f5f3ff; }
.lv-step--vip     { --lv-a: #d97706; --lv-soft: #fffbeb; }

/* Линия между точками. Тянется от точки вниз до следующей ступени; у
   последней её нет, иначе линия висела бы в пустоте. */
.lv-step::before {
    content: '';
    position: absolute;
    left: 8px;
    top: 22px;
    bottom: -14px;
    width: 2px;
    background: var(--border);
}

.lv-step:last-child::before { display: none; }

/* Пройденные ступени соединены цветной линией — это и есть путь игрока */
.lv-step.is-done::before { background: var(--lv-a); }

.lv-step__dot {
    position: absolute;
    left: 2px;
    top: 8px;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: var(--surface);
    border: 3px solid var(--border);
}

.lv-step.is-done .lv-step__dot {
    background: var(--lv-a);
    border-color: var(--lv-a);
}

.lv-step.is-current .lv-step__dot {
    background: var(--surface);
    border-color: var(--lv-a);
    box-shadow: 0 0 0 4px var(--lv-soft);
}

.lv-step__card {
    padding: 16px 18px;
    border-radius: 16px;
    border: 1px solid var(--border);
    background: var(--surface);
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

/* Недостигнутые уровни приглушаем фоном, а не opacity: прозрачность гасила
   и текст условий, который как раз надо прочитать до того, как дойдёшь. */
.lv-step:not(.is-done) .lv-step__card {
    background: var(--surface-2);
    border-style: dashed;
}

.lv-step.is-current .lv-step__card {
    border-color: var(--lv-a);
    border-style: solid;
    background: var(--lv-soft);
    box-shadow: 0 6px 20px rgba(15, 23, 42, 0.07);
}

.lv-step__head {
    display: flex;
    align-items: center;
    gap: 12px;
}

.lv-step__icon {
    width: 34px;
    height: 34px;
    flex: none;
    color: currentColor;
}

.lv-step__id { min-width: 0; }

.lv-step__name {
    font-size: 15px;
    font-weight: 800;
    letter-spacing: 0.4px;
    color: var(--text);
}

.lv-step__req {
    margin-top: 1px;
    font-size: 12.5px;
    color: var(--text-faint);
    font-variant-numeric: tabular-nums;
}

.lv-step__badge {
    margin-left: auto;
    flex: none;
    padding: 5px 11px;
    border-radius: 999px;
    font-size: 10.5px;
    font-weight: 800;
    letter-spacing: 0.5px;
    text-transform: uppercase;
    background: var(--lv-a);
    color: #ffffff;
    white-space: nowrap;
}

.lv-step__badge--done {
    background: var(--ok-soft);
    color: var(--ok-strong);
}

.lv-step__perks {
    margin: 12px 0 0;
    padding-left: 18px;
}

.lv-step__perks li {
    font-size: 13.5px;
    line-height: 1.55;
    color: var(--text-2);
}

.lv-step__perks li + li { margin-top: 4px; }

.lv-step__perks strong { color: var(--text); }

.lv-step__tag {
    display: inline-block;
    margin-left: 4px;
    padding: 2px 8px;
    border-radius: 6px;
    font-size: 11px;
    font-weight: 700;
    white-space: nowrap;
    background: var(--lv-soft);
    color: var(--lv-a);
}

.lv-note {
    margin: 18px 0 0;
    font-size: 12.5px;
    line-height: 1.5;
    color: var(--text-faint);
}

/* -------------------------------------------------------------- АДАПТИВ */

@media (max-width: 640px) {
    .lv-hero {
        padding: 22px 18px;
        border-radius: 20px;
    }

    .lv-hero__top { gap: 14px; }

    .lv-hero__icon {
        width: 50px;
        height: 50px;
    }

    .lv-ladder { padding: 18px 16px; }

    .lv-step__card { padding: 14px; }

    /* Бейдж уходит под заголовок, а не скрывается: раньше на телефоне
       пропадала единственная отметка «Ваш уровень». */
    .lv-step__head { flex-wrap: wrap; }

    .lv-step__badge {
        order: 3;
        margin-left: 48px;
    }

    .lv-wager__head {
        flex-direction: column;
        align-items: flex-start;
        gap: 2px;
    }

    /* Три колонки расчёта на телефоне не помещаются — суммы переносятся
       по символам. Ставим в столбец строками «подпись — значение». */
    .lv-cashback__calc {
        grid-template-columns: minmax(0, 1fr);
    }

    .lv-cashback__calc > div {
        display: flex;
        align-items: baseline;
        justify-content: space-between;
        gap: 12px;
        text-align: left;
    }

    .lv-cashback__calc span { margin-bottom: 0; }
}

/* ======================================================================== */
/* ФУТЕР САЙТА                                                              */
/* ======================================================================== */

/* Подложка светло-серая, а не белая: .app-container сам белый, и футер с
   белым фоном и волосяной рамкой сливался с ним — блок выглядел как голый
   текст без стилей. Скругление и рамка — те же, что у .card, чтобы футер
   читался частью общего оформления. */
.site-footer {
    margin: 40px 0 0;
    padding: 26px 24px;
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 24px;
}

.site-footer__inner {
    max-width: 900px;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 14px;
    text-align: center;
}

.site-footer__age {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    border: 2px solid var(--danger);
    background: var(--surface);
    color: var(--danger);
    font-weight: 800;
    font-size: 12px;
    flex-shrink: 0;
}

.site-footer__links {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: 10px 20px;
}

.site-footer__links a {
    color: var(--text-2);
    font-size: 14px;
    font-weight: 600;
    text-decoration: none;
    padding: 7px 14px;
    border-radius: 10px;
    background: var(--surface);
    border: 1px solid var(--border);
    transition: all 0.2s ease;
}

.site-footer__links a:hover {
    color: var(--accent);
    border-color: var(--accent);
    background: var(--surface-accent);
}

.site-footer__note {
    margin: 0;
    font-size: 12.5px;
    line-height: 1.5;
    color: var(--text-faint);
    max-width: 480px;
}

/* На телефоне снизу висит фиксированное меню — иначе оно накрыло бы футер */
@media (max-width: 850px) {
    .site-footer {
        margin-bottom: 80px;
        padding: 22px 18px;
        border-radius: 20px;
    }
}

.nav-close-btn {
    display: none;
}


/* ======================================================================== */
/* BUBBLES */
/* ======================================================================== */

.bubbles {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    padding: 10px 0 0;
    position: relative;
    width: 100%;
    overflow: hidden;
    box-sizing: border-box;
}

.bubbles.game-field {
    flex-wrap: wrap;
    gap: 0;
}

.bubbles-game {
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 30px 30px 70px;
    position: relative;
    gap: 12px;
    width: 100%;
    min-width: unset;
    max-width: 100%;
    overflow: hidden;
    box-sizing: border-box;
}

.bubbles-game_dots {
    width: 100%;
    max-width: 350px;
    min-width: unset;
    box-sizing: border-box;
    overflow: hidden;
}

.bubbles-game_dots__wrap {
    position: relative;
    display: flex;
    align-items: center;
    gap: 6px;
    max-width: 100%;
    box-sizing: border-box;
}

.bubbles-game_dots__wrap:before {
    content: "";
    position: absolute;
    left: 30px;
    right: 30px;
    top: 50%;
    height: 2px;
    background: rgba(127, 111, 201, 0.35);
    transform: translateY(-50%);
    border-radius: 2px;
}

.bubbles-game_dots__wrap.traversing:after {
    content: "";
    position: absolute;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: #6db86a;
    box-shadow: 0 0 10px rgba(109, 184, 106, 0.9);
    top: 50%;
    left: 0;
    transform: translate(30px, -50%);
    opacity: 1;
    animation: dot-traverse 0.9s linear infinite;
    z-index: 2;
}

@keyframes dot-traverse {
    0% { transform: translate(30px, -50%); }
    25% { transform: translate(96px, -50%); }
    50% { transform: translate(162px, -50%); }
    75% { transform: translate(228px, -50%); }
    100% { transform: translate(294px, -50%); }
}

.bubbles-game_dot {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    flex: 1 1 0;
    min-width: 0;
    max-width: 70px;
    transform-origin: center;
    height: 36px;
}

.bubbles-game_dot:after {
    content: "";
    display: block;
    position: absolute;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: #7f6fc9;
    box-shadow: 0 0 8px rgba(127, 111, 201, 0.6);
}

.bubbles-game_dot.main-dot-active:after {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: #6db86a;
    box-shadow: 0 0 10px rgba(109, 184, 106, 0.7);
}

.emojy-1 {
    width: 74px;
    height: 74px;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.08);
    display: flex;
    align-items: center;
    justify-content: center;
    color: #ffffff;
    font-size: 36px;
}

.emojy-3 {
    width: 150px;
    height: 150px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 90px;
}

.bubbles-game_main {
    width: 430px;
    min-width: 430px;
    height: 214px;
    padding: 24px;
    position: relative;
    z-index: 1;
    background: url('/assets/overlay-881b4922.png') center center no-repeat;
    background-size: cover;
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 24px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    box-sizing: border-box;
    overflow: hidden;
}

.bubbles-game_main .wh74 {
    width: 74px;
    height: 74px;
}

.bubbles-game_main .wh150 {
    width: 150px;
    height: 150px;
}

.bubbles-game_main__side {
    position: relative;
    width: 74px;
    height: 74px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.bubbles-game_main__side>.bubbles-icon-empty,
.bubbles-game_main__side>.emojy-1 {
    fill: none;
}

.bubbles-game_main__center {
    position: relative;
    width: 170px;
    height: 170px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.bubbles-game_main__center>* {
    position: relative;
    fill: none;
}

.emoji, .bubbles-emoji {
    font-size: 110px;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    filter: drop-shadow(0 12px 30px rgba(0, 0, 0, 0.35));
}

.emojy-1, .bubbles-icon-empty, .emojy-3, .bubbles-game_main__side {
    width: 74px;
    height: 74px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 26px;
}

.emojy-3 {
    width: 150px;
    height: 150px;
    font-size: 90px;
}

.bubbles-icon-next {
    width: 74px;
    height: 74px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.08);
    color: rgba(255, 255, 255, 0.35);
    font-size: 22px;
}

.bubbles-result {
    height: 88px;
    padding: 30px 0 0;
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    min-height: 88px;
}

.bubbles-result_wrap {
    width: 125px;
    height: 64px;
    align-content: center;
    background: #4fc94c;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;
    text-align: center;
    color: #f2f0ff;
    font-size: 20px;
    font-weight: 600;
    position: relative;
    opacity: 0;
    transform: translate(20%, 10%) scale(0.9) rotate(20deg);
    transition: all 0.3s ease-out;
}

.bubbles-result_wrap.show {
    opacity: 1;
    transform: unset;
}

.bubbles-result_wrap p {
    width: 100%;
    margin: 0;
}

.bubbles-result_wrap:after {
    content: "";
    display: block;
    position: absolute;
    left: 0;
    right: 0;
    bottom: -12px;
    background-repeat: no-repeat;
    background-position: top center;
    width: 100%;
    height: 14px;
    background-image: url("data:image/svg+xml,%3Csvg width='24' height='14' viewBox='0 0 12 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0L4.48149 5.2284C5.27968 6.15962 6.72032 6.15962 7.51851 5.2284L12 0L0 0Z' fill='%234FC94C'/%3E%3C/svg%3E");
}

.bubbles-result_wrap.win {
    background: #4fc94c;
}

.bubbles-result_wrap.win:after {
    background-image: url("data:image/svg+xml,%3Csvg width='24' height='14' viewBox='0 0 12 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0L4.48149 5.2284C5.27968 6.15962 6.72032 6.15962 7.51851 5.2284L12 0L0 0Z' fill='%234FC94C'/%3E%3C/svg%3E");
}

.bubbles-result_wrap.lost {
    background: #ff5959;
}

.bubbles-result_wrap.lost:after {
    background-image: url("data:image/svg+xml,%3Csvg width='24' height='14' viewBox='0 0 12 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0L4.48149 5.2284C5.27968 6.15962 6.72032 6.15962 7.51851 5.2284L12 0L0 0Z' fill='%23FF5959'/%3E%3C/svg%3E");
}

.bubbles_dot_out-enter {
}

.bubbles_dot_out-enter-active {
    animation: slide-in 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_dot_out-leave-active {
    animation: slide-out 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_dot_in-enter {
}

.bubbles_dot_in-enter-active {
    animation: slide-in-reverse 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_dot_in-leave {
    opacity: 1;
}

.bubbles_dot_in-leave-active {
    animation: slide-out-reverse 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_center-enter {
}

.bubbles_center-enter-active {
    animation: bubbles-in 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_center-leave {
    opacity: 1;
}

.bubbles_center-leave-active {
    animation: bubbles-out 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_prev-enter {
}

.bubbles_prev-enter-active {
    animation: bubbles-prev-in 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_prev-leave {
    opacity: 1;
}

.bubbles_prev-leave-active {
    animation: bubbles-prev-out 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_next-enter {
}

.bubbles_next-enter-active {
    animation: bubbles-next-in 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_next-leave {
    opacity: 1;
}

.bubbles_next-leave-active {
    animation: bubbles-next-out 0.3s ease-out forwards;
    transition: unset;
}

.bubbles_result-enter {
    opacity: 0;
}

.bubbles_result-enter-active {
    animation: bubbles_result-in 0.3s ease-out forwards;
    transition: 0.3s;
}

.bubbles_result-leave {
    opacity: 1;
}

.bubbles_result-leave-active {
    animation: bubbles_result-out 0.3s ease-out forwards;
    transition: unset;
}

@keyframes slide-in {
    0% {
        transform: translate(20px) scale(3);
    }
    to {
        transform: translate(0);
    }
}

@keyframes slide-out {
    0% {
        transform: translate(0);
    }
    to {
        transform: translate(-20px);
    }
}

@keyframes slide-in-reverse {
    0% {
        transform: translate(20px);
    }
    to {
        transform: translate(0);
    }
}

@keyframes slide-out-reverse {
    0% {
        transform: translate(0);
    }
    to {
        transform: translate(-10px);
    }
}

@keyframes bubbles-in {
    0% {
        transform: translate(100%) scale(0.5);
        opacity: 0.3;
    }
    to {
        transform: unset;
        opacity: 1;
    }
}

@keyframes bubbles-out {
    0% {
        transform: unset;
        opacity: 1;
    }
    100% {
        transform: translate(-120%);
        opacity: 0;
    }
}

@keyframes bubbles-prev-in {
    0% {
        opacity: 0;
        transform: translate(-20%);
    }
    100% {
        opacity: 1;
        transform: unset;
    }
}

@keyframes bubbles-prev-out {
    0% {
        transform: unset;
        opacity: 1;
    }
    100% {
        transform: translate(-140%);
        opacity: 0;
    }
}

@keyframes bubbles-next-in {
    0% {
        opacity: 0;
        transform: translate(20%);
    }
    100% {
        opacity: 1;
        transform: unset;
    }
}

@keyframes bubbles-next-out {
    0% {
        transform: unset;
        opacity: 1;
    }
    100% {
        transform: translate(140%);
        opacity: 0;
    }
}

@keyframes bubble-slide-out-left {
    0% {
        transform: unset;
        opacity: 1;
    }
    100% {
        transform: translate(-120%);
        opacity: 0;
    }
}

@keyframes bubble-slide-in-right {
    0% {
        transform: translate(120%);
        opacity: 0;
    }
    100% {
        transform: unset;
        opacity: 1;
    }
}

.center-slide-out-left {
    animation: bubble-slide-out-left 0.35s ease-in-out forwards;
}

.center-slide-in-right {
    animation: bubble-slide-in-right 0.35s ease-in-out forwards;
}

@keyframes bubbles_result-in {
    0% {
        transform: translate(20%, 10%) scale(0.9) rotate(20deg);
        opacity: 0;
    }
    to {
        transform: unset;
        opacity: 1;
    }
}

@keyframes bubbles_result-out {
    0% {
        transform: unset;
        opacity: 0;
    }
    to {
        opacity: 0;
    }
}

@media screen and (max-width: 980px) {
    .bubbles .game-field {
        padding: 0;
    }
    .bubbles-game {
        padding: 0;
        transform: scale(0.6);
    }
    .bubbles-game_dots {
        width: auto;
        min-width: unset;
        max-width: 100%;
        transform: scale(0.85);
    }
    .bubbles-game_dot {
        width: 56px;
        min-width: 56px;
        height: 32px;
    }
    .bubbles-game_dot:after {
        width: 10px;
        height: 10px;
    }
    .bubbles-game_dots__wrap:before {
        left: 28px;
        right: 28px;
    }
    .bubbles-game_dots__wrap.traversing:after {
        width: 10px;
        height: 10px;
        transform: translate(28px, -50%);
    }
    @keyframes dot-traverse {
        0% { transform: translate(28px, -50%); }
        25% { transform: translate(96px, -50%); }
        50% { transform: translate(164px, -50%); }
        75% { transform: translate(232px, -50%); }
        100% { transform: translate(300px, -50%); }
    }
    .bubbles-game_main {
        width: auto;
        min-width: unset;
        max-width: 100%;
    }
}

@media screen and (max-width: 767px) and (orientation: portrait) {
    .bubbles {
        flex-wrap: wrap;
        position: relative;
        overflow: hidden;
    }
    .bubbles-game {
        transform: scale(0.55);
    }
    .bubbles-game_dots {
        width: auto;
        min-width: unset;
        max-width: 100%;
        transform: scale(0.9);
    }
    .bubbles-game_dot {
        width: auto;
        min-width: 0;
        max-width: 50px;
        height: 30px;
        flex: 1 1 0;
    }
    .bubbles-game_dot:after {
        width: 8px;
        height: 8px;
    }
    .bubbles-game_dots__wrap:before {
        left: 20px;
        right: 20px;
    }
    .bubbles-game_dots__wrap.traversing:after {
        width: 8px;
        height: 8px;
        transform: translate(20px, -50%);
    }
    @keyframes dot-traverse {
        0% { transform: translate(20px, -50%); }
        25% { transform: translate(72px, -50%); }
        50% { transform: translate(124px, -50%); }
        75% { transform: translate(176px, -50%); }
        100% { transform: translate(228px, -50%); }
    }
    .bubbles-result {
        height: 30px;
    }
    .bubbles-result_wrap {
        width: 109px;
        height: 56px;
        font-size: 16px;
    }
    .bubbles .game-field {
        padding-bottom: 0;
        height: 220px;
    }
}

@media screen and (max-width: 400px) {
    .bubbles-game {
        margin-top: -10px;
        transform: scale(0.45);
        gap: 0;
    }
    .bubbles-game_dots {
        max-width: 100%;
        transform: scale(0.85);
    }
    .bubbles-game_dot {
        max-width: 40px;
        height: 26px;
    }
    .bubbles-game_dot:after {
        width: 7px;
        height: 7px;
    }
    .bubbles-game_dots__wrap:before {
        left: 16px;
        right: 16px;
    }
    .bubbles-game_dots__wrap.traversing:after {
        width: 7px;
        height: 7px;
        transform: translate(16px, -50%);
    }
    @keyframes dot-traverse {
        0% { transform: translate(16px, -50%); }
        25% { transform: translate(58px, -50%); }
        50% { transform: translate(100px, -50%); }
        75% { transform: translate(142px, -50%); }
        100% { transform: translate(184px, -50%); }
    }
    .bubbles .game-field {
        height: 200px;
    }
}

.bubbles-win {
    position: absolute;
    top: 40%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-size: 24px;
    font-weight: 800;
    color: var(--ok);
    text-shadow: 0 2px 10px rgba(34, 197, 94, 0.35);
    animation: popInOut 2s ease forwards;
    pointer-events: none;
}

.bubbles-lose {
    position: absolute;
    top: 40%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-size: 48px;
    animation: popInOut 2s ease forwards;
    pointer-events: none;
}

@keyframes popInOut {
    0% {
        opacity: 0;
        transform: translate(-50%, -50%) scale(0.4);
    }
    15% {
        opacity: 1;
        transform: translate(-50%, -50%) scale(1.1);
    }
    30% {
        transform: translate(-50%, -50%) scale(1);
    }
    75% {
        opacity: 1;
    }
    100% {
        opacity: 0;
        transform: translate(-50%, -50%) translateY(-20px);
    }
}

/* ===== БОНУС МОДАЛЬНОЕ ОКНО ===== */
.bonus-overlay {
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.55);
    backdrop-filter: blur(6px);
    z-index: 2000;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 20px;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s ease;
}
.bonus-overlay.open {
    opacity: 1;
    pointer-events: auto;
}
.bonus-modal {
    background: var(--surface);
    border-radius: 24px;
    padding: 28px 24px 20px;
    max-width: 420px;
    width: 100%;
    box-shadow: 0 24px 60px rgba(15, 23, 42, 0.2);
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
}
.bonus-close {
    position: absolute;
    top: 12px;
    right: 14px;
    background: none;
    border: none;
    font-size: 20px;
    color: var(--text-faint);
    cursor: pointer;
    padding: 4px 8px;
    border-radius: 8px;
    transition: all 0.2s ease;
}
.bonus-close:hover {
    background: var(--surface-3);
    color: var(--text);
}
.bonus-title {
    font-size: 20px;
    font-weight: 800;
    color: var(--text);
    margin: 0;
}
.bonus-desc {
    font-size: 13px;
    color: var(--text-dim);
    margin: 0;
}
/* Здесь стояли .bonus-spins-info, .bonus-spins-num и .bonus-wheel-wrap от
   первой версии окна бонуса — таких классов в разметке нет с тех пор, как
   модалку переписали на .enhanced. Убраны: базовые правила с живыми именами
   молча протекают внутрь нового окна (так .bonus-modal { align-items: center }
   и разъехал шапку), а мёртвые просто путают при поиске. */

.bonus-wheel-img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.bonus-spin-btn {
    width: 100%;
    padding: 14px;
    border: none;
    border-radius: 14px;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: #fff;
    font-size: 15px;
    font-weight: 700;
    cursor: pointer;
    transition: all 0.2s ease;
    box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3);
}
.bonus-spin-btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 24px rgba(102, 126, 234, 0.4);
}
.bonus-spin-btn:disabled {
    background: var(--border-strong);
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
}
.bonus-later-btn {
    padding: 8px 20px;
    border: 1px solid var(--border);
    border-radius: 12px;
    background: var(--surface);
    font-size: 13px;
    font-weight: 600;
    color: var(--text-dim);
    cursor: pointer;
    transition: all 0.2s ease;
}
.bonus-later-btn:hover {
    background: var(--surface-2);
    border-color: var(--accent);
    color: var(--accent);
}
.bonus-result {
    font-size: 14px;
    font-weight: 700;
    color: var(--ok);
    text-align: center;
    min-height: 20px;
}

@keyframes slideInUp {
    from {
        opacity: 0;
        transform: translateY(20px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}


/* ======================================================================== */
/* 29. ПРОФИЛЬ ИГРОКА                                                       */
/*                                                                          */
/* Префикс pf-, потому что прежние .profile-* пересекались по именам с меню  */
/* профиля в шапке (.profile-dropdown-*) и путались при поиске.              */
/* ======================================================================== */

.pf-hero {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    gap: 24px;
    padding: 26px 28px;
    margin-bottom: 20px;
    border-radius: 24px;
    background: linear-gradient(135deg, #1e3a8a 0%, #2563eb 55%, #3b82f6 100%);
    box-shadow: 0 10px 30px rgba(37, 99, 235, 0.22);
    color: #ffffff;
    position: relative;
    overflow: hidden;
}

.pf-hero::before {
    content: '';
    position: absolute;
    top: -70px;
    right: -50px;
    width: 240px;
    height: 240px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(255, 255, 255, 0.16) 0%, transparent 65%);
}

.pf-hero__id {
    display: flex;
    align-items: center;
    gap: 16px;
    min-width: 0;
    position: relative;
    z-index: 1;
}

.pf-hero__avatar {
    width: 64px;
    height: 64px;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.18);
    border: 2px solid rgba(255, 255, 255, 0.35);
    font-size: 26px;
    font-weight: 800;
}

.pf-hero__who {
    min-width: 0;
}

.pf-hero__name {
    font-size: 22px;
    font-weight: 800;
    letter-spacing: -0.4px;
    line-height: 1.2;
    /* Логин часто оказывается почтой — она длиннее карточки */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.pf-hero__meta {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 6px;
    font-size: 13px;
    color: rgba(255, 255, 255, 0.82);
}

.pf-hero__dot {
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.5);
}

.pf-hero__wallet {
    position: relative;
    z-index: 1;
    text-align: right;
}

.pf-hero__balance-label {
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.6px;
    color: rgba(255, 255, 255, 0.7);
}

.pf-hero__balance {
    font-size: 32px;
    font-weight: 800;
    letter-spacing: -0.8px;
    line-height: 1.15;
    margin: 2px 0 14px;
}

.pf-hero__actions {
    display: flex;
    gap: 10px;
    justify-content: flex-end;
}

/* --- кнопки --- */

.pf-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    min-height: 42px;
    padding: 11px 20px;
    border: 1px solid var(--border);
    border-radius: 14px;
    background: var(--surface);
    color: var(--text-2);
    font-family: inherit;
    font-size: 14px;
    font-weight: 700;
    cursor: pointer;
    transition: all 0.18s ease;
}

.pf-btn:hover {
    border-color: var(--border-strong);
    background: var(--surface-2);
}

.pf-btn:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}

.pf-btn--primary {
    background: var(--accent);
    border-color: var(--accent);
    color: #ffffff;
}

.pf-btn--primary:hover {
    background: var(--accent-hover);
    border-color: var(--accent-hover);
}

.pf-btn--sm {
    min-height: 34px;
    padding: 7px 14px;
    font-size: 13px;
    border-radius: 11px;
}

.pf-btn--wide {
    width: 100%;
    margin-top: 14px;
}

/* Внутри синего героя белая рамка на белом фоне не видна */
.pf-hero .pf-btn {
    border-color: transparent;
}

.pf-hero .pf-btn:not(.pf-btn--primary) {
    background: rgba(255, 255, 255, 0.16);
    color: #ffffff;
}

.pf-hero .pf-btn:not(.pf-btn--primary):hover {
    background: rgba(255, 255, 255, 0.26);
}

.pf-hero .pf-btn--primary {
    background: #ffffff;
    color: #2563eb;
}

.pf-hero .pf-btn--primary:hover {
    background: #eff6ff;
}

/* --- плитки показателей --- */

/* Группа плиток с подписью. Касса и игра разведены: смешанные в один ряд,
   «пополнено» и «поставлено» читались как один список, хотя это про разное. */
.pf-group {
    margin-bottom: 18px;
}

.pf-group__label {
    display: block;
    margin-bottom: 9px;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 1.2px;
    color: var(--text-faint);
}

.pf-tiles {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(156px, 1fr));
    gap: 12px;
}

/* Плитки внутри группы отступ снизу уже не задают — его держит .pf-group */
.pf-group .pf-tiles { margin-bottom: 0; }

.pf-tile {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 16px 18px;
    border: 1px solid var(--border);
    border-radius: 18px;
    background: var(--surface);
}

.pf-tile__label {
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text-faint);
}

.pf-tile__value {
    font-size: 20px;
    font-weight: 800;
    color: var(--text);
    letter-spacing: -0.4px;
    font-variant-numeric: tabular-nums;
    overflow-wrap: anywhere;
}

/* Знак плюс/минус цветом: «−12 000 ₽» и «+12 000 ₽» одним чёрным читались
   одинаково, а разница между ними для игрока — главная на странице. */
.pf-tile__value.is-up   { color: var(--ok); }
.pf-tile__value.is-down { color: var(--danger); }

/* --- уровень в шапке --- */

.pf-level {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-top: 10px;
    padding: 5px 12px;
    border-radius: 999px;
    font-size: 11.5px;
    font-weight: 800;
    letter-spacing: 0.6px;
    /* Полупрозрачный белый: шапка профиля — синий градиент, и сплошная
       заливка цветом уровня на нём спорила бы с фоном. */
    background: rgba(255, 255, 255, 0.18);
    border: 1px solid rgba(255, 255, 255, 0.28);
    color: #ffffff;
}

.pf-level[hidden] { display: none; }

.pf-level svg {
    width: 13px;
    height: 13px;
    flex: none;
}

/* Корона подсвечивается в цвет уровня — сам бейдж остаётся нейтральным */
.pf-level--novice  svg { color: #bfdbfe; }
.pf-level--premium svg { color: #ddd6fe; }
.pf-level--vip     svg { color: #fcd34d; }

/* --- разбивка по играм --- */

.pf-game + .pf-game {
    margin-top: 14px;
    padding-top: 14px;
    border-top: 1px solid var(--border-soft);
}

.pf-game__top {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 8px;
}

.pf-game__name {
    font-size: 14px;
    font-weight: 700;
    color: var(--text);
}

.pf-game__net {
    font-size: 14px;
    font-weight: 800;
    color: var(--text-dim);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.pf-game__net.is-up   { color: var(--ok); }
.pf-game__net.is-down { color: var(--danger); }

/* Доля раундов этой игры от всех: видно, во что человек играет на самом
   деле, а не только сухие числа. */
.pf-game__track {
    height: 6px;
    border-radius: 999px;
    background: var(--surface-3);
    overflow: hidden;
}

.pf-game__track span {
    display: block;
    height: 100%;
    border-radius: 999px;
    background: linear-gradient(90deg, #3b82f6, #60a5fa);
}

.pf-game__foot {
    display: flex;
    justify-content: space-between;
    gap: 12px;
    margin-top: 6px;
    font-size: 12px;
    color: var(--text-faint);
    font-variant-numeric: tabular-nums;
}

.pf-card__note {
    font-size: 12px;
    font-weight: 600;
    color: var(--text-faint);
    white-space: nowrap;
}

.pf-row__value--warn { color: var(--warn-strong); }

/* --- сетка карточек --- */

.pf-grid {
    display: grid;
    grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
    align-items: start;
    gap: 16px;
}

.pf-col {
    display: flex;
    flex-direction: column;
    gap: 16px;
    min-width: 0;
}

.pf-card {
    padding: 22px;
    border: 1px solid var(--border);
    border-radius: 20px;
    background: var(--surface);
}

.pf-card__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 16px;
}

.pf-card__title {
    font-size: 16px;
    font-weight: 700;
    color: var(--text);
}

.pf-link {
    border: none;
    background: none;
    padding: 0;
    color: var(--accent);
    font-family: inherit;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
}

.pf-link:hover {
    text-decoration: underline;
}

.pf-empty {
    padding: 26px 0;
    text-align: center;
    color: var(--text-faint);
    font-size: 14px;
}

/* --- строки «ключ — значение» --- */

.pf-rows {
    display: flex;
    flex-direction: column;
}

.pf-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    padding: 11px 0;
    border-bottom: 1px solid var(--border-soft);
}

.pf-row:last-child {
    border-bottom: none;
}

.pf-row__label {
    font-size: 13px;
    color: var(--text-dim);
    font-weight: 500;
    flex: none;
}

.pf-row__value {
    font-size: 14px;
    font-weight: 700;
    color: var(--text);
    min-width: 0;
    text-align: right;
    overflow-wrap: anywhere;
}

/* --- привязки --- */

.pf-bind {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 12px 0;
    border-bottom: 1px solid var(--border-soft);
}

.pf-bind:last-child {
    border-bottom: none;
}

.pf-bind__info {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.pf-bind__name {
    font-size: 14px;
    font-weight: 700;
    color: var(--text);
}

.pf-bind__status {
    font-size: 12.5px;
    color: var(--text-faint);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.pf-bind__status.is-on {
    color: var(--ok);
    font-weight: 600;
}

/* --- операции --- */

.pf-tx {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 0;
    border-bottom: 1px solid var(--border-soft);
}

.pf-tx:last-child {
    border-bottom: none;
}

.pf-tx__icon {
    width: 36px;
    height: 36px;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 12px;
    font-size: 16px;
    font-weight: 700;
}

.pf-tx__icon.is-in {
    background: var(--ok-soft);
    color: var(--ok);
}

.pf-tx__icon.is-out {
    background: var(--warn-soft);
    color: var(--warn-strong);
}

.pf-tx__body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1;
    min-width: 0;
}

.pf-tx__title {
    font-size: 14px;
    font-weight: 700;
    color: var(--text);
}

.pf-tx__meta {
    font-size: 12px;
    color: var(--text-faint);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.pf-tx__right {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 3px;
    flex: none;
}

.pf-tx__sum {
    font-size: 14px;
    font-weight: 800;
    white-space: nowrap;
}

.pf-tx__sum.is-in { color: var(--ok); }
.pf-tx__sum.is-out { color: var(--text); }

.pf-tx__status {
    font-size: 11px;
    font-weight: 700;
    padding: 2px 8px;
    border-radius: 8px;
    background: var(--surface-3);
    color: var(--text-dim);
    white-space: nowrap;
}

.pf-tx__status.is-ok { background: var(--ok-soft); color: var(--ok); }
.pf-tx__status.is-wait { background: var(--warn-soft); color: var(--warn-strong); }
.pf-tx__status.is-bad { background: var(--danger-soft); color: var(--danger); }

/* Планшет: правая колонка перестаёт вмещать привязки */
@media (max-width: 1100px) {
    .pf-grid {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* ======================================================================== */
/* ИСТОРИЯ РАУНДОВ И ЧЕСТНАЯ ИГРА (правое меню игровых страниц)             */
/* ======================================================================== */

.gh-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 0;
    border-bottom: 1px solid var(--border-soft);
}

.gh-row:last-child {
    border-bottom: none;
}

.gh-mult {
    flex: none;
    min-width: 52px;
    padding: 5px 8px;
    border-radius: 9px;
    text-align: center;
    font-size: 12px;
    font-weight: 800;
}

.gh-mult.is-win { background: var(--ok-soft); color: var(--ok); }
.gh-mult.is-lose { background: var(--surface-3); color: var(--text-faint); }

.gh-body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1;
    min-width: 0;
}

.gh-sum {
    font-size: 13px;
    font-weight: 700;
    color: var(--text-dim);
}

.gh-sum.is-win { color: var(--ok); }

.gh-meta {
    font-size: 11px;
    color: var(--text-faint);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Номер раунда — он же кнопка проверки: у игрока не должно быть сомнений,
   что каждая строка истории проверяема поимённо. */
.gh-check {
    flex: none;
    padding: 4px 8px;
    border: 1px solid var(--border);
    border-radius: 8px;
    background: var(--surface);
    color: var(--text-faint);
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 11px;
    cursor: pointer;
    transition: all 0.18s ease;
}

.gh-check:hover {
    border-color: var(--accent);
    color: var(--accent);
}


/* ===== честная игра: карточка-приглашение в боковом меню ===== */

.fair-teaser {
    font-size: 12.5px;
    line-height: 1.55;
    color: var(--text-dim);
    margin: 0 0 14px;
}

/* ===== честная игра: модалка ===== */

/* Шире стандартных 440px: внутри две колонки, 64-символьные hex-строки сидов
   и форма пересчёта. В один столбец окно вытягивалось почти на 900px. */
.fair-modal {
    max-width: 860px;
}

.fair-grid {
    display: grid;
    /* auto-fit вместо брейкпоинта: колонки схлопываются в одну сами, когда
       окну не хватает ширины — и на телефоне, и на узком ноутбуке. */
    grid-template-columns: repeat(auto-fit, minmax(288px, 1fr));
    gap: 26px;
}

.fair-col {
    min-width: 0;
}

.fair-col__title {
    font-size: 13px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text);
    margin-bottom: 8px;
    padding-bottom: 8px;
    border-bottom: 1px solid var(--border-soft);
}

/* ===== вердикт проверки ===== */

.fair-verdict {
    padding: 12px 14px;
    border-radius: 13px;
    font-size: 15px;
    font-weight: 800;
    text-align: center;
    margin-bottom: 10px;
}

.fair-verdict.is-ok {
    background: var(--ok-soft);
    color: var(--ok);
    border: 1px solid var(--ok-border);
}

.fair-verdict.is-bad {
    background: var(--danger-soft);
    color: var(--danger);
    border: 1px solid var(--danger-border);
}

/* Две проверки по отдельности: хеш и исход. Показываем обе, а не только
   общий итог — игроку должно быть видно, что именно сошлось. */
.fair-checkline {
    position: relative;
    padding: 5px 0 5px 22px;
    font-size: 12.5px;
    line-height: 1.45;
    color: var(--text-2);
}

.fair-checkline::before {
    position: absolute;
    left: 0;
    top: 4px;
    font-weight: 800;
}

.fair-checkline.is-ok::before {
    content: '✓';
    color: var(--ok);
}

.fair-checkline.is-bad::before {
    content: '✗';
    color: var(--danger);
}

.fair-compare {
    display: grid;
    gap: 8px;
    margin: 12px 0 4px;
    padding: 12px;
    border: 1px solid var(--border);
    border-radius: 13px;
    background: var(--surface-2);
}

.fair-compare span {
    display: block;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    color: var(--text-faint);
    margin-bottom: 3px;
}

.fair-compare code {
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 13px;
    font-weight: 700;
    color: var(--text);
    overflow-wrap: anywhere;
}

.fair-empty {
    padding: 16px;
    border: 1px dashed var(--border);
    border-radius: 14px;
    background: var(--surface-2);
}

.fair-empty .fair-note {
    margin: 0;
}

.fair-icon {
    background: linear-gradient(135deg, #2563eb, #1d4ed8);
    box-shadow: 0 8px 20px rgba(37, 99, 235, 0.25);
}

.fair-note {
    font-size: 12.5px;
    line-height: 1.55;
    color: var(--text-dim);
    margin-bottom: 14px;
}

.fair-note--dim {
    color: var(--text-faint);
    font-size: 12px;
    margin: 10px 0 0;
}

.fair-line {
    display: flex;
    flex-direction: column;
    gap: 3px;
    padding: 9px 0;
    border-bottom: 1px solid var(--border-soft);
}

.fair-line__label {
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    color: var(--text-faint);
}

/* Сиды — длинные hex-строки. Перенос по любому символу, иначе строка
   распирает карточку и появляется горизонтальная прокрутка. */
.fair-line__value {
    display: block;
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 11.5px;
    line-height: 1.5;
    color: var(--text);
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 6px 8px;
    overflow-wrap: anywhere;
}

.fair-actions {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-top: 14px;
}

.fair-input {
    width: 100%;
    padding: 10px 12px;
    border: 1px solid var(--border);
    border-radius: 11px;
    background: var(--surface);
    font-family: inherit;
    font-size: 13px;
    color: var(--text);
    outline: none;
}

.fair-input:focus {
    border-color: var(--accent);
}


/* .fair-prev и .fair-verify убраны вместе с одноколоночной версией окна:
   раскрытая пара теперь подставлена прямо в поля формы справа, отдельного
   блока и кнопки «Проверить раунд» больше нет. */


.fair-result {
    margin-top: 12px;
    font-size: 12.5px;
    color: var(--text-2);
}

.fair-check {
    font-size: 12.5px;
    font-weight: 700;
    margin-bottom: 8px;
}

.fair-ok { color: var(--ok); }
.fair-bad { color: var(--danger); }

.fair-outcome {
    margin-top: 10px;
    padding: 10px 12px;
    border-radius: 11px;
    background: var(--surface);
    border: 1px solid var(--border);
    font-size: 13px;
    color: var(--text);
}

.fair-hint {
    display: block;
    margin-top: 4px;
    font-size: 11px;
    color: var(--text-faint);
    font-weight: 400;
}

/* ===== Промокод в профиле ===== */

.promo-form {
    display: flex;
    gap: 10px;
    align-items: stretch;
    flex-wrap: wrap;
}

.promo-input {
    flex: 1 1 200px;
    min-width: 0;
    padding: 13px 16px;
    border: 1px solid var(--border);
    border-radius: 14px;
    font-size: 15px;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text);
    background: var(--surface-2);
    outline: none;
    transition: border-color 0.2s ease, background 0.2s ease;
}

.promo-input::placeholder {
    font-weight: 500;
    letter-spacing: normal;
    text-transform: none;
    color: var(--text-faint);
}

/* Фокус в цвет карточки: на странице бонусов форма лежит в фиолетовой,
   а раньше подсвечивалась синим — единственный синий элемент на ней.
   var с запасным значением, потому что в профиле карточка без акцента. */
.promo-input:focus {
    border-color: var(--bx-accent, #2563eb);
    background: var(--surface);
    box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);
}

/* Промокод — это код: моноширинный набор и крупные разряды, чтобы легко
   было сверить символ в символ с тем, что прислали. */
.promo-input {
    font-family: 'Courier New', ui-monospace, monospace;
    letter-spacing: 0.14em;
    font-size: 16px;
}

.promo-form .btn-primary {
    padding: 13px 26px;
    border-radius: 14px;
    font-size: 14px;
}

.promo-form .btn-primary:disabled {
    opacity: 0.6;
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
}

.promo-message {
    font-size: 13px;
    font-weight: 500;
    color: var(--text-dim);
    margin-top: 10px;
    min-height: 18px;
}

.promo-message-success { color: var(--ok); }
.promo-message-error   { color: var(--danger); }

.promo-history {
    margin-top: 6px;
}

.promo-history-title {
    font-size: 12px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--text-faint);
    margin: 14px 0 8px;
}

.promo-history-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 0;
    border-bottom: 1px solid var(--border-soft);
    font-size: 13px;
}

.promo-history-row:last-child {
    border-bottom: none;
}

.promo-history-code {
    flex: 1;
    font-weight: 600;
    letter-spacing: 0.05em;
    color: var(--text);
}

/* Условие отыгрыша под кодом — второй строкой, чтобы длинная сумма не
   распирала ряд и не воевала за место с наградой справа. */
.promo-history-wager {
    display: block;
    margin-top: 2px;
    font-size: 11px;
    font-style: normal;
    font-weight: 600;
    letter-spacing: 0;
    color: var(--warn-strong);
}

.promo-history-reward {
    font-weight: 600;
    color: var(--ok);
    white-space: nowrap;
}

.promo-history-date {
    color: var(--text-faint);
    white-space: nowrap;
}

/* ======================================================================== */
/* 30. DEPOSIT/WITHDRAW MODALS */
/* ======================================================================== */


/* Блок мобильных правил для .profile-header-card / .profile-actions удалён
   вместе со старой разметкой профиля — теперь это .pf-hero, и его мобильная
   раскладка живёт в mobile.css. */

/* ======================================================================== */
/* 31. DEPOSIT/WITHDRAW MODALS ENHANCED */
/* ======================================================================== */

.auth-icon-badge {
    width: 56px;
    height: 56px;
    border-radius: 18px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 8px;
    color: #ffffff;
}


.telegram-icon {
    background: linear-gradient(135deg, #0ea5e9, #2563eb);
    box-shadow: 0 8px 20px rgba(37, 99, 235, 0.25);
}

.telegram-submit {
    background: linear-gradient(135deg, #0ea5e9, #2563eb);
    box-shadow: 0 8px 20px rgba(37, 99, 235, 0.25);
}

.telegram-submit:hover {
    background: linear-gradient(135deg, #2563eb, #1d4ed8);
    box-shadow: 0 12px 24px rgba(37, 99, 235, 0.35);
    transform: translateY(-2px);
}

#telegramBindModal .auth-modal {
    max-width: 420px;
}

#telegramBindCodeBlock {
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 16px;
}

#telegramBindCodeInput {
    background: var(--surface);
    border: 1px dashed var(--border-strong);
    border-radius: 10px;
    padding: 10px 12px;
    font-size: 18px;
    color: var(--text);
}

#telegramBindCodeInput:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}

/* ======================================================================== */
/* 32. КАССА: ПОПОЛНЕНИЕ И ВЫВОД                                            */
/*                                                                          */
/* Пополнение и вывод одинаковы по устройству, поэтому стили ОБЩИЕ: слева   */
/* список способов, справа сумма и итог. Не заводите отдельные наборы       */
/* .deposit-* / .withdraw-* — различие между окнами только в цвете кнопки.  */
/* ======================================================================== */

.cashier-modal {
    max-width: 860px;

    /* У .auth-modal стоит overflow: hidden и нет max-height: на десктопе
       низ длинного окна просто уходил за край экрана, доскроллить было
       нельзя. Мобильные правила такое уже чинят (mobile.css), десктопные —
       нет. overflow-y перебивает только вертикаль, горизонталь остаётся
       обрезанной, как и задумано скруглениями. */
    max-height: calc(100vh - 40px);
    max-height: calc(100dvh - 40px);
    overflow-y: auto;
}

/* Пока висит замок отыгрыша, листать форму под ним незачем — а если её
   прокрутить, замок (он позиционируется от окна) уехал бы вместе с ней. */
.cashier-modal:has(.cashier-lock:not([hidden])) {
    overflow: hidden;
}

.cashier {
    padding: 28px;
}

.cashier__head {
    margin-bottom: 22px;
    padding-right: 40px;      /* место под крестик */
}

.cashier__title {
    font-size: 22px;
    font-weight: 800;
    letter-spacing: -0.4px;
    color: var(--text);
    margin: 0 0 4px;
}

.cashier__sub {
    font-size: 13.5px;
    color: var(--text-dim);
    margin: 0;
}

.cashier__body {
    display: grid;
    grid-template-columns: minmax(0, 240px) minmax(0, 1fr);
    gap: 22px;
    align-items: start;
}

/* min-width: 0 обязателен обеим колонкам: без него длинное название способа
   или крупная сумма распирают grid-ячейку шире отведённой доли. */
.cashier__side,
.cashier__main {
    min-width: 0;
}

.cashier__label {
    display: block;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text-faint);
    margin-bottom: 10px;
}

/* ===== способы оплаты ===== */

.cashier-methods {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.cashier-method {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 100%;
    padding: 12px 14px;
    border: 1px solid var(--border);
    border-radius: 15px;
    background: var(--surface);
    font-family: inherit;
    text-align: left;
    cursor: pointer;
    transition: all 0.18s ease;
}

.cashier-method:hover {
    border-color: var(--border-strong);
    background: var(--surface-2);
}

.cashier-method.is-active {
    border-color: var(--accent);
    background: var(--surface-accent);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}

.cashier-method__icon {
    width: 38px;
    height: 38px;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 12px;
    background: var(--surface-3);
    color: var(--text-2);
}

.cashier-method.is-active .cashier-method__icon {
    background: var(--surface);
    color: var(--accent);
}

.cashier-method__icon svg {
    width: 20px;
    height: 20px;
}

.cashier-method__text {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.cashier-method__text b {
    font-size: 13.5px;
    font-weight: 700;
    color: var(--text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.cashier-method__text i {
    font-size: 11.5px;
    font-style: normal;
    color: var(--text-faint);
}

/* ===== сумма ===== */

.cashier-amount {
    position: relative;
    display: flex;
    align-items: center;
}

.cashier-amount__input {
    width: 100%;
    padding: 15px 44px 15px 18px;
    border: 1px solid var(--border);
    border-radius: 15px;
    background: var(--surface);
    font-family: inherit;
    font-size: 22px;
    font-weight: 800;
    color: var(--text);
    outline: none;
    transition: border-color 0.18s ease, box-shadow 0.18s ease;
    /* стрелки number-инпута рядом с крупной суммой только мешают */
    -moz-appearance: textfield;
    appearance: textfield;
}

.cashier-amount__input::-webkit-outer-spin-button,
.cashier-amount__input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.cashier-amount__input:focus {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}

.cashier-amount__cur {
    position: absolute;
    right: 18px;
    font-size: 18px;
    font-weight: 700;
    color: var(--text-faint);
    pointer-events: none;
}

.cashier-chips {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(84px, 1fr));
    gap: 8px;
    margin-top: 10px;
}

.cashier-chip {
    padding: 9px 8px;
    border: 1px solid var(--border);
    border-radius: 11px;
    background: var(--surface);
    font-family: inherit;
    font-size: 12.5px;
    font-weight: 700;
    color: var(--text-2);
    cursor: pointer;
    transition: all 0.18s ease;
    white-space: nowrap;
}

.cashier-chip:hover {
    border-color: var(--border-strong);
    background: var(--surface-2);
}

.cashier-chip.is-active {
    border-color: var(--accent);
    background: var(--surface-accent);
    color: var(--accent);
}

/* ===== итог ===== */

.cashier-total {
    margin-top: 16px;
}

.cashier-total__label {
    display: block;
    font-size: 12px;
    color: var(--text-dim);
    margin-bottom: 2px;
}

.cashier-total__value {
    font-size: 30px;
    font-weight: 800;
    letter-spacing: -0.8px;
    color: var(--text);
}

.cashier-field {
    display: block;
    margin-top: 16px;
}

.cashier-field span {
    display: block;
    font-size: 11px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text-faint);
    margin-bottom: 6px;
}

.cashier-input {
    width: 100%;
    padding: 12px 14px;
    border: 1px solid var(--border);
    border-radius: 13px;
    background: var(--surface);
    font-family: inherit;
    font-size: 14px;
    color: var(--text);
    outline: none;
}

.cashier-input:focus {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}

.cashier-note {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    margin-top: 16px;
    padding: 14px;
    border: 1px solid var(--border);
    border-radius: 15px;
    background: linear-gradient(135deg, var(--surface-accent) 0%, var(--violet-soft) 100%);
}

.cashier-note__icon {
    width: 34px;
    height: 34px;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 11px;
    background: var(--accent);
    color: #ffffff;
}

.cashier-note__icon svg {
    width: 17px;
    height: 17px;
}

.cashier-note b {
    display: block;
    font-size: 13px;
    font-weight: 700;
    color: var(--accent-hover);
    margin-bottom: 2px;
}

.cashier-note p {
    margin: 0;
    font-size: 12px;
    line-height: 1.5;
    color: var(--text-dim);
}

.cashier-facts {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1px;
    margin-top: 14px;
    border: 1px solid var(--border);
    border-radius: 15px;
    background: var(--surface-2);
    overflow: hidden;
}

.cashier-facts > div {
    padding: 12px 10px;
    background: var(--surface);
    text-align: center;
    min-width: 0;
}

.cashier-facts span {
    display: block;
    font-size: 11px;
    color: var(--text-faint);
    margin-bottom: 3px;
}

.cashier-facts b {
    font-size: 13.5px;
    font-weight: 800;
    color: var(--text);
    overflow-wrap: anywhere;
}

/* ---------- ИСТОРИЯ ОПЕРАЦИЙ В ОКНЕ КАССЫ ----------
 *
 * Полосой во всю ширину под обеими колонками, а не третьей колонкой и не
 * хвостом правой: на узком экране колонки встают друг под друга, и история
 * внутри любой из них вклинилась бы между выбором способа и полем суммы —
 * ровно посередине действия, ради которого окно открыли.
 *
 * СЕКЦИЯ СВОРАЧИВАЕТСЯ. На телефоне она закрыта: окно кассы там листается
 * целиком, и восемь строк истории между формой и её низом — ещё экран
 * прокрутки до кнопки, ради которой окно и открыли. На десктопе раскрыта
 * сразу. Состояние держит JS (setCashierHistoryOpen), потому что от ширины
 * зависит не только вид: закрытая секция не ходит на сервер.
 *
 * Список прокручивается внутри себя. Без max-height десять заявок уводят
 * кнопку «Пополнить» за нижний край экрана, и до неё приходится домотать —
 * при том, что справочный блок здесь именно история, а не форма.
 *
 * Строки — общие .pf-tx с профилем (см. «операции» выше), здесь только
 * рамка секции и мелкий шрифт: в модалке места меньше, чем на странице. */

.cashier-history {
    margin-top: 22px;
    padding-top: 18px;
    border-top: 1px solid var(--border);
}

/* ===== кнопка-раскрывашка =====
   Занимает всю ширину секции, а не только текст заголовка: на телефоне
   в неё целятся пальцем, и промах мимо узкой надписи — это лишний тап. */

.cashier-history__toggle {
    display: flex;
    align-items: center;
    gap: 10px;
    width: 100%;
    padding: 0;
    border: none;
    background: none;
    font-family: inherit;
    text-align: left;
    cursor: pointer;
    color: var(--text-dim);
    transition: color 0.15s ease;
}

.cashier-history__toggle:hover {
    color: var(--text);
}

/* .cashier__label несёт свой margin-bottom, а отступ до списка задаёт сам
   список — иначе между заголовком и первой строкой набегает двойной.
   margin-right: auto прижимает «Показать» и стрелку к правому краю. */
.cashier-history__toggle .cashier__label {
    margin-bottom: 0;
    margin-right: auto;
}

.cashier-history__hint {
    font-size: 12px;
    font-weight: 700;
    color: var(--accent);
    white-space: nowrap;
}

.cashier-history__chevron {
    width: 16px;
    height: 16px;
    flex: none;
    color: var(--accent);
    transition: transform 0.2s ease;
}

.cashier-history.is-open .cashier-history__chevron {
    transform: rotate(180deg);
}

/* ===== «Все операции» под списком =====
   Не в одной строке с заголовком: там уже живёт раскрывашка, и вторая
   кнопка внутри кликабельной строки — это либо вложенный <button>, либо
   промах пальцем не в ту цель. */

.cashier-history__foot {
    margin-top: 10px;
    text-align: right;
}

.cashier-history__foot[hidden] { display: none; }

.cashier-history__all {
    padding: 0;
    border: none;
    background: none;
    font-family: inherit;
    font-size: 12px;
    font-weight: 700;
    color: var(--accent);
    cursor: pointer;
    white-space: nowrap;
    transition: opacity 0.15s ease;
}

.cashier-history__all:hover {
    opacity: 0.75;
}

/* [hidden] прописан явно, а не оставлен браузерному стилю: display из
   любого правила ниже по каскаду его перебивает молча, и свёрнутая секция
   осталась бы на виду. Так же сделано у замка отыгрыша. */
.cashier-history__list[hidden] { display: none; }

.cashier-history__list {
    margin-top: 4px;
    max-height: 232px;
    overflow-y: auto;

    /* Прокрутка списка не должна тянуть за собой окно, когда дошли до
       края: .cashier-modal сам по себе прокручиваемый. */
    overscroll-behavior: contain;

    /* Место под полосу прокрутки, чтобы строки не дёргались вбок, когда
       заявок становится больше восьми. */
    padding-right: 4px;
}

.cashier-history__list .pf-tx {
    padding: 10px 0;
}

.cashier-history__list .pf-tx__icon {
    width: 30px;
    height: 30px;
    border-radius: 10px;
    font-size: 14px;
}

.cashier-history__list .pf-tx__title {
    font-size: 13px;
}

.cashier-history__list .pf-empty {
    padding: 18px 0;
    font-size: 13px;
}

/* ---------- ЗАМОК ОТЫГРЫША В ОКНЕ ВЫВОДА ----------
 *
 * Накрывает окно вывода целиком и размывает форму под собой. Так, а не
 * блоком в конце формы: у .auth-modal на десктопе overflow: hidden без
 * max-height, и низ длинного окна уходил за край экрана — предупреждение
 * рисовалось, но добраться до него было нельзя.
 *
 * Форма остаётся видна сквозь размытие: понятно, что именно откроется,
 * когда отыгрыш закончится.
 *
 * Янтарный, а не красный: это не ошибка игрока, а состояние счёта, которое
 * само пройдёт по мере игры. */

.cashier-lock[hidden] { display: none; }

.cashier-lock {
    position: absolute;
    inset: 0;
    z-index: 5;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    background: rgba(248, 250, 253, 0.72);
    backdrop-filter: blur(7px);
    -webkit-backdrop-filter: blur(7px);
    animation: cashierLockIn 0.25s ease both;
}

@keyframes cashierLockIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

.cashier-lock__card {
    width: 100%;
    max-width: 380px;
    max-height: 100%;
    overflow-y: auto;
    padding: 26px 24px;
    text-align: center;
    border: 1px solid var(--warn-border);
    border-radius: 22px;
    background: var(--warn-soft);
    box-shadow: 0 20px 44px rgba(146, 64, 14, 0.16);
}

.cashier-lock__icon {
    display: grid;
    place-items: center;
    width: 48px;
    height: 48px;
    margin: 0 auto 14px;
    border-radius: 50%;
    background: var(--warn-soft);
    color: var(--warn-strong);
}

.cashier-lock__icon svg {
    width: 22px;
    height: 22px;
}

.cashier-lock__title {
    font-size: 19px;
    font-weight: 800;
    letter-spacing: -0.3px;
    color: var(--warn-strong);
}

.cashier-lock__sub {
    margin-top: 4px;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--warn-strong);
}

.cashier-lock__amount {
    margin: 6px 0 16px;
    font-size: 34px;
    font-weight: 900;
    letter-spacing: -1px;
    line-height: 1.1;
    color: var(--warn-strong);
    font-variant-numeric: tabular-nums;
}

.cashier-lock__track {
    height: 8px;
    border-radius: 999px;
    background: var(--warn-soft);
    overflow: hidden;
}

.cashier-lock__fill {
    height: 100%;
    border-radius: 999px;
    background: linear-gradient(90deg, #fbbf24 0%, #f59e0b 100%);
    transition: width 0.4s ease;
}

.cashier-lock__progress {
    margin-top: 8px;
    font-size: 12px;
    font-weight: 700;
    color: var(--warn-strong);
    font-variant-numeric: tabular-nums;
}

.cashier-lock__note {
    margin-top: 14px;
    font-size: 12px;
    line-height: 1.55;
    color: var(--warn-strong);
}

.cashier-lock__actions {
    display: flex;
    gap: 8px;
    margin-top: 18px;
}

.cashier-lock__btn {
    flex: 1;
    min-height: 44px;
    padding: 0 14px;
    border: 1px solid var(--warn-border);
    border-radius: 14px;
    background: var(--surface);
    color: var(--warn-strong);
    font-family: inherit;
    font-size: 13.5px;
    font-weight: 700;
    cursor: pointer;
    transition: all 0.18s ease;
}

.cashier-lock__btn:hover {
    background: var(--warn-soft);
    border-color: var(--warn);
}

.cashier-lock__btn--main {
    background: var(--warn);
    border-color: var(--warn);
    color: #ffffff;
}

.cashier-lock__btn--main:hover {
    background: var(--warn);
    border-color: var(--warn);
}

@media (max-width: 480px) {
    .cashier-lock {
        padding: 14px;
    }

    .cashier-lock__card {
        padding: 22px 18px;
    }

    .cashier-lock__amount {
        font-size: 28px;
    }
}

.cashier-submit {
    width: 100%;
    min-height: 54px;
    margin-top: 16px;
    border: none;
    border-radius: 15px;
    background: var(--accent);
    color: #ffffff;
    font-family: inherit;
    font-size: 15px;
    font-weight: 700;
    cursor: pointer;
    transition: all 0.2s ease;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
}

.cashier-submit:hover:not(:disabled) {
    background: var(--accent-hover);
    transform: translateY(-1px);
    box-shadow: 0 10px 22px rgba(37, 99, 235, 0.28);
}

/* Заблокирована, пока не отыгран бонус. Серой заливкой, а не полупрозрачной
   синей: полупрозрачная читалась как «грузится», и по ней продолжали жать. */
.cashier-submit:disabled {
    background: var(--border-strong);
    box-shadow: none;
    transform: none;
    cursor: not-allowed;
}

.cashier__foot {
    margin: 12px 0 0;
    text-align: center;
    font-size: 11.5px;
    color: var(--text-faint);
}

/* ======================================================================== */
/* 33. DICE GAME */
/* ======================================================================== */

.game-wrapper {
    margin: 0 auto;
    padding: 0 16px;
}

.game-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 8px 0 16px;
    margin-bottom: 16px;
}

.game-title-wrap {
    display: flex;
    align-items: center;
    gap: 10px;
    cursor: pointer;
}

.game-title-icon-wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    background: linear-gradient(135deg, var(--surface-accent), var(--surface-accent));
    border-radius: 10px;
    color: var(--accent);
}

.game-title-text h1 {
    font-size: 16px;
    font-weight: 700;
    color: var(--text);
    margin: 0;
    line-height: 1.2;
}

.game-title-text p {
    font-size: 11px;
    color: var(--text-faint);
    margin: 0;
}

.game-balance-wrap {
    text-align: right;
}

.game-balance-text {
    display: block;
    font-size: 11px;
    font-weight: 600;
    color: var(--text-faint);
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.game-balance-num {
    display: block;
    font-size: 15px;
    font-weight: 700;
    color: var(--text);
}

.dice-main-card {
    background: var(--surface);
    border-radius: 24px;
    padding: 26px;
    box-shadow: 0 4px 28px rgba(30, 64, 175, 0.08);
    border: 1px solid var(--accent-border);
    position: relative;
    overflow: hidden;
}

.dice-main-card::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 3px;
    background: linear-gradient(90deg, #60a5fa, #2563eb, #1d4ed8);
    border-radius: 24px 24px 0 0;
}

.dice-main-card::after {
    content: '';
    position: absolute;
    top: -120px;
    right: -120px;
    width: 260px;
    height: 260px;
    background: radial-gradient(circle, rgba(37, 99, 235, 0.06) 0%, transparent 70%);
    pointer-events: none;
}

.dice-controls {
    display: flex;
    flex-direction: column;
    gap: 16px;
    margin-bottom: 18px;
    position: relative;
}

.dice-field {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.dice-field label {
    font-size: 12px;
    font-weight: 700;
    color: var(--text-dim);
    text-transform: uppercase;
    letter-spacing: 0.06em;
}

.dice-input-group {
    display: flex;
    align-items: center;
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 14px;
    overflow: hidden;
    transition: border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
}

.dice-input-group:focus-within {
    background: var(--surface);
    border-color: var(--accent);
    box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.1);
}

.dice-input {
    flex: 1;
    border: none;
    background: transparent;
    padding: 13px 16px;
    font-size: 18px;
    font-weight: 700;
    color: var(--text);
    font-family: 'Inter', sans-serif;
    outline: none;
    min-width: 0;
}

.dice-input::-webkit-inner-spin-button,
.dice-input::-webkit-outer-spin-button {
    opacity: 1;
}

.dice-suffix {
    padding: 13px 16px;
    font-size: 14px;
    font-weight: 700;
    color: var(--text-faint);
    background: transparent;
    border-left: 1px solid var(--border);
}

.dice-quick-row {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
}

.dice-quick-btn {
    padding: 6px 13px;
    font-size: 12px;
    font-weight: 700;
    color: var(--accent);
    background: var(--surface-accent);
    border: 1px solid var(--accent-border);
    border-radius: 8px;
    cursor: pointer;
    transition: all 0.15s ease;
    font-family: 'Inter', sans-serif;
}

.dice-quick-btn:hover {
    background: var(--accent);
    color: #ffffff;
    border-color: var(--accent);
    box-shadow: 0 4px 10px rgba(37, 99, 235, 0.25);
}

.dice-quick-btn:active {
    transform: scale(0.96);
}

.dice-result-card {
    text-align: center;
    padding: 14px;
    border-radius: 14px;
    font-weight: 700;
    font-size: 14px;
    margin-bottom: 16px;
    display: none;
}

.dice-result-card.win {
    display: block;
    background: linear-gradient(135deg, var(--ok-soft), var(--ok-soft));
    color: var(--ok);
    border: 1px solid var(--ok-border);
}

.dice-result-card.lose {
    display: block;
    background: linear-gradient(135deg, var(--danger-soft), var(--danger-soft));
    color: var(--danger);
    border: 1px solid var(--danger-border);
}

.dice-number-display {
    background: linear-gradient(160deg, var(--surface-2) 0%, var(--surface-accent) 100%);
    border-radius: 18px;
    padding: 26px 20px;
    text-align: center;
    margin-bottom: 16px;
    border: 1px solid var(--accent-border);
    position: relative;
    overflow: hidden;
}

.dice-number-display::before {
    content: '';
    position: absolute;
    top: -60%;
    left: -20%;
    width: 200%;
    height: 200%;
    background: radial-gradient(circle, rgba(37, 99, 235, 0.07) 0%, transparent 65%);
    pointer-events: none;
}

.dice-number-label {
    font-size: 12px;
    font-weight: 700;
    color: var(--violet);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin-bottom: 10px;
    position: relative;
}

.dice-number-value {
    font-size: 52px;
    font-weight: 900;
    color: var(--text);
    letter-spacing: -2px;
    line-height: 1;
    position: relative;
    transition: all 0.3s ease;
    font-variant-numeric: tabular-nums;
}

.dice-number-value.rolling {
    color: var(--accent);
    filter: blur(0.4px);
    animation: diceRoll 0.08s infinite alternate;
}

.dice-number-value.settled {
    animation: diceSettle 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.dice-number-value.win {
    color: var(--ok);
    text-shadow: 0 0 26px rgba(16, 185, 129, 0.35);
}

.dice-number-value.lose {
    color: var(--danger);
    text-shadow: 0 0 26px rgba(239, 68, 68, 0.3);
}

@keyframes diceRoll {
    0% { transform: scale(1) translateY(0); opacity: 1; }
    100% { transform: scale(1.04) translateY(-2px); opacity: 0.75; }
}

@keyframes diceSettle {
    0% { transform: scale(1.15); opacity: 0.4; }
    60% { transform: scale(0.96); opacity: 1; }
    100% { transform: scale(1); opacity: 1; }
}

.dice-potential {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    padding: 14px 20px;
    background: linear-gradient(135deg, var(--surface-accent) 0%, var(--surface-accent) 100%);
    border-radius: 14px;
    margin-bottom: 16px;
    font-size: 12px;
    font-weight: 600;
    color: var(--accent);
    border: 1px solid var(--accent-border);
}

.dice-potential-row {
    display: flex;
    align-items: center;
    gap: 10px;
}

.dice-potential-value {
    font-size: 26px;
    font-weight: 800;
    color: var(--accent-hover);
    letter-spacing: -0.5px;
    white-space: nowrap;
}

.dice-multiplier {
    font-size: 12px;
    font-weight: 700;
    color: #ffffff;
    background: linear-gradient(135deg, #3b82f6, #1d4ed8);
    padding: 4px 10px;
    border-radius: 8px;
}

.dice-choices {
    display: flex;
    gap: 10px;
    margin-bottom: 12px;
}

.dice-choice-btn {
    flex: 1;
    padding: 16px;
    font-size: 15px;
    font-weight: 700;
    color: #ffffff;
    border: none;
    border-radius: 14px;
    cursor: pointer;
    transition: all 0.2s ease;
    font-family: 'Inter', sans-serif;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    position: relative;
    overflow: hidden;
}

.dice-choice-btn::before {
    font-size: 13px;
    line-height: 1;
}

.dice-less-btn::before {
    content: '↓';
}

.dice-more-btn::before {
    content: '↑';
}

.dice-choice-btn:active:not(:disabled):not(.dice-choice-disabled) {
    transform: scale(0.97);
}

.dice-choice-btn:disabled,
.dice-choice-btn.dice-choice-disabled {
    opacity: 0.5;
    cursor: not-allowed;
    transform: none;
    pointer-events: none;
}

.dice-choice-btn.dice-choice-pressed {
    transform: scale(0.94);
}

.dice-less-btn {
    background: linear-gradient(135deg, #60a5fa, #3b82f6);
    box-shadow: 0 4px 12px rgba(59, 130, 246, 0.25);
}

.dice-less-btn:hover:not(:disabled):not(.dice-choice-disabled) {
    background: linear-gradient(135deg, #3b82f6, #2563eb);
    box-shadow: 0 6px 16px rgba(59, 130, 246, 0.35);
    transform: translateY(-1px);
}

.dice-more-btn {
    background: linear-gradient(135deg, #2563eb, #1d4ed8);
    box-shadow: 0 4px 12px rgba(29, 78, 216, 0.3);
}

.dice-more-btn:hover:not(:disabled):not(.dice-choice-disabled) {
    background: linear-gradient(135deg, #1d4ed8, #1e40af);
    box-shadow: 0 6px 16px rgba(29, 78, 216, 0.4);
    transform: translateY(-1px);
}

.dice-intervals {
    display: flex;
    gap: 10px;
}

.dice-interval {
    flex: 1;
    font-size: 11px;
    font-weight: 700;
    text-align: center;
    padding: 7px 8px;
    border-radius: 8px;
    border: 1px solid transparent;
    font-variant-numeric: tabular-nums;
}

.dice-interval-less {
    color: var(--accent);
    background: var(--surface-accent);
    border-color: var(--accent-border);
}

.dice-interval-more {
    color: var(--accent-hover);
    background: var(--violet-soft);
    border-color: var(--accent-border);
}

@media (max-width: 480px) {
    .game-wrapper {
        padding: 0 12px;
    }

    .dice-main-card {
        padding: 18px;
        border-radius: 18px;
    }

    .dice-number-display {
        padding: 20px 14px;
    }

    .dice-number-value {
        font-size: 40px;
    }

    .dice-choice-btn {
        padding: 14px;
        font-size: 14px;
    }

    .dice-potential-value {
        font-size: 22px;
    }
}


/* ======================================================================== */
/* 34. СОСТОЯНИЯ ЗАГРУЗКИ                                                   */
/*                                                                          */
/* Две разные вещи под одним мерцанием:                                     */
/*                                                                          */
/*   .is-booting  — шапка до ответа /api/me. Не ставьте в разметку          */
/*                  примерные значения баланса и аватара: первую секунду    */
/*                  каждый игрок будет видеть их как свои. Класс на <html>, */
/*                  снимается в index.html.                                 */
/*   .skel-*      — контент раздела, пока он грузится (showPageSkeleton).    */
/*                                                                          */
/* Общая анимация одна — skelShimmer, чтобы обе заглушки жили в одном ритме. */
/* ======================================================================== */

@keyframes skelShimmer {
    0%   { background-position: 100% 50%; }
    100% { background-position: -100% 50%; }
}

.skel,
.is-booting .balance-pill__sum::after,
.is-booting .avatar {
    background-color: var(--surface-2);
    /* Цвет блика — из темы (--skel-shine). Прибитый белый превращал
       заглушки в белые прямоугольники на тёмной теме: подложка менялась
       вместе с темой, а полоса поверх неё оставалась той же. */
    background-image: linear-gradient(
        90deg,
        transparent 0%,
        var(--skel-shine) 50%,
        transparent 100%
    );
    background-size: 200% 100%;
    background-repeat: no-repeat;
    animation: skelShimmer 1.4s ease-in-out infinite;
}

/* ---------- ШАПКА ДО ЗАГРУЗКИ ---------- */

/* ::after, а не фон самого элемента: у .balance-pill__sum есть min-width и
   padding, и красить его целиком значило бы залезть под кнопки кассы. */
.is-booting .balance-pill__sum::after {
    content: '';
    display: block;
    width: 100%;
    height: 13px;
    border-radius: 999px;
}

.is-booting .avatar {
    color: transparent;
    border-color: transparent;
}

/* Пока баланс неизвестен, касса недоступна: нажимать «Пополнить», не видя
   суммы, смысла нет, а обработчик всё равно отправит гостя на вход. */
.is-booting .balance-pill__btn {
    pointer-events: none;
    opacity: 0.5;
}

/* ---------- СКЕЛЕТОН РАЗДЕЛА ---------- */

.skel {
    border-radius: 16px;
}

.skel-page {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

.skel--banner {
    height: 232px;
    border-radius: 28px;
}

.skel--title {
    height: 26px;
    width: 220px;
    border-radius: 10px;
}

.skel-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 20px;
}

/* Та же пропорция, что у .game-card — карточки не прыгают при подмене */
.skel--card {
    aspect-ratio: 3 / 4;
    border-radius: 20px;
}

.skel--block {
    height: 200px;
    border-radius: 24px;
}

.skel--block-sm {
    height: 132px;
}

.skel-side {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

@media (max-width: 1100px) {
    .skel-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 850px) {
    .skel--banner {
        height: 168px;
        border-radius: 22px;
    }

    .skel-page,
    .skel-side {
        gap: 14px;
    }

    .skel-grid {
        gap: 12px;
    }

    .skel--block {
        height: 150px;
    }
}

@media (max-width: 480px) {
    .skel--title {
        width: 150px;
    }
}

/* Мерцание — декоративное. Без движения заглушка всё равно читается как
   «здесь что-то будет»: остаётся серый блок нужного размера. */
@media (prefers-reduced-motion: reduce) {
    .skel,
    .is-booting .balance-pill__sum::after,
    .is-booting .avatar {
        animation: none;
        background-image: none;
    }
}

/* ==================== КНОПКА GOOGLE ====================

   Разметку кнопки строит скрипт Google (renderGoogleButton в app.js) — своя
   вёрстка запрещена правилами бренда. Нам остаётся только выделить ей место
   и выровнять по центру: сам iframe кнопки инлайновый и без этого прижимается
   влево.

   Контейнеры пустые до тех пор, пока не подтвердится, что GOOGLE_CLIENT_ID
   задан. Не задан — прячутся, нерабочая кнопка хуже отсутствующей. */

.auth-google {
    display: flex;
    justify-content: center;
    margin-top: 12px;
    /* Минимальная высота, чтобы окно входа не дёргалось, когда кнопка
       дорисуется: скрипт Google приходит с задержкой. */
    min-height: 44px;
}

.auth-google:empty { min-height: 0; }

.pf-google {
    display: flex;
    justify-content: flex-end;
    min-width: 0;
}

.pf-google:empty { display: none; }

/* ==================== ПРОФИЛЬ: КАРТОЧКА УРОВНЯ ====================

   Заняла место разбивки по играм. Та говорила о прошлом, здесь — о том,
   что дальше: сколько осталось до следующего уровня и что он даёт.

   Карточка красится в цвет уровня — как шапка страницы уровней, куда она
   и отправляет. Цвет приходит модификатором из JS. */

.pf-level-card { --pf-lvl: #2563eb; }
.pf-level-card--novice  { --pf-lvl: #64748b; }
.pf-level-card--premium { --pf-lvl: #7c3aed; }
.pf-level-card--vip     { --pf-lvl: #d97706; }

.pf-lvl {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.pf-lvl__row {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
}

.pf-lvl__now {
    font-size: 20px;
    font-weight: 800;
    letter-spacing: -0.01em;
    color: var(--pf-lvl);
}

/* Следующий уровень приглушён: он ориентир, а не текущее положение */
.pf-lvl__next {
    font-size: 13px;
    font-weight: 600;
    color: var(--text-faint);
    white-space: nowrap;
}

.pf-lvl__track {
    height: 8px;
    border-radius: 999px;
    background: var(--surface-2);
    overflow: hidden;
}

.pf-lvl__fill {
    display: block;
    height: 100%;
    border-radius: inherit;
    background: var(--pf-lvl);
    /* Плавно — полоса заполняется уже после загрузки данных, и рывок от
       нуля к трети выглядел бы сбоем отрисовки. */
    transition: width .5s cubic-bezier(.4, 0, .2, 1);
}

.pf-lvl__hint {
    margin: 0;
    font-size: 13px;
    font-weight: 500;
    color: var(--text-dim);
}


/* ==========================================================================
   ОКНО «ФРИСПИНЫ НАЧИСЛЕНЫ» (промокод со своим слотом)

   Показывается сразу после активации кода, у которого выбрана игра. Ведущий
   элемент здесь — ОБЛОЖКА, и не ради красоты: «The Dog House», «The Big Dog
   House» и «Dog House Megaways» на слух неразличимы, и без картинки человек
   идёт в игру наугад.

   Та же картинка второй раз лежит фоном — размытая и растянутая. Окно
   всплывает поверх страницы, и без собственного цветового пятна читается как
   системное уведомление, а не как продолжение игры. Браузер её не
   догружает: адрес тот же, ответ из кэша.
   ========================================================================== */

.ps-hero {
    position: relative;
    margin: -6px -4px 18px;
    text-align: center;
}

/* Полоса-подложка. Градиент лежит ПОД картинкой и виден, если та не
   загрузилась: пустой серый прямоугольник вверху окна выглядел бы как
   недогруженная страница. */
.ps-hero__glow {
    position: relative;
    height: 96px;
    border-radius: 18px;
    overflow: hidden;
    background: linear-gradient(135deg, var(--accent) 0%, var(--violet) 100%);
}

/* scale — чтобы размытые края не оголили углы: blur размазывает картинку за
   её границы, и без растяжения по периметру осталась бы светлая кайма. */
.ps-hero__glow img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    filter: blur(18px) saturate(1.35);
    transform: scale(1.35);
    opacity: .9;
}

.ps-hero__glow img.is-dead { display: none; }

/* Затемнение поверх фона: обложка накрывает его сверху, и без этого светлый
   арт на светлом арте терял края. */
.ps-hero__glow::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg, rgba(15, 23, 42, .06), rgba(15, 23, 42, .34));
}

/* Обложка наезжает на полосу — приём, который делает шапку одним целым, а не
   картинкой над картинкой. Отдельная обёртка нужна «таблетке» со спинами:
   у самой обложки overflow: hidden, и там бы её обрезало. */
.ps-hero__cover {
    position: relative;
    width: 108px;
    margin: -54px auto 0;
    z-index: 1;
}

.ps-hero__art {
    width: 108px;
    height: 108px;
    border-radius: 22px;
    overflow: hidden;
    /* Рамка цветом карточки: обложка кажется вырезанной из фона, а не
       положенной на него. */
    border: 3px solid var(--surface);
    box-shadow: 0 14px 30px rgba(15, 23, 42, .24);
    background: linear-gradient(135deg, var(--accent) 0%, var(--violet) 100%);
}

.ps-hero__art img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* Ссылка мертва — остаётся градиент. Пустой серый квадрат читался бы как
   «игра не загрузилась». */
.ps-hero__art img.is-dead { display: none; }

/* Число спинов на стыке обложки и текста: самое заметное место в окне, и
   это то, ради чего вводили код. */
.ps-hero__count {
    position: absolute;
    left: 50%;
    bottom: -13px;
    transform: translateX(-50%);
    padding: 5px 14px;
    border-radius: 999px;
    border: 2px solid var(--surface);
    background: var(--accent);
    color: #fff;
    font-size: 13px;
    font-weight: 800;
    line-height: 1.25;
    white-space: nowrap;
    box-shadow: 0 6px 16px rgba(37, 99, 235, .34);
}

.ps-hero__eyebrow {
    margin-top: 26px;
    font-size: 10.5px;
    font-weight: 700;
    letter-spacing: .9px;
    text-transform: uppercase;
    color: var(--text-faint);
}

/* Название в две строки максимум: у слотов они длинные, а окно узкое.
   line-clamp вместо многоточия по ширине — обрывать «Big Bass Bonanza Reeled
   Em In» на первой строке значило бы спрятать ровно ту часть, которая
   отличает игру от соседней. */
.ps-hero__name {
    margin: 5px 0 12px;
    font-size: 21px;
    font-weight: 800;
    line-height: 1.22;
    letter-spacing: -.2px;
    color: var(--text);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.ps-hero__facts {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    justify-content: center;
}

.ps-fact {
    display: inline-flex;
    align-items: center;
    padding: 5px 11px;
    border-radius: 9px;
    background: var(--surface-3);
    font-size: 12px;
    font-weight: 600;
    color: var(--text-2);
    white-space: nowrap;
}

/* Отыгрыш — единственное УСЛОВИЕ среди фактов, остальное просто описание.
   Янтарным, чтобы человек зацепился за него до того, как нажмёт «перейти», а
   не узнал в кассе при отказе в выводе. */
.ps-fact--wager {
    background: var(--warn-soft);
    color: var(--warn-strong);
}

/* Кнопки этого окна — только здесь, по id: те же классы носят кнопки входа и
   кассы, и трогать их ради одной модалки нельзя. */
#promoSlotModal .auth-submit {
    box-shadow: 0 10px 24px rgba(37, 99, 235, .28);
}

/* «Позже» — тихая кнопка. Отказ здесь нормален (спины никуда не денутся), но
   спорить за внимание с «перейти в игру» он не должен. */
#promoSlotModal .btn-ghost {
    color: var(--text-dim);
    font-weight: 600;
}

@media (max-width: 480px) {
    .ps-hero__glow { height: 84px; border-radius: 15px; }
    .ps-hero__cover { width: 92px; margin-top: -46px; }
    .ps-hero__art { width: 92px; height: 92px; border-radius: 19px; }
    .ps-hero__name { font-size: 19px; }
}
