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

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

/* Loader glitch: text jitter + RGB channel split */
@keyframes glitchShake{
  0%{transform:translate(0,0);}
  20%{transform:translate(-2px,1px);text-shadow:2px 0 var(--accent-2), -2px 0 var(--accent);}
  40%{transform:translate(2px,-1px);text-shadow:-2px 0 var(--accent-2), 2px 0 var(--accent);}
  60%{transform:translate(-1px,0);text-shadow:1px 0 var(--accent-2), -1px 0 var(--accent);}
  80%{transform:translate(1px,1px);text-shadow:none;}
  100%{transform:translate(0,0);text-shadow:none;}
}
@keyframes glitchFlash{
  0%{opacity:0;}
  8%{opacity:.85;}
  14%{opacity:0;}
  22%{opacity:.5;}
  30%{opacity:0;}
  100%{opacity:0;}
}

/* Hero content fade-up once loader clears */
@keyframes heroIn{
  from{opacity:0;transform:translateY(18px);}
  to{opacity:1;transform:translateY(0);}
}
.hero .orbit-stage,.hero-name,.hero-tagline,.hero-ctas,.hero-status{
  animation:heroIn .8s var(--ease) both;
}
.hero-name{animation-delay:.08s;}
.hero-tagline{animation-delay:.16s;}
.hero-ctas{animation-delay:.24s;}
.hero-status{animation-delay:.32s;}

/* Scroll reveal, toggled via IntersectionObserver in animations.js */
.reveal{opacity:0;transform:translateY(24px);transition:opacity .6s var(--ease), transform .6s var(--ease);}
.reveal.in-view{opacity:1;transform:translateY(0);}

/* Stagger children marked with .reveal-child inside a .reveal-group */
.reveal-group .reveal-child{opacity:0;transform:translateY(18px);transition:opacity .5s var(--ease), transform .5s var(--ease);}
.reveal-group.in-view .reveal-child{opacity:1;transform:translateY(0);}
.reveal-group.in-view .reveal-child:nth-child(1){transition-delay:.02s;}
.reveal-group.in-view .reveal-child:nth-child(2){transition-delay:.08s;}
.reveal-group.in-view .reveal-child:nth-child(3){transition-delay:.14s;}
.reveal-group.in-view .reveal-child:nth-child(4){transition-delay:.20s;}
.reveal-group.in-view .reveal-child:nth-child(5){transition-delay:.26s;}
.reveal-group.in-view .reveal-child:nth-child(6){transition-delay:.32s;}
.reveal-group.in-view .reveal-child:nth-child(n+7){transition-delay:.36s;}

/* Modal card entrance (used when re-rendering filtered project grid) */
.card-in{animation:cardIn .4s var(--ease) both;}
@keyframes cardIn{
  from{opacity:0;transform:translateY(14px) scale(.98);}
  to{opacity:1;transform:translateY(0) scale(1);}
}
