/* shared motion — keep heroes static so gallery cards stay vivid */
.fx-reveal{opacity:0;transform:translateY(22px);transition:opacity .8s cubic-bezier(.22,1,.36,1),transform .8s cubic-bezier(.22,1,.36,1)}
.fx-reveal.in{opacity:1;transform:none}
.fx-reveal.d2{transition-delay:.1s}
.fx-reveal.d3{transition-delay:.18s}
img.fx-zoom, figure.fx-zoom img, .fx-zoom img{transition:transform 1.2s cubic-bezier(.22,1,.36,1)}
.fx-zoom:hover img{transform:scale(1.045)}
a, button, .cta, .btn, .cart, .send{transition:transform .25s cubic-bezier(.22,1,.36,1), filter .2s, box-shadow .25s}
a.cta:hover, a.btn:hover, a.cart:hover, button.cta:hover, .btn:hover, .send:hover, .cart:hover{transform:translateY(-2px)}
.fx-grain-page::after{content:"";pointer-events:none;position:fixed;inset:0;z-index:60;opacity:.055;background-image:image-set(url("../img/grain.avif") type("image/avif"), url("../img/grain.webp") type("image/webp"));background-size:256px;mix-blend-mode:overlay}
@media (prefers-reduced-motion:reduce){
  .fx-reveal,.fx-reveal.in{opacity:1;transform:none;transition:none}
  img.fx-zoom, figure.fx-zoom img, .fx-zoom img, a, button, .cta, .btn, .cart, .send{transition:none}
  a.cta:hover, a.btn:hover, a.cart:hover, button.cta:hover{transform:none}
}
