/* Ortivs v3 · the decision flow (REQ-0070). Loaded after r9.css. Everything is scoped under html.fl-on (set by OrtFlow.init)
   or to the flow's own classes, so removing the script restores the page exactly. No keyframe loops: every value is written
   by the conductor's frame. Type floors: labels 13 px, body 16 px (inherited from r9; nothing here goes smaller). */

/* the flow's canvas: spans the whole stage, above the mark, under the labels and the readout */
.fl-cv{position:absolute;pointer-events:none;z-index:1;display:block}
.fl-cvm{left:0;top:0;width:100%;height:100%;z-index:4}
.orr .stn{z-index:2}

/* 3 · nodes ignite: the current label lifts 4 px and brightens; past labels stay lit, future labels are cold */
.fl-on .stn .nm,.fl-on .stn .k{transition:color .5s var(--ease),transform .6s var(--ease),opacity .5s var(--ease)}
.fl-on .stn.cur .nm,.fl-on .stn.cur .k,.fl-on .stn.cur .dr{transform:translate3d(0,-4px,0)}
.fl-on .stn.cur .nm{color:#fff}
.fl-on .stn:not(.cur):not(.past) .nm{color:#b9c2d0}
/* the loop closes: Reality reads as "next" while the pulse lands on it */
.fl-on .stn.fl-next .nm{color:#fff}.fl-on .stn.fl-next .k{color:var(--ice)}

/* 5 · the odometer numeral: two wheels; only the ones wheel rolls (01-07) */
.fl-odo{display:inline-flex;vertical-align:top;line-height:1;height:1em;overflow:hidden;padding:0 .02em}
.fl-dw{display:block;height:1em;overflow:hidden}
.fl-ds{display:block;line-height:1;will-change:transform}
.fl-roll>span{display:block;height:1em;line-height:1}
.fl-sr,.fl-on .ro-name .fl-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.fl-on .ro-up{bottom:12px}
/* the step word: letters crossfade in place (old and new share one grid cell, so nothing shifts) */
.fl-nw{display:inline-grid;justify-items:center}
.fl-word{grid-area:1/1;white-space:nowrap}
.fl-word>span{display:inline-block}

/* 7 · ledger writing: the row hairline draws under each row (label first, then value) */
.fl-on .rec dt,.fl-on .rec dd{position:relative;border-top-color:transparent}
.fl-on .rec dt::before,.fl-on .rec dd::before{content:"";position:absolute;left:0;right:0;top:-1px;height:1px;background:rgba(219,228,242,.16);transform-origin:0 50%;transform:scaleX(var(--hk,1))}
.fl-on .rec dd::before{left:-1px}
.fl-on .rec-meta .tag{transform-origin:50% 50%;backface-visibility:hidden}

/* the chosen option receives the gold path at its lower edge: a small socket where the light lands */
.fl-on .opt{overflow:visible}
.fl-on .opt.yes.fl-land::after{content:"";position:absolute;left:50%;bottom:-3px;width:5px;height:5px;margin-left:-2.5px;border-radius:50%;background:#f6dca4;box-shadow:0 0 0 2px #05070b}

/* reduced motion: the labels switch the still (buttons, 44 px targets) */
.fl-rm .stn.fl-btn{cursor:pointer;pointer-events:auto;padding:10px 6px;margin:-10px -6px;min-height:44px;justify-content:center}
.fl-rm .stn.fl-btn:hover .nm{color:#fff}
.fl-rm .stn.fl-btn:focus-visible{outline:2px solid var(--gold);outline-offset:2px}

/* the centre groups (state / hold statement) leave on a symmetric curve: the page's steep ease-out dropped .47 in one frame */
.fl-on .readout .grp.off{transition-timing-function:cubic-bezier(.45,0,.55,1);transition-duration:.34s}

/* r12: the Decision label sits in the ring's glow. Lift it 10 px up and away from the node, and give it a tighter, darker keyline */
.fl-on .stn.gate{margin:-12px 0 0 8px}
.fl-on .stn.gate .nm,.fl-on .stn.gate .k{text-shadow:0 0 2px #05070b,0 0 4px #05070b,0 1px 8px #05070b,0 0 16px rgba(5,7,11,.95),0 0 28px rgba(5,7,11,.8)}
