/* Раскладки: общий shell, рабочее пространство учителя, экраны ученика, адаптив. */

/* ── Общий shell ────────────────────────────────────────── */
.shell {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

.topbar {
    position: sticky;
    top: 0;
    z-index: var(--z-topbar);
    display: flex;
    align-items: center;
    gap: var(--sp-5);
    height: var(--topbar-h);
    padding: 0 var(--sp-6);
    background: rgba(255, 255, 255, 0.92);
    backdrop-filter: saturate(140%) blur(8px);
    border-bottom: 1px solid var(--border);
}

.topbar-brand {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    flex: 0 0 auto;
    font-weight: 700;
    font-size: var(--fs-15);
    letter-spacing: var(--tracking-tight);
    color: var(--text);
    text-decoration: none;
}

.topbar-brand:hover {
    color: var(--accent-800);
}

.brand-logo {
    display: grid;
    place-items: center;
    width: 30px;
    height: 30px;
    flex: 0 0 auto;
}

.brand-logo img {
    display: block;
    width: 30px;
    height: 30px;
    border-radius: var(--r-md);
    box-shadow: var(--shadow-1);
}

/* Верхнее меню убрано: единственная навигация — боковая панель слева.
   Центр шапки занимает сцена «Енот на опушке» (см. .raccoon-scene ниже). */

.topbar-side {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    flex: 0 0 auto;
}

.user-chip {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: 4px 10px 4px 4px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-pill);
    text-decoration: none;
    color: var(--text);
}

.user-chip:hover {
    border-color: var(--accent-300);
    background: var(--accent-soft);
}

.user-chip .name {
    font-size: var(--fs-13);
    font-weight: 600;
    max-width: 16ch;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ── Рабочая область ────────────────────────────────────── */
/* По умолчанию одна колонка: страница без боковой панели обязана занимать
   всю ширину контейнера. Второй трек появляется только вместе с рельсом. */
.workspace {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--sp-6);
    align-items: start;
    width: 100%;
    max-width: var(--content-max);
    margin: 0 auto;
    padding: var(--sp-6);
}

/* Двухколоночная сетка существует ровно для страниц с плавающей панелью. */
.workspace.has-rail {
    grid-template-columns: var(--rail-w) minmax(0, 1fr);
}

.workspace-wide {
    max-width: 1400px;
}

.workspace-plain {
    max-width: 960px;
}

.workspace-narrow {
    max-width: 760px;
}

.rail {
    position: sticky;
    top: calc(var(--topbar-h) + var(--sp-6));
    z-index: var(--z-rail);
    display: flex;
    flex-direction: column;
    gap: var(--sp-4);
    max-height: calc(100vh - var(--topbar-h) - var(--sp-8));
    overflow-y: auto;
    overscroll-behavior: contain;
    min-width: 0;
}

.rail-card {
    padding: var(--sp-4);
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--shadow-1);
    min-width: 0;
}

.rail-title {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    margin-bottom: var(--sp-3);
    font-size: var(--fs-11);
    font-weight: 700;
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--text-subtle);
}

.content {
    display: flex;
    flex-direction: column;
    gap: var(--sp-5);
    min-width: 0;
}

.content-head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: var(--sp-4);
    flex-wrap: wrap;
    min-width: 0;
}

.content-head h1 {
    margin: 0;
}

.page-note {
    margin: var(--sp-2) 0 0;
    font-size: var(--fs-13);
    color: var(--text-muted);
    max-width: 76ch;
}

/* ── Split-view проверки ────────────────────────────────── */
.split {
    display: grid;
    grid-template-columns: minmax(0, 1fr) var(--aside-w);
    gap: var(--sp-5);
    align-items: start;
}

.split-main,
.split-side {
    display: flex;
    flex-direction: column;
    gap: var(--sp-5);
    min-width: 0;
}

.split-side {
    position: sticky;
    top: calc(var(--topbar-h) + var(--sp-6));
    max-height: calc(100vh - var(--topbar-h) - var(--sp-8));
    overflow-y: auto;
    overscroll-behavior: contain;
}

