/* ============================================================
   Онлайн-школа турагентов, общая стилевая система
   Палитра: глубокий океанский тил + холодный офф-вайт + один
   акцент цвета заката. Скругления: панели 20px, кнопки pill,
   поля ввода 12px (правило одно на весь сайт).
   ============================================================ */

:root {
  /* Только light: иначе браузер сам красит полосы прокрутки и поля
     ввода по системной настройке, и на тёмной системе светлый сайт
     получал бы тёмный скроллбар. */
  color-scheme: light;

  --paper:      #f6f8f7;
  --paper-2:    #eaf0ee;
  --panel:      #ffffff;
  --ink:        #10241f;
  --ink-soft:   #4d635d;
  --deep:       #0e4d44;
  --deep-2:     #0a3a33;
  --accent:     #d9573a;
  --accent-hi:  #e86b4d;
  --on-accent:  #ffffff;
  --line:       rgba(16, 36, 31, 0.13);
  --line-soft:  rgba(16, 36, 31, 0.07);

  /* сцена в шапке */
  --sky-top:    #bfe0e4;
  --sky-bot:    #f0dfcd;
  --sun:        #f2b46b;
  --sea-far:    #2f8f92;
  --sea-mid:    #1d7275;
  --sea-near:   #12595e;
  --sand:       #e6d6bd;
  --sand-2:     #d8c4a6;
  --trunk:      #6b5137;
  --frond:      #1f7a5c;
  --frond-2:    #2c9670;
  --screen:     #cfeef0;

  /* Значения, отличающиеся между темами. Вынесены в токены, иначе
     принудительное переключение темы их бы не затронуло. */
  --figure:       var(--deep);          /* крупные цифры и маркеры */
  --glass-border: rgba(16, 36, 31, 0.09);
  --glass-inset:  rgba(255, 255, 255, 0.5);
  --bg-photo:     0.72;                 /* видимость размытого фона */

  /* Тени подкрашены в тон фона: чистый чёрный на светлом выглядит дёшево. */
  --shadow-sm: 0 1px 2px rgba(10, 58, 51, 0.05), 0 6px 18px rgba(10, 58, 51, 0.05);
  --shadow-md: 0 2px 6px rgba(10, 58, 51, 0.06), 0 24px 60px rgba(10, 58, 51, 0.10);
  --shadow-lg: 0 4px 10px rgba(10, 58, 51, 0.07), 0 40px 110px rgba(10, 58, 51, 0.16);

  --r-panel: 26px;
  --r-inner: 20px;   /* вложенный радиус для двойной оправы */
  --r-field: 14px;

  /* Тяжёлая кривая с длинным выбегом: движение читается как масса,
     а не как линейный сдвиг. */
  --ease: cubic-bezier(0.32, 0.72, 0, 1);
  --ease-soft: cubic-bezier(0.22, 1, 0.36, 1);

  /* Было 1240px, отчего по краям оставались широкие пустые поля.
     Теперь контейнер тянется почти во всю ширину экрана. */
  --wrap: min(1640px, 93vw);
  --gutter: max(20px, calc((100vw - var(--wrap)) / 2));
}

/* Тёмная тема включается только явным выбором человека: атрибут
   data-theme ставит переключатель в шапке или параметр ?theme=dark.
   Системную настройку намеренно не слушаем: сайт по умолчанию
   светлый, независимо от того, что стоит на компьютере у посетителя.
   Раньше здесь лежала копия этой же палитры под
   @media (prefers-color-scheme: dark), то есть один и тот же набор
   переменных в двух местах. Теперь он один. */
:root[data-theme="dark"] {
    color-scheme: dark;

    --paper:      #0b1a18;
    --paper-2:    #102523;
    --panel:      #122b28;
    --ink:        #e8f1ee;
    --ink-soft:   #9db3ad;
    --deep:       #0d423b;
    --deep-2:     #081f1c;
    --accent:     #e86b4d;
    --accent-hi:  #f0836a;
    --on-accent:  #16110f;
    --line:       rgba(232, 241, 238, 0.16);
    --line-soft:  rgba(232, 241, 238, 0.08);

    --sky-top:    #123043;
    --sky-bot:    #4a2f3f;
    --sun:        #e08a52;
    --sea-far:    #14535c;
    --sea-mid:    #0f424b;
    --sea-near:   #0a323a;
    --sand:       #3a3040;
    --sand-2:     #2c2634;
    --trunk:      #3d3026;
    --frond:      #14564a;
    --frond-2:    #1c6b58;
    --screen:     #a9e4e8;

    --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3), 0 4px 14px rgba(0, 0, 0, 0.25);
    --shadow-md: 0 2px 6px rgba(0, 0, 0, 0.35), 0 18px 44px rgba(0, 0, 0, 0.4);

    --figure:       var(--screen);
    --glass-border: rgba(255, 255, 255, 0.10);
    --glass-inset:  rgba(255, 255, 255, 0.12);
    --bg-photo:     0.5;
}

/* ---------- база ---------- */

*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: "Manrope", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  font-size: 17px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

h1, h2, h3, .display {
  font-family: "Unbounded", "Manrope", ui-sans-serif, system-ui, sans-serif;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.12;
  margin: 0;
  text-wrap: balance;
}

p { margin: 0; max-width: 62ch; }

a { color: inherit; }

img { max-width: 100%; display: block; }

.wrap {
  width: 100%;
  max-width: var(--wrap);
  margin-inline: auto;
}

@media (max-width: 640px) {
  body { font-size: 16px; }
  .wrap { padding-inline: 4px; }
}

/* Плёночное зерно: фиксированный слой поверх страницы, не участвует в
   прокрутке и не ловит курсор. На скролл-контейнерах такой фильтр
   перерисовывался бы каждый кадр и сажал бы производительность. */
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 60;
  pointer-events: none;
  opacity: 0.035;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* Отступы срезаны примерно на треть: прежние clamp(72,11vw,148)
   давали слишком много пустоты между блоками. */
.section { padding-block: clamp(56px, 7vw, 104px); }
.section--tight { padding-block: clamp(42px, 5vw, 76px); }

