/* ============================================================
   ClarityCraft — лендинг
   Токены наследуются из tokens.css от ClarityBOT: та же бумага,
   та же терракота, те же шрифты. Здесь только то, чего в панели
   нет — крупные секции, глубины шахты, живой статус.
   ============================================================ */

/* ---------- Свои переменные ---------- */
:root {
  /* Цвета уровней глубины. Идут сверху вниз: от тёплого дневного
     к холодному подземному. Взяты из вторичной палитры токенов,
     чтобы страница не рассыпалась на чужие оттенки. */
  --d1: var(--olive);   --d1-bg: var(--olive-bg);
  --d2: var(--stone);   --d2-bg: var(--stone-bg);
  --d3: var(--kraft);   --d3-bg: var(--kraft-bg);
  --d4: var(--plum);    --d4-bg: var(--plum-bg);
  --d5: var(--rose);    --d5-bg: var(--rose-bg);

  --page-pad: 24px;
  --section-gap: 96px;
}

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: var(--font-ui);
  font-size: 15px;
  line-height: 1.6;
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-feature-settings: 'ss01', 'cv01';
  /* clip, а не hidden: hidden делает страницу отдельным
     прокручиваемым контейнером и ломает прилипание шапки. */
  overflow-x: clip;
}

/* Зерно бумаги — как в панели. Лежит поверх всего, кликам не мешает. */
body::after {
  content: '';
  position: fixed; inset: 0; z-index: 9998;
  pointer-events: none;
  opacity: var(--grain-op);
  mix-blend-mode: var(--grain-blend);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='3'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
}

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

/* ---------- Типографика ---------- */
h1, h2, h3, h4 { margin: 0; font-family: var(--font-display); font-weight: 500; line-height: 1.15; }
h1 { font-size: clamp(38px, 6.5vw, 68px); letter-spacing: -.02em; }
h2 { font-size: clamp(27px, 3.6vw, 40px); letter-spacing: -.015em; }
h3 { font-size: 20px; }
p  { margin: 0; }

.lead { font-size: clamp(16px, 1.7vw, 19px); color: var(--text-2); line-height: 1.65; }
.muted { color: var(--text-3); }
.mono { font-family: var(--font-mono); }

/* Надзаголовок секции — мелкие разрядистые буквы акцентом */
.eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 12px; font-weight: 500; letter-spacing: .13em; text-transform: uppercase;
  color: var(--accent-text);
}
.eyebrow::before {
  content: ''; width: 22px; height: 1px; background: currentColor; opacity: .5;
}

/* ---------- Каркас ---------- */
.wrap { width: 100%; max-width: 1120px; margin: 0 auto; padding: 0 var(--page-pad); }
section { padding: var(--section-gap) 0; }
.sec-head { max-width: 660px; margin-bottom: 44px; display: grid; gap: 14px; }

/* ---------- Шапка ---------- */
.top {
  position: sticky; top: 0; z-index: 100;
  background: color-mix(in srgb, var(--bg) 82%, transparent);
  backdrop-filter: saturate(160%) blur(12px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--dur-2) var(--ease);
}
.top.stuck { border-bottom-color: var(--border); }
.top-in {
  height: 62px; display: flex; align-items: center; gap: 18px;
}
.brand { display: flex; align-items: center; gap: 10px; text-decoration: none; }
.brand svg { width: 24px; height: 24px; color: var(--accent); }
.brand b { font-family: var(--font-display); font-size: 18px; font-weight: 500; letter-spacing: -.01em; }
.top nav { margin-left: auto; display: flex; align-items: center; gap: 4px; }
.top nav a {
  padding: 7px 12px; border-radius: var(--r-sm);
  font-size: 13.5px; color: var(--text-2); text-decoration: none;
  transition: background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);
}
.top nav a:hover { background: var(--surface-2); color: var(--text); }
@media (max-width: 720px) { .top nav a.hide-sm { display: none; } }