.review-nav {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    padding: var(--sp-3) var(--sp-4);
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    box-shadow: var(--shadow-1);
    flex-wrap: wrap;
}

.review-nav .position {
    font-size: var(--fs-13);
    color: var(--text-muted);
    font-variant-numeric: tabular-nums;
}

.answer-body {
    padding: var(--sp-5);
    background: var(--surface);
    border: 1px solid var(--border);
    border-left: 3px solid var(--accent-300);
    border-radius: var(--r-md);
    font-size: var(--fs-15);
    line-height: var(--lh-loose);
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

.score-input {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
}

.score-input input[type="number"] {
    width: 110px;
    font-size: var(--fs-20);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    text-align: center;
}

.score-presets {
    display: flex;
    gap: var(--sp-2);
    flex-wrap: wrap;
}

.snippet-list {
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    max-height: 220px;
    overflow-y: auto;
    margin: 0;
    padding: 0;
    list-style: none;
}

.snippet {
    display: flex;
    align-items: flex-start;
    gap: var(--sp-3);
    width: 100%;
    padding: var(--sp-3);
    font-family: inherit;
    font-size: var(--fs-13);
    text-align: left;
    color: var(--text);
    background: var(--surface-sunken);
    border: 1px solid var(--border-subtle);
    border-radius: var(--r-md);
    cursor: pointer;
    transition:
        border-color var(--dur-2) var(--ease),
        background var(--dur-2) var(--ease);
}

.snippet:hover {
    background: var(--accent-soft);
    border-color: var(--accent-200);
}

.snippet code {
    flex: 0 0 auto;
    padding: 1px 5px;
    font-size: var(--fs-11);
    color: var(--accent-800);
    background: var(--accent-tint);
    border-radius: var(--r-xs);
}

/* ── Экраны ученика ─────────────────────────────────────── */
.home-grid {
    display: grid;
    gap: var(--sp-5);
    align-items: stretch;
    /* min(100%, …) гарантирует отсутствие горизонтального переполнения на 320px. */
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
}

.home-grid > .card {
    display: flex;
    flex-direction: column;
    height: 100%;
}

/* Парные карточки консоли («Самые старые работы» / «Черновики заданий»):
   одинаковая высота, шапка и нижняя кнопка на одной линии, пустое состояние по центру. */
.console-grid {
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
}

.console-card {
    min-width: 0;
    box-sizing: border-box;
}

.console-card > .card-head {
    flex: 0 0 auto;
    align-items: center;
    min-height: 32px;
}

.console-card__body {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    min-height: 160px;
}

.console-card__empty {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
}

.console-card__foot {
    flex: 0 0 auto;
    margin-top: var(--sp-4);
    padding-top: var(--sp-4);
    border-top: 1px solid var(--border-subtle);
    display: flex;
    gap: var(--sp-2);
    flex-wrap: wrap;
}

.hero {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-6);
    padding: var(--sp-7);
    background: linear-gradient(135deg, var(--accent-soft), var(--sand-100) 130%);
    border: 1px solid var(--accent-100);
    border-radius: var(--r-xl);
    flex-wrap: wrap;
}

.hero h1 {
    margin: 0 0 var(--sp-2);
    font-size: var(--fs-24);
}

.hero-side {
    display: flex;
    align-items: center;
    gap: var(--sp-5);
}

.hero-progress {
    min-width: 200px;
}

/* Дорожная карта */
.roadmap {
    display: flex;
    flex-direction: column;
    gap: 0;
    margin: 0;
    padding: 0;
    list-style: none;
}

.roadmap-block {
    padding: var(--sp-5);
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    box-shadow: var(--shadow-1);
}

.roadmap-block + .roadmap-block {
    margin-top: var(--sp-5);
}

.roadmap-head {
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    margin-bottom: var(--sp-4);
    flex-wrap: wrap;
}

