﻿/* Оформление публичных страниц: главной, соглашения и политики.

   Отдельный файл, ни строчки из app.css и ни одной переменной Radzen: эти страницы живут
   вне Blazor, тема компонентов на них не подключена, и тянуть её ради текста незачем.

   Мир один на все три страницы. Раньше их делил класс на <body>: главная была тёмной, а
   соглашение и политика оставались чёрным текстом на белом — «их читают, а не разглядывают».
   На деле это читалось не сдержанностью, а обрывом: человек уходил со стены с плакатом по
   ссылке в подвале и попадал на пустой лист бумаги из другой программы. Теперь стена, зерно,
   лента и палитра принадлежат самому <body>, а классы `gate` и `dossier` разводят не
   оформление, а раскладку: у главной — колонка по центру экрана вокруг плаката, у
   документов — подшитый лист с длинным текстом.

   Разделение классов сохранено ровно ради того же, ради чего заводилось: `login-*`, `button`
   и `notice` встречаются в разметке одного файла, и документ, добавив себе кнопку, не должен
   получить вместе с ней ржавую табличку со входа. */

:root {
    --ash: #0d0c0a;          /* стена в тени */
    --concrete: #17140f;     /* планка под текст */
    --bone: #e9e3d5;         /* бумага плаката, она же основной текст */
    --bone-dim: #9d9482;     /* то, что читают один раз */
    --signal: #b2170b;       /* красный с плаката */
    --signal-hot: #d62a18;   /* он же под курсором */
    --hazard: #c9a227;       /* предупреждающая лента и скотч */

    /* Два шрифта на всё: узкий гротеск для заголовков и табличек — им на плакате набрано
       название, — и машинка для служебных строк. Основной текст ими не набирают: см.
       комментарий у колонки документа. */
    --stencil: 'PT Sans Narrow', 'Arial Narrow', 'Helvetica Neue', Arial, sans-serif;
    --typewriter: 'Courier New', Courier, monospace;
}

* { box-sizing: border-box; }

/* Тёмная страница целиком, а не только её фон: без этого браузер рисует светлые полосы
   прокрутки у длинных документов и светлые поля выделения. */
html { color-scheme: dark; }

body {
    margin: 0;
    background-color: var(--ash);
    color: var(--bone);
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    font-size: 1rem;
    line-height: 1.6;

    /* Три слоя вместо текстуры файлом: зарево от плаката сверху, тёмные углы и почти
       незаметная косая штриховка — ею на разметке обозначают опасную зону. Ни одного
       лишнего запроса: всё рисует градиентами сам браузер. Слои закреплены, поэтому у
       длинного документа стена стоит на месте, а по ней едет текст. */
    background-image:
        radial-gradient(120% 70% at 50% -10%, rgba(178, 23, 11, 0.16), transparent 62%),
        radial-gradient(105% 85% at 50% 42%, transparent 28%, rgba(0, 0, 0, 0.95) 100%),
        repeating-linear-gradient(135deg,
            rgba(201, 162, 39, 0.014) 0 26px, transparent 26px 58px);
    background-attachment: fixed;
}

/* Зерно поверх всего: без него градиенты выглядят чистой типографией, а стена должна быть
   грязной. SVG-шум лежит прямо в правиле — картинкой это был бы ещё один файл ради
   пятидесяти килобайт помех. */
body::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: 0;
    pointer-events: none;
    opacity: 0.045;
    filter: grayscale(1) contrast(150%);
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='180' height='180'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/></filter><rect width='180' height='180' filter='url(%23n)'/></svg>");
}

/* Лента поперёк верхнего края окна. Держится на месте при прокрутке: на главной прокрутки
   почти нет, а у документов она длинная, и лента работает верхней кромкой окна. */
