/* ============================================================
   English to Go World — основні компоненти.
   Усі значення — з design-tokens.css (var(--...)), без хардкоду.
   ============================================================ */

/* design-tokens.css підключається окремим <link> з версією (asset()) у <head> кожної сторінки —
   @import тут ламав кеш-бастинг: URL імпорту не мав ?v і браузер тримав старі токени. */

/* ЕТАЛОН РЕДИЗАЙНУ (Юля 17.07, СХВАЛЕНО — приклад для решти сайту):
   БЕЗ плашок-палуб — контент прямо на градієнті, відступи (padding/margin
   плашок) лишаються, щоб не злипалось. Сторінка опт-ін: клас page-boardless
   на <body> (courses ✅, vocabulary ✅, dashboard ✅ 18.07, grammar/notes ✅,
   train ✅ 23.07) — усі цільові сторінки розкатані. */
.page-boardless .page-board,
.page-boardless .postcard-hero {
    background: transparent; border: 0; box-shadow: none;
}
/* Скло (glassmorphism) — спільний рецепт розкатки: матова поверхня з блуром
   позаду. .glass-pill = округлий значок/eyebrow зі світлою рамкою,
   .glass-panel = секційна панель під текст (дрібний muted-текст на градієнті
   фейлить контраст — Б-аудит, docs/design-system-refresh.md). */
.glass-pill, .glass-panel,
.page-boardless .ph-eyebrow {
    background: color-mix(in srgb, var(--color-surface) 55%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
}
.glass-pill,
.page-boardless .ph-eyebrow {
    border: 1px solid color-mix(in srgb, var(--color-surface) 65%, transparent);
    border-radius: var(--radius-pill);
}
.glass-panel { border: 0; border-radius: var(--radius-lg); }
/* Eyebrow hero — скляний pill із блуром позаду */
.page-boardless .ph-eyebrow {
    display: inline-flex; align-items: center; align-self: flex-start;
    padding: 5px 14px; margin-bottom: 4px;
}
/* Значки рівня A1/A2/… — скляний pill поверх фото (блур розмиває картинку
   за значком). Графіт-текст на матовому склі читається; тінь для контуру. */
.page-courses .lc-cover .lc-badge {
    background: color-mix(in srgb, var(--color-surface) 58%, transparent);
    -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
    border: 1px solid color-mix(in srgb, var(--color-surface) 70%, transparent);
    color: var(--color-text);
    box-shadow: 0 2px 10px -3px rgba(0, 0, 0, 0.28);
}

/* Словник (18.07, розкатка еталона): скляний тулбар (Карта/A–Z + статистика)
   і липкий алфавіт-бар; картки слів без обводки — статусна ліва смуга лишається
   (колір смуги задають статусні правила нижче в файлі). */
.page-vocab .vocab-toolbar {
    background: color-mix(in srgb, var(--color-surface) 55%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    border: 0; border-radius: var(--radius-lg);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    /* більший горизонтальний відступ = концентричні кути (18.07): pill-и всередині
       перестають упиратись у кут контейнера справа/зліва */
    padding: 10px 22px; margin-bottom: var(--space-4);
}
.page-vocab .az-nav {
    background: color-mix(in srgb, var(--color-surface) 62%, transparent);
    -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
    border: 0; border-radius: var(--radius-lg);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 18%, transparent);
}
.page-vocab .vocab-card { border: 0; border-left: 4px solid var(--color-primary); }
/* Вьюхи (карта слів / A–Z список) — контент-картка на градієнті: список
   прозорий і розраховував на плашку під собою (без неї слова висіли б голі).
   Без overflow:hidden на .vocab-view — інакше зламається sticky алфавіт-бара. */
.page-vocab .vocab-view {
    background: var(--color-surface); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-card);
}
/* Обрізаємо тінти ховера/відкритої картки по нижніх кутах на .az-card
   (18.07: остання картка світила квадратними кутами). Це НЕ ламає sticky:
   алфавіт-бар — сусід .az-card, а не нащадок. */
.page-vocab .az-card {
    border-radius: 0 0 var(--radius-lg) var(--radius-lg);
    overflow: hidden;
}
/* Пошук у скляному тулбарі (18.07): був крем із теплою рамкою — чужинець на
   склі. Тепер напівпрозоре біле в тон скла + холодна hairline; фокус —
   канонічний перивінкл-glow. */
.page-vocab .vocab-search {
    background-color: color-mix(in srgb, var(--color-surface) 72%, transparent);
    border-color: color-mix(in srgb, var(--color-text) 14%, transparent);
    /* лупа всередині поля (18.07); колір = --color-text-muted */
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236f6b73' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M21 21l-4.3-4.3'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: 13px 50%; background-size: 15px;
    /* нижчий padding — зрівняти висоту з тоглом/статами в тулбарі (18.07) */
    padding: 6px 16px 6px 37px;
}
.page-vocab .vocab-search:focus {
    background-color: var(--color-surface);
    border-color: var(--color-primary);
    box-shadow: var(--shadow-glow);
}
/* Порядок у тулбарі (18.07): пошук ЛІВОРУЧ, тогл Карта/A–Z ПРАВОРУЧ.
   Через flex-order — DOM/таб-порядок не чіпаємо. */
.page-vocab .vocab-tools { flex-direction: row-reverse; }
/* Дії слова у списку — легкі pill-чипи без «печатки» (запит Юлі 18.07:
   грубі кнопки в щільному списку; печатка лишається в уроках). */
.page-vocab .vocab-actions button {
    border: 1px solid var(--color-border); box-shadow: none;
    background: transparent; color: var(--color-primary-700);
    padding: 5px 13px; border-radius: var(--radius-pill); font-weight: 600;
}
.page-vocab .vocab-actions button:hover:not(:disabled) {
    background: var(--color-primary-050); border-color: var(--color-primary-100);
    transform: none; box-shadow: none;
}
.page-vocab .vocab-actions button:active:not(:disabled) { transform: none; box-shadow: none; background: var(--color-primary-100); }
/* «Видалити» — іконка-смітник (18.07): тихий сірий чип, ховер = мʼяка небезпека.
   Порядок у рядку (18.07): кнопка статусу → слово-статус → смітник на правому
   краю (руйнівне — подалі); чисто flex-order, DOM/JS не чіпаємо. */
.page-vocab .vocab-actions .remove-word {
    display: inline-flex; align-items: center; justify-content: center;
    padding: 6px 10px; color: var(--color-text-muted);
    order: 3; margin-left: auto;
}
/* Ключове слово в прикладі — жовтий маркер (та сама мова, що виділення слів
   в уроках: --vocab-hl-mark), текст лишається кольором прикладу. */
.page-vocab .example .ex-key {
    background: var(--vocab-hl-mark); color: inherit;
    border-radius: 3px; padding: 0 3px; margin: 0 -1px;
}
.page-vocab .vocab-actions .remove-word:hover:not(:disabled) {
    background: var(--color-error-100); border-color: var(--ex-no-border); color: var(--ex-no-ink);
}
.page-vocab .vocab-actions .remove-word:active:not(:disabled) { background: var(--ex-no-border); }
/* СТАТУС СЛОВА (18.07). Іконку (книжка=вчу / галочка=вивчено) і колір задають
   змінні НА КАРТЦІ — ними користуються обидва варіанти. Три поведінки:
   • Карта/панель: іконка ПЕРЕД словом + тултіп (.word-status).
   • A–Z розгорнутий: іконка + СЛОВО у діях, біля кнопки (.status-badge).
   • A–Z компактний: нічого. */
.page-vocab .vocab-card[data-status="learning"] { --st-color: var(--color-secondary-700);
    --st-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 4h6a3 3 0 0 1 3 3v13a2.5 2.5 0 0 0-2.5-2.5H2z'/%3E%3Cpath d='M22 4h-6a3 3 0 0 0-3 3v13a2.5 2.5 0 0 1 2.5-2.5H22z'/%3E%3C/svg%3E"); }
.page-vocab .vocab-card[data-status="learned"] { --st-color: var(--color-success-700);
    --st-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M8.5 12.3l2.4 2.4 4.8-5'/%3E%3C/svg%3E"); }
/* спільна маскована іконка */
.page-vocab .word-status::before, .page-vocab .status-badge::before {
    content: ''; background-color: currentColor;
    -webkit-mask: var(--st-ico) center / contain no-repeat;
    mask: var(--st-ico) center / contain no-repeat;
}

/* Іконка перед словом + тултіп — ЛИШЕ в панелі карти */
.page-vocab .word-status {
    position: relative; display: none; width: 16px; height: 16px;
    flex: none; vertical-align: -3px; margin-right: 7px; cursor: help; color: var(--st-color);
}
.vocab-panel .word-status { display: inline-flex; }
.page-vocab .word-status::before { position: absolute; inset: 0; }
.page-vocab .word-status::after {
    position: absolute; bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%);
    padding: 3px 9px; border-radius: var(--radius-sm);
    background: var(--color-text); color: var(--color-on-accent);
    font-family: var(--font-body); font-size: var(--fs-xs); font-weight: 600;
    white-space: nowrap; opacity: 0; pointer-events: none;
    transition: opacity var(--dur-fast) var(--ease);
}
.page-vocab .word-status:hover::after { opacity: 1; }
.page-vocab .vocab-card[data-status="learning"] .word-status::after { content: "вчу"; }
.page-vocab .vocab-card[data-status="learned"] .word-status::after { content: "вивчено"; }

/* Іконка + слово у діях — ЛИШЕ в розгорнутій картці A–Z */
.page-vocab .status-badge {
    order: 2; margin: 0; padding: 0; background: transparent; border: 0;
    display: none; align-items: center; gap: 5px;
    font-size: var(--fs-small); font-weight: 600; color: var(--st-color);
}
.page-vocab .status-badge::before { width: 15px; height: 15px; flex: none; }
#view-az .vocab-card.is-open .status-badge { display: inline-flex; }

/* Граматика (18.07, розкатка еталона): боардлес — .gr-app скидає плашку через
   клас page-boardless (правило .page-boardless .page-board вгорі), hero-eyebrow
   стає скляним автоматично. Липка панель «назад + пошук» перетворюється на скляний
   тулбар (той самий рецепт, що .vocab-toolbar) — sticky не чіпаємо (position лишається
   на базовому .gr-bar). Картки/деталь тем — непрозорий surface, лишаються як є. */
.page-grammar .gr-bar {
    background: color-mix(in srgb, var(--color-surface) 55%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    border: 0; border-radius: var(--radius-lg);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    /* висота/боковий інсет 1:1 зі скляним тулбаром словника (.vocab-toolbar) */
    padding: 10px 22px;
}
/* Кнопка «Назад» — висота = інпут (6px верт. + рамка 1px), щоб бар був рівний */
.page-grammar .gr-back { padding: 6px 14px 6px 10px; border-width: 1px; }
/* Пошук у скляному тулбарі: крем із теплою рамкою — чужинець на склі (як у словнику).
   Напівпрозоре біле в тон скла + холодна hairline; фокус — канонічний перивінкл-glow.
   Висота 1:1 з .vocab-search: вертикальний padding 6px + рамка 1px (було 11px/1.5px). */
.page-grammar .gr-bar .gr-search-box input {
    background-color: color-mix(in srgb, var(--color-surface) 72%, transparent);
    border-color: color-mix(in srgb, var(--color-text) 14%, transparent);
    border-width: 1px;
    padding: 6px 14px 6px 40px;
}
.page-grammar .gr-bar .gr-search-box input:focus {
    background-color: var(--color-surface);
    border-color: var(--color-primary);
    box-shadow: var(--shadow-glow);
}

/* Місток (18.07, рішення Юлі): БЕНТО-МОЗАЇКА — вся статистика в одній сітці
   3×N, кожна плитка на легкому склі (уніфіковано, вибір Юлі «все скло»);
   паперові предмети (тайли досягнень, печатки, марка слова дня) живуть
   всередині плиток. Span-и: .bt-2 = 2 колонки, .bt-3 = на всю ширину.
   dense — щоб вузькі плитки підтягувались у діри, коли якоїсь секції нема. */
/* База 6 колонок: дає кроки ⅓ (span 2, дефолт), ½ (.bt-half, span 3),
   ⅔ (.bt-2, span 4) і повну ширину (.bt-3) — 50/50-ряди без ламання решти. */
.page-dash .dash-bento {
    display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
    grid-auto-flow: dense; gap: var(--space-4);
}
.page-dash .dash-bento > * {
    margin: 0; border: 0; border-radius: var(--radius-lg); min-width: 0;
    grid-column: span 2;
    /* 82% білого (було 55%): на плитках багато тексту, крізь прозоріше скло
       градієнт заважав читати (фідбек Юлі 18.07) */
    background: color-mix(in srgb, var(--color-surface) 82%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    padding: 18px 20px 16px;
}
.page-dash .dash-bento > .bt-half { grid-column: span 3; }
.page-dash .dash-bento > .bt-2 { grid-column: span 4; }
.page-dash .dash-bento > .bt-3 { grid-column: 1 / -1; }
@media (max-width: 900px) {
    .page-dash .dash-bento { grid-template-columns: 1fr; }
    .page-dash .dash-bento > * { grid-column: auto; }
}

/* ===== Explorer ID — картка-посвідчення (концепт 2, рішення Юлі 19.07) =====
   Ліворуч посвідчення з аватаркою в кільці рангу + паспортні поля;
   праворуч звична бенто-сітка плиток. */
.page-dash .profile-shell { display: grid; grid-template-columns: 340px minmax(0, 1fr); gap: var(--space-4); align-items: start; }
@media (max-width: 900px) { .page-dash .profile-shell { grid-template-columns: 1fr; } }
/* Ліва картка sticky (рішення Юлі 19.07): слідує за скролом, нижче липкого хедера.
   Тільки на desktop-сітці — на вузькому шелл стає одноколонковим і sticky зайвий. */
@media (min-width: 901px) {
    .page-dash .id-card { position: sticky; top: 90px; }
}

.id-card {
    background: color-mix(in srgb, var(--color-surface) 90%, transparent);
    border-radius: var(--radius-lg); overflow: hidden;
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
}
.id-band {
    position: relative; color: var(--color-on-hero); padding: 15px 20px 54px; overflow: hidden;
    background: linear-gradient(150deg, var(--hero-grad-from) 0%, var(--color-primary) 55%, var(--hero-grad-to) 100%);
}
.id-band::after {
    content: ""; position: absolute; inset: 0; opacity: .5; pointer-events: none;
    background:
        repeating-radial-gradient(circle at 20% -10%, rgba(255,255,255,.10) 0 1px, transparent 1px 9px),
        repeating-linear-gradient(60deg, rgba(255,255,255,.05) 0 1px, transparent 1px 12px);
}
.id-band-row { position: relative; display: flex; align-items: center; justify-content: space-between; }
.id-brand { font-family: var(--font-mono); font-size: 10px; letter-spacing: .16em; text-transform: uppercase; display: inline-flex; align-items: center; gap: 7px; }
.id-type { font-family: var(--font-mono); font-size: 9px; letter-spacing: .18em; text-transform: uppercase; opacity: .72; }

.id-portrait { position: relative; width: 128px; height: 128px; margin: -42px auto 0; }
.id-portrait .id-ring { position: absolute; inset: 0; transform: rotate(-90deg); }
.id-avatar {
    position: absolute; inset: 12px; border-radius: 50%; overflow: hidden;
    display: flex; align-items: center; justify-content: center;
    background: linear-gradient(150deg, var(--color-primary-100), var(--color-primary));
    box-shadow: 0 0 0 5px var(--color-surface), 0 8px 18px -8px color-mix(in srgb, var(--color-text) 45%, transparent);
}
.id-avatar img { width: 100%; height: 100%; object-fit: cover; }
.id-avatar span { font-family: var(--font-head); font-weight: 700; font-size: 44px; color: #fff; }
.id-tier {
    position: absolute; left: 50%; bottom: -6px; transform: translateX(-50%); white-space: nowrap;
    display: inline-flex; align-items: center; gap: 5px;
    font-family: var(--font-mono); font-size: 9.5px; letter-spacing: .1em; text-transform: uppercase;
    background: var(--color-secondary); color: var(--color-secondary-700);
    border-radius: var(--radius-pill); padding: 3px 11px; box-shadow: 0 3px 8px -3px color-mix(in srgb, var(--color-text) 40%, transparent);
}

.id-body { padding: 18px 20px 20px; text-align: center; }
.id-name { font-family: var(--font-head); font-size: 22px; font-weight: 700; margin: 8px 0 2px; }
.id-sub { font-size: var(--fs-small); color: var(--color-text-muted); }
.id-sub b { color: var(--color-primary-700); }
.id-fields { margin-top: 18px; text-align: left; }
.id-field { display: flex; align-items: baseline; justify-content: space-between; padding: 11px 2px; border-top: 1px dashed var(--color-border); }
.id-field:first-child { border-top: 0; }
.id-field .k { font-family: var(--font-mono); font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--color-text-muted); }
.id-field .v { font-family: var(--font-head); font-weight: 700; font-size: 18px; font-variant-numeric: tabular-nums; }
.id-field .v small { font-size: 12px; color: var(--color-text-muted); font-weight: 600; }
.id-field .v.xp { color: var(--color-primary-700); }
.id-field .v.streak { color: var(--color-secondary-700); }
.id-field .v.co { color: var(--color-success-700); }
.id-open {
    margin-top: 16px; width: 100%; display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    background: transparent; color: var(--color-primary-700); border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-pill); font: inherit; font-weight: 600; font-size: var(--fs-small); padding: 11px 16px; cursor: pointer;
}
.id-open:hover { background: var(--color-primary-050); border-color: var(--color-primary); }

/* Continue-плитка у правому стовпчику (замінює split-hero) */
.cont-tile { display: flex; align-items: center; gap: 16px; }
.cont-thumb { flex: none; width: 62px; height: 62px; border-radius: 12px; overflow: hidden; background: var(--color-primary-100); }
.cont-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cont-body { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.cont-lab { font-family: var(--font-mono); font-size: 9.5px; letter-spacing: .14em; text-transform: uppercase; color: var(--color-text-muted); }
.cont-ttl { font-family: var(--font-head); font-weight: 700; font-size: 17px; }
.cont-sub { font-size: var(--fs-small); color: var(--color-text-muted); }
.cont-tile .btn-ticket, .cont-tile .btn-primary { margin-left: auto; flex: none; }
@media (max-width: 560px) {
    .cont-tile { flex-wrap: wrap; }
    .cont-tile .btn-ticket, .cont-tile .btn-primary { margin-left: 0; width: 100%; justify-content: center; }
}

/* Заголовки плиток — мова mono-лейблів борту (як «Бортовий журнал»),
   великі h2 зʼїдали компактність. */
.page-dash .dash-bento h2 {
    font-family: var(--font-mono); font-size: 10.5px; font-weight: 400;
    letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-text-muted);
    display: flex; align-items: center; gap: 10px; margin: 0 0 var(--space-3);
}
.page-dash .dash-bento .ach-count { font-size: 10px; padding: 1px 8px; letter-spacing: normal; }
/* Стат-якорі (19.07, рішення Юлі): у плитці рівно ОДНЕ велике число, за яке
   чіпляється око (XP, стрік, слова); все інше — 14px супровід. Шкала:
   A якір 1.9rem → B назви 15px → C супровід 14px muted → D мікро-лейбл 10.5px. */
.stat-big {
    margin: 0 0 2px; font-family: var(--font-head); font-weight: 700;
    font-size: 1.9rem; line-height: 1.15; letter-spacing: -0.01em;
    color: var(--color-text); font-variant-numeric: tabular-nums;
}
.stat-big .sb-unit, .stat-big .sb-of {
    font-family: var(--font-body); font-size: 0.95rem; font-weight: 600;
    letter-spacing: normal; color: var(--color-text-muted);
}
/* Семантика якорів (19.07, варіант А): перивінкл = прогрес/дія (XP),
   персик = стрік/тепло, зелений = вивчено. Тільки число — юніт лишається muted. */
.stat-act  { color: var(--color-primary-700); }
.stat-warm { color: var(--color-secondary-700); }
.stat-done { color: var(--color-success-700); }
.stat-zero { color: var(--color-text-muted); }   /* нульовий стрік гасить і персик */
/* Перекриття «предметних» плиток під скло: стаб зберігає відступ під перфорацію,
   листівка слова дня втрачає нахил (у сітці він ламав ряд). */
/* Список слів (у «Валізі слів») — порядок 19.07: рядки без ліній (тільки
   відступи), слова 15px/600 — тихіші за слово дня; лінії лишаються тільки
   як межі зон плитки. */
.words-list { list-style: none; margin: 0; padding: 0; }
.words-list li {
    display: flex; align-items: baseline; gap: 8px;
    padding: 5px 0;
}
.words-list li:last-child { padding-bottom: 0; }
.wl-w { font-family: var(--font-head); font-weight: 600; font-size: 15px; min-width: 0; }
.wl-t { margin-left: auto; text-align: right; color: var(--color-text-muted); font-size: 13px; }

/* «Валіза слів» — лічильники + слово дня + останні слова в одній плитці
   (ієрархія 18.07: слово дня більше не окрема плитка-листівка) */
.sc-stats { margin: 0 0 4px; font-size: var(--fs-small); color: var(--color-text-muted); }
.sc-stats b { color: var(--color-text); font-variant-numeric: tabular-nums; }
.sc-due { color: var(--color-secondary-700); font-weight: 600; text-decoration: none; }
.sc-due:hover { text-decoration: underline; }
/* Слово дня — картка-«марка» всередині скла на світлому перивінклі
   (рішення Юлі 19.07): токен --color-primary-050 #eef1fc. Тінт сам відділяє
   зону, пунктирна межа не потрібна. */
.sc-wod { background: var(--color-primary-050); border-radius: var(--radius-md); margin-top: 10px; padding: 10px 14px 12px; }
/* Зонні лейбли валізи: «Слово дня» і «Останні слова» — однакова мова,
   кожна зона плитки відкривається таким лейблом (порядок 19.07).
   Індиго-700 замість персика: лейбл лежить на лавандовій картці — тон-у-тон. */
.sc-wod-lab, .sc-list-lab { display: block; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.16em; color: var(--color-primary-700); }
.sc-wod-word { font-family: var(--font-head); font-weight: 700; font-size: 1.45rem; margin: 4px 0 0; }
.sc-wod-tr { color: var(--color-text-muted); margin: 0 0 6px; font-size: var(--fs-small); }
/* Приклад — на клас тихіше за слово (0.9rem + muted), щоб не сперечався з reef */
.sc-wod-ex { font-family: var(--font-example); font-weight: 500; font-style: italic; font-size: 0.9rem; color: var(--color-text-muted); margin: 0; }
.sc-recent { border-top: 1px dashed var(--color-border); margin-top: 10px; padding-top: 10px; }
.sc-recent .words-list { margin-top: 4px; }

/* Дві кнопки «детальніше» в одному заголовку (плитка «Скарби») */
.h2-actions { display: inline-flex; gap: 8px; margin-left: auto; }
.h2-actions .sec-more { margin-left: 0; }

/* ---- Обʼєднання «Мій профіль» = Місток + Паспорт (18.07) ---- */
/* Плитка-паспорт: мінідокумент у кольорах обкладинки, клік = поп-ап книжки */
.page-dash .dash-bento > .passport-tile {
    padding: 0;
    background: linear-gradient(150deg, var(--hero-grad-from) 0%, var(--color-primary) 55%, var(--hero-grad-to) 100%);
}
.pt-open {
    position: relative; display: flex; flex-direction: column; align-items: center;
    justify-content: center; gap: 6px; width: 100%; height: 100%;
    min-height: 300px; padding: 30px 24px; cursor: pointer;
    background: transparent; border: 0; border-radius: inherit;
    color: var(--color-on-hero); font: inherit; text-align: center;
}
.pt-open::before {   /* корінець книжки, як на великій обкладинці */
    content: ""; position: absolute; left: 7px; top: 10px; bottom: 10px; width: 1.5px;
    background: rgba(243, 228, 194, 0.35);
}
.pt-open:hover { filter: brightness(1.06); }
.pt-emblem { opacity: 0.9; }
.pt-title { font-family: var(--font-head); font-weight: 700; font-size: 1.5rem; letter-spacing: 0.32em; line-height: 1.3; }
.pt-title small { display: block; font-family: var(--font-body); font-size: var(--fs-small); letter-spacing: 0.16em; text-transform: uppercase; opacity: 0.75; font-weight: 400; }
.pt-holder { font-family: var(--font-mono); font-weight: 700; font-size: 1.05rem; letter-spacing: 0.08em; text-transform: uppercase; margin-top: 12px; }
.pt-rank { font-size: var(--fs-small); opacity: 0.85; display: inline-flex; align-items: center; gap: 5px; }
.pt-hint {
    margin-top: 14px; font-size: var(--fs-small); font-weight: 600; letter-spacing: 0.06em;
    text-transform: uppercase; border: 1px solid rgba(243, 228, 194, 0.45);
    border-radius: var(--radius-pill); padding: 6px 16px;
}
.pt-open:hover .pt-hint { background: rgba(255, 255, 255, 0.12); }
/* Плитки сувенірів/листівок: короткий стан + ряд останніх сувенірів */
.st-empty { margin: 0; font-size: var(--fs-small); color: var(--color-text-muted); }
.st-empty b { color: var(--color-text); }
.st-row { display: flex; gap: 10px; }
.st-row .souvenir { flex: 1; min-width: 0; }
/* Широкий поп-ап — паспорт-книжка та альбом листівок */
/* Два класи (0,2,0) — щоб перебити базове .dash-dialog{width:720} нижче у файлі,
   інакше розворот-паспорт (940px) не влазить у 720 і права сторінка ріжеться. */
.dash-dialog.dash-dialog-wide { width: min(94vw, 960px); }
.dash-dialog .passport-book { margin-bottom: var(--space-4); }

/* Паспорт як самостійне «вікно» (рішення Юлі 19.07): БЕЗ кремового контейнера —
   книжка-паспорт плаває прямо на затемненому фоні, зʼявляється анімацією й
   гортається. Хрестик — плаваючий (sticky), заголовок «Мій паспорт» прибрано. */
/* Два класи (0,2,0) — щоб перебити базове .dash-dialog{background} нижче у файлі */
.dash-dialog.dash-dialog-passport { background: transparent; box-shadow: none; }
.dash-dialog-passport .dlg-inner { padding: 0; }
.dash-dialog-passport .dlg-head { position: sticky; top: 0; z-index: 6; margin: 0; padding: 2px; justify-content: flex-end; }
.dash-dialog-passport .passport-book { margin-bottom: 0; }
.dash-dialog-passport .visas { margin-top: var(--space-5); }
.dash-dialog-passport .visas h2 { color: rgba(255, 255, 255, 0.92); }
/* Порожній стан (новачок без штампів) — власна світла картка, щоб текст читався */
.dash-dialog-passport .empty-state {
    background: color-mix(in srgb, var(--color-surface) 92%, transparent);
    border-radius: var(--radius-lg); padding: var(--space-5); margin-top: var(--space-3);
}
@keyframes pp-appear { from { opacity: 0; transform: translateY(14px) scale(.94); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: no-preference) {
    .dash-dialog-passport[open] > .dlg-inner > .passport-book,
    .dash-dialog-passport[open] > .dlg-inner > .pb-cover { animation: pp-appear .5s var(--spring) both; }
}

/* ---- Компактний Місток (18.07): секції показують крайнє, деталі — поп-ап ---- */
/* Кнопка «детальніше» в заголовку секції — тихий pill-чип (мова vocab-actions),
   стає на правий край заголовка. Працює і як <button> (поп-ап), і як <a> (сторінка). */
.sec-more {
    font-family: var(--font-body); font-size: var(--fs-xs); font-weight: 600;
    flex: none; margin-left: auto; padding: 3px 10px; cursor: pointer;
    border: 1px solid var(--color-border); border-radius: var(--radius-pill);
    background: transparent; color: var(--color-primary-700); text-decoration: none;
    letter-spacing: normal; text-transform: none;
}
.sec-more:hover { background: var(--color-primary-050); border-color: var(--color-primary-100); }

/* Поп-ап деталей — паперова картка (рецепт page-board) на притемненому
   блур-бекдропі; контент скролиться всередині. Padding живе в .dlg-inner,
   щоб клік у сам <dialog> означав «бекдроп» (закриття в dashboard.js). */
.dash-dialog {
    border: 0; border-radius: var(--radius-lg); background: var(--color-bg);
    box-shadow: var(--shadow-lg); padding: 0;
    width: min(92vw, 720px); max-height: 78vh; overflow: auto;
    /* Центрування модала через transform (19.07): inset:0 + margin:auto ламався на
       ВИСОКОМУ діалозі (сувенірів багато → впирається в max-height + скрол): коли
       інтринсік-висота контенту > вʼюпорт, auto-марджини схлопуються в 0 і діалог
       притискається догори. transform не залежить від марджинів — центрує будь-яку
       висоту, а max-height:78vh гарантує, що бокс завжди влазить у вʼюпорт. */
    position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0;
}
.dash-dialog::backdrop {
    background: color-mix(in srgb, var(--color-ink) 42%, transparent);
    -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
}
.dlg-inner { padding: clamp(18px, 3vw, 28px); }
.dlg-head { display: flex; align-items: center; gap: 10px; margin-bottom: var(--space-4); }
.dlg-head h3 { margin: 0; display: flex; align-items: center; gap: 10px; }
.dlg-close {
    margin-left: auto; flex: none; width: 34px; height: 34px; cursor: pointer;
    display: inline-flex; align-items: center; justify-content: center;
    border: 1px solid var(--color-border); border-radius: 50%;
    background: var(--color-surface); color: var(--color-text-muted);
}
.dlg-close:hover { color: var(--color-text); border-color: var(--color-border-strong); }
.dlg-note { margin: var(--space-3) 0 0; font-size: var(--fs-xs); color: var(--color-text-muted); font-family: var(--font-mono); }


* { box-sizing: border-box; }

/* ФОН СТОРІНОК (рішення Юлі 17.07): шумні градієнт-плями з палітри, РІЗНІ на
   кожній сторінці. Правило композиції: один ТЕМНИЙ колір (індиго #5158a6 або
   перивінкл #5875dc) = головна пляма-акцент + два інші кольори палітри.
   Зерно — плівкове (feTurbulence, overlay). Живе на <html> (фіксований).
   Виключення (нижче): карта й уроки лишаються на власних фонах. */
html {
    scroll-behavior: smooth;
    /* текстура-зерно як змінна, щоб не дублювати в кожній сторінці */
    --grain-tex: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='170' height='170'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='170' height='170' filter='url(%23n)' opacity='0.62'/%3E%3C/svg%3E");
    background-attachment: fixed;
    background-repeat: repeat, no-repeat, no-repeat, no-repeat, no-repeat;
    background-size: 170px 170px, cover, cover, cover, cover;
    background-blend-mode: overlay, normal, normal, normal, normal;
    transition: background-color var(--dur) var(--ease);
    /* ДЕФОЛТ (сторінки без власного комбо): індиго+перивінкл+пісок+лаванда */
    background-color: #e8e5ef;
    background-image: var(--grain-tex),
        radial-gradient(96% 96% at 90% 14%, rgba(81, 88, 166, 0.82), transparent 62%),
        radial-gradient(88% 88% at 8% 90%,  rgba(88, 117, 220, 0.72), transparent 60%),
        radial-gradient(90% 88% at 10% 8%,  rgba(234, 215, 184, 0.85), transparent 62%),
        radial-gradient(85% 84% at 94% 90%, rgba(228, 213, 232, 0.78), transparent 60%);
}

/* Кожна сторінка: 4 кольори палітри великими плямами, що заливають полотно
   (не «плямки по кутах»), + зерно. Кольори мікс — без єдиного акценту. */

/* Маршрути — перивінкл + персик + індиго + лаванда */
html[data-page="courses.php"] {
    background-color: #e7e4ef;
    background-image: var(--grain-tex),
        radial-gradient(96% 98% at 90% 12%, rgba(88, 117, 220, 0.88), transparent 60%),
        radial-gradient(90% 92% at 12% 94%, rgba(255, 179, 138, 0.88), transparent 58%),
        radial-gradient(85% 88% at 94% 92%, rgba(81, 88, 166, 0.72), transparent 58%),
        radial-gradient(92% 90% at 6% 6%,   rgba(228, 213, 232, 0.90), transparent 64%);
}
/* Паспорт — індиго + пісок + персик + перивінкл */
html[data-page="passport.php"] {
    background-color: #ece7ea;
    background-image: var(--grain-tex),
        radial-gradient(98% 96% at 88% 90%, rgba(81, 88, 166, 0.85), transparent 60%),
        radial-gradient(92% 90% at 8% 12%,  rgba(234, 215, 184, 0.95), transparent 60%),
        radial-gradient(82% 84% at 50% 54%, rgba(255, 179, 138, 0.75), transparent 58%),
        radial-gradient(85% 86% at 96% 18%, rgba(88, 117, 220, 0.72), transparent 58%);
}
/* Капмісток — перивінкл + мʼята + персик + індиго */
html[data-page="dashboard.php"] {
    background-color: #e6ecec;
    background-image: var(--grain-tex),
        radial-gradient(96% 96% at 90% 14%, rgba(88, 117, 220, 0.85), transparent 60%),
        radial-gradient(90% 90% at 10% 92%, rgba(255, 179, 138, 0.85), transparent 58%),
        radial-gradient(92% 92% at 6% 10%,  rgba(238, 244, 243, 0.95), transparent 62%),
        radial-gradient(82% 84% at 96% 90%, rgba(81, 88, 166, 0.70), transparent 58%);
}
/* Граматика — світлий персиковий кут під героєм (Юля 18.07): текст лежить у
   лівому-верхньому куті, тому там світлий персик замість темного індиго (той
   тонув muted-підзаголовок). Багатство індиго/перивінклу — праворуч і внизу,
   не під текстом. Родина: персик + перивінкл + лаванда + індиго. */
html[data-page="grammar.php"] {
    background-color: #ece8f1;
    background-image: var(--grain-tex),
        radial-gradient(84% 79% at 12% 15%, rgba(255, 197, 162, 0.68), transparent 60%),
        radial-gradient(94% 90% at 94% 86%, rgba(88, 117, 220, 0.80), transparent 60%),
        radial-gradient(88% 88% at 90% 8%,  rgba(228, 213, 232, 0.90), transparent 62%),
        radial-gradient(96% 92% at 6% 98%,  rgba(81, 88, 166, 0.58), transparent 58%);
}
/* Словник — перивінкл + мʼята + персик + лаванда */
html[data-page="vocabulary.php"] {
    background-color: #e6ebec;
    background-image: var(--grain-tex),
        radial-gradient(96% 96% at 92% 84%, rgba(88, 117, 220, 0.82), transparent 60%),
        radial-gradient(92% 90% at 6% 10%,  rgba(238, 244, 243, 0.95), transparent 62%),
        radial-gradient(88% 88% at 16% 92%, rgba(255, 179, 138, 0.82), transparent 58%),
        radial-gradient(80% 82% at 58% 40%, rgba(228, 213, 232, 0.72), transparent 58%);
}
/* Щоденник — пісок + персик + перивінкл + лаванда */
html[data-page="notes.php"] {
    background-color: #ece8ec;
    background-image: var(--grain-tex),
        radial-gradient(94% 94% at 8% 12%,  rgba(234, 215, 184, 0.95), transparent 62%),
        radial-gradient(90% 90% at 90% 88%, rgba(255, 179, 138, 0.84), transparent 58%),
        radial-gradient(84% 86% at 94% 14%, rgba(88, 117, 220, 0.70), transparent 58%),
        radial-gradient(82% 84% at 18% 92%, rgba(228, 213, 232, 0.74), transparent 58%);
}
/* Тренування — індиго + персик + перивінкл + мʼята */
html[data-page="train.php"] {
    background-color: #e7e9ee;
    background-image: var(--grain-tex),
        radial-gradient(96% 96% at 88% 14%, rgba(81, 88, 166, 0.82), transparent 60%),
        radial-gradient(90% 90% at 92% 90%, rgba(255, 179, 138, 0.82), transparent 58%),
        radial-gradient(86% 88% at 8% 90%,  rgba(88, 117, 220, 0.74), transparent 58%),
        radial-gradient(88% 88% at 6% 10%,  rgba(238, 244, 243, 0.90), transparent 62%);
}
/* Вхід/реєстрація — перивінкл + персик + мʼята + лаванда */
html[data-page="login.php"], html[data-page="register.php"] {
    background-color: #e6eaec;
    background-image: var(--grain-tex),
        radial-gradient(96% 96% at 88% 82%, rgba(88, 117, 220, 0.80), transparent 60%),
        radial-gradient(88% 88% at 12% 92%, rgba(255, 179, 138, 0.80), transparent 58%),
        radial-gradient(92% 90% at 8% 8%,   rgba(238, 244, 243, 0.92), transparent 62%),
        radial-gradient(80% 82% at 58% 40%, rgba(228, 213, 232, 0.70), transparent 58%);
}

/* Карта й уроки — власні фони (пергаментна мапа + база-вода + день/ніч);
   градієнт-дефолт вище їх НЕ чіпає. Клас map-page — на index.php, lesson-page —
   на lesson.php. --daytint скидаємо тут, бо тільки цей фон його використовує. */
html.map-page, html.lesson-page {
    --daytint: linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0));
    background:
        var(--daytint),
        radial-gradient(1300px 560px at 50% -240px, rgba(255,255,255,0.30), transparent 70%),
        url('/assets/world-map-bg.svg'),
        var(--map-water);   /* база = вода головної карти: сторінка-«океан», плашки-«палуби» кремові зверху */
    background-position: center, center top, center 46%, center;
    background-size: cover, auto, min(1400px, 92vw) auto, auto;
    background-repeat: no-repeat, no-repeat, no-repeat, repeat;
    background-attachment: fixed;
    background-blend-mode: normal;   /* скидаємо soft-light дефолту (blend не в shorthand) */
}
html.map-page[data-daypart="dawn"],  html.lesson-page[data-daypart="dawn"]  { --daytint: linear-gradient(180deg, rgba(255, 196, 110, 0.13), rgba(255, 150, 100, 0.07)); }
html.map-page[data-daypart="dusk"],  html.lesson-page[data-daypart="dusk"]  { --daytint: linear-gradient(180deg, rgba(235, 130, 70, 0.16), rgba(120, 80, 130, 0.12)); }
html.map-page[data-daypart="night"], html.lesson-page[data-daypart="night"] { --daytint: linear-gradient(180deg, rgba(18, 38, 72, 0.40), rgba(18, 38, 72, 0.26)); }

/* На телефоні сторінка з картою одягається в наш фірмовий градієнт (індиго+перивінкл+
   пісок+лаванда, як решта сайту), а не в пергаментний океан: на ≤768px карта — лише
   мала вингетка (40vh) з власним фоном, тож океан на всю сторінку тут зайвий. */
@media (max-width: 768px) {
    html.map-page {
        background-color: #e8e5ef;
        background-image: var(--grain-tex),
            radial-gradient(96% 96% at 90% 14%, rgba(81, 88, 166, 0.82), transparent 62%),
            radial-gradient(88% 88% at 8% 90%,  rgba(88, 117, 220, 0.72), transparent 60%),
            radial-gradient(90% 88% at 10% 8%,  rgba(234, 215, 184, 0.85), transparent 62%),
            radial-gradient(85% 84% at 94% 90%, rgba(228, 213, 232, 0.78), transparent 60%);
        background-position: 0 0;
        background-size: 170px 170px, cover, cover, cover, cover;
        background-repeat: repeat, no-repeat, no-repeat, no-repeat, no-repeat;
        background-blend-mode: overlay, normal, normal, normal, normal;
    }
}

body {
    font-family: var(--font-body);
    font-size: var(--fs-body);
    line-height: var(--lh-body);
    color: var(--color-text);
    background: transparent;   /* фон тепер на <html> */
    max-width: var(--w-wide);
    margin: 0 auto;
    padding: var(--space-4) var(--space-4) var(--space-8);
    -webkit-font-smoothing: antialiased;
    animation: page-fade var(--dur) var(--ease) both;
}
/* Лише прозорість (без transform), бо transform на body ламає position:fixed фону. */
@keyframes page-fade { from { opacity: 0; } to { opacity: 1; } }

/* Фон країни на сторінці уроку — повноекранний фіксований шар (на весь viewport,
   не розтягується й без бічних полос, бо не привʼязаний до колонки body). */
body.country-bg::before {
    content: ''; position: fixed; inset: 0; z-index: -1; pointer-events: none;
    background: var(--country-bg) center / cover no-repeat;
}
@media (max-width: 768px) {
    /* Мобільна версія фону (fixed-шар працює нормально для псевдоелемента). */
    body.country-bg::before { background-image: var(--country-bg-mobile); }
}


h1, h2, h3 { font-family: var(--font-head); color: var(--color-text); line-height: var(--lh-tight); font-weight: 700; letter-spacing: -0.015em; }  /* Fixel Bold — менш важкі заголовки (Юля 18.07, було 900) */
h1 { font-size: var(--fs-h1); margin: 0 0 var(--space-4); letter-spacing: -0.015em; }
h2 { font-size: var(--fs-h2); margin: var(--space-6) 0 var(--space-4); }
h3 { font-size: var(--fs-h3); margin: 0 0 var(--space-3); }

a { color: var(--color-primary); text-decoration: none; }
/* Ховер-тінт лише для «голих» текстових лінків: класові компоненти (кнопки-посилання
   .lc-cta, .btn-ticket тощо) керують кольором самі — глобальний a:hover перебивав їхній
   текст у колір фону (текст «зникав» на ховері; існувало ще з teal). */
a:not([class]):hover { color: var(--color-primary-600); }

code, .mono { font-family: var(--font-mono); }

/* ============================================================
   ШАПКА
   ============================================================ */
.site-header {
    display: flex; align-items: center; justify-content: space-between;
    gap: var(--space-4); flex-wrap: wrap;
    background: rgba(255,255,255,0.78);
    backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
    border: 1px solid var(--color-border);
    box-shadow: var(--shadow-sm);
    border-radius: var(--radius-lg);
    padding: var(--space-3) var(--space-5);
    margin-bottom: var(--space-6);
    position: sticky; top: var(--space-3); z-index: var(--z-nav);
}
.brand {
    font-family: var(--font-head);
    font-weight: 700; font-size: 1.25rem;
    color: var(--color-text); text-decoration: none; white-space: nowrap;
    display: inline-flex; align-items: center; gap: 6px;
}
.brand .globe { display: inline-flex; align-items: center; color: var(--color-primary); transition: transform .5s var(--ease); }
.brand:hover { color: var(--color-text); }
.brand:hover .globe { transform: rotate(28deg) scale(1.12); }

.nav-links { display: flex; align-items: center; gap: 2px; flex-wrap: wrap; font-size: var(--fs-small); }
.nav-links a {
    color: var(--color-text); text-decoration: none;
    padding: 9px 14px; border-radius: var(--radius-pill);
    transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
    font-weight: 500; display: inline-flex; align-items: center; gap: 7px;
}
.nav-links a:hover { background: var(--color-primary-050); color: var(--color-primary-600); }
.nav-links a.active { background: var(--color-primary-050); color: var(--color-primary-700); font-weight: 600; }
.nav-links a.cta { background: var(--color-primary); color: var(--color-on-accent); }
.nav-links a.cta:hover { background: var(--color-primary-600); color: var(--color-on-accent); }
.nav-links [data-lucide] { width: var(--icon-md); height: var(--icon-md); }

/* --- Профіль: кнопка + дропдаун --- */
.profile-wrap { position: relative; }
.profile-btn {
    display: inline-flex; align-items: center; gap: 8px;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-pill); padding: 6px 12px 6px 6px;
    font: inherit; font-size: var(--fs-small); color: var(--color-text);
    cursor: pointer; box-shadow: var(--shadow-sm);
    transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.profile-btn:hover { border-color: var(--color-primary); box-shadow: var(--shadow-card); }
.profile-avatar {
    position: relative; width: 32px; height: 32px; flex: none; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--color-primary-050); color: var(--color-primary-700);
}
.profile-avatar [data-lucide] { width: var(--icon-md); height: var(--icon-md); }
/* Кільце «Світ відкрито: N/M» навколо аватарки (--p ставить hud.js) */
.profile-avatar .nav-ring {
    position: absolute; inset: -4px; border-radius: 50%; pointer-events: none;
    background: conic-gradient(var(--color-secondary) var(--p, 0%), rgba(54, 50, 66, 0.10) 0);
    -webkit-mask: radial-gradient(circle, transparent calc(50% - 3px), black calc(50% - 2px));
            mask: radial-gradient(circle, transparent calc(50% - 3px), black calc(50% - 2px));
}
.profile-name { white-space: nowrap; }
.profile-caret { width: 16px; height: 16px; color: var(--color-text-muted); transition: transform var(--dur-fast) var(--ease); }
.profile-btn[aria-expanded="true"] .profile-caret { transform: rotate(180deg); }
.profile-menu {
    position: absolute; top: calc(100% + 8px); right: 0; min-width: 250px;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-md); box-shadow: var(--shadow-lg);
    padding: 6px; z-index: var(--z-float);
}
.pm-item {
    display: flex; align-items: center; gap: 10px; width: 100%; box-sizing: border-box;
    padding: 10px 12px; border-radius: var(--radius-sm);
    color: var(--color-text); font-size: var(--fs-small); font-weight: 500;
    text-decoration: none;
    transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.pm-item:hover { background: var(--color-primary-050); color: var(--color-primary-700); }
.pm-item.active { background: var(--color-primary-050); color: var(--color-primary-700); font-weight: 600; }
.pm-item [data-lucide] { width: var(--icon-md); height: var(--icon-md); flex: none; color: var(--color-primary); }
.pm-sep { height: 1px; background: var(--color-border); margin: 6px 8px; }

/* --- Мобільний таб-бар (показується на ≤768px) --- */
.tab-bar { display: none; }

/* Панель адмінки */
.auth-bar {
    display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
    background: rgba(255,255,255,0.78);
    border: 1px solid var(--color-border); box-shadow: var(--shadow-sm);
    border-radius: var(--radius-lg); padding: var(--space-3) var(--space-5);
    margin-bottom: var(--space-5); font-size: var(--fs-small); color: var(--color-text-muted);
}
.auth-bar a { color: var(--color-primary); font-weight: 600; }

/* ============================================================
   ФУТЕР
   ============================================================ */
.site-footer {
    margin-top: var(--space-8);
    padding: var(--space-5);
    /* Крем #f8f1e9 + графіт-текст (запит Юлі 17.07) замість темного ink-якоря; без обводки. */
    background: var(--color-bg);
    border: 0;
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-card);
    display: flex; align-items: center; justify-content: space-between;
    flex-wrap: wrap; gap: var(--space-3);
    color: var(--color-text); font-size: var(--fs-small);
}
.site-footer a { color: var(--color-text); text-decoration: none; }
.site-footer a:hover { text-decoration: underline; text-underline-offset: 3px; }
.site-footer .footer-links { display: flex; gap: var(--space-4); flex-wrap: wrap; }