.roadmap-topics {
    display: flex;
    flex-direction: column;
    gap: var(--sp-4);
    margin: 0;
    padding: 0 0 0 var(--sp-5);
    list-style: none;
    border-left: 1px solid var(--border);
}

.task-list {
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    margin: var(--sp-3) 0 0;
    padding: 0;
    list-style: none;
}

.task {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: var(--sp-3) var(--sp-4);
    background: var(--surface-sunken);
    border: 1px solid var(--border-subtle);
    border-radius: var(--r-md);
    min-width: 0;
    transition:
        border-color var(--dur-2) var(--ease),
        background var(--dur-2) var(--ease);
}

.task:hover {
    background: var(--accent-soft);
    border-color: var(--accent-200);
}

.task-dot {
    display: grid;
    place-items: center;
    width: 22px;
    height: 22px;
    flex: 0 0 auto;
    color: var(--text-subtle);
    background: var(--surface);
    border: 1px solid var(--border-strong);
    border-radius: 50%;
}

.task-dot .icon {
    width: 13px;
    height: 13px;
    stroke-width: 2.4;
}

.task.is-done .task-dot {
    color: #fff;
    background: var(--success-ink);
    border-color: var(--success-ink);
}

.task.is-waiting .task-dot {
    color: var(--warning-ink);
    background: var(--warning-bg);
    border-color: var(--warning-border);
}

.task.is-revision .task-dot {
    color: var(--danger-ink);
    background: var(--danger-bg);
    border-color: var(--danger-border);
}

.task-main {
    flex: 1 1 auto;
    min-width: 0;
}

.task-title {
    display: block;
    font-size: var(--fs-14);
    font-weight: 600;
    color: var(--text);
    text-decoration: none;
    word-break: normal;
    overflow-wrap: break-word;
}

.task-title:hover {
    color: var(--accent-800);
    text-decoration: underline;
}

.task-meta {
    display: flex;
    gap: var(--sp-3);
    flex-wrap: wrap;
    font-size: var(--fs-12);
    color: var(--text-muted);
}

.task-side {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    flex: 0 0 auto;
}

/* Тренажёр карточек */
.trainer-stage {
    display: grid;
    place-items: center;
    padding: var(--sp-7) 0;
}

.flashcard {
    width: min(520px, 100%);
    min-height: 240px;
    perspective: 1200px;
    background: transparent;
    border: 0;
    padding: 0;
    cursor: pointer;
    font-family: inherit;
    text-align: center;
}

.flashcard-inner {
    position: relative;
    display: grid;
    place-items: center;
    min-height: 240px;
    padding: var(--sp-7);
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-xl);
    box-shadow: var(--shadow-2);
    transition: transform var(--dur-3) var(--ease);
    transform-style: preserve-3d;
}

.flashcard.is-flipped .flashcard-inner {
    transform: rotateY(180deg);
}

.flashcard-face {
    backface-visibility: hidden;
    display: flex;
    flex-direction: column;
    gap: var(--sp-3);
    align-items: center;
}

.flashcard-back {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    gap: var(--sp-3);
    align-items: center;
    justify-content: center;
    padding: var(--sp-7);
    transform: rotateY(180deg);
    background: var(--accent-soft);
    border-radius: var(--r-xl);
}

.flashcard-word {
    font-size: var(--fs-30);
    font-weight: 700;
    letter-spacing: var(--tracking-tight);
    word-break: normal;
    overflow-wrap: break-word;
}

.flashcard-hint {
    font-size: var(--fs-13);
    color: var(--text-muted);
}

.rating-row {
    display: flex;
    gap: var(--sp-3);
    justify-content: center;
    flex-wrap: wrap;
}

/* Журнал (матрица) */
.gradebook th.student-col,
.gradebook td.student-col {
    position: sticky;
    left: 0;
    z-index: 2;
    background: var(--surface);
    min-width: 180px;
    border-right: 1px solid var(--border);
}

.gradebook thead th.student-col {
    z-index: 3;
    background: var(--surface-sunken);
}

.gradebook td.cell {
    text-align: center;
    font-variant-numeric: tabular-nums;
    font-size: var(--fs-13);
    padding: var(--sp-2);
}

