/* ==========================================================================
   Марго Квиз — Design System v2 «Неон-сцена»
   landing.css — ВИТРИНА, ВНУТРЕННИЙ ХАБ И СТРАНИЦЫ ОШИБОК.
   Стадия 04, шестая и последняя поверхность.

   Требует: tokens.css (блок .mk-landing — шкала, --tap), motion.css,
   components.css (предметы 33 «живой фон», 34 «кнопка действия», 39 «дверь»).

   ГЛАВНЫХ СТРАНИЦ СЕГОДНЯ ДВЕ, И ОНИ РАЗНЫЕ. По корню домена отдаётся хаб
   на десять карточек внутренней навигации (static/index.html), по /hub —
   второй хаб на три карточки со своей палитрой (static/landing/index.html).
   Обе называются «Марго Квиз», обе на старых стилях, продуктовой витрины
   нет ни на одной.

   ПРЕДЛОЖЕНИЕ ЭТОГО ФАЙЛА: свести не в одну страницу, а в две — но в две
   РАЗНЫЕ, а не в две одинаковые.
       /      — ВИТРИНА: что это за продукт, кому, как проходит вечер,
                что нужно от площадки, как заказать. Смотрит наружу.
       /hub   — ЕДИНСТВЕННЫЙ внутренний хаб: все двери проекта, собранные
                по ролям. Смотрит внутрь.
   Внутренняя навигация и витрина — разные вещи, и это законный ответ на
   вопрос «свести в одну». Незаконно другое: две витрины или два хаба.
   Смена того, что отдаётся по корню, — решение владельца, а не дизайна;
   вопрос вынесен в отчёт приёмки.

   ЧЕГО ЗДЕСЬ НЕТ И БЫТЬ НЕ МОЖЕТ. Ни одного отзыва, кейса, метрики и
   скриншота живой игры в проекте не существует, и выдумывать их нельзя
   (PRODUCT.md, «Evidence on Hand»). Цены тоже нет: развилка «агентская
   модель против SaaS» владельцем не закрыта. Поэтому витрина построена
   на том, что проверяемо: три сцены вечера, ход игры, требования
   к площадке, — и заканчивается разговором, а не корзиной.

   ЗАКАЗЧИК — СМЕННЫЙ СЛОЙ, А НЕ ИДЕНТИЧНОСТЬ (BRAND.md §7). ГКП-51,
   «Ачим Девелопмент» и юбилей на витрине не упоминаются ни разу: тот же
   продукт продаётся площадке, у которой нет ни газа, ни Севера.
   ========================================================================== */

/* ==========================================================================
   1 · Каркас поверхности
   ========================================================================== */

.mk-landing {
    position: relative;
    background: var(--bg-0);
    color: var(--text-mid);
    font-family: var(--font-body);
    /* Единственная поверхность проекта, которую ПРОКРУТЯТ. Остальные пять
       живут в один экран: зал не листают, телефон капитана прокручивает
       только тело, у оператора прокрутка во время игры равна пропущенному
       событию. */
    overflow-x: hidden;
    hyphens: auto;
    overflow-wrap: break-word;
}

/* Пятна живого фона крупнее, чем у мини-игры: витрину смотрят целиком
   и издалека — с ноутбука и с телефона, — и фон здесь работает атмосферой,
   а не подсветкой одного блока. */
.mk-landing .mk-aurora { --mk-aurora-size: 780px; }

/* Поверхность живёт на <body>, как зал живёт на `body.mk-tv` (hall.css).
   Отступ страницы гасится ЗДЕСЬ и только здесь: своего <style> у витрины
   и хаба нет — второй источник правды по цвету и кеглю в этом проекте
   уже стоил таска 14. Без этой строки восемь пикселей поля браузера
   вдавливают живой фон внутрь окна.

   Кегль поверхности объявлен тоже здесь: `.mk-landing` задаёт имена
   --fs-*, но не сам font-size, и без этой строки сплошной текст
   витрины читался бы браузерным умолчанием. Несущим он не является:
   каждая колонка, считающая ширину в `ch`, объявляет свой кегль сама. */
body.mk-landing {
    margin: 0;
    min-height: 100vh;
    font-size: var(--fs-body);
}

.mk-land__wrap {
    position: relative;
    z-index: 1;
    max-width: 1120px;
    margin: 0 auto;
    padding: 0 var(--sp-6) var(--sp-8);
}

/* ---------- Верхняя строка ---------- */

.mk-land__nav {
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    padding: var(--sp-5) 0;
}

.mk-land__logo {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    color: var(--text-hi);
    text-decoration: none;
}

.mk-land__logo svg {
    width: calc(var(--tap) * 0.7);
    height: calc(var(--tap) * 0.7);
    color: var(--brand-soft);
}

