/* HORIZON V4 — motion only. The V3 palette, typography and layout stay intact. */
.js-ready .reveal{transition-duration:.65s;transition-timing-function:cubic-bezier(.2,.7,.2,1)}

/* Faster signals; the explanatory phase clock remains unchanged. */
.future-machine .fm-flow{animation-duration:1.8s;transition-duration:.35s}
.future-machine .fm-flow:nth-of-type(2n){animation-delay:-.55s}
.future-machine .fm-flow:nth-of-type(3n){animation-delay:-1.1s}
.future-machine .fm-state rect,.future-machine .fm-state text{transition-duration:.45s}
.future-machine .fm-unfold{transition-duration:.35s}
.future-machine .fm-collision-label{transition-duration:.65s}
.future-machine[data-phase="1"] .fm-source circle,
.future-machine[data-phase="2"] .fm-source circle{animation:v4-source-signal 1.8s ease-in-out infinite}
.future-machine .fm-source-1 circle{animation-delay:-.35s}
.future-machine .fm-source-2 circle{animation-delay:-.7s}
.future-machine .fm-source-3 circle{animation-delay:-1.05s}
.future-machine .fm-source-4 circle{animation-delay:-1.4s}
.future-machine[data-phase="2"] .fm-collision-ring,
.future-machine[data-phase="3"] .fm-collision-ring{animation:v4-collision-arrival .85s cubic-bezier(.2,.8,.2,1) both}
.future-machine[data-phase="3"] .fm-split-route{stroke-dasharray:1000;animation:v4-path-arrival .75s ease-out both}
.future-machine[data-phase="3"] .fm-result .fm-sequence{transform-box:fill-box;transform-origin:center;animation:v4-observation-arrival .55s .15s cubic-bezier(.2,.8,.2,1) both}
.future-machine[data-phase="3"] .fm-result:nth-of-type(2) .fm-sequence{animation-delay:.3s}

/* A brief impulse on meaningful state changes, with stable reading between them. */
.cost-orbit:before{left:0;animation:v4-cost-travel 7s linear infinite}
.capacity-grid i{animation:v4-capacity-arrival .48s cubic-bezier(.2,.8,.2,1) both;animation-delay:var(--cell-delay,0ms)}
.roles-track article{transition-duration:.5s}
.roles-track article.active .role-signal{animation:v4-role-arrival .95s ease-out both}
.doubt-exhibit.is-fractured .euler-display>strong{animation:v4-counterexample-arrival 1.2s ease-out both}

@keyframes v4-source-signal{0%,100%{opacity:.45}45%{opacity:1}}
@keyframes v4-collision-arrival{0%{opacity:.7;transform:scale(.78)}58%{opacity:.55;transform:scale(1.65)}100%{opacity:.4;transform:scale(1.32)}}
@keyframes v4-path-arrival{from{stroke-dashoffset:1000}to{stroke-dashoffset:0}}
@keyframes v4-observation-arrival{0%{opacity:0;transform:translateY(5px)}70%{opacity:1;transform:translateY(-1px)}100%{opacity:1;transform:none}}
@keyframes v4-cost-travel{from{transform:translateX(0)}to{transform:translateX(400%)}}
@keyframes v4-capacity-arrival{0%{opacity:.15;transform:scale(.64)}65%{opacity:1;transform:scale(1.055)}100%{opacity:1;transform:scale(1)}}
@keyframes v4-role-arrival{0%{box-shadow:0 0 0 0 #b5e6d15e,0 0 10px #b5e6d14d}65%{box-shadow:0 0 0 13px #b5e6d100,0 0 30px #b5e6d170}100%{box-shadow:0 0 0 7px #b5e6d10b,0 0 25px #b5e6d170}}
@keyframes v4-counterexample-arrival{0%{text-shadow:0 0 0 #e6bd8600}25%{text-shadow:0 0 26px #e6bd8666}100%{text-shadow:0 0 0 #e6bd8600}}

/* Explicitly retain the shared pause contract after all V4 motion declarations. */
.motion-paused *, .motion-paused *:before, .motion-paused *:after,
.future-machine[data-active="false"] *, .future-machine[data-paused="true"] *{animation-play-state:paused!important}
.motion-paused .reveal{opacity:1;transform:none;transition:none}
.motion-paused .capacity-grid i{animation:none!important;opacity:1;transform:none}
.motion-paused .euler-display>strong,.motion-paused .roles-track .role-signal{animation:none!important}
.future-machine[data-paused="true"] .fm-collision-ring,
.future-machine[data-paused="true"] .fm-split-route,
.future-machine[data-paused="true"] .fm-result .fm-sequence{animation:none!important;stroke-dashoffset:0}
@media(prefers-reduced-motion:reduce){
  *,*:before,*:after{animation:none!important;transition:none!important}
  .js-ready .reveal,.capacity-grid i{opacity:1!important;transform:none!important}
  .future-machine .fm-split-route{stroke-dashoffset:0}
}

.motion-paused .future-machine *{transition:none!important}