.cell-score {
    display: inline-grid;
    place-items: center;
    min-width: 40px;
    padding: 3px 7px;
    font-weight: 700;
    border-radius: var(--r-sm);
    background: var(--success-bg);
    color: var(--success-ink);
    text-decoration: none;
}

.cell-score.is-low {
    background: var(--danger-bg);
    color: var(--danger-ink);
}
.cell-score.is-mid {
    background: var(--warning-bg);
    color: var(--warning-ink);
}
.cell-score.is-waiting {
    background: var(--info-bg);
    color: var(--info-ink);
}
.cell-score.is-empty {
    background: var(--canvas-alt);
    color: var(--text-subtle);
    font-weight: 500;
}

/* ── Нижняя навигация для узких экранов ─────────────────── */
.mobile-nav {
    display: none;
    position: fixed;
    inset: auto 0 0 0;
    z-index: var(--z-sticky);
    padding: var(--sp-2) var(--sp-2) calc(var(--sp-2) + env(safe-area-inset-bottom));
    background: rgba(255, 255, 255, 0.96);
    backdrop-filter: blur(8px);
    border-top: 1px solid var(--border);
}

.mobile-nav ul {
    display: flex;
    justify-content: space-around;
    min-width: max-content;
    margin: 0;
    padding: 0;
    list-style: none;
}

.mobile-nav {
    overflow-x: auto;
    scrollbar-width: none;
}

.mobile-nav::-webkit-scrollbar {
    display: none;
}

.mobile-nav a {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2px;
    padding: var(--sp-2) var(--sp-3);
    font-size: var(--fs-11);
    font-weight: 600;
    color: var(--text-muted);
    text-decoration: none;
    border-radius: var(--r-md);
}

.mobile-nav a[aria-current="page"] {
    color: var(--accent-800);
    background: var(--accent-tint);
}

/* ── Адаптив ────────────────────────────────────────────── */
@media (max-width: 1180px) {
    .split {
        grid-template-columns: minmax(0, 1fr);
    }
    .split-side {
        position: static;
        max-height: none;
        overflow: visible;
    }
    :root {
        --aside-w: 300px;
    }
}

@media (max-width: 960px) {
    .workspace,
    .workspace.has-rail {
        grid-template-columns: minmax(0, 1fr);
        padding: var(--sp-5) var(--sp-4) calc(var(--sp-10) + var(--sp-5));
        gap: var(--sp-5);
    }
    .rail {
        position: static;
        max-height: none;
        overflow: visible;
        order: -1;
    }
    .mobile-nav {
        display: block;
    }
    .topbar {
        padding: 0 var(--sp-4);
        gap: var(--sp-3);
    }
    .topbar-side {
        gap: var(--sp-2);
    }
    .topbar-side .name,
    .topbar-side .btn-secondary {
        display: none;
    }
    .hero {
        padding: var(--sp-5);
    }
}

@media (max-width: 400px) {
    /* На узком экране остаётся логотип: название дублируется aria-label ссылки,
       поэтому доступное имя не теряется. */
    .topbar-brand > span:not(.brand-logo) {
        display: none;
    }
    .form-grid,
    .preset-grid,
    .type-cards > div,
    .type-cards #id_assignment_type {
        grid-template-columns: minmax(0, 1fr) !important;
    }
    .dropzone {
        flex-wrap: wrap;
    }
}

