@keyframes cursorBlink {
  0%, 45% { opacity: 1; }
  46%, 100% { opacity: .1; }
}
@keyframes scan {
  0% { transform: translateY(0); opacity: 0; }
  8% { opacity: .75; }
  80% { opacity: .5; }
  100% { transform: translateY(470px); opacity: 0; }
}
@keyframes drift {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  50% { transform: translateY(-8px) rotate(1deg); }
}
@keyframes orbitSpin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

.cursor { animation: cursorBlink .95s steps(1) infinite; }
.robot-frame__scan { animation: scan 5.4s linear infinite; }
.robot { animation: drift 6.5s ease-in-out infinite; }
.orbit i { animation: orbitSpin 4s linear infinite; transform-origin: 60px 20px; }

.reveal { opacity: 0; transform: translateY(18px); transition: opacity .55s ease, transform .55s cubic-bezier(.2,.7,.2,1); }
.reveal.is-visible { opacity: 1; transform: translateY(0); }
.stack-card, .service-card, .lab-card, .project-card, .interest-marquee span { transition: transform .22s ease, border-color .22s ease, background .22s ease, color .22s ease; }
.lab-card:hover, .project-card:hover { transform: translateY(-4px); border-color: #5a5d58; }
.interest-marquee span:hover { transform: translateY(-3px); background: #242624; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
  .reveal { opacity: 1 !important; transform: none !important; }
  .hero__visual { transform: none !important; }
}