/* ============================================================
   СВЯТКОВИЙ ФІНІШ УРОКУ + КОНФЕТІ
   ============================================================ */
.confetti-canvas { position: fixed; inset: 0; pointer-events: none; z-index: var(--z-confetti); }
.finish-overlay {
    position: fixed; inset: 0; z-index: var(--z-ceremony);
    display: flex; align-items: center; justify-content: center; padding: var(--space-4);
    background: color-mix(in srgb, var(--color-text) 45%, transparent); backdrop-filter: blur(4px); /* був teal-дарк rgba(20,40,52) → графіт-дім (епоха А.12) */
    opacity: 0; transition: opacity var(--dur) var(--ease);
}
.finish-overlay.show { opacity: 1; }
.finish-card {
    background: var(--color-surface); border-radius: var(--radius-lg);
    padding: var(--space-7) var(--space-6); max-width: 420px; width: 100%;
    text-align: center; box-shadow: var(--shadow-lg);
    transform: translateY(16px) scale(0.96); transition: transform var(--dur) var(--ease);
}
.finish-overlay.show .finish-card { transform: none; }
.finish-stamp {
    width: 96px; height: 96px; margin: 0 auto var(--space-4);
    border: 3px dashed var(--color-secondary); border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    font-size: 2.8rem; background: var(--color-secondary-100); transform: rotate(-6deg);
    animation: stamp-pop .5s var(--ease) both;
}
@keyframes stamp-pop { 0% { transform: rotate(-6deg) scale(0); } 60% { transform: rotate(-6deg) scale(1.15); } 100% { transform: rotate(-6deg) scale(1); } }

/* Штамп паспорта: «прилітає» згори і бахкає об картку */
.passport-stamp {
    --ink: var(--color-secondary-700);
    width: 148px; height: 148px; margin: 0 auto var(--space-4);
    border: 3.5px solid var(--ink); border-radius: 50%;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 2px; position: relative;
    color: var(--ink); transform: rotate(-8deg);
    box-shadow: inset 0 0 0 3px transparent, inset 0 0 0 5px transparent;
    animation: stamp-slam .55s cubic-bezier(0.22, 1.6, 0.36, 1) both;
    animation-delay: var(--dur);
    /* нерівномірність чорнила справжнього штампа */
    -webkit-mask-image: radial-gradient(circle at 32% 28%, black 56%, rgba(0,0,0,0.82) 78%, rgba(0,0,0,0.62) 100%);
            mask-image: radial-gradient(circle at 32% 28%, black 56%, rgba(0,0,0,0.82) 78%, rgba(0,0,0,0.62) 100%);
}
.passport-stamp::before {
    content: ""; position: absolute; inset: 7px;
    border: 1.5px dashed var(--ink); border-radius: 50%;
}
.ps-arrival {
    font-size: 9px; font-weight: 700; letter-spacing: 0.14em;
    text-transform: uppercase; opacity: 0.85; max-width: 110px; text-align: center;
}
.ps-flag { font-size: 1.9rem; line-height: 1.15; }
.ps-country {
    font-family: var(--font-mono); font-weight: 700; font-size: 13px;
    letter-spacing: 0.1em; max-width: 116px; text-align: center; line-height: 1.15;
}
.ps-date { font-family: var(--font-mono); font-size: 11px; font-weight: 600; opacity: 0.9; }
@keyframes stamp-slam {
    0%   { opacity: 0; transform: rotate(-24deg) scale(2.6); filter: blur(2px); }
    65%  { opacity: 1; transform: rotate(-8deg) scale(0.94); filter: blur(0); }
    80%  { transform: rotate(-8deg) scale(1.04); }
    100% { opacity: 1; transform: rotate(-8deg) scale(1); }
}
/* Струс картки від удару штампа */
.finish-card.stamp-shake { animation: card-shake .4s linear both; }
@keyframes card-shake {
    0% { transform: translate(0, 0) rotate(0); }
    20% { transform: translate(-3px, 2px) rotate(-0.5deg); }
    40% { transform: translate(3px, -2px) rotate(0.4deg); }
    60% { transform: translate(-2px, 1px) rotate(-0.3deg); }
    80% { transform: translate(1px, -1px) rotate(0.2deg); }
    100% { transform: translate(0, 0) rotate(0); }
}
@media (prefers-reduced-motion: reduce) {
    .passport-stamp { animation: none; }
    .finish-card.stamp-shake { animation: none; }
}
.finish-card h2 { margin: 0 0 var(--space-2); font-size: 1.6rem; }
.finish-sub { margin: 0 0 var(--space-5); color: var(--color-text-muted); }
.finish-stats { display: flex; justify-content: center; gap: var(--space-6); margin-bottom: var(--space-6); }
.finish-stat { display: flex; flex-direction: column; gap: 2px; }
.fs-num { font-family: var(--font-head); font-weight: 700; font-size: 1.8rem; color: var(--color-primary); }
.fs-lbl { font-size: var(--fs-xs); color: var(--color-text-muted); }
.finish-actions { display: flex; gap: var(--space-3); justify-content: center; flex-wrap: wrap; }

/* ============================================================
   ОНБОРДИНГ (привітальний міні-тур)
   ============================================================ */
.onb-overlay {
    position: fixed; inset: 0; z-index: var(--z-ceremony);
    display: flex; align-items: center; justify-content: center; padding: var(--space-4);
    background: color-mix(in srgb, var(--color-text) 45%, transparent); backdrop-filter: blur(4px); /* був teal-дарк rgba(20,40,52) → графіт-дім (епоха А.12) */
    opacity: 0; transition: opacity var(--dur) var(--ease);
}
.onb-overlay.show { opacity: 1; }
.onb-card {
    position: relative; background: var(--color-surface); border-radius: var(--radius-lg);
    padding: var(--space-7) var(--space-6) var(--space-6); max-width: 420px; width: 100%;
    text-align: center; box-shadow: var(--shadow-lg);
    transform: translateY(16px) scale(0.96); transition: transform var(--dur) var(--ease);
}
.onb-overlay.show .onb-card { transform: none; }
.onb-skip {
    position: absolute; top: var(--space-3); right: var(--space-4);
    border: 0; background: none; cursor: pointer;
    color: var(--color-text-muted); font: inherit; font-size: var(--fs-small);
}
.onb-skip:hover { color: var(--color-text); }
.onb-emoji {
    width: 88px; height: 88px; margin: 0 auto var(--space-4);
    display: flex; align-items: center; justify-content: center;
    color: var(--color-primary);
    background: var(--color-primary-050); border-radius: 50%;
    animation: stamp-pop .45s var(--ease) both;
}
.onb-emoji:empty { display: none; }
.onb-card h2 { margin: 0 0 var(--space-2); font-size: 1.45rem; }
.onb-text { margin: 0 auto var(--space-5); color: var(--color-text-muted); max-width: 320px; }
.onb-dots { display: flex; justify-content: center; gap: 7px; margin-bottom: var(--space-5); }
.onb-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--color-border-strong); transition: var(--transition); }
.onb-dot.active { background: var(--color-primary); width: 22px; border-radius: var(--radius-pill); }
.onb-next { width: 100%; justify-content: center; font-size: 1rem; }

/* ============================================================
   ПРОГРЕС ПРОКРУТКИ — ПУНКТИРНИЙ МАРШРУТ З ЛІТАЧКОМ
   ============================================================ */
.scroll-progress {
    position: fixed; top: 0; left: 0; height: 4px; width: 0;
    /* пунктир маршруту замість суцільної лінії */
    background: repeating-linear-gradient(90deg,
        var(--color-primary) 0 10px, transparent 10px 17px);
    z-index: 200;
    transition: width 80ms linear;
}
.scroll-progress::after {
    content: ""; position: absolute; right: -8px; top: -8px;
    width: 20px; height: 16px;
    background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="-14 -11 28 22"><path d="M11.5 0C11.5 -1.1 10.4 -1.7 8.8 -1.7L3.4 -1.7L-2.7 -9.3Q-3.1 -9.9 -3.9 -9.9L-4.6 -9.9Q-5.1 -9.9 -4.9 -9.3L-3.5 -1.7L-7.9 -1.5L-10.4 -4.4Q-10.8 -4.9 -11.5 -4.9L-11.9 -4.9Q-12.4 -4.9 -12.2 -4.4L-11.1 -1.2Q-12.5 -0.7 -12.5 0Q-12.5 0.7 -11.1 1.2L-12.2 4.4Q-12.4 4.9 -11.9 4.9L-11.5 4.9Q-10.8 4.9 -10.4 4.4L-7.9 1.5L-3.5 1.7L-4.9 9.3Q-5.1 9.9 -4.6 9.9L-3.9 9.9Q-3.1 9.9 -2.7 9.3L3.4 1.7L8.8 1.7C10.4 1.7 11.5 1.1 11.5 0Z" fill="%2311788c" stroke="white" stroke-width="1"/></svg>') center / contain no-repeat;
    filter: drop-shadow(0 1px 2px rgba(0,0,0,0.25));
}

/* ============================================================
   ПОСАДКОВИЙ ТАЛОН УРОКУ
   ============================================================ */
.boarding-pass {
    display: flex; margin: 0 0 var(--space-6);
    border-radius: var(--radius-md); overflow: hidden;
    box-shadow: var(--shadow-card);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    position: relative;
}
.bp-main { flex: 1 1 auto; padding: var(--space-4) var(--space-5); min-width: 0; }
.bp-head {
    display: flex; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap;
    border-bottom: 1.5px dashed var(--color-border-strong);
    padding-bottom: var(--space-2); margin-bottom: var(--space-3);
}
.bp-brand { font-weight: 700; color: var(--color-primary); font-size: var(--fs-small); letter-spacing: 0.04em; }
.bp-label { font-size: var(--fs-xs); color: var(--color-text-muted); letter-spacing: 0.12em; font-weight: 600; }
.bp-route { display: flex; align-items: center; gap: var(--space-4); margin-bottom: var(--space-3); }
.bp-point { display: flex; flex-direction: column; min-width: 70px; }
.bp-point-to { text-align: right; align-items: flex-end; }
.bp-code { font-family: var(--font-mono); font-weight: 700; font-size: 1.3rem; white-space: nowrap; }
.bp-city { font-size: var(--fs-xs); color: var(--color-text-muted); }
.bp-plane-path {
    flex: 1; position: relative; height: 2px;
    background: repeating-linear-gradient(90deg,
        var(--color-border-strong) 0 8px, transparent 8px 14px);
}
.bp-plane {
    position: absolute; top: 50%; left: 0;
    transform: translate(-50%, -54%); color: var(--color-secondary); font-size: 1.15rem;
    animation: bp-fly 6s ease-in-out infinite;
}
@keyframes bp-fly {
    0%   { left: 6%; }
    50%  { left: 94%; }
    100% { left: 6%; }
}
@media (prefers-reduced-motion: reduce) { .bp-plane { animation: none; left: 50%; } }
.bp-fields { display: flex; gap: var(--space-5); flex-wrap: wrap; }
.bp-field { display: flex; flex-direction: column; gap: 1px; }
.bp-k { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--color-text-muted); font-weight: 600; }
.bp-v { font-family: var(--font-mono); font-weight: 600; font-size: var(--fs-small); }
/* Корінець квитка з перфорацією */
.bp-stub {
    flex: 0 0 116px; display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 4px; padding: var(--space-3);
    background: var(--color-secondary-100);
    border-left: 2px dashed var(--color-border-strong);
    position: relative;
}
/* «Вирізи» перфорації зверху і знизу */
.bp-stub::before, .bp-stub::after {
    content: ""; position: absolute; left: -9px; width: 16px; height: 16px;
    background: var(--color-bg); border-radius: 50%;
    border: 1px solid var(--color-border);
}
.bp-stub::before { top: -9px; }
.bp-stub::after { bottom: -9px; }
.bp-stub-label { font-size: var(--fs-xs); letter-spacing: 0.18em; color: var(--color-text-muted); font-weight: 700; }
.bp-stub-big { font-family: var(--font-mono); font-size: 1.7rem; font-weight: 700; color: var(--color-secondary-700); }
.bp-barcode {
    width: 72px; height: 26px; margin-top: 4px;
    background: repeating-linear-gradient(90deg,
        var(--color-text) 0 2px, transparent 2px 4px,
        var(--color-text) 4px 5px, transparent 5px 9px,
        var(--color-text) 9px 12px, transparent 12px 14px);
    opacity: 0.75;
}
@media (max-width: 560px) {
    .bp-stub { display: none; }
    .bp-fields { gap: var(--space-3) var(--space-4); }
}

/* ============================================================
   БЛОК-ІНТРО (заголовок над картою)
   ============================================================ */
.page-intro { margin-bottom: var(--space-5); max-width: var(--w-article); }
.page-intro h1 { margin-bottom: var(--space-2); }
.page-intro p { margin: 0; color: var(--color-text-muted); font-size: 1.1rem; }

/* Skip-link: перший Tab на сторінці — стрибок повз шапку до контенту (WCAG 2.4.1) */
.skip-link {
    position: fixed; top: 10px; left: 10px; z-index: var(--z-confetti);
    transform: translateY(-200%);
    background: var(--color-primary); color: var(--color-on-accent);
    font-weight: 700; font-size: var(--fs-small); text-decoration: none;
    padding: 10px 18px; border-radius: var(--radius-btn);
    box-shadow: 0 3px 0 var(--color-primary-700);
}
/* :focus, не :focus-visible — прихований лінк досяжний ЛИШЕ з клавіатури, хибних спрацювань немає */
.skip-link:focus { transform: none; }

/* ============================================================
   КНОПКИ
   ============================================================ */
/* Кнопки-«печатки» (редизайн 2026-07): тактильний прес — тверда нижня грань,
   ховер «заряджає» (+1px), active втискає з чорнильною inset-тінню.
   Primary несе пунктирне кільце — край штампа. Канон: primary/secondary/ghost,
   btn-danger — для руйнівних дій адмінки (та сама фізика). */
.btn-primary, .btn-secondary, .btn-danger, .btn-ghost {
    position: relative;
    font: inherit; font-weight: 700; font-size: var(--fs-small);
    padding: 12px 22px; border-radius: var(--radius-btn);
    cursor: pointer; border: 1.5px solid transparent; text-decoration: none;
    display: inline-flex; align-items: center; gap: 8px;
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, background var(--dur-fast) ease,
                color var(--dur-fast) ease, border-color var(--dur-fast) ease, filter var(--dur-fast) ease;
}
.btn-primary::after {
    content: ''; position: absolute; inset: 4px; border-radius: 8px;
    border: 1px dashed currentColor; opacity: 0.4; pointer-events: none;
}
.btn-primary { background: var(--color-primary); color: var(--color-on-accent); box-shadow: 0 3px 0 var(--color-primary-700); }
.btn-primary:hover {
    background: var(--color-primary-600); color: var(--color-on-accent);
    transform: translateY(-1px); box-shadow: 0 4px 0 var(--color-primary-700); filter: saturate(1.08);
}
.btn-primary:active { transform: translateY(2px); box-shadow: 0 1px 0 var(--color-primary-700), inset 0 -2px 5px rgba(0, 30, 40, 0.25); }
.btn-primary:disabled {
    background: var(--color-border-strong); color: var(--color-on-accent);
    box-shadow: 0 3px 0 rgba(0, 0, 0, 0.12); cursor: default; transform: none; filter: none;
}
.btn-primary:disabled::after { opacity: 0; }
.btn-secondary {
    background: var(--color-surface); color: var(--color-primary-700);
    border-color: var(--color-border-strong); box-shadow: 0 3px 0 var(--color-border-strong);
}
.btn-secondary:hover { border-color: var(--color-primary); transform: translateY(-1px); box-shadow: 0 4px 0 var(--color-border-strong); }
.btn-secondary:active { transform: translateY(2px); box-shadow: 0 1px 0 var(--color-border-strong); }
.btn-danger {
    background: var(--color-surface); color: var(--color-error);
    border-color: var(--color-error-100); box-shadow: 0 3px 0 var(--color-error-100);
}
.btn-danger:hover { background: var(--color-error-100); transform: translateY(-1px); box-shadow: 0 4px 0 var(--color-error-100); }
.btn-danger:active { transform: translateY(2px); box-shadow: 0 1px 0 var(--color-error-100); }
.btn-ghost { background: transparent; color: var(--color-text-muted); }
.btn-ghost:hover { background: var(--color-primary-050); color: var(--color-primary-700); }
.btn-ghost:active { transform: translateY(1px); }

/* Компактний розмір печатки: дрібні дії в картках (листівка, +у словник, дії слова).
   Та сама фізика, менша грань (2px). Комбінується: class="btn-secondary btn-sm". */
.btn-sm { font-weight: 600; padding: 6px 13px; border-radius: var(--radius-sm); }
.btn-sm.btn-secondary { box-shadow: 0 2px 0 var(--color-border-strong); }
.btn-sm.btn-secondary:hover { box-shadow: 0 3px 0 var(--color-border-strong); }
.btn-sm.btn-secondary:active { transform: translateY(1px); box-shadow: 0 1px 0 var(--color-border-strong); }
.btn-sm.btn-primary { box-shadow: 0 2px 0 var(--color-primary-700); }
.btn-sm.btn-primary::after { inset: 3px; border-radius: 7px; }
.btn-sm.btn-primary:hover { box-shadow: 0 3px 0 var(--color-primary-700); }
.btn-sm.btn-primary:active { transform: translateY(1px); box-shadow: 0 1px 0 var(--color-primary-700), inset 0 -2px 4px rgba(0, 30, 40, 0.2); }

/* Кругла іконка-кнопка (стрілки паспорта тощо). Виняток поза системою: .speak-btn —
   inline-озвучка в тексті, їй рамка зашкодила б. */
.btn-icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; border-radius: 50%;
    border: 1px solid var(--color-border); background: var(--color-surface);
    color: var(--color-primary); cursor: pointer;
    transition: background var(--dur) var(--ease), color var(--dur) var(--ease), transform var(--dur-fast) var(--spring);
}
.btn-icon:hover:not(:disabled) { background: var(--color-primary-050); }
.btn-icon:active:not(:disabled) { transform: scale(0.92); }
.btn-icon:disabled { opacity: 0.35; cursor: default; color: var(--color-text-muted); }

/* Chip-switch — сегменти-перемикачі (акцент US/UK, рівень граматики, алфавіт словника).
   Акцент US/UK = СВІТЛИЙ контейнер + ПЕРИВІНКЛ-заливка обраного (вибір Юлі: «фіолетовим і світлим»).
   Рівень граматики = ГРАФІТОВИЙ трек + БІЛА пігулка (як перемикач Карта/A–Z).
   Алфавіт (az-nav) — світлий липкий бар, активна літера = графіт+білий (темний трек тут =
   смуга через сторінку, проти правила «темних фонів»). */
.as-btn, .gr-level-switch button, .az-nav button {
    font: inherit; font-size: var(--fs-small); cursor: pointer;
    background: transparent; border: 1.5px solid transparent;
    border-radius: var(--radius-pill); padding: 5px 12px;
    color: var(--color-text-muted);
    transition: transform .3s var(--spring), background var(--dur-fast) var(--ease),
                border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease),
                box-shadow var(--dur-fast) var(--ease);
}
/* Світлий контекст (акцент + алфавіт): ховер — легкий підйом (акцент → перивінкл, літера → графіт) */
.as-btn:hover:not(:disabled), .az-nav button:hover:not(:disabled) {
    transform: translateY(-1px); border-color: var(--color-border-strong);
}
.as-btn:hover:not(:disabled) { color: var(--color-primary); }
.az-nav button:hover:not(:disabled) { color: var(--color-text); }
/* Обраний: акцент = перивінкл-заливка; алфавіт = графіт-заливка (обидва — білий текст) */
.as-btn.active { background: var(--color-primary); border-color: var(--color-primary); color: var(--color-on-accent); }
.az-nav button.active { background: var(--color-text); border-color: var(--color-text); color: var(--color-on-accent); }
.as-btn:disabled, .gr-level-switch button:disabled, .az-nav button:disabled { opacity: 0.3; cursor: default; }

/* Графітовий трек — рівень граматики: кнопки світлі на графіті, обрана = біла пігулка з перивінкл-текстом */
.gr-level-switch button { color: rgba(255,255,255,0.78); }
/* :not(.active) — інакше ховер робить текст білим і на активній (біла пігулка) → літери зникають */
.gr-level-switch button:hover:not(:disabled):not(.active) { color: var(--color-on-accent); }
.gr-level-switch button.active {
    background: var(--color-surface); border-color: var(--color-surface);
    color: var(--color-primary-600); box-shadow: var(--shadow-sm);
}

/* Кнопка-«квиток» — точково для моментів подорожі (старт уроку, «Продовжити подорож»).
   Mono CAPS + перфораційні виїмки з боків. Виїмки — прозорі кола у ФОНІ (двома
   половинками radial-gradient), НЕ mask: mask зрізав би focus-обводку. .btn-on-ink —
   паперова версія квитка для фото-hero (той самий клас, що й раніше — без правок розмітки). */
.btn-ticket, .btn-on-ink {
    position: relative;
    font-family: var(--font-mono); font-weight: 700; font-size: 12.5px;
    letter-spacing: 0.1em; text-transform: uppercase;
    padding: 14px 24px; border: 0; border-radius: var(--radius-sm);
    cursor: pointer; text-decoration: none;
    display: inline-flex; align-items: center; gap: 10px;
    transition: transform var(--dur-fast) var(--spring), filter var(--dur-fast) ease;
}
.btn-ticket {
    color: var(--color-on-accent);
    background:
        radial-gradient(circle 6px at 0 50%, transparent 6.2px, var(--color-primary) 6.8px) left / 50.5% 100% no-repeat,
        radial-gradient(circle 6px at 100% 50%, transparent 6.2px, var(--color-primary) 6.8px) right / 50.5% 100% no-repeat;
}
.btn-on-ink {
    color: var(--color-primary-700);
    background:
        radial-gradient(circle 6px at 0 50%, transparent 6.2px, var(--color-on-ink) 6.8px) left / 50.5% 100% no-repeat,
        radial-gradient(circle 6px at 100% 50%, transparent 6.2px, var(--color-on-ink) 6.8px) right / 50.5% 100% no-repeat;
}
.btn-ticket:hover, .btn-on-ink:hover { transform: translateY(-1px); filter: brightness(1.06); color: inherit; }
.btn-ticket:active, .btn-on-ink:active { transform: translateY(1px); filter: brightness(0.97); }
.btn-ticket:hover { color: var(--color-on-accent); }
.btn-on-ink:hover { color: var(--color-primary-700); }
/* лінія відриву перед останнім словом (додається розміткою: <span class="bt-tear"></span>) */
.bt-tear { align-self: stretch; margin: -14px 0; width: 0; border-left: 1.5px dashed rgba(255, 255, 255, 0.5); }
.btn-on-ink .bt-tear { border-left-color: var(--color-border-strong); }

/* ============================================================
   КАРТКИ · КАНОН (17.07, «єдина основа card»). Основа всіх карток:
   surface + 1px border + токен-радіус. Три тіри за роллю:
   1) «предмет» (одиночна клікабельна: lesson/level/gr-cat/mission/visa)
      — спокій shadow-card, ховер −2/−3px + shadow-lg;
   2) «щільний список» (vocab/gr-topic/note/progress) — спокій shadow-sm
      (сітка з десятків card-тіней була б важка);
   3) «церемонія» (finish/onb/postcard-hero) — shadow-lg, без ховер-лифту.
   Радіус: md компактні, lg великі/секційні. Винятки-предмети (сувеніри
   «листівка», pp-postcard «печатна» тінь, ph-card 6px, stub перфорація)
   — реєстр у docs/design-rules.md. Нову картку збирай із цих тірів.
   ============================================================ */
/* --- Картки уроків (єдині скрізь: каталог, панель карти, дешборд) --- */
.catalog-grid {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr));
    gap: var(--space-5);
}
.lesson-card {
    display: block; background: var(--color-surface);
    border: 1px solid var(--color-border); border-radius: var(--radius-md);
    padding: 0; text-decoration: none; color: inherit; overflow: hidden;
    box-shadow: var(--shadow-card); transition: var(--transition);
}
.lesson-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.lesson-card:hover .cover-mark { transform: scale(1.08); }

.card-cover {
    width: 100%; aspect-ratio: 16 / 9; position: relative; overflow: hidden;
    display: flex; align-items: center; justify-content: center;
    background: var(--color-primary-100);
}
.card-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.card-cover-gen::after {
    content: ""; position: absolute; inset: 0;
    background:
        radial-gradient(circle at 22% 24%, rgba(255,255,255,0.28), transparent 42%),
        radial-gradient(circle at 80% 78%, rgba(255,255,255,0.18), transparent 46%);
}
.cover-mark {
    position: relative; z-index: 1; width: 56px; height: 56px;
    fill: none; stroke: rgba(255,255,255,0.85); stroke-width: 1.6;
    stroke-linecap: round;
    filter: drop-shadow(0 6px 14px rgba(0,0,0,0.18));
    transition: transform var(--dur) var(--ease);
}

.card-body { padding: var(--space-4); }
.card-country {
    display: inline-flex; align-items: center; gap: 5px;
    font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.06em;
    color: var(--color-text-muted); font-weight: 600; margin: 0 0 var(--space-2);
}
.card-body h3 { margin: 0 0 var(--space-3); font-size: 1.2rem; }
.card-meta { display: flex; gap: var(--space-2); margin: 0; flex-wrap: wrap; align-items: center; }
.card-level {
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 600;
    background: var(--color-secondary-100); color: var(--color-secondary-700);
    padding: 3px 9px; border-radius: var(--radius-sm);
}
.card-topic {
    background: var(--color-primary-050); color: var(--color-primary-600);
    padding: 3px 12px; border-radius: var(--radius-pill);
    font-weight: 600; font-size: var(--fs-xs);
}
.card-grammar { font-size: var(--fs-small); color: var(--color-text-muted); font-style: italic; margin: var(--space-2) 0 0; }
.card-progress {
    display: inline-block; margin-top: var(--space-3);
    font-size: var(--fs-xs); font-weight: 600;
    color: var(--color-primary-600); background: var(--color-primary-050);
    padding: 3px 12px; border-radius: var(--radius-pill);
}
.card-progress.completed { color: var(--color-success-700); background: var(--color-success-100); }

.catalog-empty, .vocab-empty {
    color: var(--color-text-muted); background: var(--color-surface);
    border: 1.5px dashed var(--color-border-strong); border-radius: var(--radius-md);
    padding: var(--space-6); text-align: center; font-weight: 500;
}

/* Порожні стани з ілюстрацією. Матеріал — той самий, що плитки налаштувань
   і бенто Містка (скло 82% surface + blur 9px, radius-lg, м'яка тінь):
   пунктирну обводку прибрано 22.07 (вердикт Юлі — «як усі інші плашки»). */
