/* ==========================================================================
   Animations — Keyframes, entrance classes, GSAP helpers
   ========================================================================== */

/* ── Keyframes ───────────────────────────────────────────────────────────── */
@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(24px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes fadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@keyframes scaleIn {
  from { opacity: 0; transform: scale(0.95); }
  to   { opacity: 1; transform: scale(1); }
}

@keyframes slideInRight {
  from { opacity: 0; transform: translateX(24px); }
  to   { opacity: 1; transform: translateX(0); }
}

@keyframes blink {
  0%, 100% { border-color: var(--color-accent); }
  50%       { border-color: transparent; }
}

@keyframes counterPulse {
  0%   { transform: scale(1); }
  50%  { transform: scale(1.04); }
  100% { transform: scale(1); }
}

/* ── Cursor blink for typewriter ─────────────────────────────────────────── */
.hero-typewriter.is-typing {
  animation: blink 0.8s step-end infinite;
}

/* ── GSAP initial states (set before JS runs) ────────────────────────────── */
/* Note: opacity:0 is applied via inline style by JS, not here,
   so elements are never permanently hidden if JS fails to load. */

.js-fade-in.is-visible {
  animation: fadeInUp 0.6s ease forwards;
}

.js-scale-in.is-visible {
  animation: scaleIn 0.5s ease forwards;
}

/* ── Loading skeleton ────────────────────────────────────────────────────── */
@keyframes shimmer {
  0%   { background-position: -200% 0; }
  100% { background-position: 200% 0; }
}

.skeleton {
  background: linear-gradient(
    90deg,
    var(--color-surface) 25%,
    var(--color-surface-2) 50%,
    var(--color-surface) 75%
  );
  background-size: 200% 100%;
  animation: shimmer 1.5s infinite;
  border-radius: var(--radius-md);
}

/* ── Page transition ─────────────────────────────────────────────────────── */
.site-main {
  animation: fadeIn 0.3s ease;
}