/* ---------- заставка загрузки ---------- */

.boot {
  position: fixed;
  inset: 0;
  z-index: 70;
  display: grid;
  place-items: center;
  background: var(--paper);
  transition: opacity 0.7s var(--ease);
}

.boot.is-done { opacity: 0; pointer-events: none; }

.boot__inner {
  display: grid;
  justify-items: center;
  gap: 22px;
  padding: 0 24px;
  text-align: center;
}

.boot__brand {
  font-family: "Unbounded", sans-serif;
  font-weight: 600;
  font-size: clamp(20px, 2.6vw, 28px);
  letter-spacing: -0.02em;
}

.boot__brand span { color: var(--accent); }

/* Маршрут вместо полосы загрузки: подпись обещает «собираем ваш
   маршрут», и картинка говорит ровно об этом, а не про проценты. */
.boot__route {
  width: min(600px, 86vw);
  height: auto;
  overflow: visible;
  /* Почти ровная скорость. Фирменный --ease здесь не годится: он
     сильно разгоняет начало, и точка «выстреливала» к концу маршрута
     за первую четверть, вместо того чтобы ехать по нему. */
  --boot-ease: cubic-bezier(0.45, 0.05, 0.55, 0.95);
}

.boot__line {
  stroke: var(--line);
  stroke-width: 2;
  stroke-linecap: round;
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
}

/* Бегущая точка: тот же контур, но штрих почти нулевой длины с
   круглым концом. Двигая смещение штриха, катим точку по кривой. */
.boot__runner {
  stroke: var(--accent);
  stroke-width: 9;
  stroke-linecap: round;
  stroke-dasharray: 0.001 100;
  stroke-dashoffset: 100;
  opacity: 0;
}

.boot__pin {
  fill: var(--paper);
  stroke: var(--line);
  stroke-width: 2;
  /* Иначе точка масштабировалась бы от начала координат SVG,
     а не от собственного центра, и разъезжалась по холсту. */
  transform-box: fill-box;
  transform-origin: center;
}

.boot__pin--last { fill: var(--accent); stroke: var(--accent); }

@media (prefers-reduced-motion: no-preference) {
  /* Линия и точка живут по одному расписанию и одной кривой скорости,
     поэтому точка едет ровно по кончику прокладываемого маршрута. */
  /* Цикл 2с и держится он же: заставка снимается ровно после одного
     полного прохода, поэтому маршрут никогда не обрывается на середине.
     Само рисование занимает 78% цикла, остальное -- пауза на готовом
     маршруте перед тем, как экран уйдёт. */
  .boot__line   { animation: bootDraw 2s var(--boot-ease) infinite; }
  .boot__runner { animation: bootRun  2s var(--boot-ease) infinite; }
  .boot__pin {
    transform: scale(0);
    opacity: 0;
    /* Остановка загорается в тот момент, когда точка до неё доезжает,
       и больше не гаснет: проход один, fill-mode both держит и
       состояние до старта, и после. Зациклить их нельзя -- у первой
       остановки отрицательная задержка, её цикл кончался раньше
       остальных, и она успевала мигнуть прямо перед уходом заставки.
       Если загрузка затянулась, линия с точкой продолжают ездить
       по уже найденному маршруту, а остановки просто горят. */
    animation: bootPin 2s var(--boot-ease) both;
    animation-delay: calc(var(--i) * 0.52s - 0.16s);
  }
}

/* Без анимации показываем готовый маршрут, а не пустой холст. */
@media (prefers-reduced-motion: reduce) {
  .boot__line { stroke-dashoffset: 0; }
}

@keyframes bootDraw {
  0%        { stroke-dashoffset: 100; }
  78%, 100% { stroke-dashoffset: 0; }
}

/* Промежуточных ключей для прозрачности намеренно нет до 78%:
   лишний ключ разбил бы плавную интерполяцию смещения штриха,
   и точка дёргалась бы на этом кадре. */
@keyframes bootRun {
  0%        { stroke-dashoffset: 100; opacity: 1; }
  78%       { stroke-dashoffset: 0;   opacity: 1; }
  90%, 100% { stroke-dashoffset: 0;   opacity: 0; }
}

@keyframes bootPin {
  0%,  6%   { transform: scale(0);    opacity: 0; }
  16%       { transform: scale(1.35); opacity: 1; }
  26%, 100% { transform: scale(1);    opacity: 1; }
}

.boot__note {
  font-size: 14px;
  color: var(--ink-soft);
  max-width: 34ch;
}

/* ---------- согласие на cookie ---------- */

/* Плашка не перекрывает страницу и не требует выбора, чтобы читать
   дальше: закон требует информировать и дать отказаться, а не держать
   человека в заложниках у модального окна. */
.cookie {
  position: fixed;
  left: 50%;
  bottom: clamp(14px, 2.5vh, 26px);
  transform: translate(-50%, 150%);
  z-index: 60;
  width: min(900px, calc(100vw - 28px));
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: clamp(14px, 2vw, 30px);
  padding: 16px 20px;
  border-radius: var(--r-panel);
  background: color-mix(in srgb, var(--paper) 90%, transparent);
  border: 1px solid var(--glass-border);
  backdrop-filter: blur(20px) saturate(160%);
  -webkit-backdrop-filter: blur(20px) saturate(160%);
  box-shadow: 0 18px 50px rgba(10, 28, 24, 0.22);
  transition: transform 0.7s var(--ease), opacity 0.5s var(--ease);
}

.cookie.is-in  { transform: translate(-50%, 0); }
.cookie.is-out { transform: translate(-50%, 150%); opacity: 0; }

.cookie__text {
  flex: 1 1 320px;
  margin: 0;
  font-size: 14px;
  line-height: 1.55;
  color: var(--ink-soft);
}

.cookie__text a { color: var(--ink); text-underline-offset: 3px; }

.cookie__actions { display: flex; gap: 10px; flex: none; }

/* Своя кнопка, а не .btn--primary: у той в правом краю кружок со
   стрелкой, а «Принять» никуда не ведёт. */
