/* ==========================================================================
   ANIMATIONS — scroll reveal, entrance, transitions
   ========================================================================== */

/* One orchestrated page-load entrance on hero only */
.page-loader {
  position: fixed;
  inset: 0;
  z-index: 10001;
  display: grid;
  place-items: center;
  background: var(--bg);
  animation: loader-failsafe 8s 1 forwards;
  transition: opacity .35s var(--ease), visibility .35s;
}
.page-loader.is-hidden {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  animation: none;
}
.page-loader-content {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
  color: var(--text-muted);
  font-family: var(--font-mono);
  font-size: .78rem;
  letter-spacing: .04em;
}
.page-loader-content img { width: 3.5rem; height: 3.5rem; object-fit: contain; }
.page-loader-spinner {
  width: 1.5rem;
  height: 1.5rem;
  border: 2px solid var(--border-strong);
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: loader-spin .8s linear infinite;
}
@keyframes loader-spin { to { transform: rotate(360deg); } }
@keyframes loader-failsafe {
  0%, 95% { opacity: 1; visibility: visible; }
  100% { opacity: 0; visibility: hidden; pointer-events: none; }
}
@media (prefers-reduced-motion: reduce) {
  .page-loader-spinner { animation-duration: 1.6s; }
}

.hero-status-pill,
.hero-greeting,
.hero-name,
.hero-role,
.hero-desc,
.hero-actions,
.hero-social,
.hero-status,
.hero-visual-wrap {
  opacity: 0;
  transform: translateY(20px);
}
body.loaded .hero-status-pill { animation: fade-up 0.6s var(--ease) 0.05s forwards; }
body.loaded .hero-greeting    { animation: fade-up 0.6s var(--ease) 0.1s forwards; }
body.loaded .hero-name        { animation: fade-up 0.6s var(--ease) 0.2s forwards; }
body.loaded .hero-role        { animation: fade-up 0.6s var(--ease) 0.3s forwards; }
body.loaded .hero-desc        { animation: fade-up 0.6s var(--ease) 0.4s forwards; }
body.loaded .hero-actions     { animation: fade-up 0.6s var(--ease) 0.5s forwards; }
body.loaded .hero-social      { animation: fade-up 0.6s var(--ease) 0.55s forwards; }
body.loaded .hero-status      { animation: fade-up 0.6s var(--ease) 0.6s forwards; }
body.loaded .hero-visual-wrap { animation: fade-up 0.8s var(--ease) 0.25s forwards; }

@keyframes fade-up {
  to { opacity: 1; transform: translateY(0); }
}

/* Scroll-reveal: elements start invisible, JS adds .revealed */
.reveal {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.55s var(--ease), transform 0.55s var(--ease);
}
.reveal.revealed {
  opacity: 1;
  transform: translateY(0);
}

/* Stagger siblings inside a container */
.reveal-stagger > * {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.5s var(--ease), transform 0.5s var(--ease);
}
.reveal-stagger.revealed > *:nth-child(1) { transition-delay: 0.05s; opacity: 1; transform: none; }
.reveal-stagger.revealed > *:nth-child(2) { transition-delay: 0.12s; opacity: 1; transform: none; }
.reveal-stagger.revealed > *:nth-child(3) { transition-delay: 0.19s; opacity: 1; transform: none; }
.reveal-stagger.revealed > *:nth-child(4) { transition-delay: 0.26s; opacity: 1; transform: none; }
.reveal-stagger.revealed > *:nth-child(5) { transition-delay: 0.33s; opacity: 1; transform: none; }
.reveal-stagger.revealed > *:nth-child(6) { transition-delay: 0.40s; opacity: 1; transform: none; }
.reveal-stagger.revealed > *:nth-child(n+7) { transition-delay: 0.45s; opacity: 1; transform: none; }

/* Project page image fade */
@keyframes img-fade {
  from { opacity: 0; filter: blur(6px); }
  to   { opacity: 1; filter: blur(0); }
}
.img-loaded { animation: img-fade 0.4s ease forwards; }

/* Lightbox open/close */
@keyframes lb-in  { from { opacity: 0; transform: scale(0.92); } to { opacity: 1; transform: scale(1); } }
@keyframes lb-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.92); } }
.lb-img-wrap.opening { animation: lb-in  0.28s var(--ease) forwards; }
.lb-img-wrap.closing { animation: lb-out 0.22s ease    forwards; }
