{const pre=document.getElementById("c");for(const l of lines){await new Promise(r=>{let i=0;const t=setInterval(()=>{pre.textContent+=l[i]||"";i++;if(i>l.length){clearInterval(t);pre.textContent+="\\n";setTimeout(r,140)}},12)})}})(); /* helpers */ const walker=document.getElementById("walk"); function setOff(p){walker.style.offsetDistance=(p%100)+"%"} function animTo(target,d=1200){return new Promise(res=>{const s=parseFloat(getComputedStyle(walker).offsetDistance)||0,df=target-s,t0=performance.now();(function f(n){const p=Math.min(1,(n-t0)/d),e=p<.5?2*p*p:-1+(4-2*p)*p;setOff(s+df*e);if(p<1)requestAnimationFrame(f);else res()})(t0)})} function angPct(a){return((a%360)+360)%360/360*100} function cen(el){const b=el.getBBox(),m=el.getCTM();return{x:m.e+b.x+b.width/2,y:m.f+b.y+b.height/2}} function svgPage(svg,pt){const r=svg.getBoundingClientRect(),vb=svg.viewBox.baseVal;return{x:r.left+pt.x*(r.width/vb.width),y:r.top+pt.y*(r.height/vb.height)}} /* sparks */ function sparks(x,y,c=8){for(let i=0;i
s.remove(),650)}} /* main sequence */ (async()=>{ const svg=document.querySelector(".orb"), A=document.getElementById("L1"); setOff(0); await new Promise(r=>setTimeout(r,900)); await animTo(18,1200); await animTo(40,1500); const c=cen(A), ang=Math.atan2(c.y-210,c.x-210)*180/Math.PI, pt=angPct(ang); await animTo(pt-6,900); await animTo(pt,700); A.style.transition="opacity 240ms ease"; A.style.opacity=.1; const from=svgPage(svg,c), h=document.getElementById("hand").getBoundingClientRect(), hc={x:h.left+h.width/2,y:h.top+h.height/2}; const carry=document.createElement("div");carry.style.position="fixed";carry.style.left=from.x+"px";carry.style.top=from.y+"px";carry.style.transform="translate(-50%,-50%)";carry.style.pointerEvents="none";carry.style.zIndex=9999; carry.innerHTML=\'
A
\'; document.body.appendChild(carry); const dx=hc.x-from.x, dy=hc.y-from.y; carry.animate([{transform:"translate(-50%,-50%) scale(1)"},{transform:`translate(calc(-50% + ${dx*.6}px), calc(-50% + ${dy*.6}px)) scale(.94)`},{transform:`translate(calc(-50% + ${dx}px), calc(-50% + ${dy}px)) scale(.9)`}],{duration:520,easing:"cubic-bezier(.2,.9,.3,1)",fill:"forwards"}); sparks(hc.x,hc.y,10); await new Promise(r=>setTimeout(r,560)); await animTo(pt+20,1600); await animTo(pt+46,2000); const drop=svgPage(svg,c), rc=carry.getBoundingClientRect(), dx2=drop.x-(rc.left+rc.width/2), dy2=drop.y-(rc.top+rc.height/2); const da=carry.animate([{transform:"translate(-50%,-50%) scale(.92) rotate(0deg)"},{transform:`translate(calc(-50% + ${dx2}px), calc(-50% + ${dy2}px)) scale(1) rotate(-6deg)`}],{duration:680,easing:"cubic-bezier(.2,.9,.3,1)",fill:"forwards"}); await new Promise(r=>setTimeout(r,380)); A.style.opacity=1; await da.finished; carry.remove(); sparks(drop.x,drop.y,8); let per=pt+6;(function loop(){setOff(per);per+=.12;requestAnimationFrame(loop)})(); document.getElementById("p").addEventListener("click",()=>location.reload()); })();