.icon-btn {
  width: 34px; height: 34px; flex: none;
  display: grid; place-items: center;
  border: 1px solid var(--border-2); border-radius: var(--r-sm);
  background: var(--surface); color: var(--text-2);
  cursor: pointer;
  transition: background var(--dur-1) var(--ease), color var(--dur-1) var(--ease);
}
.icon-btn:hover { background: var(--surface-2); color: var(--text); }
.icon-btn svg { width: 16px; height: 16px; }

/* ---------- Кнопки ---------- */
.btn {
  position: relative;
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  height: 46px; padding: 0 22px;
  font-family: var(--font-ui); font-size: 15px; font-weight: 500;
  border-radius: var(--r-md); border: 1px solid transparent;
  text-decoration: none; cursor: pointer; white-space: nowrap; user-select: none;
  transition: background var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease),
              color var(--dur-1) var(--ease), transform var(--dur-1) var(--ease);
}
.btn:active { transform: translateY(.5px); }
.btn svg { width: 17px; height: 17px; }

.btn-primary {
  background: var(--accent); color: var(--accent-ink);
  border-color: color-mix(in srgb, var(--accent) 78%, #000);
  box-shadow: var(--sh-1), inset 0 1px 0 rgba(255,255,255,.18);
}
.btn-primary:hover { background: var(--accent-h); }

.btn-secondary {
  background: var(--surface); color: var(--text);
  border-color: var(--border-2);
  box-shadow: var(--sh-1), var(--sh-in);
}
.btn-secondary:hover { background: var(--surface-2); border-color: var(--border-str); }

/* ---------- Карточки ---------- */
.card {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-1), var(--sh-in);
  transition: border-color var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease),
              transform var(--dur-2) var(--ease);
}
.card-hover:hover {
  border-color: var(--border-2);
  box-shadow: var(--sh-2), var(--sh-in);
  transform: translateY(-2px);
}
.pad { padding: var(--s6); }

.tile {
  width: 40px; height: 40px; flex: none;
  display: grid; place-items: center;
  border-radius: var(--r-md);
  background: var(--stone-bg); color: var(--stone);
  border: 1px solid color-mix(in srgb, currentColor 16%, transparent);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.35);
}
.tile svg { width: 19px; height: 19px; }

/* ---------- Герой ---------- */
.hero { padding: clamp(56px, 9vw, 104px) 0 var(--section-gap); }
.hero-grid {
  display: grid; gap: clamp(36px, 5vw, 64px);
  grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
  align-items: center;
}
@media (max-width: 900px) { .hero-grid { grid-template-columns: 1fr; } }

.hero-copy { display: grid; gap: 24px; justify-items: start; }
.hero-copy h1 span { color: var(--accent-text); }
.hero-actions { display: flex; flex-wrap: wrap; gap: 12px; }

/* Плашка адреса — главный элемент страницы, за ним и приходят */
.addr {
  display: inline-flex; align-items: center; gap: 14px;
  padding: 10px 10px 10px 18px;
  background: var(--surface); border: 1px solid var(--border-2);
  border-radius: var(--r-md); box-shadow: var(--sh-1), var(--sh-in);
}
.addr-val { font-family: var(--font-mono); font-size: 16px; letter-spacing: -.01em; }
.addr button {
  height: 34px; padding: 0 13px;
  font-family: var(--font-ui); font-size: 13px; font-weight: 500;
  background: var(--accent-soft); color: var(--accent-text);
  border: 1px solid var(--accent-line); border-radius: var(--r-sm);
  cursor: pointer; white-space: nowrap;
  transition: background var(--dur-1) var(--ease);
}
.addr button:hover { background: color-mix(in srgb, var(--accent) 14%, var(--accent-soft)); }

/* Живой статус */
.status {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 7px 14px 7px 12px;
  border-radius: var(--r-full);
  background: var(--surface-2); border: 1px solid var(--border);
  font-size: 13.5px; color: var(--text-2);
}
.dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--text-3); flex: none;
}
.status.is-on  .dot { background: var(--ok);   box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 22%, transparent); animation: pulse 2.4s var(--ease) infinite; }
.status.is-off .dot { background: var(--danger); }
@keyframes pulse { 0%,100% { opacity: 1 } 50% { opacity: .45 } }

