forwardfig 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,481 @@
1
+ var B0=Object.defineProperty;var K0=(V)=>V;function Q0(V,X){this[V]=K0.bind(null,X)}var I0=(V,X)=>{for(var K in X)B0(V,K,{get:X[K],enumerable:!0,configurable:!0,set:Q0.bind(X,K)})};var TV={};I0(TV,{waveform:()=>J4,voxels:()=>X4,vector:()=>k0,thin:()=>L0,text:()=>V0,tensor:()=>w0,stack:()=>u0,sphere:()=>e0,space:()=>s0,softmax:()=>l0,preset:()=>JJ,pool:()=>o0,pointcloud:()=>n0,op:()=>wV,norm:()=>b0,neurons:()=>T0,mul:()=>B4,mlp:()=>h0,mha:()=>m0,matrix:()=>U4,matmul:()=>c0,magnify:()=>$4,loss:()=>t0,linear:()=>g0,layer:()=>TJ,image:()=>V4,gaussian:()=>r0,figure:()=>F4,ffn:()=>f0,enc:()=>v0,embed:()=>x0,dropout:()=>a0,dec:()=>z0,conv:()=>d0,configure:()=>K4,concat:()=>p0,circle:()=>S0,block:()=>j0,attention:()=>y0,add:()=>Y4,act:()=>i0,Tensor:()=>jJ,Module:()=>U0,Graph:()=>zV,Figure:()=>uV});var gV='Inter,"Helvetica Neue",Helvetica,Arial,sans-serif',lV='"Latin Modern Math","STIX Two Math","Cambria Math","Times New Roman",serif',nJ;function AV(V){nJ=V,WV.clear()}var cV=()=>{let V=globalThis.MathJax;return V?.tex2svg?(X)=>V.tex2svg(X,{display:!1}).querySelector("svg")?.outerHTML??"":null},_0=(V,X)=>{let K=nJ===void 0?cV():nJ;if(!K)return null;let Y;try{Y=K(V)}catch{return null}let I=/viewBox="([^"]+)"/.exec(Y)?.[1];if(!I)return null;let[,O,D,F]=I.trim().split(/[\s,]+/).map(Number),E=X/1000;return{inner:Y.replace(/^<svg[^>]*>/,"").replace(/<\/svg>\s*$/,""),viewBox:I,w:D*E,asc:-O*E,desc:(F+O)*E}},aJ=(V)=>{let X={},K=V.split(" ");for(let Y=0;Y<K.length;Y+=2)X[K[Y]]=K[Y+1];return X},kV=aJ("alpha α beta β gamma γ delta δ epsilon ϵ varepsilon ε zeta ζ eta η theta θ vartheta ϑ iota ι kappa κ lambda λ mu μ nu ν xi ξ pi π rho ρ sigma σ tau τ upsilon υ phi ϕ varphi φ chi χ psi ψ omega ω Gamma Γ Delta Δ Theta Θ Lambda Λ Xi Ξ Pi Π Sigma Σ Phi Φ Psi Ψ Omega Ω"),mV=aJ("cdot · times × oplus ⊕ otimes ⊗ odot ⊙ to → rightarrow → leftarrow ← gets ← Rightarrow ⇒ leftrightarrow ↔ mapsto ↦ sum ∑ prod ∏ int ∫ infty ∞ partial ∂ nabla ∇ in ∈ notin ∉ sim ∼ approx ≈ propto ∝ leq ≤ le ≤ geq ≥ ge ≥ neq ≠ ne ≠ pm ± mp ∓ ldots … dots … cdots ⋯ vdots ⋮ mid ∣ | ‖ ast ∗ star ⋆ circ ∘ bullet • forall ∀ exists ∃ emptyset ∅ cup ∪ cap ∩ subset ⊂ subseteq ⊆ top ⊤ perp ⊥ langle ⟨ rangle ⟩ ell ℓ hbar ℏ dagger † prime ′ { { } } % % _ _ # # & & $ $"),xJ={};for(let V of"+−×·±∓⊕⊗⊙∘∗⋆∪∩")xJ[V]="bin";for(let V of"=<>≤≥≠≈∼∝∈∉⊂⊆→←⇒↔↦∣")xJ[V]="rel";for(let V of",;")xJ[V]="punct";xJ["|"]="mid";for(let V of"([⟨")xJ[V]="open";for(let V of")]⟩")xJ[V]="close";var O0=new Set("log exp ln sin cos tanh max min arg argmax argmin softmax lim det tr sup inf Pr KL diag sign".split(" ")),yV=aJ("hat ̂ widehat ̂ tilde ̃ widetilde ̃ bar ̄ overline ̅ dot ̇ ddot ̈ vec ⃗"),fV=aJ(",   :   ;   quad   qquad    ! ​"),Z0=aJ("B ℬ E ℰ F ℱ H ℋ I ℐ L ℒ M ℳ R ℛ"),F0=aJ("C ℂ H ℍ N ℕ P ℙ Q ℚ R ℝ Z ℤ"),hV=(V)=>Z0[V]||(/[A-Z]/.test(V)?String.fromCodePoint(119964+V.charCodeAt(0)-65):V),D0=(V)=>F0[V]||(/[A-Z]/.test(V)?String.fromCodePoint(120120+V.charCodeAt(0)-65):/\d/.test(V)?String.fromCodePoint(120792+ +V):V),bV={mathbf:{up:!0,b:!0},bf:{up:!0,b:!0},boldsymbol:{b:!0},bm:{b:!0},mathrm:{up:!0},rm:{up:!0},operatorname:{up:!0},mathit:{},text:{up:!0,text:!0},textrm:{up:!0,text:!0},mathsf:{up:!0,sans:!0},textbf:{up:!0,b:!0,text:!0},mathcal:{up:!0,map:hV},mathscr:{up:!0,map:hV},mathbb:{up:!0,map:D0}},M0=new Set("left right big Big bigl bigr Bigl Bigr displaystyle".split(" "));function N0(V){let X=0,K=(O,D,F=!1)=>{if(D.text)return{t:O,it:!1,b:!!D.b,serif:!D.sans};if(O==="-")O="−";return{t:O,it:F&&!D.up,b:!!D.b,serif:!D.sans,cls:xJ[O]}};function Y(O,D){let F=[];while(X<V.length){let E=V[X];if(E===D){X++;break}if(E==="^"||E==="_"){X++;let S=E==="^"?"sup":"sub",j=F[F.length-1];if(!j||"t"in j||j[S])F.push(j={});j[S]=I(O);continue}if(E===" "&&!O.text){X++;continue}F.push(...I(O))}return F}function I(O){while(V[X]===" "&&!O.text)X++;let D=V[X++];if(D===void 0)return[];if(D==="{")return Y(O,"}");if(D!=="\\")return[K(O.map?O.map(D):D,O,/[A-Za-z]/.test(D)&&!O.map)];let F=/^[A-Za-z]+/.exec(V.slice(X))?.[0]||V[X]||"";if(X+=F.length,kV[F])return[K(kV[F],O,/^[a-z]/.test(F))];if(mV[F])return[K(mV[F],O)];if(fV[F])return[K(fV[F],O)];if(O0.has(F))return[K(F,{...O,up:!0})];if(bV[F])return I({...O,...bV[F]});if(yV[F]){let E=I(O),S=E.find((j)=>("t"in j));if(S)S.t+=yV[F];return E}if(F==="frac"){let E=I(O),S=I(O);return[...E,K("/",O),...S]}if(F==="sqrt")return[K("√",O),...I(O)];if(M0.has(F))return[];return[K(F,{...O,up:!0})]}return Y({})}var WV=new Map,eJ,xV=new Map;function G0(V,X,K,Y){return`${X?"italic ":""}${K===!0?700:K||400} ${V}px ${Y?'"Latin Modern Math","STIX Two Math","Cambria Math","Times New Roman",serif':'Inter,"Helvetica Neue",Helvetica,Arial,sans-serif'}`}function C0(V){if(/[iljI.,:;'|! ]/.test(V))return 0.28;if(/[mwMW]/.test(V))return 0.86;if(/[A-Z]/.test(V))return 0.68;if(/[̀-ͯ⃗​]/.test(V))return 0;if(/[ -鿿＀-￯]/.test(V))return 1;if(V===" ")return 0.28;return 0.56}function W0(V,X,K){let Y=X+"\x00"+V,I=xV.get(Y);if(I!==void 0)return I;if(eJ===void 0)eJ=typeof document<"u"?document.createElement("canvas").getContext("2d"):null;if(eJ)eJ.font=X,I=eJ.measureText(V).width;else{I=0;for(let O of V)I+=C0(O)*K}return xV.set(Y,I),I}function qJ(V,X,K=400){let Y=V+"\x00"+X+"\x00"+K+"\x00"+(nJ===void 0?!!cV():!!nJ),I=WV.get(Y);if(I)return I;let O=[],D=[];for(let S of V.split(/\n|\\\\|<br\s*\/?>/)){let j=[],f=0,v=(d,h,k,MJ=!1)=>{let UJ="",s=!1,OJ="",VJ=!1;for(let t of d)if("t"in t){let IJ=t.cls??"ord",ZJ=!UJ||UJ==="bin"||UJ==="rel"||UJ==="open"||UJ==="punct";if(IJ==="bin"&&ZJ)IJ="ord";else if(IJ==="mid"&&(ZJ||VJ))IJ=VJ?"close":"open",VJ=!VJ;let NJ=0;if(MJ&&UJ&&IJ!=="punct"&&IJ!=="close"&&UJ!=="open"){if(IJ==="rel"!==(UJ==="rel"))NJ=0.2777777777777778;else if(IJ==="bin"||UJ==="bin")NJ=0.2222222222222222;else if(UJ==="punct"||IJ==="mid"||UJ==="mid")NJ=0.16666666666666666}if(s&&!t.it&&IJ!=="punct")NJ+=0.08;f+=NJ*k;let EJ=W0(t.t,G0(k,t.it,t.b||(t.serif?!1:K),t.serif),k),WJ=j[j.length-1];if(!NJ&&WJ&&WJ.dy===h&&WJ.size===k&&WJ.it===t.it&&WJ.b===t.b&&WJ.serif===t.serif)WJ.t+=t.t;else j.push({t:t.t,x:f,dy:h,size:k,it:t.it,b:t.b,serif:t.serif});f+=EJ,UJ=IJ,s=t.it,OJ=t.t.slice(-1)}else{let IJ=f,ZJ=Math.max(k*0.72,Math.min(k,8.5)),NJ=IJ,EJ=IJ;if(t.sup)f=IJ+(s?(OJ==="f"?0.2:0.08)*k:0),v(t.sup,h-k*0.38,ZJ),NJ=f,f=IJ;if(t.sub)v(t.sub,h+k*0.24,ZJ),EJ=f;f=Math.max(NJ,EJ)+0.06*k,s=!1}};S.split("$").forEach((d,h)=>{let k=h%2?_0(d,X*1.1):null;if(k)j.push({t:"",x:f,dy:0,size:X,it:!1,b:!1,serif:!0,math:k}),f+=k.w;else if(h%2)v(N0(d),0,X*1.1,!0);else if(d)v([{t:d,it:!1,b:!1,serif:!1}],0,X)}),O.push(j),D.push(f)}let F=X*1.3,E={lines:O,widths:D,w:Math.max(0,...D),h:O.length*F,lh:F,size:X};return WV.set(Y,E),E}var RV=13,EV=new Set(["tensor","stack","matrix","voxels","image","magnify","neurons","gaussian","space","sphere","pointcloud","waveform"]),qV=(V)=>JSON.parse(V.attrs.values??"[]"),PV=(V,X)=>+V.attrs.fontSize||(V.shape==="thin"||V.shape==="vector"||EV.has(V.shape)?X-1:X),_V=(V)=>{let X=(+V.tilt||0)*Math.PI/180,K=(+V.rotate||0)*Math.PI/180,[Y,I]=[Math.cos(X),-Math.sin(X)*0.35],[O,D]=[Math.cos(K),Math.sin(K)];return[O*Y-D*I,D*Y+O*I,-D,O]},GJ=(V,X)=>V?V.split(",").map(Number):X,HV={"left-of":[-1,0],"right-of":[1,0],above:[0,-1],below:[0,1]},JV=14;function A0(V,X,K){let Y=PV(V,K),I=qJ(V.label,Y,500),O,D;switch(V.shape){case"thin":O=Math.max(I.w+26,64),D=I.h+9;break;case"op":O=D=22;break;case"circle":O=D=Math.max(42,I.w+18,I.h+16);break;case"tensor":{let[F,E,S]=GJ(V.attrs.size,[36,64,20]);O=F+S*0.6,D=E+S*0.6;break}case"stack":{let[F,E]=GJ(V.attrs.size,[44,60]),S=+V.attrs.n||4,j=+V.attrs.offset||7;O=F+(S-1)*j,D=E+(S-1)*j;break}case"enc":case"dec":if(X)O=I.w+40,D=Math.max(84,I.h+44);else O=Math.max(I.w+64,120),D=Math.max(52,I.h+26);break;case"neurons":{let F=(+V.attrs.n||4)*20+4;[O,D]=X?[22,F]:[F,22];break}case"vector":{let F=qV(V),E=Math.max(36,...F.map((j)=>qJ(j.trim(),Y).w+14)),S=Math.max(20,Y+8);[O,D]=X?[E,F.length*S+4]:[F.length*E+4,S+2];break}case"image":{let[F,E]=GJ(V.attrs.size,[64,64]),S=+V.attrs.n||1,j=F+(S-1)*6,f=E+(S-1)*6,[v,d,h,k]=_V(V.attrs);O=Math.abs(v)*j+Math.abs(h)*f,D=Math.abs(d)*j+Math.abs(k)*f;break}case"magnify":[O,D]=GJ(V.attrs.size,[64,64]);break;case"matrix":{let F=+V.attrs.cellSize||16;O=+V.attrs.cols*F,D=+V.attrs.rows*F;break}case"voxels":{let F=+V.attrs.cellSize||16,E=+V.attrs.depth*F*0.5;O=+V.attrs.cols*F+E,D=+V.attrs.rows*F+E;break}case"gaussian":[O,D]=GJ(V.attrs.size,[120,84]);break;case"space":[O,D]=GJ(V.attrs.size,[110,100]);break;case"sphere":[O,D]=GJ(V.attrs.size,[84,84]);break;case"pointcloud":[O,D]=GJ(V.attrs.size,[100,84]);break;case"waveform":[O,D]=GJ(V.attrs.size,[120,44]);break;case"text":O=I.w+8,D=I.h+4;break;default:O=Math.max(I.w+30,76),D=I.h+18}V.w=+V.attrs.w||O,V.h=+V.attrs.h||D}function VV(V){let X=V.dir==="LR"||V.dir==="RL",[K,Y]=V.gap??(X?[56,36]:[30,44]),I=[...V.nodes.values()],O=V.fontSize??RV;for(let $ of I)A0($,X,O);let D=($)=>X?$.w:$.h,F=($)=>X?$.h:$.w,E=($,B)=>V.dir==="TB"?[B,$]:V.dir==="BT"?[B,-$]:V.dir==="LR"?[$,B]:[-$,B],S=($,B)=>V.dir==="TB"?[B,$]:V.dir==="BT"?[-B,$]:V.dir==="LR"?[$,B]:[-$,B],j=($)=>("at"in $.attrs)||Object.keys(HV).some((B)=>(B in $.attrs)),f=I.filter(($)=>!j($)),v=new Set(f.map(($)=>$.id)),d=new Map(f.map(($)=>[$.id,$.id])),h=($)=>{while(d.get($)!==$)$=d.get($);return $};for(let $ of V.ranks)for(let B of $.slice(1))if(v.has(B)&&v.has($[0]))d.set(h(B),h($[0]));let k=new Map;for(let $ of V.edges){if(!v.has($.from)||!v.has($.to))continue;let B=h($.from),_=h($.to);if(B===_)continue;if(!k.has(B))k.set(B,[]);k.get(B).push({to:_,e:$})}let MJ=new Set,UJ=new Map,s=[],OJ=($)=>{UJ.set($,1);for(let{to:B,e:_}of k.get($)??[]){let G=UJ.get(B);if(G===1)MJ.add(_);else if(!G)OJ(B)}UJ.set($,2),s.push($)};for(let $ of f)if(!UJ.has(h($.id)))OJ(h($.id));let VJ=new Map;for(let $ of s.reverse()){let B=VJ.get($)??0;VJ.set($,B);for(let{to:_,e:G}of k.get($)??[])if(!MJ.has(G))VJ.set(_,Math.max(VJ.get(_)??0,B+1))}let t=($)=>VJ.get(h($.id)),IJ=new Map;for(let $ of V.edges)if(v.has($.from)&&v.has($.to)&&!MJ.has($)&&!$.flags.has("skip")&&!$.flags.has("join")){if(!IJ.has($.to))IJ.set($.to,[]);IJ.get($.to).push(V.nodes.get($.from))}let ZJ=new Map,NJ=new Set,EJ=new Set,WJ=0;for(let $ of[...f].sort((B,_)=>t(B)-t(_)||B.order-_.order)){let B=t($),_=(u)=>!EJ.has(B+":"+u),G=$.attrs.lane!==void 0?+$.attrs.lane:$.attrs.align?ZJ.get($.attrs.align):void 0;if(G===void 0){let u=(IJ.get($.id)??[]).filter((J)=>t(J)<B),W=u.map((J)=>ZJ.get(J.id));if(u.length>1&&u.every((J)=>t(J)===t(u[0]))&&new Set(W).size===W.length){let J=W.reduce((U,Q)=>U+Q)/W.length;if(_(J))G=J}else for(let J of u){let U=ZJ.get(J.id);if(!NJ.has(J.id)&&_(U)){G=U,NJ.add(J.id);break}}if(G===void 0&&!u.length)for(let J of V.edges){if(J.from!==$.id||!MJ.has(J)||!ZJ.has(J.to)||NJ.has(J.to))continue;let U=ZJ.get(J.to);if(_(U)){G=U,NJ.add(J.to);break}}}if(G===void 0||!_(G)){while(!_(WJ))WJ++;G=WJ}WJ=Math.max(WJ,Math.floor(G)+1),EJ.add(B+":"+G),ZJ.set($.id,G)}let LJ=Math.max(0,...[...ZJ.values()].map(Math.ceil))+1,cJ=Math.max(0,...f.map(t))+1,SJ=Array(LJ).fill(0),vJ=Array(cJ).fill(0),kJ=Array.from({length:LJ},()=>new Set),mJ=Array.from({length:cJ},()=>new Set);for(let $ of f){let B=ZJ.get($.id),_=t($),G=$.groups.join();if(Number.isInteger(B))SJ[B]=Math.max(SJ[B],F($)),kJ[B].add(G);vJ[_]=Math.max(vJ[_],D($)),$.groups.forEach((u)=>mJ[_].add(u))}let YV=($,B)=>$.size!==B.size||[...$].some((_)=>!B.has(_)),pJ=Array(cJ).fill(K);for(let $ of V.edges){let B=V.nodes.get($.from),_=V.nodes.get($.to);if(!$.label||!v.has(B.id)||!v.has(_.id)||t(_)<=t(B))continue;let G=qJ($.label,O-1);pJ[t(_)]=Math.max(pJ[t(_)],X?G.w+24:G.h+16)}let yJ=[SJ[0]/2],fJ=[vJ[0]/2];for(let $=1;$<LJ;$++)yJ[$]=yJ[$-1]+SJ[$-1]/2+Y+(YV(kJ[$-1],kJ[$])?JV*2:0)+SJ[$]/2;for(let $=1;$<cJ;$++)fJ[$]=fJ[$-1]+vJ[$-1]/2+pJ[$]+(YV(mJ[$-1],mJ[$])?JV*1.5:0)+vJ[$]/2;let NV=($)=>{let B=Math.floor($),_=Math.ceil($);return yJ[B]+(yJ[_]-yJ[B])*($-B)},rJ=($)=>{let[B,_]=GJ($.attrs.nudge,[0,0]);$.x+=B,$.y+=_};for(let $ of f)[$.x,$.y]=E(fJ[t($)],NV(ZJ.get($.id))),rJ($);let hJ=I.filter(j),dJ=new Set(v);for(let $=0;hJ.length&&$<=I.length;$++)hJ=hJ.filter((B)=>{if(B.attrs.at)return[B.x,B.y]=GJ(B.attrs.at,[0,0]),rJ(B),dJ.add(B.id),!1;let _=Object.keys(HV).find((U)=>(U in B.attrs)),G=V.nodes.get(B.attrs[_]);if(!G)throw Error(`${B.id}: ${_} refers to unknown node "${B.attrs[_]}"`);if(!dJ.has(G.id))return!0;let[u,W]=HV[_],J=+B.attrs.dist||22;return B.x=G.x+u*(G.w/2+B.w/2+J),B.y=G.y+W*(G.h/2+B.h/2+J),rJ(B),dJ.add(B.id),!1});if(hJ.length)throw Error(`circular placement: ${hJ.map(($)=>$.id).join(", ")}`);let RJ=new Map;for(let $ of I){let[B,_]=S($.x,$.y);RJ.set($.id,{u:B,v:_,hu:D($)/2,hv:F($)/2})}let oJ=($,B,_)=>{for(let G=0;G+1<$.length;G++){let[u,W]=[$[G],$[G+1]],J=Math.min(u[0],W[0]),U=Math.max(u[0],W[0]),Q=Math.min(u[1],W[1]),Z=Math.max(u[1],W[1]);for(let[N,H]of RJ)if(N!==B&&N!==_&&J<H.u+H.hu+3&&U>H.u-H.hu-3&&Q<H.v+H.hv+3&&Z>H.v-H.hv-3)return!0}return!1},BV=[],bJ=($,B,_,G,u)=>{let W=$>0?u:G;for(let J=!0;J;){J=!1;for(let U of RJ.values())if(U.u-U.hu<_&&U.u+U.hu>B&&U.v+U.hv>G-1&&U.v-U.hv<u+1){let Q=$>0?U.v+U.hv:U.v-U.hv;if($>0?Q>W:Q<W)W=Q,J=!0,$>0?u=W:G=W}}W+=$*16;for(let J=!0;J;){J=!1;for(let U of BV)if(U.side===$&&U.a<_&&U.b>B&&Math.abs(U.v-W)<9)W+=$*9,J=!0}return BV.push({side:$,a:B,b:_,v:W}),W},KV=[],PJ=[];for(let $ of V.edges){let B=RJ.get($.from),_=RJ.get($.to),G=V.nodes.get($.from),u=V.nodes.get($.to);if($.op==="=>"&&G.shape==="neurons"&&u.shape==="neurons"){$.fc=!0;continue}if($.from!==$.to&&!$.flags.has("skip")&&_.u-_.hu>=B.u+B.hu+2){let W=Math.max(B.v-B.hv,_.v-_.hv)+6,J=Math.min(B.v+B.hv,_.v+_.hv)-6,U=W<=J?Math.min(J,Math.max(W,B.hv<=_.hv?B.v:_.v)):NaN;KV.push({e:$,S:B,T:_,ps:isNaN(U)?B.v:U,pt:isNaN(U)?_.v:U})}else PJ.push($)}let sJ=({e:$,S:B,T:_,ps:G,pt:u})=>{let W=B.u+B.hu,J=_.u-_.hu,U=(W+J)/2,Q=(N)=>[[W,G],[N,G],[N,u],[J,u]],Z=Math.abs(G-u)<0.5?[[[W,u],[J,u]]]:[Q(Math.max(U,J-K/2)),Q(Math.min(U,W+K/2))];if($.flags.has("join")&&Math.abs(G-_.v)>_.hv){let N=G>_.v?1:-1;Z.unshift([[W,G],[_.u,G],[_.u,_.v+N*_.hv]])}return Z.find((N)=>!oJ(N,$.from,$.to))},QV=KV.filter(($)=>sJ($)||(PJ.push($.e),!1)),iJ=new Map;for(let $ of QV){if(!iJ.has($.e.to))iJ.set($.e.to,[]);iJ.get($.e.to).push($)}let IV=($,B,_)=>{let G=$.map((J)=>J.pt),u=B?$.indexOf(B):0;for(let J=u+1;J<$.length;J++)G[J]=Math.max(G[J],G[J-1]+12);for(let J=u-1;J>=0;J--)G[J]=Math.min(G[J],G[J+1]-12);let W=Math.max(0,G[G.length-1]-(_.v+_.hv-5))-Math.max(0,_.v-_.hv+5-G[0]);return{pt:G.map((J)=>J-W),moved:W!==0}};for(let $ of iJ.values()){if($.length<2)continue;let B=$[0].T;$.sort((W,J)=>W.pt-J.pt||W.S.v-J.S.v);let _=$.filter((W)=>Math.abs(W.ps-W.pt)<0.5).sort((W,J)=>Math.abs(W.pt-B.v)-Math.abs(J.pt-B.v))[0],G=$,u=IV(G,_,B);if(_&&u.moved)G=$.filter((W)=>{if(W===_||Math.abs(W.S.v-B.v)<=B.hv)return!0;let J=W.S.v>B.v?1:-1,U=[[W.S.u+W.S.hu,W.S.v],[B.u,W.S.v],[B.u,B.v+J*B.hv]];if(oJ(U,W.e.from,W.e.to))return!0;return W.alt=U,!1}),u=IV(G,_,B);G.forEach((W,J)=>{W.pt=u.pt[J]});for(let W of G)if(Math.abs(W.pt-W.S.v)<W.S.hv-4)W.ps=W.pt}let zJ=($,B,_=0)=>{if($.pts=B.map(([G,u])=>E(G,u)),$.flags.has("curve")&&B.length===4)$.curve=_};for(let $ of QV){let B=$.alt??sJ($);if(B)zJ($.e,B,1);else PJ.push($.e)}let GV=($)=>V.edges.some((B)=>B!==$&&(B.from===$.from&&B.to===$.to||B.from===$.to&&B.to===$.from));for(let $=PJ.length-1;$>=0;$--){let B=PJ[$],_=RJ.get(B.from),G=RJ.get(B.to);if(B.from===B.to||B.flags.has("skip")||G.u+G.hu>_.u-_.hu-2||GV(B))continue;let u=_.u-_.hu,W=G.u+G.hu,J=G.v>_.v?1:-1,U=(u+W)/2,Q=Math.max(_.v-_.hv,G.v-G.hv)+6,Z=Math.min(_.v+_.hv,G.v+G.hv)-6,N=[];if(Q<=Z){let L=Math.min(Z,Math.max(Q,_.hv<=G.hv?_.v:G.v));N.push([[u,L],[W,L]])}else N.push([[_.u,_.v+J*_.hv],[_.u,G.v],[W,G.v]],[[u,_.v],[U,_.v],[U,G.v],[W,G.v]]);let H=N.find((L)=>!oJ(L,B.from,B.to));if(H)zJ(B,H,1),PJ.splice($,1)}for(let $ of PJ){let B=RJ.get($.from),_=RJ.get($.to),G=/^(left|top|-)/.test($.attrs.side??"")?-1:1,u=Math.min(B.v-B.hv,_.v-_.hv),W=Math.max(B.v+B.hv,_.v+_.hv);if($.from===$.to){let J=B.v+G*(B.hv+18);zJ($,[[B.u+B.hu*0.4,B.v+G*B.hv],[B.u+B.hu*0.4,J],[B.u-B.hu*0.4,J],[B.u-B.hu*0.4,B.v+G*B.hv]],1.33)}else if(!$.flags.has("skip")&&B.u-B.hu<_.u+_.hu&&_.u-_.hu<B.u+B.hu){let J=(Math.max(B.u-B.hu,_.u-_.hu)+Math.min(B.u+B.hu,_.u+_.hu))/2,U=_.v>B.v?1:-1;zJ($,[[J,B.v+U*B.hv],[J,_.v-U*_.hv]])}else if(_.u>B.u){let J=B.u+B.hu,U=Math.min(K/2,(_.u-_.hu-J)/2),Q=V.nodes.get($.from);if(V.nodes.get($.to).groups.some((H)=>!Q.groups.includes(H))){let H=Math.min(...[...RJ.values()].filter((L)=>L.u-L.hu>J+1&&L.u<_.u&&L.v+L.hv>u&&L.v-L.hv<W).map((L)=>L.u-L.hu));if(H-JV+6-J>6)U=H-JV+6-J}let N=bJ(G,J+U,_.u+_.hu,u,W);zJ($,[[J,B.v],[J+U,B.v],[J+U,N],[_.u,N],[_.u,_.v+G*_.hv]])}else{let J=bJ(G,Math.min(B.u-B.hu,_.u-_.hu),Math.max(B.u+B.hu,_.u+_.hu),u,W);zJ($,[[B.u,B.v+G*B.hv],[B.u,J],[_.u,J],[_.u,_.v+G*_.hv]],1.33)}}for(let $ of V.edges){if(!$.label||$.pts.length<2)continue;let B=qJ($.label,O-1),_=0,G=0;for(let N=0;N+1<$.pts.length;N++){let H=Math.hypot($.pts[N+1][0]-$.pts[N][0],$.pts[N+1][1]-$.pts[N][1]);if(H>_)_=H,G=N}if($.flags.has("join")&&$.pts.length===3)G=1;let[u,W]=[$.pts[G],$.pts[G+1]],J=$.pts[0],U=$.pts[$.pts.length-1],Q=(u[0]+W[0])/2,Z=(u[1]+W[1])/2;if(Math.abs(u[1]-W[1])<Math.abs(u[0]-W[0])){let N=Z>Math.max(J[1],U[1])+1;$.lx=Q,$.ly=Z+(N?1:-1)*(B.h/2+5)}else{let N=Q<Math.min(J[0],U[0])-1;$.lx=Q+(N?-1:1)*(B.w/2+7),$.ly=Z}}for(let $ of[...V.groups].reverse()){let B=1/0,_=1/0,G=-1/0,u=-1/0,W=(Q,Z,N=JV)=>{B=Math.min(B,Q-N),_=Math.min(_,Z-N),G=Math.max(G,Q+N),u=Math.max(u,Z+N)},J=new Set(I.filter((Q)=>Q.groups.includes($.id)).map((Q)=>Q.id));for(let Q of J){let Z=V.nodes.get(Q);W(Z.x-Z.w/2,Z.y-Z.h/2),W(Z.x+Z.w/2,Z.y+Z.h/2)}for(let Q of V.edges)if(J.has(Q.from)&&J.has(Q.to))for(let[Z,N]of Q.pts)W(Z,N);else if(J.has(Q.to)&&Q.pts.length===5)for(let[Z,N]of Q.pts.slice(2))W(Z,N,6);for(let Q of V.groups)if(Q.parent===$.id&&Q.w)W(Q.x,Q.y),W(Q.x+Q.w,Q.y+Q.h);if(B===1/0)continue;let U=$.label?18:0;Object.assign($,{x:B,y:_-U,w:G-B,h:u-_+U})}return V}var wJ,UV,tJ={},pV=new Map;function dV(V,X,K){let Y=V.createShader(X);if(V.shaderSource(Y,K),V.compileShader(Y),!V.getShaderParameter(Y,V.COMPILE_STATUS))throw Error(V.getShaderInfoLog(Y)??"shader");return Y}function $V(V,X){let K=V.createProgram();if(V.attachShader(K,dV(V,V.VERTEX_SHADER,`
2
+ attribute vec2 aPos;
3
+ varying vec2 vUv;
4
+ void main() {
5
+ vUv = aPos * 0.5 + 0.5;
6
+ gl_Position = vec4(aPos, 0.0, 1.0);
7
+ }`)),V.attachShader(K,dV(V,V.FRAGMENT_SHADER,X)),V.bindAttribLocation(K,0,"aPos"),V.linkProgram(K),!V.getProgramParameter(K,V.LINK_STATUS))throw Error(V.getProgramInfoLog(K)??"link");return K}function H0(){if(wJ!==void 0)return wJ;if(wJ=null,typeof document>"u")return wJ;try{UV=document.createElement("canvas"),UV.width=UV.height=1024;let V=UV.getContext("webgl",{preserveDrawingBuffer:!0,premultipliedAlpha:!1});if(!V)return wJ;V.bindBuffer(V.ARRAY_BUFFER,V.createBuffer()),V.bufferData(V.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,1,1]),V.STATIC_DRAW),V.enableVertexAttribArray(0),V.vertexAttribPointer(0,2,V.FLOAT,!1,0,0),tJ.ice=$V(V,`
8
+ precision highp float;
9
+ varying vec2 vUv;
10
+ uniform vec2 uRes;
11
+ uniform float uTime;
12
+ uniform float uIntensity;
13
+ uniform float uSeed;
14
+ uniform float uCover;
15
+
16
+ vec2 hash2(vec2 p) {
17
+ p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
18
+ return fract(sin(p + uSeed) * 43758.5453);
19
+ }
20
+
21
+ float noise(vec2 p) {
22
+ vec2 i = floor(p);
23
+ vec2 f = fract(p);
24
+ vec2 u = f * f * (3.0 - 2.0 * f);
25
+ float a = hash2(i).x;
26
+ float b = hash2(i + vec2(1.0, 0.0)).x;
27
+ float c = hash2(i + vec2(0.0, 1.0)).x;
28
+ float d = hash2(i + vec2(1.0, 1.0)).x;
29
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
30
+ }
31
+
32
+ float fbm(vec2 p) {
33
+ float v = 0.0;
34
+ float a = 0.5;
35
+ for (int i = 0; i < 5; i++) {
36
+ v += a * noise(p);
37
+ p = p * 2.03 + 11.7;
38
+ a *= 0.5;
39
+ }
40
+ return v;
41
+ }
42
+
43
+ // Both materials share one block outline: a rounded rectangle with a bevel.
44
+ const float BEVEL = 9.0;
45
+
46
+ // Inside distance to the edge of a rounded rectangle filling the canvas.
47
+ float inside(vec2 px) {
48
+ vec2 hs = uRes * 0.5;
49
+ float r = 7.0;
50
+ vec2 q = abs(px - hs) - (hs - r);
51
+ return -(length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r);
52
+ }
53
+
54
+ // Distance to the nearest Voronoi cell border: thin values are cracks.
55
+ float cells(vec2 p) {
56
+ vec2 n = floor(p);
57
+ vec2 f = fract(p);
58
+ float d1 = 8.0;
59
+ float d2 = 8.0;
60
+ for (int j = -1; j <= 1; j++) {
61
+ for (int i = -1; i <= 1; i++) {
62
+ vec2 g = vec2(float(i), float(j));
63
+ vec2 r = g + hash2(n + g) - f;
64
+ float d = dot(r, r);
65
+ if (d < d1) { d2 = d1; d1 = d; }
66
+ else if (d < d2) { d2 = d; }
67
+ }
68
+ }
69
+ return sqrt(d2) - sqrt(d1);
70
+ }
71
+
72
+
73
+ float ridge(vec2 p) {
74
+ float v = 0.0;
75
+ float a = 0.5;
76
+ for (int i = 0; i < 5; i++) {
77
+ float n = 1.0 - abs(noise(p) * 2.0 - 1.0);
78
+ v += a * n * n;
79
+ p = p * 2.1 + vec2(1.7, 9.2);
80
+ a *= 0.5;
81
+ }
82
+ return v;
83
+ }
84
+
85
+ float fern(vec2 px) {
86
+ vec2 w = vec2(fbm(px / 30.0 + uSeed), fbm(px / 30.0 + 4.0 + uSeed));
87
+ return ridge(px / 13.0 + w * 2.6);
88
+ }
89
+
90
+ // Surface height: a bevel up from the edge plus a gently melted top.
91
+ float height(vec2 px) {
92
+ float d = inside(px);
93
+ float bevel = 1.0 - pow(1.0 - clamp(d / BEVEL, 0.0, 1.0), 2.0);
94
+ return bevel * 3.0 + fbm(px / 38.0 + uSeed) * 1.6;
95
+ }
96
+
97
+ void main() {
98
+ vec2 px = vUv * uRes;
99
+ float d = inside(px);
100
+ if (d < 0.0) { gl_FragColor = vec4(0.0); return; }
101
+
102
+ vec2 e = vec2(0.75, 0.0);
103
+ vec2 grad = vec2(height(px + e.xy) - height(px - e.xy), height(px + e.yx) - height(px - e.yx)) / (2.0 * e.x);
104
+ vec3 n = normalize(vec3(-grad * 1.4, 1.0));
105
+ vec3 light = normalize(vec3(-0.55, 0.65, 0.7));
106
+ vec3 h = normalize(light + vec3(0.0, 0.0, 1.0));
107
+ float spec = pow(max(dot(n, h), 0.0), 90.0);
108
+ float sheen = pow(max(dot(n, h), 0.0), 9.0);
109
+ float fresnel = pow(1.0 - n.z, 1.6);
110
+
111
+ float rim = 1.0 - smoothstep(0.0, BEVEL * 1.6, d);
112
+ float edgeLine = exp(-pow((d - 1.6) / 0.9, 2.0));
113
+ float innerEdge = exp(-pow((d - BEVEL) / 1.8, 2.0));
114
+ float core = smoothstep(BEVEL, BEVEL * 3.5, d) * smoothstep(0.35, 0.8, fbm(px / 26.0 + uSeed * 3.0));
115
+ float veins = (1.0 - smoothstep(0.0, 0.035, cells(px / 70.0 + uSeed))) * smoothstep(BEVEL, BEVEL * 2.0, d);
116
+
117
+ vec3 tint = vec3(0.56, 0.74, 0.88);
118
+ vec3 col = tint * (0.45 + 0.4 * vUv.y);
119
+ col = mix(col, vec3(0.86, 0.93, 0.99), rim * 0.6 + core * 0.35 + veins * 0.1);
120
+ col -= innerEdge * 0.12;
121
+ col += (spec * 1.4 + sheen * 0.22) * vec3(1.0, 1.0, 0.98);
122
+ col += edgeLine * 0.55;
123
+
124
+ float alpha = 0.16 + rim * 0.55 + fresnel * 0.5 + core * 0.3 + veins * 0.2
125
+ + spec + sheen * 0.15 + edgeLine * 0.6;
126
+
127
+ // frost: where it has reached, how thick it is, and its growing front
128
+ float toCenter = clamp(d / (min(uRes.x, uRes.y) * 0.5), 0.0, 1.0);
129
+ float seed = 1.0 - toCenter * 0.85 + (fbm(px / 18.0 + uSeed * 5.0) - 0.5) * 0.5;
130
+ float level = seed + uCover * 1.3 - 1.05;
131
+ float frozen = smoothstep(-0.03, 0.03, level);
132
+ float front = exp(-pow(level / 0.02, 2.0)) * step(uCover, 0.995);
133
+ float f = fern(px);
134
+ float frost = smoothstep(0.42, 0.8, f) * frozen * (0.3 + 0.7 * clamp(seed, 0.0, 1.0));
135
+ vec2 g = vec2(fern(px + e.xy) - fern(px - e.xy), fern(px + e.yx) - fern(px - e.yx)) / (2.0 * e.x);
136
+ vec3 fn = normalize(vec3(-g * 5.0, 1.0));
137
+ float fspec = pow(max(dot(fn, h), 0.0), 36.0) * frost;
138
+
139
+ col = mix(col, vec3(0.9, 0.95, 1.0), frost * 0.7);
140
+ col += fspec * 0.9 + front * vec3(0.75, 0.92, 1.0) * 0.9;
141
+ alpha = max(alpha, frost * 0.8) + fspec * 0.5;
142
+
143
+ // while freezing over something warm, the new ice is darker and thicker
144
+ float backing = frozen * clamp(1.0 - uCover, 0.0, 1.0);
145
+ col = mix(col, vec3(0.1, 0.14, 0.18), backing * 0.5 * (1.0 - frost));
146
+ alpha = max(alpha, backing * 0.85);
147
+
148
+ alpha = alpha * frozen + front * 0.8;
149
+ gl_FragColor = vec4(min(col, 1.0), clamp(alpha, 0.0, 0.97));
150
+ }`),tJ.heat=$V(V,`
151
+ precision highp float;
152
+ varying vec2 vUv;
153
+ uniform vec2 uRes;
154
+ uniform float uTime;
155
+ uniform float uIntensity;
156
+ uniform float uSeed;
157
+ uniform float uCover;
158
+
159
+ vec2 hash2(vec2 p) {
160
+ p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
161
+ return fract(sin(p + uSeed) * 43758.5453);
162
+ }
163
+
164
+ float noise(vec2 p) {
165
+ vec2 i = floor(p);
166
+ vec2 f = fract(p);
167
+ vec2 u = f * f * (3.0 - 2.0 * f);
168
+ float a = hash2(i).x;
169
+ float b = hash2(i + vec2(1.0, 0.0)).x;
170
+ float c = hash2(i + vec2(0.0, 1.0)).x;
171
+ float d = hash2(i + vec2(1.0, 1.0)).x;
172
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
173
+ }
174
+
175
+ float fbm(vec2 p) {
176
+ float v = 0.0;
177
+ float a = 0.5;
178
+ for (int i = 0; i < 5; i++) {
179
+ v += a * noise(p);
180
+ p = p * 2.03 + 11.7;
181
+ a *= 0.5;
182
+ }
183
+ return v;
184
+ }
185
+
186
+ // Both materials share one block outline: a rounded rectangle with a bevel.
187
+ const float BEVEL = 9.0;
188
+
189
+ // Inside distance to the edge of a rounded rectangle filling the canvas.
190
+ float inside(vec2 px) {
191
+ vec2 hs = uRes * 0.5;
192
+ float r = 7.0;
193
+ vec2 q = abs(px - hs) - (hs - r);
194
+ return -(length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r);
195
+ }
196
+
197
+ // Distance to the nearest Voronoi cell border: thin values are cracks.
198
+ float cells(vec2 p) {
199
+ vec2 n = floor(p);
200
+ vec2 f = fract(p);
201
+ float d1 = 8.0;
202
+ float d2 = 8.0;
203
+ for (int j = -1; j <= 1; j++) {
204
+ for (int i = -1; i <= 1; i++) {
205
+ vec2 g = vec2(float(i), float(j));
206
+ vec2 r = g + hash2(n + g) - f;
207
+ float d = dot(r, r);
208
+ if (d < d1) { d2 = d1; d1 = d; }
209
+ else if (d < d2) { d2 = d; }
210
+ }
211
+ }
212
+ return sqrt(d2) - sqrt(d1);
213
+ }
214
+
215
+ vec3 lava(float h) {
216
+ vec3 col = mix(vec3(0.35, 0.04, 0.02), vec3(0.93, 0.33, 0.06), smoothstep(0.0, 0.55, h));
217
+ return mix(col, vec3(1.0, 0.86, 0.5), smoothstep(0.6, 1.0, h));
218
+ }
219
+
220
+ void main() {
221
+ vec2 px = vUv * uRes;
222
+ float d = inside(px);
223
+ if (d < 0.0) { gl_FragColor = vec4(0.0); return; }
224
+ float t = uTime;
225
+ float k = 0.55 + 0.45 * uIntensity;
226
+ vec2 p = px / 24.0;
227
+ vec2 flow = vec2(fbm(p * 0.55 + vec2(t * 0.04, 0.0)), fbm(p * 0.55 + vec2(3.1, -t * 0.035)));
228
+ vec2 q = p + (flow - 0.5) * 1.5 + vec2(t * 0.03, -t * 0.05);
229
+
230
+ float e = cells(q + uSeed);
231
+ float fine = cells(q * 2.4 + 5.0 + uSeed);
232
+ float crack = 1.0 - smoothstep(0.0, 0.035 + 0.075 * k, e);
233
+ float hairline = (1.0 - smoothstep(0.0, 0.025, fine)) * smoothstep(0.12, 0.3, e);
234
+ float glow = exp(-e * (11.0 - 5.0 * k));
235
+ float pulse = 0.75 + 0.25 * sin(t * 1.8 + fbm(q * 1.3) * 6.2832);
236
+
237
+ // crust: rough basalt, a little lighter in the middle of each plate
238
+ float rough = fbm(px / 5.0 + uSeed);
239
+ vec3 crust = mix(vec3(0.045, 0.032, 0.028), vec3(0.15, 0.11, 0.09), rough);
240
+ crust *= 0.75 + 0.5 * smoothstep(0.05, 0.5, e);
241
+
242
+ float heat = clamp(crack * pulse + hairline * 0.35 * k, 0.0, 1.0);
243
+ vec3 col = crust + glow * vec3(0.85, 0.24, 0.04) * 0.5 * k;
244
+ col = mix(col, lava(heat * (0.75 + 0.25 * k)), heat);
245
+ // a black frame of cooled rock, the same bevel the ice has: dark at the
246
+ // rim, a faint grey edge where the bevel catches the light
247
+ float frame = 1.0 - smoothstep(1.6, 3.2, d);
248
+ col = mix(col, vec3(0.018, 0.014, 0.012) + rough * 0.035, frame);
249
+ col += exp(-pow((d - 1.4) / 0.9, 2.0)) * 0.16;
250
+ gl_FragColor = vec4(min(col, 1.0), 1.0);
251
+ }`),tJ.glass=$V(V,`
252
+ precision highp float;
253
+ varying vec2 vUv;
254
+ uniform vec2 uRes;
255
+ uniform float uTime;
256
+ uniform float uIntensity;
257
+ uniform float uSeed;
258
+ uniform float uCover;
259
+
260
+ vec2 hash2(vec2 p) {
261
+ p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
262
+ return fract(sin(p + uSeed) * 43758.5453);
263
+ }
264
+
265
+ float noise(vec2 p) {
266
+ vec2 i = floor(p);
267
+ vec2 f = fract(p);
268
+ vec2 u = f * f * (3.0 - 2.0 * f);
269
+ float a = hash2(i).x;
270
+ float b = hash2(i + vec2(1.0, 0.0)).x;
271
+ float c = hash2(i + vec2(0.0, 1.0)).x;
272
+ float d = hash2(i + vec2(1.0, 1.0)).x;
273
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
274
+ }
275
+
276
+ float fbm(vec2 p) {
277
+ float v = 0.0;
278
+ float a = 0.5;
279
+ for (int i = 0; i < 5; i++) {
280
+ v += a * noise(p);
281
+ p = p * 2.03 + 11.7;
282
+ a *= 0.5;
283
+ }
284
+ return v;
285
+ }
286
+
287
+ // Both materials share one block outline: a rounded rectangle with a bevel.
288
+ const float BEVEL = 9.0;
289
+
290
+ // Inside distance to the edge of a rounded rectangle filling the canvas.
291
+ float inside(vec2 px) {
292
+ vec2 hs = uRes * 0.5;
293
+ float r = 7.0;
294
+ vec2 q = abs(px - hs) - (hs - r);
295
+ return -(length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r);
296
+ }
297
+
298
+ // Distance to the nearest Voronoi cell border: thin values are cracks.
299
+ float cells(vec2 p) {
300
+ vec2 n = floor(p);
301
+ vec2 f = fract(p);
302
+ float d1 = 8.0;
303
+ float d2 = 8.0;
304
+ for (int j = -1; j <= 1; j++) {
305
+ for (int i = -1; i <= 1; i++) {
306
+ vec2 g = vec2(float(i), float(j));
307
+ vec2 r = g + hash2(n + g) - f;
308
+ float d = dot(r, r);
309
+ if (d < d1) { d2 = d1; d1 = d; }
310
+ else if (d < d2) { d2 = d; }
311
+ }
312
+ }
313
+ return sqrt(d2) - sqrt(d1);
314
+ }
315
+
316
+ void main() {
317
+ vec2 px = vUv * uRes;
318
+ float d = inside(px);
319
+ if (d < 0.0) { gl_FragColor = vec4(0.0); return; }
320
+ float frost = fbm(px / 9.0 + uSeed) * 0.6 + fbm(px / 40.0 + uSeed * 2.0) * 0.4;
321
+ float rim = 1.0 - smoothstep(0.0, BEVEL * 1.2, d);
322
+ float edge = exp(-pow((d - 1.3) / 0.9, 2.0));
323
+ float s1 = exp(-pow((vUv.x * 0.7 + vUv.y - 1.15) / 0.05, 2.0));
324
+ float s2 = exp(-pow((vUv.x * 0.7 + vUv.y - 1.32) / 0.02, 2.0));
325
+ float a = 0.2 + frost * 0.18 + rim * 0.35 * vUv.y + edge * 0.6 + s1 * 0.3 + s2 * 0.45;
326
+ vec3 col = vec3(1.0) - (1.0 - vUv.y) * rim * 0.3;
327
+ gl_FragColor = vec4(col, clamp(a, 0.0, 0.9));
328
+ }`),tJ.metal=$V(V,`
329
+ precision highp float;
330
+ varying vec2 vUv;
331
+ uniform vec2 uRes;
332
+ uniform float uTime;
333
+ uniform float uIntensity;
334
+ uniform float uSeed;
335
+ uniform float uCover;
336
+
337
+ vec2 hash2(vec2 p) {
338
+ p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
339
+ return fract(sin(p + uSeed) * 43758.5453);
340
+ }
341
+
342
+ float noise(vec2 p) {
343
+ vec2 i = floor(p);
344
+ vec2 f = fract(p);
345
+ vec2 u = f * f * (3.0 - 2.0 * f);
346
+ float a = hash2(i).x;
347
+ float b = hash2(i + vec2(1.0, 0.0)).x;
348
+ float c = hash2(i + vec2(0.0, 1.0)).x;
349
+ float d = hash2(i + vec2(1.0, 1.0)).x;
350
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
351
+ }
352
+
353
+ float fbm(vec2 p) {
354
+ float v = 0.0;
355
+ float a = 0.5;
356
+ for (int i = 0; i < 5; i++) {
357
+ v += a * noise(p);
358
+ p = p * 2.03 + 11.7;
359
+ a *= 0.5;
360
+ }
361
+ return v;
362
+ }
363
+
364
+ // Both materials share one block outline: a rounded rectangle with a bevel.
365
+ const float BEVEL = 9.0;
366
+
367
+ // Inside distance to the edge of a rounded rectangle filling the canvas.
368
+ float inside(vec2 px) {
369
+ vec2 hs = uRes * 0.5;
370
+ float r = 7.0;
371
+ vec2 q = abs(px - hs) - (hs - r);
372
+ return -(length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r);
373
+ }
374
+
375
+ // Distance to the nearest Voronoi cell border: thin values are cracks.
376
+ float cells(vec2 p) {
377
+ vec2 n = floor(p);
378
+ vec2 f = fract(p);
379
+ float d1 = 8.0;
380
+ float d2 = 8.0;
381
+ for (int j = -1; j <= 1; j++) {
382
+ for (int i = -1; i <= 1; i++) {
383
+ vec2 g = vec2(float(i), float(j));
384
+ vec2 r = g + hash2(n + g) - f;
385
+ float d = dot(r, r);
386
+ if (d < d1) { d2 = d1; d1 = d; }
387
+ else if (d < d2) { d2 = d; }
388
+ }
389
+ }
390
+ return sqrt(d2) - sqrt(d1);
391
+ }
392
+
393
+ void main() {
394
+ vec2 px = vUv * uRes;
395
+ float d = inside(px);
396
+ if (d < 0.0) { gl_FragColor = vec4(0.0); return; }
397
+ float streak = fbm(vec2(px.x / 140.0, px.y * 0.7) + uSeed);
398
+ float fine = noise(vec2(px.x / 5.0, px.y * 3.0) + uSeed);
399
+ vec3 col = mix(vec3(0.50, 0.53, 0.57), vec3(0.80, 0.82, 0.85), vUv.y);
400
+ col += (streak - 0.5) * 0.22 + (fine - 0.5) * 0.07;
401
+ col += exp(-pow((vUv.x * 0.8 + (1.0 - vUv.y) * 0.5 - 0.55) / 0.16, 2.0)) * 0.22;
402
+ float bevel = 1.0 - smoothstep(0.0, BEVEL * 0.7, d);
403
+ col = mix(col, mix(vec3(0.32, 0.34, 0.37), vec3(0.96), vUv.y), bevel * 0.55);
404
+ col += exp(-pow((d - 1.2) / 0.8, 2.0)) * 0.25;
405
+ gl_FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
406
+ }`),tJ.noise=$V(V,`
407
+ precision highp float;
408
+ varying vec2 vUv;
409
+ uniform vec2 uRes;
410
+ uniform float uTime;
411
+ uniform float uIntensity;
412
+ uniform float uSeed;
413
+ uniform float uCover;
414
+
415
+ vec2 hash2(vec2 p) {
416
+ p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));
417
+ return fract(sin(p + uSeed) * 43758.5453);
418
+ }
419
+
420
+ float noise(vec2 p) {
421
+ vec2 i = floor(p);
422
+ vec2 f = fract(p);
423
+ vec2 u = f * f * (3.0 - 2.0 * f);
424
+ float a = hash2(i).x;
425
+ float b = hash2(i + vec2(1.0, 0.0)).x;
426
+ float c = hash2(i + vec2(0.0, 1.0)).x;
427
+ float d = hash2(i + vec2(1.0, 1.0)).x;
428
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
429
+ }
430
+
431
+ float fbm(vec2 p) {
432
+ float v = 0.0;
433
+ float a = 0.5;
434
+ for (int i = 0; i < 5; i++) {
435
+ v += a * noise(p);
436
+ p = p * 2.03 + 11.7;
437
+ a *= 0.5;
438
+ }
439
+ return v;
440
+ }
441
+
442
+ // Both materials share one block outline: a rounded rectangle with a bevel.
443
+ const float BEVEL = 9.0;
444
+
445
+ // Inside distance to the edge of a rounded rectangle filling the canvas.
446
+ float inside(vec2 px) {
447
+ vec2 hs = uRes * 0.5;
448
+ float r = 7.0;
449
+ vec2 q = abs(px - hs) - (hs - r);
450
+ return -(length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - r);
451
+ }
452
+
453
+ // Distance to the nearest Voronoi cell border: thin values are cracks.
454
+ float cells(vec2 p) {
455
+ vec2 n = floor(p);
456
+ vec2 f = fract(p);
457
+ float d1 = 8.0;
458
+ float d2 = 8.0;
459
+ for (int j = -1; j <= 1; j++) {
460
+ for (int i = -1; i <= 1; i++) {
461
+ vec2 g = vec2(float(i), float(j));
462
+ vec2 r = g + hash2(n + g) - f;
463
+ float d = dot(r, r);
464
+ if (d < d1) { d2 = d1; d1 = d; }
465
+ else if (d < d2) { d2 = d; }
466
+ }
467
+ }
468
+ return sqrt(d2) - sqrt(d1);
469
+ }
470
+
471
+ void main() {
472
+ vec2 px = vUv * uRes;
473
+ float d = inside(px);
474
+ if (d < 0.0) { gl_FragColor = vec4(0.0); return; }
475
+ vec2 c = floor(gl_FragCoord.xy);
476
+ vec2 h = hash2(c);
477
+ float g = sqrt(-2.0 * log(h.x + 1e-4)) * cos(6.2832 * h.y);
478
+ vec3 tint = vec3(hash2(c + 17.0).x, hash2(c + 41.0).x, hash2(c + 73.0).x) - 0.5;
479
+ vec3 col = clamp(0.5 + g * 0.18 + tint * 0.25, 0.0, 1.0);
480
+ gl_FragColor = vec4(col, 0.55 + exp(-pow((d - 1.2) / 0.9, 2.0)) * 0.3);
481
+ }`),wJ=V}catch{wJ=null}return wJ}function oV(V,X,K,Y=0){X=Math.round(X),K=Math.round(K);let I=`${V}:${X}x${K}:${Y}`,O=pV.get(I);if(O)return O;let D=H0();if(!D||X<1||K<1)return null;let F=Math.min(Math.max(1,globalThis.devicePixelRatio||1),2,1024/Math.max(X,K)),E=Math.round(X*F),S=Math.round(K*F),j=tJ[V];D.viewport(0,0,E,S),D.useProgram(j);let f=(h)=>D.getUniformLocation(j,h);D.uniform2f(f("uRes"),X,K),D.uniform1f(f("uTime"),0),D.uniform1f(f("uIntensity"),0.5),D.uniform1f(f("uSeed"),Y),D.uniform1f(f("uCover"),1),D.drawArrays(D.TRIANGLE_STRIP,0,4);let v=document.createElement("canvas");v.width=E,v.height=S,v.getContext("2d").drawImage(UV,0,1024-S,E,S,0,0,E,S);let d=v.toDataURL("image/webp",0.9);return pV.set(I,d),d}var FV={light:{none:["#e2e5e9","#7f8794"],bg:"none",text:"#1d2430",sub:"#5b6474",edge:"#39414f",halo:"#fff",group:["#f5f6f9","#d5dae2"],shadow:"rgba(30,40,60,.10)",dark:!1,ice:["#f7fdff","#d2effb","#aedcf2","#6fb9de"],fire:["#fff6e8","#ffcf9f","#ee7d36"],c:{white:["#ffffff","#8b95a5"],gray:["#eceff3","#9aa3b2"],pink:["#fde1e4","#e58c98"],orange:["#fde4c8","#e69a50"],yellow:["#f4f5cc","#c0c064"],green:["#d8f1de","#68b880"],blue:["#d6eafc","#5f9fd8"],purple:["#e4defa","#9584db"],red:["#ffd7d2","#dd6559"],teal:["#d1f0ec","#48a99f"]}},dark:{none:["#2a2f37","#8a93a2"],bg:"#0e1117",text:"#e8edf5",sub:"#9aa4b5",edge:"#c3cad6",halo:"#0e1117",group:["#161a22","#2b323f"],shadow:"rgba(0,0,0,.45)",dark:!0,ice:["#29506a","#163a50","#0f2c3e","#7fd4ff"],fire:["#4a2a12","#33180a","#ff9447"],c:{white:["#1b2029","#7d8799"],gray:["#1f242d","#8792a4"],pink:["#3a1e29","#ff8ea2"],orange:["#3a2916","#ffae5c"],yellow:["#2f3018","#e3da66"],green:["#142e22","#5ad08a"],blue:["#13273c","#5ab1ff"],purple:["#241e3f","#a892ff"],red:["#3c1b19","#ff786a"],teal:["#11312f","#4cd3c3"]}}},HJ=(V)=>+V.toFixed(1),a=(V,...X)=>V.reduce((K,Y,I)=>K+(typeof X[I-1]==="number"?HJ(X[I-1]):X[I-1])+Y),gJ=(V)=>V.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),DV=(V)=>/^#([\da-f]{3}|[\da-f]{6})$/i.test(V),iV=(V)=>{let X=V.replace("#",""),K=X.length===3?[...X].map((Y)=>Y+Y).join(""):X;return[0,2,4].map((Y)=>parseInt(K.slice(Y,Y+2),16))},DJ=(V,X,K)=>{if(!DV(V)||!DV(X))return V;return K=Math.min(1,Math.max(0,K)),"#"+iV(V).map((Y,I)=>Math.round(Y+(iV(X)[I]-Y)*K).toString(16).padStart(2,"0")).join("")},uJ=(V,X,K,Y,I)=>{return I=Math.min(I,K/2,Y/2),a`M${V+I},${X}h${K-2*I}a${I},${I} 0 0 1 ${I},${I}v${Y-2*I}a${I},${I} 0 0 1 ${-I},${I}h${2*I-K}a${I},${I} 0 0 1 ${-I},${-I}v${2*I-Y}a${I},${I} 0 0 1 ${I},${-I}z`},OV=(V,X,K)=>a`M${V-K},${X}a${K},${K} 0 1 0 ${2*K},0a${K},${K} 0 1 0 ${-2*K},0z`,lJ=(...V)=>"M"+V.map(HJ).join(",").replace(/([^,]*,[^,]*),/g,"$1L")+"z",eV=-0.65,nV=0.45,aV=Math.cos(eV),tV=Math.sin(eV),rV=Math.cos(nV),sV=Math.sin(nV),CJ=(V,X,K)=>{let Y=V*aV-X*tV,I=V*tV+X*aV;return[Y,-K*rV-I*sV,I*rV-K*sV]},jV=(V,X,K,Y,I,O)=>{let D=V.map((k)=>k[0]),F=V.map((k)=>k[1]),E=Math.min(...D),S=Math.max(...D),j=Math.min(...F),f=Math.max(...F),v=Math.min((Y-2*O)/(S-E||1),(I-2*O)/(f-j||1)),d=X+Y/2-(E+S)/2*v,h=K+I/2-(j+f)/2*v;return(k)=>[d+k[0]*v,h+k[1]*v]},R0=(V)=>[(0.5+V*0.7548776662)%1,(0.5+V*0.569840291)%1],E0=(V,X)=>Array.from({length:X},(K,Y)=>{let[I,O]=R0(Y),D=I*2*Math.PI;if(V==="sphere"){let h=2*O-1,k=Math.sqrt(1-h*h);return[k*Math.cos(D),k*Math.sin(D),h]}if(V==="cube"){let h=Y%6,k=2*I-1,MJ=2*O-1,UJ=h<3?1:-1;return h%3===0?[UJ,k,MJ]:h%3===1?[k,UJ,MJ]:[k,MJ,UJ]}let F=O*2*Math.PI,E=0.68,S=0.3,j=0.8,f=(E+S*Math.cos(F))*Math.cos(D),v=(E+S*Math.cos(F))*Math.sin(D),d=S*Math.sin(F);return[f,v*Math.cos(j)-d*Math.sin(j),v*Math.sin(j)+d*Math.cos(j)]}),q0=(V)=>Array.from({length:V},(X,K)=>{let Y=K/V,O=0.06+0.9*[[0.14,0.9],[0.3,0.6],[0.47,1],[0.66,0.75],[0.84,0.5]].reduce((D,[F,E])=>D+E*Math.exp(-(((Y-F)/0.07)**2)),0)*(0.55+0.45*Math.abs(Math.sin(K*1.7)*Math.cos(K*0.37)));return[-O*(0.85+0.15*Math.sin(K*2.3)),O]}),ZV=["blue","orange","green","purple","red","teal","pink","yellow"],LV=(V)=>ZV[((V|0)%ZV.length+ZV.length)%ZV.length],P0=0;function MV(V,X,K=!0){let Y=FV[X??V.theme]??FV.light,I=`mm${P0++}-`,O=V.dir==="LR"||V.dir==="RL",D=V.fontSize??RV,F=new Map,E=new Map,S=(J)=>{if(!J)return"none";if(/^#?\w+$/.test(J))return J.replace("#","");if(!E.has(J))E.set(J,`css${E.size}`);return E.get(J)},j=1/0,f=1/0,v=-1/0,d=-1/0,h=(J,U,Q=0,Z=0)=>{j=Math.min(j,J),f=Math.min(f,U),v=Math.max(v,J+Q),d=Math.max(d,U+Z)},k=(J)=>{if(!J)return Y.none;if(Y.c[J])return Y.c[J];if(DV(J))return[Y.dark?DJ(J,"#0e1117",0.75):DJ(J,"#ffffff",0.78),J];return[gJ(J),Y.edge]},MJ=(J)=>{let U="c-"+S(J);if(!F.has(U)){let[Q,Z]=k(J),N=Y.dark?DJ(Q,Z,0.16):DJ(Q,"#ffffff",0.6);F.set(U,a`<linearGradient id="${I}${U}" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="${N}"/><stop offset="1" stop-color="${Q}"/></linearGradient>`)}return`url(#${I}${U})`},UJ=()=>{if(F.has("ice"))return;let[J,U,Q]=Y.ice;F.set("ice",`<linearGradient id="${I}ice" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="${J}"/><stop offset=".55" stop-color="${U}"/><stop offset="1" stop-color="${Q}"/></linearGradient><pattern id="${I}frost" width="56" height="56" patternUnits="userSpaceOnUse"><path d="M0 14 16 20 25 6M16 20 22 37 41 33 56 45M41 33 47 12 56 9M22 37 9 56M47 12 33 0" fill="none" stroke="#fff" stroke-opacity="${Y.dark?0.18:0.75}" stroke-width="1"/><path d="M5 30 12 33M30 50 36 46M50 25 54 30" stroke="${Y.ice[3]}" stroke-opacity=".35" stroke-width=".8"/></pattern>`)},s=()=>{if(F.has("fire"))return;let[J,U,Q]=Y.fire;F.set("fire",`<linearGradient id="${I}fire" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="${J}"/><stop offset="1" stop-color="${U}"/></linearGradient><linearGradient id="${I}flame" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#ffd24a"/><stop offset=".6" stop-color="${Q}"/><stop offset="1" stop-color="#e0452b"/></linearGradient>`)},OJ=(J)=>{let U=J.attrs.texture??(J.flags.has("frozen")?"ice":J.flags.has("train")?"magma":"");if(U==="ice")return UJ(),{fill:`url(#${I}ice)`,stroke:Y.ice[3],fx:U};if(U==="magma")return s(),{fill:`url(#${I}fire)`,stroke:Y.fire[2],fx:U};if(U==="metal")return{fill:MJ(J.color),stroke:Y.dark?"#9aa3ae":"#6d747d",fx:U};return{fill:MJ(J.color),stroke:k(J.color)[1],fx:U}},VJ=(J,U,Q,Z,N,H,L="middle")=>{let o=qJ(J,Z,N),x="",l="";return o.lines.forEach((FJ,e)=>{let C=L==="middle"?U-o.widths[e]/2:L==="start"?U:U-o.widths[e],XJ=Q-o.h/2+(e+0.5)*o.lh+Z*0.36;for(let p of FJ){if(p.math){let $J=p.math;l+=a`<svg x="${C+p.x}" y="${XJ-$J.asc}" width="${$J.w}" height="${$J.asc+$J.desc}" viewBox="${$J.viewBox}" overflow="visible" color="${H}">${$J.inner}</svg>`;continue}if(x+=a`<tspan x="${C+p.x}" y="${XJ+p.dy}"`,p.size!==Z)x+=a` font-size="${p.size}"`;if(p.it)x+=' font-style="italic"';if(p.serif)x+=` font-family='${lV}' font-weight="${p.b?700:400}"`;else if(p.b)x+=' font-weight="700"';x+=`>${gJ(p.t)}</tspan>`}}),h(U-(L==="middle"?o.w/2:L==="end"?o.w:0),Q-o.h/2,o.w,o.h),(x?a`<text font-size="${Z}" font-weight="${N}" fill="${H}" style="white-space:pre">${x}</text>`:"")+l},t=(J,U)=>J.flags.has("frozen")?"ice":J.flags.has("train")?"magma":U==="ice"||U==="magma"?U:"",IJ=(J,U,Q)=>{if(J==="ice")return a`<g transform="translate(${U},${Q})"><circle r="7.5" fill="${Y.dark?"#0f2c3e":"#fff"}" stroke="${Y.ice[3]}"/><path d="M0-4.6V4.6M-4 -2.3 4 2.3M-4 2.3 4-2.3M-1.4-3.6 0-2.4 1.4-3.6M-1.4 3.6 0 2.4 1.4 3.6" fill="none" stroke="${Y.ice[3]}" stroke-width="1.1" stroke-linecap="round"/></g>`;if(J!=="magma")return"";return s(),a`<g transform="translate(${U},${Q})"><circle r="7.5" fill="${Y.dark?"#33180a":"#fff"}" stroke="${Y.fire[2]}"/><path d="M0.4-5C3 -2.4 3.9-.2 3.1 2.2 2.5 4.1-2.3 4.3-3 2.1-3.6.2-2.2-1.2-1.6-2.6-.9-1.4-.3-.9.2-.6.9-2 .9-3.5.4-5z" fill="url(#${I}flame)"/></g>`},ZJ=0,NJ={ice:"ice",magma:"heat",glass:"glass",metal:"metal",noise:"noise"},EJ=(J,U,Q,Z,N,H,L)=>{if(WJ.has(J))return`<path d="${U}" fill="${LJ(J,L)}"/>`;let o=K&&NJ[J]?oV(NJ[J],N,H):null;if(!o){if(J==="noise")return`<path d="${U}" fill="${LJ("grain",L)}"/>`;if(J==="glass")return`<path d="${U}" fill="#fff" fill-opacity="${Y.dark?0.12:0.4}"/>`;if(J==="metal")return`<path d="${U}" fill="${SJ()}"/>`;return""}let x=`m-${J}-${Math.round(N)}x${Math.round(H)}`;if(!F.has(x))F.set(x,a`<image id="${I}${x}" width="${Math.round(N)}" height="${Math.round(H)}" preserveAspectRatio="none" href="${o}"/>`);let l=`${I}k${ZJ++}`;return`<clipPath id="${l}"><path d="${U}"/></clipPath><g clip-path="url(#${l})">`+a`<use href="#${I}${x}" x="${Q}" y="${Z}"/></g>`},WJ=new Set(["quantized","sparse","hatch"]),LJ=(J,U)=>{let Q=`p-${J}-${S(U)}`;if(!F.has(Q)){let[Z,N]=k(U),H=24,L="",o="";if(J==="quantized")H=32,[0,2,1,3,2,0,3,1,1,3,0,2,3,1,2,0].forEach((x,l)=>{L+=`<rect x="${l%4*8}" y="${(l>>2)*8}" width="8" height="8" fill="${DJ(Z,N,x/3*0.7)}"/>`});else if(J==="sparse")[1,0,1,1,0,1,0,1,1,1,0,0,1,0,1,1].forEach((x,l)=>{if(x)L+=`<circle cx="${l%4*6+3}" cy="${(l>>2)*6+3}" r="1.5" fill="${N}" fill-opacity=".75"/>`});else if(J==="hatch")H=7,o=' patternTransform="rotate(45)"',L=`<path d="M0 0V7" stroke="${N}" stroke-opacity=".55" stroke-width="1.4"/>`;else{H=24;for(let x=0;x<64;x++)L+=`<rect x="${x%8*3}" y="${(x>>3)*3}" width="3" height="3" fill="${["#000","#fff"][x*37%7>3?1:0]}" fill-opacity="${0.08+x*53%11/40}"/>`}F.set(Q,`<pattern id="${I}${Q}" width="${H}" height="${H}" patternUnits="userSpaceOnUse"${o}>${L}</pattern>`)}return`url(#${I}${Q})`},cJ=(J,U,Q)=>{if(WJ.has(J))return`<path d="${U}" fill="${LJ(J,Q)}"/>`;if(J==="noise")return`<path d="${U}" fill="${LJ("grain",Q)}"/>`;if(J==="ice")return UJ(),`<path d="${U}" fill="url(#${I}ice)"/><path d="${U}" fill="url(#${I}frost)"/>`;if(J==="magma")return s(),`<path d="${U}" fill="url(#${I}fire)"/>`;if(J==="metal")return`<path d="${U}" fill="${SJ()}"/>`;if(J==="glass")return`<path d="${U}" fill="#fff" fill-opacity="${Y.dark?0.15:0.45}"/>`;return""},SJ=()=>{if(!F.has("metal"))F.set("metal",`<linearGradient id="${I}metal" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#e4e7eb"/><stop offset=".45" stop-color="#a7adb5"/><stop offset=".55" stop-color="#cfd3d8"/><stop offset="1" stop-color="#8d949d"/></linearGradient>`);return`url(#${I}metal)`},vJ=(J,U,Q,Z)=>{let N=J+Z,H=J+Q-Z;if(H-N<8)return"";let L=a`M${N},${U+1}H${H}V${U+3.5}`,o=Math.max(2,Math.round((H-N)/9)),x=(H-N)/o;for(let l=0;l<o;l++)L+=a`q${-x/2},${[4,7,3.5,6,5][l%5]} ${-x},0`;return`<path d="${L}z" fill="#fff" fill-opacity="${Y.dark?0.55:0.92}"/>`},kJ=(J)=>{let[U,Q]=GJ(J.attrs.size,[64,64]),Z=+J.attrs.n||1;return{W:U,H:Q,k:Z,x0:J.x-(U+(Z-1)*6)/2,y0:J.y-(Q+(Z-1)*6)/2,fit:J.attrs.fit==="contain"?"xMidYMid meet":"xMidYMid slice",srcs:J.attrs.srcs?JSON.parse(J.attrs.srcs):[J.attrs.src??""]}},mJ=(J)=>{let U=V.edges.find((Q)=>Q.to===J.id&&V.nodes.get(Q.from)?.shape==="image");return U&&V.nodes.get(U.from)},YV=(J)=>{let U=V.nodes.get(J.to);return U.shape==="magnify"&&mJ(U)?.id===J.from},pJ=(J,U)=>{if(J.attrs.region)return GJ(J.attrs.region,[]);let Q=+U.attrs.grid||4,[Z,N]=GJ(J.attrs.patch,[-1,-1]);return Z>=0?[Z/Q,N/Q,1/Q,1/Q]:[0.375,0.375,0.25,0.25]},yJ=(J)=>{let U=J.x-J.w/2,Q=J.y-J.h/2,{fill:Z,stroke:N,fx:H}=OJ(J),L=J.flags.has("dashed")?' stroke-dasharray="4 3"':"",o=J.flags.has("bold")?2:1.2,x=`fill="${Z}" stroke="${N}" stroke-width="${o}"${L}`,l=+(J.attrs.ghost??J.attrs.heads??0),FJ=!1,e=(M,A=[U,Q,J.w,J.h],b=0)=>{let w="";for(let q=Math.min(l,6)-1;q>0;q--)w+=a`<path d="${M}" transform="translate(${q*5},${-q*5})" ${x} opacity="${0.35+0.5/(q+1)}"/>`;if(!Y.dark||H)w+=a`<path d="${M}" transform="translate(0,1.6)" fill="${Y.shadow}"/>`;w+=`<path d="${M}" ${x}/>`;let z=EJ(H,M,A[0],A[1],A[2],A[3],J.color);if(z)FJ=!0,w+=z+`<path d="${M}" fill="none" stroke="${N}" stroke-width="${o}" stroke-opacity=".7"${L}/>`;else if(H==="ice")w+=`<path d="${M}" fill="url(#${I}frost)"/>`+(b?vJ(A[0],A[1],A[2],b):"");return h(U,Q-l*5,J.w+l*5,J.h+l*5),w},C="",XJ=PV(J,D),[p,$J]=H==="metal"?["#1d2430","#e8ebee"]:[Y.text,Y.halo],BJ=()=>FJ&&H==="magma"?`<g paint-order="stroke" stroke="#1a0d07" stroke-width="3" stroke-linejoin="round">${VJ(J.label,J.x,J.y,XJ,600,"#fff4e8")}</g>`:FJ&&H!=="ice"&&H!=="glass"?`<g paint-order="stroke" stroke="${$J}" stroke-width="3" stroke-linejoin="round" stroke-opacity=".85">${VJ(J.label,J.x,J.y,XJ,600,p)}</g>`:VJ(J.label,J.x,J.y,XJ,500,Y.text);switch(J.shape){case"text":C=BJ();break;case"op":{C=e(OV(J.x,J.y,11),[J.x-11,J.y-11,22,22]);let M=J.label==="+"?a`M${J.x-6.5},${J.y}h13M${J.x},${J.y-6.5}v13`:/^[*x×]$/.test(J.label)?a`M${J.x-4.6},${J.y-4.6}l9.2,9.2M${J.x+4.6},${J.y-4.6}l-9.2,9.2`:J.label==="~"?a`M${J.x-7},${J.y}q3.5,-8 7,0t7,0`:"";C+=M?`<path d="${M}" fill="none" stroke="${N}" stroke-width="1.5" stroke-linecap="round"/>`:VJ(J.label,J.x,J.y,XJ,500,Y.text);break}case"circle":C=e(OV(J.x,J.y,J.w/2),[U,Q,J.w,J.h])+BJ();break;case"tensor":{let[M,A,b]=GJ(J.attrs.size,[36,64,20]),w=b*0.6,z=U,q=Q+w,[r,y]=k(J.color),R=H==="ice"?Y.ice[0]:Y.dark?DJ(r,y,0.3):DJ(r,"#fff",0.5),P=H==="ice"?Y.ice[2]:Y.dark?DJ(r,"#000",0.25):DJ(r,y,0.35);C=e(uJ(z,q,M,A,1.5),[z,q,M,A])+`<path d="${lJ(z,q,z+w,q-w,z+M+w,q-w,z+M,q)}" fill="${R}" stroke="${N}" stroke-width="1" stroke-linejoin="round"/><path d="${lJ(z+M,q,z+M+w,q-w,z+M+w,q+A-w,z+M,q+A)}" fill="${P}" stroke="${N}" stroke-width="1" stroke-linejoin="round"/>`;break}case"stack":{let[M,A]=GJ(J.attrs.size,[44,60]),b=+J.attrs.n||4,w=+J.attrs.offset||7;for(let z=0;z<b;z++){let q=uJ(U+z*w,Q+z*w,M,A,2);C+=z===b-1?e(q,[U+z*w,Q+z*w,M,A]):`<path d="${q}" ${x}/>`}h(U,Q,J.w,J.h);break}case"enc":case"dec":{let M=J.shape==="enc",b=O?M!==NV()?lJ(U,Q,U+J.w,Q+J.h*0.22,U+J.w,Q+J.h*0.78,U,Q+J.h):lJ(U,Q+J.h*0.22,U+J.w,Q,U+J.w,Q+J.h,U,Q+J.h*0.78):M!==rJ()?lJ(U,Q,U+J.w,Q,U+J.w*0.78,Q+J.h,U+J.w*0.22,Q+J.h):lJ(U+J.w*0.22,Q,U+J.w*0.78,Q,U+J.w,Q+J.h,U,Q+J.h);C=e(b)+BJ();break}case"neurons":{let M=+J.attrs.n||4;for(let A=0;A<M;A++){let b=-((M-1)/2)*20+A*20;{let w=O?J.x:J.x+b,z=O?J.y+b:J.y;C+=e(OV(w,z,7),[w-7,z-7,14,14])}}break}case"matrix":case"voxels":{let M=+J.attrs.cellSize||16,A=[];if(J.shape==="matrix")JSON.parse(J.attrs.grid).forEach((r,y)=>r.forEach((R,P)=>A.push([[[U+P*M,Q+y*M],[U+(P+1)*M,Q+y*M],[U+(P+1)*M,Q+(y+1)*M],[U+P*M,Q+(y+1)*M]],R,0])));else{let r=JSON.parse(J.attrs.faces),y=+J.attrs.cols,R=M*0.5,P=U,c=Q+ +J.attrs.depth*R,n=(m,g)=>[P+m*M+g*R,c-g*R],T=(m,g)=>[P+y*M+g*R,c+m*M-g*R];r.top.forEach((m,g)=>m.forEach((QJ,KJ)=>A.push([[n(KJ,g),n(KJ+1,g),n(KJ+1,g+1),n(KJ,g+1)],QJ,0.3]))),r.side.forEach((m,g)=>m.forEach((QJ,KJ)=>A.push([[T(g,KJ),T(g,KJ+1),T(g+1,KJ+1),T(g+1,KJ)],QJ,-0.25]))),r.front.forEach((m,g)=>m.forEach((QJ,KJ)=>A.push([[[P+KJ*M,c+g*M],[P+(KJ+1)*M,c+g*M],[P+(KJ+1)*M,c+(g+1)*M],[P+KJ*M,c+(g+1)*M]],QJ,0])))}let[b,w]=k(J.color),z=Y.dark?"#0e1117":"#ffffff";for(let[r,y,R]of A){let P=y.c?Y.c[y.c]?DJ(Y.c[y.c][0],Y.c[y.c][1],0.55):gJ(y.c):DJ(Y.dark?w:DJ(b,"#ffffff",0.4),Y.dark?b:w,Y.dark?1-(y.v??0.5):y.v??0.5);P=R>0?DJ(P,"#ffffff",R):R<0?DJ(P,"#0b1a2e",-R):P;let c="M"+r.map((m)=>m.map(HJ).join(",")).join("L")+"z";if(C+=`<path d="${c}" fill="${P}" stroke="${z}" stroke-width="1.5" stroke-linejoin="round"/>`,y.t)C+=cJ(y.t,c,y.c??J.color);let[n,T]=r.reduce((m,g)=>[m[0]+g[0]/4,m[1]+g[1]/4],[0,0]);if(y.l)C+=VJ(y.l,n,T,Math.min(D-2,M*0.6),500,Y.text);if(y.x)C+=fJ(n-M*0.28,T-M*0.28,n+M*0.28,T+M*0.28,1.4)}let q=JSON.parse(J.attrs.axes??"{}");if(J.attrs.axes){let r=+J.attrs.rows,y=+J.attrs.cols,R=J.shape==="voxels"?+J.attrs.depth*M*0.5:0,P=U,c=Q+R,n=y*M,T=r*M,m=D-1,g=V.edges.some((AJ)=>AJ.from===J.id||AJ.to===J.id),QJ=c+T/2,KJ=P+n/2;if(g&&O&&Math.abs(QJ-J.y)<m*0.85)QJ=J.y+m*0.85;let i=q.cols?qJ(q.cols,m,500).w:0;if(g&&!O&&Math.abs(KJ-J.x)<i/2+6)KJ=J.x+i/2+6;let YJ="";if(q.cols)YJ+=VJ(q.cols,KJ,c+T+m*0.9,m,500,Y.sub);if(q.rows)YJ+=VJ(q.rows,P-5,QJ,m,500,Y.sub,"end");if(q.depth&&R)YJ+=VJ(q.depth,P+n+R/2+5,c+T-R/2+m*0.5,m,500,Y.sub,"start");C+=`<g paint-order="stroke" stroke="${Y.halo}" stroke-width="3" stroke-linejoin="round">${YJ}</g>`}h(U,Q,J.w,J.h);break}case"vector":{let M=qV(J);C=e(uJ(U,Q,J.w,J.h,3));let A=(O?J.h-4:J.w-4)/M.length;M.forEach((b,w)=>{let z=-((M.length-1)/2)*A+w*A;if(w)C+=O?a`<path d="M${U+3},${J.y+z-A/2}h${J.w-6}" stroke="${N}" stroke-opacity=".5"/>`:a`<path d="M${J.x+z-A/2},${Q+3}v${J.h-6}" stroke="${N}" stroke-opacity=".5"/>`;C+=VJ(b.trim(),O?J.x:J.x+z,O?J.y+z:J.y,XJ,500,Y.text)});break}case"image":{let{W:M,H:A,k:b,x0:w,y0:z,fit:q,srcs:r}=kJ(J),y=+J.attrs.grid||0;for(let T=0;T<b;T++){let m=w+T*6,g=z+T*6,QJ=uJ(m,g,M,A,3),KJ=r.length>1?r[b-1-T]:T===b-1?r[0]:void 0;if(!KJ){C+=`<path d="${QJ}" fill="${Y.dark?"#1b2029":"#fff"}" stroke="${N}"/>`;continue}let i=`${I}k${ZJ++}`;if(C+=`<clipPath id="${i}"><path d="${QJ}"/></clipPath>`+a`<image href="${gJ(KJ)}" x="${m}" y="${g}" width="${M}" height="${A}" preserveAspectRatio="${q}" clip-path="url(#${i})"/>`,y>1&&T===b-1){let YJ="";for(let AJ=1;AJ<y;AJ++)YJ+=a`M${m+M*AJ/y},${g}v${A}M${m},${g+A*AJ/y}h${M}`;C+=`<path d="${YJ}" stroke="#fff" stroke-opacity=".9"/>`}C+=`<path d="${QJ}" fill="none" stroke="${N}"/>`}let[R,P,c,n]=_V(J.attrs);if(R!==1||P!==0||c!==0||n!==1)C=a`<g transform="matrix(${[R,P,c,n].map((T)=>T.toFixed(4)).join(" ")} ${J.x-R*J.x-c*J.y} ${J.y-P*J.x-n*J.y})">`+C+"</g>";h(U,Q,J.w,J.h);break}case"magnify":{let M=mJ(J),A=Math.min(J.w,J.h)/2,b=J.attrs.lens!=="square",w=b?OV(J.x,J.y,A):uJ(U,Q,J.w,J.h,4),z=`${I}k${ZJ++}`;if(C+=`<clipPath id="${z}"><path d="${w}"/></clipPath>`,J.attrs.src)C+=a`<image href="${gJ(J.attrs.src)}" x="${U}" y="${Q}" width="${J.w}" height="${J.h}" preserveAspectRatio="${J.attrs.fit==="contain"?"xMidYMid meet":"xMidYMid slice"}" clip-path="url(#${z})"/>`;else if(M){let q=kJ(M),[r,y,R,P]=pJ(J,M);C+=a`<g clip-path="url(#${z})"><svg x="${U}" y="${Q}" width="${J.w}" height="${J.h}" viewBox="${r*q.W} ${y*q.H} ${R*q.W} ${P*q.H}" preserveAspectRatio="xMidYMid slice">`+a`<image href="${gJ(q.srcs[0])}" width="${q.W}" height="${q.H}" preserveAspectRatio="${q.fit}"/></svg></g>`}else C+=`<path d="${w}" fill="${Z}"/>`;if(C+=`<path d="${w}" fill="none" stroke="${N}" stroke-width="2.5"/>`,b){let q=A*Math.SQRT1_2;C+=a`<path d="M${J.x+q+1},${J.y+q+1}l${A*0.5},${A*0.5}" stroke="${N}" stroke-width="5" stroke-linecap="round"/>`,h(J.x+q,J.y+q,A*0.6,A*0.6)}h(U,Q,J.w,J.h);break}case"gaussian":{let M=JSON.parse(J.attrs.peaks??"[[0,0,1,0.45]]"),A=Math.min(40,+J.attrs.mesh||16),[b,w]=k(J.color),z=(T,m)=>M.reduce((g,[QJ,KJ,i=1,YJ=0.45])=>g+i*Math.exp(-((T-QJ)**2+(m-KJ)**2)/(2*YJ*YJ)),0),q=Array.from({length:A+1},(T,m)=>Array.from({length:A+1},(g,QJ)=>z(-1+2*m/A,-1+2*QJ/A))),r=Math.max(...q.flat())||1,y=q.map((T,m)=>T.map((g,QJ)=>CJ(-1+2*m/A,-1+2*QJ/A,g/r))),R=[[-1,-1],[1,-1],[1,1],[-1,1]].map(([T,m])=>CJ(T,m,0)),P=jV([...y.flat(),...R],U,Q,J.w,J.h,2),c=(T)=>P(T).map(HJ).join(",");C+=`<path d="M${R.map(c).join("L")}z" fill="${b}" fill-opacity=".5" stroke="${w}" stroke-opacity=".4"/>`;let n=[];for(let T=0;T<A;T++)for(let m=0;m<A;m++){let g=[y[T][m],y[T+1][m],y[T+1][m+1],y[T][m+1]];n.push([g.reduce((QJ,KJ)=>QJ+KJ[2],0),`M${g.map(c).join("L")}z`,(q[T][m]+q[T+1][m+1])/2/r])}n.sort((T,m)=>m[0]-T[0]);for(let[,T,m]of n){let g=DJ(b,w,0.12+0.88*m);C+=`<path d="${T}" fill="${g}" stroke="${DJ(g,Y.dark?"#ffffff":w,0.35)}" stroke-width=".5"/>`}h(U,Q,J.w,J.h);break}case"space":{let[M,A]=k(J.color),b=JSON.parse(J.attrs.points??"[]"),w=Object.values({x:"x",y:"y",z:"z",...JSON.parse(J.attrs.axes??"{}")}),z=CJ(1,0,0)[2]>CJ(-1,0,0)[2]?1:-1,q=CJ(0,1,0)[2]>CJ(0,-1,0)[2]?1:-1,r=[-1,1].flatMap((i)=>[-1,1].flatMap((YJ)=>[-1,1].map((AJ)=>CJ(i,YJ,AJ)))),y=jV(r,U,Q,J.w,J.h,10),R=(i,YJ,AJ)=>y(CJ(i,YJ,AJ)).map(HJ).join(","),P=(i)=>`<path d="M${i.map((YJ)=>R(YJ[0],YJ[1],YJ[2])).join("L")}z" fill="${M}" fill-opacity=".55" stroke="${A}" stroke-opacity=".45" stroke-linejoin="round"/>`;C+=P([[-1,-1,-1],[1,-1,-1],[1,1,-1],[-1,1,-1]])+P([[z,-1,-1],[z,1,-1],[z,1,1],[z,-1,1]])+P([[-1,q,-1],[1,q,-1],[1,q,1],[-1,q,1]]);let c="";for(let i of[-0.5,0,0.5])c+=`M${R(i,-1,-1)}L${R(i,1,-1)}M${R(-1,i,-1)}L${R(1,i,-1)}M${R(z,-1,i)}L${R(z,1,i)}M${R(-1,q,i)}L${R(1,q,i)}`;C+=`<path d="${c}" stroke="${A}" stroke-opacity=".18"/>`;let n=b.map((i)=>[...i,CJ(i[0],i[1],i[2])[2]]).sort((i,YJ)=>YJ[YJ.length-1]-i[i.length-1]);for(let i of n){let[YJ,AJ]=y(CJ(i[0],i[1],i[2])),CV=Y.c[LV(i.length>4?i[3]:0)][1];C+=a`<circle cx="${YJ}" cy="${AJ}" r="3.2" fill="${CV}" stroke="${Y.dark?"#0e1117":"#fff"}" stroke-width=".9"/>`}let T=(i,YJ,AJ,CV)=>{let[X0,Y0]=y(CJ(YJ,AJ,CV));return VJ(i,X0,Y0,D-2,400,Y.sub)},[m,g]=[[z,-q],[-z,q]].sort((i,YJ)=>y(CJ(i[0],i[1],0))[0]-y(CJ(YJ[0],YJ[1],0))[0])[0],[QJ,KJ]=y(CJ(m,g,0));C+=T(w[0],0,-q*1.22,-1)+T(w[1],-z*1.22,0,-1)+VJ(w[2],QJ-8,KJ,D-2,400,Y.sub,"end"),h(U,Q,J.w,J.h);break}case"pointcloud":{let[M,A]=k(J.color),w=(J.attrs.points?JSON.parse(J.attrs.points):E0(J.attrs.shape??"torus",+J.attrs.n||240)).map((R)=>[...CJ(R[0],R[1],R[2]),R[3]]),z=jV(w,U,Q,J.w,J.h,4),q=w.map((R)=>R[2]),r=Math.min(...q),y=Math.max(...q);w.sort((R,P)=>P[2]-R[2]);for(let R of w){let P=(y-R[2])/(y-r||1),[c,n]=z(R),T=R[3]!==void 0?Y.c[LV(R[3])][1]:DJ(M,A,0.3+0.7*P);C+=a`<circle cx="${c}" cy="${n}" r="${1+1.4*P}" fill="${T}" fill-opacity="${0.5+0.5*P}"/>`}h(U,Q,J.w,J.h);break}case"waveform":{C=e(uJ(U,Q,J.w,J.h,6));let M=J.attrs.wave?JSON.parse(J.attrs.wave):q0(72),A=6,b=J.y,w=J.h/2-A,z=(J.w-2*A)/M.length,q="";M.forEach(([r,y],R)=>{let P=U+A+z*(R+0.5);q+=a`M${P},${b-Math.max(y,0.02)*w}V${b-Math.min(r,-0.02)*w}`}),C+=`<path d="${q}" stroke="${N}" stroke-width="${HJ(Math.max(0.8,z*0.6))}" stroke-linecap="round"/>`;break}case"sphere":{let[M,A]=k(J.color),b=Math.min(J.w,J.h)/2-2,w="sph-"+S(J.color);if(!F.has(w))F.set(w,`<radialGradient id="${I}${w}" cx=".35" cy=".3" r=".8"><stop offset="0" stop-color="${Y.dark?DJ(M,A,0.35):"#ffffff"}"/><stop offset=".55" stop-color="${M}"/><stop offset="1" stop-color="${DJ(M,A,0.35)}"/></radialGradient>`);C+=a`<circle cx="${J.x}" cy="${J.y}" r="${b}" fill="url(#${I}${w})" stroke="${A}"/>`;let z="",q="",r=(R)=>{let P;for(let c=0;c<=64;c++){let[n,T,m]=CJ(...R(c/64*Math.PI*2)),g=m<=0,QJ=(g===P?"L":"M")+HJ(J.x+n*b)+","+HJ(J.y+T*b);if(g)z+=QJ;else q+=QJ;P=g}};for(let R of[-0.5,0,0.5]){let P=Math.sqrt(1-R*R);r((c)=>[P*Math.cos(c),P*Math.sin(c),R])}for(let R of[0,Math.PI/3,2*Math.PI/3])r((P)=>[Math.cos(P)*Math.cos(R),Math.cos(P)*Math.sin(R),Math.sin(P)]);C+=`<path d="${q}" fill="none" stroke="${A}" stroke-opacity=".22" stroke-dasharray="2 2"/><path d="${z}" fill="none" stroke="${A}" stroke-opacity=".55"/>`;let y=JSON.parse(J.attrs.points??"[]");for(let R of y){let P=Math.hypot(R[0],R[1],R[2])||1,[c,n,T]=CJ(R[0]/P,R[1]/P,R[2]/P),m=Y.c[LV(R[3]??0)][1];C+=a`<circle cx="${J.x+c*b}" cy="${J.y+n*b}" r="3" fill="${m}" stroke="${Y.dark?"#0e1117":"#fff"}" stroke-width=".8" opacity="${T<=0?1:0.3}"/>`}h(U,Q,J.w,J.h);break}default:{let M=J.shape==="thin"?5:7;C=e(uJ(U,Q,J.w,J.h,M),void 0,M)+BJ()}}if(EV.has(J.shape)&&J.label)C+=VJ(J.label,J.x,Q-l*5-11,XJ,500,Y.sub);if(J.attrs.caption)C+=VJ(J.attrs.caption,J.x,J.y+J.h/2+12,D-1,400,Y.sub);let _J=t(J,H);if(_J){let M=J.shape==="op"||J.shape==="circle";C+=M?IJ(_J,J.x+J.w*0.36,J.y-J.h*0.36):IJ(_J,U+J.w-2,Q+2)}if(J.flags.has("crossed")){let M=J.shape==="op"||J.shape==="circle"?J.w*0.15:3;C=`<g opacity=".5">${C}</g>`+fJ(U+M,Q+M,U+J.w-M,Q+J.h-M,2.2)}return`<g>${C}</g>`},fJ=(J,U,Q,Z,N)=>{let H=a`M${J},${U}L${Q},${Z}M${Q},${U}L${J},${Z}`,L=Y.c.red[1];return`<path d="${H}" stroke="${Y.halo}" stroke-width="${N+2.5}" stroke-linecap="round"/><path d="${H}" stroke="${L}" stroke-width="${N}" stroke-linecap="round"/>`},NV=()=>V.dir==="RL",rJ=()=>V.dir==="BT",hJ=(J)=>{if(YV(J))return"";let U=J.attrs.color,Q=!U?Y.edge:Y.c[U]||DV(U)?k(U)[1]:gJ(U);if(J.fc)return RJ(J,Q);let Z=J.pts.map((C)=>[...C]);if(Z.length<2)return"";let N=J.op==="=>"||J.flags.has("thick"),H=J.op.startsWith("..")||J.flags.has("dashed"),L=J.op==="--"||J.op===".."?0:J.op==="<->"?2:1,o=N?9:7.5,x=N?4.2:3.4,l="",FJ=(C,XJ)=>{let p=C[0]-XJ[0],$J=C[1]-XJ[1],BJ=Math.hypot(p,$J)||1,_J=p/BJ,M=$J/BJ,A=C[0]-_J*o,b=C[1]-M*o;return l+=`<path d="${lJ(C[0],C[1],A-M*x,b+_J*x,C[0]-_J*o*0.72,C[1]-M*o*0.72,A+M*x,b-_J*x)}" fill="${Q}"/>`,[C[0]-_J*o*0.7,C[1]-M*o*0.7]};for(let C of Z)h(C[0]-2,C[1]-2,4,4);let e;if(J.curve){let[C,XJ,p,$J]=Z,BJ=J.curve,_J=[C[0]+(XJ[0]-C[0])*BJ,C[1]+(XJ[1]-C[1])*BJ],M=[$J[0]+(p[0]-$J[0])*BJ,$J[1]+(p[1]-$J[1])*BJ],A=L?FJ($J,M):$J,b=L===2?FJ(C,_J):C;e=a`M${b[0]},${b[1]}C${_J[0]},${_J[1]} ${M[0]},${M[1]} ${A[0]},${A[1]}`}else{if(L)Z[Z.length-1]=FJ(Z[Z.length-1],Z[Z.length-2]);if(L===2)Z[0]=FJ(Z[0],Z[1]);e=a`M${Z[0][0]},${Z[0][1]}`;for(let C=1;C<Z.length-1;C++){let[XJ,p,$J]=[Z[C-1],Z[C],Z[C+1]],BJ=Math.hypot(p[0]-XJ[0],p[1]-XJ[1]),_J=Math.hypot($J[0]-p[0],$J[1]-p[1]),M=Math.min(8,BJ/2,_J/2);e+=a`L${p[0]+(XJ[0]-p[0])*M/(BJ||1)},${p[1]+(XJ[1]-p[1])*M/(BJ||1)}Q${p[0]},${p[1]} ${p[0]+($J[0]-p[0])*M/(_J||1)},${p[1]+($J[1]-p[1])*M/(_J||1)}`}e+=a`L${Z[Z.length-1][0]},${Z[Z.length-1][1]}`}if(J.flags.has("crossed")){let C=0,XJ=-1;for(let BJ=0;BJ+1<J.pts.length;BJ++){let _J=Math.hypot(J.pts[BJ+1][0]-J.pts[BJ][0],J.pts[BJ+1][1]-J.pts[BJ][1]);if(_J>XJ)XJ=_J,C=BJ}let p=(J.pts[C][0]+J.pts[C+1][0])/2,$J=(J.pts[C][1]+J.pts[C+1][1])/2;l+=fJ(p-5,$J-5,p+5,$J+5,2)}return a`<path d="${e}" fill="none" stroke="${Q}" stroke-width="${N?2.2:1.4}" stroke-linecap="round" stroke-linejoin="round"${H?' stroke-dasharray="5 4"':""}/>`+l},dJ=(J)=>{let U=+J.attrs.n||4;return Array.from({length:U},(Q,Z)=>{let N=-((U-1)/2)*20+Z*20;return O?[J.x,J.y+N]:[J.x+N,J.y]})},RJ=(J,U)=>{let Q="";for(let[Z,N]of dJ(oJ(J.from)))for(let[H,L]of dJ(oJ(J.to))){let o=Math.hypot(H-Z,L-N),x=(H-Z)/o,l=(L-N)/o;Q+=a`M${Z+x*7},${N+l*7}L${H-x*7},${L-l*7}`}return`<path d="${Q}" stroke="${U}" stroke-opacity=".45" stroke-width=".8"/>`},oJ=(J)=>V.nodes.get(J),BV=(J)=>{if(!J.w)return"";let{fill:U,stroke:Q,fx:Z}=J.attrs.texture||J.flags.has("frozen")||J.flags.has("train")?OJ(J):{fill:J.attrs.color?k(J.attrs.color)[0]:Y.group[0],stroke:J.attrs.color?k(J.attrs.color)[1]:Y.group[1],fx:""},N=J.flags.has("dashed")?' stroke-dasharray="5 4"':"",H=uJ(J.x,J.y,J.w,J.h,12),L=`<path d="${H}" fill="${U}" stroke="${Q}" stroke-width="1.2"${N}/>`,o=EJ(Z,H,J.x,J.y,J.w,J.h,J.attrs.color);if(o)L+=o+`<path d="${H}" fill="none" stroke="${Q}" stroke-width="1.2" stroke-opacity=".7"/>`;else if(Z==="ice")L+=`<path d="${H}" fill="url(#${I}frost)"/>`+vJ(J.x,J.y,J.w,12);if(h(J.x,J.y,J.w,J.h),J.label)L+=VJ(J.label,J.x+12,J.y+13,D-2,600,Y.sub,"start");if(J.attrs.repeat){let[x,l,FJ]=iJ(J);L+=VJ(J.attrs.repeat,x,l,D+2,500,Y.text,FJ)}return L+=IJ(t(J,Z),J.x+J.w-2,J.y+2),L},bJ=[...V.nodes.values()],KV=bJ.reduce((J,U)=>J+U.x,0)/(bJ.length||1),PJ=(J,U)=>J[0]<U[2]&&J[2]>U[0]&&J[1]<U[3]&&J[3]>U[1],sJ=[],QV=(J)=>{let U=new Set;for(let Z=J;Z;Z=V.groups.find((N)=>N.id===Z.parent))U.add(Z.id);let Q=bJ.map((Z)=>[Z.x-Z.w/2,Z.y-Z.h/2,Z.x+Z.w/2,Z.y+Z.h/2+(Z.attrs.caption?20:0)]);for(let Z of V.edges){for(let N=0;N+1<Z.pts.length;N++){let[H,L]=[Z.pts[N],Z.pts[N+1]];Q.push([Math.min(H[0],L[0])-2,Math.min(H[1],L[1])-2,Math.max(H[0],L[0])+2,Math.max(H[1],L[1])+2])}if(Z.label&&Z.lx!==void 0){let N=qJ(Z.label,D-1);Q.push([Z.lx-N.w/2,Z.ly-N.h/2,Z.lx+N.w/2,Z.ly+N.h/2])}}for(let Z of V.groups)if(Z.w&&!U.has(Z.id)&&Z.parent!==J.id)Q.push([Z.x,Z.y,Z.x+Z.w,Z.y+Z.h]);return[...Q,...sJ]},iJ=(J)=>{let U=qJ(J.attrs.repeat,D+2,500),Z={left:(l=0.5)=>[J.x-10,J.y+J.h*l,"end"],right:(l=0.5)=>[J.x+J.w+10,J.y+J.h*l,"start"],top:()=>[J.x+J.w/2,J.y-10-U.h/2,"middle"],bottom:()=>[J.x+J.w/2,J.y+J.h+10+U.h/2,"middle"]},N=([l,FJ,e])=>[e==="end"?l-U.w:e==="middle"?l-U.w/2:l,FJ-U.h/2,e==="start"?l+U.w:e==="middle"?l+U.w/2:l,FJ+U.h/2],H=J.x+J.w/2>KV?"right":"left",L=H==="right"?"left":"right",o=J.attrs["repeat-side"],x=o&&o!=="auto"?Z[o]():void 0;if(!x){let l=[Z[H](),Z.bottom(),Z[L](),Z.top(),...[0.25,0.75].flatMap((e)=>[Z[H](e),Z[L](e)])],FJ=QV(J);x=l.find((e)=>!FJ.some((C)=>PJ(N(e),C)))??l[0]}return sJ.push(N(x)),x},IV=bJ.filter((J)=>J.shape==="magnify").map((J)=>{let U=mJ(J);if(!U)return"";let Q=kJ(U),[Z,N,H,L]=pJ(J,U),[o,x,l,FJ]=_V(U.attrs),e=Q.x0+(Q.k-1)*6,C=Q.y0+(Q.k-1)*6,XJ=(P,c)=>{let n=e+P*Q.W-U.x,T=C+c*Q.H-U.y;return[U.x+o*n+l*T,U.y+x*n+FJ*T]},p=[XJ(Z,N),XJ(Z+H,N),XJ(Z+H,N+L),XJ(Z,N+L)],[$J,BJ]=p.reduce((P,c)=>[P[0]+c[0]/4,P[1]+c[1]/4],[0,0]),_J=Math.hypot(J.x-$J,J.y-BJ)||1,M=-(J.y-BJ)/_J,A=(J.x-$J)/_J,b=(P)=>P[0]*M+P[1]*A,w=[...p].sort((P,c)=>b(P)-b(c)),z=Math.min(J.w,J.h)/2,q=J.attrs.lens==="square"?[[J.x-J.w/2,J.y-J.h/2],[J.x+J.w/2,J.y-J.h/2],[J.x+J.w/2,J.y+J.h/2],[J.x-J.w/2,J.y+J.h/2]].sort((P,c)=>b(P)-b(c)):[[J.x-M*z,J.y-A*z],[J.x+M*z,J.y+A*z]],[r,y]=[q[0],q[q.length-1]],R=k(J.color)[1];return`<path d="M${p.map((P)=>P.map(HJ).join(",")).join("L")}z" fill="none" stroke="${R}" stroke-width="2" stroke-linejoin="round"/><path d="M${w[0].map(HJ)}L${r.map(HJ)}M${w[3].map(HJ)}L${y.map(HJ)}" stroke="${R}" stroke-opacity=".75" stroke-dasharray="3 3"/>`}).join(""),zJ=V.groups.map(BV).join(""),GV=V.edges.map(hJ).join(""),$=[...V.nodes.values()].map(yJ).join(""),B=V.edges.filter((J)=>J.label&&J.lx!==void 0).map((J)=>VJ(J.label,J.lx,J.ly,D-1,400,Y.sub)).join("");if(j===1/0)j=f=v=d=0;let _=14,G=v-j+_*2,u=d-f+_*2,W=Y.bg!=="none"?a`<rect x="${j-_}" y="${f-_}" width="${G}" height="${u}" rx="10" fill="${Y.bg}"/>`:"";return a`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${j-_} ${f-_} ${G} ${u}" width="${G}" height="${u}" font-family='${gV}' style="max-width:100%;height:auto" role="img">`+`<defs>${[...F.values()].join("")}</defs>${W}<g>${zJ}</g><g>${GV}</g><g>${$}</g><g>${IV}</g><g paint-order="stroke" stroke="${Y.halo}" stroke-width="4" stroke-linejoin="round">${B}</g></svg>`}class zV{nodes=new Map;edges=[];groups=new Map;scope=[];ranks=[];ids=new Set;claim(V,X,K){if(V===void 0)while(this.ids.has(V=`${X}${K}`))K++;else if(this.ids.has(V))throw Error(`duplicate id "${V}"`);return this.ids.add(V),V}node(V){let X=this.nodes.get(V);if(!X){let K=this.claim(V.options.id,"n",this.nodes.size),Y=this.scope.map((I)=>this.groups.get(I)?.id).filter((I)=>!!I);X={id:K,mods:[...this.scope],groups:Y},this.nodes.set(V,X)}return X.id}apply(V,X){let K=this.node(V);for(let Y of X)this.edges.push({from:Y.node,to:V,style:Y.style});return new jJ(this,K)}enter(V){let X=V.options;if((X.box??!!(X.label||X.repeat))&&!this.groups.has(V)){let K=[...this.scope].reverse().map((Y)=>this.groups.get(Y)).find(Boolean);this.groups.set(V,{id:this.claim(X.id,"g",this.groups.size),label:X.label??"",parent:K?.id,flags:new Set(X.dashed?["dashed"]:[]),attrs:{...X.repeat&&{repeat:X.repeat},...X.repeatSide&&{"repeat-side":X.repeatSide},...X.color&&{color:X.color},...X.texture&&{texture:X.texture}},x:0,y:0,w:0,h:0})}this.scope.push(V)}id(V){if(V instanceof jJ)return V.node;let X=this.nodes.get(V);if(!X)throw Error(`"${V.label}" is not part of this figure`);return X.id}}class jJ{graph;node;style;constructor(V,X,K={}){this.graph=V;this.node=X;this.style=K}edge(V){return new jJ(this.graph,this.node,{...this.style,...typeof V==="string"?{label:V}:V})}}var J0=(V,X)=>{let K=V[0]?.graph;if(!K)throw Error(`${X} was called without inputs; start from fig.input()`);if(V.some((Y)=>!(Y instanceof jJ)||Y.graph!==K))throw Error(`${X}: inputs must be Tensors of the same figure`);return K};function TJ(V,X,K,Y=V,I={}){let O=(...D)=>J0(D,`"${O.label}"`).apply(O,D);return Object.assign(O,{shape:V,kind:Y,label:X,options:K,defaults:I,freeze(){return O.options.frozen=!0,O.options.trainable=!1,O},trainable(){return O.options.trainable=!0,O.options.frozen=!1,O}})}function JJ(V,X="",K={}){let{kind:Y=V,...I}=typeof K==="string"?{color:K}:K;return(O,D)=>{let[F,E]=typeof O==="string"?[O,D??{}]:[X,O??{}];return TJ(V,F,{...E},Y,I)}}var j0=JJ("block"),L0=JJ("thin"),V0=JJ("text"),S0=JJ("circle"),wV=JJ("op","+"),v0=JJ("enc","Encoder","blue"),z0=JJ("dec","Decoder","green"),w0=JJ("tensor","","blue"),u0=JJ("stack","","blue"),T0=JJ("neurons");function k0(V,X,K){let[Y,I]=typeof X==="string"?[X,K??{}]:["",X??{}];return TJ("vector",Y,{...I,values:V})}var m0=JJ("block","Multi-Head Attention",{color:"orange",kind:"mha"}),y0=JJ("block","Attention",{color:"orange",kind:"attention"}),f0=JJ("block","Feed Forward",{color:"blue",kind:"ffn"}),h0=JJ("block","MLP",{color:"blue",kind:"mlp"}),b0=JJ("thin","Add & Norm",{color:"yellow",kind:"norm"}),x0=JJ("block","Embedding",{color:"pink",kind:"embed"}),g0=JJ("thin","Linear",{color:"purple",kind:"linear"}),l0=JJ("thin","Softmax",{color:"green",kind:"softmax"}),c0=JJ("thin","MatMul",{color:"purple",kind:"matmul"}),p0=JJ("thin","Concat",{color:"yellow",kind:"concat"}),d0=JJ("block","Conv",{color:"teal",kind:"conv"}),o0=JJ("thin","Pool",{color:"gray",kind:"pool"}),i0=JJ("thin","ReLU",{color:"green",kind:"act"}),a0=JJ("thin","Dropout",{color:"gray",kind:"dropout"}),t0=JJ("block","Loss",{color:"red",kind:"loss"}),r0=JJ("gaussian","","purple"),s0=JJ("space","","gray"),e0=JJ("sphere","","blue"),n0=JJ("pointcloud","","blue");function J4(V,X){let[K,{samples:Y,...I}]=typeof V==="string"?[V,X??{}]:["",V??{}],O;if(Y?.length){let D=Math.min(256,Y.length),F=(E)=>Math.round(E*1000)/1000;O=Array.from({length:D},(E,S)=>{let j=1/0,f=-1/0;for(let v=Math.floor(S*Y.length/D);v<Math.floor((S+1)*Y.length/D);v++)j=Math.min(j,Y[v]),f=Math.max(f,Y[v]);return[F(j),F(f)]})}return TJ("waveform",K,{...I,...O&&{wave:O}},"waveform",{color:"teal"})}var SV=(V)=>typeof V==="string"?V:("toDataURL"in V)?V.toDataURL("image/png"):V.currentSrc||V.src||"";function V4(V,X,K){let[Y,I]=typeof X==="string"?[X,K??{}]:["",X??{}],O=Array.isArray(V)?V.map(SV):[SV(V)];return TJ("image",Y,{n:O.length>1?O.length:void 0,...I,src:O[0],...O.length>1&&{srcs:O}})}function $4(V,X){let[K,{src:Y,...I}]=typeof V==="string"?[V,X??{}]:["",V??{}];return TJ("magnify",K,{...I,...Y&&{src:SV(Y)}},"magnify",{color:"orange"})}var $0=(V,X)=>V===void 0?{v:Math.abs(Math.sin(X*12.9898+4.1)*43758.5453)%1}:typeof V==="number"?{v:V}:typeof V==="string"?{c:V}:{v:V.value,c:V.color,t:V.texture,l:V.label,x:V.crossed};function U4(V,X){let[K,{cells:Y,...I}]=typeof V==="string"?[V,X??{}]:["",V??{}],O=I.rows??(Array.isArray(Y)?Y.length:5),D=I.cols??(Array.isArray(Y)?Math.max(0,...Y.map((S)=>S.length)):5),F=(S,j)=>typeof Y==="function"?Y(S,j):Y?.[S]?.[j],E=Array.from({length:O},(S,j)=>Array.from({length:D},(f,v)=>$0(F(j,v),j*31+v)));return TJ("matrix",K,{...I,rows:O,cols:D,grid:E},"matrix",{color:"blue"})}function X4(V,X){let[K,{cells:Y,...I}]=typeof V==="string"?[V,X??{}]:["",V??{}],O=Array.isArray(Y)?Y:void 0,D=I.rows??O?.length??5,F=I.cols??(O?Math.max(0,...O.map((v)=>v.length)):5),E=I.depth??(O?Math.max(0,...O.flatMap((v)=>v.map((d)=>d.length))):5),S=(v,d,h)=>$0(typeof Y==="function"?Y(v,d,h):Y?.[v]?.[d]?.[h],v*97+d*31+h*7),j=(v,d,h)=>Array.from({length:v},(k,MJ)=>Array.from({length:d},(UJ,s)=>h(MJ,s))),f={front:j(D,F,(v,d)=>S(v,d,0)),top:j(E,F,(v,d)=>S(0,d,v)),side:j(D,E,(v,d)=>S(v,F-1,d))};return TJ("voxels",K,{...I,rows:D,cols:F,depth:E,faces:f},"voxels",{color:"blue"})}var Y4=(...V)=>wV("+")(...V),B4=(...V)=>wV("*")(...V);class U0{constructor(V={}){let X=(...K)=>{let Y=J0(K,X.constructor.name||"module");Y.enter(X);try{return X.forward(...K)}finally{Y.scope.pop()}};return delete X.name,delete X.length,Object.setPrototypeOf(X,new.target.prototype),X.options={...V},X}freeze(){return this.options.frozen=!0,this.options.trainable=!1,this}trainable(){return this.options.trainable=!0,this.options.frozen=!1,this}}var XV={};function K4(V){if(V===null)AV(void 0);else if("tex"in V)AV(V.tex);let{tex:X,...K}=V??{};return XV=V===null?{}:vV(XV,K),structuredClone(XV)}var vV=(V,X)=>{let K={...V.kinds};for(let[Y,I]of Object.entries(X.kinds??{}))K[Y]={...K[Y],...I};return{...V,...X,style:{...V.style,...X.style},kinds:K}},Q4=(...V)=>{let X={};for(let K of V)for(let[Y,I]of Object.entries(K??{}))if(I!==void 0)X[Y]=I;return X},I4=new Set(["id","color","frozen","trainable","dashed","bold","crossed"]),_4={leftOf:"left-of",rightOf:"right-of"};class uV{options;g=new zV;constructor(V={}){this.options={...V}}input(V="",X={}){if(typeof V!=="string")Object.assign(V.options,X);let K=typeof V==="string"?V0(V,X):V;return new jJ(this.g,this.g.node(K))}edge(V,X,K={}){if(V.graph!==this.g)throw Error("edge: tensor belongs to another figure");if(!(X instanceof jJ))this.g.node(X);return this.g.edges.push({from:V.node,to:X,style:{...V.style,...typeof K==="string"?{label:K}:K}}),this}rank(...V){return this.g.ranks.push(V),this}diagram(){let V=this.g,X=new Map,K=vV(XV,this.options),Y=0;for(let[O,D]of V.nodes){let F=[K,...D.mods.map((s)=>s.options)],E=O.options,S=Q4(O.defaults,...F.flatMap((s)=>[s?.style,s?.kinds?.[O.kind]]),E),j=O.label,f=(s)=>{if(!j.includes(s))return!1;return j=j.replace(s,"").trim(),!0},v=f("\uD83E\uDDCA"),d=f("\uD83D\uDD25"),h=[...D.mods].reverse().map((s)=>s.options).find((s)=>s.frozen||s.trainable),k=E.frozen||v?"frozen":E.trainable||d?"train":h?.frozen?"frozen":h?.trainable?"train":"";if(k&&!E.texture)delete S.texture;let MJ=new Set([k,S.dashed&&"dashed",S.bold&&"bold",S.crossed&&"crossed"].filter((s)=>!!s)),UJ={};for(let[s,OJ]of Object.entries(S)){if(I4.has(s)||OJ===void 0)continue;UJ[_4[s]??s]=OJ instanceof jJ||typeof OJ==="function"?V.id(OJ):Array.isArray(OJ)&&OJ.every((VJ)=>typeof VJ==="number")?OJ.join(","):typeof OJ==="object"?JSON.stringify(OJ):String(OJ)}X.set(D.id,{id:D.id,shape:O.shape,label:j,color:S.color,flags:MJ,attrs:UJ,groups:D.groups,order:Y++,x:0,y:0,w:0,h:0})}let I=V.edges.map(({from:O,to:D,style:F})=>({from:O,to:V.id(D),label:F.label,pts:[],op:F.dense?"=>":F.arrow==="none"?F.dashed?"..":"--":F.arrow==="both"?"<->":F.dashed?"..>":"->",flags:new Set([...["skip","curve","thick","dashed","crossed"].filter((E)=>F[E]),...F.join?["join"]:[]]),attrs:{...F.side&&{side:F.side},...F.color&&{color:F.color}}}));return{dir:K.flow??"TB",theme:K.theme??"light",gap:K.gap,fontSize:K.style?.fontSize,nodes:X,edges:I,groups:[...V.groups.values()].map((O)=>({...O,flags:new Set(O.flags)})),ranks:V.ranks.map((O)=>O.map((D)=>V.id(D)))}}svg(V={}){let X=this.diagram();return MV(VV(X),V.theme??X.theme,vV(XV,this.options).materials??!0)}async toBlob(V={}){let X=V.format??"svg",K=this.svg({theme:V.theme});if(X==="svg")return new Blob([K],{type:"image/svg+xml"});if(!["png","jpeg","webp"].includes(X))throw Error(`export: unknown format "${X}" (svg, png, jpeg, webp)`);return Z4(K,{...V,format:X},`image/${X}`)}async download(V="figure.svg",X={}){let K=/\.(\w+)$/.exec(V)?.[1].toLowerCase(),Y=X.format??(K==="jpg"?"jpeg":K)??"svg",I=URL.createObjectURL(await this.toBlob({...X,format:Y}));Object.assign(document.createElement("a"),{href:I,download:V}).click(),setTimeout(()=>URL.revokeObjectURL(I),1000)}mount(V,X={}){let K=typeof V==="string"?document.querySelector(V):V;if(!K)throw Error(`mount: no element matches "${V}"`);return K.innerHTML=this.svg(X),this}}async function O4(V){let X=[...new Set([...V.matchAll(/<image href="(?!data:)([^"]+)"/g)].map((K)=>K[1].replace(/&amp;/g,"&")))];for(let K of X)try{let Y=await(await fetch(K)).blob(),I=await new Promise((O,D)=>{let F=new FileReader;F.onload=()=>O(F.result),F.onerror=D,F.readAsDataURL(Y)});V=V.split(`href="${K.replace(/&/g,"&amp;")}"`).join(`href="${I}"`)}catch{}return V}async function Z4(V,X,K){if(typeof document>"u")throw Error(`export: ${X.format} needs a browser (canvas); in Node use svg()`);let[,Y,I]=/width="([\d.]+)" height="([\d.]+)"/.exec(V)??[],O=X.scale??2,D=new Image;D.src="data:image/svg+xml;charset=utf-8,"+encodeURIComponent(await O4(V)),await D.decode();let F=document.createElement("canvas");F.width=Math.ceil(+Y*O),F.height=Math.ceil(+I*O);let E=F.getContext("2d"),S=X.background??(K==="image/jpeg"?"#ffffff":"");if(S)E.fillStyle=S,E.fillRect(0,0,F.width,F.height);return E.drawImage(D,0,0,F.width,F.height),new Promise((j,f)=>F.toBlob((v)=>v?j(v):f(Error("export: canvas.toBlob failed")),K,X.quality??0.92))}function F4(V,X){let[K,Y]=typeof V==="function"?[{},V]:[V,X],I=new uV(K);return Y(I),I}function D4(V,X={}){return MV(VV(V),X.theme,X.materials??!0)}var v4={...TV,draw:D4,layout:VV,THEMES:FV};export{J4 as waveform,X4 as voxels,k0 as vector,L0 as thin,V0 as text,w0 as tensor,u0 as stack,e0 as sphere,s0 as space,l0 as softmax,JJ as preset,o0 as pool,n0 as pointcloud,wV as op,b0 as norm,T0 as neurons,B4 as mul,h0 as mlp,m0 as mha,U4 as matrix,c0 as matmul,$4 as magnify,t0 as loss,g0 as linear,VV as layout,TJ as layer,V4 as image,r0 as gaussian,F4 as figure,f0 as ffn,v0 as enc,x0 as embed,a0 as dropout,D4 as draw,v4 as default,z0 as dec,d0 as conv,K4 as configure,p0 as concat,S0 as circle,j0 as block,y0 as attention,Y4 as add,i0 as act,jJ as Tensor,FV as THEMES,U0 as Module,zV as Graph,uV as Figure};