body::after {
    content: "";
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    height: 6px;
    z-index: 2;
    pointer-events: none;
    opacity: 0.42;
    background: repeating-linear-gradient(135deg,
        var(--hazard) 0 12px, #0d0c0a 12px 24px);
}

/* --- Колонка содержимого -------------------------------------------------

   z-index — чтобы содержимое лежало над зерном, а не под ним. Ширину и поля задаёт себе
   каждая раскладка сама: у главной и у документа они разные. */

.site-main {
    position: relative;
    z-index: 1;
    margin: 0 auto;
    max-width: 46rem;
    padding: 2rem 1.5rem 3rem;
}


/* ==========================================================================
   Главная: плакат на стене
   ==========================================================================

   Картинка на главной — агитационный плакат: красный фон, резкий чёрно-белый портрет
   радиста, потёртая бумага, название по низу. Вокруг неё стояла обычная светлая форма
   входа с синей кнопкой и серой рамкой, и плакат в ней выглядел случайной наклейкой.
   Здесь наоборот: страница — стена, на которой он висит, а всё остальное подобрано под
   него. Красный взят с самого плаката (#b20300), к нему бетон, кость и жёлтый цвет
   предупреждающей ленты — больше на странице ничего нет.
   -------------------------------------------------------------------------- */

/* Колонка уже, чем в документах, и прижата к середине окна по вертикали: на главной всего
   четыре вещи, и растянутые по высокому экрану они читались бы обрывками. */
body.gate .site-main {
    max-width: 34rem;
    min-height: 100vh;
    min-height: 100dvh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 3rem 1.5rem;
}

body.gate .login-panel { text-align: center; }

/* --- Плакат ---------------------------------------------------------------

   Рамки нет вовсе: у плаката своя, нарисованная. Наклон на полтора градуса и жёсткая тень
   делают из картинки предмет на стене — ровно посаженная, она снова читалась бы элементом
   интерфейса. `inline-block` — чтобы наклон и скотч считались от самой картинки, а не от
   ширины колонки. */
body.gate .login-card {
    display: inline-block;
    position: relative;
    margin-bottom: 2.25rem;
    transform: rotate(-1.4deg);
    filter: drop-shadow(0 16px 26px rgba(0, 0, 0, 0.8));
}

body.gate .login-card img {
    display: block;
    width: min(62vw, 266px);
    height: auto;
    aspect-ratio: 399 / 600;
    outline: 1px solid rgba(233, 227, 213, 0.12);
}

/* Скотч по двум углам крест-накрест. Полупрозрачный и с рваным краем от полосатого
   градиента: ровный прямоугольник выглядел бы наклейкой, а не куском ленты. */
body.gate .login-card::before,
body.gate .login-card::after {
    content: "";
    position: absolute;
    width: 78px;
    height: 24px;
    background:
        linear-gradient(180deg, rgba(233, 216, 160, 0.34), rgba(170, 150, 100, 0.26));
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.55);
    opacity: 0.85;
}

body.gate .login-card::before { top: -12px; left: -22px; transform: rotate(-38deg); }
body.gate .login-card::after { bottom: -12px; right: -22px; transform: rotate(-38deg); }

/* --- Приказ под плакатом ---------------------------------------------------

   Строка о том, что программа делает. Моноширинный шрифт и красная черта сверху: это
   единственный связный текст на экране, и он должен читаться донесением, отпечатанным на
   машинке, а не подписью к картинке. */
body.gate .login-tagline {
    margin: 0 auto 2.25rem;
    max-width: 30rem;
    padding: 1.1rem 1.35rem;
    border: 1px solid rgba(233, 227, 213, 0.14);
    border-top: 2px solid var(--signal);
    background: rgba(23, 20, 15, 0.75);
    color: var(--bone-dim);
    font-family: var(--typewriter);
    font-size: 0.95rem;
    line-height: 1.65;
}

/* --- Кнопка входа ----------------------------------------------------------

   Табличка, привинченная к стене: прямые углы, срезанные фаски, жёсткая тень без размытия
   и разрядка по буквам. Тень нарисована `drop-shadow`, а не `box-shadow`, — та повторяет
   срезанные углы, а box-shadow остался бы прямоугольным вокруг них. */
body.gate .button {
    display: inline-block;
    padding: 0.5rem 1rem;
    background: var(--signal);
    color: #f7f2e7;
    font-family: var(--stencil);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.14em;
    text-decoration: none;
    border: 1px solid rgba(0, 0, 0, 0.55);
    clip-path: polygon(0 0, calc(100% - 13px) 0, 100% 13px,
                       100% 100%, 13px 100%, 0 calc(100% - 13px));
    filter: drop-shadow(5px 5px 0 rgba(0, 0, 0, 0.6));
    transition: background 0.12s ease, transform 0.12s ease, filter 0.12s ease;
}

body.gate .button-lg { padding: 0.95rem 2.1rem; font-size: 1.15rem; }

