/* ═══ SCROLL REVEAL & ANIMATIONS ═════════════════════════════════════════
   .reveal, .reveal.vis, .reveal-delay-*, @keyframes fadeUp, blink,
   pulse-dot, marquee, msgUp, dot-bounce, dash-f
   ═══════════════════════════════════════════════════════════════════════════ */
.reveal-init{opacity:0;transform:translateY(20px);transition:opacity .6s var(--ease),transform .6s var(--ease);will-change:opacity,transform}
.reveal-init.vis{opacity:1;transform:translateY(0)}
.reveal-delay-1{transition-delay:.1s}
.reveal-delay-2{transition-delay:.2s}
.reveal-delay-3{transition-delay:.3s}
.reveal-delay-4{transition-delay:.4s}

@keyframes fadeUp{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}}
@keyframes blink{0%,100%{opacity:1}50%{opacity:0}}
@keyframes pulse-dot{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}
@keyframes marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@keyframes msgUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
@keyframes dot-bounce{0%,80%,100%{transform:translateY(0);opacity:.4}40%{transform:translateY(-4px);opacity:1}}
@keyframes dash-f{from{stroke-dashoffset:18}to{stroke-dashoffset:0}}