.mk-land__logo b {
    font-family: var(--font-display);
    font-weight: 700;
    font-size: var(--fs-h3);
}

.mk-land__nav .mk-act { margin-left: auto; }

/* ==========================================================================
   2 · Витрина
   ========================================================================== */

/* ОБЕЩАНИЕ ОДНО И СТОИТ ПЕРВЫМ. Человек, открывший страницу, должен за
   три секунды понять, что покупает вечер с ИИ-ведущей, а не «платформу для
   квизов». Поэтому в первом экране ровно один заголовок, один абзац и одно
   действие; три сцены идут ниже отдельным блоком, а не спорят с ним. */
.mk-land__hero {
    display: flex;
    flex-direction: column;
    gap: var(--sp-5);
    padding: var(--sp-8) 0 var(--sp-7);
}

.mk-land__hero h1 {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: var(--fs-hero);
    line-height: 1.05;
    color: var(--text-hi);
    /* 22 знака ЗАГОЛОВКА — и мерятся они здесь, на самом заголовке, где
       кегль заголовочный и есть. Прежде ограничение стояло на блоке-
       родителе, а `ch` считается от шрифта того элемента, на котором
       написано: родитель живёт кеглем текста (~16 px), и колонка выходила
       ~200 px — под заголовком в 76 px это ломало первый экран.
       Что имелись в виду знаки заголовка, видно из «Узкого экрана» ниже:
       ограничение снимается только до 860 px, а колонку в 200 px снимать
       там было бы незачем — она давит на любой ширине.
       Родителю кегль НЕ назначен намеренно: несущий кегль контейнера
       поставил бы каждого следующего потомка хиро, забывшего свой
       размер, в 76 px — а файл общий, его читает и дизайн-стенд.
       Строка обещания шире заголовка и держит свои 46 знаков сама. */
    max-width: 22ch;
}

/* Строка обещания шире заголовка: заголовок держит ритм в 22 знака,
   абзац читают строками по 60–70. */
.mk-land__lead {
    margin: 0;
    max-width: 46ch;
    font-size: var(--fs-h3);
    color: var(--text-mid);
}

.mk-land__acts { display: flex; flex-wrap: wrap; gap: var(--sp-3); }

.mk-land__sec { padding: var(--sp-7) 0; }

.mk-land__sec > h2 {
    margin: 0 0 var(--sp-2);
    font-family: var(--font-display);
    font-weight: 700;
    font-size: var(--fs-h1);
    line-height: 1.1;
    color: var(--text-hi);
}

.mk-land__sec > p {
    margin: 0 0 var(--sp-5);
    max-width: 62ch;
    font-size: var(--fs-body);
}

/* ---------- Три сцены вечера ----------
   Продукт продаётся тремя сценами, а не списком функций: зал, телефон
   капитана, ноутбук оператора. Это же деление лежит в основании всей
   системы — у каждой сцены своя дистанция, свой ввод и своя шкала. */

.mk-land__grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--sp-4);
}

.mk-land__card {
    display: flex;
    flex-direction: column;
    gap: var(--sp-3);
    padding: var(--sp-5);
    border-radius: var(--r-lg);
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    min-width: 0;
}

.mk-land__card h3 {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: var(--fs-h2);
    line-height: 1.15;
    color: var(--text-hi);
}

.mk-land__card p { margin: 0; font-size: var(--fs-small); }

.mk-land__card .mk-label { margin-bottom: calc(var(--sp-1) * -1); }

/* ---------- Ход вечера ----------
   Пять шагов вертикальной лентой, а не таблицей: у вечера есть порядок,
   и порядок — половина того, что покупают. Номер шага держит колонку
   слева, поэтому длинное название тура не ломает ритм. */

.mk-land__flow { display: flex; flex-direction: column; gap: var(--sp-3); }

.mk-land__step {
    display: grid;
    grid-template-columns: calc(var(--tap) * 0.9) minmax(0, 1fr);
    gap: var(--sp-4);
    align-items: start;
    padding: var(--sp-4);
    border-radius: var(--r-md);
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
}

.mk-land__step > i {
    display: grid;
    place-items: center;
    width: calc(var(--tap) * 0.9);
    height: calc(var(--tap) * 0.9);
    border-radius: var(--r-full);
    background: var(--emotion-faint);
    border: 1px solid var(--emotion-border);
    font-family: var(--font-num);
    font-style: normal;
    font-weight: 700;
    font-size: var(--fs-h3);
    color: var(--emotion-soft);
}

.mk-land__step b {
    display: block;
    font-size: var(--fs-h3);
    color: var(--text-hi);
}

.mk-land__step span { font-size: var(--fs-small); }

/* ---------- Что нужно от площадки ----------
   Самый недооценённый блок витрины: организатор отказывается не от идеи,
   а от неизвестности. Пять строк, каждая — проверяемое требование. */

