/* ==========================================================================
   Animation primitives (used with JS-based reveal)
   ========================================================================== */

@keyframes sgv-fade-up{
  from{opacity:0;transform:translateY(16px)}
  to{opacity:1;transform:none}
}
@keyframes sgv-fade-in{
  from{opacity:0}to{opacity:1}
}
@keyframes sgv-zoom-in{
  from{opacity:0;transform:scale(.96)}
  to{opacity:1;transform:none}
}

/* Reveal-on-scroll — activated by app.js adding .is-visible */
.reveal{opacity:0;transform:translateY(18px);transition:opacity .6s var(--ease),transform .6s var(--ease)}
.reveal.is-visible{opacity:1;transform:none}

.reveal-stagger > *{opacity:0;transform:translateY(14px);transition:opacity .5s var(--ease),transform .5s var(--ease)}
.reveal-stagger.is-visible > *{opacity:1;transform:none}
.reveal-stagger.is-visible > *:nth-child(1){transition-delay:.02s}
.reveal-stagger.is-visible > *:nth-child(2){transition-delay:.06s}
.reveal-stagger.is-visible > *:nth-child(3){transition-delay:.10s}
.reveal-stagger.is-visible > *:nth-child(4){transition-delay:.14s}
.reveal-stagger.is-visible > *:nth-child(5){transition-delay:.18s}
.reveal-stagger.is-visible > *:nth-child(6){transition-delay:.22s}
.reveal-stagger.is-visible > *:nth-child(7){transition-delay:.26s}
.reveal-stagger.is-visible > *:nth-child(8){transition-delay:.30s}
.reveal-stagger.is-visible > *:nth-child(9){transition-delay:.34s}
.reveal-stagger.is-visible > *:nth-child(10){transition-delay:.38s}
.reveal-stagger.is-visible > *:nth-child(11){transition-delay:.42s}
.reveal-stagger.is-visible > *:nth-child(12){transition-delay:.46s}

@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation:none !important;transition:none !important}
  .reveal,.reveal-stagger > *{opacity:1 !important;transform:none !important}
}