@media (max-width: 620px) {
    :root {
        --fs-24: 1.3rem;
        --fs-20: 1.15rem;
        --fs-30: 1.5rem;
    }
    .card {
        padding: var(--sp-5);
        border-radius: var(--r-md);
    }
    .row-item {
        flex-wrap: wrap;
        align-items: flex-start;
    }
    /* Статус и балл в списке заданий переезжают под заголовок: одной строкой
       они не помещаются на телефоне и растягивали страницу вбок. */
    .task {
        flex-wrap: wrap;
    }
    .task-side {
        flex: 1 1 100%;
        justify-content: flex-end;
    }
    .row-side {
        width: 100%;
        justify-content: flex-end;
    }
    .btn {
        min-height: var(--touch);
    }
    .stats {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    .review-nav {
        gap: var(--sp-2);
    }
}

/* Узкие экраны: никаких горизонтальных переполнений (проверяется в CI на 320px).
   Именно `break-word`, а не `anywhere`: `anywhere` участвует в расчёте
   min-content, из-за чего flex/grid-потомок сжимается до одной буквы
   («stu / den / t»). `break-word` переносит только то слово, которое
   действительно не помещается в строку. */
.workspace,
.content,
.card,
.rail-card,
.row-item,
.split-main,
.split-side,
.form-grid,
.preset-grid,
.type-cards,
.dropzone,
.lesson-sections,
.table-scroll,
.ex,
.panel,
#assignment-form,
.form-section,
.assignment-body,
.mobile-nav,
.mobile-nav ul,
.callout {
    min-width: 0;
    overflow-wrap: break-word;
    max-width: 100%;
    box-sizing: border-box;
}

.mobile-nav {
    max-width: 100vw;
    overflow-x: auto;
}

/* Неделимые токены (URL, пути, фрагменты кода) ломаем жёстко: иначе они
   растягивают контейнер вбок на узком экране. */
.content pre,
.content code,
.break-anywhere {
    overflow-wrap: anywhere;
}

/* ── Дерево курса преподавателя ──────────────────────────────────────────── */
.topic-panel {
  margin-top: 12px;
  padding: 12px;
}

.topic-head {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 16px;
  align-items: flex-start;
  justify-content: space-between;
}

.topic-head h3 {
  margin: 0;
  font-size: var(--fs-16);
}

/* ── Боковая навигация: разворачиваемая панель слева (desktop) ──
   Состояние хранится в html[data-nav]: expanded | collapsed.
   Переключатель — кнопка #nav-toggle в шапке панели. */
.app {
    --nav-w: var(--nav-w-expanded, 232px);
    display: grid;
    grid-template-columns: var(--nav-w) minmax(0, 1fr);
    min-height: 100vh;
    transition: grid-template-columns var(--dur-3) var(--ease);
}

html[data-nav="collapsed"] .app {
    --nav-w: var(--nav-w-collapsed, 76px);
}

.app-no-rail {
    grid-template-columns: minmax(0, 1fr);
}

.app-nav {
    position: sticky;
    top: 0;
    height: 100vh;
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    padding: var(--sp-4) var(--sp-3);
    background: var(--surface);
    border-right: 1px solid var(--border);
    z-index: var(--z-rail);
    overflow-y: auto;
    overflow-x: hidden;
    overscroll-behavior: contain;
}

.app-nav-head {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    padding-bottom: var(--sp-3);
    margin-bottom: var(--sp-2);
    border-bottom: 1px solid var(--border-subtle);
}

.app-nav-toggle {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    width: 100%;
    padding: var(--sp-3) var(--sp-3);
    font-family: inherit;
    font-size: var(--fs-13);
    font-weight: 700;
    letter-spacing: var(--tracking-wide);
    text-transform: uppercase;
    color: var(--text-muted);
    background: var(--surface-sunken);
    border: 1px solid var(--border-subtle);
    border-radius: var(--r-md);
    cursor: pointer;
    transition:
        color var(--dur-2) var(--ease),
        background var(--dur-2) var(--ease),
        border-color var(--dur-2) var(--ease);
}

.app-nav-toggle:hover {
    color: var(--accent-800);
    background: var(--accent-soft);
    border-color: var(--accent-200);
}

.app-nav-toggle:focus-visible {
    outline: 2px solid var(--accent-500);
    outline-offset: 2px;
}

.app-nav-toggle .icon {
    width: 18px;
    height: 18px;
    flex: 0 0 auto;
}

/* Подпись «Меню» видна только в развёрнутой панели; в свёрнутой остаётся значок. */
.app-nav-toggle-label {
    flex: 1 1 auto;
    text-align: left;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

html[data-nav="collapsed"] .app-nav-toggle-label {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}

.app-nav-list {
    display: flex;
    flex-direction: column;
    gap: var(--sp-1);
    margin: 0;
    padding: 0;
    list-style: none;
}

.app-nav-link {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: var(--sp-2) var(--sp-3);
    min-height: 44px;
    font-size: var(--fs-14);
    font-weight: 600;
    color: var(--text-muted);
    text-decoration: none;
    border: 1px solid transparent;
    border-radius: var(--r-md);
    white-space: nowrap;
    transition:
        color var(--dur-2) var(--ease),
        background var(--dur-2) var(--ease),
        border-color var(--dur-2) var(--ease);
}

.app-nav-link:hover {
    color: var(--text);
    background: var(--canvas-alt);
}

.app-nav-link.is-active {
    color: var(--accent-900);
    background: var(--accent-tint);
    border-color: var(--accent-200);
}

.app-nav-link .icon {
    width: 19px;
    height: 19px;
    flex: 0 0 auto;
}

.app-nav-label {
    flex: 1 1 auto;
    overflow: hidden;
    text-overflow: ellipsis;
}

.app-nav-count {
    flex: 0 0 auto;
    padding: 1px 7px;
    font-size: var(--fs-11);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--warning-ink);
    background: var(--warning-bg);
    border-radius: var(--r-pill);
}

.app-nav-link.is-active .app-nav-count {
    color: var(--on-accent);
    background: var(--accent-600);
}

/* Свёрнутое состояние: только иконки по центру, подписи скрыты. */
html[data-nav="collapsed"] .app-nav {
    padding-left: var(--sp-2);
    padding-right: var(--sp-2);
}

html[data-nav="collapsed"] .app-nav-head {
    justify-content: center;
    border-bottom-color: transparent;
}

html[data-nav="collapsed"] .app-nav-toggle {
    justify-content: center;
    padding-left: var(--sp-2);
    padding-right: var(--sp-2);
}

html[data-nav="collapsed"] .app-nav-link {
    justify-content: center;
    padding-left: 0;
    padding-right: 0;
}

html[data-nav="collapsed"] .app-nav-label,
html[data-nav="collapsed"] .app-nav-count {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}

/* Счётчик в свёрнутом виде — точка-индикатор поверх иконки. */
html[data-nav="collapsed"] .app-nav-link {
    position: relative;
}

html[data-nav="collapsed"] .app-nav-link:has(.app-nav-count)::after {
    content: "";
    position: absolute;
    top: 7px;
    right: 9px;
    width: 9px;
    height: 9px;
    background: var(--warning-ink);
    border: 2px solid var(--surface);
    border-radius: 50%;
}

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

/* На узких экранах боковую панель прячем — остаётся mobile-nav */
@media (max-width: 960px) {
    .app {
        grid-template-columns: minmax(0, 1fr);
    }
    .app-nav {
        display: none;
    }
}

/* ── Сцена «Енот на опушке» в шапке ─────────────────────────
   Цикл 56 c: сон → бег к книгам → озеро → чтение → возврат → сон с ZZZ.
   Пастель бренда: шалфейная трава, песочная тропинка, тёплый домик.
   raccoon_scene.js ставит корню data-season по текущему месяцу
   (или ?season=…): градиент неба ниже подстраивается под время года. */
.raccoon-scene {
    position: relative;
    flex: 1 1 auto;
    min-width: 180px;
    max-width: 640px;
    height: 56px;
    margin: 0 auto;
    overflow: hidden;
    border-radius: var(--r-lg);
    background: linear-gradient(180deg, #dcefe9 0%, #eef3e6 55%, #e9e2cf 100%);
    border: 1px solid var(--border-subtle);
}

.raccoon-scene[data-season="summer"] {
    background: linear-gradient(180deg, #dcefe9 0%, #eef3e6 55%, #e9e2cf 100%);
}

.raccoon-scene[data-season="spring"] {
    background: linear-gradient(180deg, #d9efe2 0%, #edf3dd 55%, #e9e2cd 100%);
}

.raccoon-scene[data-season="autumn"] {
    background: linear-gradient(180deg, #eadfc7 0%, #f0e6c8 55%, #e6d7b4 100%);
}

.raccoon-scene[data-season="winter"] {
    background: linear-gradient(180deg, #d7e3ee 0%, #e9eff6 55%, #dbe7f0 100%);
}

.raccoon-scene-canvas {
    display: block;
    width: 100%;
    height: 100%;
}

.raccoon-scene-fallback {
    position: absolute;
    left: 8px;
    bottom: 6px;
}

@media (max-width: 1180px) {
    .raccoon-scene {
        max-width: 460px;
        height: 50px;
    }
}

@media (max-width: 960px) {
    .raccoon-scene {
        height: 46px;
        min-width: 140px;
    }
}

@media (max-width: 720px) {
    .raccoon-scene {
        display: none;
    }
}

@media (max-width: 720px) {
  table .sticky-col {
    position: static;
  }
}

/* ── Бренд и безопасный режим просмотра ученика ─────────────────────────── */
.impersonation-bar {
    position: sticky;
    top: 0;
    z-index: calc(var(--z-topbar) + 1);
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--sp-5);
    min-height: 44px;
    padding: var(--sp-2) var(--sp-5);
    color: var(--accent-900);
    background: var(--accent-100);
    border-bottom: 1px solid var(--accent-200);
    box-shadow: var(--shadow-1);
}

.impersonation-bar__label {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-2);
    font-size: var(--fs-13);
    font-weight: 650;
}

/* ── Архив курса ─────────────────────────────────────────────────────────── */
.archive-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--sp-5);
    align-items: stretch;
}

/* Карточки одного ряда — одной высоты, содержимое прижато к верху,
   пустое состояние центрируется в оставшемся месте. */
.archive-section {
    display: flex;
    flex-direction: column;
    gap: 0;
    height: 100%;
    min-width: 0;
    box-sizing: border-box;
}

.archive-section .card-head {
    flex: 0 0 auto;
    align-items: center;
    min-height: 32px;
}

.archive-list {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.archive-list > .empty {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}

.archive-section .archive-item:last-child {
    border-bottom: 0;
}

.archive-section--wide {
    grid-column: 1 / -1;
}

.archive-stats {
    margin-bottom: 0;
}

@media (max-width: 1180px) {
    .archive-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

.archive-item {
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    padding: var(--sp-4) 0;
    border-top: 1px solid var(--border-subtle);
    min-width: 0;
    box-sizing: border-box;
}

.archive-item:first-of-type {
    border-top: 0;
}

.archive-item__icon {
    display: grid;
    place-items: center;
    flex: 0 0 36px;
    width: 36px;
    height: 36px;
    color: var(--accent-800);
    background: var(--accent-soft);
    border: 1px solid var(--accent-200);
    border-radius: var(--r-md);
}

.archive-item__body {
    flex: 1 1 auto;
    min-width: 0;
}

.archive-item__body h3 {
    margin: 0 0 var(--sp-1);
    font-size: var(--fs-14);
    overflow-wrap: break-word;
}

.archive-item__actions {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    flex: 0 0 auto;
}

.archive-item__actions form {
    flex: 0 0 auto;
}

.empty-compact {
    padding: var(--sp-6) var(--sp-4);
}

@media (max-width: 720px) {
    .archive-grid {
        grid-template-columns: minmax(0, 1fr);
        align-items: start;
    }
    .archive-section {
        height: auto;
    }
    .archive-section--wide {
        grid-column: auto;
    }
    .impersonation-bar {
        align-items: flex-start;
        flex-direction: column;
        gap: var(--sp-2);
        padding: var(--sp-3) var(--sp-4);
    }
    .archive-item {
        align-items: flex-start;
        flex-wrap: wrap;
    }
    .archive-item__actions {
        width: 100%;
        justify-content: flex-end;
    }
}
