/* =========================================================
   Ecstatic Dance Ural — dance.bios74.ru
   Макет со скролл-скраббингом кадровой последовательности.
   Токены унаследованы от admin.bios74.ru, чтобы макеты
   можно было сравнивать на одном бренде.
========================================================= */

:root{
  --bg:        #0C100D;
  --bg-2:      #131A14;
  --ink:       #F2EFE7;
  --ink-soft:  rgba(242,239,231,.70);
  --stone:     rgba(242,239,231,.44);
  --line:      rgba(242,239,231,.13);
  --green:     #7BE3A5;
  --green-2:   #3E7D5C;
  --clay:      #E9C7A9;

  --glass:        rgba(255,255,255,.055);
  --glass-border: rgba(255,255,255,.13);

  --serif: 'Fraunces','Iowan Old Style',Georgia,serif;
  --sans:  'Manrope',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;

  --container: 1180px;
  --gutter: clamp(20px,5vw,64px);
  --r: 18px;
  --ease: cubic-bezier(.16,.84,.32,1);

  /* семантическая шкала слоёв — без 999 */
  --z-canvas:0; --z-scrim:1; --z-stops:2; --z-rail:3; --z-nav:4;
}

*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--bg);color:var(--ink);
  font-family:var(--sans);font-size:16px;line-height:1.6;
  -webkit-font-smoothing:antialiased;overflow-x:hidden;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3{margin:0;font-family:var(--serif);font-weight:400;line-height:1.08;letter-spacing:-.022em}
p{margin:0}
em{font-style:italic;color:var(--clay)}

.skip{position:absolute;left:-9999px;top:0;z-index:99}
.skip:focus{left:12px;top:12px;padding:10px 16px;background:var(--green);color:#0B0F0C;border-radius:10px}
:focus-visible{outline:2px solid var(--green);outline-offset:3px;border-radius:6px}

/* ---------- Шапка ---------- */
/* Шапки во время полёта не существует. Любой элемент интерфейса,
   прибитый к верхнему краю, читается как рамка вокруг кадра и рушит
   ощущение, что кадр — это и есть страница. Навигация въезжает
   сверху ровно тогда, когда полёт закончился. */
.nav{
  position:fixed;inset:0 0 auto 0;z-index:var(--z-nav);
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  height:66px;padding:0 var(--gutter);
  background:rgba(12,16,13,.86);backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line);
  opacity:0;visibility:hidden;pointer-events:none;
  transform:translateY(-100%);
  transition:opacity .45s var(--ease),transform .45s var(--ease),visibility 0s linear .45s;
}
.nav.is-shown{
  opacity:1;visibility:visible;pointer-events:auto;transform:none;
  transition:opacity .45s var(--ease),transform .45s var(--ease),visibility 0s;
}
.nav__logo{display:inline-flex;align-items:center;gap:10px;font-weight:700;font-size:15px;letter-spacing:.01em}
.nav__logo span{color:var(--green)}
.nav__wave{width:34px;height:14px;color:var(--green);flex:none}
.nav__links{display:flex;align-items:center;gap:clamp(14px,2.4vw,28px);font-size:14px;font-weight:600}
.nav__links a{color:var(--ink-soft);transition:color .2s var(--ease)}
.nav__links a:hover{color:var(--ink)}
.nav__cta{
  padding:8px 16px;border-radius:999px;border:1px solid var(--glass-border);
  background:var(--glass);color:var(--ink)!important;
}
.nav__cta:hover{border-color:var(--green);color:var(--green)!important}
@media (max-width:560px){ .nav__links a:not(.nav__cta){display:none} }

/* ---------- ПОЛЁТ ---------- */
.flight{position:relative;height:660vh}          /* длина прокрутки = длина полёта */
.flight__stage{
  position:sticky;top:0;height:100svh;overflow:hidden;background:#0A0D0A;
}
.flight__canvas,.flight__poster{
  position:absolute;inset:0;width:100%;height:100%;z-index:var(--z-canvas);
}
.flight__canvas--bg{
  /* Размытая копия кадра во весь экран: держит полноэкранность,
     пока резкая полоса сверху даёт настоящую детализацию. */
  filter:blur(30px) saturate(1.12) brightness(.5);
  transform:scale(1.16);
  display:none;
}
.flight__poster{object-fit:cover;transition:opacity .5s var(--ease)}
.flight__poster.is-hidden{opacity:0}

