/* Стили вкладки index.html. Раньше лежали прямо в index.html внутри <style>.
   Вынесены в отдельный файл, чтобы браузер держал их в кеше и не
   качал и не разбирал заново при каждом переходе между вкладками. */
        @font-face {
            font-family: 'Chaos16';
            src: url('CHAOS16.otf') format('opentype');
            font-weight: normal;
            font-style: normal;
            font-display: swap;
        }

        :root {
            --bg: #ffffff;
            --card: #ffffff;
            --card-border: #ebebee;
            --accent: #0a0a0a;
            --text: #0a0a0a;
            --secondary: #6b7076;
            --hover-bg: #f2f2f4;
            --pill-bg: #f2f2f4;
            --glass: rgba(0, 0, 0, 0.05);
            --glass-strong: rgba(0, 0, 0, 0.09);
            --glass-border: rgba(0, 0, 0, 0.08);
            --glass-highlight: rgba(255, 255, 255, 0.7);
            --glass-blur: blur(14px) saturate(180%);
        }

        body.dark-theme {
            --bg: #000000;
            --card: #000000;
            --card-border: #1c1c1e;
            --accent: #ffffff;
            --text: #ffffff;
            --secondary: #7d8287;
            --hover-bg: #17181a;
            --pill-bg: #17181a;
            --glass: rgba(40, 40, 46, 0.56);
            --glass-strong: rgba(78, 78, 88, 0.62);
            --glass-border: rgba(255, 255, 255, 0.14);
            --glass-highlight: rgba(255, 255, 255, 0.35);
        }

        /* Основной шрифт для читаемости текста */
        body {
            font-family: 'Inter', system-ui, -apple-system, sans-serif;
            background-color: var(--bg);
            color: var(--text);
            margin: 0;
            padding: max(20px, env(safe-area-inset-top)) 20px 20px 20px;
            display: flex;
            flex-direction: column;
            align-items: center;
            font-weight: 500;
        }

        /* Акцентный шрифт Chaos16 для определенных элементов */
        .chaos-font {
            font-family: 'Chaos16', 'Inter', sans-serif !important;
        }

        /* ---------- «Добавить на главный экран» ----------
           Обычная стеклянная карточка в потоке страницы, над шапкой. Раньше
           это была липкая полоса на самом верху: на айфоне она залезала под
           часы и батарейку, и крестик было не нажать. В установленном
           приложении (PWA) карточка не показывается вообще - логика внизу. */
        .install-card {
            display: none;
            position: relative;
            margin: 4px 0 12px;
            padding: 12px 12px 12px 12px;
            border-radius: 22px;
            background: var(--glass);
            border: 1px solid var(--glass-border);
            -webkit-backdrop-filter: var(--glass-blur);
            backdrop-filter: var(--glass-blur);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
        }
        .install-card.show { display: block; }
        .install-row { display: flex; align-items: center; gap: 10px; }
        .install-icon {
            width: 44px; height: 44px;
            flex: none;
            border-radius: 11px;
            object-fit: cover;
            background: var(--glass-strong);
        }
        .install-text { flex: 1; min-width: 0; line-height: 1.25; }
        .install-text b { display: block; font-size: 0.88rem; font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
        .install-text span { font-size: 0.74rem; font-weight: 600; color: var(--secondary); }
        .install-btn {
            flex: none;
            height: 34px;
            padding: 0 14px;
            border: none;
            border-radius: 99px;
            background: var(--accent);
            color: var(--bg);
            font: inherit;
            font-size: 0.8rem;
            font-weight: 800;
            cursor: pointer;
            transition: transform .12s ease;
        }
        .install-btn:active { transform: scale(.94); }
        .install-close {
            flex: none;
            width: 34px; height: 34px;
            display: grid;
            place-items: center;
            margin-left: -4px;
            padding: 0;
            border: none;
            border-radius: 50%;
            background: transparent;
            color: var(--secondary);
            cursor: pointer;
        }
        .install-close svg { width: 16px; height: 16px; stroke: currentColor; stroke-width: 2.4; fill: none; stroke-linecap: round; }
        /* инструкция для айфона: «поделиться → на экран домой» */
        .install-steps {
            display: none;
            margin: 12px 2px 2px;
            padding: 10px 12px;
            border-radius: 14px;
            background: var(--glass-strong);
            font-size: 0.8rem;
            font-weight: 600;
            line-height: 1.5;
        }
        .install-card.steps .install-steps { display: block; }
        .install-steps ol { margin: 0; padding-left: 18px; }
        .install-steps svg {
            width: 16px; height: 16px;
            vertical-align: -3px;
            stroke: currentColor; stroke-width: 2; fill: none; stroke-linecap: round; stroke-linejoin: round;
        }

        body.dark-theme select {
            background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'%3E%3C/path%3E%3C/svg%3E");
        }

        /* Кнопка темы одинаковая на всех вкладках */
        .theme-toggle {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 38px;
            height: 38px;
            padding: 0;
            border-radius: 50%;
            border: 1px solid var(--glass-border);
            background: var(--glass);
            -webkit-backdrop-filter: var(--glass-blur);
            backdrop-filter: var(--glass-blur);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            color: var(--text);
            cursor: pointer;
            flex: none;
            transition: transform .12s ease, background-color .15s ease;
        }

        .theme-toggle:hover { background: var(--glass-strong); }
        .theme-toggle:active { transform: scale(0.92); }

        .theme-toggle svg {
            width: 18px;
            height: 18px;
            stroke: currentColor;
            stroke-width: 2;
            fill: none;
            stroke-linecap: round;
            stroke-linejoin: round;
        }

        select, input, button, textarea {
            font-family: inherit;
        }

        .container {
            max-width: 500px;
            width: 100%;
        }

        header {
            margin-bottom: 1.5rem;
            text-align: center;
        }

        header h1 {
            font-weight: 800;
            margin-bottom: 5px;
            letter-spacing: -0.5px;
            font-size: 2rem;
        }

        .controls {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 10px;
            margin-bottom: 10px;
        }

        select {
            width: 100%;
            box-sizing: border-box;
            padding: 12px 35px 12px 20px;
            border-radius: 99px;
            text-align: center;
            font-size: 16px;
            background-color: var(--glass);
            -webkit-backdrop-filter: var(--glass-blur);
            backdrop-filter: var(--glass-blur);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            border: 1px solid var(--glass-border);
            color: var(--text);
            font-weight: 700;
            outline: none;
            cursor: pointer;
            transition: all 0.2s ease;
            appearance: none;
            background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'%3E%3C/path%3E%3C/svg%3E");
            background-repeat: no-repeat;
            background-position: right 14px center;
        }

        select:hover {
            background-color: var(--glass-strong);
        }

        select:focus {
            border-color: var(--accent);
        }

        select option {
            background-color: var(--bg);
            color: var(--text);
        }

        /* Плашка-капсула для выбора дней */
        .day-chips {
            display: flex;
            gap: 4px;
            padding: 4px;
            margin-bottom: 1.5rem;
            border-radius: 99px;
            background: var(--glass);
            -webkit-backdrop-filter: var(--glass-blur);
            backdrop-filter: var(--glass-blur);
            border: 1px solid var(--glass-border);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
        }

.day-chip {
            flex: 1;
            border: none;
            background: transparent;
            color: var(--secondary);
            font-size: 0.82rem;
            font-weight: 800;
            padding: 10px 0;
            border-radius: 99px;
            cursor: pointer;
            text-align: center;
            /* Плавный переход для всех свойств (фона, цвета, тени) */
            transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
                        color 0.2s ease,
                        box-shadow 0.2s ease,
                        transform 0.1s ease;
        }

        /* Эффект нажатия пальцем (Scale down) */
        .day-chip:active {
            transform: scale(0.92);
        }

        /* Плавное проявление активного состояния */
        .day-chip.active {
            background: var(--glass-strong);
            color: var(--text);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            animation: chipPop 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
        }

        /* Микро-импульс при выборе дня */
        @keyframes chipPop {
            0% { transform: scale(0.95); }
            50% { transform: scale(1.03); }
            100% { transform: scale(1); }
        }

        /* Карточки пар (Liquid Glass) */
        .lesson-card {
            background: var(--glass);
            -webkit-backdrop-filter: var(--glass-blur);
            backdrop-filter: var(--glass-blur);
            border: 1px solid var(--glass-border);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            padding: 20px;
            border-radius: 20px;
            margin-bottom: 1rem;
            position: relative;
            
            /* Въезд карточек двигает JS (блок «Живое расписание»): раньше
               CSS-анимация проигрывалась заново при каждом обновлении,
               то есть раз в минуту все карточки «всплывали» */
            transition: transform 0.2s ease, background 0.2s ease;
        }


        .lesson-card.active {
            border-color: var(--glass-border);
            background: var(--glass-strong);
            transform: translateY(-2px);
            box-shadow: inset 0 1px 0 var(--glass-highlight), 0 10px 28px rgba(0, 0, 0, 0.35);
        }

        body:not(.dark-theme) .lesson-card.active {
            box-shadow: inset 0 1px 0 var(--glass-highlight), 0 8px 20px rgba(0, 0, 0, 0.08);
        }

        .time {
            font-size: 0.8rem;
            color: var(--secondary);
            margin-bottom: 8px;
            display: flex;
            align-items: center;
            font-weight: 700;
        }

        .subject-row {
            display: flex;
            justify-content: space-between;
            align-items: flex-start;
            gap: 10px;
            margin-bottom: 12px;
        }

        .subject {
            font-size: 1.15rem;
            font-weight: 900;
            line-height: 1.2;
            color: var(--text);
            margin: 0;
        }

        .combined-badge {
            font-size: 0.65rem;
            font-weight: 700;
            background: var(--glass-strong);
            color: var(--secondary);
            padding: 4px 9px;
            border-radius: 99px;
            white-space: nowrap;
            display: inline-flex;
            align-items: center;
        }

        .details {
            display: flex;
            justify-content: space-between;
            font-size: 0.9rem;
            color: var(--secondary);
            font-weight: 600;
        }

        .details b {
            color: var(--text);
            font-weight: 800;
        }

        .progress-container {
            height: 6px;
            background: var(--pill-bg);
            border-radius: 3px;
            margin-top: 15px;
            overflow: hidden;
            display: none;
        }

        .active .progress-container { display: block; }

        .progress-bar {
            height: 100%;
            background: var(--secondary);
            width: 0%;
            transition: width 1s linear;
        }

        .status-badge {
            font-size: 0.65rem;
            padding: 3px 9px;
            border-radius: 99px;
            background: var(--text);
            color: var(--bg);
            margin-left: 10px;
            font-weight: 700;
        }

        footer {
            margin-top: 40px;
            padding: 20px 0;
            text-align: center;
            border-top: 1px solid var(--card-border);
            width: 100%;
        }

        .disclaimer {
            font-size: 0.75rem;
            color: var(--secondary);
            line-height: 1.5;
            font-weight: 600;
        }

        .disclaimer a {
            color: var(--accent);
            text-decoration: none;
            font-weight: 700;
            border-bottom: 1px solid var(--accent);
        }

        .empty-state {
            text-align: center;
            padding: 3rem;
            border: 1px dashed var(--card-border);
            border-radius: 20px;
            background: var(--glass);
            -webkit-backdrop-filter: var(--glass-blur);
            backdrop-filter: var(--glass-blur);
            color: var(--secondary);
            font-weight: 700;
            font-size: 0.9rem;
        }

        /* ---------- Шапка: плавающее «жидкое стекло» ----------
           Те же переменные, что у кнопок (--glass, --glass-border, --glass-highlight).
           При прокрутке вниз уезжает вверх, при прокрутке вверх возвращается */
        .topbar {
            /* Крутить здесь: заливка и размытие только шапки */
            --topbar-tint: var(--glass);
            --topbar-blur: blur(20px) saturate(180%);

            top: calc(env(safe-area-inset-top) + 8px);
            z-index: 50;
            border-radius: 999px;
            padding: 6px 8px 6px 18px;
            margin-top: 8px;
            background: var(--topbar-tint) !important;
            border: 1px solid var(--glass-border) !important;
            -webkit-backdrop-filter: var(--topbar-blur);
            backdrop-filter: var(--topbar-blur);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            transition: transform .3s cubic-bezier(.2, .8, .2, 1);
            will-change: transform;
        }

        .topbar h1 { margin-top: 0; margin-bottom: 0; }

        .topbar.hide-up {
            transform: translateY(calc(-100% - env(safe-area-inset-top) - 30px)) !important;
            pointer-events: none;
        }

        /* Если браузер не умеет размывать фон - стекло плотнее, чтобы читалось */
        @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
            .topbar { --topbar-tint: color-mix(in srgb, var(--bg) 92%, transparent); }
        }

        /* ---------- Без автозума на телефонах ----------
           Safari приближает страницу, если у поля ввода шрифт меньше 16px */
        @media (hover: none), (pointer: coarse) {
            input[type="text"], input[type="search"], input[type="password"],
            textarea, select, .field {
                font-size: 16px !important;
            }
        }

        /* ---------- Шапка расписания ---------- */
        .topbar {
            position: sticky;
            margin-bottom: 18px;
            text-align: left;
        }

        header.topbar h1 { flex: none; }

        /* Даты недели - внутри шапки, справа от заголовка, мелко */
        .week-range {
            flex: 1;
            min-width: 0;
            color: var(--secondary);
            font-weight: 700;
            font-size: 0.7rem;
            line-height: 1.15;
            text-align: left;
            /* если не влезает в строку - переносится, максимум на 2 строки */
            display: -webkit-box;
            -webkit-line-clamp: 2;
            -webkit-box-orient: vertical;
            overflow: hidden;
        }

        /* кнопку темы - к правому краю */
        .topbar .theme-toggle { margin-left: auto; }

        /* ---------- Единые размеры шапки на всех вкладках ----------
           Этот блок одинаковый в index, forum, lost и profile.
           Меняешь здесь - меняй и в остальных файлах */
        .topbar {
            display: flex;
            align-items: center;
            gap: 8px;
            height: 52px !important;
            min-height: 0 !important;
            box-sizing: border-box !important;
            padding: 6px 7px 6px 18px !important;
        }

        .topbar h1 {
            font-size: 1.5rem !important;
            line-height: 1 !important;
            margin: 0 !important;
            white-space: nowrap;
            flex: 1 1 auto;
            min-width: 0;
        }

        .topbar .icon-btn,
        .topbar .theme-toggle {
            width: 38px !important;
            height: 38px !important;
            min-width: 38px;
            flex: none;
            box-sizing: border-box;
        }
        /* ==========================================================
           ЖИВОЕ РАСПИСАНИЕ (liquid glass)
           Движение - в JS внизу страницы (VG.liquid из app.js),
           здесь состояния и вид.
           ========================================================== */

        /* Дни недели: подсветка - отдельная стеклянная капля, которая
           перетекает между днями. Класс has-pill ставит JS: без него
           подсветка остаётся прежней, на самой кнопке. */
        .day-chips { position: relative; }
        .day-chip { position: relative; z-index: 1; }
        .day-chips.has-pill .day-chip.active {
            background: transparent;
            box-shadow: none;
            animation: none;
        }
        .day-pill {
            position: absolute;
            left: 0;
            top: 0;
            z-index: 0;
            border-radius: 99px;
            pointer-events: none;
            opacity: 0;
            background: var(--glass-strong);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
        }
        .day-pill.ready { opacity: 1; }
        /* отпускание дня - с пружинкой */
        .day-chip {
            transition: background-color .2s cubic-bezier(.4, 0, .2, 1), color .2s ease,
                        box-shadow .2s ease, transform .45s cubic-bezier(.34, 1.56, .64, 1);
        }
        .day-chip:active { transform: scale(.88, .84); transition-duration: .2s, .2s, .2s, .1s; }

        /* точка под сегодняшним днём */
        .day-chip.today::after {
            content: '';
            position: absolute;
            left: 50%;
            bottom: 4px;
            width: 4px;
            height: 4px;
            margin-left: -2px;
            border-radius: 50%;
            background: currentColor;
            opacity: .7;
        }

        /* Пока блок расписания перетекает по высоте, VG.liquid обрезает его
           по краям (overflow: clip) - и верхняя карточка теряла пару пикселей:
           она въезжает с перелётом вверх, а текущая пара ещё и приподнята
           с тенью. Здесь режем только снизу, а сверху и по бокам - нет */
        #schedule.vg-lq {
            overflow: visible !important;
            clip-path: inset(-60px -100vw 0 -100vw);
        }

        /* «обновлено …» живёт в шапке на месте дат недели: при открытии даты
           уплывают вверх, на их место всплывает «обновлено», через 10 секунд
           наоборот. Места не занимает и ничего не двигает */
        .tb-meta { flex: 1; min-width: 0; display: grid; align-items: center; }
        .tb-meta > * {
            grid-area: 1 / 1;
            transition: opacity .32s ease, transform .55s cubic-bezier(.3, 1.4, .5, 1), filter .32s ease;
        }
        .upd-badge {
            display: inline-flex;
            align-items: center;
            gap: 6px;
            min-width: 0;
            font-size: 0.7rem;
            font-weight: 700;
            line-height: 1.15;
            white-space: nowrap;
            overflow: hidden;
            color: color-mix(in srgb, var(--text) 62%, transparent);
            opacity: 0;
            transform: translateY(8px);
            filter: blur(3px);
            pointer-events: none;
        }
        .upd-badge::before {
            content: '';
            flex: none;
            width: 6px;
            height: 6px;
            border-radius: 50%;
            background: currentColor;
            opacity: .7;
        }
        /* свежее, сегодняшнее - зелёная точка, которая дышит */
        .upd-badge span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
        .upd-badge.fresh { color: var(--text); }
        .upd-badge.fresh::before { background: #34c759; opacity: 1; box-shadow: 0 0 0 0 rgba(52, 199, 89, .55); animation: updPulse 1.8s ease-out infinite; }
        @keyframes updPulse { to { box-shadow: 0 0 0 6px rgba(52, 199, 89, 0); } }
        .tb-meta.show-upd .upd-badge { opacity: 1; transform: none; filter: none; }
        .tb-meta.show-upd .week-range { opacity: 0; transform: translateY(-8px); filter: blur(3px); }

        /* ---------- день недели + «сегодня» ---------- */
        .dh-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
        .dh-head .dh-title { margin: 0; min-width: 0; }
        .dh-today[hidden] { display: none; }
        @media (prefers-reduced-motion: reduce) {
            .tb-meta > * { transition: none; }
            .upd-badge.fresh::before, .dh-today::before { animation: none; }
        }

        /* Свайп по расписанию листает дни, вертикальный скролл не трогаем */
        #schedule { touch-action: pan-y pinch-zoom; }

        /* Текущая пара: живая точка у «сейчас» и блик, текущий по полосе */
        .status-badge { display: inline-flex; align-items: center; gap: 5px; }
        .status-badge::before {
            content: '';
            width: 6px;
            height: 6px;
            border-radius: 50%;
            background: currentColor;
            animation: lqLive 1.6s ease-in-out infinite;
        }
        @keyframes lqLive {
            0%, 100% { opacity: 1; transform: scale(1); }
            50% { opacity: .35; transform: scale(.65); }
        }
        .progress-bar { position: relative; overflow: hidden; border-radius: 3px; }
        .progress-bar::after {
            content: '';
            position: absolute;
            inset: 0;
            background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .5), transparent);
            transform: translateX(-100%);
            animation: lqFlow 2.4s cubic-bezier(.4, 0, .2, 1) infinite;
        }
        @keyframes lqFlow { 60%, 100% { transform: translateX(100%); } }

        /* Блик за курсором на стекле карточки (только мышь) */
        @media (hover: hover) and (pointer: fine) {
            .lesson-card { overflow: hidden; }
            .lesson-card::after {
                content: '';
                position: absolute;
                inset: 0;
                border-radius: inherit;
                pointer-events: none;
                opacity: 0;
                transition: opacity .35s ease;
                background: radial-gradient(360px circle at var(--mx, 50%) var(--my, 0%),
                    rgba(255, 255, 255, .08), transparent 50%);
            }
            body:not(.dark-theme) .lesson-card::after {
                background: radial-gradient(360px circle at var(--mx, 50%) var(--my, 0%),
                    rgba(255, 255, 255, .7), transparent 50%);
                mix-blend-mode: soft-light;
            }
            .lesson-card:hover::after { opacity: 1; }
        }

        /* Заглушки, пока расписание грузится: стекло с бегущим бликом */
        .lesson-card.skeleton { pointer-events: none; }
        .sk {
            position: relative;
            overflow: hidden;
            border-radius: 99px;
            background: var(--glass-strong);
        }
        .sk::after {
            content: '';
            position: absolute;
            inset: 0;
            background: linear-gradient(90deg, transparent, var(--glass-highlight), transparent);
            transform: translateX(-100%);
            animation: lqFlow 1.6s ease-in-out infinite;
        }
        .sk-time  { width: 42%; height: 10px; margin-bottom: 14px; }
        .sk-title { width: 72%; height: 18px; margin-bottom: 16px; }
        .sk-line  { width: 55%; height: 12px; }
        .lesson-card.skeleton:nth-child(2) .sk::after { animation-delay: .15s; }
        .lesson-card.skeleton:nth-child(3) .sk::after { animation-delay: .3s; }

        /* «Пар нет»: чашка покачивается */
        .empty-emoji {
            display: block;
            font-size: 2rem;
            margin-bottom: 8px;
            animation: lqSway 3.2s ease-in-out infinite;
            transform-origin: 50% 90%;
        }
        @keyframes lqSway {
            0%, 100% { transform: rotate(-6deg) translateY(0); }
            50% { transform: rotate(6deg) translateY(-3px); }
        }

        /* буквы заголовка при первом заходе */
        .topbar h1 .tw { display: inline-block; white-space: pre; }

        @media (prefers-reduced-motion: reduce) {
            .status-badge::before, .progress-bar::after, .sk::after, .empty-emoji { animation: none; }
            .day-chip:active { transform: none; }
        }

        /* ==========================================================
           РАСПИСАНИЕ В СТИЛЕ ПРОФИЛЯ И ФОРУМА
           Обложка в цвете группы, шапка дня, номера пар плашками.
           Оттенки группы (--h1/--h2) ставит setTone() в скрипте.
           Блок последний - перебивает то, что выше, старое не тронуто.
           ========================================================== */
        @property --h1 { syntax: '<number>'; inherits: true; initial-value: 228; }
        @property --h2 { syntax: '<number>'; inherits: true; initial-value: 292; }

        .sched-root {
            --h1: 228;
            --h2: 292;
            --tone: hsl(var(--h1) 72% 50%);
            position: relative;
            isolation: isolate;
            transition: --h1 .7s cubic-bezier(.3, .7, .2, 1), --h2 .7s cubic-bezier(.3, .7, .2, 1);
        }
        body.dark-theme .sched-root { --tone: hsl(var(--h1) 78% 66%); }

        /* ---------- Обложка ---------- */
        .sched-cover {
            position: absolute;
            z-index: -1;
            top: 0;
            left: 50%;
            width: 100vw;
            margin-left: -50vw;
            height: calc(env(safe-area-inset-top) + 300px);
            overflow: hidden;
            pointer-events: none;
            -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 38%, rgba(0, 0, 0, .55) 64%, rgba(0, 0, 0, .15) 84%, transparent 100%);
                    mask-image: linear-gradient(to bottom, #000 0%, #000 38%, rgba(0, 0, 0, .55) 64%, rgba(0, 0, 0, .15) 84%, transparent 100%);
        }
        .sched-cover-art {
            position: absolute;
            inset: 0;
            background:
                radial-gradient(90% 80% at 88% 10%, hsl(var(--h2) 90% 74% / .95), transparent 62%),
                radial-gradient(80% 110% at 0% 85%, hsl(var(--h1) 88% 64% / .95), transparent 66%),
                linear-gradient(135deg, hsl(var(--h1) 70% 80%), hsl(var(--h2) 68% 72%));
        }
        body.dark-theme .sched-cover-art {
            background:
                radial-gradient(90% 80% at 88% 10%, hsl(var(--h2) 70% 42% / .95), transparent 62%),
                radial-gradient(80% 110% at 0% 85%, hsl(var(--h1) 72% 36% / .95), transparent 66%),
                linear-gradient(135deg, hsl(var(--h1) 45% 20%), hsl(var(--h2) 45% 24%));
        }
        /* перфорация киноплёнки */
        .sched-cover-art::before,
        .sched-cover-art::after {
            content: '';
            position: absolute;
            left: 0;
            right: 0;
            height: 8px;
            background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='8'%3E%3Crect x='5' y='0' width='10' height='8' rx='2.2' fill='white'/%3E%3C/svg%3E") repeat-x;
            opacity: .4;
        }
        .sched-cover-art::before { top: calc(env(safe-area-inset-top) + 30px); }
        .sched-cover-art::after { top: calc(env(safe-area-inset-top) + 236px); }

        .sched-cover-word {
            position: absolute;
            right: 6px;
            top: calc(env(safe-area-inset-top) + 62px);
            font-size: 4.4rem;
            font-weight: 900;
            line-height: 1;
            letter-spacing: -0.04em;
            color: #fff;
            opacity: .22;
            white-space: nowrap;
        }
        @media (min-width: 1000px) {
            .sched-cover { height: 340px; }
            .sched-cover-word { font-size: 6.5rem; right: max(6px, calc(50% - 590px)); }
        }

        /* ---------- Шапка дня ---------- */
        .day-hero { padding: 8px 6px 16px; }
        /* «сегодня» - стеклянная пилюля с живой точкой цвета группы */
        .dh-today {
            flex: none;
            display: inline-flex;
            align-items: center;
            gap: 6px;
            height: 24px;
            padding: 0 10px 0 9px;
            box-sizing: border-box;
            border-radius: 99px;
            background: var(--glass);
            border: 1px solid var(--glass-border);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            -webkit-backdrop-filter: blur(10px) saturate(160%);
            backdrop-filter: blur(10px) saturate(160%);
            color: var(--text);
            font-weight: 800;
            font-size: 0.72rem;
            line-height: 1;
            position: relative;
            top: .12em;   /* по центру строчных букв названия дня, а не всей строки */
        }
        .dh-today::before {
            content: '';
            width: 7px;
            height: 7px;
            border-radius: 50%;
            background: linear-gradient(145deg, hsl(var(--h1) 80% 60%), hsl(var(--h2) 80% 62%));
            box-shadow: 0 0 0 0 hsl(var(--h1) 80% 60% / .6);
            animation: todayPulse 2s ease-out infinite;
        }
        @keyframes todayPulse { to { box-shadow: 0 0 0 6px hsl(var(--h1) 80% 60% / 0); } }
        body.dark-theme .dh-today { background: rgba(0, 0, 0, .28); }
        body:not(.dark-theme) .dh-today { background: rgba(255, 255, 255, .6); }
        .dh-title {
            margin: 2px 0 0;
            font-size: 1.9rem;
            font-weight: 900;
            line-height: 1.1;
            letter-spacing: -0.02em;
        }
        .dh-sub {
            display: flex;
            flex-wrap: wrap;
            gap: 6px 14px;
            margin-top: 8px;
            min-height: 18px;
            font-size: 0.76rem;
            font-weight: 700;
            color: var(--secondary);
        }
        body.dark-theme .dh-sub { color: rgba(255, 255, 255, .68); }
        .dh-sub span { display: inline-flex; align-items: center; gap: 5px; }
        .dh-sub b { color: var(--text); font-weight: 900; font-variant-numeric: tabular-nums; }
        .dh-sub svg {
            width: 14px; height: 14px; flex: none;
            fill: none; stroke: currentColor; stroke-width: 2;
            stroke-linecap: round; stroke-linejoin: round;
        }
        .dh-status { color: var(--text); font-weight: 800; }
        .dh-status.live::before {
            content: '';
            width: 7px;
            height: 7px;
            border-radius: 50%;
            background: #34c759;
            animation: lqLive 1.6s ease-in-out infinite;
        }

        /* ---------- Выбор курса и группы, дни ---------- */
        .controls select { font-size: 0.95rem; }
        .day-chip { font-size: 0.84rem; text-transform: lowercase; }
        .week-range { color: color-mix(in srgb, var(--text) 62%, transparent); }

        /* ---------- Карточка пары: номер плашкой слева ---------- */
        .lesson-card {
            display: grid;
            grid-template-columns: 42px minmax(0, 1fr);
            column-gap: 14px;
            padding: 16px 16px 16px 14px;
            border-radius: 22px;
            margin-bottom: 12px;
        }
        .lesson-card.skeleton { display: block; padding: 20px; }
        .lc-main { min-width: 0; }

        .lc-num {
            width: 42px;
            height: 42px;
            display: grid;
            place-items: center;
            border-radius: 15px;
            background: var(--glass-strong);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            font-size: 1.05rem;
            font-weight: 900;
            font-variant-numeric: tabular-nums;
            color: var(--text);
        }
        /* текущая пара - плашка цвета группы, как ачивки в профиле */
        .lesson-card.active .lc-num {
            color: #fff;
            background: linear-gradient(145deg, hsl(var(--h1) 72% 52%), hsl(var(--h2) 72% 56%));
            box-shadow: inset 0 1px 0 rgba(255, 255, 255, .35), 0 8px 16px -8px hsl(var(--h1) 72% 52%);
        }
        .lesson-card.active .progress-bar { background: linear-gradient(90deg, hsl(var(--h1) 72% 55%), hsl(var(--h2) 72% 60%)); }
        .lesson-card.past { opacity: .5; }

        .lesson-card .time {
            min-height: 20px;
            margin-bottom: 4px;
            gap: 8px;
            font-size: 0.78rem;
            font-variant-numeric: tabular-nums;
        }
        .status-badge { margin-left: 0; }
        .lesson-card .subject-row { margin-bottom: 10px; }
        /* длинные слова переносим по слогам, а не рубим посередине («воспроизведени / я») */
        .lesson-card .subject { font-size: 1.08rem; letter-spacing: -0.01em; word-break: normal; overflow-wrap: break-word; -webkit-hyphens: auto; hyphens: auto; }
        /* Совмещёнку никогда не ужимаем и не режем: все группы видно целиком.
           Короткая стоит справа от названия, как раньше. Длинная (бывает
           и 14 групп) не влезает рядом - тогда спускается под название на
           всю ширину и переносится по группам, а не посреди «Т-32» */
        .lesson-card .subject-row { flex-wrap: wrap; gap: 6px 10px; }
        .lesson-card .subject { flex: 1 1 55%; min-width: 0; }
        .combined-badge { flex: 0 0 auto; box-sizing: border-box; max-width: 100%; gap: 4px; white-space: normal; align-items: baseline; border-radius: 14px; line-height: 1.35; }
        .combined-badge b { color: var(--text); font-weight: 800; }
        .combined-badge i { font-style: normal; white-space: nowrap; }

        .lesson-card .details {
            align-items: center;
            gap: 10px;
            font-size: 0.84rem;
        }
        .lc-room { display: inline-flex; align-items: center; gap: 5px; flex: none; }
        .lc-room svg {
            width: 14px; height: 14px; flex: none;
            fill: none; stroke: currentColor; stroke-width: 2.1;
            stroke-linecap: round; stroke-linejoin: round;
        }
        .lc-teacher { min-width: 0; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .lesson-card .progress-container { height: 5px; margin-top: 12px; }

        .empty-state { border-radius: 22px; }

        /* Точки перед словами ставятся по середине строчных букв, а не по
           центру строки: у строчных «сейчас», «идёт» середина ниже, и точка
           по центру строки казалась приподнятой. .09em — около 1px */
        .dh-status.live::before { position: relative; top: .09em; }
        /* в плашках точку видно относительно самой плашки, а не букв:
           там её опускаем вдвое меньше, иначе она ниже середины плашки */
        .status-badge::before { position: relative; top: .045em; }
        @media (prefers-reduced-motion: reduce) {
            .sched-root { transition: none; }
            .dh-status.live::before { animation: none; }
        }

        /* ---------- Интерфейс строчными, как в профиле и на форуме ----------
           Только внутри страницы: окно Светки живёт отдельно и его текст не
           трогаем. Предметы, преподы, аудитории и группы - как есть */
        .sched-root { text-transform: lowercase; }
        .sched-root select, .subject, .lc-teacher, .lc-room b, .combined-badge b,
        .sched-cover-word, footer {
            text-transform: none;
        }

        /* ==========================================================
           ПРАВКИ РАСПИСАНИЯ: старосты и админы
           Метки на карточках видят все; режим правки - только те,
           кому можно (кнопка-карандаш в шапке).
           ========================================================== */
        .edit-toggle[hidden] { display: none !important; }
        .topbar .edit-toggle { margin-left: auto; }
        .topbar .edit-toggle:not([hidden]) ~ .theme-toggle { margin-left: 0; }
        .edit-toggle.on {
            background: var(--text);
            color: var(--bg);
            border-color: transparent;
            box-shadow: 0 6px 18px -6px hsl(var(--h1) 72% 50% / .7);
        }

        /* ---------- метки на карточках ---------- */
        .chg-pill {
            display: inline-flex;
            align-items: center;
            gap: 4px;
            height: 20px;
            padding: 0 8px;
            border-radius: 99px;
            font-size: 0.66rem;
            font-weight: 800;
            line-height: 1;
            white-space: nowrap;
            background: hsl(var(--h1) 80% 55% / .16);
            color: hsl(var(--h1) 70% 36%);
        }
        body.dark-theme .chg-pill { color: hsl(var(--h1) 90% 76%); background: hsl(var(--h1) 80% 60% / .18); }
        .chg-pill svg { width: 11px; height: 11px; fill: none; stroke: currentColor; stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }
        .chg-pill.cancel { background: rgba(255, 59, 48, .13); color: #d70015; }
        body.dark-theme .chg-pill.cancel { background: rgba(255, 69, 58, .2); color: #ff6961; }

        .lesson-card.cancelled {
            background:
                repeating-linear-gradient(-45deg, transparent 0 11px, rgba(127, 127, 127, .07) 11px 22px),
                var(--glass);
        }
        /* под штампом всё приглушено, но читается: видно, какую пару отменили */
        .lesson-card.cancelled .lc-main > :not(.stamp),
        .lesson-card.cancelled .lc-num { opacity: .3; }
        .lesson-card.cancelled .lc-main { position: relative; }

        /* ---------- штамп «ОТМЕНЕНА» ----------
           Резиновая печать: наклон, двойная рамка, потёртая краска
           (маска из шума feTurbulence). При появлении шлёпается сверху. */
        .stamp {
            --stamp: #d70015;
            position: absolute;
            left: 50%;
            top: 50%;
            z-index: 2;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 5px 14px 4px;
            border: 3px solid var(--stamp);
            border-radius: 8px;
            outline: 1.5px solid var(--stamp);
            outline-offset: 3px;
            color: var(--stamp);
            text-transform: uppercase;
            white-space: nowrap;
            pointer-events: none;
            transform: translate(-50%, -50%) rotate(-9deg);
            -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' seed='7'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 2.15'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
                    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' seed='7'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 2.15'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
            -webkit-mask-size: 240px 120px;
                    mask-size: 240px 120px;
            animation: stampIn .55s cubic-bezier(.2, 1.5, .45, 1) .18s both;
        }
        body.dark-theme .stamp { --stamp: #ff5a52; }
        .stamp b {
            font-size: 1.35rem;
            font-weight: 900;
            letter-spacing: .14em;
            line-height: 1.1;
            margin-right: -.14em;          /* компенсирует разрядку после последней буквы */
        }
        .stamp small {
            margin-top: 1px;
            padding-top: 2px;
            border-top: 1.5px solid var(--stamp);
            font-size: 0.56rem;
            font-weight: 800;
            letter-spacing: .2em;
            margin-right: -.2em;
        }
        @keyframes stampIn {
            0%   { opacity: 0; transform: translate(-50%, -50%) rotate(-16deg) scale(1.9); }
            55%  { opacity: 1; }
            100% { opacity: 1; transform: translate(-50%, -50%) rotate(-9deg) scale(1); }
        }
        /* в режиме правки штамп поменьше: под ним ещё кнопки */
        .lesson-card.ed .stamp b { font-size: 1.1rem; }
        @media (prefers-reduced-motion: reduce) { .stamp { animation: none; } }

        .chg-was {
            margin: -6px 0 10px;
            font-size: 0.74rem;
            font-weight: 700;
            color: var(--secondary);
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
        }
        .chg-was s { text-transform: none; }
        .lc-room s { margin-right: 4px; font-weight: 700; opacity: .55; }

        /* ---------- плашка «день изменён» над карточками ---------- */
        .chg-note {
            display: flex;
            align-items: center;
            gap: 12px;
            padding: 12px 14px;
            margin-bottom: 12px;
            border-radius: 20px;
            background: linear-gradient(135deg, hsl(var(--h1) 80% 55% / .13), hsl(var(--h2) 80% 60% / .09));
            border: 1px solid hsl(var(--h1) 70% 55% / .26);
        }
        .chg-note-ic {
            width: 32px;
            height: 32px;
            flex: none;
            display: grid;
            place-items: center;
            border-radius: 11px;
            color: #fff;
            background: linear-gradient(145deg, hsl(var(--h1) 72% 52%), hsl(var(--h2) 72% 56%));
            box-shadow: inset 0 1px 0 rgba(255, 255, 255, .35);
        }
        .chg-note-ic svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
        .chg-note-body { min-width: 0; flex: 1; }
        .chg-note-text { font-size: 0.82rem; font-weight: 800; line-height: 1.3; }
        .chg-note-meta {
            display: flex;
            flex-wrap: wrap;
            align-items: center;
            gap: 2px 6px;
            margin-top: 4px;
            font-size: 0.72rem;
            font-weight: 700;
            line-height: 1.3;
            color: var(--secondary);
        }
        .chg-note-meta b { color: var(--text); font-weight: 800; text-transform: none; }
        .chg-note q {
            display: block;
            margin-top: 7px;
            padding-left: 9px;
            border-left: 2px solid hsl(var(--h1) 70% 55% / .5);
            font-size: 0.78rem;
            font-weight: 600;
            font-style: normal;
            line-height: 1.35;
            text-transform: none;
            quotes: none;
        }
        .role-chip {
            display: inline-flex;
            align-items: center;
            height: 17px;
            padding: 0 7px;
            border-radius: 99px;
            background: var(--text);
            color: var(--bg);
            font-size: 0.62rem;
            font-weight: 800;
            line-height: 1;
        }

        /* точка у дня, где есть правки */
        .day-chip.changed::before {
            content: '';
            position: absolute;
            top: 5px;
            right: calc(50% - 15px);
            width: 6px;
            height: 6px;
            border-radius: 50%;
            background: #ff9f0a;
            box-shadow: 0 0 0 2px color-mix(in srgb, var(--bg) 70%, transparent);
        }

        /* ---------- режим правки ---------- */
        body.sched-editing .controls select { opacity: .45; pointer-events: none; }
        body.sched-editing .tb-meta .upd-badge { opacity: 0; }
        body.sched-editing .tb-meta .week-range { opacity: 1; transform: none; filter: none; }

        .ed-bar[hidden] { display: none; }
        .ed-bar {
            position: sticky;
            top: calc(env(safe-area-inset-top) + 8px);
            z-index: 40;
            display: flex;
            align-items: center;
            gap: 6px;
            height: 50px;
            box-sizing: border-box;
            padding: 6px 6px 6px 14px;
            margin: -10px 0 14px;
            border-radius: 99px;
            background: var(--glass);
            border: 1px solid var(--glass-border);
            -webkit-backdrop-filter: blur(20px) saturate(180%);
            backdrop-filter: blur(20px) saturate(180%);
            box-shadow: inset 0 1px 0 var(--glass-highlight), 0 10px 30px -12px rgba(0, 0, 0, .45);
            transition: top .3s cubic-bezier(.2, .8, .2, 1);
        }
        /* шапка на месте - встаём под неё, уехала - занимаем её место */
        body:has(.topbar:not(.hide-up)) .ed-bar { top: calc(env(safe-area-inset-top) + 68px); }
        @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
            .ed-bar { background: color-mix(in srgb, var(--bg) 92%, transparent); }
        }
        .ed-dot {
            width: 8px;
            height: 8px;
            flex: none;
            border-radius: 50%;
            background: #ff9f0a;
            animation: lqLive 1.6s ease-in-out infinite;
        }
        .ed-title {
            flex: 1;
            min-width: 0;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
            font-size: 0.8rem;
            font-weight: 700;
            color: var(--secondary);
        }
        .ed-title b { color: var(--text); font-weight: 900; }

        .ed-btn {
            height: 36px;
            min-width: 36px;
            padding: 0 13px;
            flex: none;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 6px;
            border-radius: 99px;
            border: 1px solid var(--glass-border);
            background: var(--glass-strong);
            color: var(--text);
            font: inherit;
            font-size: 0.78rem;
            font-weight: 800;
            cursor: pointer;
            transition: transform .12s ease, opacity .15s ease, background-color .15s ease;
            -webkit-tap-highlight-color: transparent;
        }
        .ed-btn:active { transform: scale(.9); }
        .ed-btn:disabled { opacity: .28; pointer-events: none; }
        .ed-btn svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
        .ed-btn.icon { width: 36px; padding: 0; }
        .ed-btn.danger { color: #d70015; }
        body.dark-theme .ed-btn.danger { color: #ff6961; }
        .ed-btn.primary {
            background: var(--text);
            color: var(--bg);
            border-color: transparent;
            padding: 0 16px;
        }
        .ed-btn.grow { margin-left: auto; }

        .ed-tools {
            display: flex;
            gap: 6px;
            margin-top: 12px;
            padding-top: 12px;
            border-top: 1px solid var(--glass-border);
        }
        .lesson-card.ed .ed-tools { grid-column: 1 / -1; }
        /* узкий телефон: у текстовых кнопок прячем значки, чтобы всё влезло в строку */
        @media (max-width: 374px) {
            .ed-tools .ed-btn:not(.icon) svg { display: none; }
            .ed-tools .ed-btn { padding: 0 11px; }
        }

        .ed-empty {
            width: 100%;
            display: grid;
            grid-template-columns: 42px minmax(0, 1fr);
            column-gap: 14px;
            align-items: center;
            padding: 12px 16px 12px 14px;
            margin: 0 0 12px;
            box-sizing: border-box;
            border-radius: 22px;
            border: 1.5px dashed var(--glass-border);
            background: transparent;
            color: var(--secondary);
            font: inherit;
            font-size: 0.88rem;
            font-weight: 800;
            text-align: left;
            text-transform: lowercase;
            cursor: pointer;
            transition: transform .15s ease, background-color .15s ease, border-color .15s ease;
            -webkit-tap-highlight-color: transparent;
        }
        .ed-empty:hover { background: var(--glass); border-color: hsl(var(--h1) 70% 55% / .5); }
        .ed-empty:active { transform: scale(.98); }
        .ed-empty .lc-num {
            background: transparent;
            border: 1.5px dashed var(--glass-border);
            box-shadow: none;
            color: var(--secondary);
            box-sizing: border-box;
        }
        .ed-empty small { display: block; margin-top: 2px; font-size: 0.72rem; font-weight: 700; opacity: .75; font-variant-numeric: tabular-nums; }

        /* ---------- шторка снизу: выбор пары и проверка перед публикацией ---------- */
        .ed-sheet {
            --h1: 228; --h2: 292;
            position: fixed;
            inset: 0;
            z-index: 2000;
            display: flex;
            align-items: flex-end;
            justify-content: center;
            background: rgba(0, 0, 0, .38);
            opacity: 0;
            pointer-events: none;
            transition: opacity .25s ease;
            font-family: 'Inter', system-ui, -apple-system, sans-serif;
            color: var(--text);
            text-transform: lowercase;
        }
        .ed-sheet.open { opacity: 1; pointer-events: auto; }
        .ed-panel {
            width: min(520px, 100%);
            max-height: min(88vh, 760px);
            display: flex;
            flex-direction: column;
            box-sizing: border-box;
            padding: 10px 16px calc(16px + env(safe-area-inset-bottom));
            border-radius: 28px 28px 0 0;
            background: var(--bg);
            border: 1px solid var(--glass-border);
            border-bottom: none;
            box-shadow: 0 -20px 60px -20px rgba(0, 0, 0, .5);
            transform: translateY(104%);
            transition: transform .42s cubic-bezier(.2, .9, .2, 1);
        }
        .ed-sheet.open .ed-panel { transform: none; }
        .ed-panel.tall { height: min(88vh, 760px); }
        .ed-sheet .nm, .ed-title .nm { text-transform: none; }
        .ed-grab { width: 40px; height: 5px; flex: none; margin: 0 auto 12px; border-radius: 3px; background: var(--glass-strong); }
        .ed-head { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
        .ed-head .lc-num {
            color: #fff;
            background: linear-gradient(145deg, hsl(var(--h1) 72% 52%), hsl(var(--h2) 72% 56%));
            box-shadow: inset 0 1px 0 rgba(255, 255, 255, .35);
        }
        .ed-head h3 { margin: 0; font-size: 1.15rem; font-weight: 900; letter-spacing: -0.01em; }
        .ed-head p { margin: 2px 0 0; font-size: 0.76rem; font-weight: 700; color: var(--secondary); font-variant-numeric: tabular-nums; }
        .ed-head .ed-btn { margin-left: auto; }

        .ed-field {
            width: 100%;
            box-sizing: border-box;
            padding: 12px 14px;
            border-radius: 14px;
            border: 1px solid var(--glass-border);
            background: var(--glass);
            color: var(--text);
            font: inherit;
            font-size: 16px;
            font-weight: 700;
            outline: none;
            text-transform: none;
            transition: border-color .15s ease;
        }
        .ed-field:focus { border-color: hsl(var(--h1) 70% 55% / .8); }
        .ed-field::placeholder { color: var(--secondary); font-weight: 600; text-transform: lowercase; }
        textarea.ed-field { resize: none; min-height: 72px; line-height: 1.35; }
        .ed-form { display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: 8px; }
        .ed-form .full { grid-column: 1 / -1; }
        .ed-form-row { display: flex; gap: 8px; margin-top: 8px; }
        .ed-form-row .ed-btn { height: 44px; flex: 1; font-size: 0.86rem; }

        .ed-search { position: relative; margin-top: 14px; }
        .ed-search svg {
            position: absolute; left: 13px; top: 50%;
            width: 16px; height: 16px; margin-top: -8px;
            fill: none; stroke: var(--secondary); stroke-width: 2.2; stroke-linecap: round;
            pointer-events: none;
        }
        .ed-search .ed-field { padding-left: 38px; }

        .ed-list {
            flex: 1;
            min-height: 120px;
            margin: 4px -16px 0;
            padding: 0 16px 6px;
            overflow-y: auto;
            overscroll-behavior: contain;
            -webkit-overflow-scrolling: touch;
        }
        .ed-sec { margin: 14px 2px 6px; font-size: 0.7rem; font-weight: 800; color: var(--secondary); letter-spacing: .02em; }
        .ed-item {
            width: 100%;
            display: block;
            box-sizing: border-box;
            padding: 11px 14px;
            margin-bottom: 6px;
            border-radius: 16px;
            border: 1px solid var(--glass-border);
            background: var(--glass);
            color: var(--text);
            font: inherit;
            text-align: left;
            cursor: pointer;
            transition: transform .12s ease, background-color .15s ease;
            -webkit-tap-highlight-color: transparent;
        }
        .ed-item:hover { background: var(--glass-strong); }
        .ed-item:active { transform: scale(.98); }
        .ed-item b { display: block; font-size: 0.9rem; font-weight: 850; line-height: 1.25; text-transform: none; }
        .ed-item span { display: block; margin-top: 3px; font-size: 0.74rem; font-weight: 700; color: var(--secondary); text-transform: none; }
        .ed-item mark { background: hsl(var(--h1) 85% 60% / .3); color: inherit; border-radius: 3px; }
        .ed-none { padding: 18px 4px; text-align: center; font-size: 0.82rem; font-weight: 700; color: var(--secondary); }
        .ed-more { width: 100%; margin-top: 4px; }

        .ed-diff-day { margin: 14px 2px 6px; font-size: 0.72rem; font-weight: 800; color: var(--secondary); }
        .ed-diff {
            display: flex;
            align-items: center;
            gap: 10px;
            padding: 10px 12px;
            margin-bottom: 6px;
            border-radius: 14px;
            background: var(--glass);
            border: 1px solid var(--glass-border);
            font-size: 0.82rem;
            font-weight: 700;
        }
        .ed-diff .n {
            width: 26px; height: 26px; flex: none;
            display: grid; place-items: center;
            border-radius: 9px;
            background: var(--glass-strong);
            font-weight: 900; font-size: 0.78rem;
        }
        .ed-diff .t { flex: 1; min-width: 0; text-transform: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .ed-hint { margin: 10px 2px 0; font-size: 0.72rem; font-weight: 600; color: var(--secondary); line-height: 1.4; }
        .ed-publish { width: 100%; height: 50px; margin-top: 12px; font-size: 0.95rem; }

        body.ed-locked, body.ed-locked #vgScroll { overflow: hidden !important; }

        @media (prefers-reduced-motion: reduce) {
            .ed-panel, .ed-sheet { transition: none; }
            .ed-dot { animation: none; }
        }
        /* ---------- время: зачёркнутое старое, строка «звонки» ---------- */
        .chg-oldtime { margin-right: -2px; font-weight: 700; opacity: .55; }
        .lesson-card .time { flex-wrap: wrap; row-gap: 4px; }
        .lc-when, .chg-oldtime { white-space: nowrap; }

        .ed-bells {
            width: 100%;
            display: flex;
            align-items: center;
            gap: 12px;
            box-sizing: border-box;
            padding: 10px 12px 10px 10px;
            margin: 0 0 12px;
            border-radius: 18px;
            border: 1px solid var(--glass-border);
            background: var(--glass);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            color: var(--text);
            font: inherit;
            text-align: left;
            text-transform: lowercase;
            cursor: pointer;
            transition: transform .15s ease, background-color .15s ease;
        }
        .ed-bells:active { transform: scale(.98); }
        .ed-bells-ic {
            width: 32px; height: 32px; flex: none;
            display: grid; place-items: center;
            border-radius: 11px;
            background: var(--glass-strong);
        }
        .ed-bells.on .ed-bells-ic {
            color: #fff;
            background: linear-gradient(145deg, hsl(var(--h1) 72% 52%), hsl(var(--h2) 72% 56%));
        }
        .ed-bells-ic svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
        .ed-bells-t { flex: 1; min-width: 0; font-size: 0.72rem; font-weight: 700; color: var(--secondary); line-height: 1.25; }
        .ed-bells-t b { display: block; font-size: 0.86rem; font-weight: 850; color: var(--text); }
        .ed-bells-go { font-size: 0.76rem; font-weight: 800; color: var(--secondary); }

        /* ---------- поля времени и чипсы в шторке ---------- */
        .ed-time { display: flex; align-items: center; gap: 8px; }
        .ed-time .ed-field { flex: 1; min-width: 0; text-align: center; font-variant-numeric: tabular-nums; padding-left: 8px; padding-right: 8px; }
        .ed-time-ic { width: 20px; flex: none; display: grid; place-items: center; color: var(--secondary); }
        .ed-time-ic svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2.1; stroke-linecap: round; }
        .ed-time-dash { color: var(--secondary); font-weight: 800; }
        .ed-chips { display: flex; flex-wrap: wrap; gap: 6px; }
        .ed-chip {
            height: 32px;
            padding: 0 12px;
            flex: none;
            border-radius: 99px;
            border: 1px solid var(--glass-border);
            background: var(--glass);
            color: var(--text);
            font: inherit;
            font-size: 0.76rem;
            font-weight: 750;
            white-space: nowrap;
            cursor: pointer;
            transition: transform .12s ease, background-color .15s ease, color .15s ease;
        }
        .ed-chip:active { transform: scale(.92); }
        .ed-chip.on { background: var(--text); color: var(--bg); border-color: transparent; }
        .ed-head .lc-num svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }

        .ed-seg {
            display: flex;
            gap: 4px;
            padding: 4px;
            margin-bottom: 14px;
            border-radius: 99px;
            background: var(--glass);
            border: 1px solid var(--glass-border);
        }
        .ed-seg button {
            flex: 1;
            height: 38px;
            border: none;
            border-radius: 99px;
            background: transparent;
            color: var(--secondary);
            font: inherit;
            font-size: 0.84rem;
            font-weight: 800;
            cursor: pointer;
            transition: background-color .2s ease, color .2s ease;
        }
        .ed-seg button.on { background: var(--glass-strong); color: var(--text); box-shadow: inset 0 1px 0 var(--glass-highlight); }
        .ed-short[hidden] { display: none; }
        .ed-short { display: grid; gap: 12px; margin-bottom: 14px; }
        .ed-lbl { display: grid; gap: 6px; font-size: 0.72rem; font-weight: 800; color: var(--secondary); }
        .ed-lbl .ed-field { font-variant-numeric: tabular-nums; }

        .ed-bells-list { display: grid; gap: 6px; }
        .ed-bell {
            display: flex; align-items: center; gap: 12px;
            padding: 9px 12px;
            border-radius: 14px;
            background: var(--glass);
            border: 1px solid var(--glass-border);
            font-size: 0.86rem; font-weight: 800;
            font-variant-numeric: tabular-nums;
        }
        .ed-bell.idle { opacity: .45; }
        .ed-bell .n {
            width: 26px; height: 26px; flex: none;
            display: grid; place-items: center;
            border-radius: 9px; background: var(--glass-strong); font-size: 0.78rem;
        }
        .ed-bell .t { flex: 1; }
        .ed-bell s { font-size: 0.74rem; font-weight: 700; color: var(--secondary); }

        /* ---------- в режиме правки панель вкладок и Светка улетают влево ----------
           Свойство translate, а не transform: на компьютере у панели уже стоит
           transform: translateX(-50%) из nav.css, translate с ним складывается.
           Уходят с замахом (кривая с отрицательным началом), Светка первой;
           возвращаются пружинкой, Светка следом - запрыгивает на панель. */
        html #vgNav {
            transition: translate .62s cubic-bezier(.2, 1.25, .35, 1), opacity .3s ease;
        }
        html #catgirl {
            transition: translate .7s cubic-bezier(.2, 1.3, .35, 1) .14s, opacity .3s ease .14s;
        }
        html body.sched-editing #vgNav {
            translate: calc(-100vw - 60px) 0;
            opacity: 0;
            pointer-events: none;
            transition: translate .52s cubic-bezier(.55, -0.4, .7, .25) .07s, opacity .25s ease .32s;
        }
        html body.sched-editing #catgirl {
            translate: calc(-100vw - 200px) 0;
            opacity: 0;
            transition: translate .5s cubic-bezier(.55, -0.45, .7, .25), opacity .25s ease .28s;
        }
        html body.sched-editing #catgirl,
        html body.sched-editing #catgirl * { pointer-events: none !important; }
        @media (prefers-reduced-motion: reduce) {
            html #vgNav, html #catgirl, html body.sched-editing #vgNav, html body.sched-editing #catgirl { transition: opacity .2s ease; }
        }
        /* ---------- время пары в шторке ---------- */
        textarea.ed-name { display: block; resize: none; overflow: hidden; line-height: 1.3; min-height: 46px; }

        .ed-tm {
            padding: 12px;
            border-radius: 20px;
            background: var(--glass);
            border: 1px solid var(--glass-border);
            box-shadow: inset 0 1px 0 var(--glass-highlight);
            transition: border-color .25s ease;
        }
        .ed-tm.changed { border-color: hsl(var(--h1) 70% 55% / .45); }
        .ed-tm-head {
            display: flex;
            align-items: center;
            justify-content: space-between;
            margin: 0 2px 10px;
            font-size: 0.72rem;
            font-weight: 800;
            color: var(--secondary);
        }
        /* «по звонкам»: когда время обычное - просто статус с галочкой,
           изменено - текстовая ссылка «вернуть», без отдельной таблетки */
        .ed-tm-reset {
            display: inline-flex;
            align-items: center;
            gap: 5px;
            padding: 4px 2px;
            border: none;
            background: none;
            color: hsl(var(--h1) 75% 45%);
            font: inherit;
            font-size: 0.74rem;
            font-weight: 800;
            cursor: pointer;
        }
        body.dark-theme .ed-tm-reset { color: hsl(var(--h1) 90% 74%); }
        .ed-tm-reset:disabled { color: var(--secondary); cursor: default; }
        .ed-tm-reset svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }

        .ed-tm-row { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
        .ed-tm-box {
            padding: 8px 6px 6px;
            border-radius: 16px;
            background: var(--glass-strong);
            text-align: center;
        }
        .ed-tm-box small { display: block; font-size: 0.66rem; font-weight: 800; color: var(--secondary); }
        .ed-tm-ctl { display: flex; align-items: center; justify-content: space-between; gap: 2px; margin-top: 2px; }
        .ed-tm-step {
            width: 34px; height: 34px;
            flex: none;
            display: grid; place-items: center;
            padding: 0;
            border: none;
            border-radius: 50%;
            background: transparent;
            color: var(--text);
            cursor: pointer;
            touch-action: manipulation;
            user-select: none;
            -webkit-user-select: none;
            transition: background-color .15s ease, transform .12s ease;
        }
        .ed-tm-step:hover { background: var(--glass); }
        .ed-tm-step:active { transform: scale(.86); background: var(--glass); }
        .ed-tm-step svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; }
        .ed-tm-val {
            position: relative;
            flex: 1;
            min-width: 0;
            display: inline-flex;
            align-items: baseline;
            justify-content: center;
            gap: 3px;
            text-transform: none;
        }
        .ed-tm-val b {
            display: inline-block;
            font-size: 1.45rem;
            font-weight: 900;
            letter-spacing: -0.02em;
            font-variant-numeric: tabular-nums;
        }
        .ed-tm-val i { font-style: normal; font-size: 0.74rem; font-weight: 800; color: var(--secondary); }
        label.ed-tm-val { cursor: pointer; }
        label.ed-tm-val b { border-bottom: 2px dotted color-mix(in srgb, var(--text) 30%, transparent); line-height: 1.15; }
        /* настоящее поле времени лежит прозрачным поверх цифр: тап открывает колесо */
        .ed-tm-val input {
            position: absolute;
            inset: 0;
            width: 100%;
            height: 100%;
            opacity: 0;
            border: 0;
            padding: 0;
            font-size: 16px;
            cursor: pointer;
        }

        .ed-tm-track {
            position: relative;
            height: 10px;
            margin: 14px 4px 8px;
            border-radius: 99px;
            background: var(--glass-strong);
        }
        .ed-tm-track i {
            position: absolute;
            top: 0;
            bottom: 0;
            border-radius: 99px;
            transition: left .45s cubic-bezier(.3, 1.3, .5, 1), width .45s cubic-bezier(.3, 1.3, .5, 1);
        }
        .ed-tm-track .ghost { top: -3px; bottom: -3px; border: 1.5px dashed color-mix(in srgb, var(--text) 35%, transparent); box-sizing: border-box; }
        .ed-tm-track .fill { background: linear-gradient(90deg, hsl(var(--h1) 72% 55%), hsl(var(--h2) 72% 60%)); box-shadow: 0 4px 12px -4px hsl(var(--h1) 72% 50% / .8); }
        .ed-tm-foot {
            display: flex;
            justify-content: space-between;
            gap: 10px;
            margin: 0 4px;
            font-size: 0.74rem;
            font-weight: 800;
            font-variant-numeric: tabular-nums;
        }
        .ed-tm-foot span:last-child { color: hsl(var(--h1) 75% 45%); text-align: right; }
        body.dark-theme .ed-tm-foot span:last-child { color: hsl(var(--h1) 90% 74%); }
        @media (prefers-reduced-motion: reduce) { .ed-tm-track i { transition: none; } }
        /* ---------- звонки дня ---------- */
        .ed-bells-tm { display: grid; gap: 8px; margin-bottom: 14px; }
        .ed-bells-tm[hidden] { display: none; }
        .ed-tm-box.wide .ed-tm-ctl { justify-content: center; gap: 18px; }
        .ed-tm-box.wide .ed-tm-val { flex: none; }

        .ed-day-track {
            position: relative;
            height: 26px;
            margin: 2px 2px 22px;
            border-radius: 10px;
            background: var(--glass);
        }
        .ed-day-track i {
            position: absolute;
            top: 4px;
            bottom: 4px;
            border-radius: 7px;
            transition: left .5s cubic-bezier(.3, 1.25, .5, 1), width .5s cubic-bezier(.3, 1.25, .5, 1), opacity .25s ease;
        }
        /* как было по звонкам - тонкая линия под шкалой */
        .ed-day-track .ghost { top: auto; bottom: -7px; height: 3px; border-radius: 2px; background: color-mix(in srgb, var(--text) 32%, transparent); }
        .ed-day-track .fill {
            font-style: normal;
            display: grid;
            place-items: center;
            overflow: hidden;
            color: #fff;
            font-size: 0.66rem;
            font-weight: 900;
            background: linear-gradient(90deg, hsl(var(--h1) 72% 55%), hsl(var(--h2) 72% 60%));
            box-shadow: 0 4px 10px -4px hsl(var(--h1) 72% 50% / .7);
        }
        .ed-day-track .fill.idle { opacity: .35; }
        .ed-day-track.same .ghost { opacity: 0; }
        @media (prefers-reduced-motion: reduce) { .ed-day-track i { transition: none; } }

        /* ==========================================================
           СВЕТЛАЯ ТЕМА
           Раньше стекло в светлой было «чёрным на 5%»: на цветной обложке
           оно пачкало градиент серым, а на белом фоне карточки выходили
           плоскими серыми плашками. Теперь стекло белое и матовое
           (как в iOS поверх обоев), а карточки - белые листы с мягкой тенью
           в цвет группы. Тёмную тему этот блок не трогает.
           ========================================================== */
        body:not(.dark-theme) .sched-root {
            /* стекло почти прозрачное: градиент должен просвечивать, а «стеклом»
               его делают размытие и светлые блики по краям (--lq-rim) */
            --glass: rgba(255, 255, 255, .34);
            --glass-strong: rgba(255, 255, 255, .6);
            --glass-border: rgba(255, 255, 255, .5);
            --glass-highlight: rgba(255, 255, 255, .95);
            --glass-blur: blur(14px) saturate(200%);
            --lq-rim:
                inset 0 1px 1px rgba(255, 255, 255, .95),
                inset 0 -1px 1px rgba(255, 255, 255, .4),
                inset 0 0 14px rgba(255, 255, 255, .28),
                0 0 0 .5px hsl(var(--h1) 35% 25% / .12);
            --secondary: hsl(var(--h1) 12% 40%);
            --card-border: hsl(var(--h1) 30% 25% / .1);
            --sheet-shadow: 0 1px 2px hsl(var(--h1) 40% 20% / .06), 0 12px 28px -16px hsl(var(--h1) 55% 35% / .28);
        }

        /* обложка насыщеннее: пастель на белом выглядела выцветшей */
        body:not(.dark-theme) .sched-cover-art {
            background:
                radial-gradient(90% 80% at 88% 10%, hsl(var(--h2) 92% 70% / .95), transparent 62%),
                radial-gradient(80% 110% at 0% 85%, hsl(var(--h1) 90% 62% / .95), transparent 66%),
                linear-gradient(135deg, hsl(var(--h1) 78% 76%), hsl(var(--h2) 75% 70%));
        }
        body:not(.dark-theme) .sched-cover-art::before,
        body:not(.dark-theme) .sched-cover-art::after { opacity: .6; }
        /* «Т-31» на фоне: белым на 22% его на светлой обложке не было видно */
        body:not(.dark-theme) .sched-cover-word { opacity: .5; }

        /* шапка, выбор курса/группы, дни, кнопки - жидкое стекло: прозрачное,
           с бликом сверху, отсветом снизу и мягкой тенью под собой */
        body:not(.dark-theme) .sched-root select,
        body:not(.dark-theme) .day-chips,
        body:not(.dark-theme) .topbar,
        body:not(.dark-theme) .theme-toggle {
            box-shadow: var(--lq-rim), 0 8px 20px -14px hsl(var(--h1) 50% 30% / .45);
        }
        body:not(.dark-theme) .topbar { border-color: var(--glass-border) !important; }
        /* активный день - капля стекла поплотнее, но всё ещё просвечивает */
        body:not(.dark-theme) .day-pill,
        body:not(.dark-theme) .day-chip.active {
            background: rgba(255, 255, 255, .55);
            box-shadow: var(--lq-rim), 0 4px 12px -5px hsl(var(--h1) 50% 30% / .35);
        }
        body:not(.dark-theme) .day-chips.has-pill .day-chip.active { background: transparent; box-shadow: none; }
        body:not(.dark-theme) .day-chip { color: hsl(var(--h1) 15% 32%); }
        body:not(.dark-theme) .day-chip.active { color: var(--text); }

        /* карточки пар - белые листы */
        body:not(.dark-theme) .lesson-card,
        body:not(.dark-theme) .empty-state {
            background: #fff;
            /* размытие у листов не убираем: под белым его не видно, а без него
               Chromium перестаёт размывать и стекло над ними (дни, шапка) */
            border: 1px solid var(--card-border);
            box-shadow: var(--sheet-shadow);
        }
        /* внутри белых листов стекло снова «чернильное» (тёмное на 5%), иначе
           белые плашки внутри (совмещённая пара, поля в режиме правки) пропадут */
        body:not(.dark-theme) .lesson-card,
        body:not(.dark-theme) .empty-state {
            --glass: hsl(var(--h1) 30% 30% / .05);
            --glass-strong: hsl(var(--h1) 30% 30% / .09);
            --glass-border: hsl(var(--h1) 30% 25% / .1);
            --glass-highlight: rgba(255, 255, 255, .7);
            --lq-rim: inset 0 1px 0 rgba(255, 255, 255, .7);
        }
        body:not(.dark-theme) .empty-state { border-style: dashed; }
        body:not(.dark-theme) .lesson-card.active {
            background: #fff;
            border-color: hsl(var(--h1) 70% 55% / .35);
            box-shadow: 0 1px 2px hsl(var(--h1) 40% 20% / .06), 0 18px 36px -16px hsl(var(--h1) 70% 45% / .45);
        }
        body:not(.dark-theme) .lesson-card.past { box-shadow: none; }
        body:not(.dark-theme) .lesson-card.cancelled {
            background:
                repeating-linear-gradient(-45deg, transparent 0 11px, hsl(var(--h1) 20% 40% / .06) 11px 22px),
                #fbfbfd;
            box-shadow: none;
        }
        /* номер пары - мягкая плашка в цвет группы, а не серый квадрат */
        body:not(.dark-theme) .lc-num {
            background: hsl(var(--h1) 75% 96%);
            color: hsl(var(--h1) 55% 36%);
            box-shadow: inset 0 0 0 1px hsl(var(--h1) 60% 50% / .14);
        }
        body:not(.dark-theme) .lesson-card.active .lc-num { color: #fff; }

        /* ---------- Пустые слоты: «-» и день самостоятельной работы ----------
           «-» в расписании это не пара, а окно. Раньше рисовалась целая карточка
           с прочерками, теперь тонкая пунктирная полоска между парами */
        .gap-row {
            display: grid;
            grid-template-columns: 42px minmax(0, 1fr) auto;
            column-gap: 14px;
            align-items: center;
            margin: -2px 0 10px;
            padding: 7px 16px 7px 14px;
            border: 1px dashed var(--glass-border);
            border-radius: 99px;
            color: var(--secondary);
            font-size: 0.8rem;
            font-weight: 800;
        }
        .gap-num {
            text-align: center;
            font-size: 0.78rem;
            font-weight: 900;
            font-variant-numeric: tabular-nums;
            opacity: .7;
        }
        .gap-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .gap-text b { color: var(--text); font-weight: 800; }
        .gap-time { font-variant-numeric: tabular-nums; font-size: 0.74rem; opacity: .8; white-space: nowrap; }
        /* окно идёт прямо сейчас - подсвечиваем цветом группы */
        .gap-row.now {
            border-style: solid;
            border-color: hsl(var(--h1) 70% 55% / .45);
            background: hsl(var(--h1) 70% 55% / .08);
        }
        .gap-row.now .gap-text b { color: var(--tone); }
        .gap-row.past { opacity: .5; }
        .gap-row + .gap-row { margin-top: -4px; }
        body:not(.dark-theme) .gap-row { border-color: hsl(var(--h1) 30% 25% / .18); }

        /* «пар нет» и «день самостоятельной работы» */
        .empty-state.off-day { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 2.6rem 1.5rem; }
        .off-day .off-title { color: var(--text); font-size: 1rem; font-weight: 900; }
        .off-day .off-sub { font-size: 0.8rem; font-weight: 700; color: var(--secondary); margin-top: 2px; }
        .off-day .empty-emoji { font-variant-numeric: tabular-nums; letter-spacing: .02em; }
        /* самостоятельная: буквы z по очереди всплывают, как во сне */
        .off-day.study .empty-emoji { animation: none; font-size: 1.7rem; }
        .off-day.study .empty-emoji i { display: inline-block; font-style: normal; animation: zzz 2.4s ease-in-out infinite; }
        .off-day.study .empty-emoji i:nth-child(2) { animation-delay: .3s; font-size: .85em; }
        .off-day.study .empty-emoji i:nth-child(3) { animation-delay: .6s; font-size: .7em; }
        @keyframes zzz {
            0%, 100% { transform: translateY(0); opacity: .55; }
            50% { transform: translateY(-6px); opacity: 1; }
        }
        @media (prefers-reduced-motion: reduce) {
            .off-day.study .empty-emoji i { animation: none; }
        }
    
