@keyframes pulse{0%,100%{box-shadow:0 0 0 5px rgba(114,232,200,.09)}50%{box-shadow:0 0 0 9px rgba(114,232,200,.015)}}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}
@keyframes marquee{to{transform:translateX(-50%)}}
@keyframes scrollDown{0%{transform:translateY(0);opacity:.2}60%{transform:translateY(9px);opacity:1}100%{transform:translateY(9px);opacity:0}}
@keyframes fadeUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
@keyframes lightDrift{50%{transform:translate(5%,-6%) scale(1.08)}}
.ambient-one{animation:lightDrift 17s ease-in-out infinite alternate}.ambient-two{animation:lightDrift 19s ease-in-out infinite alternate-reverse}.fade-up{animation:fadeUp 1s both cubic-bezier(.2,.8,.2,1)}.delay-1{animation-delay:.11s}.delay-2{animation-delay:.22s}.delay-3{animation-delay:.34s}.delay-4{animation-delay:.5s}
/* Only hide scroll-reveal elements when JS is active. Offline and disabled JS still render content. */
.js-enhanced .reveal{opacity:0;transform:translateY(38px);transition:opacity .85s cubic-bezier(.2,.75,.2,1),transform .85s cubic-bezier(.2,.75,.2,1)}.js-enhanced .reveal.is-visible{opacity:1;transform:translateY(0)}.js-enhanced .service-card:nth-child(2),.js-enhanced .work-card:nth-child(2){transition-delay:.1s}.js-enhanced .service-card:nth-child(3){transition-delay:.18s}.js-enhanced .service-card:nth-child(4){transition-delay:.24s}
@media(prefers-reduced-motion:reduce){.js-enhanced .reveal{opacity:1;transform:none}.marquee-track,.float-card,.ambient{animation:none}.fade-up{animation:none}}