.empty-state {
    text-align: center; padding: var(--space-7) var(--space-5);
    background: color-mix(in srgb, var(--color-surface) 82%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    border: 0; border-radius: var(--radius-lg);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    max-width: 460px; margin: 0 auto;
}
.empty-illu {
    width: 112px; height: 112px; margin: 0 auto var(--space-4);
    display: flex; align-items: center; justify-content: center;
    color: var(--color-primary); background: var(--color-primary-050);
    border-radius: 50%;
}
.empty-state h3 { margin: 0 0 var(--space-2); }
.empty-state p { margin: 0 auto var(--space-4); color: var(--color-text-muted); max-width: 340px; }
.empty-cta { margin-top: var(--space-2); }

/* ============================================================
   УРОК — читання (контент звужено до --w-article)
   ============================================================ */
/* Єдиний центрований контейнер уроку — щоб усе (hero, прогрес, блоки,
   бейджі) було однакової ширини й вирівняне по центру. */
.lesson-wrap { max-width: var(--w-article); margin: 0 auto; }
/* Усе всередині — на повну ширину контейнера, ідеально вирівняне */
.lesson-wrap .lesson-hero,
.lesson-wrap .lesson-header,
.lesson-wrap .lesson-progress-sticky,
.lesson-wrap .lesson-complete,
.lesson-wrap .block,
.lesson-wrap .ex-result-bar {
    max-width: none; margin-left: 0; margin-right: 0;
}

.back-link { margin: 0 0 var(--space-4); font-size: var(--fs-small); }
.back-link a {
    /* Скляна плашка-пігулка, щоб посилання читалось на фоні країни */
    display: inline-flex; align-items: center; gap: 4px;
    color: var(--color-primary); font-weight: 600;
    background: rgba(255, 255, 255, 0.82);
    backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-pill);
    padding: 6px 14px;
    box-shadow: var(--shadow-sm);
    transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.back-link a:hover { color: var(--color-primary-600); background: rgba(255, 255, 255, 0.95); }

.lesson-hero {
    max-width: var(--w-article); margin: 0 auto var(--space-6);
    border-radius: var(--radius-lg); overflow: hidden; position: relative;
    background: var(--color-primary); color: var(--color-on-accent); box-shadow: var(--shadow-card);
    min-height: 220px; display: flex; align-items: flex-end;
}
.lesson-hero .lesson-hero-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 22%; }
.lesson-hero .lesson-hero-overlay {
    position: absolute; inset: 0;
    background: linear-gradient(180deg, rgba(15,40,52,0.05) 0%, rgba(15,40,52,0.78) 100%);
}
/* width:100% + min-width:0 — щоб довгий чип граматики не розпирав контент
   ширше за герой (у героя overflow:hidden — інакше зрізає заголовок) */
.lesson-hero .lesson-hero-content {
    position: relative; padding: var(--space-6);
    width: 100%; min-width: 0; box-sizing: border-box;
}
/* Адмін: перетягування фону обкладинки */
.hero-admin { position: absolute; top: 12px; right: 12px; z-index: 5; display: flex; gap: 8px; align-items: center; }
/* На мобілці контролі перекривають заголовок уроку — фон виставляється з десктопа */
@media (max-width: 768px) { .hero-admin { display: none; } }
.hero-admin-edit { display: flex; gap: 8px; align-items: center; }
/* [hidden] мусить перемагати display:flex — інакше панель висить завжди */
.hero-admin-edit[hidden] { display: none; }
/* Згорнутий стан — лише кругла іконка-олівець, щоб було видно обкладинку */
.hero-admin-toggle {
    width: 34px; height: 34px; padding: 0; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    background: rgba(255,255,255,0.78); opacity: 0.85;
    transition: opacity var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
.hero-admin-toggle:hover { opacity: 1; background: var(--color-surface); }
.hero-admin-toggle[hidden] { display: none; }
.hero-admin-btn {
    font: inherit; font-size: 12px; font-weight: 700; cursor: pointer;
    background: rgba(255,255,255,0.92); color: var(--gloss-ink); border: 1px solid color-mix(in srgb, var(--gloss-ink) 30%, transparent);
    border-radius: 9px; padding: 6px 11px; backdrop-filter: blur(4px);
    box-shadow: 0 1px 6px rgba(0,0,0,0.25);
}
.hero-admin-btn:hover { background: var(--color-surface); }
.hero-admin-save { background: var(--color-success-600); color: var(--color-on-accent); border-color: var(--color-success-600); }
.hero-admin-save:hover { background: var(--color-success-600-hover); }
.hero-admin-hint {
    font-size: 11px; font-weight: 600; color: var(--color-on-accent); background: rgba(0,0,0,0.45);
    padding: 5px 10px; border-radius: 8px; white-space: nowrap;
}
.lesson-hero.hero-editing { cursor: move; }
/* У режимі редагування панель кнопок не має лягати на заголовок */
.lesson-hero.hero-editing .lesson-hero-content { padding-top: calc(var(--space-6) + 40px); }
.lesson-hero.hero-editing .lesson-hero-bg { cursor: move; }
.lesson-hero.hero-editing .lesson-hero-content,
.lesson-hero.hero-editing .lesson-hero-overlay { pointer-events: none; }
.lesson-hero.hero-editing .hero-admin { pointer-events: auto; }
.lesson-hero.hero-editing::after {
    content: ''; position: absolute; inset: 0; z-index: 4; pointer-events: none;
    box-shadow: inset 0 0 0 3px rgba(255,255,255,0.7); border-radius: inherit;
}
.lesson-hero h1 {
    color: var(--color-on-accent); margin: 0 0 var(--space-2); text-shadow: 0 2px 16px rgba(0,0,0,0.3);
    font-size: clamp(1.7rem, 1.3rem + 1.6vw, 2.4rem);
    overflow-wrap: anywhere;
}
/* Для адміна вгорі справа висить іконка редагування — заголовок її обходить */
.lesson-hero:has(.hero-admin) h1 { padding-right: 52px; }
.lesson-hero .meta { display: flex; gap: var(--space-2); flex-wrap: wrap; align-items: center; max-width: 100%; }
/* Тільки прямі діти — інакше службові span-и всередині чипів (стрілка, прапор)
   отримують власну плашку */
.lesson-hero .meta > span {
    display: inline-flex; align-items: center; gap: 5px; line-height: 1;
    height: 30px; box-sizing: border-box; white-space: nowrap;
    background: rgba(255,255,255,0.18); backdrop-filter: blur(4px);
    color: var(--color-on-accent); padding: 0 12px; border-radius: var(--radius-pill);
    font-size: var(--fs-small);
}
.lesson-hero .meta .meta-flag { height: auto; background: none; padding: 0; font-size: 1em; }
.lesson-hero .meta .meta-level { font-family: var(--font-mono); }
/* Граматика — клікабельний чип, веде в довідник на потрібну тему.
   Опис граматики буває дуже довгий (до ~450 символів на C1), тому чип
   переноситься, але не довший за 2 рядки: далі «…», повний текст — у title. */
.lesson-hero .meta .meta-grammar {
    display: inline-flex; align-items: flex-start; gap: 6px; line-height: 1.3;
    height: auto; min-height: 30px; box-sizing: border-box; max-width: 100%; white-space: normal;
    background: rgba(255,255,255,0.18); backdrop-filter: blur(4px);
    color: var(--color-on-accent); padding: 6px 12px; border-radius: 15px;
    font-size: var(--fs-small); text-decoration: none;
    transition: background var(--dur-fast) var(--ease);
}
.lesson-hero .meta .meta-grammar > svg { flex: none; margin-top: 2px; }
.lesson-hero .meta .meta-grammar .mg-text {
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden; overflow-wrap: anywhere; min-width: 0;
}
.lesson-hero .meta a.meta-grammar:hover { background: rgba(255,255,255,0.34); }
.lesson-hero .meta .meta-grammar .mg-arrow { opacity: 0.8; font-weight: 700; flex: none; align-self: center; }
/* «Живий» чип у hero — непрозорий, щоб читався на будь-якому фото */
.lesson-hero .live-chip {
    margin: var(--space-3) 0 0; background: var(--color-surface);
    border-color: transparent; box-shadow: var(--shadow-card);
}

/* Запасна шапка уроку (без обкладинки) */
.lesson-header { max-width: var(--w-article); margin: 0 auto var(--space-5); }
.lesson-header .meta { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-2); }
.lesson-header .meta span {
    background: var(--color-surface); border: 1px solid var(--color-border);
    padding: 4px 14px; border-radius: var(--radius-pill); font-size: var(--fs-small);
    color: var(--color-text-muted); box-shadow: var(--shadow-sm);
}

.video-wrap { position: relative; padding-top: 56.25%; border-radius: var(--radius-md); overflow: hidden; }
.video-wrap iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
figure { margin: 0; }
figure img { max-width: 100%; display: block; border-radius: var(--radius-md); }
figcaption { font-size: var(--fs-small); color: var(--color-text-muted); margin-top: var(--space-2); }
.block-image figcaption { font-family: var(--font-head); font-style: italic; }

/* ============================================================
   СЛОВНИК (картки-листівки)
   ============================================================ */
.vocab-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--space-3); }
.vocab-card {
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-md); padding: var(--space-4);
    box-shadow: var(--shadow-sm); border-left: 4px solid var(--color-primary);
}
.vocab-main { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-3); }
.word { font-family: var(--font-head); font-weight: 700; font-size: 1.15rem; }
.translation { color: var(--color-text-muted); }
.example { margin: var(--space-2) 0 var(--space-3); color: var(--color-text-muted); font-family: var(--font-example); font-weight: 500; font-style: italic; }
/* компактна печатка (рецепт btn-sm secondary); .added — успіх-стан */
.add-word-btn {
    background: var(--color-surface); border: 1.5px solid var(--color-border-strong); border-radius: var(--radius-sm);
    padding: 6px 13px; font: inherit; font-weight: 600; font-size: var(--fs-small);
    color: var(--color-primary-700); cursor: pointer;
    box-shadow: 0 2px 0 var(--color-border-strong);
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, border-color var(--dur-fast) ease, background var(--dur-fast) ease, color var(--dur-fast) ease;
}
.add-word-btn:hover:not(:disabled) { border-color: var(--color-primary); transform: translateY(-1px); box-shadow: 0 3px 0 var(--color-border-strong); }
.add-word-btn:active:not(:disabled) { transform: translateY(1px); box-shadow: 0 1px 0 var(--color-border-strong); }
.add-word-btn.added {
    color: var(--color-success-700); border-color: var(--color-success); background: var(--color-success-100);
    cursor: default; box-shadow: 0 2px 0 var(--color-success); transform: none;
}
.add-word-hint { display: inline-block; margin-left: var(--space-3); font-size: var(--fs-small); color: var(--ex-no-ink); } /* error як текст = 3.81 на білому — правило токенів */

/* === Словник уроку — варіант A (плаский список) === */
.block-vocabulary .vocab-list { gap: 0; }
.block-vocabulary .vocab-card {
    background: none; border: 0; border-radius: 0; box-shadow: none;
    border-bottom: 1.5px solid var(--vocab-divider); padding: var(--space-4) 0;
}
.block-vocabulary .vocab-card:first-child { padding-top: var(--space-2); }
.block-vocabulary .vocab-card:last-child { border-bottom: 0; padding-bottom: 0; }
/* UI 2.2: слово + переклад — одна група ліворуч (gap ≤16px), «+ у словник» — праворуч.
   Довгий переклад переноситься на наступний рядок УСЕРЕДИНІ пари (flex:1 + wrap),
   а кнопка лишається праворуч у першому рядку (main — nowrap). */
.block-vocabulary .vocab-main { align-items: baseline; gap: var(--space-3); flex-wrap: nowrap; }
.block-vocabulary .vocab-pair { display: inline-flex; align-items: baseline; gap: 10px; flex-wrap: wrap; min-width: 0; flex: 1 1 auto; }
.block-vocabulary .vocab-actions { display: inline-flex; align-items: center; gap: var(--space-2); flex-shrink: 0; }
.block-vocabulary .word { font-family: var(--font-head); font-weight: 700; font-size: 1.25rem; color: var(--ex-title); display: inline-flex; align-items: center; gap: 8px; }
.block-vocabulary .translation { color: var(--color-muted-cool); font-size: 15px; text-align: left; }
.block-vocabulary .example { margin: 6px 0 10px; font-family: var(--font-example); font-weight: 500; font-style: italic; font-size: 15px; color: var(--vocab-example); }
.block-vocabulary .speak-btn { color: var(--color-muted-cool); opacity: 0.9; margin: 0; padding: 0; display: inline-flex; }
.block-vocabulary .speak-btn:hover { opacity: 1; color: var(--ex-ink); }
/* Чип «+ у словник» / «✓ у словнику» */
.block-vocabulary .add-word-btn {
    border: 0; background: color-mix(in srgb, var(--ex-ink) 8%, transparent); color: var(--ex-ink);
    border-radius: var(--radius-pill); padding: 5px 14px; font-weight: 600; font-size: 13px;
}
.block-vocabulary .add-word-btn:hover:not(:disabled) { background: color-mix(in srgb, var(--ex-ink) 15%, transparent); transform: none; }
.block-vocabulary .add-word-btn.added {
    background: var(--ex-ok-bg); border: 1.3px solid var(--ex-ok-border); color: var(--color-success-600); padding: 4px 13px;
}
/* «Додати всі слова в повторення» (SRS) — суцільна кнопка під списком */
.vocab-addall { margin-top: var(--space-4); display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-3); }
/* компактна печатка (рецепт btn-sm primary) */
.add-all-words-btn {
    background: var(--color-primary); border: 0; border-radius: var(--radius-sm);
    padding: 9px 18px; font: inherit; font-weight: 700; font-size: var(--fs-small);
    color: var(--color-on-accent); cursor: pointer;
    box-shadow: 0 2px 0 var(--color-primary-700);
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, background var(--dur-fast) ease;
}
.add-all-words-btn:hover:not(:disabled) { background: var(--color-primary-600); transform: translateY(-1px); box-shadow: 0 3px 0 var(--color-primary-700); }
.add-all-words-btn:active:not(:disabled) { transform: translateY(1px); box-shadow: 0 1px 0 var(--color-primary-700), inset 0 -2px 4px rgba(0, 30, 40, 0.2); }
.add-all-words-btn:disabled { opacity: 0.7; cursor: default; box-shadow: 0 2px 0 rgba(0, 0, 0, 0.12); }
.add-all-hint { font-size: var(--fs-small); color: var(--color-muted-cool); }

/* === collage: сітка картинок (галерея) === */
.collage-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(min(150px, 100%), 1fr));
    gap: var(--space-3); margin: var(--space-2) 0;
}
.collage-item { margin: 0; }
.collage-item img {
    width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block;
    border-radius: var(--radius-md); box-shadow: var(--shadow-sm);
    transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: zoom-in;
}
.collage-item:hover img { transform: translateY(-2px); box-shadow: var(--shadow-hover); }
/* Підпис ПІД картинкою (не перекриває) */
.collage-item figcaption {
    margin-top: 6px; font-size: 13px; font-weight: 600; color: var(--color-caption);
    text-align: center; line-height: 1.3;
}
.collage-caption { font-size: 14px; color: var(--color-muted-cool); font-style: italic; margin: 8px 0 0; }
/* Лайтбокс (клік на картинку колажу) */
.lightbox {
    position: fixed; inset: 0; z-index: var(--z-modal); display: flex; align-items: center; justify-content: center;
    background: rgba(20, 24, 30, 0.85); padding: 4vmin; cursor: zoom-out;
}
.lightbox[hidden] { display: none; }
.lightbox img { max-width: 96vw; max-height: 92vh; border-radius: var(--radius-md); box-shadow: var(--shadow-modal); }

/* Кнопка озвучення слова 🔊 */
.speak-btn {
    border: 0; background: transparent; cursor: pointer;
    font-size: 0.85em; line-height: 1; padding: 2px 4px; margin-left: 4px;
    border-radius: var(--radius-sm); opacity: 0.65;
    transition: transform var(--dur-fast) var(--ease), opacity var(--dur-fast) var(--ease);
    vertical-align: middle;
}
.speak-btn:hover { opacity: 1; transform: scale(1.18); }
.speak-btn.speaking { animation: speak-pulse .6s var(--ease); }
@keyframes speak-pulse { 0%,100% { transform: scale(1); } 50% { transform: scale(1.3); } }

/* Велика кнопка озвучення на флешкартці */
.speak-fab {
    position: absolute; top: 12px; right: 12px; z-index: 3;
    width: 40px; height: 40px; border-radius: 50%;
    border: 1.5px solid var(--color-border); background: var(--color-surface);
    font-size: 1.1rem; cursor: pointer; box-shadow: var(--shadow-sm);
    transition: var(--transition);
}
.speak-fab:hover { border-color: var(--color-primary); transform: scale(1.08); }

/* Шапка словника з кнопкою тренування */
.vocab-top { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); flex-wrap: wrap; }
/* = btn-primary (печатка, teal; рішення Юлі 2026-07-16 — помаранч прибрано), більший шрифт CTA */
.btn-train {
    display: inline-flex; align-items: center; gap: 8px;
    font-weight: 700; font-size: 1rem; text-decoration: none;
    padding: 12px 22px; border-radius: var(--radius-btn); color: var(--color-on-accent);
    background: var(--color-primary);
    box-shadow: 0 3px 0 var(--color-primary-700);
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, background var(--dur-fast) ease;
}
.btn-train:hover { background: var(--color-primary-600); transform: translateY(-1px); box-shadow: 0 4px 0 var(--color-primary-700); color: var(--color-on-accent); }
.btn-train:active { transform: translateY(2px); box-shadow: 0 1px 0 var(--color-primary-700), inset 0 -2px 5px rgba(0, 30, 40, 0.25); }
.btn-train [data-lucide] { width: var(--icon-lg); height: var(--icon-lg); }

.activity-score {
    font-family: var(--font-mono); font-size: var(--fs-xs);
    color: var(--color-text-muted); background: var(--color-bg-warm);
    padding: 2px 10px; border-radius: var(--radius-pill);
}

/* Сторінка "Мій словник" */
.my-vocab .vocab-card { border-left-width: 4px; }
.my-vocab .vocab-card[data-status="learning"] { border-left-color: var(--color-secondary); }
.my-vocab .vocab-card[data-status="learned"]  { border-left-color: var(--color-success); }
.vocab-meta { font-size: var(--fs-xs); color: var(--color-text-muted); margin: var(--space-2) 0; }
.vocab-meta code { background: var(--color-primary-050); padding: 1px 6px; border-radius: var(--radius-sm); }
.vocab-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
/* компактна печатка (рецепт btn-sm secondary) */
.vocab-actions button {
    font: inherit; font-weight: 600; font-size: var(--fs-small); padding: 6px 13px;
    border: 1.5px solid var(--color-border-strong); background: var(--color-surface);
    color: var(--color-primary-700); border-radius: var(--radius-sm); cursor: pointer;
    box-shadow: 0 2px 0 var(--color-border-strong);
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, border-color var(--dur-fast) ease;
}
.vocab-actions button:hover:not(:disabled) { border-color: var(--color-primary); transform: translateY(-1px); box-shadow: 0 3px 0 var(--color-border-strong); }
.vocab-actions button:active:not(:disabled) { transform: translateY(1px); box-shadow: 0 1px 0 var(--color-border-strong); }
.status-badge { margin-left: auto; font-size: var(--fs-xs); padding: 3px 12px; border-radius: var(--radius-pill); font-weight: 600; }
.status-learning { background: var(--color-secondary-100); color: var(--color-secondary-700); }
.status-learned  { background: var(--color-success-100); color: var(--color-success-700); }

/* ============================================================
   ФІЛЬТРИ (каталог/карта)
   ============================================================ */
.filter-group { display: flex; flex-direction: column; gap: var(--space-2); min-width: 180px; }
.filter-label {
    font-size: var(--fs-xs); color: var(--color-text-muted);
    text-transform: uppercase; letter-spacing: 0.05em; font-weight: 700;
}
.filter-options { display: flex; flex-wrap: wrap; gap: 8px 14px; font-size: var(--fs-small); }
.filter-options label { display: inline-flex; align-items: center; gap: 5px; cursor: pointer; }
input[type="search"], #filter-search {
    font: inherit; padding: 10px 14px; border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-pill); background: var(--color-surface); min-width: 240px;
    transition: border-color var(--dur-fast) var(--ease);
}
#filter-search:focus { outline: none; border-color: var(--color-primary); }
.filter-reset {
    align-self: flex-end; font: inherit; font-weight: 600; font-size: var(--fs-small);
    padding: 9px 16px; background: var(--color-surface); border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-pill); cursor: pointer; color: var(--color-text-muted);
    transition: var(--transition);
}
.filter-reset:hover { border-color: var(--color-primary); color: var(--color-primary); }

/* ============================================================
   ФОРМИ (вхід/реєстрація)
   ============================================================ */
.auth-wrap { max-width: 400px; margin: var(--space-7) auto 0; }
.auth-form {
    display: flex; flex-direction: column; gap: var(--space-4);
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); padding: var(--space-6); box-shadow: var(--shadow-card);
}
.auth-form label { display: flex; flex-direction: column; gap: 5px; font-size: var(--fs-small); color: var(--color-text-muted); font-weight: 600; }
.auth-form input {
    font: inherit; padding: 12px 14px; border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-sm); background: var(--color-surface); transition: border-color var(--dur-fast) var(--ease);
}
.auth-form input:focus { outline: none; border-color: var(--color-primary); box-shadow: var(--shadow-glow); }
.auth-form button {
    font: inherit; font-weight: 700; padding: 13px 18px; width: 100%;
    background: var(--color-primary); color: var(--color-on-accent); border: 0;
    border-radius: var(--radius-btn); cursor: pointer; font-size: 1rem;
    box-shadow: 0 3px 0 var(--color-primary-700);
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, background var(--dur-fast) ease;
}
.auth-form button:hover { background: var(--color-primary-600); transform: translateY(-1px); box-shadow: 0 4px 0 var(--color-primary-700); }
.auth-form button:active { transform: translateY(2px); box-shadow: 0 1px 0 var(--color-primary-700), inset 0 -2px 5px rgba(0, 30, 40, 0.25); }
.form-errors {
    background: var(--color-error-100); border: 1px solid var(--color-error);
    border-radius: var(--radius-sm); padding: 12px 16px; margin-bottom: var(--space-4); max-width: 400px;
}
.form-errors p { margin: 4px 0; color: var(--ex-no-ink); font-weight: 600; } /* error-текст на error-100 давав 3.29 — нижче AA */
.auth-switch { margin-top: var(--space-4); font-size: var(--fs-small); color: var(--color-text-muted); text-align: center; }
.auth-switch a { color: var(--color-primary); font-weight: 600; }

/* ============================================================
   АДМІНКА (та сама система, без travel-декору)
   ============================================================ */
/* Toast-плашка адмінки: fixed поверх сторінки, не зсуває контент; згасає (admin-flash.js). */
.admin-flash {
    position: fixed; top: 16px; left: 50%; transform: translateX(-50%);
    z-index: var(--z-modal); max-width: min(520px, 92vw);
    padding: 13px 20px; border-radius: var(--radius-md); font-weight: 600;
    box-shadow: var(--shadow-modal);
    animation: admin-flash-in .28s cubic-bezier(.2, .8, .2, 1);
}
.admin-flash.hide { opacity: 0; transform: translate(-50%, -12px); transition: opacity .4s, transform .4s; }
@keyframes admin-flash-in {
    from { opacity: 0; transform: translate(-50%, -14px); }
    to   { opacity: 1; transform: translate(-50%, 0); }
}
@media (prefers-reduced-motion: reduce) { .admin-flash { animation: none; } }
.admin-flash.ok { background: var(--color-success-100); border: 1px solid var(--color-success); color: var(--color-success-700); }
.admin-table {
    width: 100%; border-collapse: collapse; background: var(--color-surface);
    border: 1px solid var(--color-border); border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-sm);
}
.admin-table th, .admin-table td { text-align: left; padding: 12px 14px; border-bottom: 1px solid var(--color-border); font-size: var(--fs-small); }
.admin-table th { background: var(--color-bg-warm); color: var(--color-text); font-family: var(--font-head); font-weight: 700; }
/* Адмінські таблиці широкі за природою (урок · рівень · країна · дії). На телефоні
   не ламаємо їх у картки — даємо горизонтальний скрол усередині самої таблиці,
   щоб сторінка не їхала вбік. */
@media (max-width: 900px) {
    .admin-table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; white-space: nowrap; }
}
.admin-actions { display: flex; gap: 16px; align-items: center; flex-wrap: nowrap; white-space: nowrap; }
.admin-actions a { color: var(--color-primary); text-decoration: none; font-weight: 600; }
.inline-form { display: inline-flex; margin: 0; }
/* Компактна іконка-дія (напр. видалити урок) — у ряд із текстовими лінками */
.icon-btn-danger {
    display: inline-flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; padding: 0; border-radius: var(--radius-sm);
    background: transparent; border: none; color: var(--color-error);
    cursor: pointer; transition: background var(--dur-fast) ease, color var(--dur-fast) ease;
}
.icon-btn-danger:hover { background: var(--color-error-100); }
.admin-form {
    display: flex; flex-direction: column; gap: var(--space-4); background: var(--color-surface);
    border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-5); max-width: 780px; box-shadow: var(--shadow-sm);
}
.admin-form label { display: flex; flex-direction: column; gap: 5px; font-size: var(--fs-small); color: var(--color-text-muted); font-weight: 600; }
.admin-form input[type=text], .admin-form select, .admin-form textarea {
    font: inherit; padding: 10px 13px; border: 1.5px solid var(--color-border-strong); border-radius: var(--radius-sm);
    background: var(--color-surface); transition: border-color var(--dur-fast) var(--ease);
}
.admin-form input:focus, .admin-form select:focus, .admin-form textarea:focus { outline: none; border-color: var(--color-primary); }
.admin-form input[readonly] { background: var(--color-bg-warm); color: var(--color-text-muted); }
.admin-form textarea { font-family: var(--font-mono); font-size: var(--fs-small); resize: vertical; }
.form-row { display: flex; gap: var(--space-4); flex-wrap: wrap; }
.form-row label { flex: 1; min-width: 140px; }
/* overflow-wrap — у підказці часто лежить довгий шлях у <code>, який на телефоні
   інакше розпирає форму за екран */
.form-hint { font-size: var(--fs-small); color: var(--color-text-muted); max-width: 780px; overflow-wrap: anywhere; }
.form-hint code, .admin-table code { background: var(--color-primary-050); padding: 1px 6px; border-radius: var(--radius-sm); }
.status-good { color: var(--color-success-700); font-weight: 700; }
.status-bad  { color: var(--color-error); font-weight: 700; }
.bg-missing  { color: var(--color-text-muted); }
.cover-preview-row { display: flex; align-items: center; gap: var(--space-3); margin-top: -6px; }
.cover-preview { max-width: 160px; max-height: 100px; border-radius: var(--radius-sm); border: 1px solid var(--color-border); object-fit: cover; }
.field-flash { animation: field-flash-anim 1.5s var(--ease); }
@keyframes field-flash-anim { 0% { background: var(--color-secondary-100); border-color: var(--color-secondary); } 100% { background: var(--color-surface); border-color: var(--color-border-strong); } }
.upload-box {
    display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap;
    background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-4); max-width: 780px; box-shadow: var(--shadow-sm);
}
.uploaded-list { list-style: none; padding: 0; margin: var(--space-3) 0 0; max-width: 780px; }
.uploaded-list li { display: flex; gap: var(--space-3); align-items: center; padding: 6px 0; flex-wrap: wrap; }

/* ============================================================
   ДЕШБОРД — напрям 01 «Атмосфера борту» (макет-борд v2, рішення Юлі)
   ============================================================ */
.streak {
    display: inline-flex; align-items: center; gap: 8px;
    font-family: var(--font-mono); font-weight: 600;
    background: var(--color-secondary-100); color: var(--color-secondary-700);
    padding: 6px 16px; border-radius: var(--radius-pill);
}
.streak-off {
    background: var(--color-bg-warm); color: var(--color-text-muted);
    font-family: var(--font-body);
}

/* Розділи «Атмосфери борту»: position під псевдошари-вуалі. Друге зерно
   body::after (Хвиля каркасу) ПРИБРАНО 17.07 (вердикт Юлі) — дублювалось
   із плівковим зерном html-градієнта на відкритому фоні. */
body.page-dash, body.page-grammar, body.page-courses, body.page-vocab,
body.page-notes, body.page-train { position: relative; }
/* Вуаль над картою-вотермаркою на Містку: приглушує контрастні материки.
   Тон = вода карти (була cream — перетонювала мінт-фон назад у крем, і зміна
   фону 17.07 на Містку була невидима; контент тепер у плашці, вуаль лише тонує). */
body.page-dash::before {
    content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
    background: color-mix(in srgb, var(--map-water) 55%, transparent);
}

/* Спільна плашка внутрішніх сторінок («все в плашці», рішення Юлі 17.07):
   той самий рецепт, що .trn-board тренажера — контент сторінки живе всередині.
   Карта (index) НЕ загортається — рішення Юлі, фулскрін лишається. */
.page-board {
    background: var(--color-bg); border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-lg);
    padding: clamp(20px, 3vw, 34px);
    margin-bottom: var(--space-5);
}
/* Секції всередині несуть власні margin-bottom — в останньої він зайвий (роздуває низ плашки) */
.page-board > :last-child { margin-bottom: 0; }
@media (max-width: 640px) { .page-board { padding: 16px 14px; } }

/* Hero-«листівка» (вибір Юлі 17.07, hero-lab варіант B): текст графітом просто на
   фоні-воді, фото — ПРЕДМЕТ-листівка (біла рамка, скотч, штамп), не тло під текстом.
   Текст ніколи на фото — без scrim-градієнтів. Замінює сплит .dash-hero. */
.postcard-hero {
    display: grid; grid-template-columns: 1fr 380px; gap: 30px; align-items: center;
    margin-bottom: var(--space-5);
    /* hero сидить на власній плашці (запит Юлі 17.07 — текст не голий на фоні-воді);
       рецепт той самий, що .page-board/.trn-board */
    background: var(--color-bg); border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-lg);
    padding: clamp(20px, 3vw, 30px) clamp(22px, 3vw, 34px);
}
.postcard-hero.ph-nophoto { grid-template-columns: 1fr; }
.ph-eyebrow { font-family: var(--font-mono); font-size: var(--fs-xs); letter-spacing: .14em;
    text-transform: uppercase; color: var(--color-primary-700); }
.ph-text h1 { margin: 20px 0 8px; }
.ph-sub { margin: 0; color: var(--color-text-muted); max-width: 56ch; }
.ph-sub b { color: var(--color-text); }
.ph-cta { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 14px; }
.ph-link { font-size: var(--fs-small); color: var(--color-primary-700); text-decoration: underline; text-underline-offset: 3px; }
.ph-link:hover { color: var(--color-primary); }
.ph-card { position: relative; margin: 0; background: var(--color-surface); padding: 12px 12px 34px;
    box-shadow: var(--shadow-card); transform: rotate(2.2deg); border-radius: 6px; }
.ph-card img { display: block; width: 100%; height: 190px; object-fit: cover; border-radius: 3px; }
.ph-tape { position: absolute; top: -12px; left: 50%; transform: translateX(-50%) rotate(-3deg);
    width: 110px; height: 26px; background: color-mix(in srgb, var(--color-bg-warm) 72%, transparent);
    box-shadow: 0 1px 3px rgba(60,50,30,.18); }
.ph-cap { position: absolute; left: 14px; bottom: 9px; font-family: var(--font-mono); font-size: 10px;
    letter-spacing: .1em; text-transform: uppercase; color: var(--color-text-muted); }
.ph-stamp { position: absolute; right: 10px; bottom: 4px; width: 58px; height: 58px;
    border: 2px dashed var(--color-primary); border-radius: 50%; display: flex; align-items: center;
    justify-content: center; transform: rotate(-12deg); font-family: var(--font-mono); font-size: 8.5px;
    font-weight: 700; letter-spacing: .06em; color: var(--color-primary); text-transform: uppercase;
    text-align: center; opacity: .75; padding: 4px; }
@media (max-width: 760px) {
    .postcard-hero { grid-template-columns: 1fr; gap: 18px; }
    .postcard-hero .ph-card { max-width: 340px; justify-self: center; }
}

/* Прихований для ока, доступний для скрінрідера заголовок */
.sr-only {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* Бортовий журнал (плитка бенто-сітки) */
.log-lab, .route-lab { display: block; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-text-muted); margin-bottom: var(--space-4); }
.log-rank { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.log-rank-ico { color: var(--color-primary); display: inline-flex; }
.log-line { margin: 12px 0 0; font-size: var(--fs-small); color: var(--color-text-muted); }
.log-line b { color: var(--color-text); }
.log-line a { color: var(--color-primary); font-weight: 600; text-decoration: none; }
.log-line a:hover { text-decoration: underline; }

/* Route-тиждень: піни днів пн–нд, зʼєднані пунктирним маршрутом */
.log-week { display: flex; justify-content: space-between; max-width: 340px; margin-top: 16px; }
.lw-day {
    position: relative; flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px;
    font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.06em; color: var(--color-text-muted);
}
.lw-day i {
    width: 12px; height: 12px; border-radius: 50%; z-index: 1;
    border: 1.6px solid var(--color-border-strong); background: var(--color-surface);
}
.lw-day + .lw-day::before {
    content: ""; position: absolute; top: 5px; right: calc(50% + 9px);
    width: calc(100% - 18px); border-top: 2px dotted var(--color-border-strong);
}
.lw-on i { background: var(--color-primary); border-color: var(--color-primary); }
.lw-on { color: var(--color-text); }
.lw-today { font-weight: 700; color: var(--color-text); }
.lw-today i { box-shadow: 0 0 0 2px var(--color-surface), 0 0 0 3.5px var(--color-primary); }
.lw-future { opacity: 0.55; }

/* Бортовий журнал широкою смугою (макет Юлі 19.07): лейбл на всю ширину,
   під ним 2 колонки — ліворуч ранг+прогрес+милі, праворуч стрік+тиждень. */
.dash-log .log-cols {
    display: grid; grid-template-columns: 1fr 1fr;
    gap: var(--space-4) var(--space-8); align-items: start;
}
.dash-log .log-col > :first-child { margin-top: 0; }
.dash-log .log-col-side { border-left: 1px dashed var(--color-border); padding-left: var(--space-6); }
.dash-log .log-col-side .log-week { max-width: none; }
@media (max-width: 700px) {
    .dash-log .log-cols { grid-template-columns: 1fr; }
    .dash-log .log-col-side {
        border-left: 0; padding-left: 0;
        border-top: 1px dashed var(--color-border);
        padding-top: var(--space-3); margin-top: var(--space-2);
    }
}

/* «Маршрут першого дня» — нульовий стан новачка (кроки = плитки бенто-сітки) */
.fstep { background: var(--souvenir-paper-1); border: 1px dashed var(--color-border-strong); border-radius: 14px; padding: 18px 20px 16px; }
.fs-n { font-family: var(--font-mono); font-size: 12px; color: var(--color-primary); letter-spacing: 0.1em; text-transform: uppercase; }
.fs-t { font-family: var(--font-head); font-weight: 700; font-size: 1.2rem; margin: 6px 0 4px; }
.fs-d { font-size: var(--fs-small); color: var(--color-text-muted); }

/* Трек контрастніший за фон сторінки (bg-warm на кремі зливався у «брудну смугу»),
   заливка має мінімум — 0% читається як «початок шляху», а не зламаний бар. */
.dash-bar { height: 8px; background: color-mix(in srgb, var(--color-ink) 12%, transparent); border-radius: var(--radius-pill); overflow: hidden; margin-bottom: var(--space-4); }
.dash-bar-fill { height: 100%; min-width: 8px; background: var(--color-primary); border-radius: var(--radius-pill); transition: width .6s var(--ease); }
.dash-mini { list-style: none; padding: 0; margin: 0 0 var(--space-4); font-size: var(--fs-small); color: var(--color-text-muted); display: flex; flex-direction: column; gap: 4px; }
.dash-link { color: var(--color-primary); text-decoration: none; font-weight: 600; }
.dash-link:hover { text-decoration: underline; }

/* Журнал рейсів — рядки бортового журналу на волосяних лініях, без білої коробки */
.dash-activity { background: transparent; border: 0; box-shadow: none; padding: 0; }
.activity-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; }
.activity-item { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; padding: 12px 2px; border-bottom: 1px solid var(--color-border); }
.activity-item:last-child { border-bottom: none; }
.activity-item a { color: var(--color-text); font-weight: 600; text-decoration: none; flex: 1; min-width: 140px; }
.activity-item a:hover { color: var(--color-primary); }
.activity-status { font-size: var(--fs-xs); padding: 3px 12px; border-radius: var(--radius-pill); background: var(--color-secondary-100); color: var(--color-secondary-700); font-weight: 600; }
.activity-status.done { background: var(--color-success-100); color: var(--color-success-700); }
.activity-date { font-size: var(--fs-xs); color: var(--color-text-muted); font-family: var(--font-mono); }

/* ============================================================
   ТРЕНУВАННЯ СЛОВНИКА — плашка на всю ширину: кроки + тренажер
   (docs/word-trainer-spec.md). Namespace .trn-*.
   ============================================================ */
/* Вуаль над картою-вотермаркою, щоб плашка чітко читалась. */
body.page-train::before {
    content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
    background: color-mix(in srgb, var(--color-bg) 62%, transparent);
}
.trn-board {
    background: var(--color-bg); border: 1px solid var(--color-border-strong); border-radius: var(--radius-lg);
    overflow: hidden; box-shadow: var(--shadow-lg);
    min-height: clamp(500px, 66vh, 700px); display: flex; flex-direction: column;
}