body.gate .button:hover {
    background: var(--signal-hot);
    transform: translate(-2px, -2px);
    filter: drop-shadow(7px 7px 0 rgba(0, 0, 0, 0.65));
}

/* Нажатие вдавливает табличку: сдвиг вместе с тенью, а не подсветка. */
body.gate .button:active {
    transform: translate(2px, 2px);
    filter: drop-shadow(2px 2px 0 rgba(0, 0, 0, 0.6));
}

/* Пунктирная обводка, а не сплошная: сплошная на срезанных углах выглядит вторым контуром
   кнопки. Отбита от таблички, чтобы не сливаться с её рамкой. */
body.gate .button:focus-visible {
    outline: 2px dashed var(--hazard);
    outline-offset: 5px;
}

/* --- Сообщения -------------------------------------------------------------

   Оба сообщения на этой странице — редкие: ошибка входа и ненастроенный Google. Светлые
   плашки в тёмной странице резали бы глаз ярче самой ошибки, поэтому цвет здесь только в
   рамке и тексте. */
body.gate .notice {
    max-width: 30rem;
    margin: 0 auto 1.75rem;
    padding: 0.85rem 1.1rem;
    text-align: left;
    font-family: var(--typewriter);
    font-size: 0.92rem;
}

body.gate .notice-danger {
    background: rgba(178, 23, 11, 0.14);
    border: 1px solid rgba(214, 42, 24, 0.55);
    color: #f0c8c1;
}

body.gate .notice-warning {
    background: rgba(201, 162, 39, 0.1);
    border: 1px solid rgba(201, 162, 39, 0.45);
    color: #e3d1a2;
}

body.gate .notice code { color: var(--hazard); }

/* Ожидание одобрения. Цвет жёлтый, а не красный: человек ничего не нарушил и ниоткуда не
   изгнан — он в очереди. Красным на этой странице говорят только о сорвавшемся входе. */
body.gate .notice-pending {
    background: rgba(201, 162, 39, 0.08);
    border: 1px solid rgba(201, 162, 39, 0.4);
    color: var(--bone);
    text-align: center;
}

body.gate .notice-pending p { margin: 0 0 0.75rem; }
body.gate .notice-pending p:last-child { margin-bottom: 0; }

/* Ссылка «обновите страницу» — в тон правовым ссылкам внизу: тот же цвет и то же красное
   подчёркивание, чтобы в жёлтой плашке она не терялась и не спорила с ней. */
body.gate .notice-pending a {
    color: var(--bone);
    text-decoration: underline;
    text-decoration-color: rgba(178, 23, 11, 0.8);
    text-underline-offset: 3px;
}

body.gate .notice-pending a:hover { color: var(--signal-hot); }

body.gate .notice-title {
    font-family: var(--stencil);
    font-size: 1.15rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.12em;
    color: var(--hazard);
}

/* Выход рядом с сообщением об ожидании. Табличка та же, но пустая внутри: это не то действие,
   ради которого человек пришёл, и спорить с красной кнопкой входа по силе ей незачем. Своей
   формы у кнопки нет отступов — их держит сама форма. */
body.gate .button-ghost {
    background: transparent;
    color: var(--bone);
    border-color: rgba(233, 227, 213, 0.4);

    /* Тени нет намеренно: у красной таблички она рисуется по её силуэту, а сквозь пустую
       кнопку тот же чёрный прямоугольник просвечивал бы насквозь. */
    filter: none;
}

body.gate .button-ghost:hover {
    background: rgba(233, 227, 213, 0.08);
    color: var(--bone);
    filter: none;
}

/* Кнопка выхода приходит внутри <form> — блочного элемента во всю ширину колонки. Без этого
   она прижалась бы к левому краю, а всё остальное на странице стоит по центру. */
body.gate .login-panel form { margin: 0; text-align: center; }

/* Форма выхода стоит после другой кнопки или формы: у ссылки-таблички своих полей нет, и без
   отступа две таблички слипались бы в одну. Отступ сверху схлопывается с нижним полем плашки
   или формы перед ней, так что там, где зазор уже был, он не удваивается. */
body.gate .login-panel form.exit-form { margin-top: 1.25rem; }

/* --- Правовые ссылки -------------------------------------------------------

   Низ страницы. Отбит той же предупреждающей лентой, что и верх окна, — она замыкает экран
   сверху и снизу; текст мелкий и приглушённый: его читают один раз, а видят каждый. */