/* Затемнение под текстом. Слева плотнее — там колонка с текстом. */
.flight__scrim{
  position:absolute;inset:0;z-index:var(--z-scrim);pointer-events:none;
  background:
    linear-gradient(100deg, rgba(8,11,9,.62) 0%, rgba(8,11,9,.34) 24%, rgba(8,11,9,.06) 52%, rgba(8,11,9,0) 72%),
    linear-gradient(to top, rgba(8,11,9,.62) 0%, rgba(8,11,9,0) 30%);
}
.flight__vignette{
  position:absolute;inset:0;z-index:var(--z-scrim);pointer-events:none;
  background:radial-gradient(130% 100% at 50% 45%, transparent 52%, rgba(6,9,7,.62) 100%);
}
@media (max-width:820px){
  .flight__scrim{
    background:
      linear-gradient(to top, rgba(8,11,9,.94) 0%, rgba(8,11,9,.80) 26%, rgba(8,11,9,.22) 58%, rgba(8,11,9,.10) 100%);
  }
}

/* ---------- Текстовые остановки ---------- */
/* Надписи живут В КАДРЕ: каждая привязана к точке на местности
   (data-ax0/ay0 -> ax1/ay1 в координатах кадра). JS переводит эту точку
   в пиксели вьюпорта тем же преобразованием, каким рисуется сам кадр,
   и двигает блок трансформом. При полёте вперёд объект уползает от
   центра к краю и растёт — блок повторяет это движение. */
/* Надписи НЕ плитки. Это свободный текст, лежащий в перспективе на
   местности: у каждой остановки заданы координаты объекта в кадре
   (data-ax0/ay0 -> ax1/ay1), а JS собирает 3D-трансформ — наклон в
   плоскость земли, доворот к камере и крен. По мере приближения текст
   распрямляется, растёт и уходит из расфокуса, как настоящий объект.
   Читаемость держит не подложка, а многослойная тень на самих буквах. */
.stops{
  position:absolute;inset:0;z-index:var(--z-stops);
  pointer-events:none;
  perspective:1500px;
  perspective-origin:50% 50%;
  transform-style:preserve-3d;
}
.stop{
  position:absolute;left:0;top:0;
  width:min(430px,42vw);
  opacity:var(--o,0);
  transform:
    translate3d(var(--x,0),var(--y,0),0)
    rotateX(var(--rx,44deg))
    rotateY(var(--ry,0deg))
    rotateZ(var(--rz,0deg))
    scale(var(--s,1));
  transform-origin:0% 50%;
  transform-style:preserve-3d;
  filter:blur(var(--blur,0px));
  pointer-events:none;
}
.stop[data-live="1"]{pointer-events:auto}
.stop:first-of-type{width:min(560px,50vw)}

/* Кнопка в перспективе нечитаема и неудобна для попадания — доворачиваем
   её обратно почти в плоскость экрана, оставив лёгкий наклон. */
.stop .btn{transform:rotateX(calc(var(--rx,44deg) * -0.78))}

/* Метка точки на местности. */
.mark{
  position:absolute;left:0;top:0;z-index:var(--z-stops);
  width:9px;height:9px;margin:-4.5px 0 0 -4.5px;border-radius:50%;
  background:var(--green);
  box-shadow:0 0 0 1px rgba(9,13,10,.55),0 0 14px 3px rgba(123,227,165,.55);
  opacity:var(--o,0);
  transform:translate3d(var(--x,0),var(--y,0),0) scale(var(--s,1));
  pointer-events:none;
}
.mark::after{
  content:"";position:absolute;inset:-9px;border-radius:50%;
  border:1px solid rgba(123,227,165,.45);
}

/* Тень-ореол вместо подложки: тёмный нимб идёт по контуру букв,
   поэтому текст читается на любом фоне, но коробки на кадре нет. */