/* шапка плашки (у кроках) */
.trn-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap;
    padding: clamp(18px,2.4vw,26px) clamp(20px,3vw,34px); border-bottom: 1px solid var(--color-border); }
.trn-head-l { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.trn-title { font-family: var(--font-head); font-weight: 700; font-size: clamp(1.2rem,1rem + .8vw,1.6rem); margin: 0; }
.trn-cc-chip { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-small);
    background: var(--color-primary-050); border: 1px solid var(--color-primary-100); color: var(--color-primary-700);
    padding: 4px 11px; border-radius: var(--radius-pill); }
.trn-cc-chip .flag-ic { height: .95em; width: 1.27em; border-radius: 2px; }
.trn-cc-chip a { color: var(--color-primary-700); text-decoration: underline; margin-left: 2px; }

/* перемикач акценту в шапці */
.trn-accent { display: inline-flex; align-items: center; gap: 8px; }
.trn-acc-lbl { font-size: var(--fs-xs); letter-spacing: .08em; text-transform: uppercase; color: var(--color-text-muted); font-weight: 700; }
.trn-acc-btn { display: inline-flex; align-items: center; gap: 6px; font: inherit; font-size: var(--fs-small); font-weight: 700;
    padding: 6px 12px; border: 1.5px solid var(--color-border-strong); border-radius: var(--radius-pill);
    background: var(--color-surface); color: var(--color-text); cursor: pointer; }
.trn-acc-btn .flag-ic { height: .95em; width: 1.27em; border-radius: 2px; }
.trn-acc-btn.on { background: var(--color-primary); border-color: var(--color-primary); color: var(--color-on-accent); }

/* степер */
.trn-stepper { display: flex; align-items: center; gap: 10px; padding: clamp(14px,2vw,20px) clamp(20px,3vw,34px) 0; }
.trn-step { display: flex; align-items: center; gap: 8px; font-size: var(--fs-small); font-weight: 700; color: var(--color-text-muted); }
.trn-step-n { width: 26px; height: 26px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center;
    background: var(--color-border); color: var(--color-text-muted); font-size: .82rem; }
.trn-step.on { color: var(--color-text); } .trn-step.on .trn-step-n { background: var(--color-primary); color: var(--color-on-accent); }
.trn-step.done .trn-step-n { background: var(--color-success); color: var(--color-on-accent); }
.trn-step-line { flex: 1; height: 2px; background: var(--color-border); border-radius: 2px; max-width: 60px; }

/* тіло кроку */
.trn-body { flex: 1; padding: clamp(18px,2.6vw,30px) clamp(20px,3vw,34px); display: flex; flex-direction: column; }
.trn-step-h { font-family: var(--font-head); font-weight: 700; font-size: clamp(1.15rem,1rem + .7vw,1.5rem); margin: 0 0 4px; }
.trn-step-sub { color: var(--color-text-muted); margin: 0 0 var(--space-4); font-size: var(--fs-small); }
.trn-field-lbl { font-size: var(--fs-xs); letter-spacing: .09em; text-transform: uppercase; color: var(--color-text-muted); font-weight: 700; margin: 0 0 10px; }

/* картка «Мікс» */
.trn-mix { display: flex; align-items: center; gap: 16px; width: 100%; text-align: left; cursor: pointer;
    padding: clamp(16px,2vw,20px); border: 2px solid var(--color-border-strong); border-radius: var(--radius-lg);
    background: var(--color-surface); margin-bottom: var(--space-4); transition: border-color var(--dur-fast), background var(--dur-fast); }
.trn-mix:hover { border-color: var(--color-primary); }
.trn-mix.on { border-color: var(--color-primary); background: var(--color-primary-050); }
.trn-mix-ic { width: 52px; height: 52px; border-radius: 14px; background: var(--color-primary-100); color: var(--color-primary-700);
    flex: none; display: flex; align-items: center; justify-content: center; }
.trn-mix-ic svg { width: 26px; height: 26px; }
.trn-mix-tx { display: flex; flex-direction: column; gap: 2px; }
.trn-mix-t { font-family: var(--font-head); font-weight: 700; font-size: 1.25rem; display: flex; align-items: center; gap: 10px; }
.trn-rec { font-family: var(--font-body); font-size: .66rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
    color: var(--color-primary-700); background: var(--color-primary-100); padding: 3px 8px; border-radius: var(--radius-pill); }
.trn-mix-d { color: var(--color-text-muted); font-size: var(--fs-small); }

/* сітка режимів */
.trn-mode-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(190px, 100%), 1fr)); gap: 12px; }
.trn-mode { text-align: left; cursor: pointer; padding: 15px 16px; border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-md); background: var(--color-surface); display: flex; flex-direction: column; gap: 8px;
    transition: border-color var(--dur-fast), background var(--dur-fast), transform .12s; }
.trn-mode:hover { border-color: var(--color-primary); transform: translateY(-2px); }
.trn-mode.on { border-color: var(--color-primary); background: var(--color-primary-050); }
.trn-mode-ic { width: 34px; height: 34px; border-radius: var(--radius-sm); background: var(--color-bg); color: var(--color-primary);
    display: flex; align-items: center; justify-content: center; }
.trn-mode-ic svg { width: 19px; height: 19px; }
.trn-mode-t { font-weight: 700; font-size: .98rem; }
.trn-mode-d { color: var(--color-text-muted); font-size: .82rem; line-height: 1.35; }

/* крок 2 */
.trn-s2-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
.trn-radio-col { display: flex; flex-direction: column; gap: 10px; }
.trn-radio { display: flex; align-items: center; gap: 12px; padding: 14px 16px; border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-md); background: var(--color-surface); cursor: pointer; font-weight: 600; text-align: left; }
.trn-radio:hover { border-color: var(--color-primary); }
.trn-radio.on { border-color: var(--color-primary); background: var(--color-primary-050); color: var(--color-primary-700); }
.trn-rmark { width: 20px; height: 20px; border-radius: 50%; border: 2px solid var(--color-border-strong); flex: none; position: relative; }
.trn-radio.on .trn-rmark { border-color: var(--color-primary); }
.trn-radio.on .trn-rmark::after { content: ""; position: absolute; inset: 4px; border-radius: 50%; background: var(--color-primary); }
.trn-rsub { font-weight: 400; color: var(--color-text-muted); font-size: var(--fs-small); }
.trn-select { width: 100%; font: inherit; font-size: 1rem; padding: 14px 16px; border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text); }
.trn-count { font-size: var(--fs-small); color: var(--color-text-muted); font-weight: 600; margin: 16px 0 0; }

/* футер кроку */
.trn-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
    padding: clamp(16px,2.2vw,22px) clamp(20px,3vw,34px); border-top: 1px solid var(--color-border); }
.trn-ghost { background: none; border: none; color: var(--color-text-muted); font: inherit; font-weight: 600; cursor: pointer; text-decoration: none; }
.trn-ghost:hover { color: var(--color-text); }

/* ── тренажер у тій самій плашці ── */
.trn-topbar { display: flex; align-items: center; gap: clamp(12px,2vw,20px); padding: clamp(18px,2.4vw,24px) clamp(20px,3vw,34px) clamp(10px,1.5vw,14px); }
.trn-x { border: none; background: none; color: var(--color-text-muted); font-size: 1.3rem; line-height: 1; cursor: pointer; padding: 2px 4px; flex: none; }
.trn-pbar { flex: 1; height: 14px; border-radius: var(--radius-pill); background: var(--color-border); position: relative; }
.trn-pfill { height: 100%; border-radius: var(--radius-pill); background: linear-gradient(var(--color-primary-700), var(--color-primary)); transition: width .4s; } /* був teal #2b93a8 (гість teal-епохи, коли primary=teal) → двотон перивінклу */
/* Комбо «нагріває» бар */
.trn-pbar.hot .trn-pfill { background: linear-gradient(var(--celestial-sun), var(--color-secondary)); box-shadow: 0 0 12px color-mix(in srgb, var(--celestial-sun) 45%, transparent); } /* «жар» комбо: золото→персик + золоте сяйво, у токени (вердикт Юлі — лишити тепло) */
/* Літачок летить разом із прогресом (лівий край = відсоток заповнення) */
.trn-plane { position: absolute; top: 50%; left: 0; width: 26px; height: 26px; color: var(--color-primary-700);
    transform: translate(-40%, -52%); transition: left .4s; pointer-events: none;
    filter: drop-shadow(0 2px 3px rgba(54, 50, 66,.25)); }
.trn-pbar.hot .trn-plane { color: var(--color-secondary-700); }
.trn-plane svg { width: 100%; height: 100%; }
.trn-combo { font-family: var(--font-head); font-weight: 700; font-size: 1.05rem; color: var(--color-secondary-700);
    background: var(--color-secondary-100); border-radius: var(--radius-pill); padding: 3px 12px; flex: none; }
.trn-combo.pop { animation: trn-combo-pop .3s var(--ease); }
@keyframes trn-combo-pop { 0% { transform: scale(1.5); } 100% { transform: scale(1); } }
.trn-cnt { font-size: var(--fs-small); font-weight: 700; color: var(--color-text-muted); font-variant-numeric: tabular-nums; flex: none; }
.trn-arena { flex: 1; min-height: 340px; overflow: auto; display: flex; align-items: center; justify-content: center; padding: clamp(16px,3vw,32px); }
.trn-stage { width: min(560px, 100%); display: flex; flex-direction: column; align-items: center; text-align: center; gap: clamp(14px,2.4vw,22px); }
.trn-task { font-size: clamp(.72rem,.68rem + .2vw,.82rem); font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--color-text-muted); margin: 0; }
.trn-accent-word { color: var(--color-primary-700); }
.trn-qword { font-family: var(--font-head); font-weight: 700; font-size: clamp(2.6rem,1.9rem + 3vw,3.8rem); line-height: 1.15; display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 10px 16px; margin: 0; }
/* Довге питання (вираз, багатослівний переклад) — менший кегль, щоб не рубалось на 3+ рядки */
.trn-qword.long { font-size: clamp(1.5rem, 1.2rem + 1.5vw, 2.3rem); }
/* На десктопі питанню можна виходити за 560px сцени — менше переносів */
@media (min-width: 900px) {
    .trn-qword { width: calc(100% + 240px); margin-inline: -120px; }
}
.trn-hint { color: var(--color-text-muted); font-size: clamp(.85rem,.8rem + .2vw,.98rem); margin: 0; }
.trn-spk { display: inline-flex; width: clamp(30px,4vw,40px); height: clamp(30px,4vw,40px); border-radius: 50%; border: 1.5px solid var(--color-border-strong); align-items: center; justify-content: center; color: var(--color-primary); background: var(--color-surface); cursor: pointer; flex: none; }
.trn-spk svg { width: 46%; height: 46%; } .trn-spk.big { width: clamp(72px,10vw,100px); height: clamp(72px,10vw,100px); }

.trn-opts { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(11px,1.6vw,18px); width: 100%; }
.trn-tile { min-height: clamp(74px,8vw,108px); border-radius: clamp(16px,2vw,22px); background: var(--color-surface); border: 1.5px solid var(--color-border-strong);
    font: inherit; font-weight: 600; font-size: clamp(1.02rem,.95rem + .5vw,1.3rem); color: var(--color-text); cursor: pointer; padding: 10px;
    display: flex; align-items: center; justify-content: center; transition: transform var(--dur-fast), border-color var(--dur-fast), background var(--dur-fast); }
.trn-tile:hover:not([disabled]) { border-color: var(--color-primary); transform: translateY(-2px); }
.trn-tile.ok { background: var(--color-primary); border-color: var(--color-primary); color: var(--color-on-accent); box-shadow: var(--shadow-glow-accent); }
.trn-tile.bad { background: var(--color-error-100); border-color: var(--color-error); color: var(--color-error); }
.trn-tile.dim { opacity: .32; } .trn-tile[disabled] { cursor: default; }

.trn-win { width: min(420px,100%); font: inherit; font-size: clamp(1.05rem,1rem + .4vw,1.25rem); padding: 13px 16px; text-align: center; border: 1.5px solid var(--color-border-strong); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text); }
.trn-win:focus { outline: none; border-color: var(--color-primary); }
.trn-win.ok { border-color: var(--color-success); } .trn-win.almost { border-color: var(--color-secondary); } .trn-win.bad { border-color: var(--color-error); }
.trn-gap-sent { font-size: clamp(1.1rem,1rem + .7vw,1.5rem); line-height: 1.6; margin: 0; }
.trn-slot { font-weight: 700; color: var(--color-primary); letter-spacing: 3px; }
.trn-cta { min-width: 200px; padding: 14px 22px; border: none; border-radius: var(--radius-md); font: inherit; font-weight: 800; font-size: 1rem; cursor: pointer; background: var(--color-primary); color: var(--color-on-accent); box-shadow: var(--shadow-glow-accent); }
.trn-cta[disabled] { background: var(--color-border); color: var(--color-text-muted); box-shadow: none; cursor: default; }

.trn-slots { display: flex; flex-wrap: wrap; gap: 7px; justify-content: center; }
.trn-slot-cell { width: clamp(30px,4vw,40px); height: clamp(42px,5.5vw,54px); border-bottom: 2.5px solid var(--color-border-strong); display: inline-flex; align-items: center; justify-content: center; font-family: var(--font-head); font-size: clamp(1.4rem,1.1rem + .8vw,1.8rem); font-weight: 700; }
.trn-slot-cell.f { border-bottom-color: var(--color-primary); } .trn-slot-space { width: 18px; }
.trn-slots.ok .trn-slot-cell { border-bottom-color: var(--color-success); color: var(--color-success-700); }
.trn-slots.bad .trn-slot-cell { border-bottom-color: var(--color-error); color: var(--color-error); }
.trn-tiles { display: flex; flex-wrap: wrap; gap: 9px; justify-content: center; }
.trn-ltile { width: clamp(44px,5.5vw,58px); height: clamp(48px,6vw,62px); border: 1.5px solid var(--color-border-strong); border-radius: var(--radius-sm); background: var(--color-surface); font-family: var(--font-head); font-size: clamp(1.25rem,1rem + .7vw,1.6rem); font-weight: 700; color: var(--color-text); cursor: pointer; }
.trn-ltile:hover:not([disabled]) { border-color: var(--color-primary); } .trn-ltile[disabled] { opacity: .25; cursor: default; }
.trn-link { background: none; border: none; color: var(--color-text-muted); font: inherit; font-size: var(--fs-small); font-weight: 600; cursor: pointer; text-decoration: underline; }

.trn-flash { perspective: 1400px; cursor: pointer; width: min(460px,100%); height: clamp(200px,30vh,290px); }
.trn-flash-in { position: relative; width: 100%; height: 100%; transition: transform .5s cubic-bezier(.2,.8,.2,1); transform-style: preserve-3d; }
.trn-flash.flip .trn-flash-in { transform: rotateY(180deg); }
.trn-face { position: absolute; inset: 0; backface-visibility: hidden; -webkit-backface-visibility: hidden; border-radius: var(--radius-lg); border: 1px solid var(--color-border); background: var(--color-surface); box-shadow: var(--shadow-card); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; padding: 22px; }
.trn-face.back { transform: rotateY(180deg); background: var(--color-primary-050); }
.trn-face-big { font-family: var(--font-head); font-size: clamp(1.9rem,1.4rem + 1.6vw,2.4rem); font-weight: 700; }
.trn-face-tr { font-family: var(--font-head); font-size: clamp(1.6rem,1.2rem + 1.2vw,2rem); font-weight: 700; color: var(--color-primary-700); }
.trn-face-ex { font-family: var(--font-example); font-weight: 500; font-size: clamp(.85rem,.8rem + .3vw,1rem); font-style: italic; color: var(--color-text-muted); }
.trn-flip-hint { font-size: .78rem; color: var(--color-text-muted); }
.trn-judge { display: flex; gap: 12px; } .trn-judge button { min-width: 130px; padding: 13px 18px; border-radius: var(--radius-md); font: inherit; font-weight: 700; cursor: pointer; }
.trn-still { background: var(--color-surface); border: 1.5px solid var(--color-secondary); color: var(--color-secondary-700); }
.trn-know { background: var(--color-success); border: none; color: var(--color-on-accent); }

.trn-pairs { display: flex; gap: clamp(12px,2vw,22px); width: min(520px,100%); }
.trn-pcol { flex: 1; display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.trn-pair { padding: clamp(12px,1.6vw,16px) 12px; border: 1.5px solid var(--color-border-strong); border-radius: var(--radius-md); background: var(--color-surface); font: inherit; font-size: clamp(.95rem,.9rem + .3vw,1.1rem); color: var(--color-text); cursor: pointer; overflow-wrap: break-word; }
.trn-pair:hover:not(.done) { border-color: var(--color-primary); }
.trn-pair.sel { border-color: var(--color-primary); background: var(--color-primary-050); font-weight: 700; }
.trn-pair.done { border-color: var(--color-success); background: var(--color-success-100); color: var(--color-success-700); opacity: .7; cursor: default; }
.trn-pair.bad { border-color: var(--color-error); animation: trn-shake .3s; }
@keyframes trn-shake { 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); } }
.trn-ptoast { font-size: clamp(.82rem,.78rem + .2vw,.95rem); color: var(--color-error); background: var(--color-error-100); border-radius: var(--radius-sm); padding: 9px 14px; opacity: 0; transition: opacity var(--dur); }
.trn-ptoast.show { opacity: 1; }

/* фідбек-картка (пояснення) у потоці плашки */
.trn-fb { flex: none; display: flex; justify-content: center; padding: clamp(12px,2vw,20px); }
.trn-fb-card { width: min(600px,100%); background: var(--color-surface); border-radius: var(--radius-lg); padding: clamp(16px,2.2vw,22px) clamp(18px,2.4vw,26px); box-shadow: 0 -8px 40px rgba(54, 50, 66,.14); transform: translateY(16px); opacity: 0; transition: transform .3s cubic-bezier(.2,.8,.2,1), opacity .3s; text-align: left; }
.trn-fb-card.in { transform: translateY(0); opacity: 1; }
.trn-fb-card.ok { border-top: 5px solid var(--color-success); } .trn-fb-card.bad { border-top: 5px solid var(--color-error); }
.trn-fb-head { display: flex; align-items: center; gap: 10px; font-weight: 800; font-size: clamp(1.02rem,.95rem + .3vw,1.2rem); margin-bottom: 10px; }
.trn-fb-card.ok .trn-fb-head { color: var(--color-success-700); } .trn-fb-card.bad .trn-fb-head { color: var(--color-error); }
.trn-fb-badge { width: 28px; height: 28px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; color: var(--color-on-accent); font-weight: 800; flex: none; }
.trn-fb-card.ok .trn-fb-badge { background: var(--color-success); } .trn-fb-card.bad .trn-fb-badge { background: var(--color-error); }
.trn-exp { display: flex; flex-direction: column; gap: 7px; margin-bottom: 15px; }
.trn-exp-line { font-size: clamp(.92rem,.88rem + .2vw,1.02rem); }
.trn-exp-line.correct { font-weight: 600; } .trn-exp-line.correct .k { color: var(--color-success-700); font-weight: 700; }
.trn-exp-line.conf { color: var(--color-error); } .trn-exp-line.conf b { font-weight: 700; }
.trn-exp-ex { font-family: var(--font-example); font-weight: 500; font-size: clamp(.86rem,.82rem + .2vw,.96rem); font-style: italic; color: var(--color-text-muted); border-left: 3px solid var(--color-border-strong); padding-left: 11px; }
.trn-exp-ex span { display: block; font-style: normal; margin-top: 2px; opacity: .85; }
.trn-next { width: 100%; padding: 13px; border: none; border-radius: var(--radius-sm); font: inherit; font-weight: 800; cursor: pointer; color: var(--color-on-accent); }
.trn-fb-card.ok .trn-next { background: var(--color-success); } .trn-fb-card.bad .trn-next { background: var(--color-error); }

/* штамп на підсумку (та сама фізика, що passport-stamp; прямокутний, TEAL) */
.trn-stamp { --ink: var(--color-primary-700);
    display: flex; flex-direction: column; align-items: center; gap: 2px;
    border: 3px solid var(--ink); border-radius: var(--radius-btn); padding: 12px 26px 10px;
    color: var(--ink); transform: rotate(-6deg); position: relative;
    animation: stamp-slam .55s cubic-bezier(0.22, 1.6, 0.36, 1) both; animation-delay: .15s;
    -webkit-mask-image: radial-gradient(circle at 34% 30%, black 58%, rgba(0,0,0,0.85) 80%, rgba(0,0,0,0.6) 100%);
            mask-image: radial-gradient(circle at 34% 30%, black 58%, rgba(0,0,0,0.85) 80%, rgba(0,0,0,0.6) 100%);
}
.trn-stamp::before { content: ""; position: absolute; inset: 5px; border: 1.5px dashed var(--ink); border-radius: 8px; }
.trn-stamp.perfect { --ink: var(--color-secondary-700); }
.trn-stamp-top { font-size: 10px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase; opacity: .85; }
.trn-stamp-main { font-family: var(--font-mono); font-weight: 700; font-size: 1.5rem; letter-spacing: .18em; line-height: 1.1; }
.trn-stamp-date { font-family: var(--font-mono); font-size: 11px; font-weight: 600; opacity: .9; }

/* підсумок */
.trn-summary { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px; padding: clamp(24px,4vw,50px); text-align: center; }
.trn-summary h2 { font-family: var(--font-head); font-weight: 700; font-size: clamp(1.5rem,1.2rem + 1.2vw,2rem); margin: 0; }
.trn-sum-stats { display: flex; gap: clamp(18px,3vw,40px); margin: 8px 0 6px; flex-wrap: wrap; justify-content: center; }
.trn-sum-stat { display: flex; flex-direction: column; } .trn-sum-num { font-family: var(--font-head); font-weight: 700; font-size: 2rem; color: var(--color-primary); }
.trn-sum-lbl { font-size: var(--fs-xs); color: var(--color-text-muted); }
.trn-sum-actions { display: flex; gap: 12px; margin-top: 8px; align-items: center; }
.trn-empty-body { align-items: center; justify-content: center; text-align: center; }

/* Розкатка еталона 23.07 (боардлес + скло): плашка тренажера прозора — кроки
   й тренажер живуть прямо на градієнті; внутрішні відступи лишаються. */
body.page-train.page-boardless::before { content: none; } /* вуаль була під плашку */
.page-boardless .trn-board { background: transparent; border: 0; box-shadow: none; overflow: visible; }
/* Шапка кроків: заголовок графітом на градієнті, лінію-роздільник знято */
.page-boardless .trn-head { border-bottom: 0; }
/* Стрічка кроків і топбар тренажера — скляні панелі (дрібний muted-текст
   на градієнті фейлить контраст — Б-аудит), рецепт .glass-panel */
.page-boardless .trn-stepper,
.page-boardless .trn-topbar {
    background: color-mix(in srgb, var(--color-surface) 55%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    border-radius: var(--radius-lg);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    margin: 0 clamp(20px, 3vw, 34px);
    padding: 12px 22px;
}
.page-boardless .trn-topbar { margin-top: clamp(18px, 2.4vw, 24px); }
/* Голий muted-текст на градієнті → графіт */
.page-boardless .trn-step-sub, .page-boardless .trn-count,
.page-boardless .trn-field-lbl, .page-boardless .trn-task,
.page-boardless .trn-hint, .page-boardless .trn-sum-lbl,
.page-boardless .trn-ghost, .page-boardless .trn-link { color: var(--color-text); }
/* Картки-«предмети» без обводки — тримаються на shadow-card; рамка лишається
   як індикатор (hover/on/ok/bad фарбують border-color, ширина збережена) */
.page-boardless .trn-mix, .page-boardless .trn-mode,
.page-boardless .trn-radio, .page-boardless .trn-tile,
.page-boardless .trn-ltile, .page-boardless .trn-pair,
.page-boardless .trn-spk {
    border-color: transparent; box-shadow: var(--shadow-card);
}
/* Футер кроку: замість сірої лінії — білий пунктир-роздільник еталона */
.page-boardless .trn-foot { border-top: 2px dashed var(--color-surface); }

@media (max-width: 560px) { .trn-s2-grid { grid-template-columns: 1fr; } }
@media (prefers-reduced-motion: reduce) {
    .trn-flash-in, .trn-fb-card, .trn-pfill, .trn-tile, .trn-plane { transition: none; }
    .trn-pair.bad, .trn-stamp, .trn-combo.pop { animation: none; }
    .trn-stamp { opacity: 1; }
}

/* ============================================================
   ПРОГРЕС (сторінка)
   ============================================================ */
.progress-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--space-3); }
.progress-card {
    background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md);
    padding: var(--space-4); box-shadow: var(--shadow-sm); border-left: 4px solid var(--color-primary);
}
.progress-card.completed { border-left-color: var(--color-success); }
.progress-title { font-family: var(--font-head); font-weight: 700; color: var(--color-text); text-decoration: none; font-size: 1.15rem; }
.progress-title:hover { color: var(--color-primary); }
.progress-meta { display: flex; gap: var(--space-2); margin: var(--space-2) 0; font-size: var(--fs-xs); flex-wrap: wrap; }
.progress-stats { margin: var(--space-2) 0; color: var(--color-text-muted); }
.status-completed { color: var(--color-success-700); font-weight: 700; }
.progress-dates { margin: var(--space-2) 0 0; font-size: var(--fs-xs); color: var(--color-text-muted); }

/* ============================================================
   Поява карток
   ============================================================ */
@media (prefers-reduced-motion: no-preference) {
    .lesson-card, .vocab-card, .progress-card {
        animation: rise var(--dur) var(--ease) both;
    }
    @keyframes rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
    /* Результати живого пошуку перебудовуються на кожен символ (innerHTML) — entrance-анімація
       рестартувала б з opacity:0 і лишала б картки вицвілими під час набору. Тут — повна
       непрозорість одразу після появи (2.7). */
    .flat-results .lesson-card { animation: none; }
}

/* ============================================================
   Адаптив
   ============================================================ */
/* Пункти профіль-меню, що дублюють головну наву, — лише на мобілці
   (там nav-links сховані, меню = єдиний доступ) */
@media (min-width: 769px) {
    .pm-mobile-only { display: none; }
}

@media (max-width: 768px) {
    /* Хедер: тільки логотип + аватар, висота ≤56px */
    .site-header { border-radius: var(--radius-md); padding: 6px var(--space-4); min-height: 44px; }
    .site-header .nav-links { display: none; }
    .brand { font-size: 1.05rem; }
    .profile-btn { padding: 2px; border: 0; background: none; box-shadow: none; }
    .profile-btn .profile-name, .profile-btn .profile-caret { display: none; }
    /* Знизу лишаємо місце під фіксований таб-бар */
    body { padding: var(--space-3) var(--space-3) calc(78px + env(safe-area-inset-bottom)); }

    /* Нижній таб-бар: ≤64px, тап-цілі ≥44px */
    .tab-bar {
        display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: var(--z-bar);
        height: calc(60px + env(safe-area-inset-bottom));
        padding: 0 4px env(safe-area-inset-bottom);
        /* Ink-якір (3.1): темний таб-бар замість світлого скла. */
        background: var(--color-ink);
        border-top: 1px solid var(--color-ink-soft);
    }
    .tb-item {
        flex: 1; min-width: 0; min-height: 44px;
        display: flex; flex-direction: column; align-items: center; justify-content: center;
        gap: 3px; padding: 6px 2px;
        font-family: inherit; font-size: 10.5px; font-weight: 600; letter-spacing: 0.01em;
        color: var(--color-on-ink-muted); text-decoration: none;
        background: none; border: 0; cursor: pointer;
    }
    .tb-item span { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .tb-item [data-lucide] { width: var(--icon-lg); height: var(--icon-lg); flex: none; }
    .tb-item:hover { color: var(--color-on-ink); }
    .tb-item.active { color: var(--color-primary-100); }

    /* Меню профілю — нижній аркуш над таб-баром */
    .profile-menu {
        position: fixed; top: auto; left: var(--space-3); right: var(--space-3);
        bottom: calc(70px + env(safe-area-inset-bottom));
    }
}

/* --- Планшет і вузьке вікно (769–1049px) ---
   Повна шапка (табличка-логотип + нава + «Вітаю, імʼя») влазить в один рядок лише
   від ~1050px. Нижче вона переносилась на другий рядок і виростала з 60 до 130px —
   а на карті тулбар пошуку прибитий до top:124px, тож шапка накривала його.
   Тому в цьому діапазоні шапка компактна: імʼя ховаємо (лишається аватар),
   нава й логотип тісніші. Тап-цілі при цьому лишаються ≥44px. */
@media (min-width: 769px) and (max-width: 1049px) {
    .site-header { gap: var(--space-3); flex-wrap: nowrap; }
    .brand { font-size: 1.05rem; padding: 10px 14px; }
    .nav-links { padding: 4px; }
    .nav-links a { padding: 9px 10px; gap: 5px; }
    .profile-btn .profile-name { display: none; }
    .profile-btn { padding-right: 6px; }
}
/* Найвужча смуга «десктопа» (iPad portrait): навіть компактної шапки замало —
   лишаємо від логотипа лише знак-глобус, підпис ховаємо. Нава й профіль цілі. */
@media (min-width: 769px) and (max-width: 879px) {
    .brand .brand-name { display: none; }
    .brand { padding: 10px 12px; }
    .nav-links { flex-wrap: nowrap; }
    .nav-links a { padding: 9px 9px; }
}

/* iOS Safari автоматично зумить сторінку, коли фокус потрапляє в поле зі шрифтом
   меншим за 16px, і назад уже не від'їжджає. Тому на телефоні/планшеті всі поля
   вводу — рівно 16px (форми входу, реєстрації, налаштувань, щоденника, адмінки,
   пошуку). Поля вправ так само підняті у exercises.css. */
@media (max-width: 1024px) {
    input, select, textarea { font-size: 16px; }
}

/* ============================================================
   РАНГ МАНДРІВНИКА
   ============================================================ */
/* ============================================================
   ПАСПОРТ (сторінка)
   ============================================================ */
/* компактна печатка (рецепт btn-sm secondary); на штампі — контекстний override нижче */
.pp-postcard {
    font: inherit; font-size: var(--fs-xs); font-weight: 600; cursor: pointer;
    border: 1.5px solid var(--color-border-strong); background: var(--color-surface);
    color: var(--color-primary-700); border-radius: var(--radius-sm); padding: 4px 12px;
    box-shadow: 0 2px 0 var(--color-border-strong);
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, border-color var(--dur-fast) ease, color var(--dur-fast) ease, background var(--dur-fast) ease;
}
.pp-postcard:hover { border-color: var(--color-primary); transform: translateY(-1px); box-shadow: 0 3px 0 var(--color-border-strong); }
.pp-postcard:active { transform: translateY(1px); box-shadow: 0 1px 0 var(--color-border-strong); }

/* --- Обкладинка паспорта --- */
.pb-cover {
    position: relative; max-width: 560px; margin: 0 auto var(--space-6);
    background: linear-gradient(150deg, var(--hero-grad-from) 0%, var(--color-primary) 55%, var(--hero-grad-to) 100%);
    color: var(--color-on-hero); text-align: center;
    border-radius: 14px 22px 22px 14px;     /* корінець книжки зліва */
    padding: var(--space-7) var(--space-6);
    box-shadow: var(--shadow-lg), inset 0 0 0 2px rgba(243, 228, 194, 0.35), inset 0 0 0 6px transparent;
}
/* корінець */
.pb-cover::before {
    content: ""; position: absolute; left: 7px; top: 10px; bottom: 10px; width: 1.5px;
    background: rgba(243, 228, 194, 0.35);
}
.pb-cover-emblem {
    font-size: 3rem; margin-bottom: var(--space-3);
    filter: sepia(0.3) saturate(0.8);
}
.pb-cover-title {
    font-family: var(--font-head); font-size: 1.7rem; letter-spacing: 0.35em;
    font-weight: 700; margin-bottom: var(--space-5);
}
.pb-cover-title span {
    display: block; font-size: var(--fs-small); letter-spacing: 0.18em;
    opacity: 0.8; margin-top: 4px; text-transform: uppercase;
}
.pb-cover-holder { display: flex; flex-direction: column; gap: 3px; }
.pb-holder-label { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.14em; opacity: 0.65; }
.pb-holder-name { font-family: var(--font-mono); font-size: 1.15rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; }
.pb-holder-rank { font-size: var(--fs-small); opacity: 0.85; }

.pb-page-title {
    text-align: center; font-size: var(--fs-xs); letter-spacing: 0.3em;
    color: var(--color-text-muted); font-weight: 700; margin-bottom: var(--space-5);
}
.pb-stamps {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(min(190px, 100%), 1fr));
    gap: var(--space-5); justify-items: center;
}
/* Чорнильний штамп країни */
.pb-stamp {
    --ink: var(--color-primary);
    width: 172px; min-height: 172px; border-radius: 50%;
    border: 3px solid var(--ink); color: var(--ink);
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 2px; text-align: center; padding: 14px;
    transform: rotate(var(--tilt, -4deg));
    transition: transform var(--dur) var(--ease);
    position: relative;
    -webkit-mask-image: radial-gradient(circle at 35% 30%, black 58%, rgba(0,0,0,0.85) 80%, rgba(0,0,0,0.65) 100%);
            mask-image: radial-gradient(circle at 35% 30%, black 58%, rgba(0,0,0,0.85) 80%, rgba(0,0,0,0.65) 100%);
}
.pb-stamp::before {
    content: ""; position: absolute; inset: 6px;
    border: 1.5px dashed var(--ink); border-radius: 50%;
}
.pb-stamp:hover { transform: rotate(0deg) scale(1.04); }
.pb-stamp-full { --ink: var(--color-success-700); }
.pb-stamp-top { font-size: 9px; font-weight: 700; letter-spacing: 0.16em; }
.pb-stamp-flag { font-size: 1.8rem; line-height: 1.2; }
.pb-stamp-name { font-family: var(--font-head); font-weight: 700; font-size: 1.02rem; line-height: 1.15; }
.pb-stamp-meta { font-family: var(--font-mono); font-size: 10.5px; opacity: 0.9; }
/* на чорнильному штампі кнопка «зливається» з печаткою: без грані, кольори успадковані */
.pb-stamp .pp-postcard { margin-top: 6px; border-color: currentColor; color: inherit; background: transparent; box-shadow: none; }
.pb-stamp .pp-postcard:hover { background: rgba(255,255,255,0.6); box-shadow: none; }
.pb-stamp .pp-postcard:active { box-shadow: none; }

/* --- Паспорт-книжка: закрита = одна сторінка; відкривається і гортається як справжня книга --- */
.passport-book { position: relative; max-width: 940px; margin: 0 auto var(--space-6); }

/* Книжковий блок = одна сторінка завширшки; при відкритті зсувається праворуч,
   щоб розворот (обкладинка ліворуч + сторінки) став рівно по центру */
.pbk-book {
    position: relative; width: 50%; margin: 0 auto;
    perspective: 2600px;
    transition: transform .8s cubic-bezier(.6,.05,.25,1);
}
.passport-book[data-open="true"] .pbk-book { transform: translateX(50%); }

/* Обкладинка-фліпер: обертається навколо корінця (лівого краю), має лице і форзац */
.pbk-cover {
    position: absolute; inset: 0; z-index: 3;
    border: 0; padding: 0; background: transparent; font: inherit; cursor: pointer;
    transform-origin: left center; transform-style: preserve-3d;
    /* z-index перемикається на середині оберту — обкладинка «пірнає» під сторінки */
    transition: transform .8s cubic-bezier(.6,.05,.25,1), z-index 0s .4s;
}
.passport-book[data-open="true"] .pbk-cover {
    transform: rotateY(-180deg); z-index: 1; pointer-events: none;
}
.pbk-cover-front, .pbk-cover-back {
    position: absolute; inset: 0;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    backface-visibility: hidden; -webkit-backface-visibility: hidden;
}
/* лице несе стилі .pb-cover (градієнт/тінь/радіус) — прибираємо лише зайві габарити */
.pbk-cover-front { max-width: none; margin: 0; }
/* Форзац — теплий папір зі штриховою рамкою; видно в мить розгортання */
.pbk-cover-back {
    transform: rotateY(180deg);
    background:
        radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--color-primary) 7%, transparent), transparent 55%),
        var(--color-bg-warm);
    border-radius: 22px 14px 14px 22px;
    box-shadow: inset 0 0 0 1px var(--color-border);
}
.pbk-endpaper-frame {
    position: absolute; inset: 12px;
    border: 1.5px dashed var(--color-border-strong);
    border-radius: 14px 8px 8px 14px; opacity: 0.55;
}
.pbk-open-hint {
    display: inline-flex; align-items: center; gap: 6px;
    margin-top: var(--space-5); font-size: var(--fs-small);
    opacity: 0.82; letter-spacing: 0.02em;
}

/* Нутрощі: розворот удвічі ширший за закриту книжку; корінець = лівий край блока.
   Коли закрито — visibility ховає сторінки, але зберігає висоту книжки (без стрибків). */