.cookie__btn {
  font: inherit;
  font-weight: 700;
  font-size: 14px;
  padding: 11px 22px;
  border-radius: 999px;
  border: 1px solid transparent;
  cursor: pointer;
  white-space: nowrap;
  transition: background-color 0.25s var(--ease), border-color 0.25s var(--ease),
              transform 0.25s var(--ease);
}

.cookie__btn:active { transform: scale(0.98); }

.cookie__btn:focus-visible { outline: 3px solid var(--accent); outline-offset: 3px; }

.cookie__btn--yes { background: var(--accent); color: var(--on-accent); }
.cookie__btn--yes:hover { background: var(--accent-hi); }

.cookie__btn--no {
  background: transparent;
  color: var(--ink);
  border-color: var(--glass-border);
}

.cookie__btn--no:hover { border-color: var(--ink-soft); }

@media (max-width: 560px) {
  .cookie { padding: 16px; gap: 14px; }
  .cookie__actions { width: 100%; }
  .cookie__btn { flex: 1 1 0; padding: 12px 10px; }
}

@media (prefers-reduced-motion: reduce) {
  .cookie { transition: opacity 0.3s linear; }
}

.eyebrow {
  font-size: 12.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
  margin: 0 0 18px;
}

.lead {
  font-size: clamp(17px, 1.6vw, 20px);
  color: var(--ink-soft);
  line-height: 1.62;
}

.h-xl { font-size: clamp(38px, 6.4vw, 76px); }
.h-lg { font-size: clamp(30px, 4.4vw, 52px); }
.h-md { font-size: clamp(22px, 2.6vw, 31px); }
.h-sm { font-size: clamp(18px, 2vw, 22px); }

/* ---------- кнопки ---------- */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  white-space: nowrap;
  padding: 15px 30px;
  border-radius: 999px;
  border: 1px solid transparent;
  font: inherit;
  font-weight: 700;
  font-size: 16px;
  text-decoration: none;
  cursor: pointer;
  transition: transform 0.25s var(--ease), background-color 0.25s var(--ease),
              border-color 0.25s var(--ease), color 0.25s var(--ease),
              box-shadow 0.25s var(--ease);
}

.btn:hover { transform: translateY(-2px); }
.btn:active { transform: translateY(0) scale(0.97); }

/* Вложенный кружок со стрелкой у главной кнопки.
   Стрелка собрана из двух границ повёрнутого квадрата. Первый вариант
   рисовал её диагональными градиентами в коробке 9x2px, где диагональ
   вырождалась в грязную полосу.
   Размеры вынесены в переменные не для красоты: позиция стрелки была
   прибита числом 25px под поле 8px, а модификатор .btn--sm задаёт
   padding шорткатом и перебивает это поле на 22px, из-за чего стрелка
   уезжала из кружка ровно на разницу. Теперь она считается от полей. */
.btn--primary {
  --btn-pad-r: 8px;
  --btn-circle: 34px;
  --btn-gap: 14px;
  /* Кружок выведен из потока и прибит к правому краю, к тому же якорю,
     что и стрелка. Пока он был flex-элементом, всё сходилось только на
     кнопке по размеру содержимого: на телефоне кнопки растягиваются на
     всю ширину, текст с кружком оставались по центру, а стрелка уезжала
     к краю, и кружок оказывался сам по себе. Ширину кружка теперь
     резервирует поле, иначе текст залезал бы под него. */
  --btn-tail: calc(var(--btn-pad-r) + var(--btn-circle) + var(--btn-gap));
  position: relative;
  padding-right: var(--btn-tail);
}

.btn--primary.btn--sm {
  --btn-pad-r: 6px;
  --btn-circle: 26px;
  padding: 11px var(--btn-tail) 11px 20px;
}

.btn--primary::after {
  content: "";
  position: absolute;
  right: var(--btn-pad-r);
  top: 50%;
  width: var(--btn-circle);
  height: var(--btn-circle);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.18);
  transform: translateY(-50%);
  transition: transform 0.55s var(--ease), background-color 0.55s var(--ease);
  pointer-events: none;
}

.btn--primary::before {
  content: "";
  position: absolute;
  right: calc(var(--btn-pad-r) + var(--btn-circle) / 2);
  top: 50%;
  width: calc(var(--btn-circle) * 0.21);
  height: calc(var(--btn-circle) * 0.21);
  border-right: 2px solid currentColor;
  border-top: 2px solid currentColor;
  transform: translate(50%, -50%) rotate(45deg);
  transition: transform 0.55s var(--ease);
  pointer-events: none;
}

/* Внутреннее напряжение: кружок и стрелка уезжают по диагонали. */
.btn--primary:hover::after {
  /* -50% по вертикали обязан остаться: он центрирует кружок */
  transform: translate(3px, calc(-50% - 1px)) scale(1.06);
  background-color: rgba(255, 255, 255, 0.28);
}

.btn--primary:hover::before {
  transform: translate(calc(50% + 3px), calc(-50% - 1px)) rotate(45deg);
}

@media (prefers-reduced-motion: reduce) {
  .btn--primary::after,
  .btn--primary::before { transition: none; }
  .btn--primary:hover::after { transform: translateY(-50%); }
  .btn--primary:hover::before { transform: translate(50%, -50%) rotate(45deg); }
}

.btn:focus-visible {
  outline: 3px solid var(--accent);
  outline-offset: 3px;
}

.btn--primary { background: var(--accent); color: var(--on-accent); }
.btn--primary:hover { background: var(--accent-hi); }

.btn--ghost {
  background: transparent;
  color: var(--ink);
  border-color: var(--line);
}
.btn--ghost:hover { border-color: var(--ink); }

/* Всегда лежит на тёмной или коралловой подложке, поэтому цвета заданы
   явно, а не через переменные темы: в тёмной теме --paper сам тёмный и
   кнопка получалась тёмной на тёмном. */
.btn--onDark {
  background: #ffffff;
  color: #0a3a33;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.10);
}

.btn--onDark:hover {
  background: #ffffff;
  color: #0a3a33;
  box-shadow: 0 10px 26px rgba(0, 0, 0, 0.22);
}

.btn--sm { padding: 11px 22px; font-size: 15px; }

