/* === CORE START === */
/* ---- motion tokens (mirrored in core.js VT.ease / VT.dur) ---- */
:root{--vt-out:cubic-bezier(.16,1,.3,1);--vt-soft:cubic-bezier(.215,.61,.355,1);--vt-d:0s}
/* ---- page-header entrance: pure CSS, starts at first paint (no JS hide-then-replay flash).
   backwards fill only, so nothing is held after the end; uses the individual translate/scale properties so
   GSAP's transform (parallax, dolly) composes instead of fighting. Waits under the transition cover. ---- */
@media (prefers-reduced-motion:no-preference){
html:not(.vt-cover) :is(.hero-copy,.phead-copy,.pc)>*,html:not(.vt-cover) .nf .wrap>:not(.nfmark){animation:vt-up .8s var(--vt-out) backwards;animation-delay:calc(var(--vt-d) + .1s + var(--i,0)*65ms)}
html:not(.vt-cover) main h1{animation:vt-h1 .95s var(--vt-out) backwards;animation-delay:calc(var(--vt-d) + .06s)}
:is(.hero-copy,.phead-copy,.pc,.nf .wrap)>:nth-child(2){--i:1}:is(.hero-copy,.phead-copy,.pc,.nf .wrap)>:nth-child(3){--i:2}
:is(.hero-copy,.phead-copy,.pc,.nf .wrap)>:nth-child(4){--i:3}:is(.hero-copy,.phead-copy,.pc,.nf .wrap)>:nth-child(5){--i:4}
:is(.hero-copy,.phead-copy,.pc,.nf .wrap)>:nth-child(n+6){--i:5}
html:not(.vt-cover) :is(.hero-media img,.phead>.wrap>img,.vsl,.nfmark,.pilot>:not(.pc)){animation:vt-media 1.2s var(--vt-soft) backwards;animation-delay:var(--vt-d)}
html:not(.vt-cover) #breath{animation:vt-fade .8s linear backwards;animation-delay:calc(var(--vt-d) + .5s)}
}
@keyframes vt-up{from{opacity:0;translate:0 16px}}
@keyframes vt-h1{from{opacity:0;translate:0 .4em;clip-path:inset(-.2em -.2em 55% -.2em)}to{opacity:1;translate:0 0;clip-path:inset(-.2em -.2em -.3em -.2em)}}
@keyframes vt-media{from{scale:1.04}}   /* scale only: the LCP image is painted at full opacity from the first frame */
@keyframes vt-fade{from{opacity:0}}
/* Lenis (desktop smooth scroll) */
html.lenis,html.lenis body{height:auto}
html.lenis,.lenis.lenis-smooth{scroll-behavior:auto!important}
.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}
.lenis.lenis-stopped{overflow:hidden}
/* old .rv reveal neutralised: core.js owns these reveals once GSAP is present */
html.motion-ready .rv{opacity:1;transform:none;transition:none}
html.motion-ready .phone.rv:nth-child(2){transform:scale(1.04)}
html.motion-ready .explore a.rv{transition:border-color .2s ease,transform .2s ease}
/* masked line reveal (split is reverted when the reveal ends) */
.vt-l{display:block;overflow:hidden;padding:.1em .06em .16em;margin:-.1em -.06em -.16em}
.vt-li{display:block;will-change:transform}
/* nav scroll-progress line */
.vt-prog{position:absolute;left:0;right:0;bottom:-2px;height:2px;background:#F25C3A;transform-origin:0 50%;transform:scaleX(0);pointer-events:none}
/* page-transition curtain (Carbon) with the orange symbol; orange hairlines on its moving edges */
.vt-curtain{position:fixed;inset:0;z-index:1000;background:#171C20;display:grid;place-items:center;visibility:hidden;pointer-events:none;transform:translateY(100%)}
.vt-curtain::before,.vt-curtain::after{content:"";position:absolute;left:0;right:0;height:2px;background:#F25C3A}
.vt-curtain::before{top:-2px}.vt-curtain::after{bottom:-2px}
.vt-curtain img{width:44px;height:auto;display:block}
/* optional pre-paint cover set by a one-line head script (see NOTES-core.md); self-lifts if JS never runs */
html.vt-cover body::after{content:"";position:fixed;inset:0;z-index:1000;background:#171C20;animation:vt-uncover .3s 1.2s forwards}
@keyframes vt-uncover{to{opacity:0;visibility:hidden}}
@media (prefers-reduced-motion:reduce){html.vt-cover body::after{display:none}}
/* === CORE END === */
/* === SCENES START === */
/* hero: Oxide glow at the analyzer port (sits between the render and the particle canvas) */
.sc-gw{position:absolute;inset:0;pointer-events:none}
.sc-glow{position:absolute;border-radius:50%;opacity:0;background:radial-gradient(closest-side,rgba(242,92,58,.62),rgba(242,92,58,.24) 42%,rgba(242,92,58,0));mix-blend-mode:screen;will-change:transform,opacity}
/* home comparison: VenTracer column lights row by row (fill sits behind the cell text) */
.sc-us{position:relative;isolation:isolate}
.sc-cell{position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:0;transform-origin:0 50%;background:linear-gradient(90deg,rgba(242,92,58,.2),rgba(242,92,58,.05) 80%);box-shadow:inset 2px 0 0 #F25C3A}
/* frame sequences: chrome over the canvas */
.sc-chrome{position:absolute;inset:0;pointer-events:none;opacity:0;transition:opacity .6s ease}
.sc-chrome.on{opacity:1}
.sc-vig{position:absolute;inset:0;background:radial-gradient(ellipse 72% 68% at 55% 50%,rgba(23,28,32,0) 52%,rgba(23,28,32,.6) 100%)}
.sc-count{position:absolute;right:clamp(16px,3vw,48px);bottom:12%;display:flex;flex-direction:column;align-items:flex-end;gap:6px;font-family:var(--mono,"IBM Plex Mono",monospace);color:var(--ink,#F3F1E9)}
.sc-count span,.sc-count em{font:500 11px/1 var(--mono,monospace);letter-spacing:.14em;text-transform:uppercase;color:var(--muted,#9AA3A8);font-style:normal}
.sc-count b{font:400 clamp(44px,5.4vw,88px)/.9 var(--mono,monospace);letter-spacing:-.05em;font-variant-numeric:tabular-nums}
.sc-rule{position:absolute;right:clamp(16px,3vw,48px);top:13%;bottom:36%;width:12px;background:repeating-linear-gradient(180deg,rgba(243,241,233,.22) 0 1px,transparent 1px 10%);border-right:1px solid rgba(243,241,233,.14)}
.sc-rule i{position:absolute;right:0;top:0;width:26px;height:2px;background:#F25C3A;will-change:transform}
@media (max-width:900px){.sc-count{top:14px;bottom:auto;right:var(--gr,16px);gap:4px}.sc-count b{font-size:34px}.sc-count span,.sc-count em{font-size:9.5px}
  .sc-vig{background:radial-gradient(ellipse 90% 70% at 50% 50%,rgba(23,28,32,0) 55%,rgba(23,28,32,.55) 100%)}}
/* exploded view: each callout draws from its label down to the part */
.sc-call .lab>span{clip-path:inset(-2px calc((1 - var(--c,1)) * 100%) -2px 0)}
.sc-call .lab i{transform-origin:50% 0;transform:scaleY(var(--d,1))}
.sc-call .lab b{transform:scale(var(--o,1))}
/* how it works: pipeline */
.sc-pipe-host{position:relative}
.sc-pipe{position:absolute;left:0;top:0;overflow:visible;pointer-events:none;z-index:1}
.sc-pipe path{fill:none;stroke-width:2;stroke-linejoin:round}
.sc-pipe .b{stroke:transparent}
.sc-pipe .l{stroke:#F25C3A}
.sc-pipe .n{fill:#171C20;stroke:#F25C3A;stroke-width:2;transform-box:fill-box;transform-origin:center}
.sc-pipe .h{fill:#F25C3A}
.sc-pipe .k{fill:#F3F1E9}
/* science: scroll-scrubbed ramp (overrides site.js's one-shot draw) */
#ramp.sc-scrub .curve{transition:none!important;stroke-dashoffset:calc(var(--L,0px) * (1 - var(--p,0)))!important}
.sc-head line{stroke:rgba(243,241,233,.32);stroke-width:1;stroke-dasharray:2 4}
.sc-head circle{stroke:#171C20;stroke-width:2}
.sc-term{position:relative}
.sc-u{position:absolute;left:0;right:0;bottom:-.04em;height:2px;background:currentColor;transform-origin:0 50%;pointer-events:none}
/* product: output names mask up */
.sc-mask{clip-path:inset(-20% -6% -30% -6%)}
.sc-mi{display:inline-block;will-change:transform}
/* labs: roadmap line + breathing "now" dot */
.sc-rl,.sc-rd,.sc-pulse{position:absolute;pointer-events:none}
.sc-rl{left:0;right:0;top:-2px;height:2px;background:rgba(243,241,233,.55);transform-origin:0 50%}
.sc-rl.now{background:#F25C3A}
.sc-rd{top:-7px;left:0;width:12px;height:12px;border-radius:50%;background:var(--soft,#C9CDCB)}
.sc-rd.now{background:#F25C3A}
.sc-pulse{top:-7px;left:0;width:12px;height:12px;border-radius:50%;border:2px solid #F25C3A;animation:sc-pulse 2.4s cubic-bezier(.2,.6,.3,1) infinite}
@keyframes sc-pulse{0%{transform:scale(1);opacity:.85}100%{transform:scale(3.4);opacity:0}}
@media (prefers-reduced-motion:reduce){.sc-pulse{animation:none}}
/* === SCENES END === */