.pbk-inside {
    position: relative; z-index: 2; width: 200%; margin-left: -100%;
    visibility: hidden; opacity: 0;
}
.passport-book[data-open="true"] .pbk-inside {
    visibility: visible; opacity: 1;
    /* нутрощі проявляються лише коли обкладинка вже пірнула під сторінки (~0.4с,
       там і перемикається z-index) — інакше розворот видно на пів-обертанні */
    transition: opacity .3s ease .42s;
}
.pbk-sheets { position: relative; }
.pbk-viewport {
    overflow: hidden; border-radius: var(--radius-md);
    border: 1px solid var(--color-border);
    /* стосик аркушів під розворотом + глибина книжки */
    box-shadow:
        0 3px 0 -1px var(--color-surface), 0 4px 0 -2px var(--color-border-strong),
        0 7px 0 -4px var(--color-surface), 0 8px 0 -5px var(--color-border-strong),
        var(--shadow-lg);
}
.pbk-track { display: flex; }
.pbk-page { flex: 0 0 100%; box-sizing: border-box; display: flex; align-items: stretch; }
/* Сторінка розвороту — папір з легкими кольоровими відтінками */
.pbk-leaf {
    flex: 1 1 50%; min-width: 0; box-sizing: border-box;
    padding: var(--space-6) var(--space-5);
    background:
        radial-gradient(circle at 16% 18%, color-mix(in srgb, var(--color-primary) 5%, transparent), transparent 32%),
        radial-gradient(circle at 86% 76%, rgba(224, 138, 60, 0.05), transparent 30%),
        var(--color-surface);
}
/* Жолоб біля корінця: тінь згину з обох боків від центру */
.pbk-leaf:first-child { box-shadow: inset -20px 0 26px -20px rgba(0,0,0,0.22); }
.pbk-leaf + .pbk-leaf {
    border-left: 1px solid var(--color-border-strong);
    box-shadow: inset 20px 0 26px -20px rgba(0,0,0,0.22);
}
.pbk-leaf .pb-stamps { grid-template-columns: repeat(2, 1fr); gap: var(--space-4); }

/* Сцена перегортання: живий аркуш піднімається над розворотом і лягає на сусідню сторінку */
.pbk-stage { position: absolute; inset: 0; z-index: 4; pointer-events: none; perspective: 2600px; }
.pbk-stage .pbk-leaf { border: 0; }
.pbk-still { position: absolute; top: 0; height: 100%; width: 50%; overflow: hidden; }
.pbk-still-left { left: 0; box-shadow: inset -20px 0 26px -20px rgba(0,0,0,0.22); }
.pbk-still-right { left: 50%; box-shadow: inset 20px 0 26px -20px rgba(0,0,0,0.22); }
.pbk-turn {
    position: absolute; top: 0; height: 100%; width: 50%;
    transform-style: preserve-3d; will-change: transform;
    transition: transform .6s cubic-bezier(.45,.06,.3,1);
    filter: drop-shadow(-10px 8px 14px rgba(0,0,0,0.20));
}
.pbk-turn-fwd { left: 50%; transform-origin: left center; }
.pbk-turn-back { left: 0; transform-origin: right center; filter: drop-shadow(10px 8px 14px rgba(0,0,0,0.20)); }
.pbk-turn-fwd.pbk-turning { transform: rotateY(-180deg); }
.pbk-turn-back.pbk-turning { transform: rotateY(180deg); }
.pbk-face {
    position: absolute; inset: 0; overflow: hidden;
    backface-visibility: hidden; -webkit-backface-visibility: hidden;
}
.pbk-face-back { transform: rotateY(180deg); }
/* Тінь жолоба на обох гранях аркуша, що летить */
.pbk-turn-fwd .pbk-face-front { box-shadow: inset 20px 0 26px -20px rgba(0,0,0,0.22); }
.pbk-turn-fwd .pbk-face-back  { box-shadow: inset -20px 0 26px -20px rgba(0,0,0,0.22); }
.pbk-turn-back .pbk-face-front { box-shadow: inset -20px 0 26px -20px rgba(0,0,0,0.22); }
.pbk-turn-back .pbk-face-back  { box-shadow: inset 20px 0 26px -20px rgba(0,0,0,0.22); }
.pbk-nav {
    display: flex; align-items: center; justify-content: center; gap: var(--space-3);
    margin-top: var(--space-4);
    visibility: hidden; opacity: 0; transition: opacity .3s ease;
}
.passport-book[data-open="true"] .pbk-nav { visibility: visible; opacity: 1; transition-delay: .45s; }
/* .pbk-arrow = рецепт .btn-icon (секція КНОПКИ), продубльований під власним імʼям */
.pbk-arrow {
    display: inline-flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; border-radius: 50%;
    border: 1px solid var(--color-border); background: var(--color-surface);
    color: var(--color-primary); cursor: pointer;
    transition: background var(--dur) var(--ease), color var(--dur) var(--ease), transform var(--dur-fast) var(--spring);
}
.pbk-arrow:hover:not(:disabled) { background: var(--color-primary-050); }
.pbk-arrow:active:not(:disabled) { transform: scale(0.92); }
.pbk-arrow:disabled { opacity: 0.35; cursor: default; color: var(--color-text-muted); }
.pbk-counter {
    font-family: var(--font-mono); font-size: var(--fs-small);
    color: var(--color-text-muted); min-width: 54px; text-align: center;
}
/* компактна печатка (рецепт btn-sm secondary) */
.pbk-close {
    margin-left: var(--space-3); font: inherit; font-weight: 600; font-size: var(--fs-small);
    background: var(--color-surface); border: 1.5px solid var(--color-border-strong);
    color: var(--color-primary-700);
    border-radius: var(--radius-sm); padding: 6px 13px; cursor: pointer;
    box-shadow: 0 2px 0 var(--color-border-strong);
    transition: transform var(--dur-fast) var(--spring), box-shadow var(--dur-fast) ease, border-color var(--dur-fast) ease;
}
.pbk-close:hover { border-color: var(--color-primary); transform: translateY(-1px); box-shadow: 0 3px 0 var(--color-border-strong); }
.pbk-close:active { transform: translateY(1px); box-shadow: 0 1px 0 var(--color-border-strong); }

/* Вузькі екрани: книжка на всю ширину, розворот складається вертикально */
@media (max-width: 680px) {
    .pbk-book { width: 100%; }
    .passport-book[data-open="true"] .pbk-book { transform: none; }
    .pbk-inside { width: 100%; margin-left: 0; }
    .pbk-page { flex-direction: column; }
    .pbk-leaf:first-child { box-shadow: inset 0 -18px 24px -20px rgba(0,0,0,0.18); }
    .pbk-leaf + .pbk-leaf {
        border-left: 0; border-top: 1px solid var(--color-border-strong);
        box-shadow: inset 0 18px 24px -20px rgba(0,0,0,0.22);
    }
    .pbk-leaf .pb-stamps { grid-template-columns: repeat(auto-fit, minmax(min(150px, 100%), 1fr)); }
}

@media (prefers-reduced-motion: reduce) {
    .pbk-book, .pbk-cover, .pbk-inside, .pbk-nav, .pbk-turn { transition: none; }
    .passport-book[data-open="true"] .pbk-cover { display: none; }
}

/* Миттєве скидання стану без анімацій — повернення через bfcache («Назад») */
.passport-book.pbk-instant .pbk-book,
.passport-book.pbk-instant .pbk-cover,
.passport-book.pbk-instant .pbk-inside,
.passport-book.pbk-instant .pbk-nav,
.passport-book.pbk-instant .pbk-track { transition: none !important; }

.shelf-hint { margin: var(--space-1) 0 var(--space-4); color: var(--color-text-muted); font-size: var(--fs-small); }
.souvenir { flex: 0 0 142px; scroll-snap-align: start; }
.shelf-row::-webkit-scrollbar { height: 8px; }
.shelf-row::-webkit-scrollbar-track { background: transparent; }
.shelf-row::-webkit-scrollbar-thumb { background: rgba(80, 90, 100, 0.28); border-radius: 4px; }
.souvenir {
    display: flex; flex-direction: column; align-items: center; gap: var(--space-2);
    text-align: center; padding: 4px 0;
}
/* Сувенір = сам предмет своєю формою (рішення Юлі 19.07): без керамічної
   коробки-прямокутника. drop-shadow бере альфу картинки, тож тінь повторює
   силует — кожен сувенір має власний контур, а не однаковий бокс. */
.souvenir-emoji {
    width: 140px; height: 118px; padding: 4px;
    display: flex; align-items: center; justify-content: center;
    position: relative;   /* якір для бейджів замка/прогресу */
}
.souvenir-img {
    width: 100%; height: 100%; object-fit: contain; display: block;
    filter: drop-shadow(0 7px 7px rgba(45,50,60,0.30));
    transition: transform var(--dur) var(--ease), filter var(--dur) var(--ease);
}
.souvenir-emoji .souvenir-ic {
    width: 82px; height: 82px; color: var(--color-primary);
    filter: drop-shadow(0 5px 5px rgba(45,50,60,0.22));
    transition: transform var(--dur) var(--ease), filter var(--dur) var(--ease);
}
.souvenir:hover .souvenir-img, .souvenir:hover .souvenir-ic {
    transform: translateY(-3px) scale(1.04);
    filter: drop-shadow(0 12px 12px rgba(45,50,60,0.38));
}
.souvenir-country { font-size: var(--fs-xs); color: var(--souvenir-ink); }
/* Заблоковані — ПЛОСКИЙ силует-привид (запечений sil/<cc>.png має рівну альфу,
   тож opacity дає один рівний тон, без градієнта-розчинення) + замок-бейдж.
   Легкий drop-shadow лишаємо — силует читається як обʼємний привид призу. */
.souvenir-locked .souvenir-sil { opacity: 0.26; filter: drop-shadow(0 4px 5px rgba(45,50,60,0.14)); }
/* Запасний шлях (якщо силует-файл відсутній) — старий градієнт-привид з картинки */
.souvenir-locked .souvenir-img:not(.souvenir-sil) { filter: brightness(0); opacity: 0.20; }
.souvenir-locked .souvenir-ic { color: var(--souvenir-locked-ico); opacity: 0.4; filter: none; }
.souvenir-locked:hover .souvenir-img, .souvenir-locked:hover .souvenir-ic { transform: none; }
.souvenir-lock {
    position: absolute; right: 8px; bottom: 8px; z-index: 1;
    display: flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; border-radius: 50%;
    background: var(--color-surface); color: var(--souvenir-locked-ico);
    box-shadow: 0 1px 3px rgba(45, 50, 60, 0.25);
}
.souvenir-lock svg { width: 14px; height: 14px; }
.souvenir-progress {
    position: absolute; left: 8px; top: 8px; z-index: 1;
    font-family: var(--font-mono); font-size: 10.5px; line-height: 1;
    padding: 4px 7px; border-radius: 999px;
    background: var(--color-surface); color: var(--color-primary);
    box-shadow: 0 1px 3px rgba(45, 50, 60, 0.2);
}

/* Ґрід сувенірів у поп-апі «Мого профілю» */
.sm-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(130px, 100%), 1fr)); gap: var(--space-4); }
.sm-tile { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 4px; }
.sm-tile .souvenir-emoji { width: 118px; height: 100px; padding: 6px; }
.sm-tile .souvenir-lock { width: 22px; height: 22px; right: 6px; bottom: 6px; }
.sm-tile .souvenir-lock svg { width: 12px; height: 12px; }
.sm-name { font-weight: 600; font-size: var(--fs-small); }

/* ============================================================
   Доступність: видимий фокус для клавіатури (WCAG 2.4.7)
   ============================================================ */
/* Базова обводка фокуса — усі інтерактивні елементи (в т.ч. нова нава/таб-бар/дропдаун) */
:focus-visible {
    outline: 2px solid var(--color-primary);
    outline-offset: 2px;
}
/* Поля з власним outline:none на :focus повертають обводку саме для клавіатури */
a:focus-visible, button:focus-visible, select:focus-visible, textarea:focus-visible,
input:focus-visible, [tabindex]:focus-visible, .chip input:focus-visible + span,
#filter-search:focus-visible, .auth-form input:focus-visible,
.admin-form input:focus-visible, .admin-form select:focus-visible, .admin-form textarea:focus-visible,
.map-country:focus-visible {
    outline: 2px solid var(--color-primary);
    outline-offset: 2px;
}
.map-country:focus-visible { outline-offset: 0; }
/* Прибираємо обводку при кліку мишею — лишаємо лише для клавіатури (Tab) */
.map-country:focus:not(:focus-visible) { outline: none; }

/* Поважаємо «зменшити рух» — приглушуємо нефункційні анімації */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* ============================================================
   СТОРІНКА «НОТАТКИ МАНДРІВНИКА»
   ============================================================ */
.page-lead { color: var(--color-text-muted); margin: 0 0 var(--space-5); }

/* Якір на вправу не ховається під запіненою шапкою */
.block { scroll-margin-top: 88px; }

.note-group { margin-bottom: var(--space-6); }
.note-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(280px, 100%), 1fr)); gap: var(--space-4); }
/* Розкатка еталона 22.07 (боардлес + скло): шапка групи їде на .glass-panel
   (клас у розмітці) замість лінії-роздільника — дрібний текст на градієнті
   фейлить контраст (Б-аудит). Лічильник «N нот.» тому НЕ muted, а графіт
   (9.12 на склі 55% над найтемнішою плямою; muted давав 3.84 = фейл). */
.note-group-head {
    display: flex; align-items: baseline; justify-content: space-between;
    gap: var(--space-3); margin-bottom: var(--space-4);
    padding: 9px 18px;
}
.note-group-head h2 { margin: 0; font-size: var(--fs-h3); }
.note-group-head h2 a { color: var(--color-text); text-decoration: none; }
.note-group-head h2 a:hover { color: var(--color-primary); }
.note-flag { font-size: 1.1em; }
.note-count { color: var(--color-text); font-size: var(--fs-small); white-space: nowrap; }

/* Картка-нотатка — «предмет» з власним папером (лінійка + скотч нижче),
   тому без скла; обводку знято за патерном еталона — тримається на тіні. */
.note-card {
    background: var(--color-surface);
    border: 0;
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    padding: var(--space-4);
    margin-bottom: var(--space-3);
}
.note-card-top {
    display: flex; align-items: center; gap: var(--space-2);
    flex-wrap: wrap; margin-bottom: var(--space-2);
}
.note-ex-title { font-weight: 600; color: var(--color-text); }
.note-ex-badge {
    font-size: var(--fs-small); color: var(--color-primary-600);
    background: var(--color-primary-050); border: 1px solid var(--color-border);
    border-radius: var(--radius-pill); padding: 2px 10px;
}
.note-text {
    margin: 0 0 var(--space-3); color: var(--color-text);
    white-space: pre-wrap; word-break: break-word;
}
.note-card-foot { display: flex; justify-content: flex-end; }
.note-goto {
    font-size: var(--fs-small); font-weight: 600;
    color: var(--color-primary); text-decoration: none;
}
.note-goto:hover { color: var(--color-primary-600); }

/* «Жива» країна: місцевий час + погода */
.live-chip {
    display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    font-size: var(--fs-small); color: var(--color-text-muted);
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-pill); padding: 6px 14px;
    margin-bottom: var(--space-3); width: fit-content;
    box-shadow: var(--shadow-sm);
}
.live-chip .lc-time b { color: var(--color-text); font-family: var(--font-mono); }
.live-chip .lc-wx { font-weight: 600; color: var(--color-text); }


/* ============================================================
   ІГРОВИЙ ІНТЕРФЕЙС — спільний шар для ВСІХ сторінок (десктоп)
   Кнопки-жетони, паперові таблички, пружинні анімації.
   ============================================================ */
:root { --spring: cubic-bezier(0.34, 1.56, 0.64, 1); }

@media (min-width: 769px) {
    /* --- Шапка: прозора, елементи плавають окремо --- */
    .site-header {
        background: transparent; border: 0; box-shadow: none;
        backdrop-filter: none; -webkit-backdrop-filter: none;
        padding: 0; pointer-events: none;
    }
    .site-header > * { pointer-events: auto; }

    /* Логотип — паперова табличка на скотчі, висить трохи криво */
    .brand {
        background: var(--color-surface);
        border: 1px solid var(--color-border);
        border-radius: var(--radius-md);
        padding: 12px 20px;
        box-shadow: var(--shadow-card);
        transform: rotate(-1.6deg);
        transition: transform .3s var(--spring), box-shadow var(--dur) var(--ease);
        position: relative;
    }
    .brand::before {
        content: ""; position: absolute; top: -9px; left: 50%;
        width: 64px; height: 16px; transform: translateX(-50%) rotate(2deg);
        background: rgba(224, 138, 60, 0.30);
        border-left: 1px dashed rgba(255,255,255,0.5);
        border-right: 1px dashed rgba(255,255,255,0.5);
    }
    .brand:hover { transform: rotate(0deg) scale(1.04); box-shadow: var(--shadow-lg); }

    /* --- Навігація: паперова смужка з текстовими пунктами --- */
    .nav-links {
        gap: 2px;
        background: var(--color-surface);
        border: 1px solid var(--color-border);
        border-radius: var(--radius-pill);
        padding: 5px;
        box-shadow: var(--shadow-card);
    }
    .nav-links a {
        font-weight: 600;
        transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease),
                    transform .18s var(--spring);
    }
    .nav-links a [data-lucide] { color: var(--color-primary); transition: color var(--dur-fast) var(--ease); }
    .nav-links a:hover { transform: translateY(-1px); }
    .nav-links a:active { transform: scale(0.96); }
    .nav-links a.active [data-lucide] { color: var(--color-primary-700); }
    .nav-links a.cta [data-lucide] { color: inherit; }

    /* --- Профіль-пілюля «Вітаю, …» — та сама висота, що й нав-пілюля --- */
    /* нав: 5px паддінг + a(9px + 23.8px line-height) + 2px рамка = 53.8px;
       профіль: 10px паддінг + 32px аватар + 2px рамка = 54px (в рівень) */
    .profile-btn { padding-top: 10px; padding-bottom: 10px; padding-left: 10px; }

    /* --- Дрібні чипи поводяться як ігрові: пружина + втискання.
       (Кнопки з «печатковою» фізикою — .btn-*, .pp-postcard, .add-word-btn тощо —
       тут НЕ чіпати, інакше transform перебʼє прес.) --- */
    .chip-btn, .sidebar-close, .flat-head button {
        transition: transform .3s var(--spring), background var(--dur-fast) var(--ease),
                    border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease),
                    box-shadow .2s var(--ease);
    }
    .chip-btn:active { transform: scale(0.93); }

    /* --- Картки — фішки настільної гри --- */
    .lesson-card { transition: transform .3s var(--spring), box-shadow var(--dur) var(--ease); }
    .lesson-card:hover { transform: translateY(-5px) rotate(-0.7deg) scale(1.015); }
    /* --- Форми входу/реєстрації — записка на скотчі --- */
    .auth-form {
        position: relative; transform: rotate(-0.8deg);
        transition: transform .3s var(--spring);
    }
    .auth-form:focus-within { transform: rotate(0deg); }
    .auth-form::before {
        content: ""; position: absolute; top: -11px; left: 50%;
        width: 96px; height: 20px; transform: translateX(-50%) rotate(-2deg);
        background: rgba(143, 176, 214, 0.4);
        border-left: 1px dashed rgba(255,255,255,0.6);
        border-right: 1px dashed rgba(255,255,255,0.6);
    }

    /* --- Футер — паперова смужка, ледь крива --- */
    .site-footer { transform: rotate(-0.25deg); }

    /* --- Назад до карти (на уроці) — жетон-стрілка --- */
    .back-link a { transition: transform .3s var(--spring), background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
    .back-link a:hover { transform: translateX(-4px) scale(1.05); }
}

/* Менше анімацій для тих, хто це попросив у системі */
@media (prefers-reduced-motion: reduce) {
    .brand, .nav-links a, .nav-links a svg, .nav-links a i,
    .lesson-card, .auth-form { transition: none; transform: none; }
}

/* ============================================================
   ІГРОВІ ВНУТРІШНІ СТОРІНКИ: словник, тренування, нотатки (десктоп)
   ============================================================ */
@media (min-width: 769px) {
    /* --- Словник: колекція квитків мандрівника --- */
    .my-vocab .vocab-card {
        position: relative;
        transition: transform .3s var(--spring), box-shadow var(--dur) var(--ease);
    }
    .my-vocab .vocab-card:nth-child(odd)  { transform: rotate(-0.5deg); }
    .my-vocab .vocab-card:nth-child(even) { transform: rotate(0.45deg); }
    .my-vocab .vocab-card:hover {
        transform: rotate(0deg) translateY(-3px) scale(1.012);
        box-shadow: var(--shadow-lg);
        z-index: 1;
    }
    /* перфорація квитка по лівому краю */
    .my-vocab .vocab-card::before {
        content: ""; position: absolute; left: 10px; top: 8px; bottom: 8px; width: 0;
        border-left: 2px dashed var(--color-border);
        pointer-events: none;
    }
    /* кругла печатка «вивчено» */
    .my-vocab .vocab-card[data-status="learned"]::after {
        content: "✓ ВИВЧЕНО"; position: absolute; right: 18px; top: 14px;
        width: 74px; height: 74px; border-radius: 50%;
        border: 2.5px solid var(--color-success);
        box-shadow: inset 0 0 0 4px transparent, inset 0 0 0 5.5px var(--color-success-100);
        display: flex; align-items: center; justify-content: center;
        font-size: 10px; font-weight: 800; letter-spacing: 0.08em;
        color: var(--color-success-700);
        transform: rotate(10deg); opacity: 0.85; pointer-events: none;
        -webkit-mask-image: radial-gradient(circle at 36% 30%, black 55%, rgba(0,0,0,0.7) 100%);
                mask-image: radial-gradient(circle at 36% 30%, black 55%, rgba(0,0,0,0.7) 100%);
    }

    /* --- Тренування: акценти живого тренажера в .trn-* класах (нижче в файлі) --- */

    /* --- Нотатки: щоденник з наліпками --- */
    .note-card {
        position: relative;
        transition: transform .3s var(--spring), box-shadow var(--dur) var(--ease);
        /* лінійований папір */
        background-image: repeating-linear-gradient(
            180deg, transparent 0 27px, color-mix(in srgb, var(--ex-ink) 8%, transparent) 27px 28px); /* лінійка: teal (17,120,140) → блідий ink, у тон плюм→ink */
    }
    .note-group .note-card:nth-child(odd)  { transform: rotate(-0.6deg); }
    .note-group .note-card:nth-child(even) { transform: rotate(0.5deg); }
    .note-card:hover { transform: rotate(0deg) translateY(-3px); box-shadow: var(--shadow-lg); z-index: 1; }
    /* шматочок скотча на кожній нотатці */
    .note-card::before {
        content: ""; position: absolute; top: -9px; left: 24px;
        width: 58px; height: 16px; transform: rotate(-3deg);
        background: rgba(224, 138, 60, 0.28);
        border-left: 1px dashed rgba(255,255,255,0.55);
        border-right: 1px dashed rgba(255,255,255,0.55);
    }
    .note-card:nth-child(even)::before {
        left: auto; right: 28px; transform: rotate(2.5deg);
        background: rgba(143, 176, 214, 0.34);
    }
}

/* ============================================================
   ТЕМАТИЧНІ ФОНИ СТОРІНОК — кожна сторінка як локація гри (десктоп)
   ============================================================ */
/* (тематичний фон сторінки прибрано — усі сторінки використовують спільний фон, як карта) */

/* ============================================================
   HUD: анімації входу сторінок
   (кільце прогресу світу тепер на аватарці профілю — стилі в секції ШАПКА)
   ============================================================ */

/* Анімації входу: рухаємо ОКРЕМУ властивість translate, щоб не
   перебивати transform-нахили карток. */
@media (min-width: 769px) and (prefers-reduced-motion: no-preference) {
    @keyframes rise-in { from { translate: 0 26px; opacity: 0; } to { translate: 0 0; opacity: 1; } }
    @keyframes drop-in { from { translate: 0 -34px; opacity: 0; } to { translate: 0 0; opacity: 1; } }

    /* Нотатки падають на дошку */
    .page-notes .note-card { animation: drop-in .5s var(--spring) both; }
    /* Квитки словника та картки інших сторінок піднімаються */
    .page-vocab .my-vocab .vocab-card,
    .postcard-hero, .page-dash .dash-bento,
    .page-train .trn-board,
    .lesson-wrap .lesson-hero, .lesson-wrap .boarding-pass,
    .lesson-wrap .lesson-complete {
        animation: rise-in .5s var(--spring) both;
    }
    /* Стаґер: кожна наступна картка трохи пізніше */
    .page-notes .note-card:nth-child(2),  .my-vocab .vocab-card:nth-child(2) { animation-delay: .07s; }
    .page-notes .note-card:nth-child(3),  .my-vocab .vocab-card:nth-child(3) { animation-delay: .14s; }
    .page-notes .note-card:nth-child(4),  .my-vocab .vocab-card:nth-child(4) { animation-delay: .21s; }
    .page-notes .note-card:nth-child(5),  .my-vocab .vocab-card:nth-child(5) { animation-delay: .28s; }
    .page-notes .note-card:nth-child(6),  .my-vocab .vocab-card:nth-child(6) { animation-delay: .35s; }
    .page-notes .note-card:nth-child(n+7), .my-vocab .vocab-card:nth-child(n+7) { animation-delay: .4s; }
    /* Послідовність секцій */
    .lesson-wrap .boarding-pass { animation-delay: .12s; }
    .lesson-wrap .lesson-complete { animation-delay: var(--dur); }
    .page-dash .dash-bento { animation-delay: .12s; }
    .page-train .trn-board { animation-delay: .1s; }
    /* Штампи «проштамповуються» один за одним щоразу, коли розгортаєш обкладинку
       (сцена перегортання .pbk-stage навмисно поза .pbk-viewport — клони не стрибають) */
    @keyframes stamp-in { from { scale: 0.3; opacity: 0; } to { scale: 1; opacity: 1; } }
    .passport-book[data-open="true"] .pbk-viewport .pb-stamp { animation: stamp-in .45s var(--spring) both; animation-delay: .35s; }
    .passport-book[data-open="true"] .pbk-viewport .pb-stamp:nth-child(2) { animation-delay: .45s; }
    .passport-book[data-open="true"] .pbk-viewport .pb-stamp:nth-child(3) { animation-delay: .55s; }
    .passport-book[data-open="true"] .pbk-viewport .pb-stamp:nth-child(n+4) { animation-delay: .65s; }
}

/* ============================================================
   ГРАМАТИЧНИЙ ДОВІДНИК — «Бортовий журнал граматики»
   ============================================================ */
.grammar-layout { display: flex; gap: var(--space-6); align-items: flex-start; }
.grammar-wrap { flex: 1; min-width: 0; max-width: 820px; }
.gr-head h1 { margin-bottom: var(--space-2); }

/* Меню-зміст ліворуч */
.gr-toc { flex: 0 0 250px; position: sticky; top: 96px; }
.gr-toc-inner {
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); padding: var(--space-4);
    box-shadow: var(--shadow-card);
    max-height: calc(100vh - 120px); overflow-y: auto;
}
.gr-toc .search-box { margin-bottom: var(--space-3); }
.gr-toc .chips { margin-bottom: var(--space-3); }
.gr-toc-cat {
    font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--color-text-muted); font-weight: 700;
    margin: var(--space-3) 0 6px; padding-top: var(--space-2);
    border-top: 1px dashed var(--color-border);
}
.gr-toc-cat:first-of-type { border-top: 0; padding-top: 0; margin-top: 0; }
.gr-toc-link {
    display: flex; align-items: center; gap: 8px;
    padding: 7px 10px; border-radius: var(--radius-sm);
    color: var(--color-text); font-size: var(--fs-small); font-weight: 500;
    transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.gr-toc-link:hover { background: var(--color-primary-050); color: var(--color-primary-600); }
.gr-toc-link.active { background: var(--color-primary); color: var(--color-on-accent); }
.gtl-emoji { font-size: 1rem; }
@media (max-width: 1100px) { .gr-toc { display: none; } }

/* Тема — сторінка журналу */
.gr-topic {
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); padding: var(--space-5) var(--space-6);
    box-shadow: var(--shadow-card); margin-bottom: var(--space-5);
    position: relative;
}
.gr-topic-head {
    display: flex; align-items: center; gap: var(--space-3);
    flex-wrap: wrap; margin-bottom: var(--space-3);
}
.gr-emoji { font-size: 2rem; }
.gr-titles { flex: 1; min-width: 180px; }
.gr-titles h3 { margin: 0; font-size: 1.35rem; }
/* 3.4: номер теми в заголовку — журнальний, моно, чорнильний */
.gr-topic-num {
    font-family: var(--font-mono); font-weight: 600; font-size: 0.78em;
    color: var(--ex-ink); opacity: 0.85; margin-right: 10px;
}
.gr-titles p { margin: 0; color: var(--color-text-muted); font-size: var(--fs-small); }

/* Перемикач рівня */
.gr-level-switch {
    display: flex; gap: 4px; background: var(--color-text);   /* графітовий трек (рішення Юлі 16.07) */
    border-radius: var(--radius-pill); padding: 4px;
}
/* рецепт chip-switch у секції КНОПКИ; тут лише шрифтова специфіка */
.gr-level-switch button { font-family: var(--font-mono); font-weight: 700; font-size: var(--fs-xs); padding: 6px 13px; }

/* Таймлайн */
.gr-timeline { width: 100%; max-width: 560px; display: block; margin: var(--space-2) auto 0; }
.gr-tl-caption { text-align: center; color: var(--color-text-muted); font-size: var(--fs-small); margin: 2px 0 var(--space-3); }
.tl-axis { stroke: var(--color-border-strong); stroke-width: 2.5; }
.tl-arrow { fill: var(--color-border-strong); }
.tl-now { stroke: var(--color-secondary); stroke-width: 2; stroke-dasharray: 4 4; }
.tl-now-label { fill: var(--color-secondary-700); font-size: 12px; font-weight: 700; }
.tl-side { fill: var(--color-text-muted); font-size: 11.5px; }
.tl-dot { fill: var(--color-primary); }
.tl-dot-now { fill: var(--color-secondary); }
.tl-check { fill: var(--color-on-accent); font-size: 9px; font-weight: 700; }
.tl-band { fill: var(--color-secondary-100); stroke: var(--color-secondary); stroke-width: 1.5; stroke-dasharray: 4 4; }
.tl-link { stroke: var(--color-secondary); stroke-width: 2; stroke-dasharray: 5 5; marker-end: none; }

/* Шар-доповнення вищого рівня */
.gr-pane-add {
    border-top: 1.5px dashed var(--color-border-strong);
    margin-top: var(--space-3); padding-top: var(--space-3); position: relative;
}
.gr-pane-badge {
    position: absolute; top: -11px; left: 0;
    background: var(--color-primary-050); color: var(--color-primary-600);
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
    padding: 2px 12px; border-radius: var(--radius-pill);
    border: 1px solid var(--color-primary-100);
}

/* Зони-вставки теми (18.07, вибір Юлі «колір за змістом»): паперові панелі
   всередині білої плашки — Конструктор = крем, Сигнали = мʼята, Практика =
   лаванда-тінт (у тон квізу). Уроки — без фону. */
.gr-zone {
    border-radius: var(--radius-md);
    padding: var(--space-3) var(--space-4) var(--space-4);
    margin: var(--space-6) 0;
}
.gr-zone > :first-child { margin-top: 0; }
.gr-zone > :last-child { margin-bottom: 0; }
/* Конструктор — БЕЗ фону (Юля 18.07): не всі кольорові клітинки таблиці добре
   грають на бежевому; формули-чипи й таблиця сидять прямо на білій плашці,
   вирівняні з правилами вище (нульовий бічний паддінг). */
.gz-build { background: none; padding: 0; }
/* Сигнали — БЕЗ мʼятного блока (Юля 18.07): слова живуть pill-чипами прямо на
   білій плашці, вирівняні з рештою (нульовий бічний паддінг зони). */
.gz-signals { background: none; padding: 0; }
/* Практика — БЕЗ фону і БЕЗ роздільника «Практика» (Юля 18.07): заголовком
   слугує сам блок «Типові помилки», таблиця сидить прямо на білій плашці. */
.gz-practice { background: none; padding: 0; margin-top: var(--space-7); }
/* формули в зоні тримаються на своїх персикових чипах; сигнали/помилки — свої стилі */

/* Секції-поверхи теми (18.07): тихий mono-заголовок (без пунктирної лінії —
   Юля 18.07). Уроки лишаються таким лейблом; сигнали/помилки мають власні
   заголовки (піл / центрований підпис). */
.gr-sec {
    display: flex; align-items: center; gap: 12px;
    margin: var(--space-6) 0 var(--space-3);
}
.gr-sec span {
    flex: none;
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--color-text-muted);
}
/* без подвійного повітря: у сусіда під заголовком секції верхній маргін зайвий */
.gr-sec + .gr-signals, .gr-sec + .gr-formulas, .gr-sec + .gr-mistakes,
.gr-mistakes-slot .gr-mistakes, .gr-sec + .gr-lessons { margin-top: 0; }

/* Пояснення і приклади */
.gr-explain { margin: var(--space-3) 0; line-height: 1.65; }

/* Блок «правило → приклади» */
.gr-rule { margin: var(--space-4) 0; }
.gr-rule-title {
    display: flex; align-items: baseline; gap: 10px;
    margin: 0 0 8px; font-weight: 600; line-height: 1.45;
}
.gr-rule-num {
    flex: 0 0 22px; width: 22px; height: 22px; align-self: center;
    display: flex; align-items: center; justify-content: center;
    background: var(--color-primary); color: var(--color-on-accent);
    border-radius: 50%; font-family: var(--font-mono);
    font-size: 12px; font-weight: 700;
}
.gr-examples { list-style: none; margin: 0 0 var(--space-2); padding: 0 0 0 32px; display: flex; flex-direction: column; gap: 5px; }
.gr-examples li { position: relative; padding-left: 14px; }
/* тонка риска-буліт замість важкої плашки */
.gr-examples li::before {
    content: ""; position: absolute; left: 0; top: calc(0.85em - 1px);
    width: 7px; height: 1.5px; background: var(--color-border-strong);
}
.gr-en { font-weight: 400; }
.gr-uk { color: var(--color-text-muted); font-size: var(--fs-small); margin-left: 8px; }
/* ключова форма — просто жирним, без фону */
.gr-key { background: none; color: inherit; font-weight: 700; }
/* 3.4 «журнальність»: у прикладах ключова форма підкреслена «від руки» — чорнильна хвиляста */
/* Хвилясте підкреслення ключа — лише в повній темі (.gr-examples). У прев'ю-картці
   (.gtc-example) НЕ ставимо: line-clamp+overflow ріже його по краю (негарна крива). */
.gr-examples .gr-key {
    text-decoration-line: underline; text-decoration-style: wavy;
    text-decoration-color: var(--color-secondary); text-decoration-thickness: 1.5px;
    text-underline-offset: 3px;
}
/* у типових помилках слово-виправлення виділяється кольором */
.gm-wrong .gr-key { color: var(--color-error); font-weight: 600; }
.gm-right .gr-key { color: var(--color-success-700); }

/* Формули-конструктори (18.07, вибір Юлі «рейка + стрілка»): вирівняна таблиця
   «підпис | сегменти-чипи на рейці | → приклад». Чипи в тонкому контурі (не
   заливка), зʼєднані короткою рискою-рейкою; приклад курсивом після стрілки.
   Без підписів (.no-labels) — дві колонки. На вузьких екранах — стовпчик. */
.gr-formulas {
    display: grid; grid-template-columns: max-content max-content minmax(0, 1fr);
    gap: 12px 14px; align-items: center; margin: var(--space-3) 0;
}
.gr-formulas.no-labels { grid-template-columns: max-content minmax(0, 1fr); }
.gr-formula { display: contents; }
.gf-label {
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.07em;
    color: var(--color-text-muted);
}
.gf-train { display: inline-flex; align-items: center; flex-wrap: wrap; row-gap: 8px; }
.gf-seg {
    padding: 5px 13px;
    border: 1px solid var(--color-border-strong); border-radius: 7px;
    background: var(--color-surface);
    font-family: var(--font-mono); font-weight: 700; font-size: var(--fs-small);
    color: var(--color-text);
}
/* рейка між чипами — коротка горизонтальна риска */
.gf-seg + .gf-seg { margin-left: 16px; position: relative; }
.gf-seg + .gf-seg::before {
    content: ""; position: absolute; left: -16px; top: 50%;
    width: 16px; height: 1px; background: var(--color-border-strong);
}
.gf-example {
    font-family: var(--font-example); font-weight: 500; font-style: italic;
    color: var(--color-text-muted); font-size: var(--fs-small);
}
.gf-example::before { content: "\2192"; color: var(--color-border-strong); margin-right: 9px; }
@media (max-width: 640px) {
    .gr-formulas, .gr-formulas.no-labels { display: flex; flex-direction: column; align-items: flex-start; gap: 14px; }
    .gr-formula { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
    .gf-example::before { content: none; }   /* у стовпчику стрілка зайва */
}

/* Справжні таблиці форм (18.07, референс Юлі): колонки в тінтах палітри
   (перивінкл / персик / лаванда циклом), клітинки-плитки з повітрям між ними,
   графітовий текст. Закінчення-ключі (**-er**) — теплим персиком. */
.gr-table-title {
    margin: var(--space-3) 0 2px;
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.07em; color: var(--color-text-muted);
    text-align: center;   /* по центру — під центровану схему-таймлайн зверху */
}
/* text-align:center на обгортці центрує inline-table; при переповненні —
   overflow-x лишає горизонтальний скрол */
.gr-table-wrap { overflow-x: auto; text-align: center; }
.gr-table { display: inline-table; border-collapse: separate; border-spacing: 5px; margin: 2px 0; }
.gr-table th, .gr-table td { padding: 8px 20px; border-radius: 10px; text-align: center; }
.gr-table th {
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text);
}
.gr-table th:empty { background: transparent; }
.gr-table th:nth-child(3n+1) { background: var(--color-primary-100); }
.gr-table td:nth-child(3n+1) { background: color-mix(in srgb, var(--color-primary-050) 65%, var(--color-surface)); }
.gr-table th:nth-child(3n+2) { background: color-mix(in srgb, var(--color-secondary) 38%, var(--color-surface)); }
.gr-table td:nth-child(3n+2) { background: var(--color-secondary-100); }
.gr-table th:nth-child(3n+3) { background: var(--color-lavender); }
.gr-table td:nth-child(3n+3) { background: color-mix(in srgb, var(--color-lavender) 40%, var(--color-surface)); }
.gr-table .gr-key { background: none; color: var(--color-secondary-700); font-weight: 700; }