@media (prefers-reduced-motion: reduce) {
  .btn:hover, .btn:active { transform: none; }
}

/* ---------- шапка ---------- */

/* Плавающая пилюля, оторванная от верхнего края. Приклеенная во всю
   ширину полоса читается как шаблон; отдельный остров выглядит дороже
   и не режет композицию первого экрана. */
.nav {
  position: sticky;
  top: 18px;
  z-index: 40;
  display: flex;
  justify-content: center;
  pointer-events: none;
  margin-bottom: -68px;   /* пилюля висит над контентом, не занимая поток */
}

.nav__inner {
  pointer-events: auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 34px;
  height: 64px;
  padding: 0 12px 0 26px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--paper) 72%, transparent);
  border: 1px solid var(--glass-border);
  /* размытие только на фиксированном элементе, на прокручиваемых
     контейнерах оно убивает кадры */
  backdrop-filter: blur(20px) saturate(160%);
  -webkit-backdrop-filter: blur(20px) saturate(160%);
  box-shadow:
    inset 0 1px 0 var(--glass-inset),
    var(--shadow-md);
  transition: box-shadow 0.5s var(--ease), background-color 0.5s var(--ease);
}

.nav__brand {
  font-family: "Unbounded", sans-serif;
  font-weight: 600;
  font-size: 17px;
  letter-spacing: -0.02em;
  text-decoration: none;
  white-space: nowrap;
}

.nav__brand span { color: var(--accent); }

.nav__links {
  display: flex;
  align-items: center;
  gap: 30px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.nav__links a {
  text-decoration: none;
  font-size: 15.5px;
  font-weight: 600;
  color: var(--ink-soft);
  transition: color 0.2s var(--ease);
  white-space: nowrap;
}

.nav__links a:hover,
.nav__links a[aria-current="page"] { color: var(--ink); }

/* Переключатель темы: кружок, который сам показывает противоположную
   тему, солнце или луну рисовать не нужно. */
.nav__theme {
  flex: none;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 1px solid var(--glass-border);
  border-radius: 999px;
  background: linear-gradient(135deg, var(--ink) 0 50%, var(--paper) 50% 100%);
  cursor: pointer;
  transition: transform 0.45s var(--ease), border-color 0.45s var(--ease);
}

.nav__theme:hover { transform: rotate(180deg); }

.nav__theme:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
  .nav__theme { transition: none; }
  .nav__theme:hover { transform: none; }
}

.nav__toggle {
  display: none;
  background: none;
  border: 1px solid var(--line);
  border-radius: var(--r-field);
  padding: 9px 14px;
  font: inherit;
  font-weight: 700;
  font-size: 14px;
  color: var(--ink);
  cursor: pointer;
}

@media (max-width: 940px) {
  .nav { margin-bottom: -60px; }
  .nav__inner { height: 58px; gap: 12px; padding-left: 18px; }
  .nav__links, .nav .btn { display: none; }
  .nav__toggle { display: block; }

  /* Обёртка <nav> при спрятанном списке остаётся пустым flex-элементом
     и всё равно съедает промежуток. На 375px пилюле не хватало
     считанных пикселей, и кнопка вылезала за её правый край. */
  .nav__inner > nav { display: none; }
  .nav--open .nav__inner > nav { display: block; }

  /* В раскрытом меню в пилюле нужна только кнопка «Закрыть»: слово
     «Закрыть» шире «Меню», и вместе с логотипом содержимое переставало
     помещаться. Пилюлю всё равно перекрывает само меню. */
  .nav--open .nav__brand,
  .nav--open .nav__theme { display: none; }
}

/* Узкие телефоны (320px и около того): логотип, кружок темы и кнопка
   меню в исходных размерах не помещаются в пилюлю и вылезают за её
   правый край. Поджимаем поля, промежутки и сам логотип. */
@media (max-width: 400px) {
  .nav__inner { gap: 8px; padding: 0 8px 0 12px; }
  .nav__brand { font-size: 15px; }

  /* На время открытия снимаем размытие с пилюли. Элемент с
     backdrop-filter становится точкой отсчёта для position: fixed
     внутри себя, поэтому меню разворачивалось не на весь экран, а
     внутри пилюли высотой 64px: пункты вылезали за края телефона, а
     страница просвечивала насквозь. Само меню перекрывает пилюлю
     целиком, так что стекло здесь всё равно не видно. */
  .nav--open .nav__inner {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  /* Меню раскрывается во весь экран тяжёлым стеклом, а не выпадающим
     списком: так переход ощущается как смена состояния, а не как тултип. */
  .nav--open .nav__links {
    display: flex;
    position: fixed;
    inset: 0;
    z-index: 45;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    margin: 0;
    padding: 0;
    background: color-mix(in srgb, var(--paper) 82%, transparent);
    backdrop-filter: blur(30px) saturate(150%);
    -webkit-backdrop-filter: blur(30px) saturate(150%);
  }

  /* Без поддержки размытия одной полупрозрачной заливки мало:
     страница читалась бы сквозь меню. Тогда фон делаем плотным. */
  @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    .nav--open .nav__links { background: var(--paper); }
  }

  .nav--open .nav__links a {
    display: block;
    padding: 14px 4px;
    font-size: clamp(26px, 7vw, 40px);
    font-family: "Unbounded", sans-serif;
    font-weight: 600;
    letter-spacing: -0.02em;
    color: var(--ink);
  }

  /* Ступенчатое появление пунктов вместо одновременного всплытия. */
  @media (prefers-reduced-motion: no-preference) {
    .nav--open .nav__links li {
      opacity: 0;
      transform: translateY(26px);
      animation: navIn 0.6s var(--ease) forwards;
    }
    .nav--open .nav__links li:nth-child(1) { animation-delay: 0.05s; }
    .nav--open .nav__links li:nth-child(2) { animation-delay: 0.11s; }
    .nav--open .nav__links li:nth-child(3) { animation-delay: 0.17s; }
    .nav--open .nav__links li:nth-child(4) { animation-delay: 0.23s; }
  }

  .nav__toggle { position: relative; z-index: 46; }
}

