/* ══ KEYFRAMES ══════════════════════════════════════════════ */

/* Letters crystallize out of blur */
@keyframes letterCrystallize {
  0%   { opacity:0; filter:blur(10px); transform:translateY(20px) scale(0.94); }
  60%  { opacity:1; filter:blur(1px);  transform:translateY(-2px)  scale(1.01); }
  100% { opacity:1; filter:blur(0);    transform:translateY(0)     scale(1); }
}

/* Section reveals — phase in from soft void */
@keyframes phaseIn {
  0%   { opacity:0; filter:blur(6px);  transform:translateY(20px) scale(0.97); }
  100% { opacity:1; filter:blur(0);    transform:translateY(0)    scale(1); }
}

/* Slow, alien orbital drift for background orbs */
@keyframes specterDrift {
  0%   { transform:translate(0,0)      scale(1);    }
  20%  { transform:translate(60px,-40px) scale(1.08); }
  45%  { transform:translate(-40px,30px) scale(0.92); }
  70%  { transform:translate(20px,50px)  scale(1.04); }
  100% { transform:translate(0,0)      scale(1);    }
}

/* Background ambient pulse */
@keyframes ambientBreath {
  0%,100% { opacity:0.45; filter:blur(90px);  }
  50%      { opacity:0.7;  filter:blur(70px);  }
}

/* Glowing pulse for accents */
@keyframes glowBreath {
  0%,100% { box-shadow:0 0 15px var(--accent-glow); opacity:0.8; }
  50%      { box-shadow:0 0 35px var(--accent-glow), 0 0 60px rgba(196,181,253,0.08); opacity:1; }
}

/* Tag gentle levitate */
@keyframes tagLevitate {
  0%,100% { transform:translateY(0);    }
  50%      { transform:translateY(-3px); }
}

/* Terminal cursor blink */
@keyframes termBlink {
  0%,49% { opacity:1; }
  50%,100% { opacity:0; }
}

/* Scroll indicator */
@keyframes scrollLine {
  0%     { transform:scaleY(0);   transform-origin:top; }
  45%    { transform:scaleY(1);   transform-origin:top; }
  55%    { transform:scaleY(1);   transform-origin:bottom; }
  100%   { transform:scaleY(0);   transform-origin:bottom; }
}

/* Iridescent border sweep */
@keyframes shimmerBorder {
  0%   { background-position:0%   50%; }
  50%  { background-position:100% 50%; }
  100% { background-position:0%   50%; }
}

/* Timeline dot pulse */
@keyframes dotPulse {
  0%,100% { box-shadow:0 0 0 0 var(--accent-dim); }
  50%      { box-shadow:0 0 0 8px transparent; }
}

/* Ring rotate (about section orbs) */
@keyframes ringRotate { from { transform:rotate(0deg); } to { transform:rotate(360deg); } }

/* Contact orb breathe */
@keyframes contactBreath {
  0%,100% { transform:scale(1);   opacity:0.35; }
  50%      { transform:scale(1.2); opacity:0.6; }
}

/* Nav slide in */
@keyframes navIn { from { opacity:0; transform:translateY(-14px); } to { opacity:1; transform:translateY(0); } }

/* Fade simple */
@keyframes fadeIn { from { opacity:0; } to { opacity:1; } }

/* Noise overlay */
@keyframes noiseIn { from { opacity:0; } to { opacity:0.025; } }

/* Tag pop stagger */
@keyframes tagPop {
  from { opacity:0; transform:scale(0.88) translateY(8px); }
  to   { opacity:1; transform:scale(1) translateY(0); }
}

/* ── Bot somersault — forward flip with jump arc ── */
@keyframes botSomersault {
  0%    { transform: translateY(0px)   scaleY(1.00) rotate(0deg);   }
  7%    { transform: translateY(-8px)  scaleY(0.80) rotate(0deg);   } /* crouch */
  25%   { transform: translateY(-58px) scaleY(1.04) rotate(160deg); } /* airborne */
  46%   { transform: translateY(-62px) scaleY(1.00) rotate(270deg); } /* peak */
  66%   { transform: translateY(-22px) scaleY(1.02) rotate(345deg); } /* descending */
  76%   { transform: translateY(0px)   scaleY(0.76) rotate(360deg); } /* landing squish */
  86%   { transform: translateY(-9px)  scaleY(1.14) rotate(360deg); } /* bounce */
  95%   { transform: translateY(0px)   scaleY(1.00) rotate(360deg); } /* settle */
  100%  { transform: translateY(0px)   scaleY(1.00) rotate(360deg); } /* hold */
}

/* Infinity loop animation is JS-driven (initInfinityLoop in app.js) */

/* ── Loader fade out ── */
@keyframes loaderOut {
  0%   { opacity: 1; }
  100% { opacity: 0; }
}

/* ══ UTILITY CLASSES ══════════════════════════════════════════ */

/* Scroll-reveal: phases in from void */
.reveal-up {
  opacity: 0;
  transform: translateY(20px) scale(0.97);
  filter: blur(5px);
  transition:
    opacity   0.9s var(--ease-alien),
    transform 0.9s var(--ease-alien),
    filter    0.9s var(--ease-alien);
  transition-delay: var(--delay, 0s);
}
.reveal-up.revealed {
  opacity: 1;
  transform: translateY(0) scale(1);
  filter: blur(0);
}

/* Hero letter crystallize */
.hero-letter       { display:inline-block; overflow:hidden; vertical-align:bottom; }
.hero-letter-inner {
  display: inline-block;
  animation: letterCrystallize 1.1s var(--ease-alien) both;
  animation-delay: var(--letter-delay, 0s);
}
