/* ============================================================
   ЯЗНАЮ — движение: кейфреймы + scroll-reveal утилиты.
   Адаптация Passionfroot (02-animations): взято подмножество,
   пригодное фасаду; тайминги читаются из brand/tokens.css.
   Использование: <div data-reveal="up">…</div> + js/reveal.js;
   stagger: контейнер [data-reveal-stagger] со --stagger.
   ============================================================ */

/* ---- Кейфреймы ---- */
@keyframes float {
  0%, 100% { transform: translateY(0px); }
  50%      { transform: translateY(-20px); }
}
@keyframes scroll-left {
  0%   { transform: translateX(0px); }
  100% { transform: translateX(-50%); }
}
@keyframes shimmer {
  0%   { background-position: 150% 0px; }
  100% { background-position: -150% 0px; }
}
@keyframes pulse {
  50% { opacity: 0.5; }
}
@keyframes word-reveal {
  0%   { opacity: 0; filter: blur(10px); transform: translateY(20px); }
  100% { opacity: 1; filter: blur(0);    transform: translateY(0px); }
}
@keyframes animate-in-up {
  0%   { opacity: 0; transform: translateY(var(--distance, 40px)); }
  100% { opacity: 1; transform: translateY(0px); }
}
@keyframes animate-in-down {
  0%   { opacity: 0; transform: translateY(calc(var(--distance, 40px) * -1)); }
  100% { opacity: 1; transform: translateY(0px); }
}
@keyframes animate-in-left {
  0%   { opacity: 0; transform: translateX(calc(var(--distance, 40px) * -1)); }
  100% { opacity: 1; transform: translateX(0px); }
}
@keyframes animate-in-right {
  0%   { opacity: 0; transform: translateX(var(--distance, 40px)); }
  100% { opacity: 1; transform: translateX(0px); }
}
@keyframes animate-in-scale {
  0%   { opacity: 0; transform: scale(var(--scale, 0.95)); }
  100% { opacity: 1; transform: scale(1); }
}
@keyframes animate-in-blur {
  0%   { opacity: 0; filter: blur(var(--blur, 10px)); }
  100% { opacity: 1; filter: blur(0); }
}
@keyframes animate-in-up-blur {
  0%   { opacity: 0.2; transform: translateY(var(--distance, 8px)); filter: blur(var(--blur, 2px)); }
  100% { opacity: 1;   transform: translateY(0px);                  filter: blur(0); }
}
@keyframes animate-in-pop {
  0%   { opacity: 0; transform: translateY(var(--pop-distance, 80px)) scale(0.9); filter: blur(var(--blur, 4px)); }
  60%  { opacity: 1; filter: blur(0); }
  100% { opacity: 1; transform: translateY(0px) scale(1); filter: blur(0); }
}

/* ---- Reveal-утилиты ----
   Прячем только когда JS точно жив: класс `js` ставит инлайн-строка в <head>
   каждой страницы. Без него (скрипт не доехал, старый браузер, блокировщик)
   контент виден сразу — анимация появления это украшение, а не условие показа. */
.js [data-reveal] { opacity: 0; }
[data-reveal].is-visible {
  animation-duration: var(--animation-duration);
  animation-timing-function: var(--animation-easing);
  animation-delay: var(--animation-delay);
  animation-fill-mode: both;
}
[data-reveal="up"].is-visible      { animation-name: animate-in-up; }
[data-reveal="down"].is-visible    { animation-name: animate-in-down; }
[data-reveal="left"].is-visible    { animation-name: animate-in-left; }
[data-reveal="right"].is-visible   { animation-name: animate-in-right; }
[data-reveal="scale"].is-visible   { animation-name: animate-in-scale; }
[data-reveal="blur"].is-visible    { animation-name: animate-in-blur; }
[data-reveal="up-blur"].is-visible { animation-name: animate-in-up-blur; }
[data-reveal="pop"].is-visible     { animation-name: animate-in-pop; }

[data-reveal-stagger] > * {
  --animation-delay: calc(var(--i, 0) * var(--stagger, 0.08s));
}

/* Атмосферные лупы */
.fx-float { animation: float 6s ease-in-out infinite; }
.fx-pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; }

/* Маркиза (лента live-реакций Б4) */
.marquee {
  position: relative;
  overflow: hidden;
  width: 100%;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
          mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
}
.marquee__track {
  display: flex;
  width: max-content;
  gap: 48px;
  align-items: center;
  animation: scroll-left 60s linear infinite;
}
.marquee:hover .marquee__track { animation-play-state: paused; }

/* Аккордеон (FAQ Б11) — grid-rows 0fr→1fr */
.accordion {
  display: grid;
  grid-template-rows: 0fr;
  transition: var(--transition-accordion);
}
.accordion[data-open="true"] { grid-template-rows: 1fr; }
.accordion > * { overflow: hidden; min-height: 0; }

/* Доступность: полное отключение движения */
@media (prefers-reduced-motion: reduce) {
  [data-reveal],
  [data-reveal].is-visible,
  .fx-float, .fx-pulse {
    animation: none !important;
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
  }
  .marquee__track { animation: none !important; }
  html { scroll-behavior: auto !important; }
  * { transition-duration: 0.01ms !important; }
}
