/* Scroll experience — see scroll-fx.js. Only active when html.fx-ready (motion allowed). */
:root{--fx-ease:cubic-bezier(.16,1,.3,1)}

/* 1. reveals: soft rise, staggered by sibling index */
.fx-ready .fx-rise{opacity:0;translate:0 34px;transition:opacity .9s var(--fx-ease),translate 1.15s var(--fx-ease);transition-delay:calc(var(--i,0)*85ms)}
.fx-ready .fx-rise.fx-in{opacity:1;translate:0 0}
.fx-ready .fx-head{opacity:0;translate:0 52px;scale:.985;filter:blur(8px);transform-origin:50% 100%;transition:opacity 1s var(--fx-ease),translate 1.3s var(--fx-ease),scale 1.3s var(--fx-ease),filter .9s ease-out;will-change:opacity,translate,filter}
.fx-ready .fx-head.fx-in{opacity:1;translate:0 0;scale:1;filter:none}

/* 2. scrubbed values */
.fx-ready .fx-enter{translate:0 calc((1 - var(--p,1))*88px);scale:calc(.93 + var(--p,1)*.07);opacity:calc(.0 + var(--p,1)*1.4);transform-origin:50% 0;will-change:translate,scale,opacity}
.fx-ready .fx-py{translate:0 var(--py,0px);will-change:translate}
.fx-ready .fx-px{translate:var(--px,0px) 0;will-change:translate}
.fx-ready .fx-curtain{--r:calc((1 - var(--p,1))*52px);scale:calc(.9 + var(--p,1)*.1);border-radius:var(--r) var(--r) 0 0;transform-origin:50% 0;will-change:scale}
.fx-ready .site-footer.fx-curtain{background-clip:padding-box}
.fx-ready .fx-ink{background:linear-gradient(180deg,var(--ink) calc(var(--p,1)*150% - 25%),color-mix(in srgb,var(--ink) 34%,transparent) calc(var(--p,1)*150% + 18%));-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent}
.fx-ready .fx-ink.fx-ink-light{--ink:#f6f0fa}

/* 3. quieter first paint for large dark sections */
.fx-ready .voice{overflow:hidden}

@media(prefers-reduced-motion:reduce){.fx-ready .fx-rise,.fx-ready .fx-head,.fx-ready .fx-enter,.fx-ready .fx-py,.fx-ready .fx-px,.fx-ready .fx-curtain,.fx-ready .fx-ink{opacity:1;translate:none;scale:none;filter:none;border-radius:inherit;background:none;-webkit-text-fill-color:currentColor;color:inherit}}
.reduce-motion .fx,.reduce-motion .fxs{opacity:1!important;translate:none!important;scale:none!important;filter:none!important}

/* Paused while far off screen (scroll-fx.js); invisible, resumes before the section is visible. */
.fx-offscreen,.fx-offscreen *,.fx-offscreen *::before,.fx-offscreen *::after{animation-play-state:paused!important}
.fx-offscreen,.fx-offscreen *{will-change:auto!important}