/* Таблиці-пояснення в УРОКАХ (блок type:"table", 22.07) — ті самі класи, що в
   довіднику, плюс модифікатор --lesson. Довідник модифікатора не має, тож
   нижче — єдина відмінність: на телефоні рядок стає карткою замість того, щоб
   ховатись у горизонтальний скрол (рішення Юлі 22.07). */
.gr-table--lesson { max-width: 100%; }
/* Четвертий тон — блідо-зелений (Юлія 22.07): у довіднику тонів три й крок 3n,
   тут крок 4n, щоб зелений діставався 4-й колонці, а не ламав трьохколонкові.
   Специфічність збігається з базовими правилами .gr-table, тож ці — нижче за
   файлом і виграють. Довідник лишається трикольоровим. */
.gr-table--lesson th:nth-child(4n+1) { background: var(--color-primary-100); }
.gr-table--lesson td:nth-child(4n+1) { background: color-mix(in srgb, var(--color-primary-050) 65%, var(--color-surface)); }
.gr-table--lesson th:nth-child(4n+2) { background: color-mix(in srgb, var(--color-secondary) 38%, var(--color-surface)); }
.gr-table--lesson td:nth-child(4n+2) { background: var(--color-secondary-100); }
.gr-table--lesson th:nth-child(4n+3) { background: var(--color-lavender); }
.gr-table--lesson td:nth-child(4n+3) { background: color-mix(in srgb, var(--color-lavender) 40%, var(--color-surface)); }
.gr-table--lesson th:nth-child(4n+4) { background: color-mix(in srgb, var(--color-success) 30%, var(--color-surface)); }
.gr-table--lesson td:nth-child(4n+4) { background: var(--color-success-100); }
/* .gr-key стилізується лише всередині .gr-table — у підписі під таблицею потрібне
   власне правило, інакше <mark> дістане браузерний жовтий фон */
.gr-table-cap .gr-key { background: none; color: var(--color-secondary-700); font-weight: 700; }
/* ++зелене++ — правильна форма в парах «неправильно → правильно» (лише уроки) */
.gr-table .gr-ok, .gr-table-cap .gr-ok { background: none; color: var(--color-success-700); font-weight: 700; }
@media (max-width: 560px) {
    .gr-table-wrap--lesson { overflow-x: visible; }
    .gr-table--lesson { display: block; border-spacing: 0; }
    .gr-table--lesson thead { display: none; }
    .gr-table--lesson tbody, .gr-table--lesson tr { display: block; }
    .gr-table--lesson tr { margin-bottom: 12px; border-radius: 12px; overflow: hidden; }
    .gr-table--lesson td {
        display: block; border-radius: 0; text-align: left; padding: 10px 16px;
    }
    /* назва колонки над клітинкою — шапки на телефоні вже нема */
    .gr-table--lesson td[data-k]::before {
        content: attr(data-k); display: block;
        font-family: var(--font-mono); font-size: 9.5px; font-weight: 700;
        text-transform: uppercase; letter-spacing: 0.1em;
        color: var(--color-text-muted); margin-bottom: 2px;
    }
}

/* Сигнальні слова */
.gr-signals { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin: var(--space-3) 0; }
/* заголовок-піл (Юля 18.07): фіолетова пігулка в тон нумерації, стоїть у ряд зі словами */
.gr-signals-pill {
    background: var(--color-primary); color: var(--color-on-accent);
    border-radius: var(--radius-pill); padding: 5px 13px;
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.05em;
}
.gr-signals-label { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-muted); font-weight: 700; }
/* Сигнали — pill-чипи (18.07): теплий «паперовий» тінт, графітовий текст,
   тонка тепла рамка. Кожне слово/вираз — окрема пігулка. */
.gr-signal {
    background: color-mix(in srgb, var(--color-bg-warm) 35%, var(--color-surface));
    border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-pill);
    padding: 5px 13px;
    font-family: inherit; font-style: normal; font-weight: 500;
    font-size: var(--fs-small); color: var(--color-text);
}

/* Типові помилки — розкривна КНОПКА-пігулка (<details>): клік → список.
   Оформлена як явний контрол (рамка + фон + chevron), а не заголовок-роздільник.
   Дефолтний маркер прибрано; chevron обертається на [open]. */
/* Типові помилки — одразу видимі (18.07): таблиця «Неправильно | Правильно».
   Пара речень поруч на семантичних тінтах (--ex-no-* рожевий / --ex-ok-* мʼятний,
   обидва AA); «чому» — тонким під парою на всю ширину рядка. Без розкриття. */
.gr-mistakes { margin: var(--space-4) 0; }
/* заголовок «Типові помилки» — центрований mono-підпис (як підпис над таблицею) */
.gr-mistakes-title {
    margin: 0 0 var(--space-3);
    font-weight: 700; color: var(--color-text);
    text-align: center;
}
.gr-mtable { display: grid; gap: var(--space-3); }
.gr-mrow {
    display: grid; grid-template-columns: 1fr 1fr;
    gap: 5px var(--space-3); align-items: stretch;
}
.gm-h {
    display: inline-flex; align-items: center; gap: 6px;
    font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.05em; padding: 0 4px;
}
.gm-h svg { width: 13px; height: 13px; }
.gm-h-wrong { color: var(--ex-no-ink); }
.gm-h-right { color: var(--ex-ok-ink); }
.gm-cell {
    padding: 10px 14px; border-radius: 12px; line-height: 1.5;
    border: 1px solid transparent;
}
.gm-wrong { background: var(--ex-no-bg); border-color: var(--ex-no-border); }
.gm-right { background: var(--ex-ok-bg); border-color: var(--ex-ok-border); font-weight: 600; }
.gm-wrong s { text-decoration-color: color-mix(in srgb, var(--ex-no-ink) 55%, transparent); }
.gm-why { grid-column: 1 / -1; margin: 0; font-size: var(--fs-small); color: var(--color-text-muted); }
/* вузькі екрани: пара стає стовпчиком (неправильне зверху, правильне під ним) */
@media (max-width: 560px) {
    .gr-mrow { grid-template-columns: 1fr; }
    .gr-mhead { display: none; }
    .gm-wrong::before { content: "Неправильно"; }
    .gm-right::before { content: "Правильно"; }
    .gm-cell::before {
        display: block; font-family: var(--font-mono); font-size: var(--fs-xs);
        font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em;
        margin-bottom: 3px;
    }
    .gm-wrong::before { color: var(--ex-no-ink); }
    .gm-right::before { color: var(--ex-ok-ink); }
}
/* мальовані іконки */
.gi { width: 18px; height: 18px; flex: 0 0 18px; align-self: center; }
.gi circle { fill: none; stroke-width: 1.6; }
.gi path { fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.gi-x circle { stroke: var(--color-error); }
.gi-x path { stroke: var(--color-error); }
.gi-check circle { stroke: var(--color-success); fill: var(--color-success-100); }
.gi-check path { stroke: var(--color-success-700); }

/* «Тренується в уроках» (Юля 18.07) — у картці теми: заголовок з двокрапкою +
   уроки-чіпи в ряди. JS ховає все, що поза 2 рядами; кнопка «усі» розгортає. */
.gr-lessons-block { margin-top: var(--space-5); }
.gr-lessons-title { margin: 0 0 var(--space-3); font-weight: 700; color: var(--color-text); }
.gr-lessons { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.gr-lesson-link {
    background: var(--color-surface); color: var(--color-primary-600);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-pill); padding: 4px 13px;
    font-weight: 500; font-size: var(--fs-small);
    transition: var(--transition);
}
.gr-lesson-link:hover { background: var(--color-primary); color: var(--color-on-accent); border-color: var(--color-primary); }
.gr-lesson-link[hidden] { display: none; }
/* Кнопка «усі» — чіп у кінці 2-го ряду (акцентна, щоб виділялась серед уроків);
   JS показує лише коли уроків більше за 2 ряди. */
.gr-lessons-all {
    font: inherit; font-size: var(--fs-small); font-weight: 600; cursor: pointer;
    background: var(--color-primary-050); color: var(--color-primary-600);
    border: 1px solid var(--color-primary-100); border-radius: var(--radius-pill);
    padding: 4px 13px; transition: var(--transition);
}
.gr-lessons-all:hover { background: var(--color-primary); color: var(--color-on-accent); border-color: var(--color-primary); }
.gr-lessons-all[hidden] { display: none; }

.gr-empty {
    text-align: center; color: var(--color-text-muted);
    background: var(--color-surface); border: 1.5px dashed var(--color-border-strong);
    border-radius: var(--radius-md); padding: var(--space-6);
}

/* «Багаж знань» на талоні — клікабельний, веде в довідник */
a.bp-v { color: var(--color-primary); text-decoration: underline dashed; text-underline-offset: 3px; }
a.bp-v:hover { color: var(--color-primary-600); }

/* Тематичний фон сторінки + плашки (десктоп) */
/* (тематичний фон сторінки прибрано — усі сторінки використовують спільний фон, як карта) */

/* ============================================================
   НАМАЛЬОВАНІ ІКОНКИ (icons.js + інлайн) — вирівнювання і кольори
   ============================================================ */
.etgw-icon, .streak svg, .bp-brand svg, .bp-plane svg, .pp-postcard svg,
.gr-lesson-link svg, .finish-postcard svg { vertical-align: -0.18em; }
.streak svg { color: var(--color-secondary-700); margin-right: 3px; }
.finish-stamp svg { width: 44px; height: 44px; color: var(--color-secondary-700); }
.mg-record svg { vertical-align: -0.2em; color: var(--color-secondary-700); }
/* Медалі стріку */
.etgw-icon.medal-bronze { color: var(--medal-bronze); }
.etgw-icon.medal-silver { color: var(--medal-silver); }
.etgw-icon.medal-gold { color: var(--medal-gold); }
/* Чипи карти: іконки в тон тексту */
.daypart-chip svg, .world-counter svg, .daily-flight svg, .live-chip svg { vertical-align: -0.2em; }
.map-celestial svg { color: var(--celestial-sun); filter: drop-shadow(0 0 10px rgba(255, 220, 130, 0.9)); }
.map-celestial[data-part="night"] svg { color: var(--celestial-moon); filter: drop-shadow(0 0 12px rgba(180, 205, 255, 0.95)); }

/* ============================================================
   СКРОЛБАРИ — тонкі, у палітрі паперу (замість системних)
   ============================================================ */
/* Firefox */
* { scrollbar-width: thin; scrollbar-color: rgba(140, 120, 90, 0.45) transparent; }

/* WebKit (Chrome/Safari/Edge) */
::-webkit-scrollbar { width: 11px; height: 11px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
    background: rgba(140, 120, 90, 0.45);            /* теплий «паперовий» тон */
    border-radius: 99px;
    border: 3px solid transparent;                    /* повітря навколо смужки */
    background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover {
    background-color: var(--color-primary);
    background-clip: padding-box;
}
::-webkit-scrollbar-thumb:active {
    background-color: var(--color-primary-600);
    background-clip: padding-box;
}
::-webkit-scrollbar-corner { background: transparent; }

/* У панелях зі своїм скролом (зміст граматики, панель країни) — ще тонше */
.gr-toc-inner::-webkit-scrollbar,
.sidebar-scroll::-webkit-scrollbar,
.flat-results::-webkit-scrollbar { width: 8px; }
.gr-toc-inner, .sidebar-scroll, .flat-results {
    scrollbar-color: rgba(140, 120, 90, 0.35) transparent;
}

/* ============================================================
   ПЕРЕЛІТ МІЖ СТОРІНКАМИ: хмари + літак
   ============================================================ */
.flight-transition {
    position: fixed; inset: 0; z-index: 4000; pointer-events: none;
    overflow: hidden;
}
/* Половинки неба з пухнастим краєм із «куп» хмар */
.ft-cloud {
    position: absolute; top: -10%; bottom: -10%; width: 78%;
    background: linear-gradient(105deg, var(--postcard-paper) 70%, var(--postcard-shade) 100%);
    filter: drop-shadow(0 0 30px rgba(255,255,255,0.9));
    transition: transform 0.8s cubic-bezier(0.6, 0, 0.3, 1);
}
/* Внутрішні (стичні) краї — майже прямі: вертикальні радіуси ≤8% ховаються
   за межу екрана (хмари виходять на 10% зверху/знизу), тож стуляються без просвіту.
   Зовнішні краї лишаються округлими — вони поза екраном, дають форму «банки» хмар. */
.ft-cloud-left  { left: 0;  transform: translateX(-105%); border-radius: 0 48% 52% 0 / 0 8% 8% 0; }
.ft-cloud-right { right: 0; transform: translateX(105%);  border-radius: 46% 0 0 54% / 8% 0 0 8%; }
/* пухнаста кромка: великі мʼякі «купи» */
.ft-cloud::after {
    content: ""; position: absolute; top: 0; bottom: 0; width: 220px;
    background:
        radial-gradient(circle at 50% 8%,  var(--postcard-paper) 78px, transparent 80px),
        radial-gradient(circle at 30% 26%, var(--postcard-paper) 95px, transparent 97px),
        radial-gradient(circle at 55% 46%, var(--postcard-paper) 85px, transparent 87px),
        radial-gradient(circle at 28% 66%, var(--postcard-paper) 100px, transparent 102px),
        radial-gradient(circle at 52% 88%, var(--postcard-paper) 82px, transparent 84px);
}
.ft-cloud-left::after  { right: -110px; }
.ft-cloud-right::after { left: -110px; transform: scaleX(-1); }

/* Хмари сходяться (відліт) */
.ft-closing .ft-cloud-left  { transform: translateX(-22%); }
.ft-closing .ft-cloud-right { transform: translateX(22%); }
/* Початковий стан «зімкнуто» (приліт) — без анімації */
.ft-closed .ft-cloud { transition: none; }
.ft-closed .ft-cloud-left  { transform: translateX(-22%); }
.ft-closed .ft-cloud-right { transform: translateX(22%); }
/* Хмари розходяться (приліт) */
.ft-opening .ft-cloud { transition: transform 0.9s cubic-bezier(0.7, 0, 0.45, 1) var(--dur-fast); }
.ft-opening .ft-cloud-left  { transform: translateX(-105%); }
.ft-opening .ft-cloud-right { transform: translateX(105%); }

/* Літак перелітає екран по пологій дузі */
.ft-plane {
    position: absolute; top: 50%; left: -90px;
    width: 74px; height: 58px; color: var(--color-primary);
    filter: drop-shadow(0 4px 8px rgba(54, 50, 66, 0.3));
    opacity: 0;
}
.ft-plane path { fill: currentColor; stroke: var(--color-surface); stroke-width: 0.9; }
.ft-closing .ft-plane { animation: ft-fly 0.95s cubic-bezier(0.45, 0, 0.6, 1) 0.1s forwards; }
.ft-opening .ft-plane { animation: ft-fly 0.95s cubic-bezier(0.45, 0, 0.6, 1) forwards; }
@keyframes ft-fly {
    0%   { opacity: 0; transform: translate(0, 30px) rotate(8deg); }
    12%  { opacity: 1; }
    50%  { transform: translate(55vw, -36px) rotate(-6deg); }
    88%  { opacity: 1; }
    100% { opacity: 0; transform: translate(115vw, 10px) rotate(5deg); }
}

/* ============================================================
   ПАСПОРТНИЙ КОНТРОЛЬ — сторінки входу і реєстрації
   ============================================================ */
/* Auth-колонка на плашці (вердикт Юлі 17.07): рецепт page-board — muted-текст
   (.auth-lead/.auth-switch) не стоїть голим на градієнті (був 1.64…4.66;
   на кремі плашки muted = 4.6, AA). Форма лишається білою карткою всередині. */
.page-auth .auth-wrap {
    max-width: 430px;
    background: var(--color-bg); border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-lg);
    padding: clamp(20px, 3vw, 34px);
}
/* Табличка будки: темна, з золотим тисненням (як обкладинка паспорта) */
.booth-sign {
    background: linear-gradient(150deg, var(--hero-grad-from) 0%, var(--color-primary) 60%, var(--hero-grad-to) 100%);
    color: var(--color-on-hero); text-align: center;
    border-radius: var(--radius-md);
    padding: 14px 18px 12px;
    box-shadow: var(--shadow-card), inset 0 0 0 2px rgba(243, 228, 194, 0.35);
    margin-bottom: var(--space-5);
    transform: rotate(-0.6deg);
}
.bs-line { display: block; font-family: var(--font-head); letter-spacing: 0.3em; font-weight: 700; font-size: 1.05rem; }
.bs-sub { display: block; font-size: var(--fs-xs); letter-spacing: 0.14em; text-transform: uppercase; opacity: 0.75; margin-top: 3px; }
.auth-title { margin-bottom: var(--space-1); }
.auth-lead { margin: 0 0 var(--space-4); color: var(--color-text-muted); }
/* Поля — читабельна анкета: суцільні межі, білий фон, лейбли крупніші (2.5).
   Dashed-естетику лишаємо декору (booth-sign, лінія маршруту), не полям. */
.page-auth .auth-form .af-label {
    display: block; font-family: var(--font-mono); font-size: var(--fs-small);
    text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--color-text-muted); font-weight: 700; margin-bottom: 4px;
}
.page-auth .auth-form input {
    border-style: solid; border-color: var(--color-border-strong); background: var(--color-surface);
}

/* Штамп «ПРОПУЩЕНО» при сабміті */
.auth-stamp-fx {
    position: fixed; inset: 0; z-index: 3000; pointer-events: none;
    display: flex; align-items: center; justify-content: center;
}
.auth-stamp-fx .passport-stamp { margin: 0; animation-delay: 0s; }

/* ============================================================
   АЛЬБОМ ЛИСТІВОК (поп-ап «Мого профілю»)
   ============================================================ */
/* Прев'ю сувенірів у плитці (19.07): 3 найсвіжіші зароблені в один ряд */
.sv-preview { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-3); }
.sv-mini { display: flex; flex-direction: column; align-items: center; gap: 6px; text-align: center; padding: 8px 6px; border-radius: 14px; background: var(--souvenir-paper-1); }
.sv-mini .souvenir-emoji { width: 100%; height: 84px; }
.sv-mini-name { font-size: var(--fs-xs); color: var(--color-text-muted); line-height: 1.2; }
/* Порожній стан плитки сувенірів */
.sv-empty { padding: var(--space-3) 0 var(--space-2); }
.sv-empty-t { margin: 0 0 4px; font-family: var(--font-head); font-weight: 700; font-size: 1.05rem; color: var(--color-text); }
.sv-empty-d { margin: 0; font-size: var(--fs-small); color: var(--color-text-muted); line-height: 1.5; }
.sv-empty-d b { color: var(--color-text); }

/* Візи — сторінки в кінці паспорт-книжки (19.07): 1 віза на сторінку */
.pbk-page-visa .pbk-leaf { display: flex; flex-direction: column; }
.pb-visas { flex: 1; display: flex; align-items: center; justify-content: center; margin-top: var(--space-4); }
.pb-visas .visa-card { width: 100%; max-width: 380px; margin: 0; }
.pb-visa-empty { flex: 1; display: flex; flex-direction: column; justify-content: center; text-align: center; padding: var(--space-5) var(--space-3); }
.pb-visa-empty-t { margin: 0 0 6px; font-family: var(--font-head); font-weight: 700; font-size: 1.1rem; color: var(--color-text); }
.pb-visa-empty-d { margin: 0; font-size: var(--fs-small); color: var(--color-text-muted); line-height: 1.5; }
.pb-visa-empty-d b { color: var(--color-text); }

.album-grid {
    display: grid; grid-template-columns: repeat(auto-fill, minmax(min(230px, 100%), 1fr));
    gap: var(--space-4);
}
.album-card {
    margin: 0; cursor: pointer; text-align: center;
    transition: transform .3s var(--spring, ease);
}
.album-card:nth-child(odd) { transform: rotate(-1.2deg); }
.album-card:nth-child(even) { transform: rotate(1deg); }
.album-card:hover { transform: rotate(0) translateY(-3px) scale(1.03); z-index: 1; position: relative; }
.album-card canvas {
    width: 100%; height: auto; display: block;
    border: 5px solid var(--color-surface); border-radius: 4px;
    box-shadow: var(--shadow-card);
}
.album-card figcaption {
    margin-top: 6px; font-size: var(--fs-xs); color: var(--color-text-muted);
    background: rgba(255,255,255,0.85); display: inline-block;
    padding: 2px 10px; border-radius: var(--radius-pill);
}

/* ============================================================
   ТОП ШТУРМАНІВ (дешборд)
   ============================================================ */
.navigators { margin-bottom: var(--space-6); }
.nav-hint { font-size: var(--fs-small); color: var(--color-text-muted); font-weight: 400; font-family: var(--font-body); }
/* Дошка рекордів без білої коробки — рядки на дашед-лініях (бортжурнал) */
.navigators-list { list-style: none; margin: 0; padding: 0 2px; }
.nav-row {
    display: flex; align-items: center; gap: var(--space-3);
    padding: 9px 0; border-bottom: 1px dashed var(--color-border);
}
.nav-row:last-child { border-bottom: 0; }
.nav-medal {
    flex: 0 0 26px; display: inline-flex; align-items: center; justify-content: center;
    font-family: var(--font-mono); font-weight: 700; color: var(--color-text-muted);
}
.nav-place-1 .nav-medal { color: var(--medal-gold); }
.nav-place-2 .nav-medal { color: var(--medal-silver); }
.nav-place-3 .nav-medal { color: var(--medal-bronze); }
.nav-name { flex: 1; font-weight: 600; }
.nav-place-1 .nav-name { font-family: var(--font-head); font-size: 1.05rem; }
.nav-score { font-family: var(--font-mono); font-weight: 700; color: var(--color-primary); }

/* ============================================================
   АКЦЕНТИ СВІТУ — перемикач голосу озвучення
   ============================================================ */
.accent-switcher {
    display: inline-flex; align-items: center; gap: 6px;
    background: var(--color-surface); border: 1px solid var(--color-border);   /* світлий контейнер (вибір Юлі) */
    border-radius: var(--radius-pill); padding: 5px 10px 5px 14px;
    box-shadow: var(--shadow-sm); margin: var(--space-2) 0;
}
.as-label { font-size: var(--fs-xs); color: var(--color-text-muted); font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; }
/* .as-btn — рецепт chip-switch у секції КНОПКИ; тут лише специфіка вмісту */
.as-btn { padding: 4px 10px; }
.as-btn.active .as-cc { color: var(--color-on-accent); }   /* білий на перивінкл-заливці */
.as-cc { font-family: var(--font-mono); font-weight: 700; font-size: var(--fs-xs); color: var(--color-text-muted); }
.as-fallback { opacity: 0.55; }
.block-vocabulary .accent-switcher { margin-bottom: var(--space-3); }

/* ============================================================
   ТРЕНАЖЕР ВИМОВИ — кнопка-мікрофон і панель результату
   ============================================================ */
.pron-btn {
    font: inherit; cursor: pointer; vertical-align: middle;
    background: transparent; border: 1.5px solid var(--color-border-strong);
    color: var(--color-text-muted); border-radius: 50%;
    width: 26px; height: 26px; padding: 0; margin-left: 4px;
    display: inline-flex; align-items: center; justify-content: center;
    transition: transform .3s var(--spring, ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.pron-btn:hover { border-color: var(--color-secondary); color: var(--color-secondary-700); transform: scale(1.12); }
.pron-btn.pr-recording {
    border-color: var(--color-error); color: var(--color-error);
    animation: pr-pulse 1.1s ease-in-out infinite;
}
@keyframes pr-pulse {
    0%, 100% { box-shadow: 0 0 0 0 rgba(194, 97, 63, 0.45); }
    50% { box-shadow: 0 0 0 7px rgba(194, 97, 63, 0); }
}
.pr-panel {
    display: inline-flex; align-items: center; gap: 8px;
    margin-left: 8px; padding: 3px 12px;
    background: var(--color-bg-warm); border: 1px dashed var(--color-border-strong);
    border-radius: var(--radius-pill); font-size: var(--fs-small);
}
.pr-status { color: var(--color-text-muted); }
.pr-good { color: var(--color-success-700); font-weight: 700; display: inline-flex; align-items: center; gap: 5px; }
.pr-hit { color: var(--color-success-700); font-weight: 600; }
.pr-miss { color: var(--color-error); text-decoration: underline dotted; text-underline-offset: 3px; }
.pr-again {
    font: inherit; font-size: var(--fs-xs); font-weight: 700; cursor: pointer;
    background: var(--color-surface); border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-pill); padding: 2px 10px;
}
.pr-again:hover { border-color: var(--color-primary); color: var(--color-primary); }

/* Чип «Перепакуй валізу» — над рейсом дня */
.suitcase-chip {
    position: absolute; left: 50%; bottom: 64px; transform: translateX(-50%);
    z-index: 5; font: inherit; font-size: var(--fs-small); font-weight: 600; cursor: pointer;
    background: var(--color-surface); border: 1.5px solid var(--color-secondary);
    color: var(--color-secondary-700); border-radius: var(--radius-pill);
    padding: 8px 18px; box-shadow: var(--shadow-card);
    transition: transform .3s var(--spring, ease), box-shadow var(--dur) var(--ease);
    animation: suitcase-wiggle 4s ease-in-out infinite;
}
.suitcase-chip:hover { transform: translateX(-50%) translateY(-2px) scale(1.05); box-shadow: var(--shadow-lg); }
@keyframes suitcase-wiggle {
    0%, 88%, 100% { rotate: 0deg; }
    92% { rotate: -1.6deg; }
    96% { rotate: 1.4deg; }
}
@media (prefers-reduced-motion: reduce) { .suitcase-chip { animation: none; } }
.map-game-on .suitcase-chip { display: none; }
.dash-due {
    font-size: var(--fs-small); color: var(--color-secondary-700);
    background: var(--color-secondary-100); border-radius: var(--radius-sm);
    padding: 6px 10px; margin: 0 0 var(--space-3);
}
.dash-due a { font-weight: 700; color: var(--color-secondary-700); text-decoration: underline; }
.dash-due svg { vertical-align: -0.18em; }

/* ============================================================
   ВІЗИ КРАЇН (паспорт)
   ============================================================ */
.visas { margin-top: var(--space-6); }
.visa-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(340px, 100%), 1fr)); gap: var(--space-5); }
.visa-card {
    position: relative; overflow: hidden;
    background:
        repeating-radial-gradient(circle at 30% 20%, transparent 0 9px, color-mix(in srgb, var(--color-primary) 4.5%, transparent) 9px 10px),
        repeating-radial-gradient(circle at 75% 80%, transparent 0 11px, rgba(224, 138, 60, 0.05) 11px 12px),
        linear-gradient(160deg, var(--visa-paper-1), var(--visa-paper-2));
    border: 1px solid var(--color-border-strong);
    border-radius: var(--radius-md); padding: var(--space-4) var(--space-5);
    box-shadow: var(--shadow-card);
}
/* голограма-стрічка з переливом */
.visa-holo {
    position: absolute; top: 0; bottom: 0; right: 22px; width: 34px;
    background: linear-gradient(165deg,
        rgba(140, 200, 220, 0.35), rgba(230, 180, 220, 0.3),
        rgba(170, 220, 170, 0.3), rgba(250, 220, 150, 0.35), rgba(140, 200, 220, 0.35));
    background-size: 100% 300%;
    mix-blend-mode: multiply;
}
@media (prefers-reduced-motion: no-preference) {
    .visa-holo { animation: holo-shift 6s ease-in-out infinite alternate; }
    @keyframes holo-shift { from { background-position: 0 0%; } to { background-position: 0 100%; } }
}
.visa-head {
    display: flex; justify-content: space-between; align-items: baseline;
    border-bottom: 1px solid var(--color-border-strong);
    padding-bottom: 6px; margin-bottom: var(--space-3);
}
.visa-brand { font-size: var(--fs-xs); font-weight: 700; letter-spacing: 0.08em; color: var(--color-primary); }
.visa-brand svg { vertical-align: -0.15em; }
.visa-type { font-family: var(--font-mono); font-size: var(--fs-xs); font-weight: 700; letter-spacing: 0.22em; color: var(--color-secondary-700); }
.visa-main { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-3); }
.visa-flag { font-size: 2.2rem; }
.visa-country strong { display: block; font-family: var(--font-head); font-size: 1.3rem; letter-spacing: 0.06em; }
.visa-country span { font-size: var(--fs-xs); color: var(--color-text-muted); }
.visa-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 6px var(--space-4); margin: 0 0 var(--space-3); }
.visa-fields div { display: flex; flex-direction: column; }
.visa-fields dt { font-size: 9px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--color-text-muted); font-weight: 700; }
.visa-fields dd { margin: 0; font-family: var(--font-mono); font-size: var(--fs-small); font-weight: 600; }
.visa-mrz {
    margin: 0; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.08em;
    color: var(--color-text); opacity: 0.75;
    border-top: 1px dashed var(--color-border-strong); padding-top: 7px;
    overflow: hidden; white-space: nowrap;
}

/* ============================================================
   РОЗМОВНІ МІСІЇ — діалоговий квест
   ============================================================ */
.mission-wrap { max-width: 680px; margin: 0 auto; }
.mission-head { margin-bottom: var(--space-5); }
.mission-badge {
    display: inline-flex; align-items: center; gap: 6px;
    background: var(--color-secondary-100); color: var(--color-secondary-700);
    border: 1px solid var(--color-secondary); border-radius: var(--radius-pill);
    padding: 4px 14px; font-size: var(--fs-xs); font-weight: 700;
    text-transform: uppercase; letter-spacing: 0.07em;
}
.mission-head h1 {
    margin: var(--space-3) 0 var(--space-2);
    display: inline-block; background: var(--color-surface);
    padding: 10px 22px; border-radius: var(--radius-md);
    box-shadow: var(--shadow-card); transform: rotate(-0.6deg);
}
.mission-intro {
    display: inline-block; background: rgba(255,255,255,0.92);
    padding: 8px 16px; border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm); color: var(--color-text-muted); max-width: 560px;
}
.dialogue { display: flex; flex-direction: column; gap: var(--space-3); margin-bottom: var(--space-4); }
.msg { max-width: 86%; padding: 12px 16px; border-radius: var(--radius-md); box-shadow: var(--shadow-sm); animation: msg-in .35s var(--spring, ease) both; }
@keyframes msg-in { from { translate: 0 12px; opacity: 0; } to { translate: 0 0; opacity: 1; } }
.msg-npc { align-self: flex-start; background: var(--color-surface); border: 1px solid var(--color-border); border-bottom-left-radius: 4px; }
.msg-user { align-self: flex-end; background: var(--color-primary); color: var(--color-on-accent); border-bottom-right-radius: 4px; }
.msg-author { display: block; font-size: var(--fs-xs); font-weight: 700; color: var(--color-secondary-700); margin-bottom: 3px; }
.msg-text { margin: 0; font-weight: 500; }
.msg-uk { margin: 4px 0 0; font-size: var(--fs-small); color: var(--color-text-muted); }
.msg .speak-btn {
    border: 0; background: none; cursor: pointer; color: var(--color-primary);
    padding: 0 2px; vertical-align: -1px;
}
.msg-tip {
    align-self: center; max-width: 92%;
    background: var(--color-bg-warm); border: 1.5px dashed var(--color-border-strong);
    color: var(--color-text-muted); font-size: var(--fs-small);
}
.options { display: flex; flex-direction: column; gap: 9px; padding-bottom: var(--space-7); }
.opt-btn {
    font: inherit; text-align: left; cursor: pointer;
    background: var(--color-surface); border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-md); padding: 12px 16px;
    box-shadow: var(--shadow-sm);
    transition: transform .3s var(--spring, ease), border-color var(--dur-fast) var(--ease);
}
.opt-btn:hover { border-color: var(--color-primary); transform: translateY(-2px) scale(1.01); }
.mission-finish {
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); padding: var(--space-5) var(--space-6);
    box-shadow: var(--shadow-lg); animation: msg-in .4s var(--spring, ease) both;
}
.mission-finish h2 { margin: 0 0 var(--space-2); display: flex; align-items: center; gap: 8px; color: var(--color-success-700); }
.mf-note { margin: 0 0 var(--space-3); color: var(--color-text-muted); }
.mf-label { font-weight: 700; font-size: var(--fs-small); margin: 0 0 var(--space-2); }
.mf-phrases { list-style: none; margin: 0 0 var(--space-4); padding: 0; display: flex; flex-direction: column; gap: 6px; }
.mf-phrases li {
    display: flex; align-items: center; justify-content: space-between; gap: 10px;
    background: var(--color-primary-050); border-radius: var(--radius-sm); padding: 8px 12px;
}
.mf-phrases .speak-btn { border: 0; background: none; cursor: pointer; color: var(--color-primary); }
.mf-actions { display: flex; gap: var(--space-3); flex-wrap: wrap; }

/* Картка розмовної місії в панелі країни */
.mission-card {
    display: flex; flex-direction: column; gap: 5px;
    background: linear-gradient(150deg, var(--mission-paper-1), var(--mission-paper-2));
    border: 1.5px solid var(--color-secondary); border-radius: var(--radius-md);
    padding: var(--space-3) var(--space-4); margin-bottom: var(--space-4);
    color: var(--color-text); box-shadow: var(--shadow-card);
    transition: transform .3s var(--spring, ease), box-shadow var(--dur) var(--ease);
}
.mission-card:hover { transform: translateY(-3px) rotate(-0.5deg) scale(1.015); box-shadow: var(--shadow-lg); }
.mc-badge {
    display: inline-flex; align-items: center; gap: 5px;
    font-size: var(--fs-xs); font-weight: 700; text-transform: uppercase;
    letter-spacing: 0.07em; color: var(--color-secondary-700);
}
.mission-card strong { font-family: var(--font-head); font-size: 1.08rem; }
.mc-cta { font-size: var(--fs-small); font-weight: 700; color: var(--color-secondary-700); }

/* ============================================================
   ЄДИНИЙ ШАБЛОН СТОРІНКИ
   Плашка-заголовок (як тулбар на карті) + єдиний «матеріал» картки.
   Канон картки: білий фон, radius-lg, м'яка тінь, тонка рамка.
   ============================================================ */
.page-header {
    display: flex; align-items: center; justify-content: space-between;
    gap: var(--space-4); flex-wrap: wrap;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-card);
    padding: var(--space-4) var(--space-5); margin-bottom: var(--space-5);
}
.page-header .ph-titles { min-width: 0; }
/* Скидаємо тематичні «папірці/нашивки» зі заголовка всередині плашки,
   щоб не було «плашки в плашці» (теми сторінок стилізують будь-який h1). */
.page-header h1 {
    margin: 0; font-size: var(--fs-h2);
    background: none; padding: 0; box-shadow: none; border-radius: 0;
    transform: none; display: block; position: static;
}
.page-header .ph-sub {
    margin: 4px 0 0; color: var(--color-text-muted); font-size: var(--fs-small);
    background: none; padding: 0; box-shadow: none; transform: none; display: block;
}
.page-header .ph-actions { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }

/* Єдиний матеріал картки: однаковий радіус і тінь, що й тулбар карти/вправи */
.vocab-card,
.progress-card, .lesson-card, .map-toolbar {
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-card);
}

/* ============================================================
   ГРАМАТИЧНИЙ ДОВІДНИК — навігація (групи → підтеми → тема)
   ============================================================ */
.gr-app { max-width: var(--w-wide); margin: 0 auto; }

/* Липка панель: назад + пошук */
.gr-bar {
    position: sticky; top: var(--space-3); z-index: 20;
    display: flex; align-items: center; gap: var(--space-3);
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-card);
    padding: var(--space-3) var(--space-4); margin-bottom: var(--space-5);
}
.gr-back {
    display: inline-flex; align-items: center; gap: 6px; flex: none;
    font: inherit; font-weight: 600; font-size: var(--fs-small);
    color: var(--color-text); background: var(--color-surface);
    border: 1.5px solid var(--color-border-strong); border-radius: var(--radius-pill);
    padding: 8px 14px 8px 10px; cursor: pointer; transition: var(--transition);
}
.gr-back:hover { border-color: var(--color-primary); color: var(--color-primary); }
/* display:inline-flex вище перебиває атрибут hidden — повертаємо його дію
   (без цього «Назад» видно й на головному екрані розділу). */