/* Картинка героя */
.hero-art {
  position: relative;
  border-radius: var(--r-xl);
  overflow: hidden;
  border: 1px solid var(--border-2);
  box-shadow: var(--sh-3);
  aspect-ratio: 4 / 3;
  background: linear-gradient(150deg, var(--surface-3), var(--surface-2));
}
.hero-art img { width: 100%; height: 100%; object-fit: cover; }

/* Пока картинки нет — вместо неё аккуратная заглушка, а не битый значок */
.ph {
  position: absolute; inset: 0;
  display: grid; place-content: center; gap: 8px; justify-items: center;
  color: var(--text-3); font-size: 12.5px; text-align: center; padding: 24px;
}
.ph svg { width: 26px; height: 26px; opacity: .5; }
.ph code { font-family: var(--font-mono); font-size: 11.5px; color: var(--text-3); }
.has-img .ph { display: none; }

/* ---------- Три шага ---------- */
.steps { display: grid; gap: 18px; grid-template-columns: repeat(3, 1fr); }
@media (max-width: 860px) { .steps { grid-template-columns: 1fr; } }
.step { display: grid; gap: 12px; }
.step-n {
  width: 30px; height: 30px; display: grid; place-items: center;
  border-radius: var(--r-full);
  background: var(--accent-soft); color: var(--accent-text);
  border: 1px solid var(--accent-line);
  font-family: var(--font-mono); font-size: 13px; font-weight: 500;
}
.step h3 { font-family: var(--font-ui); font-size: 16px; font-weight: 500; }
.step p { font-size: 14px; color: var(--text-2); }
.step code {
  font-family: var(--font-mono); font-size: 13px;
  background: var(--surface-2); border: 1px solid var(--border);
  padding: 1px 6px; border-radius: var(--r-xs);
}

/* ---------- Глубины ---------- */
/* Разрез шахты: слева отметка высоты, справа описание уровня.
   Вертикальная линия связывает всё в единый спуск. */
.depths { position: relative; display: grid; gap: 16px; }
.depths::before {
  content: ''; position: absolute; left: 63px; top: 12px; bottom: 12px; width: 1px;
  background: linear-gradient(var(--border), var(--border-2), var(--border-str));
}
@media (max-width: 700px) { .depths::before { display: none; } }

.depth {
  display: grid; grid-template-columns: 128px minmax(0, 1fr) auto; gap: 22px;
  align-items: center;
  padding: var(--s5) var(--s6);
}
@media (max-width: 700px) {
  .depth { grid-template-columns: 1fr; gap: 12px; }
}

.depth-y {
  position: relative;
  font-family: var(--font-mono); font-size: 14px; color: var(--text-2);
  display: flex; align-items: center; gap: 12px;
}
.depth-y i {
  width: 11px; height: 11px; border-radius: 50%; flex: none;
  border: 2px solid var(--bg);
  box-shadow: 0 0 0 1px var(--border-2);
  background: var(--c);
}
.depth-b { display: grid; gap: 5px; }
.depth-b h3 { font-family: var(--font-ui); font-size: 17px; font-weight: 500; }
.depth-b p { font-size: 14px; color: var(--text-2); }

.pill {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 11px; border-radius: var(--r-full);
  font-size: 12.5px; font-weight: 500; white-space: nowrap;
  background: var(--cbg); color: var(--c);
  border: 1px solid color-mix(in srgb, var(--c) 22%, transparent);
}
.pill.calm { background: var(--surface-2); color: var(--text-3); border-color: var(--border); }

