/* ============================================================================
   MOTION — reveal-on-scroll, hero stagger, count-up.
   Resting state (no .anim gate) is ALWAYS visible — animation is additive only,
   so content can never be permanently hidden if JS/compositor stalls.
   ========================================================================== */
.anim .reveal{opacity:0;transform:translateY(22px);transition:opacity .7s cubic-bezier(.2,.7,.2,1), transform .7s cubic-bezier(.2,.7,.2,1);}
.anim .reveal.is-visible{opacity:1;transform:none;}
.anim .reveal[data-d="1"]{transition-delay:.08s;}
.anim .reveal[data-d="2"]{transition-delay:.16s;}
.anim .reveal[data-d="3"]{transition-delay:.24s;}
.anim .reveal[data-d="4"]{transition-delay:.32s;}

/* Hero load stagger */
.anim .hero:not(.loaded) .h-anim{opacity:0;transform:translateY(26px);}
.anim .hero.loaded .h-anim{opacity:1;transform:none;transition:opacity .9s cubic-bezier(.2,.7,.2,1), transform .9s cubic-bezier(.2,.7,.2,1);}
.anim .hero.loaded .h-anim[data-d="1"]{transition-delay:.12s;}
.anim .hero.loaded .h-anim[data-d="2"]{transition-delay:.30s;}
.anim .hero.loaded .h-anim[data-d="3"]{transition-delay:.48s;}
.anim .hero.loaded .h-anim[data-d="4"]{transition-delay:.64s;}

@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto;}
  .anim .reveal,.anim .hero .h-anim{opacity:1!important;transform:none!important;transition:none!important;}
  .image-card,.image-card__img,.chip{transition:none!important;}
}
