/* Castalia — токены. Единственный источник правды по цвету, шрифту и ритму.
   Страницы их ИСПОЛЬЗУЮТ и НИКОГДА не переопределяют. Нужен новый токен — сюда. */

/* Мера строки — настоящая длина, а не выражение.
 *
 * 42rem при кегле 18px давали 78 знаков — сверх нормы, поэтому в меру входит
 * ограничение в ch: оно считается в шрифте колонки и держит 62–70 при любой
 * гарнитуре. Но обычная переменная подставляется текстом, и `66ch` пересчитывался
 * в каждом месте использования: внутри боковой сноски с её мелким кеглем токен
 * давал 462px вместо 594, и вся геометрия, построенная на нём, молча отъезжала.
 *
 * Объявленный через @property токен вычисляется там, где задан, — на :root, —
 * и наследуется уже готовой длиной. Одна строка, а «единственный источник
 * правды» наконец перестаёт зависеть от того, откуда на него смотрят.
 */
@property --measure {
  syntax: "<length>";
  inherits: true;
  /* Только абсолютная единица: начальное значение обязано быть вычислительно
     независимым, и rem, зависящий от кегля корня, здесь не принимается —
     всё правило молча отбрасывается. */
  initial-value: 592px;
}

:root {
  /* ── цвет ─────────────────────────────────────────────────────────────
     Правило двух плюс один: в любом блоке не более двух цветов палитры
     плюс один акцент. Золото и киноварь вместе не ставятся — конкурируют. */
  --ink:        #0B0A08;   /* ночь, фон обложек */
  --paper:      #EDE6D6;   /* тёплая бумага, фон статьи */
  --text:       #23201A;   /* основной текст на бумаге */
  --gold:       #C9A227;   /* акцент, линейки, рубрики */
  --vermilion:  #8C2F1E;   /* единственный кричащий акцент */
  --slate:      #4A5A52;   /* второй план, 5.9:1 по бумаге */
  --mute:       #655E51;   /* подписи, сноски, служебное — 5.2:1 по бумаге */

  --paper-2:    #E4DCC9;   /* врезки, карточки на бумаге */
  --ink-2:      #17150F;   /* врезки на тёмном */
  --rule:       #23201A26; /* декоративная линейка */
  --rule-dark:  #EDE6D61F; /* декоративная линейка на тёмном */
  --rule-strong:#7A7365;   /* границы полей и чекбоксов: WCAG 1.4.11 требует 3:1 */

  /* Текстовое золото. Фирменный --gold по бумаге даёт 1.95:1 и для текста непригоден —
     он остаётся для линеек, орнамента и всего, что на тёмном. Для набора по бумаге
     берётся затемнённый вариант (4.6:1), а на тёмном фоне он возвращается к обычному. */
  --gold-text:  #7C6412;

  /* Кольцо фокуса. Фирменное золото по бумаге даёт 1.95:1, а WCAG 1.4.11 и
     2.4.11 требуют от индикатора фокуса 3:1 — и это единственный индикатор
     на всех страницах, промахнуться тут дороже всего. Тёмная охра даёт 4.9:1
     по бумаге и остаётся узнаваемо золотой; на чернилах кольцо возвращается
     к фирменному, там оно и без того 8.2:1. */
  --focus:      #6B5510;
  --focus-ink:  #C9A227;

  /* Светлые производные для тёмной зоны. Раньше они были зашиты прямо
     в .on-ink — то есть базовый слой обходил собственное правило. */
  --mute-ink:        #B9AE95;   /* 9:1 по чернилам */
  --rule-strong-ink: #A79C88;

  /* ── шрифт ────────────────────────────────────────────────────────────
     Libertinus отпал: его нет в Google Fonts, по проводу приезжал EB Garamond,
     а он с STIX Two Math не согласован — формулы выходили темнее и крупнее слов
     вокруг. Source Serif 4 рисовался под экран, метрически близок к STIX Two,
     и пара наконец матчёная не на бумаге, а на деле. */
  --font-display: "Bodoni Moda", "Didot", Georgia, serif;
  --font-body:    "Source Serif 4", "Source Serif Pro", Georgia, serif;
  --font-math:    "STIX Two Math", math;
  --font-meta:    "Archivo Narrow", "Inter", system-ui, sans-serif;
  --font-mono:    "JetBrains Mono", ui-monospace, Menlo, monospace;

  /* ── типографика тела ─────────────────────────────────────────────── */
  /* --measure объявлена не здесь, а на body в base.css: `ch` обязан считаться
     в шрифте и кегле читательской колонки, а на :root ни того, ни другого ещё
     нет. Регистрация выше делает её настоящей длиной, а не выражением. */
  --size-body:    1.125rem;
  --leading-body: 1.72;
  --leading-tight:1.15;
  --track-meta:   .28em;    /* разрядка служебного капса */

  /* Мелкий кегль — ступенями, а не числами по месту */
  --fs-lede:      1.25rem;
  --fs-small:     .8125rem;
  --fs-meta:      .6875rem;
  --fs-micro:     .5875rem;

  /* Служебный слой инструментов: плотнее читательского, но со своей шкалой,
     иначе каждый экран студии придумывает собственные .78 / .88 / .94rem */
  --fs-ui-lg:     1.05rem;
  --fs-ui:        .9375rem;
  --fs-ui-sm:     .78rem;

  /* Ширины колонок. Ступени --s* про отступы и для несущих размеров не годятся. */
  --rail:         20rem;    /* боковая рельса: оглавление, библиотека, фасеты */
  --shell:        120rem;   /* потолок ширины приложения */

  --hair:         1px;      /* толщина линейки: вне шага сетки по необходимости */

  /* Оптический размер Bodoni Moda. По умолчанию браузер подставляет ось по кеглю,
     и на крупном тексте волосяные линии дидоны утоньшаются до пикселя — на не-ретине
     они сереют и разрываются. Держим ось ниже фактического кегля: начертание для
     мелкого набора имеет тот же рисунок, но плотнее в тонких местах.
     --opsz-hero — только для по-настоящему гигантского текста, где линии и так толстые. */
  --opsz-display: 20;
  --opsz-hero:    46;

  /* ── ритм ─────────────────────────────────────────────────────────────
     Шаг 4px. Пользуйтесь ступенями, не произвольными числами. */
  --s1: .25rem;  --s2: .5rem;   --s3: .75rem;  --s4: 1rem;
  --s5: 1.5rem;  --s6: 2rem;    --s7: 3rem;    --s8: 4rem;
  --s9: 6rem;    --s10: 8rem;   --s11: 12rem;

  /* ── движение ─────────────────────────────────────────────────────────
     В теле статьи движения нет вообще. Эти токены — для обложек и навигации. */
  --ease:      cubic-bezier(.22, 1, .36, 1);
  --dur-fast:  .18s;
  --dur:       .34s;
  --dur-mid:   .62s;
  --dur-slow:  .9s;

  /* Пружины с лёгким перелётом — для появлений и переключателей, не для текста */
  --spring-snappy: linear(0, .436 5.4%, .793 11.6%, .966 16.5%, 1.056 22.1%, 1.075 26.6%,
                          1.047 34%, 1.005 43.5%, .988 55.8%, .999 79.4%, 1);
  --spring-smooth: linear(0, .223 3.7%, .687 10.3%, .899 15.6%, .984 20.7%, 1.032 27.7%,
                          1.026 38.8%, .999 62.5%, 1);
  --stagger-step:  45ms;

  /* ── слои ─────────────────────────────────────────────────────────── */
  --z-scene: 0;  --z-content: 10;  --z-nav: 100;  --z-modal: 1000;
}

/* Скруглений в системе нет. Единственное исключение — капсульные врезки-кадры
   из референсов; для них есть отдельный токен, всё остальное строго прямое. */
:root { --radius: 0; --radius-capsule: 9999px; }

/* Reader controls: independent of publishing metadata sizes. */
:root { --control-font: 1rem; --control-font-small: .875rem; --control-min: 2.5rem; }