@keyframes navIn {
  to { opacity: 1; transform: none; }
}

/* ---------- сцена в шапке главной ---------- */

/* Первый экран: editorial split. Крупная типографика слева, большой
   кадр справа, уходящий за правый край экрана. Текст заходит на снимок,
   и именно в зоне захода маска снимка прозрачна, поэтому читаемость не
   страдает: растушёвка работает и как приём, и как защита текста. */
.hero {
  position: relative;
  min-height: 100dvh;
  display: flex;
  align-items: center;
  padding-block: clamp(92px, 11vh, 124px) clamp(24px, 3.5vh, 48px);
  overflow: hidden;
}

/* Снимок стоит по центру экрана: так сразу понятно, что он и есть
   главный объект, и на него скорее наведут курсор. Заголовок шире
   снимка и заходит на его верхний край, поэтому композиция читается
   как афиша, а не как две колонки. */
/* Фоновый слой первого экрана. Лежит под содержимым, курсор не ловит.
   Виньетка гасит его к краям в цвет страницы, поэтому переход к
   остальному сайту не читается как стык двух картинок. */
.hero__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}

.hero__bg img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: var(--bg-photo);
}

.hero__bg::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 78% 70% at 50% 42%,
      color-mix(in srgb, var(--paper) 12%, transparent) 0%,
      color-mix(in srgb, var(--paper) 42%, transparent) 58%,
      color-mix(in srgb, var(--paper) 88%, transparent) 88%,
      var(--paper) 100%);
}

.hero__stack {
  position: relative;
  z-index: 1;
  display: grid;
  /* Первая строка: заголовок и кадр лежат друг на друге, отсюда заход.
     Вторая: подпись и кнопки, они идут ниже кадра, а не поверх него,
     иначе текст попадал бы на непрозрачную часть снимка. */
  grid-template-rows: auto auto;
  justify-items: center;
  width: 100%;
}

.hero__title {
  position: relative;
  z-index: 2;
  grid-area: 1 / 1;
  align-self: start;
  text-align: center;
  font-size: clamp(30px, 4.4vw, 76px);
  line-height: 1.02;
  letter-spacing: -0.035em;
  margin: 0;
  /* заголовок шире кадра и ложится на его растушёванный верх */
  max-width: min(100%, 1360px);
}

.hero__title em {
  font-style: italic;
  font-weight: 600;
  color: var(--accent);
  line-height: 1.14;
  padding-bottom: 5px;
  display: inline-block;
}

.hero__lead { margin-bottom: 32px; max-width: 47ch; }

.hero__cta { display: flex; flex-wrap: wrap; gap: 14px; }

/* Снимок занимает правую колонку и уходит за правый край окна:
   у кадра просто нет правой границы, поэтому он не читается как
   вставленный прямоугольник. */
.hero__art {
  grid-area: 1 / 1;
  position: relative;
  /* Ведущий размер -- высота: снимок вертикальный, и на широком, но
     невысоком экране он всё равно упрётся в высоту. Ширина выводится
     из пропорции, поэтому кадр не искажается. */
  /* Потолок 980px выбран по исходнику, а не на глаз: файл 880x1020,
     при высоте 980 ширина выходит 845px, то есть кадр всё ещё
     уменьшается и никогда не растягивается. Больше взять неоткуда,
     оригинал офисного кадра всего 896x1200. */
  /* Вторая граница внутри clamp не для красоты: на низком окне
     (700-768px) одних 80vh мало, кадр упирался в подпись с кнопками
     и выдавливал их за нижний край. Вычитаем высоту меню, подписи
     и полей, и запас перестаёт зависеть от пропорций окна. */
  height: clamp(400px, min(80vh, 100dvh - 156px), 980px);
  aspect-ratio: 880 / 1020;
  width: auto;
  /* Отрицательный сдвиг: кадр уходит вверх под заголовок и под пилюлю
     меню. Заход заголовка на снимок здесь не побочный эффект, а способ
     отыграть высоту: она единственное, что ограничивает размер
     вертикального кадра, когда всё должно уместиться в один экран. */
  margin-top: clamp(-56px, -4vh, -16px);
}

/* Радиус пятна вынесен в отдельное свойство, чтобы его можно было
   плавно анимировать: обычные CSS-переменные не интерполируются. */
@property --spot-r {
  syntax: "<length>";
  inherits: false;
  initial-value: 0px;
}

.swap {
  position: absolute;
  inset: 0;
  cursor: crosshair;
  isolation: isolate;
  /* Слева кадр растворяется в странице, там же идёт заход заголовка.
     Снизу мягкий сход, чтобы низ не обрубался линией. */
  /* Растушёвка по всем четырём краям, а не только по бокам: снимок
     стоит посреди страницы, и жёсткий верх выдавал бы прямоугольник.
     Верх гасится сильнее прочих краёв, потому что на него ложится
     заголовок и текст должен читаться. */
  -webkit-mask-image:
    linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.45) 12%, #000 30%, #000 86%, transparent 100%),
    linear-gradient(to right, transparent 0%, #000 15%, #000 85%, transparent 100%);
  mask-image:
    linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.45) 12%, #000 30%, #000 86%, transparent 100%),
    linear-gradient(to right, transparent 0%, #000 15%, #000 85%, transparent 100%);
  -webkit-mask-composite: source-in;
  mask-composite: intersect;
}

.swap__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Героиня стоит примерно на 70% ширины исходника, поэтому кадр
     прижимается правым краем: так она отходит от границы экрана. */
  object-position: 100% 46%;
  display: block;
}

/* Верхний снимок открыт только внутри пятна под курсором. Радиус
   держится нулевым, пока курсор не вошёл в кадр. */
