/*
 * Шрифты бренда — self-hosted (NFR, FE-18): ни одного обращения к
 * внешним шрифтовым CDN в рантайме. Причина не только в скорости: запрос
 * к чужому CDN с каждой страницы — это утечка IP читателя третьей
 * стороне и точка отказа при блокировках.
 *
 * Оба файла — вариативные (один woff2 на всю ось начертаний), поэтому
 * `font-weight` объявлен диапазоном: браузер интерполирует 500/600 из
 * того же файла, лишних загрузок нет.
 *
 * Сабсеты — только `cyrillic` и `latin` (границы unicode-range взяты из
 * исходной раскладки семейств как есть): расширенные кириллица/латиница, греческий и
 * вьетнамский платформе не нужны и стоили бы лишних килобайт.
 *
 * Лицензия обоих шрифтов — SIL Open Font License 1.1 (Golos Text —
 * Paratype, Literata — TypeTogether), self-hosting разрешён.
 */

@font-face {
    font-family: "Golos Text";
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url("../fonts/golos-text-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
    font-family: "Golos Text";
    font-style: normal;
    font-weight: 400 700;
    font-display: swap;
    src: url("../fonts/golos-text-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: "Literata";
    font-style: normal;
    font-weight: 400 600;
    font-display: swap;
    src: url("../fonts/literata-cyrillic.woff2") format("woff2");
    unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
    font-family: "Literata";
    font-style: normal;
    font-weight: 400 600;
    font-display: swap;
    src: url("../fonts/literata-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/*
 * ФОЛЛБЭК С ВЫРОВНЕННЫМИ МЕТРИКАМИ (Дизайн-спринт, Task 6, спек §2.7).
 *
 * `font-display: swap` гарантирует, что текст виден сразу, но подмена
 * системного шрифта веб-шрифтом дёргает раскладку: x-height и ширина
 * знака у Golos Text/Literata и их системных заменителей — разные.
 * `size-adjust` подгоняет фоллбэк под метрики основного шрифта — прыжок
 * почти исчезает, а вместе с ним и часть непредсказуемого CLS.
 *
 * **`local("system-ui")` в прежней редакции блока НЕ РАБОТАЛ.**
 * `system-ui` — родовое ключевое слово CSS (как `sans-serif`), а не имя
 * семейства; `local()` ищет установленный шрифт БУКВАЛЬНО по имени и
 * ключевое слово не находит никогда — правило молча не применялось,
 * `size-adjust` простаивал, а в объявлении это было незаметно: без
 * реального шрифта на замену `Golos Text Fallback` просто не матчился
 * никогда, и браузер уходил дальше по списку `--font-ui` к следующему
 * generic-фоллбэку. Ниже — настоящие имена семейств.
 *
 * **Как измерены числа (не выдуманы, замер браузером).** Headless
 * Chromium (Playwright, локально), `canvas.measureText()`: одна и та же
 * строка и семь строчных кириллических букв без выносных элементов
 * («х о е н и с а» — сама x-height в буквальном смысле) отрисованы одним
 * кеглем (300px) сперва веб-шрифтом, потом кандидатом на фоллбэк;
 * `actualBoundingBoxAscent + actualBoundingBoxDescent` даёт чернильную
 * высоту глифа. Отношение (веб-шрифт / фоллбэк) — и есть `size-adjust`:
 * если у фоллбэка глиф ниже при том же кегле, его нужно увеличить, чтобы
 * визуально сравняться.
 *
 *   Golos Text / Helvetica Neue: высота глифа 162.43 / 159.04 = 102.1 %;
 *     контрольная ширина строки — 6205.5 / 6089.1 = 101.9 %. Два метода
 *     расходятся на 0.2 п.п. — высокая согласованность. size-adjust: 102%.
 *   Literata / Georgia: высота глифа 158.70 / 149.02 = 106.5 %;
 *     контрольная ширина строки — 6321.0 / 6029.0 = 104.8 %. Расхождение
 *     1.7 п.п.; взято среднее двух методов, округлено. size-adjust: 105.7%.
 *
 * **Платформа калибровки — macOS, и вот почему именно она.** `size-adjust`
 * — ОДНО число на объявление, а фоллбэк, который реально подставит
 * браузер, разный на macOS, Windows и в Ubuntu-контейнере CI (там, где
 * запущен `make check`) — значит, точно выровнять получится только под
 * одну из площадок. macOS — единственная, на которой в этой задаче стоял
 * настоящий браузер для замера (эта машина); измерять то, чего здесь нет
 * (Segoe UI, Cambria — на Ubuntu и в CI их тоже, скорее всего, нет),
 * значило бы повторить ошибку брифа — записать число, которое ничего не
 * замеряло. Контрольный прогон это подтвердил: запрошенные, но не
 * установленные на этой машине имена («Segoe UI», «Cambria», «Times» без
 * «New Roman») canvas молча подменил ОДНИМ И ТЕМ ЖЕ шрифтом браузера по
 * умолчанию — измерение показало бы не метрики Segoe UI, а метрики
 * фоллбэка Chromium, выданные за них. `Arial` и `Times New Roman` —
 * реальные, отдельно установленные файлы и на macOS, и на Windows
 * (Проверено `find /System/Library/Fonts`), и стоят в `local()` вторым
 * кандидатом на тот случай, если `Helvetica Neue`/`Georgia` на площадке
 * читателя не окажется — без гарантии столь же точного попадания в 102 %/
 * 105.7 %, но ближе к нему, чем родовой `sans-serif`/`serif` браузера.
 *
 * **`ascent-override`/`descent-override` — сознательно НЕ добавлены.**
 * Бриф задачи приводил и их — тоже без замера. Эти два числа нормализуют
 * вертикальные метрики (высоту строки) по таблице `OS/2`/`hhea` шрифта, а
 * не по видимому размеру глифа: `canvas.measureText()` эту таблицу не
 * читает, и получить их тем же методом, что `size-adjust`, нельзя —
 * пришлось бы разбирать бинарный woff2 сторонним парсером (fontTools/
 * opentype.js), которого в проекте нет и устанавливать который сетью
 * (см. self-hosting выше) в объёме этой задачи неуместно. Выдуманное
 * число здесь хуже отсутствующего: оно сдвинуло бы расчёт высоты строки
 * ДО подгрузки шрифта неверно и увеличило бы прыжок раскладки, а не
 * уменьшило. Без них резерв места по строкам остаётся таким, какой есть
 * сегодня, — не регрессия, а статус-кво; `size-adjust` тем временем уже
 * закрывает бóльшую часть видимого прыжка (доказано на замерах выше).
 */
@font-face {
    font-family: "Golos Text Fallback";
    font-style: normal;
    font-weight: 400 700;
    src: local("Helvetica Neue"), local("Arial");
    size-adjust: 102%;
}

@font-face {
    font-family: "Literata Fallback";
    font-style: normal;
    font-weight: 400 600;
    src: local("Georgia"), local("Times New Roman");
    size-adjust: 105.7%;
}

:root {
    /* Фоллбэки не декоративные: пока swap-шрифт не подгрузился, страница
       рендерится системным — на медленной сети текст читается сразу.
       Средним звеном — фоллбэк с выровненными метриками выше, чтобы
       подмена на настоящий веб-шрифт не дёргала раскладку (Task 6). */
    --font-ui: "Golos Text", "Golos Text Fallback", system-ui, -apple-system, "Segoe UI", sans-serif;
    /* Канонический серифный стек — одно определение на понятие (Дизайн-спринт,
       Task 7, Finding 3): печать использует этот же стек вне зависимости от
       выбора читателя гротеска. */
    --font-serif: "Literata", "Literata Fallback", Georgia, "Times New Roman", serif;
    --font-read: var(--font-serif);
}
