/* ==========================================================================
   animations.css — all motion in one file. Everything switches off for visitors
   who ask their OS for reduced motion.
   ========================================================================== */

.blink { animation: blink 1.1s steps(1) infinite; }
@keyframes blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }

/* each panel slides in when its file opens */
.panel.is-entering { animation: panel-in .35s var(--ease) both; }
@keyframes panel-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* cards cascade in */
.panel.is-entering .project,
.panel.is-entering .service,
.panel.is-entering .commit { animation: panel-in .45s var(--ease) both; animation-delay: calc(var(--i, 0) * 60ms + 80ms); }

/* window opens once on load */
.window { animation: window-in .6s var(--ease) both; }
@keyframes window-in { from { opacity: 0; transform: translateY(14px) scale(.985); } to { opacity: 1; transform: none; } }

/* green "available" pulse */
.status-dot { animation: pulse 2s ease-out infinite; }
@keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(52, 211, 120, .7); } 70%, 100% { box-shadow: 0 0 0 6px rgba(52, 211, 120, 0); } }
.status-dot--busy { animation: none; }

/* typed terminal lines */
.terminal__log > .is-new { animation: line-in .25s ease both; }
@keyframes line-in { from { opacity: 0; transform: translateX(-4px); } to { opacity: 1; transform: none; } }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}
