/* 14 Sep 2026 (ACR-687): one effects grammar for the whole site, loaded on every route after the brand stylesheets.
   Interactive things answer the hand (arrow nudge, underline, a small lift); dark fields carry one slow ambient glow; the photo and the book plate settle as they scroll in; in the story window the bars grow when the answer lands. Every motion is off under prefers-reduced-motion. The Vision hub has its own rules in sub-vision.css. */
:root{--fx-ease:cubic-bezier(.22,.68,0,1)}

/* 1 · the hand: buttons and text links */
.cta{transition:background .35s var(--fx-ease),color .35s var(--fx-ease),box-shadow .35s var(--fx-ease),transform .35s var(--fx-ease)}
.cta i{transition:transform .35s var(--fx-ease),background .35s var(--fx-ease),color .35s var(--fx-ease)}
.cta:hover,.cta:focus-visible{transform:translateY(-1px)}
.cta:hover i,.cta:focus-visible i{transform:translate(2px,-2px)}
.cta:active{transform:translateY(0)}
.text-link{transition:border-color .3s var(--fx-ease),color .3s var(--fx-ease)}
.text-link>span{display:inline-block;transition:transform .35s var(--fx-ease)}
.text-link:hover,.text-link:focus-visible{border-color:currentColor}
.text-link:hover>span,.text-link:focus-visible>span{transform:translate(2px,-2px)}

/* 2 · raised surfaces that hold a link lift a little under the pointer */
.nx-package,.sv-job{transition:transform .45s var(--fx-ease),box-shadow .45s var(--fx-ease)}
.nx-package:hover{transform:translateY(-4px);box-shadow:0 30px 60px rgba(0,0,0,.35)}
.sv-job:hover{transform:translateY(-4px);box-shadow:0 1px 0 #fff inset,0 34px 70px rgba(7,26,51,.14),0 6px 18px rgba(7,26,51,.06)}

/* 3 · atmosphere: one slow glow high on every dark field. The hero plate, the hub and the closing book carry their own light and are left alone. */
.hv-sec.hv-dark:not(.hv-closing):not(.vs-owned){isolation:isolate}
.hv-sec.hv-dark:not(.hv-closing):not(.vs-owned):before{content:"";position:absolute;left:50%;top:0;width:min(1400px,140vw);height:640px;transform:translate(-50%,-52%);border-radius:50%;background:radial-gradient(closest-side,rgba(53,185,228,.14),rgba(53,185,228,.05) 48%,rgba(53,185,228,0) 100%);pointer-events:none;z-index:-1}

@media (prefers-reduced-motion:no-preference){
 .hv-sec.hv-dark:not(.hv-closing):not(.vs-owned):before{animation:fx-drift 28s ease-in-out infinite alternate}
 @keyframes fx-drift{from{transform:translate(-53%,-54%) scale(1)}to{transform:translate(-47%,-47%) scale(1.08)}}
 /* 4 · plates settle: the founders photo and the closing book ease into place as they scroll in (scroll-driven, no script) */
 @supports (animation-timeline:view()){
  .hv-photo img,.hv-book img{animation:fx-settle linear both;animation-timeline:view();animation-range:entry 0% entry 85%}
  @keyframes fx-settle{from{transform:translateY(34px) scale(1.04)}to{transform:none}}
 }
 /* 5 · the returned card in the story window: the bars grow and the figures land once the answer is shown */
 .js .mp-playing .cc-message.mp-shown .mp-mini-track i{transform-origin:right center;animation:fx-grow .9s var(--fx-ease) .55s both}
 .js .mp-playing .cc-message.mp-shown .mp-mini-bar strong{animation:fx-land .6s var(--fx-ease) 1.1s both}
 @keyframes fx-grow{from{transform:scaleX(0)}}
 @keyframes fx-land{from{opacity:0;transform:translateY(4px)}}
}
@media (prefers-reduced-motion:reduce){.cta,.cta i,.text-link,.text-link>span,.nx-package,.sv-job{transition:none}.cta:hover,.cta:hover i,.text-link:hover>span,.nx-package:hover,.sv-job:hover{transform:none}}
