/**
 * animations.css — Scroll-triggered animations and keyframes
 * 
 * Uses CSS classes toggled by IntersectionObserver in app.js.
 * All animations leverage transform & opacity for GPU acceleration.
 */

/* ======================================================
   Scroll-Triggered Reveal Animations
   Elements start hidden and animate in when they enter the viewport.
   ====================================================== */

/* Base state: hidden, shifted down slightly */
.reveal {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.6s var(--transition-fn),
              transform 0.6s var(--transition-fn);
}

/* Active state: visible and in position */
.reveal.active {
  opacity: 1;
  transform: translateY(0);
}

/* Variant: slide in from left */
.reveal--left {
  opacity: 0;
  transform: translateX(-40px);
  transition: opacity 0.6s var(--transition-fn),
              transform 0.6s var(--transition-fn);
}

.reveal--left.active {
  opacity: 1;
  transform: translateX(0);
}

/* Variant: slide in from right */
.reveal--right {
  opacity: 0;
  transform: translateX(40px);
  transition: opacity 0.6s var(--transition-fn),
              transform 0.6s var(--transition-fn);
}

.reveal--right.active {
  opacity: 1;
  transform: translateX(0);
}

/* Variant: scale up from center */
.reveal--scale {
  opacity: 0;
  transform: scale(0.9);
  transition: opacity 0.6s var(--transition-fn),
              transform 0.6s var(--transition-fn);
}

.reveal--scale.active {
  opacity: 1;
  transform: scale(1);
}

/* ======================================================
   Staggered Delay Utilities
   Apply to children for cascading reveal effect.
   ====================================================== */
.delay-1 { transition-delay: 0.1s; }
.delay-2 { transition-delay: 0.2s; }
.delay-3 { transition-delay: 0.3s; }
.delay-4 { transition-delay: 0.4s; }
.delay-5 { transition-delay: 0.5s; }
.delay-6 { transition-delay: 0.6s; }

/* ======================================================
   Scroll-Down Indicator Bounce
   ====================================================== */
@keyframes bounce {
  0%, 20%, 50%, 80%, 100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-12px);
  }
  60% {
    transform: translateY(-6px);
  }
}

.scroll-indicator {
  animation: bounce 2s infinite;
}

/* ======================================================
   Skill Bar Fill Animation
   Triggered when the .animate class is added via JS.
   ====================================================== */
.skill-bar__fill.animate {
  /* Width is set via inline style; this enables the transition */
  transition: width 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

/* ======================================================
   Pulse Glow Effect (for active nav link or cursor)
   ====================================================== */
@keyframes pulse-glow {
  0%, 100% {
    box-shadow: 0 0 4px var(--accent-blue);
  }
  50% {
    box-shadow: 0 0 12px var(--accent-blue), 0 0 24px rgba(88, 166, 255, 0.2);
  }
}

.pulse-glow {
  animation: pulse-glow 2s ease-in-out infinite;
}

/* ======================================================
   Fade-In-Up for Section Titles
   ====================================================== */
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* ======================================================
   Navbar Slide-Down on Page Load
   ====================================================== */
@keyframes slideDown {
  from {
    opacity: 0;
    transform: translateY(-100%);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.nav-animate {
  animation: slideDown 0.5s var(--transition-fn) forwards;
}

/* ======================================================
   Hamburger Menu Icon Animation (open/close)
   ====================================================== */
.hamburger__bar {
  display: block;
  width: 24px;
  height: 2px;
  background: var(--text-primary);
  border-radius: 2px;
  transition: all 0.3s var(--transition-fn);
  transform-origin: center;
}

/* When menu is open — top bar rotates to form X */
.hamburger.active .hamburger__bar:nth-child(1) {
  transform: translateY(7px) rotate(45deg);
}

/* Middle bar fades out */
.hamburger.active .hamburger__bar:nth-child(2) {
  opacity: 0;
  transform: translateX(-10px);
}

/* Bottom bar rotates to form X */
.hamburger.active .hamburger__bar:nth-child(3) {
  transform: translateY(-7px) rotate(-45deg);
}

/* ======================================================
   Theme Toggle Icon Rotation
   ====================================================== */
@keyframes rotateIn {
  from {
    transform: rotate(-90deg) scale(0);
    opacity: 0;
  }
  to {
    transform: rotate(0) scale(1);
    opacity: 1;
  }
}

.theme-toggle__icon {
  animation: rotateIn 0.3s var(--transition-fn) forwards;
}

/* ======================================================
   Blog Card Hover Lift
   ====================================================== */
.blog-card {
  transition: transform var(--transition-speed) var(--transition-fn),
              box-shadow var(--transition-speed) var(--transition-fn);
}

.blog-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 12px 40px var(--shadow-color);
}

/* ======================================================
   Reduced Motion — respect user's OS preference
   ====================================================== */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }

  .reveal,
  .reveal--left,
  .reveal--right,
  .reveal--scale {
    opacity: 1;
    transform: none;
  }
}

