/* ==========================================================================
   animations.css — keyframes and the scroll-reveal contract.

   Reveal contract: markup carries `data-reveal="<name>"`. JS adds
   `.is-revealed` when the element enters the viewport. Everything else —
   the from-state, the transition, the stagger — is declared here.
   ========================================================================== */

@keyframes drift-up {
  from { transform: translate3d(0, 14px, 0); }
  to   { transform: translate3d(0, -14px, 0); }
}

@keyframes pulse-ring {
  0%   { transform: scale(1);   opacity: 0.55; }
  70%  { transform: scale(2.1); opacity: 0; }
  100% { transform: scale(2.1); opacity: 0; }
}

@keyframes slide-x {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}

@keyframes aurora-shift {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  33%      { transform: translate3d(6%, -5%, 0) scale(1.14); }
  66%      { transform: translate3d(-5%, 4%, 0) scale(0.94); }
}

@keyframes sweep-in {
  from { clip-path: inset(0 100% 0 0); }
  to   { clip-path: inset(0 0 0 0); }
}

@keyframes blink-caret {
  0%, 45%   { opacity: 1; }
  55%, 100% { opacity: 0; }
}

/* --- Reveal from-states -------------------------------------------------- */

[data-reveal] {
  --reveal-delay: 0ms;
  transition:
    opacity var(--d-slow) var(--e-out) var(--reveal-delay),
    transform var(--d-slow) var(--e-out) var(--reveal-delay),
    clip-path var(--d-slow) var(--e-out) var(--reveal-delay),
    filter var(--d-slow) var(--e-out) var(--reveal-delay);
  will-change: opacity, transform;
}

[data-reveal="up"]    { opacity: 0; transform: translate3d(0, 32px, 0); }
[data-reveal="fade"]  { opacity: 0; }
[data-reveal="right"] { opacity: 0; transform: translate3d(-28px, 0, 0); }
[data-reveal="left"]  { opacity: 0; transform: translate3d(28px, 0, 0); }
[data-reveal="scale"] { opacity: 0; transform: scale(0.92); }
[data-reveal="blur"]  { opacity: 0; filter: blur(14px); transform: translate3d(0, 18px, 0); }

/* Headline lines wipe up behind a mask — the page-load signature move. */
[data-reveal="mask"] {
  opacity: 0;
  clip-path: inset(0 0 110% 0);
  transform: translate3d(0, 0.3em, 0);
}

[data-reveal].is-revealed {
  opacity: 1;
  transform: none;
  filter: none;
  clip-path: inset(0 0 -20% 0);
}

/* --- Reduced motion ------------------------------------------------------
   Everything still arrives; it just arrives instantly and stays still. */

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

  *,
  *::before,
  *::after {
    animation-duration: 1ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 1ms !important;
    scroll-behavior: auto !important;
  }

  [data-reveal] {
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
    clip-path: none !important;
  }
}