.gr-back[hidden] { display: none; }
.gr-bar .gr-search-box { flex: 1 1 auto; position: relative; }
.gr-bar .gr-search-box svg { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); color: var(--color-text-muted); }
.gr-bar .gr-search-box input {
    width: 100%; box-sizing: border-box; font: inherit; font-size: var(--fs-small);
    padding: 11px 14px 11px 40px; border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-pill); background: var(--color-surface);
}
.gr-bar .gr-search-box input:focus { outline: none; border-color: var(--color-primary); }

/* Головна: бенто розділів — скло (замість білих коробок) + кольоровий акцент і
   SVG-гліф на розділ + плитка-герой (найбільший розділ ширша й вища). Колір акценту
   --cat: цикл із 5 (perivinkl/індиго/персик/мʼята/слейт) по DOM-нумерації розділів;
   у текст не йде (лише гліф + ліва смуга) — контраст не залежить від тону. */
.gr-cat-grid {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    grid-auto-flow: dense; grid-auto-rows: 1fr; gap: var(--space-4);
}
.gr-cat-card {
    position: relative; display: flex; align-items: center; gap: var(--space-3);
    text-align: left; font: inherit; cursor: pointer; overflow: hidden;
    background: color-mix(in srgb, var(--color-surface) 82%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    border: 0; border-radius: var(--radius-lg);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    padding: var(--space-4) var(--space-5);
    transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
    --cat: var(--color-primary);
}
.gr-cat-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-lg); }
/* колір-цикл (5) за DOM-порядком розділів */
.gr-cat-card:nth-child(5n+1) { --cat: var(--color-primary); }
.gr-cat-card:nth-child(5n+2) { --cat: var(--color-ink); }
.gr-cat-card:nth-child(5n+3) { --cat: var(--color-secondary-600); }
.gr-cat-card:nth-child(5n+4) { --cat: var(--color-success-600); }
.gr-cat-card:nth-child(5n+5) { --cat: var(--gloss-ink); }
/* іконка розділу — у кольорі акценту, на мʼякому тінті */
.gcat-ico-wrap {
    flex: none; width: 46px; height: 46px; border-radius: 13px;
    display: flex; align-items: center; justify-content: center;
    color: var(--cat); background: color-mix(in srgb, var(--cat) 12%, transparent);
}
/* номер розділу — тиха моно-марка у куті (журнальність) */
.gr-cat-num {
    position: absolute; top: 10px; right: 12px;
    font-family: var(--font-mono); font-weight: 600; font-size: var(--fs-xs);
    color: var(--color-text-muted); opacity: 0.7; letter-spacing: 0.02em;
}
.gr-cat-body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.gr-cat-name { font-family: var(--font-head); font-weight: 700; font-size: 1.1rem; color: var(--color-text); }
.gr-cat-count { font-size: var(--fs-small); color: var(--color-text-muted); }
.gr-cat-go { flex: none; color: var(--color-text-muted); font-weight: 700; font-size: 1.1rem; }
@media (max-width: 720px) { .gr-cat-grid { grid-template-columns: 1fr; } }

/* [hidden] має перемагати display:flex карток і секцій */
.gr-view[hidden], .gr-topic-card[hidden], .gr-cat-card[hidden] { display: none !important; }

/* Список підтем */
.gr-list-title { font-family: var(--font-head); margin: 0 0 var(--space-4); font-size: var(--fs-h2); }
.gr-topic-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr)); gap: var(--space-3); }
.gr-topic-card {
    display: flex; flex-direction: column; gap: 3px; text-align: left;
    font: inherit; cursor: pointer;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
    padding: var(--space-4); transition: var(--transition);
}
.gr-topic-card:hover { transform: translateY(-2px); border-color: var(--color-primary); box-shadow: var(--shadow-card); }
.gtc-num { font-family: var(--font-mono); font-weight: 600; font-size: 11px; color: var(--ex-ink); opacity: 0.8; }
.gtc-en { font-family: var(--font-head); font-weight: 700; color: var(--color-text); }
.gtc-uk { font-size: var(--fs-small); color: var(--color-text-muted); }
/* 3.4: приклад-речення прямо на картці теми — Fraunces italic, максимум 2 рядки */
.gtc-example {
    font-family: var(--font-example); font-weight: 500; font-style: italic;
    font-size: var(--fs-small); color: var(--color-text-muted);
    margin-top: 4px; line-height: 1.45;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.gtc-levels { display: flex; gap: 4px; margin-top: 6px; flex-wrap: wrap; }
.gtc-lvl {
    font-size: 11px; font-weight: 700; font-family: var(--font-mono);
    color: var(--color-primary); background: var(--color-primary-050);
    border-radius: var(--radius-pill); padding: 2px 8px;
}

/* Тема на цілий екран — показуємо лише активну; ширина = .gr-app (як бар/списки),
   а не вужчий 860px-кап (запит Юлі 18.07: плашка теми на всю ширину, як усюди) */
#gr-view-detail { margin: 0 auto; }
#gr-view-detail .gr-topic { display: none; }
#gr-view-detail .gr-topic.gr-active { display: block; }
/* Блок уроків — сусід теми (поза .gr-topic, на градієнті); ховається/показується
   разом з активною темою (JS-toggle .gr-active її не чіпає — беремо сусідній +) */
#gr-view-detail .gr-lessons-block { display: none; }
#gr-view-detail .gr-topic.gr-active + .gr-lessons-block { display: block; }

/* ===== Плашка «доступ не активований» (карта для неоплачених) ===== */
.access-locked-bar {
    display: flex; align-items: center; gap: var(--space-3);
    max-width: var(--w-wide); margin: 0 auto var(--space-4);
    background: var(--amber-bg); border: 1px solid var(--amber-border); border-left: 4px solid var(--amber-strong);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-card);
    padding: var(--space-3) var(--space-4); color: var(--amber-ink);
}
.access-locked-bar i, .access-locked-bar svg { flex: none; width: 22px; height: 22px; color: var(--amber-ico); }
.access-locked-bar .alb-text { display: flex; flex-direction: column; gap: 2px; }
.access-locked-bar .alb-text strong { font-size: 1rem; color: var(--amber-ink-strong); }
.access-locked-bar .alb-text span { font-size: var(--fs-small); }
.access-locked-bar.alb-flash { animation: alb-pulse 0.6s ease 2; }
@keyframes alb-pulse {
    0%, 100% { box-shadow: var(--shadow-card); }
    50% { box-shadow: 0 0 0 4px rgba(224, 168, 80, 0.45); }
}

/* ===== Бейджі статусу доступу (admin/users.php) ===== */
.badge-admin, .badge-access {
    display: inline-block; font-size: 12px; font-weight: 700;
    padding: 3px 10px; border-radius: var(--radius-pill);
}
.badge-admin { background: color-mix(in srgb, var(--ex-ink) 12%, transparent); color: var(--ex-ink); }
.badge-access.on  { background: var(--badge-on-bg); color: var(--color-success-700); } /* 600 давав 3.63 на тінті — нижче AA */
.badge-access.off { background: var(--badge-off-bg); color: var(--ex-no-ink); }
.admin-table .muted { color: var(--color-text-muted); }

/* ===== Поп-ап «потрібна активація доступу» ===== */
.alb-btn {
    margin-left: auto; flex: none; font: inherit; font-size: var(--fs-small); font-weight: 700;
    color: var(--amber-ink); background: var(--color-surface); border: 1.5px solid var(--amber-strong);
    border-radius: var(--radius-pill); padding: 6px 14px; cursor: pointer; transition: var(--transition);
}
.alb-btn:hover { background: var(--amber-hover); }

.access-modal-overlay {
    position: fixed; inset: 0; z-index: var(--z-modal);   /* був 300 — модалка мусить накривати таб-бар */
    display: flex; align-items: center; justify-content: center; padding: var(--space-4);
    background: color-mix(in srgb, var(--color-text) 45%, transparent); backdrop-filter: blur(4px); /* канон оверлея 17.07 */
    animation: am-fade 0.2s ease;
}
@keyframes am-fade { from { opacity: 0; } to { opacity: 1; } }
.access-modal {
    position: relative; width: 100%; max-width: 460px;
    background: var(--color-surface); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-modal); padding: var(--space-6) var(--space-5) var(--space-5);
    text-align: center; animation: am-pop 0.25s var(--ease);
}
@keyframes am-pop { from { transform: translateY(12px) scale(0.97); opacity: 0; } to { transform: none; opacity: 1; } }
.am-close {
    position: absolute; top: 10px; right: 12px; width: 34px; height: 34px;
    font-size: 22px; line-height: 1; color: var(--color-text-muted);
    background: none; border: none; border-radius: 50%; cursor: pointer;
}
.am-close:hover { background: var(--color-bg); color: var(--color-text); }
.am-icon {
    width: 56px; height: 56px; margin: 0 auto var(--space-3);
    display: flex; align-items: center; justify-content: center;
    background: color-mix(in srgb, var(--ex-ink) 10%, transparent); color: var(--ex-ink); border-radius: 50%;
}
.am-icon svg, .am-icon i { width: 28px; height: 28px; }
.access-modal h2 { font-family: var(--font-head); margin: 0 0 var(--space-3); font-size: 1.4rem; }
.am-lead { color: var(--color-text); line-height: 1.6; margin: 0 0 var(--space-4); }
.am-sub { font-weight: 700; color: var(--color-text); margin: 0 0 var(--space-2); }
.am-list { list-style: none; padding: 0; margin: 0 0 var(--space-4); text-align: left; display: grid; gap: 8px; }
.am-list li { display: flex; align-items: center; gap: 10px; color: var(--color-text); font-size: var(--fs-small); }
.am-list li svg, .am-list li i { width: 18px; height: 18px; color: var(--color-success-600); flex: none; }
.am-foot { font-size: var(--fs-small); color: var(--color-text-muted); margin: 0 0 var(--space-4); }
.access-modal .am-ok { width: 100%; }

/* Тост при кліку на закритий урок */
.access-toast {
    position: fixed; left: 50%; bottom: 92px; transform: translate(-50%, 20px);
    z-index: 310; display: flex; align-items: center; gap: 10px;
    background: var(--toast-bg); color: var(--color-on-accent); border-radius: var(--radius-pill);
    padding: 12px 18px; box-shadow: var(--shadow-modal);
    opacity: 0; transition: opacity var(--dur) ease, transform var(--dur) ease; pointer-events: none;
}
.access-toast.show { opacity: 1; transform: translate(-50%, 0); pointer-events: auto; }
.access-toast svg, .access-toast i { width: 18px; height: 18px; color: var(--toast-ico); flex: none; }
.toast-link {
    font: inherit; font-weight: 700; color: var(--toast-link); background: none; border: none;
    cursor: pointer; text-decoration: underline; padding: 0;
}

/* [hidden] має перемагати display:flex модалки й тосту (інакше не закриваються) */
.access-modal-overlay[hidden], .access-toast[hidden] { display: none !important; }

/* Заблокована картка (без href) — курсор-вказівник */
.lesson-card.lesson-locked, .mission-card.lesson-locked { cursor: pointer; }

/* ============================================================
   КУРСИ (courses.php) — рівні CEFR → курс → юніти → уроки
   ============================================================ */
.page-courses { max-width: var(--w-wide); }

/* --- Огляд: рівні та картки курсів --- */
.level-section { margin-bottom: var(--space-6); }
.level-head { display: flex; align-items: center; gap: var(--space-3); margin: 0 0 var(--space-4); }
.level-badge {
    font-family: var(--font-mono); font-weight: 800; font-size: 1rem; letter-spacing: 1px;
    color: var(--color-on-accent); background: var(--color-primary); border-radius: var(--radius-md);
    padding: 6px 14px;
}
.level-count { color: var(--color-text-muted); font-size: var(--fs-small); font-weight: 600; }
.level-empty {
    color: var(--color-text-muted); background: var(--color-surface);
    border: 1px dashed var(--color-border-strong); border-radius: var(--radius-lg);
    padding: var(--space-4); text-align: center;
}

/* Смужка прогресу */
.course-progress { display: flex; align-items: center; gap: 10px; margin-top: var(--space-3); }
.cp-bar { flex: 1; height: 7px; background: var(--color-border); border-radius: 4px; overflow: hidden; }
.cp-bar span { display: block; height: 100%; background: var(--color-success-600); border-radius: 4px; transition: width var(--dur) var(--ease); }
.cp-label { font-size: 12px; font-weight: 700; color: var(--color-text-muted); flex: none; }

/* --- Деталі курсу --- */
.course-bar { margin-bottom: var(--space-4); }

/* Юніт */
.unit-section {
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-card);
    padding: var(--space-5); margin-bottom: var(--space-4);
}
.unit-head {
    display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-4);
    cursor: pointer; user-select: none; border-radius: var(--radius-md);
    transition: background .18s ease;
}
.unit-head:hover { background: color-mix(in srgb, var(--ex-ink) 4%, transparent); }
.unit-head:focus-visible { outline: 2px solid color-mix(in srgb, var(--ex-ink) 40%, transparent); outline-offset: 3px; }
.unit-num {
    flex: none; font-size: 12px; font-weight: 800; letter-spacing: 1px; text-transform: uppercase;
    color: var(--ex-ink); background: color-mix(in srgb, var(--ex-ink) 10%, transparent); border-radius: var(--radius-pill); padding: 5px 12px;
}
/* Контрольна точка / екзамен — не юніт: інша, «прапорцева» позначка */
.unit-num--checkpoint { color: var(--checkpoint-ink); background: var(--checkpoint-bg); }
.unit-section--checkpoint .unit-head { background: var(--checkpoint-head-bg); }
.unit-head h2 { font-family: var(--font-head); font-size: var(--fs-h3); margin: 0; }
.unit-sub { color: var(--color-text-muted); font-size: var(--fs-small); margin: 2px 0 0; }
/* Шеврон-перемикач юніту */
.unit-chevron {
    flex: none; margin-left: auto; display: inline-flex; color: var(--gloss-soft);
    transition: transform var(--dur) ease;
}
.unit-section.collapsed .unit-chevron { transform: rotate(-90deg); }
.unit-section.collapsed .unit-head { margin-bottom: 0; }
.unit-section.collapsed .lesson-trail { display: none; }

/* Список уроків юніту — плитки 3-в-ряд у порядку читання, нанизані на маршрут-лінію,
   що робить поворотну петлю з кінця ряду на початок наступного */
.lesson-trail { position: relative; }
.trail-route {
    position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none;
    z-index: 0; overflow: visible; color: var(--color-primary);
}
.lesson-grid {
    position: relative; z-index: 1; list-style: none; margin: 0; padding: 0;
    display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: auto; gap: 48px 36px;
}
.lesson-tile { display: flex; min-width: 0; }
/* Картка: фото-портрет зліва, текст справа */
.lesson-tile > a {
    position: relative; display: flex; flex-direction: row; width: 100%; min-width: 0; min-height: 176px;
    text-decoration: none; color: inherit; background: var(--color-surface);
    border: 1px solid var(--color-border); border-radius: var(--radius-md);
    overflow: visible;
    transition: transform 60ms ease-out, box-shadow 60ms ease-out, border-color 60ms ease-out;
}
.lesson-tile > a:hover { transform: translateY(-3px); box-shadow: var(--shadow-card); border-color: var(--color-primary); }
/* Фото-портрет зліва (~3:4) */
.lt-cover {
    position: relative; width: 38%; flex: 0 0 38%; align-self: stretch;
    background-size: cover; background-position: center;
    border-radius: var(--radius-md) 0 0 var(--radius-md);
}
/* Локейшен-пін у правому верхньому куті, наполовину назовні */
.lt-pin {
    position: absolute; top: -9px; right: -9px; z-index: 2; width: 22px; height: 22px;
    background: var(--gloss-chip); border: 1.5px solid color-mix(in srgb, var(--gloss-ink) 30%, transparent);
    border-radius: 50% 50% 50% 0; transform: rotate(-38deg);
    box-shadow: 0 2px 5px rgba(0,0,0,0.22); transition: transform var(--dur) ease;
}
.lt-pin::after {
    content: ''; position: absolute; left: 50%; top: 50%; box-sizing: border-box;
    width: 9px; height: 9px; margin: -4.5px 0 0 -4.5px; border-radius: 50%;
    background: var(--color-surface); border: 1.5px solid color-mix(in srgb, var(--gloss-ink) 30%, transparent);
}
.lesson-tile > a:hover .lt-pin { animation: ltPinBounce 0.6s ease-in-out infinite; }
@keyframes ltPinBounce {
    0%, 100% { transform: translateY(0) rotate(-45deg) scale(1.12); }
    50%      { transform: translateY(-5px) rotate(-45deg) scale(1.12); }
}
/* Текст: заголовок+підзаголовок зверху, мета притиснута донизу */
.lt-body {
    flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; justify-content: flex-start;
    padding: 22px 16px 12px; border-radius: 0 var(--radius-md) var(--radius-md) 0;
}
/* Назва уроку */
.lt-title {
    align-self: flex-start; display: flex; align-items: flex-start;
    color: var(--gloss-ink); font-weight: 700; font-size: 15.5px; line-height: 1.25;
}
/* Код уроку (1.1, 2.4…) — зупинка на маршрут-лінії: кружок на лівому краї картки */
.lt-no {
    position: absolute; top: 50%; left: -14px; transform: translateY(-50%); z-index: 3;
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 26px; height: 26px; padding: 0 5px; border-radius: var(--radius-pill);
    background: var(--color-surface); color: var(--color-primary); border: 2px solid var(--color-primary);
    font-weight: 700; font-size: 12px; line-height: 1;
    box-shadow: 0 1px 4px rgba(0,0,0,0.14);
}
/* Пройдений урок — заповнена зупинка з галочкою */
.lesson-tile.done .lt-no { background: var(--color-primary); color: var(--color-surface); border-color: var(--color-primary-600); }
/* Наступний урок — маркер «ти тут» над карткою + акцентна рамка */
.lt-here {
    position: absolute; top: -13px; left: 50%; transform: translateX(-50%); z-index: 3;
    display: inline-flex; align-items: center; padding: 4px 13px; border-radius: var(--radius-pill);
    background: var(--color-primary); color: var(--color-surface);
    font-weight: 700; font-size: 11.5px; line-height: 1; white-space: nowrap;
    box-shadow: 0 2px 6px rgba(0,0,0,0.18);
}
.lesson-tile.here > a { border-color: var(--color-primary); box-shadow: 0 0 0 1px var(--color-primary); }
.lt-hook {
    color: var(--color-text-muted); font-size: 12px; line-height: 1.35;
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
/* Мета: граматика — низ-ліворуч, час — низ-праворуч */
.lt-meta { display: flex; flex-wrap: nowrap; align-items: center; gap: 6px; width: 100%; margin-top: auto; padding-top: 8px; }
.lesson-gram {
    font-size: 11px; border-radius: var(--radius-pill); padding: 1px 8px;
    color: var(--ex-ink); background: color-mix(in srgb, var(--ex-ink) 9%, transparent);
    /* Один рядок: довгі теми обрізаємо трикрапкою, повний текст — у тултіпі (title) при наведенні.
       Пігулка лише стискається (не росте), а .lesson-dur нестискний → «хв» завжди праворуч без накладання. */
    min-width: 0; flex: 0 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lesson-dur { flex: 0 0 auto; margin-left: auto; font-size: 11px; color: var(--color-text-muted); white-space: nowrap; }

@media (max-width: 820px) {
    .lesson-grid { grid-template-columns: repeat(2, 1fr); grid-auto-rows: auto; gap: 28px 28px; }
    .lesson-tile { grid-column: auto !important; grid-row: auto !important; }
}
@media (max-width: 480px) {
    .lesson-grid { grid-template-columns: 1fr; gap: 20px; }
}
.unit-flag { font-size: 1.05em; }
.unit-en { color: var(--color-text-muted); font-weight: 400; }

/* Огляд курсів — сітка карток за рівнями CEFR */
.level-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(340px, 100%), 1fr)); grid-auto-rows: 1fr; gap: var(--space-6); }
.level-card {
    display: flex; flex-direction: column; min-height: 168px;
    background: var(--color-surface); border: 0;   /* без обводки (запит Юлі 17.07) — картки на тіні */
    border-radius: var(--radius-lg); box-shadow: var(--shadow-card);
    padding: var(--space-5); text-decoration: none; color: inherit;
}
.level-card.ready { transition: var(--transition); }
.level-card.ready:hover { transform: translateY(-3px); border-color: var(--color-primary); box-shadow: var(--shadow-lg); }
.lc-badge {
    align-self: flex-start; margin-bottom: var(--space-3);
    font-family: var(--font-mono); font-weight: 800; font-size: 15px; letter-spacing: 1px;
    /* Рівень = графіт-маркер із білим текстом (та сама мова, що піни/лічильники карти;
       12.4 на білому — читається і поверх фото). Перивінкл лишається суто «дією». */
    color: var(--color-on-accent); background: var(--color-text); border-radius: var(--radius-md); padding: 5px 14px;
}
.level-card h3 { font-family: var(--font-head); font-size: 1.15rem; margin: 0 0 4px; }
.lc-meta { color: var(--color-text-muted); font-size: var(--fs-small); margin: 0 0 auto; }
.level-card .course-progress { margin-top: var(--space-3); }
.level-card.soon { box-shadow: var(--shadow-card); }  /* без обводки, як усі; марковано ЧБ-фото + «Маршрут прокладається» */
.level-card.soon:not(.has-cover) .lc-badge { background: var(--color-text-muted); color: var(--color-on-accent); }  /* білий на муттед — 4.7 AA; лише для заглушок без фото */

/* Заглушки C1/C2 з фото — вигляд активної картки, але фото ЧБ (locked) і без
   прогресу/CTA: значок рівня (скляний, як в активних) + «Маршрут прокладається». */
.level-card.soon.has-cover { grid-template-rows: 1fr; }
.level-card.soon.has-cover .lc-cover { grid-row: 1; filter: grayscale(1) contrast(0.96); }
.level-card.soon.has-cover .lc-body {
    grid-column: 2; grid-row: 1; justify-content: center; align-items: flex-start;
    text-align: left; padding: var(--space-4);
}
.level-card.soon.has-cover .lc-soon { margin: 4px 0 0; }
.lc-grad::after { display: none; }
.level-card.soon .lc-body { justify-content: center; align-items: center; padding: var(--space-4); }
.lc-soon { color: var(--color-text-muted); font-weight: 600; margin: 0; }

/* Фото країни в картці курсу — ПОРТРЕТ зліва (17.07, та сама мова, що
   .lt-cover карток уроків: колонка 38%, на всю висоту). Вертикальний кроп
   показує різні частини кадру замість однакового неба зі стрічки 92px.
   Ґрід: фото займає обидва рядки, тексти справа зверху, CTA справа знизу. */
.level-card { overflow: hidden; }
.level-card.has-cover {
    display: grid; grid-template-columns: 30% 1fr; grid-template-rows: 1fr auto;
    padding: 0; min-height: 176px;   /* = .lesson-tile */
}
.lc-cover {
    position: relative; grid-row: 1 / 3; grid-column: 1; align-self: stretch;
    /* Зум auto 145% (наближення обʼєкта, вибір Юлі 17.07); точна позиція під
       обʼєкт кадру — інлайн з PHP ($BANNER_POS). 15% 50% = фолбек. */
    background-size: auto 145%; background-position: 15% 50%;
    background-repeat: no-repeat;
    border-radius: var(--radius-lg) 0 0 var(--radius-lg);
}
.lc-cover::after {
    content: ''; position: absolute; inset: 0; border-radius: inherit;
    background: linear-gradient(180deg, rgba(0,0,0,0.04), rgba(0,0,0,0.16));
}
.lc-cover .lc-badge {
    position: absolute; top: 12px; left: 12px; z-index: 1; margin: 0;
    box-shadow: 0 2px 8px rgba(0,0,0,0.25);
}
.level-card.has-cover .lc-open { grid-column: 2; grid-row: 1; }
.level-card.has-cover .lc-cta  { grid-column: 2; grid-row: 2; margin: 0 var(--space-4) var(--space-4); }
.lc-body { display: flex; flex-direction: column; flex: 1; padding: var(--space-4) var(--space-4) var(--space-3); }
.lc-body .lc-meta { margin: 0 0 auto; }

/* Картка курсу = div з двома лінками: .lc-open (огляд юнітів) + .lc-cta (прямо в урок, 1 клік) — 2.3 */
.lc-open { display: flex; flex-direction: column; flex: 1; text-decoration: none; color: inherit; }
.lc-cta {
    display: flex; align-items: center; justify-content: center; gap: 6px;
    margin: 0 var(--space-5) var(--space-5); padding: 10px 14px;
    background: var(--color-primary); color: var(--color-on-accent); font-weight: 700; font-size: var(--fs-small);
    border-radius: var(--radius-md); text-decoration: none; text-align: center;
    transition: background var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
}
.lc-cta:hover { background: var(--color-primary-600); color: var(--color-on-accent); transform: translateY(-1px); }
.lc-cta--done { background: var(--color-success); }
.lc-cta--done:hover { background: var(--color-success-700); color: var(--color-on-accent); }
/* Картки без банера (запасний випадок) мають власний padding — CTA тоді без бокових margin. */
.level-card.ready:not(.has-cover) .lc-cta { margin: var(--space-3) 0 0; }

/* Компактна стрічка «Маршрут прокладається» замість повнорозмірних заглушок рівнів — 2.3.
   Dashed тут доречний як декор мотиву «маршрут ще прокладається». */
.soon-ribbon {
    display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
    margin-top: var(--space-5); padding: 12px var(--space-4);
    background: var(--color-bg-warm); border: 1px dashed var(--color-border-strong);
    border-radius: var(--radius-md); color: var(--color-text-muted);
}
.sr-label { font-weight: 700; font-size: var(--fs-small); }
.sr-levels { display: inline-flex; gap: 8px; flex-wrap: wrap; }
.sr-lvl {
    font-family: var(--font-mono); font-weight: 800; font-size: var(--fs-small); letter-spacing: 1px;
    /* Порожній маркер рівня: графіт-контур на білому (11.4:1) — та сама родина, що
       залиті A1–B2 бейджі, але «порожній» = маршрут ще прокладається (рішення Юлі 16.07). */
    color: var(--color-text); background: var(--color-surface);
    border: 1.5px solid var(--color-text); border-radius: var(--radius-sm); padding: 3px 10px;
}

/* Тематичні маршрути (courses.php, огляд): короткі курси під мету, під рівневою сіткою. */
.thematic-routes { margin-top: 0; }
/* Легка лінія-роздільник між рівневими й тематичними курсами (без заголовка) —
   faint графіт, читається на будь-якій плямі градієнта. */
.routes-divider {
    border: 0; border-top: 2px dashed var(--color-surface);   /* біла, тонша, пунктир (запит Юлі) */
    height: 0; margin: var(--space-6) 0; background: none; box-shadow: none;
}

/* === Навігація між уроками (вгорі і внизу уроку) === */
.lesson-nav {
    display: flex; gap: var(--space-3); align-items: stretch;
    margin: var(--space-4) 0;
}
.lesson-nav-top { margin-top: var(--space-3); }
.lesson-nav-bottom { margin-top: var(--space-5); }
.lnav {
    flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 3px;
    padding: 12px 16px; text-decoration: none; color: inherit;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-md); transition: var(--transition);
}
.lnav-next { text-align: right; align-items: flex-end; }
.lnav-prev { align-items: flex-start; }
.lnav:hover { transform: translateY(-2px); box-shadow: var(--shadow-card); border-color: var(--color-primary); }
.lnav-dir {
    font-size: 11px; font-weight: 800; letter-spacing: .6px; text-transform: uppercase;
    color: var(--ex-ink);
}
.lnav-arrow { font-weight: 700; }
.lnav-title {
    font-size: 14px; font-weight: 600; color: var(--gloss-ink); line-height: 1.3;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.lnav-empty { flex: 1 1 0; visibility: hidden; }
@media (max-width: 560px) {
    .lnav { padding: 10px 12px; }
    .lnav-title { font-size: 13px; -webkit-line-clamp: 1; }
}

/* Швидкий tooltip для глос/виділених слів (заміна повільного нативного title) */
.gloss-tip {
    position: absolute; z-index: 200; pointer-events: none;
    background: var(--gloss-ink); color: var(--color-on-accent); font-size: 13px; font-weight: 600; line-height: 1.35;
    padding: 6px 10px; border-radius: 8px; max-width: 260px;
    box-shadow: 0 4px 16px rgba(0,0,0,0.25);
    opacity: 0; transform: translateY(3px); transition: opacity .12s ease, transform .12s ease;
}
.gloss-tip.show { opacity: 1; transform: translateY(0); }
.gloss-tip::after {
    content: ''; position: absolute; left: 50%; top: 100%; transform: translateX(-50%);
    border: 5px solid transparent; border-top-color: var(--gloss-ink);
}
.gloss-tip.below::after { top: auto; bottom: 100%; border-top-color: transparent; border-bottom-color: var(--gloss-ink); }

/* ============================================================
   Граматичні схеми (блок "scheme") — inline-SVG, стилізований класами.
   SVG лишається в JSON чистим (тільки структура + класи), уся палітра тут.
   Базис: тепла «зошитова» картка, шрифти Inter/Fraunces/JetBrains Mono,
   акценти teal/orange/green/terracotta з design-tokens.
   ============================================================ */
.scheme {
    margin: var(--space-6) 0;
    display: flex; flex-direction: column; align-items: center; gap: var(--space-3);
}
.scheme-title {
    font-family: var(--font-head); font-weight: 700; font-size: var(--fs-h3, 1.15rem);
    color: var(--color-text); text-align: center; margin: 0;
}
.scheme-canvas {
    width: 100%; background: var(--color-surface);
    border: 1.5px solid var(--color-border); border-radius: var(--radius-lg);
    padding: var(--space-5) var(--space-4);
    box-shadow: 0 1px 0 var(--color-border-strong), 0 8px 24px -18px rgba(54, 50, 66,.4);
}
.scheme-canvas svg { display: block; width: 100%; height: auto; max-width: 640px; margin: 0 auto; }
.scheme-cap {
    font-family: var(--font-head); font-style: italic;
    font-size: var(--fs-small); color: var(--color-text-muted); text-align: center; margin: 0;
}

/* --- текст усередині SVG --- */
.scheme svg text { font-family: var(--font-body); fill: var(--color-text); }
.scheme svg .s-head  { font-family: var(--font-head); }
.scheme svg .s-mono  { font-family: var(--font-mono); }
.scheme svg .s-b     { font-weight: 700; }
.scheme svg .s-lg    { font-size: 23px; }
.scheme svg .s-md    { font-size: 17px; }
.scheme svg .s-sm    { font-size: 13px; }
.scheme svg .s-xs    { font-size: 11px; }
.scheme svg .s-teal  { fill: var(--color-primary); }
.scheme svg .s-orange{ fill: var(--color-secondary-700); }
.scheme svg .s-green { fill: var(--color-success-600); }
.scheme svg .s-red   { fill: var(--color-error); }
.scheme svg .s-muted { fill: var(--color-text-muted); }
.scheme svg .s-white { fill: var(--color-on-accent); }
.scheme svg .s-uk    { font-style: italic; fill: var(--color-text-muted); font-size: 13px; }

/* --- картки/блоки (rect, circle) — fill + stroke разом --- */
.scheme svg .s-box     { fill: var(--color-surface);     stroke: var(--color-border-strong); stroke-width: 2; }
.scheme svg .s-box-teal{ fill: var(--color-primary-050); stroke: var(--color-primary);       stroke-width: 2; }
.scheme svg .s-box-orange{ fill: var(--color-secondary-100); stroke: var(--color-secondary); stroke-width: 2; }
.scheme svg .s-box-green { fill: var(--ex-ok-bg); stroke: var(--color-success); stroke-width: 2; }
.scheme svg .s-box-red   { fill: var(--ex-no-bg); stroke: var(--color-error);   stroke-width: 2; }
.scheme svg .s-fill-teal { fill: var(--color-primary); }
.scheme svg .s-fill-orange{ fill: var(--color-secondary); }

/* --- додано 22.07 для інлайнових пояснювальних SVG із /media/lessons ---
   Ті картинки підключались через <img> і мали власні гекси й системний шрифт;
   тепер вони інлайняться в цю ж структуру, тож їм потрібні тони, яких у наборі
   схем ще не було. Логіка кольору збережена: зелений і персик — два смислові
   акценти, індиго — рамка/підпис. */
.scheme svg .s-indigo   { fill: var(--color-primary-700); }
.scheme svg .s-green-dk { fill: var(--color-success-700); }
.scheme svg .s-surface  { fill: var(--color-surface); }
.scheme svg .s-bg-lav        { fill: var(--color-lavender); }
.scheme svg .s-bg-lav-soft   { fill: color-mix(in srgb, var(--color-lavender) 45%, var(--color-surface)); }
.scheme svg .s-bg-green      { fill: var(--color-success-100); }
.scheme svg .s-bg-green-soft { fill: color-mix(in srgb, var(--color-success-100) 55%, var(--color-surface)); }
.scheme svg .s-bg-peach      { fill: var(--color-secondary-100); }
.scheme svg .s-bg-peach-soft { fill: color-mix(in srgb, var(--color-secondary-100) 55%, var(--color-surface)); }
.scheme svg .s-line        { stroke: var(--color-border); }
.scheme svg .s-line-indigo { stroke: var(--color-primary-700); }
.scheme svg .s-line-green  { stroke: var(--color-success-700); }
.scheme svg .s-line-red    { stroke: var(--color-error); }
.scheme svg .s-line-white  { stroke: var(--color-on-accent); }

/* --- лінії, стрілки, конектори (тільки stroke) --- */
.scheme svg .s-conn      { fill: none; stroke: var(--color-border-strong); stroke-width: 2; }
.scheme svg .s-conn-teal { fill: none; stroke: var(--color-primary);       stroke-width: 2; }
.scheme svg .s-conn-dash { fill: none; stroke: var(--color-text-muted); stroke-width: 2; stroke-dasharray: 4 4; }

@media (max-width: 520px) {
    .scheme-canvas { padding: var(--space-4) var(--space-2); }
    .scheme svg .s-lg { font-size: 21px; }
}

/* === Дашборд: досягнення === */
.achievements { margin: var(--space-6) 0; }
.achievements h2 { display: flex; align-items: center; gap: 10px; }
.ach-count { font-size: var(--fs-small); font-weight: 700; color: var(--color-on-accent); background: var(--color-primary); border-radius: var(--radius-pill); padding: 2px 10px; }
.ach-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(230px, 100%), 1fr)); gap: var(--space-3); margin-top: var(--space-3); }
/* Досягнення = печатка в паспорті (напрям 01): папір, дашед-обвід,
   зароблені — з легким нахилом і чорнильним колом навколо іконки. */
.ach {
    display: flex; align-items: center; gap: 12px; padding: 13px 15px;
    border: 1.6px dashed var(--color-border-strong); border-radius: var(--radius-btn);
    background: var(--souvenir-paper-1); position: relative; transition: var(--transition);
}
/* Зароблене — зелена мова «done» (варіант А, 19.07): тінт success-100 + зелений
   обвід, як card-progress.completed на курсах; чек-коло вже зелене. */
.ach-on { border-color: var(--color-success-600); background: var(--color-success-100); transform: rotate(-0.6deg); }
.ach-grid > .ach-on:nth-child(even) { transform: rotate(0.5deg); }
/* Не зароблене — непрозорий папір з пригашеним вмістом (opacity на весь тайл
   просвічувала мапу-вотермарку і робила текст нечитабельним) */
.ach-off { border-color: var(--color-border); }
.ach-off .ach-title { color: var(--color-text-muted); }
.ach-off .ach-ico { opacity: 0.55; }
.ach-ico {
    flex: none; display: inline-flex; align-items: center; justify-content: center;
    width: 46px; height: 46px; border-radius: 50%;
    border: 1.6px dashed var(--color-border-strong); color: var(--icon-idle);
}
.ach-on .ach-ico {
    border-color: var(--color-success-600); color: var(--color-success-700);
    background: var(--color-surface); transform: rotate(-6deg);
}
.ach-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ach-title { font-weight: 700; font-size: 15px; color: var(--color-text); }
.ach-desc { font-size: 12px; color: var(--color-text-muted); }
.ach-prog { display: block; height: 5px; background: color-mix(in srgb, var(--ex-ink) 12%, transparent); border-radius: 4px; margin-top: 5px; overflow: hidden; }
.ach-prog span { display: block; height: 100%; background: var(--color-primary); border-radius: 4px; }
.ach-check {
    margin-left: auto; flex: none; width: 24px; height: 24px;
    display: inline-flex; align-items: center; justify-content: center;
    border: 1.6px solid var(--color-success-600); border-radius: 50%;
    color: var(--color-success-600); font-weight: 800; font-size: 13px;
    transform: rotate(8deg);
}

/* === Маршрут: прогрес по юніту === */
.unit-progress { display: inline-flex; align-items: center; gap: 8px; margin-top: 4px; }
.unit-progress .up-bar { width: 90px; height: 6px; background: color-mix(in srgb, var(--ex-ink) 12%, transparent); border-radius: 4px; overflow: hidden; }
.unit-progress .up-bar span { display: block; height: 100%; background: var(--color-primary); border-radius: 4px; }
.unit-progress .up-num { font-size: 12px; font-weight: 700; color: var(--color-text-muted); }
.unit-progress.up-done .up-num { color: var(--color-success-600); }

