/* ==========================================================================
   Animations — hero entrance, pulses, marquee, gradient motion
   ========================================================================== */

@keyframes fadeUp {
  from { opacity: 0; transform: translateY(22px); }
  to { opacity: 1; transform: translateY(0); }
}

.fade-up { animation: fadeUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) both; }
.fade-up-1 { animation-delay: 0.05s; }
.fade-up-2 { animation-delay: 0.15s; }
.fade-up-3 { animation-delay: 0.25s; }
.fade-up-4 { animation-delay: 0.35s; }
.fade-up-5 { animation-delay: 0.45s; }

@keyframes pulseDot {
  0% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.55); }
  70% { box-shadow: 0 0 0 8px rgba(34, 197, 94, 0); }
  100% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); }
}

@keyframes floatSlow {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
}

.float { animation: floatSlow 5s ease-in-out infinite; }

@keyframes spin-slow {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

.spin-slow { animation: spin-slow 14s linear infinite; }

@keyframes dash {
  to { stroke-dashoffset: 0; }
}

.flow-line {
  stroke-dasharray: 6;
  stroke-dashoffset: 60;
  animation: dash 2.5s linear infinite;
}

@media (prefers-reduced-motion: reduce) {
  .fade-up, .float, .spin-slow, .flow-line { animation: none !important; }
}

/* ---------- Staggered "lazy" card reveal ---------- */
.reveal.in-view > * { animation: fadeUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) both; }
.reveal.in-view > *:nth-child(1) { animation-delay: 0ms; }
.reveal.in-view > *:nth-child(2) { animation-delay: 70ms; }
.reveal.in-view > *:nth-child(3) { animation-delay: 140ms; }
.reveal.in-view > *:nth-child(4) { animation-delay: 210ms; }
.reveal.in-view > *:nth-child(5) { animation-delay: 280ms; }
.reveal.in-view > *:nth-child(6) { animation-delay: 350ms; }
.reveal.in-view > *:nth-child(7) { animation-delay: 420ms; }
.reveal.in-view > *:nth-child(8) { animation-delay: 490ms; }
.reveal.in-view > *:nth-child(9) { animation-delay: 560ms; }
.reveal.in-view > *:nth-child(10) { animation-delay: 630ms; }
.reveal.in-view > *:nth-child(11) { animation-delay: 700ms; }

@media (prefers-reduced-motion: reduce) {
  .reveal.in-view > * { animation: none !important; }
}

/* Long-form article text reads better fading in as one block, not paragraph-by-paragraph */
.prose.reveal.in-view > * { animation: none; }
