/* ============================================================
   ANIMATIONS — initial states для GSAP scroll-reveal
   Каждый класс — это «состояние ДО анимации».
   GSAP в animations.js поднимает их в нормальное положение.
   ============================================================ */

/* Reveal-классы скрывают элемент ТОЛЬКО когда .has-js && !.anim-fallback && !.anim-done.
   Если JS/GSAP не отработали — fallback покажет всё через safety timeout.
   После успешного hero-таймлайна — .anim-done снимает initial-state ДАЖЕ если в JS
   что-то упадёт на следующем шаге. */
.has-js:not(.anim-fallback):not(.anim-done) .reveal {
  opacity: 0;
  transform: translateY(40px);
  will-change: opacity, transform;
}

.has-js:not(.anim-fallback):not(.anim-done) .reveal-from-left {
  opacity: 0;
  transform: translateX(-40px);
}

.has-js:not(.anim-fallback):not(.anim-done) .reveal-from-right {
  opacity: 0;
  transform: translateX(40px);
}

.has-js:not(.anim-fallback):not(.anim-done) .reveal-scale {
  opacity: 0;
  transform: scale(0.92);
}

/* Заголовки построчно: каждый .split-line — отдельная строка */
.split-line {
  display: block;
  overflow: hidden;
  /* Запас сверху: диакритика заглавной «Ё» выступает над cap-height и
     обрезалась верхней границей overflow:hidden при line-height < 1.
     padding поднимает границу обрезки, отрицательный margin компенсирует
     смещение — межстрочный ритм не меняется. Анимация приходит снизу,
     поэтому запас сверху её не раскрывает. */
  padding-top: 0.16em;
  margin-top: -0.16em;
}

.has-js:not(.anim-fallback):not(.anim-done) .split-line > span {
  display: inline-block;
  opacity: 0;
  will-change: transform, opacity;
}

/* «Готов к анимации, но reduced-motion» — мгновенно показываем */
@media (prefers-reduced-motion: reduce) {
  .reveal,
  .reveal-from-left,
  .reveal-from-right,
  .reveal-scale,
  .cases-archive__eyebrow,
  .cases-archive__title,
  .cases-archive__lead,
  .cases-archive__hero .btn {
    opacity: 1;
    transform: none;
  }
  .split-line > span { transform: none; }
}

/* Cases Archive — initial states (скрываем до JS-анимации) */
.has-js:not(.anim-fallback) .cases-archive__eyebrow,
.has-js:not(.anim-fallback) .cases-archive__title,
.has-js:not(.anim-fallback) .cases-archive__lead,
.has-js:not(.anim-fallback) .cases-archive__hero .btn {
  opacity: 0;
  transform: translateY(28px);
  will-change: opacity, transform;
}

/* Glow на focus инпутов (для form animation) */
.field--focused .field__input,
.field--focused .field__textarea {
  border-color: var(--accent);
}

/* Theme transition wipe (опционально, добавляется в JS) */
.theme-wipe {
  position: fixed;
  inset: 0;
  background: var(--accent);
  z-index: var(--z-toast);
  transform-origin: top;
  pointer-events: none;
}