.swap__img--alt {
  --spot-x: 50%;
  --spot-y: 50%;
  --spot-r: 0px;
  -webkit-mask-image:
    radial-gradient(circle var(--spot-r) at var(--spot-x) var(--spot-y),
      #000 0%, #000 52%, rgba(0,0,0,0.35) 78%, transparent 100%);
  mask-image:
    radial-gradient(circle var(--spot-r) at var(--spot-x) var(--spot-y),
      #000 0%, #000 52%, rgba(0,0,0,0.35) 78%, transparent 100%);
  transition: --spot-r 0.75s var(--ease);
  will-change: mask-image;
}

/* Радиус увеличен: при 260px было плохо видно, что именно проступает.
   Привязан к ширине кадра, чтобы пятно оставалось соразмерным. */
.swap.is-lit .swap__img--alt { --spot-r: clamp(210px, 20vw, 290px); }

/* Правила .swap:focus-visible и .swap.is-full убраны вместе с
   нажатием: снимок больше не кнопка, фокус на него не встаёт, а
   полное раскрытие было доступно только по клику. */

@media (prefers-reduced-motion: reduce) {
  .swap__img--alt { transition: none; }
}

.hero__foot {
  grid-row: 2;
  z-index: 2;
  display: grid;
  justify-items: center;
  gap: 22px;
  margin-top: clamp(28px, 3.5vh, 46px);
  text-align: center;
}

/* На широком экране подпись и кнопки встают в строку. Это не про
   красоту: столбиком они съедали около 85px высоты, а высота здесь
   единственное, что ограничивает размер кадра. Снимок вертикальный,
   и всё вместе должно помещаться в один экран. */
@media (min-width: 941px) {
  .hero__foot {
    grid-auto-flow: column;
    align-items: center;
    gap: clamp(26px, 3vw, 60px);
    margin-top: clamp(20px, 2.4vh, 32px);
    text-align: left;
  }

  .hero__foot .hero__lead { max-width: 44ch; margin: 0; }
  .hero__cta { flex-wrap: nowrap; }
}

.hero__lead {
  max-width: 46ch;
  margin: 0;
}

.hero__cta {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 14px;
}

/* Подсказка лежит на самом кадре, а не под ним. Под кадром она
   сталкивалась с подписью первого экрана: снимок увеличен, и полосы
   свободной высоты между ними больше нет. На снимке ей и место, речь
   ведь именно о нём. Своя подложка нужна, потому что под ней кадр
   бывает и светлым, и тёмным. */
.swap__hint {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  bottom: 16px;
  z-index: 3;
  white-space: nowrap;
  padding: 7px 15px;
  border-radius: 999px;
  font-size: 13px;
  letter-spacing: 0.01em;
  color: #eaf4f1;
  background: rgba(8, 24, 20, 0.52);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  transition: opacity 0.6s var(--ease);
}

.swap.is-used ~ .swap__hint { opacity: 0; }

/* Подсказка про курсор нужна там, где курсор есть. На телефоне
   нажатие ничего не делает, а вести пятно пальцем нельзя: палец
   закрывает собой то место, которое открывает. Приём там показывает
   разовый автопоказ, поэтому подсказка убрана. */
@media (hover: none) {
  .swap__hint { display: none; }
}

@media (max-width: 940px) {
  .hero {
    min-height: 0;
    padding-block: clamp(84px, 13vh, 116px) clamp(24px, 4vh, 44px);
  }
  .hero__title {
    font-size: clamp(28px, 7.4vw, 40px);
    max-width: 100%;
  }
  .hero__art {
    width: min(420px, 82vw);
    height: auto;
    aspect-ratio: 880 / 1020;
    margin-top: clamp(32px, 5vh, 56px);
  }
  .hero__foot { margin-top: clamp(46px, 6vh, 64px); }
  .hero__cta .btn { flex: 1 1 auto; }
}

/* --- анимация сцены (только transform / opacity) --- */

@media (prefers-reduced-motion: no-preference) {
  /* крона качается целиком вокруг верхушки ствола */
  .crown {
    transform-box: fill-box;
    transform-origin: 50% 88%;
    animation: sway 6.4s ease-in-out infinite alternate;
  }
  .palm--right .crown { animation-duration: 7.8s; animation-delay: -3.2s; }

  .wave    { animation: drift 13s linear infinite; }
  .wave--b { animation-duration: 19s; animation-direction: reverse; }
  .wave--c { animation-duration: 26s; }

  .cloud   { animation: float-x 42s linear infinite; }
  .cloud--b{ animation-duration: 61s; animation-delay: -22s; }

  .sun-halo { transform-box: fill-box; transform-origin: center; animation: breathe 7s ease-in-out infinite alternate; }
  .screen-glow { animation: glow 4.4s ease-in-out infinite alternate; }
  .bird { animation: fly 17s linear infinite; }
  .bird--b { animation-duration: 23s; animation-delay: -9s; }
}

@keyframes sway {
  from { transform: rotate(-2.4deg); }
  to   { transform: rotate(2.4deg); }
}
@keyframes drift {
  from { transform: translateX(0); }
  to   { transform: translateX(-120px); }
}
@keyframes float-x {
  from { transform: translateX(-140px); }
  to   { transform: translateX(1180px); }
}
@keyframes breathe {
  from { transform: scale(1); opacity: 0.55; }
  to   { transform: scale(1.09); opacity: 0.85; }
}
@keyframes glow {
  from { opacity: 0.45; }
  to   { opacity: 0.95; }
}
@keyframes fly {
  from { transform: translate(-80px, 12px); }
  to   { transform: translate(1160px, -26px); }
}

/* ---------- появление при прокрутке ---------- */

/* Тяжёлый выход из расфокуса: элемент не подставляется, а «доезжает».
   Анимируются только transform, opacity и filter, раскладка не трогается. */
.reveal {
  opacity: 0;
  transform: translateY(42px);
  filter: blur(10px);
  transition:
    opacity 0.9s var(--ease),
    transform 0.9s var(--ease),
    filter 0.9s var(--ease);
  transition-delay: var(--d, 0ms);
}

.reveal.is-in {
  opacity: 1;
  transform: none;
  filter: blur(0);
}

@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}

/* ---------- блоки контента ---------- */

.split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(30px, 5vw, 76px);
  align-items: start;
}

@media (max-width: 860px) { .split { grid-template-columns: 1fr; } }

.facts { list-style: none; margin: 0; padding: 0; }

.facts li {
  padding: 22px 0;
  border-top: 1px solid var(--line);
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 20px;
  align-items: baseline;
}

