        /* Cards */
        .book-card {
            background: rgba(255,255,255,0.05);
            border: 1px solid rgba(255,255,255,0.1);
            border-radius: 16px;
            padding: 16px;
        }

        .book-card + .book-card { margin-top: 12px; }

        .slot-group-city {
            font-size: var(--bp-fs-caption);
            color: rgba(255,255,255,0.3);
            margin-left: auto;
            font-weight: 400;
            letter-spacing: 0.3px;
        }

        .duration-badge {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            font-size: var(--bp-fs-secondary);
            font-weight: 600;
            background: linear-gradient(135deg, #38bdf8 0%, #0284c7 100%);
            color: white;
            padding: 4px 0;
            border-radius: 12px;
            margin-left: auto;
            box-shadow: 0 2px 6px rgba(56, 189, 248, 0.35);
        }

        /* Width scales with duration */
        .duration-badge[data-duration="60"] { min-width: 65px; }
        .duration-badge[data-duration="90"] { min-width: 85px; }
        .duration-badge[data-duration="120"] { min-width: 105px; }

        /* Slot Group Headers */
        .slot-group-header {
            display: flex;
            align-items: center;
            gap: 8px;
            color: rgba(255,255,255,0.6);
            font-size: var(--bp-fs-body);
            font-weight: 600;
            text-transform: uppercase;
            letter-spacing: 0.5px;
            /* Подпись прижата к СВОЕМУ списку, а воздух собран сверху: так
               видно, где кончается предыдущая группа и начинается эта.
               Ступени 6/2 — общие для всех заголовков секций портала
               (таблица ролей над токенами в `brand-tokens.css`). */
            margin-bottom: var(--bp-space-2);
        }
        /* Соседство, а не `:not(:first-child)`: Alpine оставляет свой
           `<template>` ПЕРВЫМ ребёнком карточки, поэтому первая же группа
           попадала под правило и открывала расписание пустой полосой в 24px.
           Смежный селектор про шаблон не знает — воздух остаётся только
           МЕЖДУ группами, ради чего правило и заводили. */
        .slot-group + .slot-group .slot-group-header {
            margin-top: var(--bp-space-6);
        }
        .slot-group-header i { font-size: var(--bp-fs-h2); }
        .slot-group-header svg { flex-shrink: 0; }
        .night-owl-date {
            font-size: var(--bp-fs-secondary);
            color: rgba(255,255,255,0.4);
            font-weight: 400;
            margin-left: 4px;
        }

        /* Slots Grid */
        .slots-grid {
            display: grid;
            /* `minmax(0, 1fr)`, а не голый `1fr`: колонка с `1fr` не сужается
               ниже своего min-content, и самая длинная подпись на кнопке
               («ОЧЕРЕДЬ») распирала сетку — вся страница получала
               горизонтальную прокрутку, хотя на глаз ничего за край не
               торчало. С нулевым минимумом колонка сжимается, а перенос
               подписи разрешён ниже. */
            grid-template-columns: repeat(4, minmax(0, 1fr));
            gap: 8px;
        }

        .slot-wrapper { display: contents; }

        /* Тренерский режим («Хочу с тренером»): плоский список карточек
           тренеров без секций День/Вечер — иначе один тренер дробится на
           2-3 секции с повтором карточки. */
        .coach-card {
            padding: var(--bp-space-4) 0;
            border-bottom: 1px solid rgba(148, 163, 184, 0.14);
        }
        .coach-card:last-child { border-bottom: none; }
        .coach-card-head {
            display: flex;
            align-items: center;
            gap: 10px;
            margin-bottom: 12px;
        }
        .coach-card-avatar {
            width: 44px;
            height: 44px;
            border-radius: 50%;
            object-fit: cover;
            flex-shrink: 0;
        }
        .coach-card-initials {
            display: flex;
            align-items: center;
            justify-content: center;
            background: rgba(121, 172, 43, 0.22);
            color: var(--bp-green);
            font-weight: 700;
            font-size: var(--bp-fs-body);
        }
        .coach-card-name { font-weight: 700; color: #fff; }
        .coach-card-spec { font-size: var(--bp-fs-secondary); color: #94a3b8; }
        .coach-card .ga-list { margin-top: 8px; }

        .slot-btn {
            position: relative;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            border: none;
            border-radius: 8px;
            padding: 10px 8px 8px;
            font-weight: 700;
            font-size: var(--bp-fs-body);
            transition: all 0.2s;
            cursor: pointer;
            gap: 3px;
            /* Подпись переносится внутри кнопки, а не раздвигает колонку. */
            min-width: 0;
            overflow-wrap: anywhere;
        }

        .slot-btn.available {
            background: linear-gradient(135deg, var(--bp-green) 0%, var(--bp-green-dark) 100%);
            color: white;
        }

        .slot-btn.available.single-only {
            background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
        }
        @media (hover: hover) and (pointer: fine) {
            .slot-btn.available.single-only:hover {
                box-shadow: 0 4px 12px rgba(124, 58, 237, 0.4);
            }
        }

        @media (hover: hover) and (pointer: fine) {
            .slot-btn.available:hover {
                transform: scale(1.05);
                box-shadow: 0 4px 12px rgba(121, 172, 43, 0.4);
                color: white;
            }
        }

        .slot-btn.available.selected {
            transform: scale(1.05);
            box-shadow: 0 0 0 2px white, 0 4px 16px rgba(121, 172, 43, 0.5);
        }

        .slot-btn.waitlist {
            background: linear-gradient(135deg, var(--bp-orange) 0%, var(--bp-orange-dark) 100%);
            color: white;
        }

        @media (hover: hover) and (pointer: fine) {
            .slot-btn.waitlist:hover {
                transform: scale(1.05);
                box-shadow: 0 4px 12px rgba(249, 115, 22, 0.4);
            }
        }

        .slot-btn.sold-out {
            background: linear-gradient(135deg, var(--bp-orange) 0%, var(--bp-orange-dark) 100%);
            color: white;
            cursor: default;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            gap: 0;
            padding: 8px 6px;
        }

        .cross-club-banner {
            margin-top: 12px;
            padding: var(--bp-space-3) 14px;
            background: rgba(148, 163, 184, 0.1);
            border: 1px solid rgba(148, 163, 184, 0.15);
            border-radius: 10px;
            font-size: var(--bp-fs-caption);
            color: #94a3b8;
            line-height: 1.5;
        }
        .cross-club-banner-text { margin-bottom: 8px; }
        .cross-club-banner-times { font-weight: 600; color: #cbd5e1; }
        .cross-club-banner strong { color: #e2e8f0; }
        .cross-club-banner-btn {
            display: inline-block;
            padding: 5px 14px;
            background: transparent;
            color: #94a3b8;
            border: 1px solid rgba(148, 163, 184, 0.3);
            border-radius: 6px;
            font-size: var(--bp-fs-micro);
            font-weight: 500;
            text-decoration: none;
            cursor: pointer;
            transition: all 0.15s;
        }
        @media (hover: hover) and (pointer: fine) {
            .cross-club-banner-btn:hover {
                color: #e2e8f0;
                border-color: rgba(148, 163, 184, 0.5);
                background: rgba(148, 163, 184, 0.1);
            }
        }

        /* Секция турниров: заголовок носит общий ритм заголовков секций, а
           карточки идут ступенью «блок → блок» — они самостоятельные, а не
           строки списка. Раньше числа стояли в разметке (12 / 11 / 14) и
           расходились с соседними секциями того же экрана. */
        .my-tournaments {
            display: flex;
            flex-direction: column;
            gap: var(--bp-space-2);
            margin: var(--bp-space-3) 0;
        }
        .tournaments-list {
            display: flex;
            flex-direction: column;
            gap: var(--bp-space-3);
        }
