/* ==========================================================================
   Dual Design & Code — Animation Keyframes
   ========================================================================== */

@keyframes floatSlow {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  50% { transform: translateY(-18px) rotate(2deg); }
}

@keyframes pulseGlow {
  0%, 100% { opacity: 0.55; }
  50% { opacity: 0.9; }
}

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

@keyframes blink {
  0%, 49% { opacity: 1; }
  50%, 100% { opacity: 0; }
}

@keyframes growFill {
  from { width: 0%; }
  to { width: 100%; }
}

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

@keyframes skeletonPulse {
  0%, 100% { opacity: 0.5; }
  50% { opacity: 0.9; }
}

.draw-path {
  stroke-dasharray: 160;
  stroke-dashoffset: 160;
  animation: drawLogo 0.9s ease forwards;
}
.draw-path-delay { animation-delay: 0.15s; }
.preloader-logo { width: 64px; height: 46px; }

.reveal-up { animation: fadeUp 0.8s ease both; }
.reveal-up .line:nth-child(1) { animation: fadeUp 0.7s ease both; animation-delay: 0.05s; }
.reveal-up .line:nth-child(2) { animation: fadeUp 0.7s ease both; animation-delay: 0.22s; }

.js-fade-in-up {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 1s cubic-bezier(0.16,1,0.3,1), transform 1s cubic-bezier(0.16,1,0.3,1);
}
.js-fade-in-up.is-visible { opacity: 1; transform: translateY(0); }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}
