/* ============================================
   ANIMATIONS — Keyframes, Scroll-reveal Classes
   ============================================ */

/* --- Reveal base states --- */
[data-reveal] {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity var(--duration-slow) var(--ease-out-expo),
              transform var(--duration-slow) var(--ease-out-expo);
}

[data-reveal].is-revealed {
  opacity: 1;
  transform: translateY(0);
}

/* Stagger children */
[data-reveal-stagger] > * {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity var(--duration-slow) var(--ease-out-expo),
              transform var(--duration-slow) var(--ease-out-expo);
}

[data-reveal-stagger].is-revealed > * {
  opacity: 1;
  transform: translateY(0);
}

/* Clip reveal (for images/cards) */
[data-reveal-clip] {
  clip-path: inset(100% 0 0 0);
  transition: clip-path var(--duration-slower) var(--ease-out-expo);
}

[data-reveal-clip].is-revealed {
  clip-path: inset(0 0 0 0);
}

/* Line reveal */
[data-reveal-line] {
  overflow: hidden;
}

[data-reveal-line] > span {
  display: block;
  transform: translateY(110%);
  transition: transform var(--duration-slow) var(--ease-out-expo);
}

[data-reveal-line].is-revealed > span {
  transform: translateY(0);
}

/* Scale in */
[data-reveal-scale] {
  opacity: 0;
  transform: scale(0.9);
  transition: opacity var(--duration-slow) var(--ease-out-expo),
              transform var(--duration-slow) var(--ease-out-expo);
}

[data-reveal-scale].is-revealed {
  opacity: 1;
  transform: scale(1);
}

/* --- Keyframes --- */

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

@keyframes slideUp {
  from {
    opacity: 0;
    transform: translateY(40px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

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

@keyframes lineGrow {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}

@keyframes pulse {
  0%, 100% { opacity: 0.4; }
  50% { opacity: 1; }
}

@keyframes float {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-8px); }
}

@keyframes dash {
  to {
    stroke-dashoffset: 0;
  }
}

/* Loader exit */
@keyframes loaderExit {
  0% {
    clip-path: inset(0 0 0 0);
  }
  100% {
    clip-path: inset(0 0 100% 0);
  }
}

/* Typewriter cursor blink */
@keyframes blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0; }
}

/* Dot pulse for timeline */
@keyframes dotPulse {
  0% {
    box-shadow: 0 0 0 0 var(--stage-color);
  }
  70% {
    box-shadow: 0 0 0 10px transparent;
  }
  100% {
    box-shadow: 0 0 0 0 transparent;
  }
}