body.gate .legal-links {
    position: relative;
    margin-top: 2.75rem;
    padding-top: 1.6rem;
    color: var(--bone-dim);
    font-family: var(--typewriter);
    font-size: 0.8rem;
}

body.gate .legal-links::before {
    content: "";
    position: absolute;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    width: min(100%, 17rem);
    height: 6px;
    opacity: 0.3;
    background: repeating-linear-gradient(135deg,
        var(--hazard) 0 12px, transparent 12px 24px);
    /* Лента гаснет к концам, а не обрывается посреди полоски: обрезанный край читался бы
       недорисованной линией. */
    -webkit-mask-image: linear-gradient(90deg, transparent, #000 25%, #000 75%, transparent);
    mask-image: linear-gradient(90deg, transparent, #000 25%, #000 75%, transparent);
}

body.gate .legal-links p { margin: 0; }

body.gate .legal-links a {
    color: var(--bone);
    text-decoration: underline;
    text-decoration-color: rgba(178, 23, 11, 0.8);
    text-underline-offset: 3px;
}

body.gate .legal-links a:hover { color: var(--signal-hot); }


/* ==========================================================================
   Документы: подшитый лист
   ==========================================================================

   Соглашение и политика. Со стены сюда приходят по ссылке из-под кнопки входа, и до
   недавнего они встречали белым листом — оформление обрывалось на границе страницы.
   Теперь это тот же мир: та же стена, то же зерно, та же лента поверху, — а документ лежит
   на ней подшитым листом, чуть светлее фона и с жёсткой тенью, как плакат на главной.

   Дальше начинается расхождение с главной, и оно намеренное. Главную разглядывают
   несколько секунд, документ читают минутами, и всё, что там работает на образ, здесь
   работало бы против чтения: основной текст набран обычным гротеском, а не машинкой —
   тремя тысячами слов Courier превращается в испытание; строки чёрные не по бумаге, а
   костяные по бетону, и яркость кости для длинного текста приглушена. Машинка и узкий
   гротеск остались там, где текста мало: штамп с датой, заголовки разделов, приписка в
   рамке и строка возврата. -------------------------------------------------------------- */

body.dossier .site-main {
    max-width: 48rem;
    margin: 2.5rem auto 4rem;
    padding: 3rem 2.5rem 3.5rem;
    background: rgba(23, 20, 15, 0.72);
    border: 1px solid rgba(233, 227, 213, 0.1);
    box-shadow: 0 18px 44px rgba(0, 0, 0, 0.6);
}

/* Заголовок документа — та же табличка, что и кнопка на главной, только без фона: узкий
   гротеск, прописные, разрядка. Красная черта под ним отделяет шапку от текста и повторяет
   черту над приказом на главной.

   Правило стоит на самом h1, а не внутри `.legal`: в разметке заголовок — сосед этого
   блока, а не его содержимое. Прежнее `.legal h1` не совпадало ни с чем, и заголовок все
   это время рисовался умолчанием браузера. */
body.dossier h1 {
    margin: 0 0 1.5rem;
    padding-bottom: 1rem;
    border-bottom: 2px solid var(--signal);
    font-family: var(--stencil);
    font-size: clamp(1.5rem, 4.5vw, 2.05rem);
    font-weight: 700;
    line-height: 1.15;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--bone);
}

/* Основной текст. Кость на две трети яркости: полная — это цвет заголовков и плаката, и
   абзацем на пол-экрана она светится. */
body.dossier .legal {
    color: rgba(233, 227, 213, 0.82);
    line-height: 1.7;
}

body.dossier .legal p { margin: 0 0 1rem; }

/* Дата редакции — штамп, а не подпись: пунктирная рамка по содержимому и машинка. */
body.dossier .legal-meta {
    display: inline-block;
    margin: 0 0 0.5rem;
    padding: 0.3rem 0.75rem;
    border: 1px dashed rgba(201, 162, 39, 0.45);
    color: var(--hazard);
    font-family: var(--typewriter);
    font-size: 0.82rem;
    letter-spacing: 0.03em;
}

/* Заголовки разделов. Тот же жёлтый, что у «Доступ ещё не открыт» на главной, и красная
   отметка на поле — по ней раздел находят, прокручивая документ. Номер раздела стоит в
   самом тексте заголовка, счётчиком его не подменяем. */
body.dossier .legal h2 {
    margin: 2.75rem 0 1rem;
    padding-left: 0.9rem;
    border-left: 3px solid var(--signal);
    font-family: var(--stencil);
    font-size: 1.15rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--hazard);
}

