.js .site-header {
  opacity: 0;
  animation: nav-fade-in 500ms ease-out forwards;
  animation-delay: 80ms;
}

.js .hero-headline,
.js .hero-subtext,
.js .hero-cta {
  opacity: 0;
  transform: translateY(18px);
  animation: hero-reveal 800ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

.js .hero-headline {
  animation-delay: 200ms;
}

.js .hero-subtext {
  animation-delay: 400ms;
}

.js .hero-cta {
  animation-delay: 560ms;
}

/* ── Scroll reveal with stagger ── */

.js .reveal {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 700ms cubic-bezier(0.16, 1, 0.3, 1),
    transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
  will-change: opacity, transform;
}

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

/* Staggered children — service cards, stat cards */
.js .reveal .service-card,
.js .reveal .stat-card {
  opacity: 0;
  transform: translateY(24px) scale(0.97);
  transition: opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),
    transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
}

.js .reveal.reveal-visible .service-card,
.js .reveal.reveal-visible .stat-card {
  opacity: 1;
  transform: translateY(0) scale(1);
}

.js .reveal.reveal-visible .service-card:nth-child(1),
.js .reveal.reveal-visible .stat-card:nth-child(1) {
  transition-delay: 0ms;
}

.js .reveal.reveal-visible .service-card:nth-child(2),
.js .reveal.reveal-visible .stat-card:nth-child(2) {
  transition-delay: 100ms;
}

.js .reveal.reveal-visible .service-card:nth-child(3),
.js .reveal.reveal-visible .stat-card:nth-child(3) {
  transition-delay: 200ms;
}

.js .reveal.reveal-visible .service-card:nth-child(4),
.js .reveal.reveal-visible .stat-card:nth-child(4) {
  transition-delay: 300ms;
}

/* ── Keyframes ── */

@keyframes hero-reveal {
  from {
    opacity: 0;
    transform: translateY(18px);
  }

  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes nav-fade-in {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

/* ── Card glow on hover ── */

.service-card,
.stat-card {
  transition: transform 350ms cubic-bezier(0.4, 0, 0.2, 1),
    border-color 350ms ease,
    box-shadow 350ms ease;
}

/* ── Reduced motion ── */

@media (prefers-reduced-motion: reduce) {

  .js .site-header,
  .js .hero-headline,
  .js .hero-subtext,
  .js .hero-cta {
    animation: none;
    opacity: 1;
    transform: none;
  }

  .js .reveal,
  .js .reveal.reveal-visible {
    opacity: 1;
    transform: none;
    transition: none;
    will-change: auto;
  }

  .js .reveal .service-card,
  .js .reveal .stat-card,
  .js .reveal.reveal-visible .service-card,
  .js .reveal.reveal-visible .stat-card {
    opacity: 1;
    transform: none;
    transition: none;
  }

  .submit-button::before {
    animation: none;
  }
}