/* =========================================================
   XevoNet — Motion utilities
   Subtle, deterministic, Apple-grade.  No bouncy spring,
   no rainbow blobs.  Just fade-in, slide-in, scroll-driven.
   ========================================================= */

/* ---------- Reveal: fade + tiny rise on scroll ---------- */
.reveal {
    opacity: 0;
    transform: translate3d(0, 24px, 0);
    transition: opacity var(--dur-xslow, 1.1s) var(--ease-out, ease-out),
                transform var(--dur-xslow, 1.1s) var(--ease-out, ease-out);
}
.reveal.in {
    opacity: 1;
    transform: translate3d(0, 0, 0);
    /* drop the will-change once we're settled */
    will-change: auto;
}

/* If JS is disabled, never leave anything invisible. */
.no-js .reveal,
.no-js .reveal-stagger > *,
.no-js .reveal-line > .word {
    opacity: 1 !important;
    transform: none !important;
}

.reveal-stagger > * {
    opacity: 0;
    transform: translate3d(0, 24px, 0);
    transition: opacity var(--dur-xslow, 1.1s) var(--ease-out, ease-out),
                transform var(--dur-xslow, 1.1s) var(--ease-out, ease-out);
}
.reveal-stagger.in > * {
    opacity: 1;
    transform: translate3d(0, 0, 0);
}
.reveal-stagger.in > *:nth-child(1) { transition-delay: 0ms; }
.reveal-stagger.in > *:nth-child(2) { transition-delay: 80ms; }
.reveal-stagger.in > *:nth-child(3) { transition-delay: 160ms; }
.reveal-stagger.in > *:nth-child(4) { transition-delay: 240ms; }
.reveal-stagger.in > *:nth-child(5) { transition-delay: 320ms; }
.reveal-stagger.in > *:nth-child(6) { transition-delay: 400ms; }
.reveal-stagger.in > *:nth-child(7) { transition-delay: 480ms; }
.reveal-stagger.in > *:nth-child(8) { transition-delay: 560ms; }

/* ---------- Reveal-line: per-word headline reveal ---------- */
.reveal-line {
    display: inline-block;
    overflow: hidden;
    vertical-align: top;
}
.reveal-line > .word {
    display: inline-block;
    transform: translate3d(0, 110%, 0);
    transition: transform var(--dur-xslow, 1.1s) var(--ease-out, ease-out);
}
.reveal-line.in > .word {
    transform: translate3d(0, 0, 0);
}
.reveal-line.in > .word:nth-child(1) { transition-delay: 0ms; }
.reveal-line.in > .word:nth-child(2) { transition-delay: 60ms; }
.reveal-line.in > .word:nth-child(3) { transition-delay: 120ms; }
.reveal-line.in > .word:nth-child(4) { transition-delay: 180ms; }
.reveal-line.in > .word:nth-child(5) { transition-delay: 240ms; }
.reveal-line.in > .word:nth-child(6) { transition-delay: 300ms; }

/* ---------- Scroll-tied transforms (set via JS) ---------- */
[data-scroll] {
    will-change: transform, opacity;
}

/* ---------- Subtle hover lift (kept utility) ---------- */
.lift {
    transition: transform var(--dur, 0.4s) var(--ease-out, ease-out),
                box-shadow var(--dur, 0.4s) var(--ease-out, ease-out);
}
.lift:hover { transform: translateY(-3px); }

/* ---------- Legacy keyframes neutralised
              (the markup still references them; we keep
              names alive so nothing throws, but the visuals
              are inert.)                                  ---------- */
@keyframes blobFloat   { from { } to { } }
@keyframes liquidMorph { from { } to { } }
@keyframes ring        { from { } to { } }
@keyframes pulseDot    { from { } to { } }
@keyframes bar         { from { } to { } }
@keyframes shimmer     { from { } to { } }
@keyframes glowPulse   { from { } to { } }
@keyframes springBounce{ from { } to { } }
@keyframes counterSpin { from { } to { } }
@keyframes spinSlow    { from { } to { } }
@keyframes lineReveal  { from { } to { } }
@keyframes wave        { from { } to { } }
@keyframes drift       { from { } to { } }
@keyframes bouncyPop   { from { } to { } }
@keyframes floatY {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-4px); }
}
@keyframes fadeUp {
    from { opacity: 0; transform: translateY(16px); }
    to   { opacity: 1; transform: translateY(0); }
}
@keyframes blink {
    0%, 50% { opacity: 1; }
    51%, 100% { opacity: 0; }
}

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
    .reveal, .reveal-stagger > * { opacity: 1; transform: none; }
    .reveal-line > .word { transform: none; }
}
