/* ==========================================================================
   ANIMATIONS
   Kept deliberately restrained: scan-line + pulse motifs echo the CCTV/
   surveillance subject; everything else is a simple scroll reveal.
   ========================================================================== */

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

@keyframes blipPulse{
  0%, 100%{ transform:scale(1); opacity:1; }
  50%{ transform:scale(1.4); opacity:.5; }
}

@keyframes pulseRing{
  0%{ box-shadow:0 0 0 0 rgba(51,209,122,.55); }
  70%{ box-shadow:0 0 0 10px rgba(51,209,122,0); }
  100%{ box-shadow:0 0 0 0 rgba(51,209,122,0); }
}

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

/* Scroll-reveal: elements start hidden, JS toggles .in-view */
.reveal{
  opacity:0;
  transform:translateY(24px);
  transition:opacity .7s ease, transform .7s ease;
}
.reveal.in-view{
  opacity:1;
  transform:translateY(0);
}
.reveal-delay-1{ transition-delay:.1s; }
.reveal-delay-2{ transition-delay:.2s; }
.reveal-delay-3{ transition-delay:.3s; }
.reveal-delay-4{ transition-delay:.4s; }

/* Hero entrance (runs on load, not scroll) */
.hero-anim{
  animation:fadeUp .8s ease both;
}
.hero-anim.d1{ animation-delay:.1s; }
.hero-anim.d2{ animation-delay:.25s; }
.hero-anim.d3{ animation-delay:.4s; }

@media (prefers-reduced-motion: reduce){
  *, *::before, *::after{
    animation-duration:0.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:0.001ms !important;
    scroll-behavior:auto !important;
  }
}
