/* =========================================================
   DARK CODE — Animations
   ========================================================= */

@keyframes float-y{
  0%,100%{transform:translateY(0);}
  50%{transform:translateY(-10px);}
}
@keyframes pulse-run{
  0%,100%{box-shadow:0 0 0 4px var(--signal-glow-soft), 0 8px 20px -6px rgba(57,255,138,.6);}
  50%{box-shadow:0 0 0 9px rgba(57,255,138,.06), 0 8px 24px -4px rgba(57,255,138,.75);}
}
@keyframes blink{
  0%,49%{opacity:1;}
  50%,100%{opacity:0;}
}
@keyframes fade-up{
  from{opacity:0;transform:translateY(22px);}
  to{opacity:1;transform:translateY(0);}
}
@keyframes glow-drift{
  0%,100%{transform:translate(0,0);}
  50%{transform:translate(-16px,12px);}
}
@keyframes count-tick{
  from{opacity:0;transform:translateY(6px);}
  to{opacity:1;transform:translateY(0);}
}

/* scroll reveal — toggled by IntersectionObserver in script.js */
.reveal{
  opacity:0;
  transform:translateY(24px);
  transition:opacity .7s cubic-bezier(.2,.7,.2,1), transform .7s cubic-bezier(.2,.7,.2,1);
}
.reveal.in-view{
  opacity:1;
  transform:translateY(0);
}
.reveal-stagger.in-view > *{
  animation:fade-up .6s cubic-bezier(.2,.7,.2,1) both;
}
.reveal-stagger.in-view > *:nth-child(1){animation-delay:.02s;}
.reveal-stagger.in-view > *:nth-child(2){animation-delay:.08s;}
.reveal-stagger.in-view > *:nth-child(3){animation-delay:.14s;}
.reveal-stagger.in-view > *:nth-child(4){animation-delay:.20s;}
.reveal-stagger.in-view > *:nth-child(5){animation-delay:.26s;}
.reveal-stagger.in-view > *:nth-child(6){animation-delay:.32s;}
.reveal-stagger.in-view > *:nth-child(7){animation-delay:.38s;}
.reveal-stagger.in-view > *:nth-child(8){animation-delay:.44s;}
.reveal-stagger.in-view > *:nth-child(9){animation-delay:.50s;}

@media (prefers-reduced-motion: reduce){
  .reveal, .reveal-stagger > *{opacity:1 !important;transform:none !important;animation:none !important;}
  .editor-card, .fic, .editor-run{animation:none !important;}
}
