/* ==========================================================================
   Animations — scroll reveal, hero motion, micro-interactions
   All respect prefers-reduced-motion (see base.css global override too)
   ========================================================================== */

/* Scroll-reveal: elements start hidden, JS adds .is-visible via IntersectionObserver */
[data-reveal] {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity var(--dur-slower) var(--ease-out),
              transform var(--dur-slower) var(--ease-out);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}

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

[data-reveal="scale"] { transform: translateY(16px) scale(0.96); }
[data-reveal="scale"].is-visible { transform: translateY(0) scale(1); }

[data-reveal="left"] { transform: translateX(-32px); }
[data-reveal="left"].is-visible { transform: translateX(0); }

[data-reveal="right"] { transform: translateX(32px); }
[data-reveal="right"].is-visible { transform: translateX(0); }

@media (prefers-reduced-motion: reduce) {
  [data-reveal] {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}

/* Stagger helper (JS sets --reveal-delay inline per child) */

/* Floating orb / particle drift in hero */
@keyframes drift {
  0%, 100% { transform: translate(0, 0) scale(1); }
  50% { transform: translate(-16px, 18px) scale(1.05); }
}

.hero-glow {
  animation: drift 12s var(--ease-in-out) infinite;
}

@media (prefers-reduced-motion: reduce) {
  .hero-glow { animation: none; }
}

/* Node network canvas fade-in */
.hero-nodes {
  position: absolute;
  inset: 0;
  z-index: -1;
  opacity: 0;
  transition: opacity 1.2s var(--ease-out);
}
.hero-nodes.is-ready { opacity: 1; }

/* Count-up number ticker target (JS updates textContent) */
[data-count] { font-variant-numeric: tabular-nums; }

/* Marquee-style trust strip (optional subtle motion) */
@keyframes pulse-ring {
  0% { box-shadow: 0 0 0 0 rgba(44, 123, 229, 0.4); }
  100% { box-shadow: 0 0 0 12px rgba(44, 123, 229, 0); }
}

.hero-badge-dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--color-primary-400);
  display: inline-block;
  animation: pulse-ring 2.2s var(--ease-out) infinite;
}
@media (prefers-reduced-motion: reduce) {
  .hero-badge-dot { animation: none; }
}

/* Page load fade */
@keyframes page-in {
  from { opacity: 0; }
  to { opacity: 1; }
}
body { animation: page-in 0.4s var(--ease-out); }
@media (prefers-reduced-motion: reduce) {
  body { animation: none; }
}

/* Mobile nav overlay fade for links (staggered via JS delay var) */
.main-nav .nav-links a {
  opacity: 0;
  transform: translateY(8px);
}
.main-nav.is-open .nav-links a {
  opacity: 1;
  transform: translateY(0);
  transition: opacity var(--dur-slow) var(--ease-out) var(--link-delay, 0ms),
              transform var(--dur-slow) var(--ease-out) var(--link-delay, 0ms);
}
@media (min-width: 1025px) {
  .main-nav .nav-links a { opacity: 1; transform: none; }
}
