/* ===== Motion & micro-interactions ===== */
@keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-14px)}}
@keyframes floatySlow{0%,100%{transform:translateY(0)}50%{transform:translateY(-24px)}}
@keyframes shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}
@keyframes scrollDot{0%{transform:translateY(0);opacity:0}35%{opacity:1}100%{transform:translateY(16px);opacity:0}}
@keyframes pulseRing{0%{transform:scale(.9);opacity:.7}100%{transform:scale(1.6);opacity:0}}
@keyframes revealUp{from{opacity:0;transform:translateY(28px)}to{opacity:1;transform:none}}
@keyframes spinSlow{to{transform:rotate(360deg)}}

.float{animation:floaty 6s var(--ease) infinite}
.float-slow{animation:floatySlow 9s var(--ease) infinite}
.reveal{animation:revealUp .8s var(--ease) both}
.delay-1{animation-delay:.12s}.delay-2{animation-delay:.24s}.delay-3{animation-delay:.36s}.delay-4{animation-delay:.48s}

/* Ripple */
.btn-x{position:relative;overflow:hidden;isolation:isolate}
.ripple{position:absolute;border-radius:50%;transform:scale(0);background:rgba(255,255,255,.45);animation:rip .6s linear;pointer-events:none}
.btn-x.btn-ghost .ripple{background:rgba(229,57,53,.25)}
@keyframes rip{to{transform:scale(3.2);opacity:0}}

/* Text reveal */
.text-reveal span{display:inline-block;opacity:0;transform:translateY(24px);animation:revealUp .7s var(--ease) forwards}

/* Card lift */
.lift{transition:transform .5s var(--ease),box-shadow .5s var(--ease)}
.lift:hover{transform:translateY(-10px);box-shadow:var(--shadow-lg)}

/* Image hover zoom */
.zoom-wrap{overflow:hidden}
.zoom-wrap img{transition:transform .9s var(--ease),filter .6s var(--ease)}
.zoom-wrap:hover img{transform:scale(1.08)}

@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
