/* =========================================================================
   AERONODE STUDIO — animations.css
   Keyframes, scroll-reveal utility classes, preloader, reduced-motion.
   ========================================================================= */

/* ---------- Keyframes ---------- */
@keyframes fadeInUp{ from{ opacity:0; transform:translateY(28px); } to{ opacity:1; transform:none; } }
@keyframes fadeIn{ from{ opacity:0; } to{ opacity:1; } }
@keyframes floatY{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(-14px); } }
@keyframes pulseGlow{ 0%,100%{ opacity:0.55; } 50%{ opacity:1; } }
@keyframes spin{ from{ transform:rotate(0); } to{ transform:rotate(360deg); } }
@keyframes shimmer{ 0%{ background-position:-200% 0; } 100%{ background-position:200% 0; } }
@keyframes gradientShift{ 0%,100%{ background-position:0% 50%; } 50%{ background-position:100% 50%; } }
@keyframes marquee{ from{ transform:translateX(0); } to{ transform:translateX(-50%); } }
@keyframes scrollCue{ 0%{ opacity:1; top:8px; } 70%{ opacity:0; top:22px; } 100%{ opacity:0; top:8px; } }
@keyframes toast-in{ from{ opacity:0; transform:translateX(24px); } to{ opacity:1; transform:none; } }
@keyframes blobMorph{
  0%,100%{ border-radius:42% 58% 65% 35% / 45% 40% 60% 55%; }
  50%{ border-radius:58% 42% 40% 60% / 55% 60% 40% 45%; }
}
@keyframes preloaderPulse{
  0%,100%{ transform:scale(1); opacity:0.85; }
  50%{ transform:scale(1.08); opacity:1; }
}
@keyframes preloaderRing{ to{ stroke-dashoffset:0; } }

/* ---------- Scroll reveal ---------- */
.reveal{ opacity:0; transform:translateY(28px); transition:opacity .8s cubic-bezier(.22,.9,.28,1), transform .8s cubic-bezier(.22,.9,.28,1); }
.reveal.is-visible{ opacity:1; transform:none; }
.reveal-stagger > *{ opacity:0; transform:translateY(24px); transition:opacity .7s cubic-bezier(.22,.9,.28,1), transform .7s cubic-bezier(.22,.9,.28,1); }
.reveal-stagger.is-visible > *{ opacity:1; transform:none; }
.reveal-stagger.is-visible > *:nth-child(1){ transition-delay:.03s; }
.reveal-stagger.is-visible > *:nth-child(2){ transition-delay:.09s; }
.reveal-stagger.is-visible > *:nth-child(3){ transition-delay:.15s; }
.reveal-stagger.is-visible > *:nth-child(4){ transition-delay:.21s; }
.reveal-stagger.is-visible > *:nth-child(5){ transition-delay:.27s; }
.reveal-stagger.is-visible > *:nth-child(6){ transition-delay:.33s; }
.reveal-stagger.is-visible > *:nth-child(n+7){ transition-delay:.38s; }

/* ---------- Floating / glow helpers ---------- */
.float{ animation:floatY 6s ease-in-out infinite; }
.float-slow{ animation:floatY 9s ease-in-out infinite; }
.glow-pulse{ animation:pulseGlow 3.2s ease-in-out infinite; }
.blob-anim{ animation:blobMorph 16s ease-in-out infinite; }

/* Gradient-shift background used behind CTA / hero mesh accents */
.gradient-mesh{
  background:linear-gradient(120deg,var(--sky),var(--indigo),var(--sky));
  background-size:200% 200%;
  animation:gradientShift 10s ease infinite;
}

/* Marquee strip (tech-stack ticker) */
.marquee-strip{ border-top:1px solid var(--border); border-bottom:1px solid var(--border); overflow:hidden; padding-block:18px; position:relative; z-index:1; }
.marquee-track{ display:flex; gap:14px; width:max-content; animation:marquee 36s linear infinite; font-family:var(--font-mono); font-size:0.85rem; color:var(--text-muted); white-space:nowrap; }

/* ---------- Preloader ---------- */
.preloader{
  position:fixed; inset:0; z-index:1000; display:flex; align-items:center; justify-content:center;
  background:var(--bg); transition:opacity .5s ease, visibility .5s ease;
}
.preloader.is-hidden{ opacity:0; visibility:hidden; pointer-events:none; }
.preloader-mark{ width:72px; height:72px; animation:preloaderPulse 1.6s ease-in-out infinite; }
.preloader-ring{ position:absolute; inset:0; display:flex; align-items:center; justify-content:center; }
.preloader-ring svg{ width:110px; height:110px; transform:rotate(-90deg); }
.preloader-ring circle{ fill:none; stroke-width:2; }
.preloader-ring .track{ stroke:var(--border); }
.preloader-ring .bar{ stroke:url(#preloaderGrad); stroke-linecap:round; stroke-dasharray:300; stroke-dashoffset:300; animation:preloaderRing 1.4s var(--ease) forwards; }
.preloader-inner{ position:relative; display:flex; align-items:center; justify-content:center; width:110px; height:110px; }

/* ---------- Hover micro-interactions ---------- */
.hover-lift{ transition:transform .3s cubic-bezier(.22,.9,.28,1); }
.hover-lift:hover{ transform:translateY(-4px); }

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion:reduce){
  html{ scroll-behavior:auto; }
  .reveal, .reveal-stagger > *{ opacity:1!important; transform:none!important; transition:none!important; }
  .float, .float-slow, .glow-pulse, .blob-anim, .gradient-mesh, .marquee-track,
  .preloader-mark, .preloader-ring .bar, .scroll-cue span{ animation:none!important; }
}