.facts li:last-child { border-bottom: 1px solid var(--line); }

.facts b {
  font-family: "Unbounded", sans-serif;
  font-size: clamp(26px, 3.4vw, 38px);
  font-weight: 600;
  color: var(--figure);
  letter-spacing: -0.03em;
  line-height: 1;
}



.facts span { color: var(--ink-soft); font-size: 16px; }

/* бенто */

.bento {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 18px;
}

.tile {
  border-radius: var(--r-panel);
  padding: 30px;
  background: var(--panel);
  border: 1px solid var(--line-soft);
  box-shadow: var(--shadow-sm);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 210px;
}

.tile h3 { margin-bottom: 10px; }
.tile p { font-size: 15.5px; color: var(--ink-soft); }

.tile--a { grid-column: span 4; }
.tile--b { grid-column: span 2; background: var(--deep); color: #ecf5f2; border-color: transparent; }
.tile--b p { color: rgba(236, 245, 242, 0.78); }
.tile--c { grid-column: span 2; }
.tile--d { grid-column: span 2; padding: 0; overflow: hidden; }
.tile--e { grid-column: span 2; }

.tile--photo img { width: 100%; height: 100%; object-fit: cover; min-height: 210px; }

.tile--accent {
  background: linear-gradient(150deg, var(--accent) 0%, #b8452c 100%);
  color: #fff;
  border-color: transparent;
}
.tile--accent p { color: rgba(255, 255, 255, 0.82); }

@media (max-width: 860px) {
  .bento { grid-template-columns: 1fr; }
  .tile, .tile--a, .tile--b, .tile--c, .tile--d, .tile--e { grid-column: 1 / -1; }
}

/* программа: кластеры вместо длинного списка */

/* 300px в minmax даёт ровно 3 колонки на десктопе: шесть модулей
   ложатся в два полных ряда, без пустых ячеек в конце. */
.modules {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 20px;
}

.module {
  background: var(--panel);
  border: 1px solid var(--line-soft);
  border-radius: var(--r-panel);
  padding: 30px 28px;
  box-shadow: var(--shadow-sm);
}

.module__no {
  font-family: "Unbounded", sans-serif;
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  letter-spacing: 0.04em;
  display: block;
  margin-bottom: 14px;
}

.module h3 { margin-bottom: 12px; }

/* В карточках модулей описания нет, только название. Без этого
   у заголовка оставался отступ в пустоту и карточки были выше,
   чем нужно. */
.module h3:last-child { margin-bottom: 0; }
.module p { font-size: 15.5px; color: var(--ink-soft); }

/* тёмная полоса */

.band {
  background: var(--deep);
  color: #eaf4f1;
}

.band h2 { color: #ffffff; }
.band p { color: rgba(234, 244, 241, 0.8); }
.band .eyebrow { color: var(--accent-hi); }

/* Оговорка для тех, кто в команду не идёт. Тише основного текста, но
   читаемо и отбито линией: прятать её нельзя, это часть обещания. */
.band__note {
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px solid rgba(234, 244, 241, 0.14);
  font-size: 15px;
  max-width: 54ch;
}

.band__grid {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
  gap: clamp(30px, 5vw, 72px);
  align-items: center;
}

@media (max-width: 860px) { .band__grid { grid-template-columns: 1fr; } }

.checklist { list-style: none; margin: 0; padding: 0; display: grid; gap: 14px; }

/* Маркер выведен из потока: пункт остаётся одним текстовым блоком и
   переносится как обычный абзац. При grid-раскладке жирный заголовок и
   текст ответа становились отдельными ячейками, и ответ падал в колонку
   шириной 22px, ломаясь по одному слову в строку. */
.checklist li {
  position: relative;
  padding-left: 26px;
  font-size: 16.5px;
  line-height: 1.58;
  color: rgba(234, 244, 241, 0.9);
}

.checklist li b { color: #ffffff; }

.checklist li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 9px;
  width: 11px;
  height: 11px;
  border-radius: 3px;
  background: var(--accent-hi);
}

/* цитата */

.quote {
  max-width: 940px;
  margin-inline: auto;
  text-align: center;
}

.quote blockquote {
  margin: 0 0 26px;
  font-family: "Unbounded", sans-serif;
  font-weight: 500;
  font-size: clamp(21px, 2.9vw, 33px);
  line-height: 1.34;
  letter-spacing: -0.02em;
}

.quote figcaption { color: var(--ink-soft); font-size: 15.5px; }
.quote figcaption b { color: var(--ink); font-weight: 700; }

/* Снимок между цитатой и подписью. Кадр показывается целиком, без
   обрезки: margin-inline auto, потому что глобально у img стоит
   display:block, и text-align от .quote его бы не отцентрировал. */
.quote__photo {
  width: clamp(190px, 22vw, 300px);
  height: auto;
  margin: 0 auto 22px;
  border-radius: var(--r-inner);
  box-shadow: 0 0 0 1px var(--glass-border), 0 10px 26px rgba(10, 28, 24, 0.18);
}

/* отзывы */

.reviews {
  columns: 3;
  column-gap: 20px;
}

@media (max-width: 1040px) { .reviews { columns: 2; } }
@media (max-width: 680px)  { .reviews { columns: 1; } }

.review {
  break-inside: avoid;
  margin: 0 0 20px;
  background: var(--panel);
  border: 1px solid var(--line-soft);
  border-radius: var(--r-panel);
  padding: 28px;
  box-shadow: var(--shadow-sm);
}

.review p { font-size: 16px; margin-bottom: 18px; }

.review__who { display: flex; align-items: center; gap: 13px; }

/* Инициалы вместо фотографии: подставлять чужие лица к отзывам-заглушкам
   нельзя, иначе образец выглядит как настоящий отзыв реального человека. */
.review__ava {
  width: 44px; height: 44px;
  flex: none;
  display: grid;
  place-items: center;
  border-radius: 999px;
  background: var(--deep);
  color: #eaf4f1;
  font-size: 14px;
  font-weight: 700;
  letter-spacing: 0.02em;
}

.review__who b { display: block; font-size: 15.5px; }
.review__who span { font-size: 13.5px; color: var(--ink-soft); }

/* тарифы */

.plans {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
  gap: 22px;
  align-items: start;
}

.plan {
  background: var(--panel);
  border: 1px solid var(--line-soft);
  border-radius: var(--r-panel);
  padding: 34px 30px;
  box-shadow: var(--shadow-sm);
  display: flex;
  flex-direction: column;
  height: 100%;
}

.plan--best {
  background: var(--deep);
  color: #eaf4f1;
  border-color: transparent;
  box-shadow: var(--shadow-md);
}

/* Двойной класс здесь не украшательство, а необходимость. Базовые
   .plan__note и .plan li объявлены ниже по файлу и красят текст в
   тёмный --ink-soft. Специфичность у них была такая же, поэтому
   выигрывало то, что идёт последним, и на тёмно-зелёной карточке
   список получался тёмным по тёмному, то есть нечитаемым. */
.plan.plan--best h3,
.plan.plan--best .plan__price { color: #fff; }

.plan.plan--best .plan__note,
.plan.plan--best li { color: rgba(234, 244, 241, 0.86); }

.plan.plan--best li::before { background: var(--accent-hi); }

.plan__tag {
  align-self: flex-start;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  background: var(--accent);
  color: var(--on-accent);
  padding: 6px 13px;
  border-radius: 999px;
  margin-bottom: 18px;
}

.plan__price {
  font-family: "Unbounded", sans-serif;
  font-size: clamp(32px, 4vw, 42px);
  font-weight: 600;
  letter-spacing: -0.03em;
  margin: 18px 0 6px;
}

.plan__note { font-size: 14.5px; color: var(--ink-soft); margin-bottom: 24px; }

.plan ul {
  list-style: none;
  margin: 0 0 30px;
  padding: 0;
  display: grid;
  gap: 12px;
  flex: 1;
}

.plan li {
  position: relative;
  padding-left: 21px;
  font-size: 15.5px;
  line-height: 1.55;
  color: var(--ink-soft);
}

.plan li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 8px;
  width: 9px; height: 9px;
  border-radius: 2px;
  background: var(--figure);
}



/* финальный призыв */

.cta-band {
  background: linear-gradient(135deg, var(--accent) 0%, #b8452c 100%);
  color: #fff;
  border-radius: var(--r-panel);
  padding: clamp(38px, 6vw, 72px);
  text-align: center;
}

.cta-band h2 { color: #fff; margin-bottom: 16px; }
.cta-band p { color: rgba(255, 255, 255, 0.88); margin: 0 auto 30px; }

/* ---------- подвал ---------- */

.footer {
  background: var(--deep-2);
  color: rgba(228, 240, 236, 0.72);
  padding-block: 64px 34px;
  font-size: 15px;
}

.footer a { color: rgba(228, 240, 236, 0.72); text-decoration: none; }
.footer a:hover { color: #fff; }

.footer__top {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) repeat(3, minmax(0, 1fr));
  gap: 40px;
  padding-bottom: 40px;
  border-bottom: 1px solid rgba(228, 240, 236, 0.14);
}

/* Четыре колонки в один ряд помещаются не везде: на средних экранах
   раскладываем их в две пары, и только на телефоне в столбик. */
@media (max-width: 1080px) {
  .footer__top { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 34px; }
}

@media (max-width: 620px) { .footer__top { grid-template-columns: 1fr; gap: 30px; } }

/* Кнопка в телеграм: обведена, а не залита, чтобы не спорить с главным
   призывом «Выбрать тариф» на той же странице. */
.footer__tg {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: 18px;
  padding: 10px 18px;
  border: 1px solid rgba(228, 240, 236, 0.28);
  border-radius: 999px;
  font-weight: 700;
  font-size: 14px;
  color: #fff;
  white-space: nowrap;
  transition: background-color 0.25s var(--ease), border-color 0.25s var(--ease);
}

.footer__tg::before {
  content: "";
  width: 7px;
  height: 7px;
  border-radius: 999px;
  background: var(--accent-hi);
  flex: none;
}

.footer__tg:hover {
  background: rgba(228, 240, 236, 0.1);
  border-color: rgba(228, 240, 236, 0.5);
}

.footer__tg:focus-visible { outline: 3px solid var(--accent); outline-offset: 3px; }

.footer__brand {
  font-family: "Unbounded", sans-serif;
  font-size: 19px;
  font-weight: 600;
  color: #fff;
  margin-bottom: 12px;
  display: block;
  text-decoration: none;
}

.footer h4 {
  font-size: 13px;
  text-transform: uppercase;
  letter-spacing: 0.13em;
  color: rgba(228, 240, 236, 0.5);
  margin: 0 0 16px;
  font-weight: 700;
}

.footer ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 11px; }

.footer__bottom {
  padding-top: 26px;
  display: flex;
  flex-wrap: wrap;
  gap: 10px 26px;
  justify-content: space-between;
  font-size: 14px;
  color: rgba(228, 240, 236, 0.5);
}

/* ---------- страницы правовых документов ---------- */

.doc { max-width: 820px; }
.doc h2 { margin: 44px 0 16px; }
.doc h2:first-of-type { margin-top: 28px; }
.doc p, .doc li { color: var(--ink-soft); }
.doc p { margin-bottom: 14px; }
.doc ul { padding-left: 22px; margin: 0 0 18px; display: grid; gap: 8px; }

.todo {
  background: color-mix(in srgb, var(--accent) 12%, transparent);
  border: 1px dashed var(--accent);
  border-radius: var(--r-field);
  padding: 16px 20px;
  margin-bottom: 26px;
  font-size: 15px;
  color: var(--ink);
}

.todo b { color: var(--accent); }

/* заголовок внутренних страниц */

/* Нижний край плавающей плашки меню на телефоне приходится на 76px.
   Минимум отступа держим выше этой отметки, иначе первая строка
   заголовка на внутренних страницах уезжает под меню. */
.page-head { padding-block: clamp(100px, 8vw, 124px) clamp(28px, 4vw, 52px); }
.page-head p { margin-top: 18px; }
