(()=>{ const media=matchMedia('(prefers-reduced-motion:reduce)'); const header=document.querySelector('.site-header');let scheduled=false; function updateHeader(){header.classList.toggle('is-scrolled',scrollY>16);scheduled=false} addEventListener('scroll',()=>{if(!scheduled){scheduled=true;requestAnimationFrame(updateHeader)}},{passive:true});updateHeader(); const recipes=[ ['[data-reviewed-loop]','reviewed-loop','Scope → link → human review → proposed action → preserve','reviewed evidence loop'], ['.atlas-geography','atlas','Locate → trace','jurisdiction map'], ['.hero-invoice','invoice','Candidate → hold','invoice evidence'], ['.source-document','source','Entity → state → source','certificate source'], ['.mini-link','linkage','Sale → candidate','transaction linkage'], ['.mini-request','request','Draft → approval gate','request draft'], ['.mini-checks','checks','Inspect each field','jurisdiction checklist'], ['.mini-stack','packet','Index → versions → decisions','audit packet'], ['.mini-bars','bars','GL → engine → evidence','reconciliation'], ['.preview-workbench','workbench','Queue → source → correction','evidence workbench'], ['.control-boundary','boundary','Read → suggest → blocked action','permission boundary'] ]; const workflows=[ ['transaction-linkage','Sale → source → mismatch review','transaction linkage'], ['certificate-remediation','Exception → request draft → owner gate','certificate remediation'], ['jurisdiction-checklists','State context → source → field review','jurisdiction checklist'], ['audit-packets','Sources → versions → indexed review trail','audit packet'], ['monthly-reconciliation','GL → engine → evidence → difference','monthly reconciliation'] ]; workflows.forEach(([slug,caption,name])=>{ recipes.unshift(['[data-workflow-hero="'+slug+'"]','workflow-hero',caption,name+' hero']); recipes.unshift(['[data-workflow-evidence="'+slug+'"]','workflow-evidence',caption,name+' evidence']); }); const states=[]; const observer=new IntersectionObserver(entries=>entries.forEach(entry=>{ const root=entry.target;root.classList.toggle('sequence-offscreen',!entry.isIntersecting); if(entry.isIntersecting&&!root.dataset.sequenceStarted){root.dataset.sequenceStarted='true';root.classList.add('sequence-running')} }),{threshold:.16}); function replay(root){if(media.matches)return;root.classList.remove('sequence-running');void root.offsetWidth;root.classList.add('sequence-running');root.dataset.sequenceStarted='true'} recipes.forEach(([selector,type,caption,name])=>document.querySelectorAll(selector).forEach((root)=>{ if(root.closest('[data-workflow-hero],[data-workflow-evidence],[data-reviewed-loop]') && !root.matches('[data-workflow-hero],[data-workflow-evidence],[data-reviewed-loop]'))return; root.classList.add('sequence-ready');root.dataset.sequence=type; if(type==='reviewed-loop'){ const delays=[0,700,1400,2800,3500]; root.querySelectorAll('.mobile-flow > div').forEach((row,i)=>{row.classList.add('loop-mobile-step');row.style.setProperty('--loop-delay',delays[i]+'ms')}); root.querySelector('.scene-mobile > .badge')?.classList.add('loop-mobile-gate'); } if(type==='workflow-hero'){ const parts=root.querySelectorAll('.scene-svg > .settle,.scene-svg > .trace,.scene-svg > .bar'); parts.forEach((part,i)=>{ part.setAttribute('data-motion-stage',part.classList.contains('trace')?'trace':part.classList.contains('bar')?'bar':'panel'); part.style.setProperty('--stage-delay',i*650+'ms'); if(part.tagName.toLowerCase()==='g')part.querySelectorAll('text').forEach((text,j)=>{text.setAttribute('data-motion-stage','ink');text.style.setProperty('--stage-delay',(i*650+j*110+180)+'ms')}); }); root.querySelectorAll('.scene-mobile > *').forEach((part,i)=>{part.setAttribute('data-motion-stage','panel');part.style.setProperty('--stage-delay',i*450+'ms')}); } if(type==='workflow-evidence'){ const mini=root.firstElementChild; mini.setAttribute('data-motion-stage','panel');mini.style.setProperty('--stage-delay','0ms'); mini.querySelectorAll(':scope > div,:scope > b,:scope > span,:scope > i').forEach((part,i)=>{ part.setAttribute('data-motion-stage',part.matches('.mini-connector,.mock-line')?'line':'panel');part.style.setProperty('--stage-delay',400+i*400+'ms'); }); mini.querySelectorAll('.mini-bars i').forEach((bar,i)=>{bar.setAttribute('data-motion-stage','bar');bar.style.setProperty('--stage-delay',400+i*650+'ms')}); const meta=root.querySelector('.detail-meta');meta.setAttribute('data-motion-stage','panel');meta.style.setProperty('--stage-delay','2000ms'); [...meta.children].forEach((part,i)=>{part.setAttribute('data-motion-stage','ink');part.style.setProperty('--stage-delay',2200+Math.floor(i/2)*650+'ms')}); } if(type==='workflow-hero'){ root.querySelectorAll('.scene-mobile .mini-link > div,.scene-mobile .mini-link > i,.scene-mobile .mini-request > *,.scene-mobile .mini-checks > div,.scene-mobile .mini-stack > div,.scene-mobile .mini-bars > div').forEach((part,i)=>{ part.setAttribute('data-motion-stage',part.matches('.mini-connector,.mock-line')?'line':'panel');part.style.setProperty('--stage-delay',600+i*400+'ms'); }); root.querySelectorAll('.scene-mobile .mini-bars i').forEach((part,i)=>{part.setAttribute('data-motion-stage','bar');part.style.setProperty('--stage-delay',600+i*650+'ms')}); } if(type==='workflow-hero'||type==='workflow-evidence')root.querySelectorAll('.stack-sheet.front > span:not(.tiny)').forEach((part,i)=>{part.setAttribute('data-motion-stage','ink');part.style.setProperty('--stage-delay',1100+i*500+'ms')}); const shell=document.createElement('div');shell.className='sequence-shell';root.before(shell);shell.append(root); const controls=document.createElement('div');controls.className='sequence-controls'; const text=document.createElement('span');text.className='sequence-caption';text.textContent=caption+' · illustrative'; const button=document.createElement('button');button.type='button';button.className='sequence-replay';button.setAttribute('aria-label','Replay '+name+' sequence'); button.innerHTML='Replay'; button.addEventListener('click',()=>replay(root));controls.append(text,button);shell.append(controls); if(type==='atlas')root.querySelectorAll('.atlas-map path').forEach((path,i)=>path.style.setProperty('--state-delay',(i%10)*65+'ms')); states.push({root,button,name});observer.observe(root); })); function applyPreference(){states.forEach(({root,button,name})=>{button.disabled=media.matches;button.querySelector('span').textContent=media.matches?'Still state':'Replay';button.setAttribute('aria-label',(media.matches?'Reduced-motion still state for ':'Replay ')+name+(media.matches?'':' sequence'))})} media.addEventListener('change',applyPreference);applyPreference(); })();