.stop__kicker,.stop__h,.stop__p,.stop__sign,.stop__wave{
  list-style:none;margin:22px 0 0;padding:0;display:grid;gap:9px;
}
.stop__wave li{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.stop__wave b{font-size:15px;font-weight:700;min-width:134px}
.stop__wave span{font-size:14.5px;color:rgba(242,239,231,.76)}
.stop__kicker{
  font-size:13px;font-weight:800;letter-spacing:.2em;text-transform:uppercase;
  color:#9BEFBE;margin-bottom:20px;
}
.stop__h{font-size:clamp(2.2rem,5vw,3.9rem);text-wrap:balance}
.stop__h--hero{font-size:clamp(2.7rem,6.6vw,5rem);letter-spacing:-.03em}
.stop__p{
  margin-top:20px;font-size:clamp(16px,1.4vw,19.5px);color:rgba(242,239,231,.93);
  max-width:44ch;text-wrap:pretty;
}
.stop__sign{
  margin-top:22px;font-family:var(--serif);font-style:italic;
  font-size:20px;color:var(--clay);
}
/* Фазы встречи — свободные строки, без панели и разделителей. */
.stop__wave{list-style:none;margin:24px 0 0;padding:0;display:grid;gap:10px}
.stop__wave li{display:grid;grid-template-columns:138px 1fr;gap:16px;align-items:baseline}
.stop__wave b{font-size:15px;font-weight:700;min-width:138px}
.stop__wave span{font-size:14.5px;color:rgba(242,239,231,.86)}
.stop .btn{margin-top:26px;pointer-events:auto}

@media (max-width:820px){
  .stop{width:calc(100vw - 2*var(--gutter))}
  .stop__wave li{grid-template-columns:118px 1fr;gap:12px}
}

/* ---------- Рельс прогресса ---------- */
.rail{
  position:absolute;z-index:var(--z-rail);
  right:calc(var(--gutter) - 4px);top:50%;transform:translateY(-50%);
  height:min(280px,38vh);width:2px;
}
.rail__line{position:absolute;inset:0;background:rgba(242,239,231,.16);border-radius:2px;display:block}
.rail__fill{
  position:absolute;left:0;top:0;width:100%;height:calc(var(--p,0) * 100%);
  background:linear-gradient(to bottom,var(--green),var(--clay));border-radius:2px;display:block;
}
.rail__tick{
  position:absolute;left:50%;top:calc(var(--t) * 100%);
  width:5px;height:5px;margin:-2.5px 0 0 -2.5px;border-radius:50%;
  background:rgba(242,239,231,.34);transition:background .3s var(--ease),transform .3s var(--ease);
}
.rail__tick.is-on{background:var(--green);transform:scale(1.7)}
@media (max-width:820px){ .rail{display:none} }

/* ---------- Подсказка и загрузка ---------- */
.hint{
  position:absolute;z-index:var(--z-rail);left:50%;bottom:26px;transform:translateX(-50%);
  display:flex;align-items:center;gap:8px;
  font-size:11px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;color:var(--stone);
  transition:opacity .5s var(--ease);
}
.hint svg{width:13px;height:24px;animation:nudge 2.4s var(--ease) infinite}
.hint.is-off{opacity:0}
@keyframes nudge{0%,100%{transform:translateY(0);opacity:.5}50%{transform:translateY(5px);opacity:1}}

.loader{
  position:absolute;z-index:var(--z-rail);left:0;right:0;bottom:0;height:2px;
  background:rgba(242,239,231,.10);transition:opacity .5s var(--ease);
}
.loader i{display:block;height:100%;width:0;background:var(--green);transition:width .25s linear}
.loader.is-done{opacity:0}

/* ---------- Общие элементы ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;
  padding:13px 26px;border-radius:999px;
  font-family:var(--sans);font-size:14.5px;font-weight:700;white-space:nowrap;
  border:1px solid transparent;cursor:pointer;
  transition:transform .16s var(--ease),background .22s var(--ease),border-color .22s var(--ease),color .22s var(--ease);
}
.btn--lg{padding:16px 32px;font-size:15.5px}
.btn--solid{background:var(--green);color:#08110B;border-color:var(--green)}
.btn--solid:hover{background:#95ECB7;border-color:#95ECB7}
.btn--ghost{background:var(--glass);color:var(--ink);border-color:var(--glass-border);backdrop-filter:blur(8px)}
.btn--ghost:hover{border-color:var(--green);color:var(--green)}
.btn:active{transform:scale(.97)}

.kicker{
  font-size:12px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;
  color:var(--green);margin-bottom:14px;
}
.head{max-width:var(--container);margin:0 auto clamp(36px,5vw,60px)}
.head h2{font-size:clamp(1.9rem,3.6vw,3rem)}
.head p{margin-top:14px;color:var(--ink-soft);max-width:52ch}

main{position:relative;z-index:1;background:var(--bg)}
/* Отступы — только секциям хвоста. .flight обязан быть во всю ширину:
   канвас внутри позиционируется по padding-box, любой padding здесь
   рассинхронизирует CSS-размер канваса с его битмапом. */
main section{padding:clamp(72px,10vw,128px) var(--gutter)}
.flight{padding:0}

/* ---------- Форматы ---------- */
.cards{
  max-width:var(--container);margin:0 auto;
  display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
}
.card{
  display:flex;flex-direction:column;
  border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  background:var(--bg-2);
  transition:transform .35s var(--ease),border-color .35s var(--ease);
}
.card:hover{transform:translateY(-5px);border-color:rgba(123,227,165,.42)}
.card__media{display:block;aspect-ratio:4/3;overflow:hidden;background:#0A0D0A}
.card__media img{width:100%;height:100%;object-fit:cover;transition:transform .6s var(--ease)}
.card:hover .card__media img{transform:scale(1.05)}
.card__body{display:block;padding:22px 22px 26px}
.card__tag{
  display:inline-block;font-size:11px;font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:var(--green);margin-bottom:12px;
}
.card h3{font-size:1.45rem;margin-bottom:10px}
.card p{color:var(--ink-soft);font-size:14.5px}
.card__more{display:inline-block;margin-top:18px;font-size:14px;font-weight:700;color:var(--green)}
.card__more::after{content:" →";transition:opacity .2s}

/* ---------- Милена ---------- */
.milena{
  max-width:var(--container);margin:0 auto;
  display:grid;gap:clamp(28px,5vw,64px);align-items:center;
  grid-template-columns:minmax(0,.85fr) minmax(0,1fr);
}
.milena__media{border-radius:var(--r);overflow:hidden;aspect-ratio:4/5}
.milena__media img{width:100%;height:100%;object-fit:cover}
.milena__text h2{font-size:clamp(1.9rem,3.4vw,2.8rem);margin-bottom:16px}
.milena__text p{color:var(--ink-soft);max-width:50ch}
.milena__acts{display:flex;flex-wrap:wrap;gap:12px;margin-top:28px}
@media (max-width:760px){ .milena{grid-template-columns:1fr} .milena__media{aspect-ratio:3/2} }

/* ---------- Фотополоса ---------- */
.strip{padding-inline:0;overflow:hidden}
.strip__track{
  display:flex;gap:12px;padding-inline:var(--gutter);
  overflow-x:auto;scroll-snap-type:x mandatory;
  scrollbar-width:none;-webkit-overflow-scrolling:touch;
}
.strip__track::-webkit-scrollbar{display:none}
.strip__track img{
  flex:none;width:clamp(180px,24vw,290px);aspect-ratio:3/4;
  object-fit:cover;border-radius:14px;scroll-snap-align:center;
}

/* ---------- Присоединиться ---------- */
.join__box{
  max-width:820px;margin:0 auto;text-align:center;
  padding:clamp(36px,6vw,68px) clamp(24px,5vw,56px);
  border:1px solid var(--glass-border);border-radius:26px;
  background:
    radial-gradient(90% 130% at 50% 0%, rgba(123,227,165,.13), transparent 62%),
    var(--bg-2);
}
.join__box h2{font-size:clamp(1.9rem,3.8vw,3rem)}
.join__box p{margin:16px auto 0;color:var(--ink-soft);max-width:46ch}
.join__acts{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:32px}

/* ---------- Подвал ---------- */
.foot{
  padding:44px var(--gutter) 56px;text-align:center;
  border-top:1px solid var(--line);color:var(--stone);font-size:13.5px;
}
.foot__wave{width:44px;height:18px;color:var(--green-2);margin:0 auto 16px}
.foot a{color:var(--ink-soft);border-bottom:1px solid var(--line)}
.foot a:hover{color:var(--green)}
.foot__note{margin-top:8px;font-size:12.5px;opacity:.72}

/* ---------- Уважение к prefers-reduced-motion ----------
   Скраббинг — это движение, и оно неотключаемо по своей природе.
   Поэтому при reduce полёт разбирается в обычную статичную страницу:
   постер сверху, остановки — простыми блоками друг под другом. */
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  .flight{height:auto}
  .flight__stage{position:static;height:auto;overflow:visible}
  .flight__canvas,.rail,.hint,.loader,.flight__vignette{display:none}
  .flight__poster{position:relative;height:auto;aspect-ratio:16/9;opacity:1!important}
  .flight__scrim{display:none}
  .stops{
    position:static;display:block;overflow:visible;
    padding:clamp(56px,8vw,96px) var(--gutter);
    max-width:var(--container);margin:0 auto;
  }
  .mark{display:none}
  .stop::before{display:none}
  .stop{
    position:static;width:auto;max-width:62ch;
    opacity:1!important;transform:none!important;filter:none!important;
    pointer-events:auto;padding-block:clamp(28px,5vw,48px);
    border-bottom:1px solid var(--line);
  }
  .stop:last-child{border-bottom:0}
  .hint svg{animation:none}
  .card,.card__media img{transition:none}
}
