/* Premium motion layer - scroll reveals + smooth hover. Static HTML, no framework. */
/* opacity:0 is the animation START. A pure-CSS fallback keyframe ALWAYS reveals the
   element by ~0.7s even if JS never adds .in (headless render, no scroll, slow IO, or
   an early screenshot capture) - so JS-rendered headings/footers can never get stuck
   invisible. When JS adds .in, animation:none cancels the fallback and the smooth
   transition takes over. This decouples visibility from any JS/capture timing. */
[data-reveal]{opacity:0;transform:translateY(28px);transition:opacity .85s cubic-bezier(.16,1,.3,1),transform .85s cubic-bezier(.16,1,.3,1);animation:reveal-safety .45s ease .25s forwards;}
[data-reveal].in{opacity:1;transform:none;animation:none;}
@keyframes reveal-safety{from{opacity:0;transform:translateY(28px);}to{opacity:1;transform:none;}}
a,button{transition:transform .22s ease,opacity .22s ease,color .22s ease;}
a:hover,button:hover{transform:translateY(-1px);}
[class*="shadow"]{transition:transform .32s cubic-bezier(.16,1,.3,1),box-shadow .32s ease;}
[class*="shadow"]:hover{transform:translateY(-6px);}
[class*="overflow-hidden"] img{transition:none;}/* image zoom transition removed - static per client */
[class*="overflow-hidden"]:hover img{transform:none;}/* hover zoom removed - static per client */
@media (prefers-reduced-motion:reduce){[data-reveal]{opacity:1!important;transform:none!important;transition:none!important;}[class*="shadow"]:hover{transform:none;}}