/* Выделенное в тексте — полной костью: в приглушённом абзаце этого хватает, чтобы фраза
   встала на голос, и не приходится красить её в красный. */
body.dossier .legal strong { color: var(--bone); font-weight: 700; }

body.dossier .legal ul { margin: 0 0 1rem; padding-left: 1.4rem; list-style: square; }
body.dossier .legal li { margin-bottom: 0.45rem; }
body.dossier .legal li::marker { color: var(--signal); }

/* Ссылки внутри документа и строка возврата: подчёркнуты красным с плаката, ровно как
   правовые ссылки под кнопкой входа. */
body.dossier a {
    color: var(--bone);
    text-decoration: underline;
    text-decoration-color: rgba(178, 23, 11, 0.8);
    text-underline-offset: 3px;
}

body.dossier a:hover { color: var(--signal-hot); }

body.dossier a:focus-visible {
    outline: 2px dashed var(--hazard);
    outline-offset: 3px;
}

/* Приписка в конце документа — та же планка, что «приказ» под плакатом: машинка, красная
   отметка, фон темнее листа. Отбивка сверху больше, чем между абзацами: это уже не часть
   текста, а сноска к нему. */
body.dossier .legal-note {
    margin-top: 2.5rem;
    padding: 1rem 1.25rem;
    background: rgba(13, 12, 10, 0.66);
    border: 1px solid rgba(233, 227, 213, 0.12);
    border-left: 3px solid var(--signal);
    color: var(--bone-dim);
    font-family: var(--typewriter);
    font-size: 0.9rem;
    line-height: 1.65;
}

/* Возврат на главную. Отбит той же лентой, что и правовые ссылки на главной, но по левому
   краю: документ выключен влево, и полоска по центру висела бы сама по себе. */
body.dossier .back-link {
    position: relative;
    margin: 3rem 0 0;
    padding-top: 1.6rem;
    font-family: var(--stencil);
    font-size: 1rem;
    text-transform: uppercase;
    letter-spacing: 0.12em;
}

body.dossier .back-link::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: min(100%, 17rem);
    height: 6px;
    opacity: 0.3;
    background: repeating-linear-gradient(135deg,
        var(--hazard) 0 12px, transparent 12px 24px);
    -webkit-mask-image: linear-gradient(90deg, #000 60%, transparent);
    mask-image: linear-gradient(90deg, #000 60%, transparent);
}

body.dossier .back-link a { color: var(--bone-dim); text-decoration: none; }
body.dossier .back-link a:hover { color: var(--signal-hot); }


/* --- Узкий экран -----------------------------------------------------------

   Плакат остаётся плакатом: он ужимается процентами ширины окна (`min(62vw, …)` выше), а не
   уезжает под текст. Здесь только то, что процентами не решается: поля колонки, разрядка
   кнопки на всю ширину и скотч, которому на маленьком плакате хватает полосок поменьше.

   У документа на телефоне лист занимает экран целиком: поля в 2.5rem по бокам съедали бы
   треть строки, а тень и рамка вокруг узкой колонки только сжимали бы её ещё сильнее. */
@media (max-width: 32rem) {
    body.gate .site-main { padding: 2.25rem 1.1rem; }
    body.gate .login-tagline { padding: 0.9rem 1rem; font-size: 0.88rem; }
    body.gate .button-lg { padding: 0.85rem 1.4rem; font-size: 1rem; letter-spacing: 0.1em; }

    body.gate .login-card::before,
    body.gate .login-card::after { width: 58px; height: 18px; }
    body.gate .login-card::before { top: -9px; left: -16px; }
    body.gate .login-card::after { bottom: -9px; right: -16px; }

    body.dossier .site-main {
        margin: 0;
        padding: 2.25rem 1.15rem 3rem;
        border: 0;
        box-shadow: none;
        background: transparent;
    }

    body.dossier .legal h2 { margin-top: 2.25rem; font-size: 1.05rem; }
}

/* Движения на странице всего одно — кнопка под курсором. Тем, кто просил его отключить,
   остаётся смена цвета: она и есть ответ на наведение. */
@media (prefers-reduced-motion: reduce) {
    body.gate .button { transition: background 0.12s ease; }
    body.gate .button:hover,
    body.gate .button:active { transform: none; }
}