.mk-land__needs {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--sp-3);
    margin: 0;
    padding: 0;
    list-style: none;
}

.mk-land__needs li {
    display: flex;
    gap: var(--sp-3);
    padding: var(--sp-3) var(--sp-4);
    border-radius: var(--r-md);
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    font-size: var(--fs-small);
}

.mk-land__needs b { color: var(--text-hi); font-weight: 600; }

/* ---------- Разговор вместо корзины ----------
   ЦЕНЫ НА ВИТРИНЕ НЕТ, И ЭТО НЕ ЗАГЛУШКА. Модель продаж (агентская против
   SaaS) владельцем не выбрана, а выдуманная цифра на витрине — обещание,
   за которое потом отвечать. Блок устроен так, что цифра встаёт на место
   одной строкой, когда решение будет принято. */

.mk-land__cta {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: var(--sp-4);
    padding: var(--sp-7) var(--sp-6);
    border-radius: var(--r-lg);
    background:
        radial-gradient(70% 120% at 20% 0%, var(--emotion-faint), transparent 70%),
        var(--glass-bg);
    border: 1px solid var(--emotion-border);
    box-shadow: var(--glow-emotion-soft);
}

.mk-land__cta h2 {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: var(--fs-h1);
    line-height: 1.1;
    color: var(--text-hi);
}

.mk-land__cta p { margin: 0; max-width: 56ch; font-size: var(--fs-body); }

.mk-land__foot {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--sp-4);
    padding-top: var(--sp-6);
    border-top: 1px solid var(--glass-border);
    font-size: var(--fs-small);
    color: var(--text-dim);
}

.mk-land__foot .mk-land__logo b { font-size: var(--fs-body); }

/* ==========================================================================
   3 · Внутренний хаб
   Состояния: игра идёт · игры нет (часть дверей закрыта)

   ДЕСЯТЬ ДВЕРЕЙ, СОБРАННЫХ ПО РОЛЯМ. Сегодня их два набора на двух
   страницах — десять карточек по одному адресу и три по другому. Здесь
   один набор и три группы: «во время игры», «до игры» и «после».
   Порядок групп — порядок вечера, а не алфавит.
   ========================================================================== */

.mk-land__doors {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--sp-4);
}

.mk-land__group { padding-top: var(--sp-6); }

.mk-land__group > .mk-label { display: block; margin-bottom: var(--sp-3); }

/* ==========================================================================
   4 · Страницы ошибок
   Состояния: страницы нет · игра не идёт · нужен код

   СЕГОДНЯ ИХ НЕТ ВОВСЕ: FastAPI отдаёт JSON вида {"detail":"Not Found"},
   и человек, промахнувшийся адресом за пять минут до игры, видит машинный
   текст. Правило страницы отказа то же, что у зала: назвать, что случилось,
   и дать выход. Выход здесь — дверь, а не кнопка «назад».
   ========================================================================== */

.mk-land__err {
    position: relative;
    z-index: 1;
    min-height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--sp-5);
    padding: var(--sp-8) var(--sp-6);
    text-align: center;
}

.mk-land__err h1 {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: var(--fs-h1);
    line-height: 1.1;
    color: var(--text-hi);
}

/* Код ошибки — служебная подпись, а не заголовок: человеку важно «чего
   именно нет», а не «404». Число остаётся для того, кто его ищет. */
.mk-land__err__code {
    font-family: var(--font-num);
    font-size: var(--fs-label);
    letter-spacing: var(--ls-label);
    color: var(--text-dim);
}

.mk-land__err p { margin: 0; max-width: 52ch; font-size: var(--fs-body); }

.mk-land__err .mk-land__doors {
    grid-template-columns: repeat(3, minmax(0, 240px));
    text-align: left;
}

/* ==========================================================================
   5 · Узкий экран
   Витрину открывают с телефона чаще, чем с ноутбука: ссылку пересылают
   в переписке. Правило простое — всё в одну колонку, кроме требований
   к площадке: там строки короткие и две колонки живут до 560.
   ========================================================================== */

@container (max-width: 860px) {
    .mk-land__grid,
    .mk-land__doors,
    .mk-land__err .mk-land__doors { grid-template-columns: minmax(0, 1fr); }
    /* Ограничение снимается там, где оно написано, — на заголовке. */
    .mk-land__hero { padding-top: var(--sp-6); }
    .mk-land__hero h1 { max-width: none; }
    .mk-land__wrap { padding: 0 var(--sp-4) var(--sp-7); }
}

@container (max-width: 560px) {
    .mk-land__needs { grid-template-columns: minmax(0, 1fr); }
    .mk-land__nav { flex-wrap: wrap; }
    .mk-land__nav .mk-act { margin-left: 0; }
    .mk-land__acts .mk-act { width: 100%; }
}
