/* ============================================================
   ANIMATIONS
   Scroll-triggered fade/slide via IntersectionObserver
   ============================================================ */

[data-animate] {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.65s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.65s cubic-bezier(0.22, 1, 0.36, 1);
}

[data-animate].is-visible {
  opacity: 1;
  transform: none;
}

[data-animate-delay="1"] { transition-delay: 0.08s; }
[data-animate-delay="2"] { transition-delay: 0.16s; }
[data-animate-delay="3"] { transition-delay: 0.24s; }
[data-animate-delay="4"] { transition-delay: 0.32s; }

/* Portfolio grid items — faster reveal */
.portfolio-item[data-animate] {
  transition-duration: 0.45s;
}

/* Lightbox enter */
@keyframes lb-in {
  from { opacity: 0; transform: scale(0.96); }
  to   { opacity: 1; transform: scale(1); }
}

.lightbox-content {
  animation: lb-in 0.25s cubic-bezier(0.22, 1, 0.36, 1);
}

/* Hamburger lines */
@keyframes nav-open-top    { to { transform: translateY(8px) rotate(45deg); } }
@keyframes nav-open-mid    { to { opacity: 0; transform: scaleX(0); } }
@keyframes nav-open-bottom { to { transform: translateY(-8px) rotate(-45deg); } }

/* Counter count-up pulse */
@keyframes count-done {
  0%   { transform: scale(1); }
  50%  { transform: scale(1.12); }
  100% { transform: scale(1); }
}

.stat-number.done {
  animation: count-done 0.3s ease;
}
