@keyframes rise-in {
  from {
    opacity: 0;
    transform: translateY(28px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes drift {
  0%,
  100% {
    transform: translate3d(0, 0, 0) scale(1);
  }
  50% {
    transform: translate3d(2%, -3%, 0) scale(1.04);
  }
}

@keyframes sweep {
  from {
    transform: scaleX(0);
  }
  to {
    transform: scaleX(1);
  }
}

@keyframes pulse-line {
  0%,
  100% {
    opacity: 0.35;
  }
  50% {
    opacity: 1;
  }
}

/* Opacity + translate only — never animate font-size or brand scale */
.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 0.85s var(--ease-spring),
    transform 0.85s var(--ease-spring);
  transition-delay: calc(var(--stagger, 0) * 70ms);
  will-change: opacity, transform;
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

.reveal-stagger > .reveal:nth-child(1) { --stagger: 0; }
.reveal-stagger > .reveal:nth-child(2) { --stagger: 1; }
.reveal-stagger > .reveal:nth-child(3) { --stagger: 2; }
.reveal-stagger > .reveal:nth-child(4) { --stagger: 3; }
.reveal-stagger > .reveal:nth-child(5) { --stagger: 4; }
.reveal-stagger > .reveal:nth-child(6) { --stagger: 5; }

/* Brand paints immediately — no entrance animation (avoids perceived size flicker) */
.hero__title,
.hero__lead,
.hero__actions {
  animation: rise-in 0.95s var(--ease-spring) both;
}

.hero__title {
  animation-delay: 0.08s;
}

.hero__lead {
  animation-delay: 0.16s;
}

.hero__actions {
  animation-delay: 0.24s;
}

.section.is-pinning {
  opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
  .reveal,
  .reveal.is-visible {
    opacity: 1;
    transform: none;
    transition: none;
  }

  .hero__title,
  .hero__lead,
  .hero__actions,
  .hero__rule {
    animation: none;
  }

  .hero__plane {
    animation: none !important;
  }
}