/* ---------- Обитатели ---------- */
.mobs { display: grid; gap: 20px; grid-template-columns: repeat(3, 1fr); }
@media (max-width: 860px) { .mobs { grid-template-columns: 1fr; } }
.mob { overflow: hidden; display: grid; }
.mob-art {
  position: relative; aspect-ratio: 3 / 2;
  background: linear-gradient(150deg, var(--surface-3), var(--surface-2));
  border-bottom: 1px solid var(--border);
}
.mob-art img { width: 100%; height: 100%; object-fit: cover; }
.mob-b { padding: var(--s5); display: grid; gap: 10px; }
.mob-b h3 { font-family: var(--font-ui); font-size: 17px; font-weight: 500; }
.mob-stats { display: flex; flex-wrap: wrap; gap: 7px; }
.stat {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 9px; border-radius: var(--r-xs);
  font-family: var(--font-mono); font-size: 12px;
  background: var(--surface-2); border: 1px solid var(--border); color: var(--text-2);
}
.mob-b p { font-size: 13.5px; color: var(--text-2); }

/* ---------- Возможности ---------- */
.feats { display: grid; gap: 18px; grid-template-columns: repeat(3, 1fr); }
@media (max-width: 900px) { .feats { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px) { .feats { grid-template-columns: 1fr; } }
.feat { display: grid; gap: 12px; }
.feat h3 { font-family: var(--font-ui); font-size: 16px; font-weight: 500; }
.feat p { font-size: 14px; color: var(--text-2); }

/* ---------- Роли ---------- */
.roles { display: grid; gap: 14px; grid-template-columns: repeat(5, 1fr); }
@media (max-width: 980px) { .roles { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 620px) { .roles { grid-template-columns: repeat(2, 1fr); } }
.role { padding: var(--s5); display: grid; gap: 10px; align-content: start; }
.role-tag {
  justify-self: start;
  font-family: var(--font-mono); font-size: 11.5px; font-weight: 500;
  letter-spacing: .04em;
  padding: 3px 9px; border-radius: var(--r-xs);
  background: var(--cbg); color: var(--c);
  border: 1px solid color-mix(in srgb, var(--c) 22%, transparent);
}
.role p { font-size: 13.5px; color: var(--text-2); }

/* ---------- Правила ---------- */
.rules { display: grid; gap: 12px; grid-template-columns: repeat(2, 1fr); }
@media (max-width: 760px) { .rules { grid-template-columns: 1fr; } }
.rule { display: flex; gap: 13px; align-items: flex-start; padding: var(--s4) var(--s5); }
.rule svg { width: 17px; height: 17px; flex: none; margin-top: 3px; color: var(--accent); }
.rule b { font-weight: 500; }
.rule span { font-size: 14px; color: var(--text-2); }

/* ---------- Стрим ---------- */
.stream {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 32px;
  align-items: center; padding: clamp(28px, 4vw, 44px);
}
@media (max-width: 800px) { .stream { grid-template-columns: 1fr; } }
.stream-c { display: grid; gap: 16px; justify-items: start; }
.stream-btns { display: flex; flex-wrap: wrap; gap: 10px; }

/* ---------- Подвал ---------- */
footer { border-top: 1px solid var(--border); padding: 40px 0 56px; }
.foot { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; }
.foot p { font-size: 13px; color: var(--text-3); }
.foot nav { margin-left: auto; display: flex; gap: 18px; }
.foot nav a { font-size: 13px; color: var(--text-2); text-decoration: none; }
.foot nav a:hover { color: var(--accent-text); }

/* ---------- Появление при прокрутке ---------- */
/* Чуть-чуть, без цирка: сдвиг на восемь пикселей и прозрачность. */
/* Кривая тут своя, не общая --ease-out: та слишком резкая для
   проявления — прозрачность добегает до единицы за первую пятую
   времени, и вместо плавности видна вспышка. Здесь наоборот,
   начало медленное, поэтому появление читается целиком. */
.rise {
  opacity: 0;
  transform: translateY(16px);
  transition:
    opacity   640ms cubic-bezier(.4, 0, .3, 1),
    transform 720ms cubic-bezier(.22, .7, .3, 1);
}
.rise.in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) { .rise { opacity: 1; transform: none; } }


/* ---------- Кто сейчас в игре ----------
   Блок целиком прячется, когда на сервере пусто: пустая полка
   выглядит грустнее, чем её отсутствие. */
#now { padding: 0 0 var(--section-gap); }
#now[hidden] { display: none; }
.now-card { padding: var(--s5) var(--s6); display: grid; gap: 14px; }
.now-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.now-head h3 { font-family: var(--font-ui); font-size: 16px; font-weight: 500; }
.now-head span { font-size: 13px; color: var(--text-3); }
.now-list { display: flex; flex-wrap: wrap; gap: 8px; }
.pname {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 12px 5px 8px; border-radius: var(--r-full);
  background: var(--surface-2); border: 1px solid var(--border);
  font-size: 13.5px;
}
.pname i {
  width: 7px; height: 7px; border-radius: 50%; flex: none;
  background: var(--ok);
}

/* ---------- Как получить роль ---------- */
.howto { margin-top: 22px; display: flex; gap: 14px; align-items: flex-start; padding: var(--s5) var(--s6); }
.howto svg { width: 18px; height: 18px; flex: none; margin-top: 2px; color: var(--accent); }
.howto p { font-size: 14px; color: var(--text-2); }
.howto b { color: var(--text); font-weight: 500; }

/* ---------- Переход в магазин ----------
   Стоит под ролями: там человек как раз узнал, что роли бывают. */
.shop-cta {
  margin-top: 14px;
  padding: var(--s5) var(--s6);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
}
.shop-cta h3 { font-size: 16px; font-weight: 600; margin-bottom: 3px; }
.shop-cta p { font-size: 14px; color: var(--text-2); }
.nav-shop { color: var(--accent) !important; font-weight: 500; }

/* ---------- Частые вопросы ----------
   Родной details, без единой строчки скриптов. */
.faq { display: grid; gap: 10px; }
details.q {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  box-shadow: var(--sh-1), var(--sh-in);
  transition: border-color var(--dur-2) var(--ease);
}
details.q[open] { border-color: var(--border-2); }
details.q summary {
  display: flex; align-items: center; gap: 12px;
  padding: var(--s4) var(--s5);
  font-size: 15px; font-weight: 500;
  cursor: pointer; list-style: none; user-select: none;
}
details.q summary::-webkit-details-marker { display: none; }
details.q summary::after {
  content: ''; margin-left: auto; flex: none;
  width: 9px; height: 9px;
  border-right: 1.6px solid var(--text-3);
  border-bottom: 1.6px solid var(--text-3);
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform var(--dur-2) var(--ease);
}
details.q[open] summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
details.q summary:hover { color: var(--accent-text); }
/* Обёртка нужна только для анимации: двигаем её высоту, а отступы
   живут внутри — иначе при высоте ноль они бы всё равно занимали место. */
.q-anim { overflow: hidden; }
.q-body { padding: 0 var(--s5) var(--s5) var(--s5); font-size: 14px; color: var(--text-2); }
.q-body code {
  font-family: var(--font-mono); font-size: 13px;
  background: var(--surface-2); border: 1px solid var(--border);
  padding: 1px 6px; border-radius: var(--r-xs);
}


/* ============================================================
   Погружение: страница как спуск в шахту.

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

   Цвета текста и карточек закреплены за секциями, а границы
   между зонами проходят по пустому месту между разделами.
   ============================================================ */

html[data-theme="auto"] body {
  background-color: #F0EEE6;
  /* запасной вариант для старых браузеров */
  background-image: linear-gradient(
    to bottom,
    #F0EEE6  0%,
    #F0EEE6  var(--fade-a, 34%),
    #E9E5DA  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.073),
    #E2DCCD  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.147),
    #DAD2BF  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.220),
    #CAC0AC  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.297),
    #B7AB96  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.373),
    #A2937B  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.450),
    #8F816C  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.527),
    #786C59  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.603),
    #59503F  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.680),
    #4D4637  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.740),
    #3F392E  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.800),
    #2C2823  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.860),
    #272420  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.907),
    #221F1C  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.953),
    #1B1A18  var(--fade-b, 48%),
    #141312  80%,
    #0B0A09 100%
  );
  /* основной: смешивание в oklab даёт ровный переход без грязи в середине */
  background-image: linear-gradient(
    to bottom in oklab,
    #F0EEE6  0%,
    #F0EEE6  var(--fade-a, 34%),
    #E9E5DA  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.073),
    #E2DCCD  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.147),
    #DAD2BF  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.220),
    #CAC0AC  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.297),
    #B7AB96  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.373),
    #A2937B  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.450),
    #8F816C  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.527),
    #786C59  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.603),
    #59503F  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.680),
    #4D4637  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.740),
    #3F392E  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.800),
    #2C2823  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.860),
    #272420  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.907),
    #221F1C  calc(var(--fade-a, 34%) + (var(--fade-b, 48%) - var(--fade-a, 34%)) * 0.953),
    #1B1A18  var(--fade-b, 48%),
    #141312  80%,
    #0B0A09 100%
  );
  background-repeat: no-repeat;
  background-size: 100% 100%;
  color: var(--text);
}

/* Полоса спуска: пустая, без единой строчки текста.
   Именно на ней происходит весь переход из дня в глубину,
   поэтому градиент растянут и не читается как шов. */
.descent {
  height: clamp(40px, 6vh, 90px);
}

/* Цвета зон больше не переключаются ступенькой.
   Раньше zone-day и zone-dusk держали светлые карточки, а zone-deep
   разом получал тёмные — и в середине спуска фон был уже тёмным,
   а панели ещё белыми. Теперь все токены плавно перетекают из светлых
   в тёмные вместе с фоном, этим занимается site.js. */

/* Свечение заголовков в глубине — чернила светящегося спрута */
/* В ручной тёмной теме глубина не считается, поэтому свечение
   включаем на полную сразу. */
[data-theme="dark"] { --glow: 1; }

html[data-theme="auto"] h2,
html[data-theme="auto"] h3,
html[data-theme="dark"] h2,
html[data-theme="dark"] h3 {
  text-shadow: 0 0 18px rgba(126, 214, 232, calc(.28 * var(--glow, 0)));
}

html[data-theme="auto"] .eyebrow,
html[data-theme="dark"] .eyebrow {
  text-shadow: 0 0 16px rgba(224, 138, 102, calc(.45 * var(--glow, 0)));
}

/* ============================================================
   Шапка в режиме погружения.

   Она висит поверх всех зон сразу — единственное место, где
   смену цвета не спрятать. Поэтому переход плавный, а фон
   достаточно плотный, чтобы сквозь него не просвечивал текст.
   ============================================================ */

html[data-theme="auto"] .top,
html[data-theme="auto"] .top a,
html[data-theme="auto"] .top .icon-btn {
  transition: background-color .45s ease, color .45s ease, border-color .45s ease;
}

html[data-theme="auto"] .top {
  background: rgba(240, 238, 230, .88);
  backdrop-filter: saturate(140%) blur(14px);
  -webkit-backdrop-filter: saturate(140%) blur(14px);
}

html[data-theme="auto"] .top.on-dark {
  background: rgba(17, 16, 15, .88);
  border-bottom-color: #38352F;
  color: #F0EEE6;
}

html[data-theme="auto"] .top.on-dark a,
html[data-theme="auto"] .top.on-dark b {
  color: #F0EEE6;
}

html[data-theme="auto"] .top.on-dark .icon-btn {
  background: rgba(255, 255, 255, .07);
  border-color: #4A453C;
  color: #F0EEE6;
}

/* Пункты меню не должны разъезжаться на две строки */
.top nav a { white-space: nowrap; }

/* На узких экранах шапка не должна разъезжаться:
   у неё фиксированная высота, и любой перенос строки вылезает наружу. */
@media (max-width: 560px) {
  .top-in { gap: 10px; }
  .top nav { gap: 2px; }
  .top nav a { font-size: 13px; padding: 6px 8px; }
  .brand b { font-size: 16px; }
  .brand svg { width: 20px; height: 20px; }
}


/* Полоса статуса на телефоне: содержимое страницы не должно
   выглядывать над шапкой. Шапка накрывает её собой. */
.top {
  padding-top: env(safe-area-inset-top, 0px);
}


/* Нижняя безопасная зона на телефоне: подвал не должен упираться
   в полоску жеста «домой». */
footer { padding-bottom: calc(24px + env(safe-area-inset-bottom, 0px)); }

/* ---------- Обитатели: разбивка по уровням ---------- */
.mob-group + .mob-group { margin-top: 38px; }
.mob-lvl {
  display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
  margin: 0 0 16px; padding-bottom: 11px;
  border-bottom: 1px solid var(--border);
  font-family: var(--font-ui); font-size: 16px; font-weight: 500;
}
.mob-lvl .lvl-n {
  font-size: 12px; font-weight: 500; letter-spacing: .13em; text-transform: uppercase;
  color: var(--accent-text);
}
.mob-lvl .lvl-y {
  margin-left: auto; font-family: var(--font-mono); font-size: 12.5px; color: var(--text-3);
}
@media (max-width: 520px) { .mob-lvl .lvl-y { margin-left: 0; } }


/* Микрозерно поверх фона: убивает полосы на длинном градиенте.
   Без него в тёмной части видны ступеньки — это ограничение 8 бит на канал. */
html[data-theme="auto"] body::before {
  content: '';
  position: fixed; inset: 0; z-index: -1; pointer-events: none;
  opacity: .035; mix-blend-mode: overlay;
  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='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* Кнопка языка: та же коробка, что у темы, но с подписью вместо иконки */
.lang-btn {
  font-family: var(--font-mono); font-size: 11.5px; font-weight: 600;
  letter-spacing: .06em; line-height: 1;
}

/* Английский заголовок первого экрана длиннее русского почти вдвое
   и на полном кегле разъезжается на три строки. Немного уменьшаем,
   чтобы держались две, как задумано. */
html[lang="en"] .hero-copy h1 { font-size: clamp(30px, 5vw, 50px); }

/* ---------- Починка появления вопросов ----------
   details.q объявляет свой transition и по специфичности (тег + класс)
   перебивает .rise целиком — свойство transition не складывается,
   а заменяется. Из-за этого вопросы возникали рывком, тогда как
   остальные карточки проявлялись нормально. Повторяем переходы здесь
   и заодно сохраняем анимацию рамки. */
details.q.rise {
  transition:
    opacity      640ms cubic-bezier(.4, 0, .3, 1),
    transform    720ms cubic-bezier(.22, .7, .3, 1),
    border-color var(--dur-2) var(--ease);
}

/* Пока блок не проявился, отдаём его композитору отдельным слоем —
   тогда анимация идёт мимо перерисовки страницы и держит частоту
   экрана, вплоть до 120 Гц. После появления подсказку снимаем,
   иначе слои копятся и съедают память. */
.rise { will-change: opacity, transform; }
.rise.in { will-change: auto; }

/* ============================================================
   ШКАЛА ГЛУБИНЫ
   Сайт про спуск, поэтому спуск должен быть виден. Полоса слева
   показывает, на какой ты «высоте»: бегунок едет вместе с прокруткой,
   активный уровень подсвечивается, а число рядом отсчитывает Y —
   те же значения, что и в игре.

   Появляется после первого экрана, чтобы не мешать заголовку,
   и прячется на узких окнах, где для неё просто нет места.
   ============================================================ */
.gauge {
  position: fixed; left: 26px; top: 50%; z-index: 40;
  transform: translateY(-50%);
  display: grid; grid-template-columns: 2px auto; gap: 14px;
  opacity: 0; pointer-events: none;
  transition: opacity 480ms var(--ease);
}
.gauge.on { opacity: 1; }

.gauge-line { position: relative; border-radius: 2px; background: var(--border-2); }
.gauge-fill {
  position: absolute; left: 0; top: 0; width: 100%; height: 0;
  border-radius: 2px;
  background: linear-gradient(to bottom, var(--d1), var(--d2), var(--d3), var(--d4), var(--d5));
}
.gauge-dot {
  position: absolute; left: 50%; top: 0;
  width: 9px; height: 9px; margin: -4.5px 0 0 -4.5px;
  border-radius: 50%; background: var(--accent);
  box-shadow: 0 0 0 4px var(--bg);
  /* Плавность бегунка — не анимация, а сглаживание: положение
     задаётся при каждой прокрутке, переход убирает дребезг. */
  transition: top 90ms linear;
}

.gauge-lv {
  list-style: none; margin: 0; padding: 0;
  height: 248px; display: grid; align-content: space-between;
  font-family: var(--font-ui); font-size: 11.5px; line-height: 1.25;
}
.gauge-lv li {
  display: grid; gap: 2px; opacity: .42; color: var(--text-2);
  transition: opacity 320ms var(--ease), color 320ms var(--ease);
}
.gauge-lv li.now { opacity: 1; color: var(--text); }
.gauge-lv b {
  font-family: var(--font-mono); font-size: 10.5px; font-weight: 500;
  letter-spacing: .04em; color: var(--text-3);
}
.gauge-lv li.now b { color: var(--accent-text); }

.gauge-now {
  position: absolute; left: 0; top: -30px;
  font-family: var(--font-mono); font-size: 12px; color: var(--text-3);
  white-space: nowrap;
}

@media (max-width: 1280px) { .gauge { display: none; } }
@media (prefers-reduced-motion: reduce) { .gauge-dot { transition: none; } }

/* Разрез шахты на первом экране едет медленнее страницы —
   от этого первый экран читается объёмным. Сдвиг маленький,
   иначе картинка отрывается от вёрстки. */
.hero-art { will-change: transform; }

/* ---------- Фонарь ----------
   Внизу страницы темно, и по смыслу человек должен туда светить.
   Это не затемнение, а добавление света: режим screen только
   осветляет то, что под ним, поэтому текст не теряет контраст,
   как было бы с обычной тёмной маской с дыркой.

   Сила пятна привязана к глубине прокрутки: наверху ноль,
   на дне максимум. На тач-устройствах курсора нет — выключаем. */
.torch {
  position: fixed; inset: 0; z-index: 5;
  pointer-events: none;
  mix-blend-mode: screen;
  opacity: 0;
  transition: opacity 700ms var(--ease);
  background: radial-gradient(
    circle 150px at var(--mx, 50%) var(--my, 50%),
    rgba(255, 196, 128, .075) 0%,
    rgba(255, 176, 110, .045) 38%,
    transparent 72%
  );
}
@media (hover: none), (pointer: coarse) { .torch { display: none; } }
@media (prefers-reduced-motion: reduce) { .torch { display: none; } }

/* Плавная прокрутка по ссылкам меню. Отступ сверху — чтобы заголовок
   раздела не уезжал под липкую шапку. Для тех, кто выключил анимации
   в системе, прокрутка остаётся мгновенной. */
@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }
}
html { scroll-padding-top: 84px; }

/* ---------- Живые числа ---------- */
.live-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
@media (max-width: 860px) { .live-grid { grid-template-columns: 1fr; } }
.live-cell { display: grid; gap: 7px; align-content: start; }
.live-n {
  font-family: var(--font-display); font-weight: 500;
  font-size: clamp(34px, 5vw, 52px); line-height: 1; letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
}
.live-k { font-size: 14px; color: var(--text-2); }
.live-s { font-family: var(--font-mono); font-size: 12px; color: var(--text-3); min-height: 1em; }