/* === Доступність: видимий фокус для навігації з клавіатури ===
   (18.07: прибрано border-radius 4px — він перезаписував рідний радіус
   елемента при фокусі, pill-поля ставали прямокутними; outline і так іде
   по власному радіусу елемента) */
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible,
select:focus-visible, summary:focus-visible, [tabindex]:focus-visible, label:focus-visible {
    outline: 2px solid var(--color-primary); outline-offset: 2px;
}
/* Зручніші тап-таргети чек-лістів на сенсорних екранах */
.wcheck-list input { width: 20px; height: 20px; }
@media (hover: none) {
    .sc-rec, .sc-play, .as-slow { padding-top: 11px; padding-bottom: 11px; }
}
/* Дрібні тап-цілі: пальцем у 17–25px не влучиш. Піднімаємо до ~40px.
   Умова подвійна — і тач-екран, і вузьке вікно: частина Android-браузерів
   віддає hover:hover, тож самого (hover: none) замало. */
@media (hover: none), (max-width: 768px) {
    .onb-skip { padding: 10px 12px; margin: -10px -12px; }
    .sec-more { padding: 9px 14px; }
    .site-footer .footer-links a, .ph-link { display: inline-block; padding: 8px 0; }
    /* Кнопка озвучення сидить усередині рядка тексту (словник, діалоги, пари),
       тому збільшуємо не саму іконку, а невидиму зону натиску псевдоелементом —
       розкладка не зсувається, а ціль виростає з ~15px до ~32px. */
    .speak-btn { position: relative; }
    .speak-btn::after { content: ""; position: absolute; inset: -9px -8px; }
}

/* === Прапор країни як SVG-зображення (замість емоджі) === */
.flag-ic {
    display: inline-block; height: 1em; width: 1.34em; object-fit: cover;
    border-radius: 2px; vertical-align: -0.15em; box-shadow: 0 0 0 1px rgba(0,0,0,0.10);
}
.unit-flag .flag-ic, h2 .flag-ic { height: 0.95em; width: 1.27em; }

/* ============================================================
   МІЙ СЛОВНИК: перемикач вигляду + карта слів по країнах
   ============================================================ */
/* Перемикач виглядів — графітовий трек з білою пігулкою (контрастна пара до пінів карти) */
.view-toggle {
    display: inline-flex; gap: 2px; padding: 3px;
    background: var(--color-text); border: 1px solid var(--color-text);
    border-radius: var(--radius-pill);
}
.vt-btn {
    display: inline-flex; align-items: center; gap: 6px;
    border: 0; background: transparent; cursor: pointer;
    font-family: inherit; font-size: var(--fs-small); font-weight: 600;
    color: rgba(255, 255, 255, 0.78); padding: 6px 14px; border-radius: var(--radius-pill);
    transition: background var(--dur) var(--ease), color var(--dur) var(--ease);
}
.vt-btn svg { width: 16px; height: 16px; }
.vt-btn:hover { color: var(--color-on-accent); }
.vt-btn.is-active { background: var(--color-surface); color: var(--color-primary-600); box-shadow: var(--shadow-sm); }

.vocab-stats { display: flex; flex-wrap: wrap; gap: var(--space-4); margin: 0 0 var(--space-4); color: var(--color-text-muted); font-size: var(--fs-small); }
.vocab-stats b { font-family: var(--font-head); font-weight: 700; color: var(--color-text); font-size: 1.1rem; line-height: 1; }

.vocab-view[hidden] { display: none; }

/* --- Карта --- */
.vocab-map-layout { display: flex; gap: var(--space-4); align-items: flex-start; }
/* Ліва колонка: карта + чипи країн під нею (одразу під картою, а не в кінці) */
.vocab-map-col { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: var(--space-4); }
.vocab-map-col .vocab-map { flex: 0 0 auto; }
.vocab-map-col .vocab-int-chips { margin-top: 0; }
.vocab-map {
    position: relative; flex: 1 1 auto; min-width: 0; min-height: 300px;
    background: var(--map-water); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); overflow: hidden;
}
.vocab-map .map-loading { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: var(--color-text-muted); }
.vmap-svg { display: block; width: 100%; height: auto; }
.vmap-svg .graticule path { fill: none; stroke: var(--vmap-grid); stroke-width: 0.3; }
.vmap-country { fill: var(--vmap-land); stroke: var(--vmap-land-stroke); stroke-width: 0.4; transition: fill var(--dur) var(--ease); }
.vmap-country.has-words { fill: var(--vmap-words); cursor: pointer; outline: none; }
.vmap-country.has-words:hover,
.vmap-country.has-words.is-hover { fill: var(--vmap-words-hover); }  /* .is-hover ставить JS — щоб ховер номера теж фарбував країну */
.vmap-country.has-words:focus-visible { fill: var(--color-primary); }
.vmap-country.is-selected { fill: var(--vmap-words-hover); }  /* натиснута = світлий ховер-тон, без окремого темного (Юля 18.07) */
.vmap-badge { cursor: pointer; filter: drop-shadow(0 1px 2.5px rgba(54, 50, 66, 0.30)); }
/* пін лічильника: графіт із білою обводкою і білим числом (щоб не зливався з персиковими країнами) */
/* Бейдж кількості слів — локейшн-пін «крапля» (18.07): перивінкл + білий номер
   + тонка біла обводка (відділяє від перивінклової країни) + мʼяка тінь
   (drop-shadow на .vmap-badge). Форму задає path у vocab-map.js. */
.vmap-badge-bg { fill: var(--color-primary); stroke: var(--color-surface); stroke-width: 1.5; transition: fill var(--dur) var(--ease); }
.vmap-badge:hover .vmap-badge-bg { fill: var(--color-primary-700); }
/* значок-номер лишається графітовим і в натиснутому стані — цифра читається
   на світлій країні (18.07); окремий перивінкл-fill прибрано */
.vmap-badge-num { fill: var(--color-on-accent); font-family: var(--font-body); font-size: 13px; font-weight: 700; pointer-events: none; }

/* --- Панель країни --- */
.vocab-panel {
    flex: 0 0 340px; align-self: stretch; position: relative;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); padding: var(--space-4);
    max-height: 74vh;
    /* Скролиться ТІЛЬКИ список слів усередині (нижче), а не вся панель —
       смужка йде всередині й не вилазить за заокруглені кути (18.07);
       заодно шапка (заголовок/прогрес/«Тренувати») лишається на місці. */
    display: flex; flex-direction: column; overflow: hidden;
}
.vocab-panel .vocab-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.vocab-panel[hidden] { display: none; }
.vocab-panel h2 { display: flex; align-items: center; gap: 8px; font-size: 1.3rem; margin: 0 0 var(--space-3); padding-right: 28px; }
.vocab-panel h2 .flag-ic { height: 1em; width: 1.34em; }
.vocab-panel-close {
    position: absolute; top: 10px; right: 12px; border: 0; background: transparent;
    font-size: 24px; line-height: 1; cursor: pointer; color: var(--color-text-muted); padding: 2px 6px;
}
.vocab-panel-close:hover { color: var(--color-text); }
/* у вузькій панелі картки не крутимо (щоб не вилазили за край) */
.vocab-panel .my-vocab .vocab-card {
    transform: none !important; margin: 0 0 var(--space-3);
    border-left: 0;   /* без статусної смуги зліва (Юля 18.07) */
    background: color-mix(in srgb, var(--color-primary-050) 55%, var(--color-surface));  /* світлий перивінкл-фон, як у відкритого слова списку */
}
.vocab-panel .my-vocab .vocab-card::before,
.vocab-panel .my-vocab .vocab-card::after { display: none; }
/* Слово + озвучка в рядок, переклад ПІД словом (не праворуч) — Юля 18.07 */
.vocab-panel .vocab-main { flex-direction: column; align-items: flex-start; gap: 2px; }
.vocab-panel .translation { text-align: left; }
/* Країну ховаємо: у панелі країни її вже обрано, тож рядок зайвий. Урок + дата лишаються. */
.vocab-panel .vm-country, .vocab-panel .vm-sep { display: none; }

/* --- Чипи країн під картою --- */
.vocab-int-chips { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-3); }
.vocab-chip {
    display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-pill); padding: 5px 12px;
    font-family: inherit; font-size: var(--fs-small); font-weight: 600; color: var(--color-text);
    transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.vocab-chip:hover { border-color: var(--color-primary); transform: translateY(-1px); }  /* перивінкл замість персику (Юля 18.07) */
.vocab-chip .flag-ic { height: 0.95em; width: 1.27em; }
/* лічильник = мініатюра піна карти: графіт із білим числом */
.vocab-chip .chip-n {
    color: var(--color-on-accent); background: var(--color-text);
    border-radius: var(--radius-pill); padding: 0 7px; font-size: var(--fs-xs);
}

/* --- A–Z: список живе прямо в контейнері, літери — смужки-розділювачі --- */
.az-card { background: transparent; }
.vocab-letter { margin: 0; }
/* Заголовок-літера секції (вибір Юлі 18.07, варіант C): ледь-тонована смуга
   в перивінкл-родині (легша за ховер/відкрите слово, та сама гама) з
   графітовою літерою — мʼяке зонування без ліній. */
.vocab-letter-head {
    background: var(--color-primary-050);   /* темніший за рядки (запит Юлі 18.07) */
    border: 0; padding: 7px 16px;
}
.vlh-badge {
    font-family: var(--font-head); font-weight: 700; font-size: 1.02rem;
    color: var(--color-text); letter-spacing: 0.04em;
}
.az-card .vocab-letter:first-child .vocab-letter-head { border-top: 0; }
.az-nothing { margin: 0; padding: var(--space-6) var(--space-4); text-align: center; color: var(--color-text-muted); }
.az-nothing[hidden] { display: none; }

@media (max-width: 768px) {
    /* Вузький екран: колонка (карта+чипи) над панеллю; чипи вже під картою
       завдяки .vocab-map-col, тож окремого переупорядкування не треба. */
    .vocab-map-layout { flex-direction: column; }
    .vocab-panel { flex-basis: auto; width: 100%; max-height: none; }
}

/* --- A–Z: компактний щільний список (розкриття по кліку) --- */
#view-az .vocab-list {
    gap: 0; background: transparent; border: 0; border-radius: 0; overflow: visible;
}
#view-az .vocab-card {
    background: transparent; border: 0; box-shadow: none; border-radius: 0;
    border-left: 3px solid transparent; padding: 10px 16px; margin: 0;
    cursor: pointer; transform: none !important;
    transition: background var(--dur) var(--ease);
}
#view-az .vocab-card + .vocab-card { border-top: 1px solid var(--color-border); }
#view-az .vocab-card::before,
#view-az .vocab-card::after { content: none !important; display: none !important; }
/* Статусні смужки зліва в A–Z прибрано (запит Юлі 18.07) — статус видно
   в розгортці слова і через фільтри статистики тулбара. */
#view-az .vocab-card:hover { background: color-mix(in srgb, var(--color-primary-050) 55%, var(--color-surface)); box-shadow: none; }  /* = тон відкритого слова; темніший лише в літери */
#view-az .vocab-card.is-open {
    background: color-mix(in srgb, var(--color-primary-050) 55%, var(--color-surface));  /* світліший за смугу літери */
    padding: 18px 20px 20px;   /* повітря відкритій картці (18.07); рядок у списку лишається щільним 10px 16px */
}

#view-az .vocab-main { gap: 12px; }
#view-az .word { font-size: 1rem; }
#view-az .word .speak-btn { opacity: 0; transition: opacity var(--dur) var(--ease); }
#view-az .vocab-card:hover .word .speak-btn,
#view-az .vocab-card.is-open .word .speak-btn { opacity: 0.9; }
/* На тачі ховера нема — кнопка озвучення має бути видимою одразу */
@media (hover: none), (max-width: 768px) {
    #view-az .word .speak-btn { opacity: 0.9; }
}
#view-az .translation { font-size: var(--fs-small); text-align: right; }
/* Відкрите слово (18.07): переклад ЛИШАЄТЬСЯ збоку праворуч (як у закритому
   рядку) — рішення Юлі: людина відкриває слово, читає речення і згадує
   переклад САМА, відповідь скромно збоку. Приклад — «цитатка» (fs-small),
   не другий заголовок. */
/* Читабельність відкритої картки (18.07, «мамин тест»): слово 20px,
   приклад і переклад 16px (= канон fs-body); закриті рядки лишаються
   компактними — там скан, не читання. */
#view-az .vocab-card.is-open .word { font-size: 1.25rem; }
#view-az .vocab-card.is-open .example { font-size: var(--fs-body); margin: 6px 0 2px; }
#view-az .vocab-card.is-open .translation { font-size: var(--fs-body); }

/* приховане за замовчуванням — розкривається при is-open */
#view-az .example,
#view-az .vocab-meta,
#view-az .vocab-actions { display: none; }
#view-az .vocab-card.is-open .example { display: block; margin: 14px 0 0; }
#view-az .vocab-card.is-open .vocab-meta { display: block; margin: 10px 0 0; }
#view-az .vocab-card.is-open .vocab-actions { display: flex; margin-top: 18px; }
#view-az .vocab-actions button { padding: 4px 11px; }

/* --- Один контейнер на всю сторінку словника: шапка-тулбар + активний вигляд --- */
.vocab-shell {
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
    /* clip (не hidden): радіус ріже кути, але sticky-стрічка літер усередині працює */
    overflow: clip;
}
.vocab-shell #view-map { padding: var(--space-4); }
#vocab-empty-live { padding: var(--space-4); }
#vocab-empty-live[hidden] { display: none; }

/* --- Тулбар словника: шапка контейнера зі статистикою-фільтрами + пошуком --- */
.vocab-toolbar {
    display: flex; align-items: center; justify-content: space-between;
    gap: var(--space-3); flex-wrap: wrap; margin: 0;
    padding: var(--space-3) var(--space-4);
    border-bottom: 1px solid var(--color-border);
}
.vocab-toolbar[hidden] { display: none; }
.vocab-toolbar .vocab-stats { margin: 0; gap: var(--space-2); }
/* Права група тулбара: перемикач вигляду (переїхав із шапки) + пошук */
.vocab-tools { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.vstat {
    /* center + line-height:1 у числа (нижче) — інакше більші цифри лізли
       вгору відносно слова в пігулці (фікс 18.07) */
    display: inline-flex; align-items: center; gap: 5px;
    border: 1px solid var(--color-border); background: transparent; cursor: pointer;
    border-radius: var(--radius-pill); padding: 4px 12px;
    font-family: inherit; font-size: var(--fs-small); color: var(--color-text-muted);
    transition: border-color var(--dur) var(--ease), background var(--dur) var(--ease);
}
.vstat[data-f]:hover { border-color: var(--color-primary); }
.vstat.is-active { background: var(--color-primary-050); border-color: var(--color-primary); color: var(--color-text); }
.vstat-static { cursor: default; border-color: transparent; padding-left: 4px; }
.vocab-search {
    flex: 1 1 220px; max-width: 340px;
    border: 1px solid var(--color-border); border-radius: var(--radius-pill);
    background: var(--color-bg); padding: 8px 16px;
    font-family: inherit; font-size: var(--fs-small); color: var(--color-text);
}
.vocab-search:focus { outline: none; border-color: var(--color-primary); background: var(--color-surface); }

/* Сховане фільтрами (пошук/статус) — і картки, і порожні літерні секції. */
.f-hidden { display: none !important; }
.pg-hidden { display: none !important; }   /* пагінація A–Z (18.07) */

/* Пейджер словника: тихі pill-кнопки внизу картки списку */
.vocab-pager {
    display: flex; align-items: center; justify-content: center; gap: 6px;
    flex-wrap: wrap; padding: 14px 16px 18px;
}
.vocab-pager[hidden] { display: none; }
.vp-btn {
    font: inherit; font-size: var(--fs-small); font-weight: 600; cursor: pointer;
    min-width: 34px; padding: 6px 10px; text-align: center;
    background: var(--color-surface); color: var(--color-text);
    border: 1px solid var(--color-border); border-radius: var(--radius-pill);
    transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.vp-btn:hover:not(:disabled):not(.active) { background: var(--color-primary-050); border-color: var(--color-primary-100); }
.vp-btn.active { background: var(--color-text); border-color: var(--color-text); color: var(--color-on-accent); cursor: default; }
.vp-btn:disabled { opacity: 0.35; cursor: default; }
.vp-dots { color: var(--color-text-muted); padding: 0 2px; }
.vocab-chip[hidden] { display: none; }

/* --- Прогрес країни: чип «вивчено/всього», бейдж повністю вивченої країни --- */
.vocab-chip.chip-done { border-color: var(--color-success); }
.vocab-chip.chip-done .chip-n { background: var(--color-success); }
.vocab-chip.chip-done .chip-n { color: var(--color-success-700); background: var(--color-success-100); }
.vmap-badge.is-done .vmap-badge-bg { fill: var(--color-success); }
.vmap-badge.is-done:hover .vmap-badge-bg { fill: var(--color-success-700); }
.vmap-badge.is-done.is-selected .vmap-badge-bg { fill: var(--color-primary-700); }

/* Pop-in бейджів після завантаження карти (stagger — через animation-delay у JS). */
.vmap-badge-in { animation: vmapPop 0.35s var(--ease) backwards; transform-box: fill-box; transform-origin: center; }
@keyframes vmapPop { from { opacity: 0; transform: scale(0.3); } }
@media (prefers-reduced-motion: reduce) { .vmap-badge-in { animation: none !important; } }

/* --- Тултіп над країною на карті --- */
.vmap-tip {
    position: absolute; z-index: 5; pointer-events: none; white-space: nowrap;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-sm); box-shadow: var(--shadow-sm);
    padding: 5px 10px; font-size: var(--fs-xs); color: var(--color-text);
}
.vmap-tip[hidden] { display: none; }
.vmap-tip b { font-family: var(--font-head); margin-right: 6px; }

/* --- Панель країни: прогрес + кнопка тренування --- */
.vocab-panel-progress {
    display: flex; align-items: center; gap: var(--space-2);
    margin: -4px 0 var(--space-2); font-size: var(--fs-xs); color: var(--color-text-muted);
}
.vocab-panel-progress[hidden] { display: none; }
.vpp-bar { flex: 1; height: 6px; border-radius: 3px; background: var(--color-primary-050); overflow: hidden; }
.vpp-fill { display: block; height: 100%; border-radius: 3px; background: var(--color-success); transition: width 0.3s var(--ease); }
.vocab-panel-train {
    display: inline-flex; align-items: center; gap: 6px;
    margin: 0 0 var(--space-3); padding: 5px 13px;
    border: 1px solid var(--color-primary); border-radius: var(--radius-pill);
    font-size: var(--fs-small); font-weight: 600; color: var(--color-primary);
    transition: background var(--dur) var(--ease);
}
.vocab-panel-train:hover { background: var(--color-primary-050); color: var(--color-primary); }
.vocab-panel-train svg, .vocab-panel-train i { width: 15px; height: 15px; }

/* --- Тост «слово видалено · Повернути» --- */
.vocab-toast {
    position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%);
    display: flex; align-items: center; gap: var(--space-3);
    background: var(--toast-bg); color: var(--color-on-accent); padding: 10px 18px;
    border-radius: var(--radius-pill); box-shadow: var(--shadow-modal); /* канон тоста 17.07 */
    font-size: var(--fs-small); z-index: var(--z-modal);
    animation: toastUp 0.25s var(--ease);
}
@keyframes toastUp { from { opacity: 0; transform: translate(-50%, 10px); } }
.vocab-toast .toast-undo {
    border: 0; background: transparent; cursor: pointer; padding: 2px 4px;
    font-family: inherit; font-size: inherit; font-weight: 700; color: var(--color-secondary);
}
.vocab-toast .toast-undo:hover { text-decoration: underline; }

/* --- A–Z: алфавітна навігація (липка стрічка літер у шапці контейнера) --- */
.az-nav {
    position: sticky; top: 0; z-index: 4;
    display: flex; flex-wrap: wrap; gap: 4px;
    padding: 10px 16px; margin: 0;
    background: var(--color-surface);
    border-bottom: 1px solid var(--color-border);
}
/* рецепт chip-switch у секції КНОПКИ; тут — літерна специфіка (фікс-ширина, видима рамка).
   Літери графітом (запит Юлі 18.07) — перивінкл лишається кольором дії, не літер. */
.az-nav button {
    min-width: 32px; padding: 4px 2px;
    border-color: var(--color-border); background: var(--color-surface);
    font-family: var(--font-head); font-weight: 700; color: var(--color-text);
}
/* секції докручуються з відступом під липку стрічку літер */
#view-az.has-aznav .vocab-letter { scroll-margin-top: 54px; }
@media (max-width: 640px) {
    .az-nav { position: static; }
    #view-az.has-aznav .vocab-letter { scroll-margin-top: 0; }
}

/* --- Тренування: чип фільтра однієї країни --- */
.train-cc-chip {
    display: inline-flex; align-items: center; gap: 8px;
    margin: 0 0 var(--space-4); padding: 6px 14px;
    background: var(--color-primary-050); border: 1px solid var(--color-primary);
    border-radius: var(--radius-pill); font-size: var(--fs-small);
}
.train-cc-chip .flag-ic { height: 0.95em; width: 1.27em; }
.train-cc-chip a { color: var(--color-text-muted); text-decoration: underline; }
.train-cc-chip a:hover { color: var(--color-text); }

/* ============================================================
   CONFIRM руйнівної дії (канон 17.07, confirm.js) — оверлей =
   канонічний «графіт-дім», діалог = surface + radius-lg + shadow-modal.
   Руйнівна кнопка — бордова --ex-no-ink (білий текст 6.55 AA), не
   error-заливка (там білий лише 4.0).
   ============================================================ */
.confirm-overlay {
    position: fixed; inset: 0; z-index: var(--z-modal);
    display: flex; align-items: center; justify-content: center; padding: var(--space-4);
    background: color-mix(in srgb, var(--color-text) 45%, transparent); backdrop-filter: blur(4px);
}
.confirm-dialog {
    background: var(--color-surface); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-modal); padding: var(--space-5) var(--space-6);
    width: min(420px, 92vw);
}
.confirm-text { margin: 0 0 var(--space-5); font-weight: 600; }
.confirm-actions { display: flex; gap: var(--space-3); justify-content: flex-end; }
.confirm-yes {
    font: inherit; font-weight: 700; cursor: pointer; border: 0;
    background: var(--ex-no-ink); color: var(--color-on-accent);
    border-radius: var(--radius-btn); padding: 8px 18px;
    box-shadow: 0 3px 0 color-mix(in srgb, var(--ex-no-ink) 60%, black);
}
.confirm-yes:hover { filter: brightness(1.08); }
.confirm-yes:active { transform: translateY(2px); box-shadow: 0 1px 0 color-mix(in srgb, var(--ex-no-ink) 60%, black); }
/* Нейтральне (не руйнівне) підтвердження: перивінкл-кнопка замість бордової. */
.confirm-yes.safe { background: var(--color-primary); box-shadow: 0 3px 0 color-mix(in srgb, var(--color-primary) 60%, black); }
.confirm-yes.safe:active { box-shadow: 0 1px 0 color-mix(in srgb, var(--color-primary) 60%, black); }

/* ================= Налаштування профілю (settings.php) ================= */
/* Боардлес-сторінка в стилі дашборда: контент на градієнті, плитки-скло.
   Фон — родина профілю: перивінкл + персик, світлий кут під заголовком. */
html[data-page="settings.php"] {
    background-color: #e9eaf0;
    background-image: var(--grain-tex),
        radial-gradient(84% 80% at 10% 12%, rgba(238, 244, 243, 0.95), transparent 62%),
        radial-gradient(92% 92% at 92% 16%, rgba(88, 117, 220, 0.75), transparent 60%),
        radial-gradient(90% 88% at 12% 94%, rgba(255, 179, 138, 0.75), transparent 58%),
        radial-gradient(80% 84% at 94% 92%, rgba(81, 88, 166, 0.60), transparent 58%);
}

/* Заголовок сторінки — той самий голос, що hero боардлес-сторінок */
.set-head { display: flex; flex-direction: column; gap: 6px; margin: var(--space-4) 0 var(--space-5); }
.set-head h1 { font-family: var(--font-head); font-size: clamp(1.7rem, 3.4vw, 2.3rem); margin: 0; }
.set-lead { margin: 0; color: var(--color-text-muted); max-width: 52ch; }

/* Банер успіху (пара до .form-errors) */
.form-ok {
    background: var(--ex-ok-bg); border: 1px solid var(--ex-ok-border);
    border-radius: var(--radius-md); padding: 10px 14px;
    color: var(--color-success-700); font-weight: 600;
    margin: 0 0 var(--space-4);
}

/* Дві колонки: ліворуч (ширша) аватар + підписка, праворуч імʼя + пароль.
   align-items:stretch робить колонки однакової висоти. Права колонка коротша,
   тож зайву висоту розподіляємо РІВНОМІРНО між усіма рядками обох її плиток:
   плитки-flex тягнуться пропорційно кількості проміжків (імʼя=2, пароль=3),
   а форми всередині — justify-content:space-between → однакове повітря в кожному
   рядку обох плиток, без «дірки» знизу. */
.set-grid { display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); gap: var(--space-4); align-items: stretch; }
.set-col { display: flex; flex-direction: column; gap: var(--space-4); min-width: 0; }
.set-grid > .set-col:last-child > .set-tile { display: flex; flex-direction: column; }
.set-grid > .set-col:last-child > .set-tile:nth-child(1) { flex: 2 1 auto; }  /* імʼя: 2 проміжки */
.set-grid > .set-col:last-child > .set-tile:nth-child(2) { flex: 3 1 auto; }  /* пароль: 3 проміжки */
.set-grid > .set-col:last-child .set-form { flex: 1 1 auto; justify-content: space-between; }
/* Мобілка: колонки розчиняємо (display:contents), плитки стають прямими дітьми
   флекс-стовпця — і підписку через order відправляємо в кінець (за пароль).
   Розтяг/space-between тут скидаємо — інакше плитки тягнулись би на весь екран. */
@media (max-width: 900px) {
    .set-grid { display: flex; flex-direction: column; }
    .set-col { display: contents; }
    .set-tile-sub { order: 10; }
    .set-grid > .set-col:last-child > .set-tile { flex: 0 0 auto; }
    .set-grid > .set-col:last-child .set-form { flex: 0 0 auto; justify-content: flex-start; }
}

/* Плитка-скло — рецепт бенто дашборда (82% surface + blur) */
.set-tile {
    margin: 0; border: 0; border-radius: var(--radius-lg); min-width: 0;
    background: color-mix(in srgb, var(--color-surface) 82%, transparent);
    -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
    box-shadow: 0 2px 10px -4px color-mix(in srgb, var(--color-text) 20%, transparent);
    padding: 18px 20px 18px;
}
.set-tile h2 {
    font-family: var(--font-mono); font-size: 10.5px; font-weight: 400;
    letter-spacing: 0.16em; text-transform: uppercase; color: var(--color-text-muted);
    display: flex; align-items: center; gap: 10px; margin: 0 0 var(--space-3);
}

/* Поточний аватар + дії */
.set-ava-row { display: flex; gap: var(--space-4); align-items: center; }
.set-ava-cur {
    width: 104px; height: 104px; border-radius: 50%; object-fit: cover; flex: 0 0 auto;
    box-shadow: 0 2px 10px -3px color-mix(in srgb, var(--color-text) 30%, transparent);
    border: 3px solid var(--color-surface);
}
.set-ava-empty {
    display: flex; align-items: center; justify-content: center;
    background: var(--color-primary-050); color: var(--color-primary-700);
}
.set-ava-empty svg { width: 52px; height: 52px; }
.set-ava-actions { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; min-width: 0; }
.set-hint { margin: 0; font-size: var(--fs-small); color: var(--color-text-muted); }

/* Кнопка-label вибору файлу: сам input невидимий, але клікабельний */
.set-file-btn { position: relative; overflow: hidden; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; }
.set-file-btn input[type="file"] { position: absolute; inset: 0; opacity: 0; cursor: pointer; }

/* Сітка пресет-аватарок (файли з media/avatars/presets/) */
.set-presets-head {
    font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.16em;
    text-transform: uppercase; color: var(--color-text-muted);
    border-top: 1px dashed var(--color-border); margin: var(--space-4) 0 var(--space-3); padding-top: var(--space-3);
}
.set-presets { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(62px, 100%), 1fr)); gap: 10px; }
.set-preset {
    padding: 0; border: 2px solid transparent; border-radius: 50%; overflow: hidden;
    aspect-ratio: 1; background: var(--color-primary-050); cursor: pointer;
    transition: transform var(--dur-fast, 0.15s) var(--ease, ease), border-color var(--dur-fast, 0.15s) var(--ease, ease);
}
.set-preset img { width: 100%; height: 100%; object-fit: cover; display: block; }
.set-preset:hover { transform: translateY(-2px) scale(1.04); border-color: var(--color-primary-300, var(--color-primary)); }
.set-preset.selected { border-color: var(--color-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 25%, transparent); }

/* Форми в плитках: перевикористовуємо поля/кнопки .auth-form, але без її
   власної картки (фон/рамка/тінь) — плиткою тут виступає само скло .set-tile.
   Прибираємо і «записку на скотчі» .auth-form (нахил + блакитна стрічка::before):
   у скляній плитці вона недоречна; лишається лише на вході/реєстрації. */
.set-form { max-width: 100%; background: transparent; border: 0; box-shadow: none; padding: 0; gap: var(--space-3); transform: none; }
.set-form:focus-within { transform: none; }
.set-form::before { content: none; }
.set-form input:disabled { background: var(--color-bg); color: var(--color-text-muted); cursor: not-allowed; }
/* Кнопки форм — автоширина, вирівняні вліво (не на всю плитку) + disabled-стан */
.set-form button[type="submit"] { width: auto; align-self: flex-start; margin-top: 4px; }
.set-form button[type="submit"]:disabled {
    background: var(--color-border-strong); box-shadow: 0 3px 0 rgba(0,0,0,0.12);
    cursor: default; transform: none; filter: none;
}

/* Ghost-кнопка з рамкою — «Прибрати аватарку» */
.set-ava-remove { border: 1.5px solid var(--color-border-strong); }
.set-ava-remove:hover { border-color: var(--color-error-100); color: var(--color-error); background: transparent; }

/* Поле пароля з «оком».
   Специфічність .pw-field .pw-toggle (0,2,0) навмисно вища за .auth-form button
   (0,1,1) — інакше кнопка-тогл успадковувала б синю primary-заливку на всю ширину. */
.pw-field { position: relative; display: block; }
.pw-field input { width: 100%; padding-right: 44px; }
.pw-field .pw-toggle {
    position: absolute; right: 6px; top: 50%; transform: translateY(-50%);
    width: 32px; height: 32px; min-width: 0; padding: 0;
    display: inline-flex; align-items: center; justify-content: center;
    border: 0; background: transparent; color: var(--color-text-muted); cursor: pointer;
    border-radius: var(--radius-sm); box-shadow: none; font-weight: 400;
}
.pw-field .pw-toggle:hover { color: var(--color-primary-700); background: var(--color-primary-050); transform: translateY(-50%); }
.pw-field .pw-toggle:active { transform: translateY(-50%); }
.pw-field .pw-toggle svg { width: 18px; height: 18px; }

/* Плитка підписки */
.set-sub { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; }
.set-sub-badge {
    display: inline-flex; align-items: center; gap: 8px;
    border: 1px solid var(--color-border-strong); border-radius: var(--radius-pill);
    padding: 6px 14px; font-weight: 700; color: var(--color-text-muted); background: var(--color-bg);
}
.set-sub-badge.on { background: var(--ex-ok-bg); border-color: var(--ex-ok-border); color: var(--color-success-700); }
/* Рядок «мандруєш із нами з …» */
.set-member {
    display: flex; align-items: center; gap: 8px; margin: var(--space-3) 0 0;
    font-size: var(--fs-small); color: var(--color-text-muted);
}
.set-member svg { width: 16px; height: 16px; flex: 0 0 auto; color: var(--color-secondary-700); }
.set-member b { color: var(--color-text); font-weight: 700; }

/* Видалення профілю — секція в плитці підписки (розділювач + підзаголовок) */
.set-sub-danger {
    border-top: 1px dashed var(--color-border); margin-top: var(--space-4); padding-top: var(--space-4);
    display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-2);
}
.set-sub-h3 {
    margin: 0; font-family: var(--font-head); font-size: 1rem; font-weight: 700; color: var(--color-error);
}
.set-sub-danger .btn-danger { margin-top: 4px; }

/* Попап видалення — на базі канонічної confirm-модалки (графіт-дім + скло) */
.confirm-overlay[hidden] { display: none; }   /* .confirm-overlay має display:flex — hidden сам не сховає */
.set-modal-card { width: min(440px, 92vw); }
.set-modal-title {
    margin: 0 0 var(--space-3); font-family: var(--font-head); font-size: 1.25rem;
    display: flex; align-items: center; gap: 8px; color: var(--color-error);
}
.set-modal-title svg { width: 22px; height: 22px; flex: 0 0 auto; }
.set-modal-text { margin: 0 0 var(--space-4); color: var(--color-text); }
.set-modal-text b { font-weight: 700; }
.set-modal-form { display: flex; flex-direction: column; gap: var(--space-4); }

/* Поле пароля підтвердження (поза .auth-form — стилюємо тут) */
.set-delete-label {
    display: flex; flex-direction: column; gap: 5px; width: 100%;
    font-size: var(--fs-small); color: var(--color-text-muted); font-weight: 600;
}
.set-delete-label input {
    font: inherit; padding: 12px 44px 12px 14px; border: 1.5px solid var(--color-border-strong);
    border-radius: var(--radius-sm); background: var(--color-surface); transition: border-color var(--dur-fast) var(--ease);
}
.set-delete-label input:focus {
    outline: none; border-color: var(--color-error);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-error) 18%, transparent);
}
.btn-danger:disabled {
    background: var(--color-border-strong); color: var(--color-on-accent);
    border-color: var(--color-border-strong); box-shadow: 0 3px 0 rgba(0,0,0,0.12);
    cursor: default; transform: none; filter: none;
}

/* Аватар-картинка в шапці (замість іконки) */
.profile-avatar-img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }

/* Позначка «Чернетка» — неопублікований контент, який бачить лише адмін
   (картка уроку на карті, шапка юніта в маршрутах, адмінка публікації) */
.draft-badge {
    display: inline-block; align-self: center;
    padding: 2px 8px; border-radius: 999px;
    font-size: 11px; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase;
    background: var(--color-warning-100, #fdf0d5); color: var(--color-warning-700, #9a6b00);
    border: 1px dashed var(--color-warning, #e0a800);
}
.lesson-card { position: relative; } /* якір для .draft-badge */
.lesson-card .draft-badge { position: absolute; top: 8px; right: 8px; z-index: 2; }

/* === Адмінка: спільна навігація, пошук уроків, публікація === */
.admin-nav {
    display: flex; gap: 4px; align-items: center; flex-wrap: wrap;
    margin: 0 0 18px; padding: 6px 8px;
    background: var(--color-surface); border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
}
.admin-nav-link {
    padding: 7px 14px; border-radius: var(--radius-sm);
    text-decoration: none; color: var(--color-text); font-weight: 600; font-size: 14px;
}
.admin-nav-link:hover { background: var(--color-bg-warm); }
.admin-nav-link.active { background: var(--color-primary); color: #fff; }
.admin-nav-create { margin-left: auto; }
.admin-flash.err { background: #fdecea; border: 1px solid #d93025; color: #a50e0e; }

/* Пошук у списку уроків */
.admin-toolbar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 14px; }
.admin-toolbar input[type=search] {
    flex: 1 1 260px; min-width: 200px; padding: 9px 14px;
    border: 1px solid var(--color-border); border-radius: var(--radius-sm); font-size: 14px;
}
.admin-toolbar select { padding: 8px 10px; border-radius: var(--radius-sm); border: 1px solid var(--color-border); }
.admin-count { color: var(--color-text-muted); font-size: 13px; white-space: nowrap; }
.admin-row-broken td { background: #fdecea; }

/* Публікація: згортані групи зі станом */
details.pub-group > summary {
    display: flex; align-items: center; gap: 12px; padding: 7px 14px;
    background: var(--color-surface); color: var(--color-text);
    font-weight: 700; font-size: 14px; cursor: pointer; list-style: none;
}
details.pub-group[open] > summary { border-bottom: 1px solid var(--color-border); }
details.pub-group > summary:hover { background: var(--color-bg-warm); }
details.pub-group > summary::-webkit-details-marker { display: none; }
details.pub-group > summary .grow { flex: 1; }
details.pub-group > summary::before { content: "▸"; color: var(--color-text-muted); }
details.pub-group[open] > summary::before { content: "▾"; }
.pub-state { font-size: 12px; font-weight: 600; color: var(--color-text-muted); white-space: nowrap; }
.pub-state.all-on { color: var(--color-success-700, #1e7d3e); }
.pub-bulk { display: flex; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var(--color-border); background: var(--color-surface); }
