/* Motion layer — quick and precise, like a signal travelling a circuit. site.js adds
   html.motion-ready only when JS runs AND the visitor has NOT asked for reduced motion
   (never hard-code it on <html>, §9.85). Without it, every .reveal element is simply visible. */
html.motion-ready .reveal { opacity: 0; transform: translateY(18px); transition: opacity .55s cubic-bezier(.2, .8, .2, 1), transform .55s cubic-bezier(.2, .8, .2, 1); transition-delay: var(--d, 0s); }
html.motion-ready .reveal.from-left { transform: translateX(-22px); }
html.motion-ready .reveal.from-right { transform: translateX(22px); }
html.motion-ready .reveal.zoom { transform: scale(.96); }
html.motion-ready .reveal.in { opacity: 1; transform: none; }

/* neural trace: lines draw themselves, nodes light up after */
html.motion-ready .trace path, html.motion-ready .trace line { stroke-dasharray: var(--len, 600); stroke-dashoffset: var(--len, 600); }
html.motion-ready .trace.in path, html.motion-ready .trace.in line { animation: draw 1.6s cubic-bezier(.65, 0, .35, 1) forwards; animation-delay: var(--d, 0s); }
@keyframes draw { to { stroke-dashoffset: 0; } }
html.motion-ready .trace .node { opacity: 0; transform-box: fill-box; transform-origin: center; }
html.motion-ready .trace.in .node { animation: nodeOn .45s cubic-bezier(.3, 1.5, .5, 1) forwards; animation-delay: calc(var(--d, 0s) + 1.1s); }
@keyframes nodeOn { from { opacity: 0; transform: scale(.2); } to { opacity: 1; transform: scale(1); } }

/* a single spark that keeps travelling the hero network */
html.motion-ready .spark { offset-rotate: 0deg; animation: travel 6s linear infinite; }
@keyframes travel { from { offset-distance: 0%; } to { offset-distance: 100%; } }
html.motion-ready .pulse { animation: pulse 2.4s ease-out infinite; transform-box: fill-box; transform-origin: center; }
@keyframes pulse { 0% { opacity: .9; transform: scale(1); } 70%, 100% { opacity: 0; transform: scale(2.6); } }

/* floating proof badges in the hero */
html.motion-ready .nt-hero__badge { animation: bob 5s ease-in-out infinite; }
html.motion-ready .nt-hero__badge.b2 { animation-delay: -1.6s; }
html.motion-ready .nt-hero__badge.b3 { animation-delay: -3.1s; }
@keyframes bob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }

/* buttons: a crisp press, no wobble */
html.motion-ready .btn-nt:hover, html.motion-ready .btn-spark:hover, html.motion-ready .btn-ink:hover { transform: translateY(-1px); }
html.motion-ready .btn:active { transform: translateY(1px) scale(.99); }

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
    .reveal { opacity: 1 !important; transform: none !important; }
    .trace path, .trace line { stroke-dashoffset: 0 !important; }
    .trace .node { opacity: 1 !important; }
}
