u?o:u,p=sf?s:f,i=o,r=s,a=x}const w=u-d,C=f-p;for(let e=0;e<=n;e++)t[e][0]-=d,t[e][0]/=w/2,t[e][0]-=1,t[e][1]-=p,t[e][1]/=C/2,t[e][1]-=1;return t},Y=n=>{b=E(n),l.draw(b)};P({scatterplot:l,setNumPoints:Y});Y(k);
diff --git a/assets/embedded-C8UqjovM.js b/assets/embedded-C8UqjovM.js
new file mode 100644
index 00000000..2e83a549
--- /dev/null
+++ b/assets/embedded-C8UqjovM.js
@@ -0,0 +1,4 @@
+import{c as E,a as L,s as H,b as q}from"./menu-CKBxhbUC.js";import"./vendor-DRFCw67i.js";const d=document.querySelector("#canvas"),l=document.querySelector("#num-points"),p=document.querySelector("#num-points-value"),m=document.querySelector("#point-size"),M=document.querySelector("#point-size-value"),v=document.querySelector("#opacity"),k=document.querySelector("#opacity-value"),y=document.querySelector("#click-lasso-initiator"),b=document.querySelector("#reset"),I=document.querySelector("#export"),S=document.querySelector("#example-basic"),i=d.parentNode;i.style.padding="15rem 0";i.style.height="100vh";i.parentNode.style.overflow="auto";S.setAttribute("class","active");S.removeAttribute("href");let r=[],o=1e5,n=4,a=.33,c=[];const P=[1,1,.878431373,.33],z=({points:e})=>{if(c=e,c.length===1){const s=r[c[0]];console.log(`Selected: ${e}`,`X: ${s[0]}
+Y: ${s[1]}
+Category: ${s[2]}
+Value: ${s[3]}`)}},$=()=>{c=[]},t=E({canvas:d,pointSize:n,showReticle:!0,reticleColor:P,lassoInitiator:!0});L(t);I.addEventListener("click",()=>H(t));console.log(`Scatterplot v${t.get("version")}`);t.subscribe("select",z);t.subscribe("deselect",$);const f=e=>new Array(e).fill().map(()=>[-.8+Math.random()*1.6,-.8+Math.random()*1.6,Math.round(Math.random()),Math.random()]),u=e=>{o=e,l.value=o,p.innerHTML=o,r=f(o),t.draw(r)};q({scatterplot:t,setNumPoints:u});const w=e=>{p.innerHTML=`${+e.target.value} release to redraw `};l.addEventListener("input",w);const C=e=>u(+e.target.value);l.addEventListener("change",C);const g=e=>{n=e,m.value=n,M.innerHTML=n,t.set({pointSize:n})},x=e=>g(+e.target.value);m.addEventListener("input",x);const h=e=>{a=e,v.value=a,k.innerHTML=a,t.set({opacity:a})},A=e=>h(+e.target.value);v.addEventListener("input",A);const T=e=>{t.set({lassoInitiator:e.target.checked})};y.addEventListener("change",T);y.checked=t.get("lassoInitiator");const V=()=>{t.reset()};b.addEventListener("click",V);g(n);h(a);u(o);
diff --git a/assets/index-DZnwqjzW.js b/assets/index-DZnwqjzW.js
new file mode 100644
index 00000000..43bdac50
--- /dev/null
+++ b/assets/index-DZnwqjzW.js
@@ -0,0 +1,10 @@
+import{c as u,a as y,b as i}from"./menu-CKBxhbUC.js";import"./vendor-DRFCw67i.js";const b=document.querySelector("#canvas");let e={x:[],y:[],z:[],w:[]},$=1e5,d=2,m=.33,c=[];const g=10,f=2,p=!0,v=[1,1,.878431373,.33],w=o=>{const s=e.x[o],a=e.y[o],n=e.z[o],r=e.w[o];console.log(`Out point: ${o}`,`X: ${s}
+Y: ${a}
+Category: ${n}
+Value: ${r}`)},x=o=>{const s=e.x[o],a=e.y[o],n=e.z[o],r=e.w[o];console.log(`Out point: ${o}`,`X: ${s}
+Y: ${a}
+Category: ${n}
+Value: ${r}`)},M=({points:o})=>{if(c=o,c.length===1){const s=e.x[c[0]],a=e.y[c[0]],n=e.z[c[0]],r=e.w[c[0]];console.log(`Selected: ${o}`,`X: ${s}
+Y: ${a}
+Category: ${n}
+Value: ${r}`)}},C=()=>{console.log("Deselected:",c),c=[]},t=u({canvas:b,lassoMinDelay:g,lassoMinDist:f,pointSize:d,showReticle:p,reticleColor:v,opacity:m,lassoOnLongPress:!0,lassoType:"brush"});y(t);console.log(`Scatterplot v${t.get("version")}`);t.subscribe("pointover",w);t.subscribe("pointout",x);t.subscribe("select",M);t.subscribe("deselect",C);const S=o=>({x:Array.from({length:o},()=>-1+Math.random()*2),y:Array.from({length:o},()=>-1+Math.random()*2),z:Array.from({length:o},()=>Math.round(Math.random())),w:Array.from({length:o},()=>Math.random())}),l=o=>{e=S($),t.draw(e)};i({scatterplot:t,setNumPoints:l});const h=["#3a78aa","#aa3a99"];t.set({colorBy:"category",pointColor:h});const z=["#002072","#162b79","#233680","#2e4186","#394d8d","#425894","#4b649a","#5570a1","#5e7ca7","#6789ae","#7195b4","#7ba2ba","#85aec0","#90bbc6","#9cc7cc","#a9d4d2","#b8e0d7","#c8ecdc","#ddf7df","#ffffe0"];t.set({colorBy:"value",pointColor:z});l();
diff --git a/assets/menu-CKBxhbUC.js b/assets/menu-CKBxhbUC.js
new file mode 100644
index 00000000..e8b55aeb
--- /dev/null
+++ b/assets/menu-CKBxhbUC.js
@@ -0,0 +1,369 @@
+import{g as Ki,q as Va,h as Ha,i as Wa,l as Ga,j as Ya,k as Za,p as ja,m as Qe,n as kt,t as qi,w as Ka,o as qa,r as Ni,s as Xa,u as Ja,v as Qa,f as ec,x as tc,y as at,z as nc,A as dn,C as Cn,D as oc,E as To,F as Po,G as ic,H as Mi,I as sc,J as rc,K as Bi,L as ac,V as cc,M as lc,N as dc,O as uc,P as bn,Q as fc}from"./vendor-DRFCw67i.js";(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))m(d);new MutationObserver(d=>{for(const a of d)if(a.type==="childList")for(const I of a.addedNodes)I.tagName==="LINK"&&I.rel==="modulepreload"&&m(I)}).observe(document,{childList:!0,subtree:!0});function i(d){const a={};return d.integrity&&(a.integrity=d.integrity),d.referrerPolicy&&(a.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?a.credentials="include":d.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function m(d){if(d.ep)return;d.ep=!0;const a=i(d);fetch(d.href,a)}})();const mc="1.15.0",hc=`
+precision mediump float;
+
+uniform sampler2D texture;
+
+varying vec2 uv;
+
+void main () {
+ gl_FragColor = texture2D(texture, uv);
+}
+`,gc=`
+precision mediump float;
+
+uniform mat4 modelViewProjection;
+
+attribute vec2 position;
+
+varying vec2 uv;
+
+void main () {
+ uv = position;
+ gl_Position = modelViewProjection * vec4(-1.0 + 2.0 * uv.x, 1.0 - 2.0 * uv.y, 0, 1);
+}
+`,Ye="auto",yc=0,Co=1,pc=2,Fi=3,Ec=4,xc=Float32Array.BYTES_PER_ELEMENT,Xi=["OES_texture_float","OES_element_index_uint","WEBGL_color_buffer_float","EXT_float_blend"],ki={color:[0,0,0,0],depth:1},Ln="panZoom",Ji="lasso",Ho="rotate",zi=[Ln,Ji,Ho],wc=Ln,Ac={cubicIn:Za,cubicInOut:Ki,cubicOut:Ya,linear:Ga,quadIn:Wa,quadInOut:Ha,quadOut:Va},$i=Ki,Ge="continuous",mn="categorical",Ui=[Ge,mn],Wo="deselect",Yo="lassoEnd",Sc=[Wo,Yo],Vi=3,Ic=[0,.666666667,1,1],Tc=2,Pc=!1,Cc=10,bc=3,vc=Yo,Lc=!1,_n=750,On=500,Dn=100,Rn=250,_c=24,Zo="lasso",Nn="rotate",Mn="merge",Bn="remove",Oc=[Zo,Nn,Mn,Bn],Fn="alt",jo="cmd",Qi="ctrl",es="meta",Ko="shift",Dc=[Fn,jo,Qi,es,Ko],Rc={[Bn]:Fn,[Nn]:Fn,[Zo]:Ko,[Mn]:jo},Nc=1,Mc=Ye,Bc=Ye,Fc=1,bo=1,kc="asinh",zc=6,$c=2,Uc=2,vo=null,Vc=2,Hc=2,Lo=null,Wc=null,_o=null,Gc=.66,Yc=1,Oo=null,Zc=.15,jc=25,Kc=1,qc=1,un=null,Xc=[.66,.66,.66,Yc],Jc=[0,.55,1,1],Qc=[1,1,1,1],el=[0,0,0,1],Do=null,tl=[.66,.66,.66,.2],nl=[0,.55,1,1],ol=[1,1,1,1],il=[1,1,1,.5],sl=1,rl=1e3,al=[0,0],cl=1,ll=0,dl=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),ul="IMAGE_LOAD_ERROR",fl=null,ml=!1,hl=[1,1,1,.5],gl=!0,yl=!0,pl=!1,El=100,xl=1/500,wl="auto",Al=!1,Sl=200,Il=500,ts=new Set(["z","valueZ","valueA","value1","category"]),ns=new Set(["w","valueW","valueB","value2","value"]),qo=15e3,Tl=void 0,Pl=!1,Cl=.5,bl=!1,vl="lasso",os=Symbol("SKIP_DEPRECATION_VALUE_TRANSLATION"),Hi="Points have not been drawn",Ro="The instance was already destroyed",Ll="Ignoring draw call as the previous draw call has not yet finished. To avoid this warning `await` the draw call.";const is=()=>{const t=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],o=1,i=8;class m{static from(r){if(!(r instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");const[u,c]=new Uint8Array(r,0,2);if(u!==219)throw new Error("Data does not appear to be in a KDBush format.");const y=c>>4;if(y!==o)throw new Error(`Got v${y} data when expected v${o}.`);const x=t[c&15];if(!x)throw new Error("Unrecognized array type.");const[T]=new Uint16Array(r,2,1),[P]=new Uint32Array(r,4,1);return new m(P,T,x,r)}constructor(r,u=64,c=Float64Array,y){if(isNaN(r)||r<0)throw new Error(`Unexpected numItems value: ${r}.`);this.numItems=+r,this.nodeSize=Math.min(Math.max(+u,2),65535),this.ArrayType=c,this.IndexArrayType=r<65536?Uint16Array:Uint32Array;const x=t.indexOf(this.ArrayType),T=r*2*this.ArrayType.BYTES_PER_ELEMENT,P=r*this.IndexArrayType.BYTES_PER_ELEMENT,S=(8-P%8)%8;if(x<0)throw new Error(`Unexpected typed array class: ${c}.`);y&&y instanceof ArrayBuffer?(this.data=y,this.ids=new this.IndexArrayType(this.data,i,r),this.coords=new this.ArrayType(this.data,i+P+S,r*2),this._pos=r*2,this._finished=!0):(this.data=new ArrayBuffer(i+T+P+S),this.ids=new this.IndexArrayType(this.data,i,r),this.coords=new this.ArrayType(this.data,i+P+S,r*2),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,(o<<4)+x]),new Uint16Array(this.data,2,1)[0]=u,new Uint32Array(this.data,4,1)[0]=r)}add(r,u){const c=this._pos>>1;return this.ids[c]=c,this.coords[this._pos++]=r,this.coords[this._pos++]=u,c}finish(){const r=this._pos>>1;if(r!==this.numItems)throw new Error(`Added ${r} items when expected ${this.numItems}.`);return d(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(r,u,c,y){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:x,coords:T,nodeSize:P}=this,S=[0,x.length-1,0],C=[];for(;S.length;){const b=S.pop()||0,R=S.pop()||0,Y=S.pop()||0;if(R-Y<=P){for(let $=Y;$<=R;$++){const de=T[2*$],me=T[2*$+1];de>=r&&de<=c&&me>=u&&me<=y&&C.push(x[$])}continue}const H=Y+R>>1,L=T[2*H],z=T[2*H+1];L>=r&&L<=c&&z>=u&&z<=y&&C.push(x[H]),(b===0?r<=L:u<=z)&&(S.push(Y),S.push(H-1),S.push(1-b)),(b===0?c>=L:y>=z)&&(S.push(H+1),S.push(R),S.push(1-b))}return C}within(r,u,c){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:y,coords:x,nodeSize:T}=this,P=[0,y.length-1,0],S=[],C=c*c;for(;P.length;){const b=P.pop()||0,R=P.pop()||0,Y=P.pop()||0;if(R-Y<=T){for(let $=Y;$<=R;$++)B(x[2*$],x[2*$+1],r,u)<=C&&S.push(y[$]);continue}const H=Y+R>>1,L=x[2*H],z=x[2*H+1];B(L,z,r,u)<=C&&S.push(y[H]),(b===0?r-c<=L:u-c<=z)&&(P.push(Y),P.push(H-1),P.push(1-b)),(b===0?r+c>=L:u+c>=z)&&(P.push(H+1),P.push(R),P.push(1-b))}return S}}function d(f,r,u,c,y,x){if(y-c<=u)return;const T=c+y>>1;a(f,r,T,c,y,x),d(f,r,u,c,T-1,1-x),d(f,r,u,T+1,y,1-x)}function a(f,r,u,c,y,x){for(;y>c;){if(y-c>600){const C=y-c+1,b=u-c+1,R=Math.log(C),Y=.5*Math.exp(2*R/3),H=.5*Math.sqrt(R*Y*(C-Y)/C)*(b-C/2<0?-1:1),L=Math.max(c,Math.floor(u-b*Y/C+H)),z=Math.min(y,Math.floor(u+(C-b)*Y/C+H));a(f,r,u,L,z,x)}const T=r[2*u+x];let P=c,S=y;for(I(f,r,c,u),r[2*y+x]>T&&I(f,r,c,y);PT;)S--}r[2*c+x]===T?I(f,r,c,S):(S++,I(f,r,S,y)),S<=u&&(c=S+1),u<=S&&(y=S-1)}}function I(f,r,u,c){_(f,u,c),_(r,2*u,2*c),_(r,2*u+1,2*c+1)}function _(f,r,u){const c=f[r];f[r]=f[u],f[u]=c}function B(f,r,u,c){const y=f-u,x=r-c;return y*y+x*x}return m},_l=()=>{addEventListener("message",t=>{const o=t.data.points;o.length===0&&self.postMessage({error:new Error("Invalid point data")});const i=new KDBush(o.length,t.data.nodeSize);for(const[m,d]of o)i.add(m,d);i.finish(),postMessage(i.data,[i.data])})},No=is(),Ol=1e6,Dl=t=>{const o=is.toString(),i=t.toString(),m=`const createKDBushClass = ${o};KDBush = createKDBushClass();const createWorker = ${i};createWorker();`,d=new Blob([m],{type:"text/javascript"}),a=URL.createObjectURL(d),I=new Worker(a,{name:"KDBush"});return URL.revokeObjectURL(a),I},Rl=(t,o={nodeSize:16,useWorker:void 0})=>new Promise((i,m)=>{if(t instanceof ArrayBuffer)i(No.from(t));else if((t.length{a.data.error?m(a.data.error):i(No.from(a.data)),d.terminate()},d.postMessage({points:t,nodeSize:o.nodeSize})}}),Nl=!0,Ml=8,Bl=2,Fl="freeform",kl=24,zl=2500,$l=250,Ul=(t,o,i)=>(1-t)*o+i,Vl=(t,o)=>`${t}ms ease-out mainIn ${o}ms 1 normal forwards`,Hl=(t,o)=>`${t}ms ease-out effectIn ${o}ms 1 normal forwards`,Wl=(t,o)=>`${t}ms linear leftSpinIn ${o}ms 1 normal forwards`,Gl=(t,o)=>`${t}ms linear rightSpinIn ${o}ms 1 normal forwards`,Yl=(t,o)=>`${t}ms linear circleIn ${o}ms 1 normal forwards`,Zl=(t,o,i)=>`
+ @keyframes mainIn {
+ 0% {
+ color: ${o};
+ opacity: 0;
+ }
+ 0%, ${t}% {
+ color: ${o};
+ opacity: 1;
+ }
+ 100% {
+ color: ${i};
+ opacity: 0.8;
+ }
+ }
+`,jl=(t,o,i,m)=>`
+ @keyframes effectIn {
+ 0%, ${t}% {
+ opacity: ${i};
+ transform: scale(${m});
+ }
+ ${o}% {
+ opacity: 0.66;
+ transform: scale(1.5);
+ }
+ 99% {
+ opacity: 0;
+ transform: scale(2);
+ }
+ 100% {
+ opacity: 0;
+ transform: scale(0);
+ }
+ }
+`,Kl=(t,o,i)=>`
+ @keyframes circleIn {
+ 0% {
+ clip-path: ${o};
+ opacity: ${i};
+ }
+ ${t}% {
+ clip-path: ${o};
+ opacity: 1;
+ }
+ ${t+.01}%, 100% {
+ clip-path: inset(0);
+ opacity: 1;
+ }
+ }
+`,ql=(t,o)=>`
+ @keyframes leftSpinIn {
+ 0% {
+ transform: rotate(${o}deg);
+ }
+ ${t}%, 100% {
+ transform: rotate(360deg);
+ }
+ }
+`,Xl=(t,o)=>`
+ @keyframes rightSpinIn {
+ 0% {
+ transform: rotate(${o}deg);
+ }
+ ${t}%, 100% {
+ transform: rotate(180deg);
+ }
+ }
+`,Jl=({time:t=_n,extraTime:o=On,delay:i=Dn,currentColor:m,targetColor:d,effectOpacity:a,effectScale:I,circleLeftRotation:_,circleRightRotation:B,circleClipPath:f,circleOpacity:r})=>{const u=_/360,c=Ul(u,t,o),y=Math.round((1-u)*t/c*100),x=Math.round(y/2),T=y+(100-y)/4;return{rules:{main:Zl(y,m,d),effect:jl(y,T,a,I),circleRight:Xl(x,B),circleLeft:ql(y,_),circle:Kl(x,f,r)},names:{main:Vl(c,i),effect:Hl(c,i),circleLeft:Wl(c,i),circleRight:Gl(c,i),circle:Yl(c,i)}}},Ql=t=>`${t}ms linear mainOut 0s 1 normal forwards`,ed=t=>`${t}ms linear effectOut 0s 1 normal forwards`,td=t=>`${t}ms linear leftSpinOut 0s 1 normal forwards`,nd=t=>`${t}ms linear rightSpinOut 0s 1 normal forwards`,od=t=>`${t}ms linear circleOut 0s 1 normal forwards`,id=(t,o)=>`
+ @keyframes mainOut {
+ 0% {
+ color: ${t};
+ }
+ 100% {
+ color: ${o};
+ }
+ }
+`,sd=(t,o)=>`
+ @keyframes effectOut {
+ 0% {
+ opacity: ${t};
+ transform: scale(${o});
+ }
+ 99% {
+ opacity: 0;
+ transform: scale(${o+.5});
+ }
+ 100% {
+ opacity: 0;
+ transform: scale(0);
+ }
+ }
+`,rd=(t,o)=>`
+ @keyframes rightSpinOut {
+ 0%, ${t}% {
+ transform: rotate(${o}deg);
+ }
+ 100% {
+ transform: rotate(0deg);
+ }
+`,ad=t=>`
+ @keyframes leftSpinOut {
+ 0% {
+ transform: rotate(${t}deg);
+ }
+ 100% {
+ transform: rotate(0deg);
+ }
+ }
+`,cd=(t,o,i)=>`
+ @keyframes circleOut {
+ 0%, ${t}% {
+ clip-path: ${o};
+ opacity: ${i};
+ }
+ ${t+.01}% {
+ clip-path: inset(0 0 0 50%);
+ opacity: ${i};
+ }
+ 100% {
+ clip-path: inset(0 0 0 50%);
+ opacity: 0;
+ }
+ }
+`,ld=({time:t=Rn,currentColor:o,targetColor:i,effectOpacity:m,effectScale:d,circleLeftRotation:a,circleRightRotation:I,circleClipPath:_,circleOpacity:B})=>{const f=a/360,r=f*t,u=Math.min(100,f*100),c=u>50?Math.round((1-50/u)*100):0;return{rules:{main:id(o,i),effect:sd(m,d),circleRight:rd(c,I),circleLeft:ad(a),circle:cd(c,_,B)},names:{main:Ql(r),effect:ed(r),circleRight:td(r),circleLeft:nd(r),circle:od(r)}}},dd=()=>{const t=document.createElement("div"),o=Math.random().toString(36).substring(2,5)+Math.random().toString(36).substring(2,5);t.id=`lasso-long-press-${o}`,t.style.position="fixed",t.style.width="1.25rem",t.style.height="1.25rem",t.style.pointerEvents="none",t.style.transform="translate(-50%,-50%)";const i=document.createElement("div");i.style.position="absolute",i.style.top=0,i.style.left=0,i.style.width="1.25rem",i.style.height="1.25rem",i.style.clipPath="inset(0px 0px 0px 50%)",i.style.opacity=0,t.appendChild(i);const m=document.createElement("div");m.style.position="absolute",m.style.top=0,m.style.left=0,m.style.width="0.8rem",m.style.height="0.8rem",m.style.border="0.2rem solid currentcolor",m.style.borderRadius="0.8rem",m.style.clipPath="inset(0px 50% 0px 0px)",m.style.transform="rotate(0deg)",i.appendChild(m);const d=document.createElement("div");d.style.position="absolute",d.style.top=0,d.style.left=0,d.style.width="0.8rem",d.style.height="0.8rem",d.style.border="0.2rem solid currentcolor",d.style.borderRadius="0.8rem",d.style.clipPath="inset(0px 50% 0px 0px)",d.style.transform="rotate(0deg)",i.appendChild(d);const a=document.createElement("div");return a.style.position="absolute",a.style.top=0,a.style.left=0,a.style.width="1.25rem",a.style.height="1.25rem",a.style.borderRadius="1.25rem",a.style.background="currentcolor",a.style.transform="scale(0)",a.style.opacity=0,t.appendChild(a),{longPress:t,longPressCircle:i,longPressCircleLeft:m,longPressCircleRight:d,longPressEffect:a}},ud=(t,o,i)=>{if(t.length===0)return 0;if(t.length===1)return t[0];const m=2**(-1/o),d=Math.max(0,t.length-i),a=t.slice(d);let I=0,_=0,B=0;for(let f=a.length-1;f>=0;f--){const r=a.length-1-f,u=m**r;I+=a[f][0]*u,_+=a[f][1]*u,B+=u}return[I/B,_/B]},ct=(t,o=null)=>t===null?o:t;let Mo;const ss=()=>{if(!Mo){const t=document.createElement("style");document.head.appendChild(t),Mo=t.sheet}return Mo},be=t=>{const o=ss(),i=o.rules.length;return o.insertRule(t,i),i},ve=t=>{ss().deleteRule(t)},fd=`${zl}ms ease scaleInFadeOut 0s 1 normal backwards`,md=(t,o,i)=>`
+@keyframes scaleInFadeOut {
+ 0% {
+ opacity: ${t};
+ transform: translate(-50%,-50%) scale(${o}) rotate(${i}deg);
+ }
+ 10% {
+ opacity: 1;
+ transform: translate(-50%,-50%) scale(1) rotate(${i+20}deg);
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(-50%,-50%) scale(0.9) rotate(${i+60}deg);
+ }
+}
+`;let Bo=null;const hd=`${$l}ms ease fadeScaleOut 0s 1 normal backwards`,gd=(t,o,i)=>`
+@keyframes fadeScaleOut {
+ 0% {
+ opacity: ${t};
+ transform: translate(-50%,-50%) scale(${o}) rotate(${i}deg);
+ }
+ 100% {
+ opacity: 0;
+ transform: translate(-50%,-50%) scale(0) rotate(${i}deg);
+ }
+}
+`;let Fo=null;const rs=(t,{onDraw:o=Qe,onStart:i=Qe,onEnd:m=Qe,enableInitiator:d=Nl,initiatorParentElement:a=document.body,longPressIndicatorParentElement:I=document.body,minDelay:_=Ml,minDist:B=Bl,pointNorm:f=Qe,type:r=Fl,brushSize:u=kl}={})=>{let c=d,y=a,x=I,T=o,P=i,S=m,C=_,b=B,R=f,Y=r,H=u;const L=document.createElement("div"),z=Math.random().toString(36).substring(2,5)+Math.random().toString(36).substring(2,5);L.id=`lasso-initiator-${z}`,L.style.position="fixed",L.style.display="flex",L.style.justifyContent="center",L.style.alignItems="center",L.style.zIndex=99,L.style.width="4rem",L.style.height="4rem",L.style.borderRadius="4rem",L.style.opacity=.5,L.style.transform="translate(-50%,-50%) scale(0) rotate(0deg)";const{longPress:$,longPressCircle:de,longPressCircleLeft:me,longPressCircleRight:xe,longPressEffect:ue}=dd();let _e=!1,Pe=!1,ne=[],V=[],oe=[],ee=[],ye,te=!1,ae=null,ce=null,Oe=null,J=null,De=null,ft=null,se=null,Tt=null,Re=null,mt=null;const Pt=()=>{_e=!1},W=A=>{const{left:D,top:F}=t.getBoundingClientRect();return[A.clientX-D,A.clientY-F]};window.addEventListener("mouseup",Pt);const ze=()=>{L.style.opacity=.5,L.style.transform="translate(-50%,-50%) scale(0) rotate(0deg)"},we=(A,D)=>{const F=getComputedStyle(A),k=+F.opacity,N=F.transform.match(/([0-9.-]+)+/g),O=+N[0],G=+N[1],K=Math.sqrt(O*O+G*G);let U=Math.atan2(G,O)*(180/Math.PI);return U=D&&U<=0?360+U:U,{opacity:k,scale:K,rotate:U}},Ze=A=>{if(!c||_e)return;const D=A.clientX,F=A.clientY;L.style.top=`${F}px`,L.style.left=`${D}px`;const k=we(L),N=k.opacity,O=k.scale,G=k.rotate;L.style.opacity=N,L.style.transform=`translate(-50%,-50%) scale(${O}) rotate(${G}deg)`,L.style.animation="none",kt().then(()=>{Bo!==null&&ve(Bo),Bo=be(md(N,O,G)),L.style.animation=fd,kt().then(()=>{ze()})})},j=()=>{const{opacity:A,scale:D,rotate:F}=we(L);L.style.opacity=A,L.style.transform=`translate(-50%,-50%) scale(${D}) rotate(${F}deg)`,L.style.animation="none",kt(2).then(()=>{Fo!==null&&ve(Fo),Fo=be(gd(A,D,F)),L.style.animation=hd,kt().then(()=>{ze()})})},Ae=(A,D,{time:F=_n,extraTime:k=On,delay:N=Dn}={time:_n,extraTime:On,delay:Dn})=>{te=!0;const O=getComputedStyle($);$.style.color=O.color,$.style.top=`${D}px`,$.style.left=`${A}px`,$.style.animation="none";const G=getComputedStyle(de);de.style.clipPath=G.clipPath,de.style.opacity=G.opacity,de.style.animation="none";const K=we(ue);ue.style.opacity=K.opacity,ue.style.transform=`scale(${K.scale})`,ue.style.animation="none";const U=we(me);me.style.transform=`rotate(${U.rotate}deg)`,me.style.animation="none";const q=we(xe);xe.style.transform=`rotate(${q.rotate}deg)`,xe.style.animation="none",kt().then(()=>{if(!te)return;De!==null&&ve(De),J!==null&&ve(J),Oe!==null&&ve(Oe),ce!==null&&ve(ce),ae!==null&&ve(ae);const{rules:X,names:ie}=Jl({time:F,extraTime:k,delay:N,currentColor:O.color||"currentcolor",targetColor:$.dataset.activeColor,effectOpacity:K.opacity||0,effectScale:K.scale||0,circleLeftRotation:U.rotate||0,circleRightRotation:q.rotate||0,circleClipPath:G.clipPath||"inset(0 0 0 50%)",circleOpacity:G.opacity||0});ae=be(X.main),ce=be(X.effect),Oe=be(X.circleLeft),J=be(X.circleRight),De=be(X.circle),$.style.animation=ie.main,ue.style.animation=ie.effect,me.style.animation=ie.circleLeft,xe.style.animation=ie.circleRight,de.style.animation=ie.circle})},zt=({time:A=Rn}={time:Rn})=>{if(!te)return;te=!1;const D=getComputedStyle($);$.style.color=D.color,$.style.animation="none";const F=getComputedStyle(de);de.style.clipPath=F.clipPath,de.style.opacity=F.opacity,de.style.animation="none";const k=we(ue);ue.style.opacity=k.opacity,ue.style.transform=`scale(${k.scale})`,ue.style.animation="none";const N=F.clipPath.slice(-2,-1)==="x",O=we(me,N);me.style.transform=`rotate(${O.rotate}deg)`,me.style.animation="none";const G=we(xe);xe.style.transform=`rotate(${G.rotate}deg)`,xe.style.animation="none",kt().then(()=>{mt!==null&&ve(mt),Re!==null&&ve(Re),Tt!==null&&ve(Tt),se!==null&&ve(se),ft!==null&&ve(ft);const{rules:K,names:U}=ld({time:A,currentColor:D.color||"currentcolor",targetColor:$.dataset.color,effectOpacity:k.opacity||0,effectScale:k.scale||0,circleLeftRotation:O.rotate||0,circleRightRotation:G.rotate||0,circleClipPath:F.clipPath||"inset(0px)",circleOpacity:F.opacity||1});ft=be(K.main),se=be(K.effect),Tt=be(K.circleLeft),Re=be(K.circleRight),mt=be(K.circle),$.style.animation=U.main,ue.style.animation=U.effect,me.style.animation=U.circleLeft,xe.style.animation=U.circleRight,de.style.animation=U.circle})},Ct=()=>{T(ne,V)},je=A=>{ne.push(A),V.push(A[0],A[1])},$e=A=>{const[D,F]=A,[k,N]=ne[0];ne[1]=[D,N],ne[2]=[D,F],ne[3]=[k,F],ne[4]=[k,N],V[2]=D,V[3]=N,V[4]=D,V[5]=F,V[6]=k,V[7]=F,V[8]=k,V[9]=N},et=A=>{oe.push(A)},Se=()=>Math.abs(R([0,0])[0]-R([H/2,0])[0]),Ie=(A,D,F)=>{const[k,N]=A,[O,G]=D,K=k-O,U=N-G,q=Ja([K,U]);return[+U/q*F,-K/q*F]},bt=A=>{const D=oe.at(-1),F=Se();let[k,N]=Ie(A,D,F);const O=oe.length;if(O===1){const U=[D[0]+k,D[1]+N],q=[D[0]-k,D[1]-N];ne.push(U,q),V.push(U[0],U[1],q[0],q[1]),ee.push([k,N])}else{[k,N]=Ie(A,D,F);const U=[...ee,[k,N]];[k,N]=ud(U,1,10);const[q,X]=ee.at(-1),ie=(k+q)/2,yt=(N+X)/2,Ce=[D[0]+ie,D[1]+yt],Ve=[D[0]-ie,D[1]-yt];ne.splice(O-1,2,Ce,Ve),V.splice(2*(O-1),4,Ce[0],Ce[1],Ve[0],Ve[1]),ee.splice(O,1,[ie,yt])}const G=[A[0]+k,A[1]+N],K=[A[0]-k,A[1]-N];ne.splice(O,0,G,K),V.splice(2*O,0,G[0],G[1],K[0],K[1]),oe.push(A),ee.push([k,N])};let Ke=je,Ne=je;const Ue=A=>{if(ye)Xa(A[0],A[1],ye[0],ye[1])>b&&(ye=A,Ke(R(A)),ne.length>1&&Ct());else{Pe||(Pe=!0,P()),ye=A;const D=R(A);Ne(D)}},Te=qi(Ue,C,C),Me=(A,D)=>{const F=W(A);return D?Te(F):Ue(F)},ht=()=>{ne=[],V=[],oe=[],ee=[],ye=void 0,Ct()},$t=A=>{Ze(A)},Ut=()=>{_e=!0,Pe=!0,ht(),P()},gt=()=>{j()},hn=({merge:A=!1,remove:D=!1}={})=>{Pe=!1;const F=[...ne],k=[...V];return Te.cancel(),ht(),F.length>0&&S(F,k,{merge:A,remove:D}),F},vt=A=>{switch(A){case"rectangle":{Y=A,Ke=$e,Ne=je;break}case"brush":{Y=A,Ke=bt,Ne=et;break}default:{Y="freeform",Ke=je,Ne=je;break}}},qe=A=>{if(A==="onDraw")return T;if(A==="onStart")return P;if(A==="onEnd")return S;if(A==="enableInitiator")return c;if(A==="minDelay")return C;if(A==="minDist")return b;if(A==="pointNorm")return R;if(A==="type")return Y;if(A==="brushSize")return H},Lt=({onDraw:A=null,onStart:D=null,onEnd:F=null,enableInitiator:k=null,initiatorParentElement:N=null,longPressIndicatorParentElement:O=null,minDelay:G=null,minDist:K=null,pointNorm:U=null,type:q=null,brushSize:X=null}={})=>{T=ct(A,T),P=ct(D,P),S=ct(F,S),c=ct(k,c),C=ct(G,C),b=ct(K,b),R=ct(U,R),H=ct(X,H),N!==null&&N!==y&&(y.removeChild(L),N.appendChild(L),y=N),O!==null&&O!==x&&(x.removeChild($),O.appendChild($),x=O),c?(L.addEventListener("click",$t),L.addEventListener("mousedown",Ut),L.addEventListener("mouseleave",gt)):(L.removeEventListener("mousedown",Ut),L.removeEventListener("mouseleave",gt)),q!==null&&vt(q)},v=()=>{y.removeChild(L),x.removeChild($),window.removeEventListener("mouseup",Pt),L.removeEventListener("click",$t),L.removeEventListener("mousedown",Ut),L.removeEventListener("mouseleave",gt)},Be=()=>A=>qa(A,{clear:ht,destroy:v,end:hn,extend:Me,get:qe,set:Lt,showInitiator:Ze,hideInitiator:j,showLongPressIndicator:Ae,hideLongPressIndicator:zt});return y.appendChild(L),x.appendChild($),Lt({onDraw:T,onStart:P,onEnd:S,enableInitiator:c,initiatorParentElement:y,type:Y,brushSize:H}),ja(Ni("initiator",L),Ni("longPressIndicator",$),Be(),Ka(rs))({})},yd=`
+precision highp float;
+
+uniform float antiAliasing;
+
+varying vec4 color;
+varying float finalPointSize;
+
+float linearstep(float edge0, float edge1, float x) {
+ return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
+}
+
+void main() {
+ vec2 c = gl_PointCoord * 2.0 - 1.0;
+ float sdf = length(c) * finalPointSize;
+ float alpha = linearstep(finalPointSize + antiAliasing, finalPointSize - antiAliasing, sdf);
+
+ gl_FragColor = vec4(color.rgb, alpha * color.a);
+}
+`,pd=t=>`
+precision highp float;
+
+uniform sampler2D colorTex;
+uniform float colorTexRes;
+uniform float colorTexEps;
+uniform sampler2D stateTex;
+uniform float stateTexRes;
+uniform float stateTexEps;
+uniform float devicePixelRatio;
+uniform sampler2D encodingTex;
+uniform float encodingTexRes;
+uniform float encodingTexEps;
+uniform float pointSizeExtra;
+uniform float pointOpacityMax;
+uniform float pointOpacityScale;
+uniform float numPoints;
+uniform float globalState;
+uniform float isColoredByZ;
+uniform float isColoredByW;
+uniform float isOpacityByZ;
+uniform float isOpacityByW;
+uniform float isOpacityByDensity;
+uniform float isSizedByZ;
+uniform float isSizedByW;
+uniform float isPixelAligned;
+uniform float colorMultiplicator;
+uniform float opacityMultiplicator;
+uniform float opacityDensity;
+uniform float sizeMultiplicator;
+uniform float numColorStates;
+uniform float pointScale;
+uniform float drawingBufferWidth;
+uniform float drawingBufferHeight;
+uniform mat4 modelViewProjection;
+
+attribute vec2 stateIndex;
+
+varying vec4 color;
+varying float finalPointSize;
+
+void main() {
+ vec4 state = texture2D(stateTex, stateIndex);
+
+ if (isPixelAligned < 0.5) {
+ gl_Position = modelViewProjection * vec4(state.x, state.y, 0.0, 1.0);
+ } else {
+ vec4 clipSpacePosition = modelViewProjection * vec4(state.x, state.y, 0.0, 1.0);
+ vec2 ndcPosition = clipSpacePosition.xy / clipSpacePosition.w;
+ vec2 pixelPos = 0.5 * (ndcPosition + 1.0) * vec2(drawingBufferWidth, drawingBufferHeight);
+ pixelPos = floor(pixelPos + 0.5); // Snap to nearest pixel
+ vec2 snappedPosition = (pixelPos / vec2(drawingBufferWidth, drawingBufferHeight)) * 2.0 - 1.0;
+ gl_Position = vec4(snappedPosition, 0.0, 1.0);
+ }
+
+
+ // Determine color index
+ float colorIndexZ = isColoredByZ * floor(state.z * colorMultiplicator);
+ float colorIndexW = isColoredByW * floor(state.w * colorMultiplicator);
+
+ // Multiply by the number of color states per color
+ // I.e., normal, active, hover, background, etc.
+ float colorIndex = (colorIndexZ + colorIndexW) * numColorStates;
+
+ // Half a "pixel" or "texel" in texture coordinates
+ float colorLinearIndex = colorIndex + globalState;
+
+ // Need to add cEps here to avoid floating point issue that can lead to
+ // dramatic changes in which color is loaded as floor(3/2.9999) = 1 but
+ // floor(3/3.0001) = 0!
+ float colorRowIndex = floor((colorLinearIndex + colorTexEps) / colorTexRes);
+
+ vec2 colorTexIndex = vec2(
+ (colorLinearIndex / colorTexRes) - colorRowIndex + colorTexEps,
+ colorRowIndex / colorTexRes + colorTexEps
+ );
+
+ color = texture2D(colorTex, colorTexIndex);
+
+ // Retrieve point size
+ float pointSizeIndexZ = isSizedByZ * floor(state.z * sizeMultiplicator);
+ float pointSizeIndexW = isSizedByW * floor(state.w * sizeMultiplicator);
+ float pointSizeIndex = pointSizeIndexZ + pointSizeIndexW;
+
+ float pointSizeRowIndex = floor((pointSizeIndex + encodingTexEps) / encodingTexRes);
+ vec2 pointSizeTexIndex = vec2(
+ (pointSizeIndex / encodingTexRes) - pointSizeRowIndex + encodingTexEps,
+ pointSizeRowIndex / encodingTexRes + encodingTexEps
+ );
+ float pointSize = texture2D(encodingTex, pointSizeTexIndex).x;
+
+ // Retrieve opacity
+ ${t===3?"":`
+ if (isOpacityByDensity < 0.5) {
+ float opacityIndexZ = isOpacityByZ * floor(state.z * opacityMultiplicator);
+ float opacityIndexW = isOpacityByW * floor(state.w * opacityMultiplicator);
+ float opacityIndex = opacityIndexZ + opacityIndexW;
+
+ float opacityRowIndex = floor((opacityIndex + encodingTexEps) / encodingTexRes);
+ vec2 opacityTexIndex = vec2(
+ (opacityIndex / encodingTexRes) - opacityRowIndex + encodingTexEps,
+ opacityRowIndex / encodingTexRes + encodingTexEps
+ );
+ color.a = texture2D(encodingTex, opacityTexIndex)[${1+t}];
+ } else {
+ color.a = min(1.0, opacityDensity + globalState);
+ }
+ `}
+
+ color.a = min(pointOpacityMax, color.a) * pointOpacityScale;
+ finalPointSize = (pointSize * pointScale) + pointSizeExtra;
+ gl_PointSize = finalPointSize;
+}
+`,Ed=`precision highp float;
+
+varying vec4 color;
+
+void main() {
+ gl_FragColor = color;
+}
+`,xd=`precision highp float;
+
+uniform sampler2D startStateTex;
+uniform sampler2D endStateTex;
+uniform float t;
+
+varying vec2 particleTextureIndex;
+
+void main() {
+ // Interpolate x, y, and value
+ vec3 start = texture2D(startStateTex, particleTextureIndex).xyw;
+ vec3 end = texture2D(endStateTex, particleTextureIndex).xyw;
+ vec3 curr = start * (1.0 - t) + end * t;
+
+ // The category cannot be interpolated
+ float endCategory = texture2D(endStateTex, particleTextureIndex).z;
+
+ gl_FragColor = vec4(curr.xy, endCategory, curr.z);
+}`,wd=`precision highp float;
+
+attribute vec2 position;
+varying vec2 particleTextureIndex;
+
+void main() {
+ // map normalized device coords to texture coords
+ particleTextureIndex = 0.5 * (1.0 + position);
+
+ gl_Position = vec4(position, 0, 1);
+}`,Ad=(t,o)=>t?Xi.reduce((i,m)=>t.hasExtension(m)?i:(console.warn(`WebGL: ${m} extension not supported. Scatterplot might not render properly`),!1),!0):!1,Sd=t=>{const o=t.getContext("webgl",{antialias:!0,preserveDrawingBuffer:!0}),i=[];for(const m of Xi)o.getExtension(m)?i.push(m):console.warn(`WebGL: ${m} extension not supported. Scatterplot might not render properly`);return Qa({gl:o,extensions:i})},ko=(t,o,i,m)=>Math.sqrt((t-i)**2+(o-m)**2),Id=t=>{let o=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,m=Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY;for(let a=0;ai?t[a]:i,m=t[a+1]d?t[a+1]:d;return[o,m,i,d]},Td=([t,o,i,m])=>Number.isFinite(t)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(m)&&i-t>0&&m-o>0,Pd=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,Cd=(t,o=!1)=>t.replace(Pd,(i,m,d,a)=>`#${m}${m}${d}${d}${a}${a}`).substring(1).match(/.{2}/g).map(i=>Number.parseInt(i,16)/255**o),lt=(t,o,{minLength:i=0}={})=>Array.isArray(t)&&t.length>=i&&t.every(o),dt=t=>!Number.isNaN(+t)&&+t>=0,vn=t=>!Number.isNaN(+t)&&+t>0,zo=(t,o)=>i=>t.indexOf(i)>=0?i:o,bd=(t,o=!1,i=qo)=>new Promise((m,d)=>{const a=new Image;o&&(a.crossOrigin="anonymous"),a.src=t,a.onload=()=>{m(a)};const I=()=>{d(new Error(ul))};a.onerror=I,setTimeout(I,i)}),Wi=(t,o,i=qo)=>new Promise((m,d)=>{bd(o,o.indexOf(window.location.origin)!==0&&o.indexOf("base64")===-1,i).then(a=>{m(t.texture(a))}).catch(a=>{d(a)})}),vd=(t,o=!1)=>[...Cd(t,o),255**!o],Ld=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i,_d=t=>Ld.test(t),Od=t=>t>=0&&t<=1,kn=t=>Array.isArray(t)&&t.every(Od);function Gi(t,o,i,m,d,a){return(i-t)*(a-o)-(d-t)*(m-o)}const Dd=(t,[o,i]=[])=>{let m=0;for(let d=0,a=t.length-2;di&&Gi(I,_,B,f,o,i)>0&&m++:f<=i&&Gi(I,_,B,f,o,i)<0&&m--,a=d}return m!==0},Go=t=>typeof t=="string"||t instanceof String,Rd=t=>Number.isInteger(t)&&t>=0&&t<=255,as=t=>Array.isArray(t)&&t.every(Rd),Nd=t=>t.length===3&&(kn(t)||as(t)),Md=t=>t.length===4&&(kn(t)||as(t)),ut=t=>Array.isArray(t)&&t.length>0&&(Array.isArray(t[0])||Go(t[0])),Bd=(t,o)=>!(Array.isArray(t)&&Array.isArray(o))||t.length!==o.length?!1:t.length===0?!0:Array.isArray(t[0])&&Array.isArray(o[0])?t.every(([i,m,d,a],I)=>{const[_,B,f,r]=o[I];return i===_&&m===B&&d===f&&a===r}):!1,fn=(t,o)=>t>o?t:o,Yi=(t,o)=>t{if(Md(t)){const i=kn(t);return o&&i||!(o||i)?t:o&&!i?t.map(m=>m/255):t.map(m=>m*255)}if(Nd(t)){const i=255**!o,m=kn(t);return o&&m||!(o||m)?[...t,i]:o&&!m?[...t.map(d=>d/255),i]:[...t.map(d=>d*255),i]}return _d(t)?vd(t,o):(console.warn("Only HEX, RGB, and RGBA are handled by this function. Returning white instead."),o?[1,1,1,1]:[255,255,255,255])},Fd=t=>Object.entries(t).reduce((o,[i,m])=>(o[m]?o[m]=[...o[m],i]:o[m]=i,o),{}),Zi=t=>.21*t[0]+.72*t[1]+.07*t[2],kd=(t,o,i)=>Math.min(i,Math.max(o,t)),zd=t=>new Promise((o,i)=>{if(!t||Array.isArray(t))o(t);else{const m=Array.isArray(t.x)||ArrayBuffer.isView(t.x)?t.x.length:0,d=(Array.isArray(t.x)||ArrayBuffer.isView(t.x))&&(u=>t.x[u]),a=(Array.isArray(t.y)||ArrayBuffer.isView(t.y))&&(u=>t.y[u]),I=(Array.isArray(t.line)||ArrayBuffer.isView(t.line))&&(u=>t.line[u]),_=(Array.isArray(t.lineOrder)||ArrayBuffer.isView(t.lineOrder))&&(u=>t.lineOrder[u]),B=Object.keys(t),f=(()=>{const u=B.find(c=>ts.has(c));return u&&(Array.isArray(t[u])||ArrayBuffer.isView(t[u]))&&(c=>t[u][c])})(),r=(()=>{const u=B.find(c=>ns.has(c));return u&&(Array.isArray(t[u])||ArrayBuffer.isView(t[u]))&&(c=>t[u][c])})();d&&a&&f&&r&&I&&_?o(t.x.map((u,c)=>[u,a(c),f(c),r(c),I(c),_(c)])):d&&a&&f&&r&&I?o(Array.from({length:m},(u,c)=>[d(c),a(c),f(c),r(c),I(c)])):d&&a&&f&&r?o(Array.from({length:m},(u,c)=>[d(c),a(c),f(c),r(c)])):d&&a&&f?o(Array.from({length:m},(u,c)=>[d(c),a(c),f(c)])):d&&a?o(Array.from({length:m},(u,c)=>[d(c),a(c)])):i(new Error("You need to specify at least x and y"))}}),$d=t=>Number.isFinite(t.y)&&!("x"in t),Ud=t=>Number.isFinite(t.x)&&!("y"in t),Vd=t=>Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height),Hd=t=>Number.isFinite(t.x1)&&Number.isFinite(t.y1)&&Number.isFinite(t.x2)&&Number.isFinite(t.x2),Wd=t=>"vertices"in t&&t.vertices.length>1,Gd=t=>{if(!Array.isArray(t)||t.length<3)return!1;for(const o of t)if(!Array.isArray(o)||o.length!==2||typeof o[0]!="number"||typeof o[1]!="number")return!1;return!0},Yd=t=>{const o=[...t],i=t.at(0),m=t.at(-1);return(i[0]!==m[0]||i[1]!==m[1])&&o.push(i),o},Zd=t=>{const o=t.length;for(let i=1;i-1&&m{let{regl:o,canvas:i=document.createElement("canvas"),gamma:m=Fc}=t,d=!1;o||(o=Sd(i));const a=Ad(o),I=[i.width,i.height],_=o.framebuffer({width:I[0],height:I[1],colorFormat:"rgba",colorType:"float"}),B=o({vert:`
+ precision highp float;
+ attribute vec2 xy;
+ void main () {
+ gl_Position = vec4(xy, 0, 1);
+ }`,frag:`
+ precision highp float;
+ uniform vec2 srcRes;
+ uniform sampler2D src;
+ uniform float gamma;
+
+ vec3 approxLinearToSRGB (vec3 rgb, float gamma) {
+ return pow(clamp(rgb, vec3(0), vec3(1)), vec3(1.0 / gamma));
+ }
+
+ void main () {
+ vec4 color = texture2D(src, gl_FragCoord.xy / srcRes);
+ gl_FragColor = vec4(approxLinearToSRGB(color.rgb, gamma), color.a);
+ }`,attributes:{xy:[-4,-4,4,-4,0,4]},uniforms:{src:()=>_,srcRes:()=>I,gamma:()=>m},count:3,depth:{enable:!1},blend:{enable:!0,func:{srcRGB:"one",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}}}),f=C=>{const b=C.getContext("2d");b.clearRect(0,0,C.width,C.height),b.drawImage(i,(i.width-C.width)/2,(i.height-C.height)/2,C.width,C.height,0,0,C.width,C.height)},r=(C,b)=>{o.clear(ki),_.use(()=>{o.clear(ki),C()}),B(),f(b)},u=()=>{o.poll()},c=new Set,y=C=>(c.add(C),()=>{c.delete(C)}),x=o.frame(()=>{const C=c.values();let b=C.next();for(;!b.done;)b.value(),b=C.next()}),T=(C,b)=>{const R=C===void 0?Math.min(window.innerWidth,window.screen.availWidth):C,Y=b===void 0?Math.min(window.innerHeight,window.screen.availHeight):b;i.width=R*window.devicePixelRatio,i.height=Y*window.devicePixelRatio,I[0]=i.width,I[1]=i.height,_.resize(...I)},P=()=>{T()};return t.canvas||(window.addEventListener("resize",P),window.addEventListener("orientationchange",P),T()),{get canvas(){return i},get regl(){return o},get gamma(){return m},set gamma(C){m=+C},get isSupported(){return a},get isDestroyed(){return d},render:r,resize:T,onFrame:y,refresh:u,destroy:()=>{d=!0,window.removeEventListener("resize",P),window.removeEventListener("orientationchange",P),x.cancel(),i=void 0,o.destroy(),o=void 0}}},Kd=function(){const o=(f,r,u,c,y)=>{const x=(c-r)*.5,T=(y-u)*.5;return(2*u-2*c+x+T)*f*f*f+(-3*u+3*c-2*x-T)*f*f+x*f+u},i=(f,r,u)=>{const c=u*f,y=Math.floor(c),x=c-y,T=r[Math.max(0,y-1)],P=r[y],S=r[Math.min(u,y+1)],C=r[Math.min(u,y+2)];return[o(x,T[0],P[0],S[0],C[0]),o(x,T[1],P[1],S[1],C[1])]},m=(f,r,u,c)=>(f-u)**2+(r-c)**2;const d=(f,r,u)=>{let c=r[0],y=r[1],x=u[0]-c,T=u[1]-y;if(x!==0||T!==0){const P=((f[0]-c)*x+(f[1]-y)*T)/(x*x+T*T);P>1?(c=u[0],y=u[1]):P>0&&(c+=x*P,y+=T*P)}return x=f[0]-c,T=f[1]-y,x*x+T*T};const a=(f,r,u,c,y)=>{let x=c,T;for(let P=r+1;Px&&(T=P,x=S)}x>c&&(T-r>1&&a(f,r,T,c,y),y.push(f[T]),u-T>1&&a(f,T,u,c,y))};const I=(f,r)=>{const u=f.length-1,c=[f[0]];return a(f,0,u,r,c),c.push(f[u]),c},_=(f,{maxIntPointsPerSegment:r=100,tolerance:u=.002}={})=>{const c=f.length,y=c-1,x=y*r+1,T=u**2;let P=[],S;for(let C=0;CT&&(b.push(H),S=H)}b.push(f[C+1]),b=I(b,T),P=P.concat(b.slice(0,b.length-1))}return P.push(f[f.length-1].slice(0,2)),P.flat()},B=f=>{const r={},u=!Number.isNaN(+f[0][5]);return f.forEach(c=>{const y=c[4];r[y]||(r[y]=[]),u?r[y][c[5]]=c:r[y].push(c)}),Object.entries(r).forEach(c=>{r[c[0]]=c[1].filter(y=>y),r[c[0]].reference=c[1][0]}),r};self.onmessage=function(r){r.data.points&&+r.data.points.length||self.postMessage({error:new Error("No points provided")}),r.data.points;const c=B(r.data.points);self.postMessage({points:Object.entries(c).reduce((y,x)=>(y[x[0]]=_(x[1],r.data.options),y[x[0]].reference=x[1].reference,y),{})})}},qd=(t,o={tolerance:.002,maxIntPointsPerSegment:100})=>new Promise((i,m)=>{const d=ec(Kd);d.onmessage=a=>{a.data.error?m(a.data.error):i(a.data.points),d.terminate()},d.postMessage({points:t,options:o})}),$o={showRecticle:{replacement:"showReticle",removalVersion:"2",translation:Qe},recticleColor:{replacement:"reticleColor",removalVersion:"2",translation:Qe},keyMap:{replacement:"actionKeyMap",removalVersion:"2",translation:Fd}},Uo=t=>{const o=Object.keys(t).filter(i=>$o[i]);for(const i of o){const{replacement:m,removalVersion:d,translation:a}=$o[i];console.warn(`regl-scatterplot: the "${i}" property is deprecated and will be removed in v${d}. Please use "${m}" instead.`),t[$o[i].replacement]=t[i]!==os?a(t[i]):t[i],delete t[i]}return t},Le=(t,o,{allowSegment:i=!1,allowDensity:m=!1,allowInherit:d=!1}={})=>ts.has(t)?"valueZ":ns.has(t)?"valueW":t==="segment"?i?"segment":o:t==="density"?m?"density":o:t==="inherit"&&d?"inherit":o,Vo=t=>{switch(t){case"valueZ":return 2;case"valueW":return 3;default:return null}},au=(t={})=>{const o=tc({async:!t.syncEvents,caseInsensitive:!0}),i=new Float32Array(16),m=new Float32Array(16),d=[0,0];Uo(t);let{renderer:a,antiAliasing:I=Cl,pixelAligned:_=bl,backgroundColor:B=el,backgroundImage:f=fl,canvas:r=document.createElement("canvas"),colorBy:u=un,deselectOnDblClick:c=gl,deselectOnEscape:y=yl,lassoColor:x=Ic,lassoLineWidth:T=Tc,lassoMinDelay:P=Cc,lassoMinDist:S=bc,lassoClearEvent:C=vc,lassoInitiator:b=Pc,lassoInitiatorParentElement:R=document.body,lassoLongPressIndicatorParentElement:Y=document.body,lassoOnLongPress:H=Lc,lassoLongPressTime:L=_n,lassoLongPressAfterEffectTime:z=On,lassoLongPressEffectDelay:$=Dn,lassoLongPressRevertEffectTime:de=Rn,lassoType:me=vl,lassoBrushSize:xe=_c,actionKeyMap:ue=Rc,mouseMode:_e=wc,showReticle:Pe=ml,reticleColor:ne=hl,pointColor:V=Xc,pointColorActive:oe=Jc,pointColorHover:ee=Qc,showPointConnections:ye=pl,pointConnectionColor:te=tl,pointConnectionColorActive:ae=nl,pointConnectionColorHover:ce=ol,pointConnectionColorBy:Oe=Do,pointConnectionOpacity:J=Wc,pointConnectionOpacityBy:De=_o,pointConnectionOpacityActive:ft=Gc,pointConnectionSize:se=Vc,pointConnectionSizeActive:Tt=Hc,pointConnectionSizeBy:Re=Lo,pointConnectionMaxIntPointsPerSegment:mt=El,pointConnectionTolerance:Pt=xl,pointSize:W=zc,pointSizeSelected:ze=$c,pointSizeMouseDetection:we=wl,pointOutlineWidth:Ze=Uc,opacity:j=Ye,opacityBy:Ae=Oo,opacityByDensityFill:zt=Zc,opacityInactiveMax:Ct=Kc,opacityInactiveScale:je=qc,sizeBy:$e=vo,pointScaleMode:et=kc,height:Se=Bc,width:Ie=Mc,annotationLineColor:bt=il,annotationLineWidth:Ke=sl,annotationHVLineLimit:Ne=rl,cameraIsFixed:Ue=Pl}=t,Te=Ie===Ye?1:Ie,Me=Se===Ye?1:Se;const{performanceMode:ht=Al,opacityByDensityDebounceTime:$t=jc,spatialIndexUseWorker:Ut=Tl}=t,gt=!!(t.renderPointsAsSquares||ht),hn=!!(t.disableAlphaBlending||ht);_e=zo(zi,Ln)(_e),a||(a=jd({regl:t.regl,gamma:t.gamma})),B=ge(B,!0),x=ge(x,!0),ne=ge(ne,!0);let vt=!1,qe=!1,Lt=Zi(B),v,Be,A,D=!1,F=null,k=[0,0],N=-1,O=[];const G=new Set,K=new Set;let U=!1;const q=new Set;let X=[],ie=0,yt=0,Ce=!1,Ve=[],zn,Vt,gn=t.aspectRatio||Nc,$n,_t,pt,He,Fe,Un,Ht,Wt,Vn,Ot,Gt,Yt,Hn=!1,Z=!0,Et=!1,yn;V=ut(V)?[...V]:[V],oe=ut(oe)?[...oe]:[oe],ee=ut(ee)?[...ee]:[ee],V=V.map(e=>ge(e,!0)),oe=oe.map(e=>ge(e,!0)),ee=ee.map(e=>ge(e,!0)),j=!Array.isArray(j)&&Number.isNaN(+j)?V[0][3]:j,j=lt(j,dt,{minLength:1})?[...j]:[j],W=lt(W,dt,{minLength:1})?[...W]:[W];let Wn=bo/W[0];te==="inherit"?te=[...V]:(te=ut(te)?[...te]:[te],te=te.map(e=>ge(e,!0))),ae==="inherit"?ae=[...oe]:(ae=ut(ae)?[...ae]:[ae],ae=ae.map(e=>ge(e,!0))),ce==="inherit"?ce=[...ee]:(ce=ut(ce)?[...ce]:[ce],ce=ce.map(e=>ge(e,!0))),J==="inherit"?J=[...j]:J=lt(J,dt,{minLength:1})?[...J]:[J],se==="inherit"?se=[...W]:se=lt(se,dt,{minLength:1})?[...se]:[se],u=Le(u,un),Ae=Le(Ae,Oo,{allowDensity:!0}),$e=Le($e,vo),Oe=Le(Oe,Do,{allowSegment:!0,allowInherit:!0}),De=Le(De,_o,{allowSegment:!0}),Re=Le(Re,Lo,{allowSegment:!0});let tt,nt,ot,Xo,ke=0,Gn=0,Zt,Yn,jt,pn,En,xn,wn,xt=!1,Kt=null,Zn,jn,Jo=Pe,it,Dt=0,We,Rt=0,An=!1,pe=!1,Nt=!1,qt=!1,wt=mn,At=mn,le,Mt=!1,he=t.xScale||null,re=t.yScale||null,Xt=0,Jt=0,Qt=0,en=0;he&&(Xt=he.domain()[0],Jt=he.domain()[1]-he.domain()[0],he.range([0,Te])),re&&(Qt=re.domain()[0],en=re.domain()[1]-re.domain()[0],re.range([Me,0]));const Qo=e=>-1+e/Te*2,ei=e=>1+e/Me*-2,cs=()=>[Qo(d[0]),ei(d[1])],Xe=(e,n)=>{const s=[e,n,1,1],l=rc(i,at(i,$n,at(i,v.view,pt)));return Cn(s,s,l),s.slice(0,2)},ti=(e=0)=>{const n=rt(),l=(Gt[1]-Yt[1])/r.height;return(Vn*n+e)*l},Kn=()=>U?X.filter((e,n)=>q.has(n)):X,qn=(e,n,s,l)=>{const h=zn.range(e,n,s,l);return U?h.filter(E=>q.has(E)):h},ni=()=>{const[e,n]=cs(),[s,l]=Xe(e,n),h=ti(4),E=qn(s-h,l-h,s+h,l+h);let w=h,p=-1;for(const g of E){const[M,fe]=X[g],Ee=ko(M,fe,s,l);Ee{Ve=e,Be.setPoints(n),o.publish("lassoExtend",{coordinates:e})},ds=e=>{const n=Id(e);if(!Td(n))return[];const s=qn(...n),l=[];for(const h of s)Dd(e,X[h])&&l.push(h);return l},Sn=()=>{Ve=[],Be&&Be.clear()},tn=e=>e&&e.length>4,St=(e,n)=>{if(Un||!ye||!tn(X[e[0]]))return;const s=n===0,l=n===1?p=>K.add(p):Qe,h=Object.keys(e.reduce((p,g)=>{const M=X[g],Ee=Array.isArray(M[4])?M[4][0]:M[4];return p[Ee]=!0,p},{})),E=He.getData().opacities,w=h.filter(p=>!K.has(+p));for(const p of w){const g=Fe[p][0],M=Fe[p][2],fe=Fe[p][3],Ee=g*4+fe*2,Io=Ee+M*2+4;E.__original__===void 0&&(E.__original__=E.slice());for(let Ft=Ee;Ft[e%ke/ke+Gn,Math.floor(e/ke)/ke+Gn],us=e=>U&&!q.has(e),Tn=({preventEvent:e=!1}={})=>{C===Wo&&Sn(),O.length>0&&(e||o.publish("deselect"),K.clear(),St(O,0),O=[],G.clear(),Z=!0)},fs=e=>{if(!(he&&re))return console.warn("xScale and yScale must be defined for programmatic lasso selection"),null;const n=[];for(const[s,l]of e){const h=(s-Xt)/Jt,E=(l-Qt)/en,w=h*2-1,p=E*2-1,[g,M]=Xe(w,p);n.push(g,M)}return n},Bt=(e,{merge:n=!1,remove:s=!1,preventEvent:l=!1}={})=>{const h=Array.isArray(e)?e:[e],E=[...O];if(n){if(O=oc(O,h),E.length===O.length){Z=!0;return}}else if(s){const p=new Set(h);if(O=O.filter(g=>!p.has(g)),E.length===O.length){Z=!0;return}}else{if(O?.length>0&&St(O,0),E.length>0&&h.length===0){Tn({preventEvent:l});return}O=h}if(To(E,O)){Z=!0;return}const w=[];G.clear(),K.clear();for(let p=O.length-1;p>=0;p--){const g=O[p];if(g<0||g>=ie||us(g)){O.splice(p,1);continue}G.add(g),w.push.apply(w,In(g))}Yn({usage:"dynamic",type:"float",data:w}),St(O,1),l||o.publish("select",{points:O}),Z=!0},ms=(e,{merge:n=!1,remove:s=!1,isGl:l=!1}={})=>{if(!Gd(e))throw new Error("Lasso selection requires at least 3 vertices as [x, y] coordinate pairs");const h=Yd(e);let E,w;if(l)E=h,w=h.flat();else{if(w=fs(h),!w)throw new Error("xScale and yScale must be defined to convert lasso vertices from data space to GL space");E=[];for(let p=0;p{let l=!1;if(!(U&&!q.has(e))&&e>=0&&e=0&&w&&!G.has(E)&&St([E],0),le=e,jt.subdata(In(e)),G.has(e)||St([e],2),w&&!s&&o.publish("pointover",le)}else l=+le>=0,l&&(G.has(le)||St([le],0),s||o.publish("pointout",le)),le=void 0;l&&(Z=!0,Et=n)},Xn=e=>{const n=r.getBoundingClientRect();return d[0]=e.clientX-n.left,d[1]=e.clientY-n.top,[...d]},hs=()=>{v.config({isFixed:!0}),D=!0,Ce=!0,Sn(),N>=0&&(clearTimeout(N),N=-1),o.publish("lassoStart")},oi=(e,n,{merge:s=!1,remove:l=!1}={})=>{v.config({isFixed:Ue}),Ve=[...e];const h=ds(n);Bt(h,{merge:s,remove:l}),o.publish("lassoEnd",{coordinates:Ve}),C===Yo&&Sn()},Q=rs(r,{onStart:hs,onDraw:ls,onEnd:oi,enableInitiator:b,initiatorParentElement:R,longPressIndicatorParentElement:Y,pointNorm:([e,n])=>Xe(Qo(e),ei(n)),minDelay:P,minDist:me==="brush"?Math.max(Vi,S):S,type:me}),gs=()=>_e===Ji,on=(e,n)=>{switch(ue[n]){case Fn:return e.altKey;case jo:return e.metaKey;case Qi:return e.ctrlKey;case es:return e.metaKey;case Ko:return e.shiftKey;default:return!1}},ys=e=>document.elementsFromPoint(e.clientX,e.clientY).some(n=>n===r),ii=e=>{!pe||e.buttons!==1||(D=!0,F=performance.now(),k=Xn(e),Ce=gs()||on(e,Zo),!Ce&&H&&(Q.showLongPressIndicator(e.clientX,e.clientY,{time:L,extraTime:z,delay:$}),N=setTimeout(()=>{N=-1,Ce=!0},L)))},Jn=e=>{pe&&(D=!1,N>=0&&(clearTimeout(N),N=-1),Ce&&(e.preventDefault(),Ce=!1,Q.end({merge:on(e,Mn),remove:on(e,Bn)})),H&&Q.hideLongPressIndicator({time:de}))},si=e=>{if(!pe)return;e.preventDefault();const n=Xn(e);if(ko(...n,...k)>=S)return;const s=performance.now()-F;if(!b||s=0?(O.length>0&&C===Wo&&Sn(),Bt([l],{merge:on(e,Mn),remove:on(e,Bn)})):Ot||(Ot=setTimeout(()=>{Ot=null,Q.showInitiator(e)},Sl))}},ri=e=>{Q.hideInitiator(),Ot&&(clearTimeout(Ot),Ot=null),c&&(e.preventDefault(),Tn())},ai=e=>{if(qt||(Mt=ys(e),qt=!0),!(pe&&(Mt||D)))return;const n=Xn(e),l=ko(...n,...k)>=S;Mt&&!Ce&&nn(ni()),Ce?(e.preventDefault(),Q.extend(e,!0)):D&&H&&l&&Q.hideLongPressIndicator({time:de}),N>=0&&l&&(clearTimeout(N),N=-1),D&&(Z=!0)},ci=()=>{le=void 0,Mt=!1,qt=!1,pe&&(+le>=0&&!G.has(le)&&St([le],0),Jn(),Z=!0)},Qn=()=>{const e=Math.max(W.length,j.length);Rt=Math.max(2,Math.ceil(Math.sqrt(e)));const n=new Float32Array(Rt**2*4);for(let s=0;s{const l=e.length,h=n.length,E=s.length,w=[];if(l===h&&h===E)for(let p=0;p{const e=eo(),n=e.length;Dt=Math.max(2,Math.ceil(Math.sqrt(n)));const s=new Float32Array(Dt**2*4);return e.forEach((l,h)=>{s[h*4]=l[0],s[h*4+1]=l[1],s[h*4+2]=l[2],s[h*4+3]=l[3]}),a.regl.texture({data:s,shape:[Dt,Dt,4],type:"float"})},ps=(e,n)=>{_t[0]=e/Vt,_t[5]=n},no=()=>{Vt=Te/Me,$n=Po([],[1/Vt,1,1]),_t=Po([],[1/Vt,1,1]),pt=Po([],[gn,1,1])},Es=e=>{+e<=0||(gn=e)},oo=(e,n)=>s=>{if(!s||s.length===0)return;const h=[...e()];let E=ut(s)?s:[s];if(E=E.map(w=>ge(w,!0)),!Bd(h,E)){it&&it.destroy();try{n(E),it=to()}catch{console.error("Invalid colors. Switching back to default colors."),n(h),it=to()}}},xs=oo(()=>V,e=>{V=e}),ws=oo(()=>oe,e=>{oe=e}),As=oo(()=>ee,e=>{ee=e}),Ss=()=>{const e=Xe(-1,-1),n=Xe(1,1),s=(e[0]+1)/2,l=(n[0]+1)/2,h=(e[1]+1)/2,E=(n[1]+1)/2,w=[Xt+s*Jt,Xt+l*Jt],p=[Qt+h*en,Qt+E*en];return[w,p]},st=()=>{if(!(he||re))return;const[e,n]=Ss();he&&he.domain(e),re&&re.domain(n)},io=(e,n)=>{Me=Math.max(1,e),r.height=Math.floor(Me*window.devicePixelRatio),re&&(re.range([Me,0]),n||st())},so=e=>{if(e===Ye){Se=e,r.style.height="100%",window.requestAnimationFrame(()=>{r&&io(r.getBoundingClientRect().height)});return}!+e||+e<=0||(Se=+e,io(Se),r.style.height=`${Se}px`)},ro=()=>{Vn=we,we===Ye&&(Vn=Array.isArray(W)?sc(W):W)},ao=e=>{const n=Array.isArray(W)?[...W]:W;lt(e,dt,{minLength:1})?W=[...e]:vn(+e)&&(W=[+e]),!(n===W||To(n,W))&&(We&&We.destroy(),Wn=bo/W[0],We=Qn(),ro())},Is=e=>{!+e||+e<0||(ze=+e)},Ts=e=>{!+e||+e<0||(Ze=+e)},co=(e,n)=>{Te=Math.max(1,e),r.width=Math.floor(Te*window.devicePixelRatio),he&&(he.range([0,Te]),n||st())},lo=e=>{if(e===Ye){Ie=e,r.style.width="100%",window.requestAnimationFrame(()=>{r&&co(r.getBoundingClientRect().width)});return}!+e||+e<=0||(Ie=+e,co(Ie),r.style.width=`${Te}px`)},Ps=e=>{const n=Array.isArray(j)?[...j]:j;lt(e,dt,{minLength:1})?j=[...e]:vn(+e)&&(j=[+e]),!(n===j||To(n,j))&&(We&&We.destroy(),We=Qn())},uo=e=>{switch(e){case"valueZ":return wt;case"valueW":return At;default:return null}},fo=(e,n)=>e===Ge?s=>Math.round(s*(n.length-1)):Qe,Cs=e=>{u=Le(e,un)},bs=e=>{Ae=Le(e,Oo,{allowDensity:!0})},vs=e=>{$e=Le(e,vo)},Ls=e=>{Oe=Le(e,Do,{allowSegment:!0,allowInherit:!0})},_s=e=>{De=Le(e,_o,{allowSegment:!0})},Os=e=>{Re=Le(e,Lo,{allowSegment:!0})},Ds=()=>I,Rs=()=>[r.width,r.height],Ns=()=>f,Ms=()=>it,Bs=()=>Dt,Fs=()=>.5/Dt,ks=()=>window.devicePixelRatio,zs=()=>Zt,mo=()=>Yn,$s=()=>We,Us=()=>Rt,Vs=()=>.5/Rt,li=()=>0,Hs=()=>ot||tt,Ws=()=>ke,Gs=()=>.5/ke,ho=()=>_t,go=()=>v.view,yo=()=>pt,po=()=>at(m,_t,at(m,v.view,pt)),di=()=>window.devicePixelRatio,ui=()=>fn(Wn,v.scaling[0])*window.devicePixelRatio,fi=()=>v.scaling[0]>1?Math.asinh(fn(1,v.scaling[0]))/Math.asinh(1)*window.devicePixelRatio:fn(Wn,v.scaling[0])*window.devicePixelRatio;let rt=fi;et==="linear"?rt=ui:et==="constant"&&(rt=di);const mi=()=>U?q.size:ie,sn=()=>O.length,Ys=()=>sn()>0?Ct:1,Zs=()=>sn()>0?je:1,js=()=>+(u==="valueZ"),Ks=()=>+(u==="valueW"),qs=()=>+(Ae==="valueZ"),Xs=()=>+(Ae==="valueW"),Js=()=>+(Ae==="density"),Qs=()=>+($e==="valueZ"),er=()=>+($e==="valueW"),tr=()=>+_,nr=()=>u==="valueZ"?wt===Ge?V.length-1:1:At===Ge?V.length-1:1,or=()=>Ae==="valueZ"?wt===Ge?j.length-1:1:At===Ge?j.length-1:1,ir=()=>$e==="valueZ"?wt===Ge?W.length-1:1:At===Ge?W.length-1:1,sr=e=>{if(Ae!=="density")return 1;const n=rt(),s=W[0]*n,l=2/(2/v.view[0])*(2/(2/v.view[5])),h=e.viewportHeight,E=e.viewportWidth;let w=zt*E*h/(yt*s*s)*Yi(1,l);w*=gt?1:1/(.25*Math.PI);const p=fn(bo,s)+.5;return w*=(s/p)**2,Yi(1,fn(0,w))},rr=a.regl({framebuffer:()=>Xo,vert:wd,frag:xd,attributes:{position:[-4,0,4,4,4,-4]},uniforms:{startStateTex:()=>nt,endStateTex:()=>tt,t:(e,n)=>n.t},count:3}),It=(e,n,s,l=yc,h=Ys,E=Zs)=>a.regl({frag:gt?Ed:yd,vert:pd(l),blend:{enable:!hn,func:{srcRGB:"src alpha",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}},depth:{enable:!1},attributes:{stateIndex:{buffer:s,size:2}},uniforms:{antiAliasing:Ds,resolution:Rs,modelViewProjection:po,devicePixelRatio:ks,pointScale:()=>rt(),encodingTex:$s,encodingTexRes:Us,encodingTexEps:Vs,pointOpacityMax:h,pointOpacityScale:E,pointSizeExtra:e,globalState:l,colorTex:Ms,colorTexRes:Bs,colorTexEps:Fs,stateTex:Hs,stateTexRes:Ws,stateTexEps:Gs,isColoredByZ:js,isColoredByW:Ks,isOpacityByZ:qs,isOpacityByW:Xs,isOpacityByDensity:Js,isSizedByZ:Qs,isSizedByW:er,isPixelAligned:tr,colorMultiplicator:nr,opacityMultiplicator:or,opacityDensity:sr,sizeMultiplicator:ir,numColorStates:Ec,drawingBufferWidth:w=>w.drawingBufferWidth,drawingBufferHeight:w=>w.drawingBufferHeight},count:n,primitive:"points"}),ar=It(li,mi,zs),cr=It(li,()=>1,()=>jt,pc,()=>1,()=>1),lr=It(()=>(ze+Ze*2)*window.devicePixelRatio,sn,mo,Co,()=>1,()=>1),dr=It(()=>(ze+Ze)*window.devicePixelRatio,sn,mo,Fi,()=>1,()=>1),ur=It(()=>ze*window.devicePixelRatio,sn,mo,Co,()=>1,()=>1),fr=()=>{lr(),dr(),ur()},mr=a.regl({frag:hc,vert:gc,attributes:{position:[0,1,0,0,1,0,0,1,1,1,1,0]},uniforms:{modelViewProjection:po,texture:Ns},count:6}),hr=a.regl({vert:`
+ precision mediump float;
+ uniform mat4 modelViewProjection;
+ attribute vec2 position;
+ void main () {
+ gl_Position = modelViewProjection * vec4(position, 0, 1);
+ }`,frag:`
+ precision mediump float;
+ uniform vec4 color;
+ void main () {
+ gl_FragColor = vec4(color.rgb, 0.2);
+ }`,depth:{enable:!1},blend:{enable:!0,func:{srcRGB:"src alpha",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}},attributes:{position:()=>Ve},uniforms:{modelViewProjection:po,color:()=>x},elements:()=>nc(Be.getPoints())}),gr=()=>{if(!(le>=0))return;const[e,n]=X[le].slice(0,2),s=[e,n,0,1];at(i,_t,at(i,v.view,pt)),Cn(s,s,i),Ht.setPoints([-1,s[1],1,s[1]]),Wt.setPoints([s[0],1,s[0],-1]),Ht.draw(),Wt.draw(),It(()=>(ze+Ze*2)*window.devicePixelRatio,()=>1,jt,Co)(),It(()=>(ze+Ze)*window.devicePixelRatio,()=>1,jt,Fi)()},hi=e=>{const n=new Float32Array(e*2);let s=0;for(let l=0;l{const s=e.length;ke=Math.max(2,Math.ceil(Math.sqrt(s))),Gn=.5/ke;const l=new Float32Array(ke**2*4);let h=!0,E=!0,w=0,p=0,g=0;for(let M=0;M{if(!tt)return!1;if(xt){const s=nt;nt=ot,s.destroy()}else nt=tt;return ot=gi(e,n),Xo=a.regl.framebuffer({color:ot,depth:!1,stencil:!1}),tt=void 0,!0},pr=()=>!!(nt&&ot),Er=()=>{nt&&(nt.destroy(),nt=void 0),ot&&(ot.destroy(),ot=void 0)},yi=(e,n={})=>new Promise(s=>{pe=!1;const l=n?.preventFilterReset&&e.length===ie;ie=e.length,yt=ie,tt&&tt.destroy(),tt=gi(e,{z:n.zDataType,w:n.wDataType}),l||Zt({usage:"static",type:"float",data:hi(ie)}),Rl(n.spatialIndex||e,{useWorker:Ut}).then(h=>{zn=h,X=e,pe=!0}).then(s)}),pi=(e,n)=>{pn=v.target,En=e,xn=v.distance[0],wn=n},xr=()=>pn!==void 0&&En!==void 0&&xn!==void 0&&wn!==void 0,wr=()=>{pn=void 0,En=void 0,xn=void 0,wn=void 0},Ar=e=>{const n=Oe==="inherit"?u:Oe;if(n==="segment"){const s=te.length-1;return s<1?[]:e.reduce((l,h,E)=>{let w=0;const p=[];for(let M=2;M(h[E]=l(w[s])*4,h),[])}return new Array(Fe.length).fill(0)},Sr=()=>{const e=De==="inherit"?Ae:De;if(e==="segment"){const n=J.length-1;return n<1?[]:Fe.reduce((s,[l,h,E])=>(s[l]=Bi(E,w=>J[Math.floor(w/(E-1)*n)]),s),[])}if(e){const n=Vo(e),s=De==="inherit"?j:J,l=fo(uo(e),s);return Fe.reduce((h,[E,w])=>(h[E]=s[l(w[n])],h),[])}},Ir=()=>{const e=Re==="inherit"?$e:Re;if(e==="segment"){const n=se.length-1;return n<1?[]:Fe.reduce((s,[l,h,E])=>(s[l]=Bi(E,w=>se[Math.floor(w/(E-1)*n)]),s),[])}if(e){const n=Vo(e),s=Re==="inherit"?W:se,l=fo(uo(e),s);return Fe.reduce((h,[E,w])=>(h[E]=s[l(w[n])],h),[])}},Tr=e=>{Fe=[];let n=0;Object.keys(e).forEach((s,l)=>{Fe[s]=[l,e[s].reference,e[s].length/2,n],n+=e[s].length/2})},rn=e=>new Promise(n=>{He.setPoints([]),e?.length>0?(Un=!0,qd(e,{maxIntPointsPerSegment:mt,tolerance:Pt}).then(s=>{Tr(s);const l=Object.values(s);He.setPoints(l.length===1?l[0]:l,{colorIndices:Ar(l),opacities:Sr(),widths:Ir()}),Un=!1,n()})):n()}),Pr=({preventEvent:e=!1}={})=>(U=!1,q.clear(),Zt.subdata(hi(ie)),new Promise(n=>{const s=()=>{o.subscribe("draw",()=>{e||o.publish("unfilter"),n()},1),Z=!0};ye||tn(X[0])?rn(Kn()).then(()=>{e||o.publish("pointConnectionsDraw"),s()}):s()})),Ei=(e,{preventEvent:n=!1}={})=>{U=!0,q.clear();const s=Array.isArray(e)?e:[e],l=[],h=[],E=[];for(const p of s)!Number.isFinite(p)||p<0||p>=ie||(l.push(p),q.add(p),G.has(p)&&E.push(p));const w=Zd([...l]);for(const p of w)h.push.apply(h,In(p));return Zt.subdata(h),Bt(E,{preventEvent:n}),q.has(le)||nn(-1,{preventEvent:n}),new Promise(p=>{const g=()=>{o.subscribe("draw",()=>{n||o.publish("filter",{points:l}),p()},1),Z=!0};ye||tn(X[0])?rn(Kn()).then(()=>{n||o.publish("pointConnectionsDraw"),Bt(E,{preventEvent:n}),g()}):g()})},xi=()=>qn(Yt[0],Yt[1],Gt[0],Gt[1]),Cr=qi(()=>{yt=xi().length},$t),br=e=>{const[n,s]=pn,[l,h]=En,E=1-e,w=n*E+l*e,p=s*E+h*e,g=xn*E+wn*e;v.lookAt([w,p],g)},vr=()=>pr(),Lr=()=>xr(),_r=(e,n)=>{Kt||(Kt=performance.now());const s=performance.now()-Kt,l=kd(n(s/e),0,1);return vr()&&rr({t:l}),Lr()&&br(l),s{xt=!1,Kt=null,Zn=void 0,jn=void 0,Pe=Jo,Er(),wr(),o.publish("transitionEnd")},Eo=({duration:e=500,easing:n=$i})=>{xt&&o.publish("transitionEnd"),xt=!0,Kt=null,Zn=e,jn=Go(n)?Ac[n]||$i:n,Jo=Pe,Pe=!1,o.publish("transitionStart")},Dr=(e,n={})=>qe?Promise.reject(new Error(Ro)):vt?Promise.reject(new Error(Ll)):(vt=!0,zd(e).then(s=>new Promise(l=>{if(qe){l();return}let h=!1;(!n.preventFilterReset||s?.length!==ie)&&(U=!1,q.clear());const E=s&&tn(s[0])&&(ye||n.showPointConnectionsOnce),{zDataType:w,wDataType:p}=n;new Promise(g=>{s?(n.transition&&(s.length===ie?h=yr(s,{z:w,w:p}):console.warn("Cannot transition! The number of points between the previous and current draw call must be identical.")),yi(s,{zDataType:w,wDataType:p,preventFilterReset:n.preventFilterReset,spatialIndex:n.spatialIndex}).then(()=>{n.hover!==void 0&&nn(n.hover,{preventEvent:!0}),n.select!==void 0&&Bt(n.select,{preventEvent:!0}),n.filter!==void 0&&Ei(n.filter,{preventEvent:!0}),E?rn(s).then(()=>{o.publish("pointConnectionsDraw"),Z=!0,Et=n.showReticleOnce}).then(()=>l()):g()})):g()}).then(()=>{n.transition&&h?(E?Promise.all([new Promise(g=>{o.subscribe("transitionEnd",()=>{Z=!0,Et=n.showReticleOnce,g()},1)}),new Promise(g=>{o.subscribe("pointConnectionsDraw",g,1)})]).then(()=>l()):o.subscribe("transitionEnd",()=>{Z=!0,Et=n.showReticleOnce,l()},1),Eo({duration:n.transitionDuration,easing:n.transitionEasing})):(E?Promise.all([new Promise(g=>{o.subscribe("draw",g,1)}),new Promise(g=>{o.subscribe("pointConnectionsDraw",g,1)})]).then(()=>l()):o.subscribe("draw",()=>l(),1),Z=!0,Et=n.showReticleOnce)})}).finally(()=>{vt=!1}))),wi=e=>qe?Promise.reject(new Ro):(Nt=!1,e.length===0?new Promise(n=>{A.clear(),o.subscribe("draw",n,1),Nt=!0,Z=!0}):new Promise(n=>{const s=[],l=new Map,h=[],E=[];let w=-1;const p=g=>{E.push(g.lineWidth||Ke);const M=ge(g.lineColor||bt,!0),fe=`[${M.join(",")}]`;if(l.has(fe)){const{idx:Ee}=l.get(fe);h.push(Ee)}else{const Ee=++w;l.set(fe,{idx:Ee,color:M}),h.push(Ee)}};for(const g of e){if($d(g)){s.push([g.x1??-Ne,g.y,g.x2??Ne,g.y]),p(g);continue}if(Ud(g)){s.push([g.x,g.y1??-Ne,g.x,g.y2??Ne]),p(g);continue}if(Hd(g)){s.push([g.x1,g.y1,g.x2,g.y1,g.x2,g.y2,g.x1,g.y2,g.x1,g.y1]),p(g);continue}if(Vd(g)){s.push([g.x,g.y,g.x+g.width,g.y,g.x+g.width,g.y+g.height,g.x,g.y+g.height,g.x,g.y]),p(g);continue}Wd(g)&&(s.push(g.vertices.flatMap(Qe)),p(g))}A.setStyle({color:Array.from(l.values()).sort((g,M)=>g.idx>M.idx?1:-1).map(({color:g})=>g)}),A.setPoints(s.length===1?s.flat():s,{colorIndices:h,widths:E}),o.subscribe("draw",n,1),Nt=!0,Z=!0})),an=e=>(...n)=>{const s=e(...n);return Z=!0,new Promise(l=>{o.subscribe("draw",()=>l(s),1)})},Rr=e=>{let n=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.POSITIVE_INFINITY,h=Number.NEGATIVE_INFINITY;for(const E of e){const[w,p]=X[E];n=Math.min(n,w),s=Math.max(s,w),l=Math.min(l,p),h=Math.max(h,p)}return{x:n,y:l,width:s-n,height:h-l}},Ai=(e,n={})=>new Promise(s=>{const l=Cn([],[e.x+e.width/2,e.y+e.height/2,0,0],pt).slice(0,2),h=2*Math.atan(1),E=Vt/gn,w=e.height*E>=e.width?e.height/2/Math.tan(h/2):e.width/2/Math.tan(h/2)/E;n.transition?(v.config({isFixed:!0}),pi(l,w),o.subscribe("transitionEnd",()=>{s(),v.config({isFixed:Ue})},1),Eo({duration:n.transitionDuration,easing:n.transitionEasing})):(v.lookAt(l,w),o.subscribe("draw",s,1),Z=!0)}),Nr=(e,n={})=>{if(!pe)return Promise.reject(new Error(Hi));const s=Rr(e),l=s.x+s.width/2,h=s.y+s.height/2,E=ti(),w=1+(n.padding||0),p=Math.max(s.width,E)*w,g=Math.max(s.height,E)*w,M=l-p/2,fe=h-g/2;return Ai({x:M,y:fe,width:p,height:g},n)},Si=(e,n,s={})=>new Promise(l=>{s.transition?(v.config({isFixed:!0}),pi(e,n),o.subscribe("transitionEnd",()=>{l(),v.config({isFixed:Ue})},1),Eo({duration:s.transitionDuration,easing:s.transitionEasing})):(v.lookAt(e,n),o.subscribe("draw",l,1),Z=!0)}),Mr=(e={})=>Si([0,0],1,e),Br=e=>{if(!pe)throw new Error(Hi);const n=X[e];if(!n)return;const s=[n[0],n[1],0,1];at(i,$n,at(i,v.view,pt)),Cn(s,s,i);const l=Te*(s[0]+1)/2,h=Me*(.5-s[1]/2);return[l,h]},xo=()=>{He.setStyle({color:eo(te,ae,ce),opacity:J===null?null:J[0],width:se[0]})},Ii=()=>{const e=Math.round(Lt)>.5?0:255;Q.initiator.style.border=`1px dashed rgba(${e}, ${e}, ${e}, 0.33)`,Q.initiator.style.background=`rgba(${e}, ${e}, ${e}, 0.1)`},Ti=()=>{const e=Math.round(Lt)>.5?0:255;Q.longPressIndicator.style.color=`rgb(${e}, ${e}, ${e})`,Q.longPressIndicator.dataset.color=`rgb(${e}, ${e}, ${e})`;const n=x.map(s=>Math.round(s*255));Q.longPressIndicator.dataset.activeColor=`rgb(${n[0]}, ${n[1]}, ${n[2]})`},Fr=e=>{e&&(B=ge(e,!0),Lt=Zi(B),Ii(),Ti())},kr=e=>{e?Go(e)?Wi(a.regl,e).then(n=>{f=n,Z=!0,o.publish("backgroundImageReady")}).catch(()=>{console.error(`Count not create texture from ${e}`),f=null}):e._reglType==="texture2d"?f=e:f=null:f=null},zr=e=>{e>0&&v.lookAt(v.target,e,v.rotation)},$r=e=>{e!==null&&v.lookAt(v.target,v.distance[0],e)},Ur=e=>{e&&v.lookAt(e,v.distance[0],v.rotation)},Pi=e=>{e&&v.setView(e)},Vr=e=>{Ue=!!e,v.config({isFixed:Ue})},Hr=e=>{if(!e)return;x=ge(e,!0),Be.setStyle({color:x});const n=x.map(s=>Math.round(s*255));Q.longPressIndicator.dataset.activeColor=`rgb(${n[0]}, ${n[1]}, ${n[2]})`},Wr=e=>{Number.isNaN(+e)||+e<1||(T=+e,Be.setStyle({width:T}))},Gr=e=>{+e&&(P=+e,Q.set({minDelay:P}))},Yr=e=>{+e&&(S=+e,Q.set({minDist:S}))},Zr=e=>{C=zo(Sc,C)(e)},jr=e=>{b=!!e,Q.set({enableInitiator:b})},Kr=e=>{R=e,Q.set({initiatorParentElement:R})},qr=e=>{Y=e,Q.set({longPressIndicatorParentElement:Y})},Xr=e=>{H=!!e},Jr=e=>{L=Number(e)},Qr=e=>{z=Number(e)},ea=e=>{$=Number(e)},ta=e=>{de=Number(e)},na=e=>{e==="brush"?Q.set({type:e,minDist:Math.max(Vi,S)}):Q.set({type:e,minDist:S}),me=Q.get("type")},oa=e=>{xe=Number(e)||xe,Q.set({brushSize:xe})},ia=()=>{ue[Nn]?v.config({isRotate:!0,mouseDownMoveModKey:ue[Nn]}):v.config({isRotate:!1})},sa=e=>{ue=Object.entries(e).reduce((n,[s,l])=>(Dc.includes(l)&&Oc.includes(s)&&(n[s]=l),n),{}),ia()},ra=e=>{_e=zo(zi,Ln)(e),v.config({defaultMouseDownMoveAction:_e===Ho?"rotate":"pan"})},aa=e=>{e!==null&&(Pe=e)},ca=e=>{e&&(ne=ge(e,!0),Ht.setStyle({color:ne}),Wt.setStyle({color:ne}))},la=e=>{e&&(he=e,Xt=e.domain()[0],Jt=e?e.domain()[1]-e.domain()[0]:0,he.range([0,Te]),st())},da=e=>{e&&(re=e,Qt=re.domain()[0],en=re?re.domain()[1]-re.domain()[0]:0,re.range([Me,0]),st())},ua=e=>{c=!!e},fa=e=>{y=!!e},ma=e=>{ye=!!e,ye?pe&&tn(X[0])&&rn(Kn()).then(()=>{o.publish("pointConnectionsDraw"),Z=!0}):rn()},wo=(e,n)=>s=>{if(s==="inherit")e([...n()]);else{const l=ut(s)?s:[s];e(l.map(h=>ge(h,!0)))}xo()},ha=wo(e=>{te=e},()=>V),ga=wo(e=>{ae=e},()=>oe),ya=wo(e=>{ce=e},()=>ee),pa=e=>{lt(e,dt,{minLength:1})&&(J=[...e]),vn(+e)&&(J=[+e]),te=te.map(n=>(n[3]=Number.isNaN(+J[0])?n[3]:+J[0],n)),xo()},Ea=e=>{!Number.isNaN(+e)&&+e&&(ft=+e)},xa=e=>{lt(e,dt,{minLength:1})&&(se=[...e]),vn(+e)&&(se=[+e]),xo()},wa=e=>{!Number.isNaN(+e)&&+e&&(Tt=Math.max(0,e))},Aa=e=>{mt=Math.max(0,e)},Sa=e=>{Pt=Math.max(0,e)},Ia=e=>{we=e,ro()},Ta=e=>{switch(e){case"linear":{et=e,rt=ui;break}case"constant":{et=e,rt=di;break}default:{et="asinh",rt=fi;break}}},Pa=e=>{zt=+e},Ca=e=>{Ct=+e},ba=e=>{je=+e},va=e=>{bt=ge(e)},La=e=>{Ke=+e},_a=e=>{Ne=+e},Oa=e=>{a.gamma=e},Ao=e=>{I=Number(e)||.5},So=e=>{_=!!e},Da=e=>{const[n]=Object.keys(Uo({[e]:os}));if(n==="aspectRatio")return gn;if(n==="background"||n==="backgroundColor")return B;if(n==="backgroundImage")return f;if(n==="camera")return v;if(n==="cameraTarget")return v.target;if(n==="cameraDistance")return v.distance[0];if(n==="cameraRotation")return v.rotation;if(n==="cameraView")return v.view;if(n==="cameraIsFixed")return Ue;if(n==="canvas")return r;if(n==="colorBy")return u;if(n==="sizeBy")return $e;if(n==="deselectOnDblClick")return c;if(n==="deselectOnEscape")return y;if(n==="height")return Se;if(n==="lassoColor")return x;if(n==="lassoLineWidth")return T;if(n==="lassoMinDelay")return P;if(n==="lassoMinDist")return S;if(n==="lassoClearEvent")return C;if(n==="lassoInitiator")return b;if(n==="lassoInitiatorElement")return Q.initiator;if(n==="lassoInitiatorParentElement")return R;if(n==="lassoLongPressIndicatorParentElement")return Y;if(n==="lassoOnLongPress")return H;if(n==="lassoType")return me;if(n==="lassoBrushSize")return xe;if(n==="mouseMode")return _e;if(n==="opacity")return j.length===1?j[0]:j;if(n==="opacityBy")return Ae;if(n==="opacityByDensityFill")return zt;if(n==="opacityByDensityDebounceTime")return $t;if(n==="opacityInactiveMax")return Ct;if(n==="opacityInactiveScale")return je;if(n==="points")return X;if(n==="hoveredPoint")return le;if(n==="selectedPoints")return[...O];if(n==="filteredPoints")return U?Array.from(q):Array.from({length:X.length},(s,l)=>l);if(n==="pointsInView")return xi();if(n==="pointColor")return V.length===1?V[0]:V;if(n==="pointColorActive")return oe.length===1?oe[0]:oe;if(n==="pointColorHover")return ee.length===1?ee[0]:ee;if(n==="pointOutlineWidth")return Ze;if(n==="pointSize")return W.length===1?W[0]:W;if(n==="pointSizeSelected")return ze;if(n==="pointSizeMouseDetection")return we;if(n==="showPointConnections")return ye;if(n==="pointConnectionColor")return te.length===1?te[0]:te;if(n==="pointConnectionColorActive")return ae.length===1?ae[0]:ae;if(n==="pointConnectionColorHover")return ce.length===1?ce[0]:ce;if(n==="pointConnectionColorBy")return Oe;if(n==="pointConnectionOpacity")return J.length===1?J[0]:J;if(n==="pointConnectionOpacityBy")return De;if(n==="pointConnectionOpacityActive")return ft;if(n==="pointConnectionSize")return se.length===1?se[0]:se;if(n==="pointConnectionSizeActive")return Tt;if(n==="pointConnectionSizeBy")return Re;if(n==="pointConnectionMaxIntPointsPerSegment")return mt;if(n==="pointConnectionTolerance")return Pt;if(n==="pointScaleMode")return et;if(n==="reticleColor")return ne;if(n==="regl")return a.regl;if(n==="showReticle")return Pe;if(n==="version")return mc;if(n==="width")return Ie;if(n==="xScale")return he;if(n==="yScale")return re;if(n==="performanceMode")return ht;if(n==="renderPointsAsSquares")return gt;if(n==="disableAlphaBlending")return hn;if(n==="gamma")return a.gamma;if(n==="renderer")return a;if(n==="isDestroyed")return qe;if(n==="isDrawing")return vt;if(n==="isPointsDrawn")return pe;if(n==="isPointsFiltered")return U;if(n==="isAnnotationsDrawn")return Nt;if(n==="zDataType")return wt;if(n==="wDataType")return At;if(n==="spatialIndex")return zn?.data;if(n==="annotationLineColor")return bt;if(n==="annotationLineWidth")return Ke;if(n==="annotationHVLineLimit")return Ne;if(n==="antiAliasing")return I;if(n==="pixelAligned")return _;if(n==="actionKeyMap")return{...ue}},Ci=(e={})=>qe?Promise.reject(new Error(Ro)):(Uo(e),(e.backgroundColor!==void 0||e.background!==void 0)&&Fr(e.backgroundColor||e.background),e.backgroundImage!==void 0&&kr(e.backgroundImage),e.cameraTarget!==void 0&&Ur(e.cameraTarget),e.cameraDistance!==void 0&&zr(e.cameraDistance),e.cameraRotation!==void 0&&$r(e.cameraRotation),e.cameraView!==void 0&&Pi(e.cameraView),e.cameraIsFixed!==void 0&&Vr(e.cameraIsFixed),e.colorBy!==void 0&&Cs(e.colorBy),e.pointColor!==void 0&&xs(e.pointColor),e.pointColorActive!==void 0&&ws(e.pointColorActive),e.pointColorHover!==void 0&&As(e.pointColorHover),e.pointSize!==void 0&&ao(e.pointSize),e.pointSizeSelected!==void 0&&Is(e.pointSizeSelected),e.pointSizeMouseDetection!==void 0&&Ia(e.pointSizeMouseDetection),e.sizeBy!==void 0&&vs(e.sizeBy),e.opacity!==void 0&&Ps(e.opacity),e.showPointConnections!==void 0&&ma(e.showPointConnections),e.pointConnectionColor!==void 0&&ha(e.pointConnectionColor),e.pointConnectionColorActive!==void 0&&ga(e.pointConnectionColorActive),e.pointConnectionColorHover!==void 0&&ya(e.pointConnectionColorHover),e.pointConnectionColorBy!==void 0&&Ls(e.pointConnectionColorBy),e.pointConnectionOpacityBy!==void 0&&_s(e.pointConnectionOpacityBy),e.pointConnectionOpacity!==void 0&&pa(e.pointConnectionOpacity),e.pointConnectionOpacityActive!==void 0&&Ea(e.pointConnectionOpacityActive),e.pointConnectionSize!==void 0&&xa(e.pointConnectionSize),e.pointConnectionSizeActive!==void 0&&wa(e.pointConnectionSizeActive),e.pointConnectionSizeBy!==void 0&&Os(e.pointConnectionSizeBy),e.pointConnectionMaxIntPointsPerSegment!==void 0&&Aa(e.pointConnectionMaxIntPointsPerSegment),e.pointConnectionTolerance!==void 0&&Sa(e.pointConnectionTolerance),e.pointScaleMode!==void 0&&Ta(e.pointScaleMode),e.opacityBy!==void 0&&bs(e.opacityBy),e.lassoColor!==void 0&&Hr(e.lassoColor),e.lassoLineWidth!==void 0&&Wr(e.lassoLineWidth),e.lassoMinDelay!==void 0&&Gr(e.lassoMinDelay),e.lassoMinDist!==void 0&&Yr(e.lassoMinDist),e.lassoClearEvent!==void 0&&Zr(e.lassoClearEvent),e.lassoInitiator!==void 0&&jr(e.lassoInitiator),e.lassoInitiatorParentElement!==void 0&&Kr(e.lassoInitiatorParentElement),e.lassoLongPressIndicatorParentElement!==void 0&&qr(e.lassoLongPressIndicatorParentElement),e.lassoOnLongPress!==void 0&&Xr(e.lassoOnLongPress),e.lassoLongPressTime!==void 0&&Jr(e.lassoLongPressTime),e.lassoLongPressAfterEffectTime!==void 0&&Qr(e.lassoLongPressAfterEffectTime),e.lassoLongPressEffectDelay!==void 0&&ea(e.lassoLongPressEffectDelay),e.lassoLongPressRevertEffectTime!==void 0&&ta(e.lassoLongPressRevertEffectTime),e.lassoType!==void 0&&na(e.lassoType),e.lassoBrushSize!==void 0&&oa(e.lassoBrushSize),e.actionKeyMap!==void 0&&sa(e.actionKeyMap),e.mouseMode!==void 0&&ra(e.mouseMode),e.showReticle!==void 0&&aa(e.showReticle),e.reticleColor!==void 0&&ca(e.reticleColor),e.pointOutlineWidth!==void 0&&Ts(e.pointOutlineWidth),e.height!==void 0&&so(e.height),e.width!==void 0&&lo(e.width),e.aspectRatio!==void 0&&Es(e.aspectRatio),e.xScale!==void 0&&la(e.xScale),e.yScale!==void 0&&da(e.yScale),e.deselectOnDblClick!==void 0&&ua(e.deselectOnDblClick),e.deselectOnEscape!==void 0&&fa(e.deselectOnEscape),e.opacityByDensityFill!==void 0&&Pa(e.opacityByDensityFill),e.opacityInactiveMax!==void 0&&Ca(e.opacityInactiveMax),e.opacityInactiveScale!==void 0&&ba(e.opacityInactiveScale),e.gamma!==void 0&&Oa(e.gamma),e.annotationLineColor!==void 0&&va(e.annotationLineColor),e.annotationLineWidth!==void 0&&La(e.annotationLineWidth),e.annotationHVLineLimit!==void 0&&_a(e.annotationHVLineLimit),e.antiAliasing!==void 0&&Ao(e.antiAliasing),e.pixelAligned!==void 0&&So(e.pixelAligned),new Promise(n=>{window.requestAnimationFrame(()=>{qe||!r||(no(),v.refresh(),a.refresh(),Pn(),n())})})),Ra=(e,{preventEvent:n=!1}={})=>{Pi(e),Z=!0,Hn=n},bi=()=>{v||(v=ic(r,{isFixed:Ue,isPanInverted:[!1,!0],defaultMouseDownMoveAction:_e===Ho?"rotate":"pan"})),t.cameraView?v.setView(Mi(t.cameraView)):t.cameraTarget||t.cameraDistance||t.cameraRotation?v.lookAt([...t.cameraTarget||al],t.cameraDistance||cl,t.cameraRotation||ll):v.setView(Mi(dl)),Gt=Xe(1,1),Yt=Xe(-1,-1)},Na=({preventEvent:e=!1}={})=>{bi(),st(),!e&&o.publish("view",{view:v.view,camera:v,xScale:he,yScale:re})},vi=({key:e})=>{e==="Escape"&&y&&Tn()},Li=()=>{Mt=!0,qt=!0},_i=()=>{nn(),Mt=!1,qt=!0,Z=!0},Oi=()=>{Z=!0},Di=()=>{yi([]),He.clear()},Ma=()=>{He.clear()},Ri=()=>{wi([])},Ba=()=>{Di(),Ri()},cn=()=>{const e=Ie===Ye,n=Se===Ye;if(e||n){const{width:s,height:l}=r.getBoundingClientRect();e&&co(s,!0),n&&io(l,!0),no(),st(),Z=!0}v.refresh()},Fa=async e=>{r.style.userSelect="none";const n=window.devicePixelRatio,s=W,l=Ie,h=Se,E=a.canvas.width/n,w=a.canvas.height/n,p=_,g=I,M=e?.scale||1,fe=Array.isArray(W)?W.map(ln=>ln*M):W*M,Ee=Te*M,Io=Me*M;ao(fe),lo(Ee),so(Io),So(e?.pixelAligned||_),Ao(e?.antiAliasing||I),a.resize(Ie,Se),a.refresh(),await new Promise(ln=>{o.subscribe("draw",ln,1),Pn()});const Ft=r.getContext("2d").getImageData(0,0,r.width,r.height);return a.resize(E,w),a.refresh(),ao(s),lo(l),so(h),So(p),Ao(g),await new Promise(ln=>{o.subscribe("draw",ln,1),Pn()}),r.style.userSelect=null,Ft},ka=e=>e===void 0?r.getContext("2d").getImageData(0,0,r.width,r.height):Fa(e),za=()=>{no(),bi(),st(),Be=dn(a.regl,{color:x,width:T,is2d:!0}),He=dn(a.regl,{color:eo(te,ae,ce),opacity:J===null?null:J[0],width:se[0],is2d:!0}),Ht=dn(a.regl,{color:ne,width:1,is2d:!0}),Wt=dn(a.regl,{color:ne,width:1,is2d:!0}),A=dn(a.regl,{color:bt,width:Ke,is2d:!0}),ro(),r.addEventListener("wheel",Oi),Zt=a.regl.buffer(),Yn=a.regl.buffer(),jt=a.regl.buffer({usage:"dynamic",type:"float",length:xc*2}),it=to(),We=Qn();const e=Ci({backgroundImage:f,width:Ie,height:Se,actionKeyMap:ue});Ii(),Ti(),window.addEventListener("keyup",vi,!1),window.addEventListener("blur",ci,!1),window.addEventListener("mouseup",Jn,!1),window.addEventListener("mousemove",ai,!1),r.addEventListener("mousedown",ii,!1),r.addEventListener("mouseenter",Li,!1),r.addEventListener("mouseleave",_i,!1),r.addEventListener("click",si,!1),r.addEventListener("dblclick",ri,!1),"ResizeObserver"in window?(yn=new ResizeObserver(cn),yn.observe(r)):(window.addEventListener("resize",cn),window.addEventListener("orientationchange",cn)),e.then(()=>{o.publish("init")})},$a=a.onFrame(()=>{if(An=v.tick(),!((pe||Nt)&&(Z||xt)))return;xt&&!_r(Zn,jn)&&Or(),An&&(Gt=Xe(1,1),Yt=Xe(-1,-1),Ae==="density"&&Cr()),a.render(()=>{const n=r.width/a.canvas.width,s=r.height/a.canvas.height;ps(n,s),f?._reglType&&mr(),Ve.length>2&&hr(),xt||He.draw({projection:ho(),model:yo(),view:go()});const l=mi();pe&&l>0&&ar(),!D&&(Pe||Et)&&gr(),le>=0&&cr(),O.length>0&&fr(),A.draw({projection:ho(),model:yo(),view:go()}),Be.draw({projection:ho(),model:yo(),view:go()})},r);const e={view:v.view,isViewChanged:An,camera:v,xScale:he,yScale:re};An&&(st(),Hn?Hn=!1:o.publish("view",e)),Z=!1,Et=!1,o.publish("drawing",e,{async:!1}),o.publish("draw",e)}),Pn=()=>{Z=!0},Ua=()=>{pe=!1,Nt=!1,qe=!0,$a(),window.removeEventListener("keyup",vi,!1),window.removeEventListener("blur",ci,!1),window.removeEventListener("mouseup",Jn,!1),window.removeEventListener("mousemove",ai,!1),r.removeEventListener("mousedown",ii,!1),r.removeEventListener("mouseenter",Li,!1),r.removeEventListener("mouseleave",_i,!1),r.removeEventListener("click",si,!1),r.removeEventListener("dblclick",ri,!1),r.removeEventListener("wheel",Oi,!1),yn?yn.disconnect():(window.removeEventListener("resize",cn),window.removeEventListener("orientationchange",cn)),r=void 0,v.dispose(),v=void 0,Be.destroy(),Q.destroy(),He.destroy(),Ht.destroy(),Wt.destroy(),it&&it.destroy(),We&&We.destroy(),t.renderer||a.isDestroyed||a.destroy(),o.publish("destroy"),o.clear()};return za(),{get isSupported(){return a.isSupported},clear:an(Ba),clearPoints:an(Di),clearPointConnections:an(Ma),clearAnnotations:an(Ri),createTextureFromUrl:(e,n=qo)=>Wi(a.regl,e,n),deselect:Tn,destroy:Ua,draw:Dr,drawAnnotations:wi,filter:Ei,get:Da,getScreenPosition:Br,hover:nn,lassoSelect:ms,redraw:Pn,refresh:a.refresh,reset:an(Na),select:Bt,set:Ci,export:ka,subscribe:o.subscribe,unfilter:Pr,unsubscribe:o.unsubscribe,view:Ra,zoomToLocation:Si,zoomToArea:Ai,zoomToPoints:Nr,zoomToOrigin:Mr}};class ji extends dc{constructor(o,i){super({...i,view:new Xd(o,{props:i.props,viewProps:i.viewProps})})}}class Xd{constructor(o,{props:i,viewProps:m}){this.element=o.createElement("div"),this.element.classList.add("tp-link"),m.bindClassModifiers(this.element);const d=o.createElement("a");m.bindDisabled(d);function a(f){d.href=f??""}function I(f){d.textContent=f??""}function _(f){f?(d.classList.add("active"),d.removeAttribute("href"),d.removeAttribute("target")):(d.classList.remove("active"),a(i.get("link")),B(i.get("newPage")))}function B(f){f?d.target="_blank":d.removeAttribute("target")}bn(i.value("link"),a),bn(i.value("label"),I),bn(i.value("active"),_),bn(i.value("newPage"),B),this.element.appendChild(d),this.linkElement=d}}class Jd extends uc{get label(){return this.controller.props.get("label")??""}set label(o){this.controller.props.set("label",o)}get link(){return this.controller.props.get("link")}set link(o){this.controller.props.set("link",o)}get active(){return this.controller.props.get("active")}set active(o){this.controller.props.set("active",!!o)}get newPage(){return this.controller.props.get("newPage")}set newPage(o){this.controller.props.set("newPage",!!o)}}const Qd=ac({id:"link",type:"blade",accept(t){const o=lc(t,i=>({view:i.required.constant("link"),link:i.required.string,label:i.required.string,active:i.optional.boolean,newPage:i.optional.boolean}));return o?{params:o}:null},controller(t){return new ji(t.document,{blade:t.blade,props:cc.fromObject({label:t.params.label,link:t.params.link,active:t.params.active,newPage:t.params.newPage}),viewProps:t.viewProps})},api(t){return t.controller instanceof ji?new Jd(t.controller):null}});function eu(t,o="file.txt"){const i=document.createElement("a");i.href=URL.createObjectURL(t),i.download=o,document.body.appendChild(i),i.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})),document.body.removeChild(i)}function tu(t){const o=new Image;o.onload=()=>{t.get("canvas").toBlob(i=>{eu(i,"regl-scatterplot.png")})},o.src=t.get("canvas").toDataURL()}function nu(){const t=document.querySelector("#modal"),o=document.querySelector("#modal-text");t.style.display="none",o.textContent=""}function ou(t,o,i){const m=document.querySelector("#modal");m.style.display="flex";const d=document.querySelector("#modal-text");d.style.color=o?"#cc79A7":"#bbb",d.textContent=t;const a=document.querySelector("#modal-close");i?(a.style.display="block",a.style.background=o?"#cc79A7":"#bbb",a.addEventListener("click",nu,{once:!0})):a.style.display="none"}function cu(t){t.isSupported||ou("Your browser does not support all necessary WebGL features. The scatter plot might not render properly.",!0,!0)}const iu={numPoints:1e5,pointSize:2,opacity:.33,opacityByDensity:!1,lassoInit:"longPress",lassoType:"freeform",lassoBrushSize:24},Je=(t,o)=>{if(Array.isArray(t))for(const i of t)i.set(o);else t.set(o)};function lu({scatterplot:t,setNumPoints:o,setPointSize:i,setOpacity:m,opacityChangesDisabled:d}){let a=!1;const I=Array.isArray(t)?t[0]:t,_={...iu,numPoints:0,pointSize:Array.isArray(I.get("pointSize"))?I.get("pointSize")[0]:I.get("pointSize"),opacity:I.get("opacity"),opacityByDensity:I.get("opacityBy")==="density",lassoType:I.get("lassoType"),lassoBrushSize:I.get("lassoBrushSize")},B={..._},f=new fc({title:"Details",container:document.getElementById("controls")});f.registerPlugin({id:"link",plugins:[Qd]});const r=f.addFolder({title:"Settings"}),u=r.addBinding(_,"numPoints",{label:"Num Points",min:1e3,step:1e3,max:2e6});u.disabled=!0,o&&u.on("change",({last:z,value:$})=>{a&&z&&o($)});const c=r.addBinding(_,"pointSize",{label:"Point Size",min:1,max:32,step:1});c.disabled=Array.isArray(I.get("pointSize")),c.on("change",({value:z})=>{i?i(z):Je(t,{pointSize:z})});const y=r.addBinding(_,"opacity",{label:"Opacity",min:.01,max:1,step:.01});y.disabled=_.opacityByDensity||!!d,y.on("change",({value:z})=>{m?m(z):Je(t,{opacity:z})});const x=r.addBinding(_,"opacityByDensity",{label:"Dynamic Opacity"});x.disabled=!!d,x.on("change",({value:z})=>{Je(t,{opacityBy:z?"density":null}),y.disabled=z}),r.addBinding(_,"lassoInit",{label:"Lasso Init",options:{"On Long Press":"longPress","Via Click Initiator":"clickInitiator"}}).on("change",({value:z})=>{switch(z){case"longPress":{Je(t,{lassoInitiator:!1,lassoOnLongPress:!0});break}case"clickInitiator":{Je(t,{lassoInitiator:!0,lassoOnLongPress:!1});break}}}),r.addBinding(_,"lassoType",{label:"Lasso Type",options:{Freeform:"freeform",Brush:"brush",Rectangle:"rectangle"}}).on("change",({value:z})=>{switch(z){case"freeform":{Je(t,{lassoType:"freeform"});break}case"brush":{Je(t,{lassoType:"brush"});break}case"rectangle":{Je(t,{lassoType:"rectangle"});break}}S.hidden=z!=="brush"});const S=r.addBinding(_,"lassoBrushSize",{label:"Brush Size",min:1,max:256,step:1});S.hidden=_.lassoType!=="brush",S.on("change",({value:z})=>{Je(t,{lassoBrushSize:z})}),r.addButton({title:"Reset"}).on("click",()=>{for(const[z,$]of Object.entries(B))_[z]=$;f.refresh()});const b=f.addFolder({title:"Examples"}),R=window.location.pathname.slice(1);b.addBlade({view:"link",label:"Color Encoding",link:"index.html",active:R===""||R==="index.html"}),b.addBlade({view:"link",label:"Size & Opacity Encoding",link:"size-encoding.html",active:R==="size-encoding.html"}),b.addBlade({view:"link",label:"Dynamic Opacity",link:"dynamic-opacity.html",active:R==="dynamic-opacity.html"}),b.addBlade({view:"link",label:"Axes",link:"axes.html",active:R==="axes.html"}),b.addBlade({view:"link",label:"Text Labels",link:"text-labels.html",active:R==="text-labels.html"}),b.addBlade({view:"link",label:"Annotations",link:"annotations.html",active:R==="annotations.html"}),b.addBlade({view:"link",label:"Programmatic Lasso",link:"programmatic-lasso.html",active:R==="programmatic-lasso.html"}),b.addBlade({view:"link",label:"Multiple Instances",link:"multiple-instances.html",active:R==="multiple-instances.html"}),b.addBlade({view:"link",label:"Transition",link:"transition.html",active:R==="transition.html"}),b.addBlade({view:"link",label:"Point Connections",link:"connected-points.html",active:R==="connected-points.html"}),b.addBlade({view:"link",label:"Point Connections by Line Segments",link:"connected-points-by-segments.html",active:R==="connected-points-by-segments.html"}),b.addBlade({view:"link",label:"Background Image",link:"texture-background.html",active:R==="texture-background.html"}),b.addBlade({view:"link",label:"Performance Mode (20M Points)",link:"performance-mode.html",active:R==="performance-mode.html"}),f.addFolder({title:"Info",expanded:!1}).addBlade({view:"text",label:"version",parse:z=>String(z),value:I.get("version"),disabled:!0}),f.addButton({title:"Download as PNG"}).on("click",()=>{tu(t)}),f.addButton({title:"Source Code"}).on("click",()=>{window.open("https://github.com/flekschas/regl-scatterplot","_blank").focus()}),I.subscribe("draw",()=>{_.numPoints=I.get("points").length,B.numPoints=_.numPoints,o&&(u.disabled=!1),f.refresh(),a=!0},1)}export{cu as a,lu as b,au as c,ou as d,nu as e,jd as f,tu as s};
diff --git a/assets/multiple-instances-DSFad-2K.js b/assets/multiple-instances-DSFad-2K.js
new file mode 100644
index 00000000..3bac6a40
--- /dev/null
+++ b/assets/multiple-instances-DSFad-2K.js
@@ -0,0 +1,4 @@
+import{d as m,f as S,c as b,b as C,e as v}from"./menu-CKBxhbUC.js";import{t as E}from"./apache-arrow-Bq3lZMkH.js";import"./vendor-DRFCw67i.js";const u=2,F=2,w=3,I=.66,A=["T-shirt/top","Trouser","Pullover","Dress","Coat","Sandal","Shirt","Sneaker","Bag","Ankle boot"],p=["#FFFF00","#1CE6FF","#FF34FF","#FF4A46","#008941","#006FA6","#A30059","#FFDBE5","#7A4900","#0000A6"],N=fetch("https://storage.googleapis.com/flekschas/regl-scatterplot/fashion-mnist-embeddings.arrow");m("Loading...");const k=document.querySelector("#footer");k.classList.remove("hidden");const M=document.querySelector("#info-content");M.innerHTML=`
+Fashion MNIST embedding using four different techniques: PCA, t-SNE, UMAP, and a convolutional autoencoder.
+ Select a point so see the corresponding image.
+`;const l=document.querySelector("#parent-wrapper"),s=document.createElement("div");s.id="note";s.style.opacity=0;l.appendChild(s);const L=(t,e)=>{s.style.opacity=1,s.style.background=e,s.textContent=t},T=()=>{s.style.opacity=0},a=document.createElement("div");a.id="center-note";a.style.opacity=0;const i=document.createElement("div");i.style.width="56px";i.style.height="56px";i.style.backgroundColor="black";i.style.backgroundSize="cover";i.style.backgroundRepeat="no-repeat";a.appendChild(i);l.appendChild(a);const O=(t,e)=>String(t).padStart(e,"0"),z=(t,e)=>{const n=new Image,r=`https://storage.googleapis.com/flekschas/regl-scatterplot/fashion-mnist-images/${O(t,5)}.png`;n.onload=()=>{a.style.opacity=1,a.style.transform="translate(-50%, -50%) scale(1)",i.style.backgroundImage=`url("${r}")`,a.style.background=p[e]},n.src=r},_=()=>{a.style.opacity=0,a.style.transform="translate(-50%, -50%) scale(0)"};l.style.display="grid";l.style.gridTemplateColumns=`repeat(${u}, minmax(0, 1fr))`;l.style.gridTemplateRows="repeat(2, minmax(0, 1fr))";l.style.gap="1rem";const g=document.querySelector("#canvas"),h=document.querySelector("#canvas-wrapper");h.style.position="relative";const y=[g];for(let t=0;tb({renderer:f,canvas:t,pointSize:w,opacity:I,lassoOnLongPress:!0}));console.log(`Scatterplot v${c[0].get("version")}`);C({scatterplot:c});const q=(t,e,n)=>{c.filter(r=>r!==t).forEach(r=>{r.select(e,{preventEvent:!0})}),c.forEach(r=>{r.zoomToPoints(e,{padding:.2,transition:!0,transitionDuration:1500})});const o=e[Math.floor(Math.random()*(e.length-1))];z(o,n[o])},x=t=>{c.filter(e=>e!==t).forEach(e=>{e.deselect({preventEvent:!0})}),c.forEach(e=>{e.zoomToOrigin({transition:!0,transitionDuration:1500})}),_()};N.then(t=>E(t)).then(t=>{v();const e=t.data[0].children.map(o=>o.values),n=e[e.length-1];c.forEach((o,r)=>{o.draw({x:e[r*2],y:e[r*2+1],z:n}),o.set({colorBy:"z",pointColor:p}),o.subscribe("pointover",d=>{L(A[n[d]],p[n[d]])}),o.subscribe("pointout",T),o.subscribe("select",({points:d})=>q(o,d,n)),o.subscribe("deselect",()=>x(o))})}).catch(t=>{m("Could not load embedding... Damn...",!0),console.error(t)});
diff --git a/assets/performance-mode-9wJvbjTm.js b/assets/performance-mode-9wJvbjTm.js
new file mode 100644
index 00000000..0f04ddfb
--- /dev/null
+++ b/assets/performance-mode-9wJvbjTm.js
@@ -0,0 +1,4 @@
+import{c as $,a as T,s as V,b as A}from"./menu-CKBxhbUC.js";import{f as D}from"./vendor-DRFCw67i.js";const B=function(){self.onmessage=function(p){const c=p.data,d=10;try{let a=[];const u=2/d,w=c/d**2;for(let m=0;mr[0]-h[0]||r[1]-h[1]))}self.postMessage({points:a})}catch(a){self.postMessage({error:a})}}},E=document.querySelector("#modal"),b=document.querySelector("#modal span"),W=document.querySelector("#canvas"),v=document.querySelector("#num-points"),k=document.querySelector("#num-points-value"),q=document.querySelector("#point-size"),j=document.querySelector("#point-size-value"),H=document.querySelector("#opacity"),F=document.querySelector("#opacity-value"),L=document.querySelector("#click-lasso-initiator"),G=document.querySelector("#reset"),N=document.querySelector("#export"),x=document.querySelector("#example-performance-mode");x.setAttribute("class","active");x.removeAttribute("href");let y=[],n=2e7,s=.25,l=.33,i=[];const O=10,R=2,M=D(B),X=e=>new Promise((o,p)=>{M.onmessage=c=>{c.data.error?p(c.data.error):o(c.data.points)},M.postMessage(e)}),Y=e=>{E.style.display="flex",b.textContent=e},J=()=>{E.style.display="none",b.textContent=""},K=({points:e})=>{if(console.log("Selected:",e),i=e,i.length===1){const o=y[i[0]];console.log(`X: ${o[0]}
+Y: ${o[1]}
+Category: ${o[2]}
+Value: ${o[3]}`)}},Q=()=>{console.log("Deselected:",i),i=[]},t=$({canvas:W,lassoMinDelay:O,lassoMinDist:R,pointSize:s,showReticle:!0,performanceMode:!0,lassoInitiator:!0});T(t);N.addEventListener("click",()=>V(t));console.log(`Scatterplot v${t.get("version")}`);t.subscribe("select",K);t.subscribe("deselect",Q);const S=e=>{Y(`Hang tight. Generating ${(n/1e6).toFixed(1)} million points...`),n=e,v.value=n,k.innerHTML=n,X(n).then(o=>{y=o,t.draw(y),J()})};A({scatterplot:t,setNumPoints:S});const U=e=>{k.innerHTML=`${+e.target.value} release to redraw `};v.addEventListener("input",U);const Z=e=>S(+e.target.value);v.addEventListener("change",Z);const P=e=>{s=e,q.value=s,j.innerHTML=s,t.set({pointSize:s})},_=e=>P(+e.target.value);q.addEventListener("input",_);const I=e=>{l=e,H.value=l,F.innerHTML=l,t.set({opacity:l})},ee=e=>I(+e.target.value);H.addEventListener("input",ee);const te=e=>{t.set({lassoInitiator:e.target.checked})};L.addEventListener("change",te);L.checked=t.get("lassoInitiator");const oe=()=>{t.reset()};G.addEventListener("click",oe);const ne=["#002072","#162b79","#233680","#2e4186","#394d8d","#425894","#4b649a","#5570a1","#5e7ca7","#6789ae","#7195b4","#7ba2ba","#85aec0","#90bbc6","#9cc7cc","#a9d4d2","#b8e0d7","#c8ecdc","#ddf7df","#ffffe0"];t.set({colorBy:"value",pointColor:ne});P(s);I(l);S(n);
diff --git a/assets/programmatic-lasso-jbmzmB02.js b/assets/programmatic-lasso-jbmzmB02.js
new file mode 100644
index 00000000..adb31b88
--- /dev/null
+++ b/assets/programmatic-lasso-jbmzmB02.js
@@ -0,0 +1,23 @@
+import{c as z,a as A,b as E}from"./menu-CKBxhbUC.js";import{l as C,a as I,b as P,s as $}from"./d3-IoKfXBi0.js";import"./vendor-DRFCw67i.js";const f=document.querySelector("#parent-wrapper"),x=document.querySelector("#canvas-wrapper"),B=document.querySelector("#canvas"),s=document.createElement("div");s.style.cssText=`
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 6px;
+ max-width: 400px;
+ max-height: calc(100vh - 20px);
+ overflow-y: auto;
+ z-index: 1000;
+`;f.appendChild(s);const L=[0,100],D=[0,100],w=C().domain(L),M=C().domain(D),p=I(w),u=P(M),c=$(f).append("svg"),m=c.append("g"),y=c.append("g"),q=20,H=40;c.node().style.position="absolute";c.node().style.top=0;c.node().style.left=0;c.node().style.width="100%";c.node().style.height="100%";c.node().style.pointerEvents="none";x.style.right=`${H}px`;x.style.bottom=`${q}px`;let{width:h,height:g}=x.getBoundingClientRect();m.attr("transform",`translate(0, ${g})`).call(p);y.attr("transform",`translate(${h}, 0)`).call(u);p.tickSizeInner(-g);u.tickSizeInner(-h);let v=[],N=5e3,T=4,W=.66;const j=({points:n})=>{console.log("Selected:",n.length,"points")},F=()=>{console.log("Deselected")},e=z({canvas:B,pointSize:T,opacity:W,xScale:w,yScale:M,showReticle:!0,lassoInitiator:!0,pointColor:[.33,.5,1,1],pointColorActive:[1,.5,0,1]});A(e);console.log(`Scatterplot v${e.get("version")}`);e.subscribe("select",j);e.subscribe("deselect",F);e.subscribe("view",n=>{m.call(p.scale(n.xScale)),y.call(u.scale(n.yScale))});e.subscribe("init",()=>{m.call(p.scale(e.get("xScale"))),y.call(u.scale(e.get("yScale")))},1);const R=()=>{({width:h,height:g}=x.getBoundingClientRect()),m.attr("transform",`translate(0, ${g})`).call(p),y.attr("transform",`translate(${h}, 0)`).call(u),p.tickSizeInner(-g),u.tickSizeInner(-h)};window.addEventListener("resize",R);window.addEventListener("orientationchange",R);const G=n=>{const l=[];for(let i=0;i{v=G(n),e.draw(v)};E({scatterplot:e,setNumPoints:k});e.set({colorBy:"category",pointColor:["#3a84cc","#56bf92","#eecb62","#c76526","#d192b7"]});const r=(n,l,i=!1)=>{const t=document.createElement("button");return t.textContent=n,t.style.cssText=`
+ padding: 6px 10px;
+ background: #3a84cc;
+ color: white;
+ border: none;
+ border-radius: 3px;
+ cursor: pointer;
+ font-size: 11px;
+ white-space: nowrap;
+ text-align: center;
+ ${i?"grid-column: 1 / -1;":""}
+ `,t.addEventListener("mouseenter",()=>{t.style.background="#2a6cb0"}),t.addEventListener("mouseleave",()=>{t.style.background="#3a84cc"}),t.addEventListener("click",l),t};s.appendChild(r("△ Bottom-Left",()=>{e.lassoSelect([[10,10],[40,10],[10,40]])}));s.appendChild(r("○ Top-Right",()=>{const d=[];for(let a=0;a<16;a++){const o=a/16*Math.PI*2;d.push([75+Math.cos(o)*20,75+Math.sin(o)*20])}e.lassoSelect(d)}));s.appendChild(r("▭ Center",()=>{e.lassoSelect([[30,30],[70,30],[70,70],[30,70]])}));s.appendChild(r("+ Diagonal (Merge)",()=>{e.lassoSelect([[0,40],[60,100],[70,100],[10,40]],{merge:!0})}));s.appendChild(r("− Center (Remove)",()=>{e.lassoSelect([[40,40],[60,40],[60,60],[40,60]],{remove:!0})}));s.appendChild(r("★ Star",()=>{const a=[];for(let o=0;o<10;o++){const b=o/10*Math.PI*2-Math.PI/2,S=o%2===0?30:15;a.push([50+Math.cos(b)*S,50+Math.sin(b)*S])}e.lassoSelect(a)}));s.appendChild(r("✕ Deselect All",()=>{e.deselect()},!0));k(N);
diff --git a/assets/size-encoding-DoLghy6x.js b/assets/size-encoding-DoLghy6x.js
new file mode 100644
index 00000000..0a2521e8
--- /dev/null
+++ b/assets/size-encoding-DoLghy6x.js
@@ -0,0 +1,4 @@
+import{c as u,a as M,b as S}from"./menu-CKBxhbUC.js";import{r as l,c as w}from"./d3-IoKfXBi0.js";import"./vendor-DRFCw67i.js";const v=document.querySelector("#canvas");let r=[],A=1e5,m=2,p=1,a=[];const b=10,z=2,$=!0,B=[1,1,.878431373,.33],C=({points:t})=>{if(console.log("Selected:",t),a=t,a.length===1){const e=r[a[0]];console.log(`X: ${e[0]}
+Y: ${e[1]}
+Category: ${e[2]}
+Value: ${e[3]}`)}},I=()=>{console.log("Deselected:",a),a=[]},o=u({canvas:v,lassoMinDelay:b,lassoMinDist:z,pointSize:m,opacity:p,showReticle:$,reticleColor:B,lassoInitiator:!0,opacityInactiveScale:.66});M(o);console.log(`Scatterplot v${o.get("version")}`);o.subscribe("select",C);o.subscribe("deselect",I);const P=l(2),R=l(4),x=l(5),D=t=>{const e=[...new Array(Math.round(t*2/12)).fill().map(()=>[-1+Math.random()*2*1/3,-1+Math.random()*2,0,P()]),...new Array(Math.round(t*4/12)).fill().map(()=>[-.33333333333333337+Math.random()*2*1/3,-1+Math.random()*2,1,R()]),...new Array(Math.round(t*6/12)).fill().map(()=>[.33333333333333326+Math.random()*2*1/3,-1+Math.random()*2,2,x()])],[n,s]=e.reduce(([c,f],i)=>[Math.min(c,i[3]),Math.max(f,i[3])],[1/0,-1/0]),h=s-n;return e.forEach(c=>{c[3]=(c[3]-n)/h}),e},d=t=>{r=D(t),o.draw(r)},V=t=>{const e=w().domain([1,10]).range([t,t*10]);return Array.from({length:100},(n,s)=>e(1+s/99*9))},y=t=>{o.set({pointSize:V(t)})},E=t=>Array.from({length:10},(e,n)=>(n+1)/10*t),g=t=>{o.set({opacity:E(t)})};S({scatterplot:o,setNumPoints:d,setPointSize:y,setOpacity:g});o.set({colorBy:"category",pointColor:["#ff80cb","#57c7ff","#eee462"],sizeBy:"w",opacityBy:"w"});y(m);g(p);d(A);
diff --git a/assets/text-labels-CHxXQtMx.js b/assets/text-labels-CHxXQtMx.js
new file mode 100644
index 00000000..8c78b67d
--- /dev/null
+++ b/assets/text-labels-CHxXQtMx.js
@@ -0,0 +1,4 @@
+import{c as b,a as P,b as R}from"./menu-CKBxhbUC.js";import{l as h,c as C}from"./d3-IoKfXBi0.js";import"./vendor-DRFCw67i.js";const d=document.querySelector("#canvas"),p=document.querySelector("#canvas-wrapper"),g=document.createElement("div");g.id="note";g.textContent="Zoom in to see labels!";p.appendChild(g);const e=document.createElement("canvas");e.id="#text-overlay";e.style.position="absolute";e.style.top=0;e.style.right=0;e.style.bottom=0;e.style.left=0;e.style.pointerEvents="none";p.appendChild(e);const y=()=>{const{width:t,height:o}=p.getBoundingClientRect();e.width=t*window.devicePixelRatio,e.height=o*window.devicePixelRatio,e.style.width=`${t}px`,e.style.height=`${o}px`};y();window.addEventListener("resize",y);const m=12,s=e.getContext("2d");s.font=`${m*window.devicePixelRatio}px sans-serif`;s.textAlign="center";let r=[],$=1e4,w=4,u=1,a=[];const z=200,E=10,M=2,O=!0,A=[1,1,.878431373,.33],n=b({canvas:d,lassoMinDelay:E,lassoMinDist:M,pointSize:w,opacity:u,showReticle:O,reticleColor:A,xScale:h().domain([-1,1]),yScale:h().domain([-1,1]),pointColor:"#fff",opacityBy:"density",lassoInitiator:!0});P(n);console.log(`Scatterplot v${n.get("version")}`);n.subscribe("select",({points:t})=>{if(console.log("Selected:",t),a=t,a.length===1){const o=r[a[0]];console.log(`X: ${o[0]}
+Y: ${o[1]}
+Category: ${o[2]}
+Value: ${o[3]}`)}});n.subscribe("deselect",()=>{a=[]});const L=(t,o,i)=>{s.clearRect(0,0,e.width,e.height),s.fillStyle="rgb(255, 255, 255)";const l=window.devicePixelRatio;for(let c=0;c{s.clearRect(0,0,d.width,d.height)};n.subscribe("drawing",({xScale:t,yScale:o})=>{const i=n.get("pointsInView");i.length<=z?L(i,t,o):q()});const B=t=>Array.from({length:t},()=>[-1+Math.random()*2,-1+Math.random()*2]),v=t=>{r=B(t),n.draw(r)},D=t=>{const o=C().domain([1,10]).range([t,t*10]);return Array.from({length:100},(i,l)=>o(1+l/99*9))},x=t=>{n.set({pointSize:D(t)})},T=t=>Array.from({length:10},(o,i)=>(i+1)/10*t),_=t=>{n.set({opacity:T(t)})};R({scatterplot:n,setNumPoints:v,setPointSize:x});x(w);_(u);v($);
diff --git a/assets/texture-background-e5Fn1Ihg.js b/assets/texture-background-e5Fn1Ihg.js
new file mode 100644
index 00000000..d0b1199e
--- /dev/null
+++ b/assets/texture-background-e5Fn1Ihg.js
@@ -0,0 +1,4 @@
+import{c as l,a as r,b as i}from"./menu-CKBxhbUC.js";import"./vendor-DRFCw67i.js";const s=document.querySelector("#canvas"),{width:p,height:d}=s.getBoundingClientRect();let a=[],m=1e5,h=3,u=1,o=[];const g=({points:e})=>{if(console.log("Selected:",e),o=e,o.length===1){const n=a[o[0]];console.log(`X: ${n[0]}
+Y: ${n[1]}
+Category: ${n[2]}
+Value: ${n[3]}`)}},M=()=>{console.log("Deselected:",o),o=[]},t=l({canvas:s,pointSize:h,opacity:u,showReticle:!0,backgroundImage:`https://picsum.photos/${Math.min(640,p)}/${Math.min(640,d)}/?random`,lassoInitiator:!0});r(t);console.log(`Scatterplot v${t.get("version")}`);t.subscribe("select",g);t.subscribe("deselect",M);const $=e=>new Array(e).fill().map(()=>[-1+Math.random()*2,-1+Math.random()*2,Math.round(Math.random()),Math.random()]),c=e=>{a=$(e),t.draw(a)};i({scatterplot:t,setNumPoints:c});t.set({colorBy:"category",pointColor:["#3a78aa","#aa3a99"]});c(m);
diff --git a/assets/transition-B9gcaZDL.js b/assets/transition-B9gcaZDL.js
new file mode 100644
index 00000000..3d23517a
--- /dev/null
+++ b/assets/transition-B9gcaZDL.js
@@ -0,0 +1,3 @@
+import{d as p,c as h,a as u,b as g,e as F}from"./menu-CKBxhbUC.js";import{t as d}from"./apache-arrow-Bq3lZMkH.js";import"./vendor-DRFCw67i.js";const m=["#FFFF00","#1CFFD9","#FF34FF","#FF4A46","#008941","#1966FF","#C00069","#FFDBE5","#FF9900","#8148D5"],y=fetch("https://storage.googleapis.com/flekschas/regl-scatterplot/cities.arrow");p("Loading...");const w=document.querySelector("#footer");w.classList.remove("hidden");const f=document.querySelector("#info-content");f.innerHTML=`
+GeoNames – Cities Dataset visualized in three: by the cities' geographic location, by the total population across contintents, and by the citie's latitude distribution.
+`;const C=document.querySelector("#canvas");let S=1.5;const e=h({canvas:C,pointSize:S,lassoOnLongPress:!0});u(e);console.log(`Scatterplot v${e.get("version")}`);g({scatterplot:e,opacityChangesDisabled:!0});y.then(a=>d(a)).then(a=>{F();const o=a.data[0].children.map(t=>t.values),n=o[o.length-2],r=o[o.length-1],s=new Float32Array(n.length);for(let t=0;t.33+l/9*.33)});let i=0;const c=()=>{i++;const t=i%3*2;e.draw({x:o[t],y:o[t+1],z:r,w:[n,s,s][i%3]},{transition:!0,transitionDuration:750,transitionEasing:"quadInOut"}).then(()=>{setTimeout(c,2500)})};setTimeout(c,2500)});
diff --git a/assets/vendor-DRFCw67i.js b/assets/vendor-DRFCw67i.js
new file mode 100644
index 00000000..27b56e31
--- /dev/null
+++ b/assets/vendor-DRFCw67i.js
@@ -0,0 +1,91 @@
+const j1=r=>r*r*r,U1=r=>r<.5?4*r*r*r:(r-1)*(2*r-2)*(2*r-2)+1,z1=r=>--r*r*r+1,H1=r=>r,K1=r=>r*r,q1=r=>r<.5?2*r*r:-1+(4-2*r)*r,X1=r=>r*(2-r),n_=r=>r,Y1=(r,e)=>{if(r===e)return!0;if(r.length!==e.length)return!1;const t=new Set(r),n=new Set(e);return t.size!==n.size?!1:e.every(i=>t.has(i))},W1=r=>Math.sqrt(r.reduce((e,t)=>e+t**2,0)),Z1=r=>r.reduce((e,t)=>t>e?t:e,Number.NEGATIVE_INFINITY),Q1=(r,e=n_)=>{const t=[];for(let n=0;n{const t=[];return r.forEach(n=>{t[n]=!0}),e.forEach(n=>{t[n]=!0}),t.reduce((n,i,s)=>(i&&n.push(s),n),[])},Nh=(r,...e)=>(e.forEach(t=>{const n=Object.keys(t).reduce((i,s)=>(i[s]=Object.getOwnPropertyDescriptor(t,s),i),{});Object.getOwnPropertySymbols(t).forEach(i=>{const s=Object.getOwnPropertyDescriptor(t,i);s?.enumerable&&(n[i]=s)}),Object.defineProperties(r,n)}),r);function eP(...r){return e=>r.reduce((t,n)=>n(t),e)}const tP=r=>e=>Nh({__proto__:{constructor:r}},e),rP=(r,e)=>t=>Nh(t,{get[r](){return e}}),nP=(r,e,t,n)=>Math.sqrt((r-t)**2+(e-n)**2),iP=r=>new Worker(window.URL.createObjectURL(new Blob([`(${r.toString()})()`],{type:"text/javascript"}))),sP=(r=1)=>new Promise(e=>{let t=0;const n=()=>requestAnimationFrame(()=>{t++,t{let n,i=0;t=t===null?e:t;const s=(...y)=>{const x=()=>{i>0&&(r(...y),i=0)};clearTimeout(n),n=setTimeout(x,t)};let o=!1;const l=(...y)=>{o?(i++,s(...y)):(r(...y),s(...y),o=!0,i=0,setTimeout(()=>{o=!1},e))};return l.reset=()=>{o=!1},l.cancel=()=>{clearTimeout(n)},l.now=(...y)=>r(...y),l};var i_=1e-6,Qn=typeof Float32Array<"u"?Float32Array:Array;function nl(){var r=new Qn(16);return Qn!=Float32Array&&(r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[11]=0,r[12]=0,r[13]=0,r[14]=0),r[0]=1,r[5]=1,r[10]=1,r[15]=1,r}function oP(r){var e=new Qn(16);return e[0]=r[0],e[1]=r[1],e[2]=r[2],e[3]=r[3],e[4]=r[4],e[5]=r[5],e[6]=r[6],e[7]=r[7],e[8]=r[8],e[9]=r[9],e[10]=r[10],e[11]=r[11],e[12]=r[12],e[13]=r[13],e[14]=r[14],e[15]=r[15],e}function Id(r,e){var t=e[0],n=e[1],i=e[2],s=e[3],o=e[4],l=e[5],y=e[6],x=e[7],B=e[8],U=e[9],de=e[10],Se=e[11],Ce=e[12],Ie=e[13],Ge=e[14],He=e[15],nt=t*l-n*o,_e=t*y-i*o,we=t*x-s*o,$e=n*y-i*l,Ne=n*x-s*l,Mt=i*x-s*y,Ve=B*Ie-U*Ce,Ut=B*Ge-de*Ce,It=B*He-Se*Ce,Ft=U*Ge-de*Ie,ht=U*He-Se*Ie,_t=de*He-Se*Ge,je=nt*_t-_e*ht+we*Ft+$e*It-Ne*Ut+Mt*Ve;return je?(je=1/je,r[0]=(l*_t-y*ht+x*Ft)*je,r[1]=(i*ht-n*_t-s*Ft)*je,r[2]=(Ie*Mt-Ge*Ne+He*$e)*je,r[3]=(de*Ne-U*Mt-Se*$e)*je,r[4]=(y*It-o*_t-x*Ut)*je,r[5]=(t*_t-i*It+s*Ut)*je,r[6]=(Ge*we-Ce*Mt-He*_e)*je,r[7]=(B*Mt-de*we+Se*_e)*je,r[8]=(o*ht-l*It+x*Ve)*je,r[9]=(n*It-t*ht-s*Ve)*je,r[10]=(Ce*Ne-Ie*we+He*nt)*je,r[11]=(U*we-B*Ne-Se*nt)*je,r[12]=(l*Ut-o*Ft-y*Ve)*je,r[13]=(t*Ft-n*Ut+i*Ve)*je,r[14]=(Ie*_e-Ce*$e-Ge*nt)*je,r[15]=(B*$e-U*_e+de*nt)*je,r):null}function Wn(r,e,t){var n=e[0],i=e[1],s=e[2],o=e[3],l=e[4],y=e[5],x=e[6],B=e[7],U=e[8],de=e[9],Se=e[10],Ce=e[11],Ie=e[12],Ge=e[13],He=e[14],nt=e[15],_e=t[0],we=t[1],$e=t[2],Ne=t[3];return r[0]=_e*n+we*l+$e*U+Ne*Ie,r[1]=_e*i+we*y+$e*de+Ne*Ge,r[2]=_e*s+we*x+$e*Se+Ne*He,r[3]=_e*o+we*B+$e*Ce+Ne*nt,_e=t[4],we=t[5],$e=t[6],Ne=t[7],r[4]=_e*n+we*l+$e*U+Ne*Ie,r[5]=_e*i+we*y+$e*de+Ne*Ge,r[6]=_e*s+we*x+$e*Se+Ne*He,r[7]=_e*o+we*B+$e*Ce+Ne*nt,_e=t[8],we=t[9],$e=t[10],Ne=t[11],r[8]=_e*n+we*l+$e*U+Ne*Ie,r[9]=_e*i+we*y+$e*de+Ne*Ge,r[10]=_e*s+we*x+$e*Se+Ne*He,r[11]=_e*o+we*B+$e*Ce+Ne*nt,_e=t[12],we=t[13],$e=t[14],Ne=t[15],r[12]=_e*n+we*l+$e*U+Ne*Ie,r[13]=_e*i+we*y+$e*de+Ne*Ge,r[14]=_e*s+we*x+$e*Se+Ne*He,r[15]=_e*o+we*B+$e*Ce+Ne*nt,r}function Fd(r,e){return r[0]=1,r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=1,r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[10]=1,r[11]=0,r[12]=e[0],r[13]=e[1],r[14]=e[2],r[15]=1,r}function s_(r,e){return r[0]=e[0],r[1]=0,r[2]=0,r[3]=0,r[4]=0,r[5]=e[1],r[6]=0,r[7]=0,r[8]=0,r[9]=0,r[10]=e[2],r[11]=0,r[12]=0,r[13]=0,r[14]=0,r[15]=1,r}function a_(r,e,t){var n=t[0],i=t[1],s=t[2],o=Math.sqrt(n*n+i*i+s*s),l,y,x;return o{const o=new Float32Array(16),l=new Float32Array(16),y=new Float32Array(16);let x=nl(),B=[...n.slice(0,2),0,1];const U=Array.isArray(i[0])?[...i[0]]:[...i],de=Array.isArray(i[0])?[...i[1]]:[...i],Se=Array.isArray(s[0])?[...s[0]]:[...s],Ce=Array.isArray(s[0])?[...s[1]]:[...s],Ie=()=>l_(o,x).slice(0,2),Ge=()=>{const Ae=Ie();return Math.min(Ae[0],Ae[1])},He=()=>{const Ae=Ie();return Math.max(Ae[0],Ae[1])},nt=()=>Math.acos(x[0]/He()),_e=()=>[[...U],[...de]],we=()=>[[...Se],[...Ce]],$e=()=>{const Ae=Ie();return[1/Ae[0],1/Ae[1]]},Ne=()=>1/Ge(),Mt=()=>1/He(),Ve=()=>o_(o,x).slice(0,2),Ut=()=>c_(o,B,Id(y,x)).slice(0,2),It=()=>x,Ft=()=>B.slice(0,2),ht=([Ae=0,We=0]=[],Ht=1,$t=0)=>{x=nl(),_t([-Ae,-We]),er($t),je(1/Ht)},_t=([Ae=0,We=0]=[])=>{o[0]=Ae,o[1]=We,o[2]=0;const Ht=Fd(l,o);Wn(x,Ht,x)},je=(Ae,We)=>{const Ht=Array.isArray(Ae);let $t=Ht?Ae[0]:Ae,nr=Ht?Ae[1]:Ae;if($t<=0||nr<=0||$t===1&&nr===1)return;const br=Ie(),Kr=br[0]*$t,Vr=br[1]*nr;if($t=Math.max(U[0],Math.min(Kr,U[1]))/br[0],nr=Math.max(de[0],Math.min(Vr,de[1]))/br[1],$t===1&&nr===1)return;o[0]=$t,o[1]=nr,o[2]=1;const Or=s_(l,o),cn=We?[...We,0]:B,dn=Fd(o,cn);Wn(x,dn,Wn(x,Or,Wn(x,Id(y,dn),x)))},er=Ae=>{const We=nl();a_(We,Ae,[0,0,1]),Wn(x,We,x)},Ar=Ae=>{const We=Array.isArray(Ae[0]);U[0]=We?Ae[0][0]:Ae[0],U[1]=We?Ae[0][1]:Ae[1],de[0]=We?Ae[1][0]:Ae[0],de[1]=We?Ae[1][1]:Ae[1]},zt=Ae=>{const We=Array.isArray(Ae[0]);Se[0]=We?Ae[0][0]:Ae[0],Se[1]=We?Ae[0][1]:Ae[1],Ce[0]=We?Ae[1][0]:Ae[0],Ce[1]=We?Ae[1][1]:Ae[1]},tr=Ae=>{!Ae||Ae.length<16||(x=Ae)},Lr=Ae=>{B=[...Ae.slice(0,2),0,1]},rr=()=>{ht(r,e,t)};return ht(r,e,t),{get translation(){return Ve()},get target(){return Ut()},get scaling(){return Ie()},get minScaling(){return Ge()},get maxScaling(){return He()},get scaleBounds(){return _e()},get translationBounds(){return we()},get distance(){return $e()},get minDistance(){return Ne()},get maxDistance(){return Mt()},get rotation(){return nt()},get view(){return It()},get viewCenter(){return Ft()},lookAt:ht,translate:_t,pan:_t,rotate:er,scale:je,zoom:je,reset:rr,set:(...Ae)=>(console.warn("`set()` is deprecated. Please use `setView()` instead."),tr(...Ae)),setScaleBounds:Ar,setTranslationBounds:zt,setView:tr,setViewCenter:Lr}},f_=["pan","rotate"],$d={alt:"altKey",cmd:"metaKey",ctrl:"ctrlKey",meta:"metaKey",shift:"shiftKey"},lP=(r,{distance:e=1,target:t=[0,0],rotation:n=0,isNdc:i=!0,isFixed:s=!1,isPan:o=!0,isPanInverted:l=[!1,!0],panSpeed:y=1,isRotate:x=!0,rotateSpeed:B=1,defaultMouseDownMoveAction:U="pan",mouseDownMoveModKey:de="alt",isZoom:Se=!0,zoomSpeed:Ce=1,viewCenter:Ie,scaleBounds:Ge,translationBounds:He,onKeyDown:nt=()=>{},onKeyUp:_e=()=>{},onMouseDown:we=()=>{},onMouseUp:$e=()=>{},onMouseMove:Ne=()=>{},onWheel:Mt=()=>{}}={})=>{let Ve=p_(t,e,n,Ie,Ge,He),Ut=0,It=0,Ft=0,ht=0,_t=0,je=0,er=!1,Ar=0,zt=1,tr=1,Lr=1,rr=!1,Ae=!1,We=!1,Ht=U==="pan",$t=o,nr=o,br=l,Kr=l,Vr=Se,Or=Se;const cn=()=>{$t=Array.isArray(o)?!!o[0]:o,nr=Array.isArray(o)?!!o[1]:o,br=Array.isArray(l)?!!l[0]:l,Kr=Array.isArray(l)?!!l[1]:l,Vr=Array.isArray(Se)?!!Se[0]:Se,Or=Array.isArray(Se)?!!Se[1]:Se};cn();const dn=i?ye=>ye/zt*2*Lr:ye=>ye,li=i?ye=>ye/tr*2:ye=>-ye,Ke=i?ye=>(-1+ye/zt*2)*Lr:ye=>ye,qe=i?ye=>1-ye/tr*2:ye=>ye,it=()=>{if(s){const ir=Ae;return Ae=!1,ir}rr=!1;const ye=Ut,Lt=It;if(($t||nr)&&er&&(Ht&&!We||!Ht&&We)){const ir=br?_t-ye:ye-_t,_r=$t?dn(y*ir):0,wr=Kr?je-Lt:Lt-je,wt=nr?li(y*wr):0;(_r!==0||wt!==0)&&(Ve.pan([_r,wt]),rr=!0)}if((Vr||Or)&&Ar){const ir=Ce*Math.exp(Ar/tr),_r=Ke(Ft),wr=qe(ht);Ve.scale([Vr?1/ir:1,Or?1/ir:1],[_r,wr]),rr=!0}if(x&&er&&(Ht&&We||!Ht&&!We)&&Math.abs(_t-ye)+Math.abs(je-Lt)>0){const ir=zt/2,_r=tr/2,wr=_t-ir,wt=_r-je,qr=ye-ir,hn=_r-Lt,In=h_([wr,wt],[qr,hn]),so=wr*hn-qr*wt;Ve.rotate(B*In*Math.sign(so)),rr=!0}Ar=0,_t=ye,je=Lt;const Mn=rr||Ae;return Ae=!1,Mn},st=({defaultMouseDownMoveAction:ye=null,isFixed:Lt=null,isPan:Mn=null,isPanInverted:ir=null,isRotate:_r=null,isZoom:wr=null,panSpeed:wt=null,rotateSpeed:qr=null,zoomSpeed:hn=null,mouseDownMoveModKey:In=null}={})=>{U=ye!==null&&f_.includes(ye)?ye:U,Ht=U==="pan",s=Lt!==null?Lt:s,o=Mn!==null?Mn:o,l=ir!==null?ir:l,x=_r!==null?_r:x,Se=wr!==null?wr:Se,y=+wt>0?wt:y,B=+qr>0?qr:B,Ce=+hn>0?hn:Ce,cn(),de=In!==null&&Object.keys($d).includes(In)?In:de},cr=()=>{const ye=r.getBoundingClientRect();zt=ye.width,tr=ye.height,Lr=zt/tr},at=ye=>{We=!1,_e(ye)},Rn=ye=>{We=ye[$d[de]],nt(ye)},Dn=ye=>{er=!1,$e(ye)},Us=ye=>{er=ye.buttons===1,we(ye)},h=document.createEvent("MouseEvent").offsetX!==void 0?ye=>{Ft=ye.offsetX,ht=ye.offsetY}:ye=>{const Lt=r.getBoundingClientRect();Ft=ye.clientX-Lt.left,ht=ye.clientY-Lt.top},zs=ye=>{Ut=ye.clientX,It=ye.clientY},Hs=ye=>{zs(ye),Ne(ye)},Ks=ye=>{if((Vr||Or)&&!s){ye.preventDefault(),zs(ye),h(ye);const Lt=ye.deltaMode===1?12:1;Ar+=Lt*(ye.deltaY||ye.deltaX||0)}Mt(ye)},io=()=>{Ve=void 0,window.removeEventListener("keydown",Rn),window.removeEventListener("keyup",at),r.removeEventListener("mousedown",Us),window.removeEventListener("mouseup",Dn),window.removeEventListener("mousemove",Hs),r.removeEventListener("wheel",Ks)};window.addEventListener("keydown",Rn,{passive:!0}),window.addEventListener("keyup",at,{passive:!0}),r.addEventListener("mousedown",Us,{passive:!0}),window.addEventListener("mouseup",Dn,{passive:!0}),window.addEventListener("mousemove",Hs,{passive:!0}),r.addEventListener("wheel",Ks,{passive:!1}),Ve.config=st,Ve.dispose=io,Ve.refresh=cr,Ve.tick=it;const St=ye=>function(){ye.apply(null,arguments),Ae=!0};return Ve.lookAt=St(Ve.lookAt),Ve.translate=St(Ve.translate),Ve.pan=St(Ve.pan),Ve.rotate=St(Ve.rotate),Ve.scale=St(Ve.scale),Ve.zoom=St(Ve.zoom),Ve.reset=St(Ve.reset),Ve.set=St(Ve.set),Ve.setScaleBounds=St(Ve.setScaleBounds),Ve.setTranslationBounds=St(Ve.setTranslationBounds),Ve.setView=St(Ve.setView),Ve.setViewCenter=St(Ve.setViewCenter),cr(),Ve};function uP(r,e,t=2){const n=r.length;let i=m_(r,0,n,t,!0);const s=[];if(!i||i.next===i.prev)return s;let o,l,y;if(r.length>80*t){o=r[0],l=r[1];let x=o,B=l;for(let U=t;Ux&&(x=de),Se>B&&(B=Se)}y=Math.max(x-o,B-l),y=y!==0?32767/y:0}return vs(i,s,t,o,l,y,0),s}function m_(r,e,t,n,i){let s;if(i===S_(r,e,t,n)>0)for(let o=e;o=e;o-=n)s=Bd(o/n|0,r[o],r[o+1],s);return s&&Ka(s,s.next)&&(bs(s),s=s.next),s}function ms(r,e){if(!r)return r;e||(e=r);let t=r,n;do if(n=!1,!t.steiner&&(Ka(t,t.next)||At(t.prev,t,t.next)===0)){if(bs(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function vs(r,e,t,n,i,s,o){if(!r)return;!o&&s&&g_(r,n,i,s);let l=r;for(;r.prev!==r.next;){const y=r.prev,x=r.next;if(s?b_(r,n,i,s):v_(r)){e.push(y.i,r.i,x.i),bs(r),r=x.next,l=x.next;continue}if(r=x,r===l){o?o===1?(r=__(ms(r),e),vs(r,e,t,n,i,s,2)):o===2&&w_(r,e,t,n,i,s):vs(ms(r),e,t,n,i,s,1);break}}}function v_(r){const e=r.prev,t=r,n=r.next;if(At(e,t,n)>=0)return!1;const i=e.x,s=t.x,o=n.x,l=e.y,y=t.y,x=n.y,B=Math.min(i,s,o),U=Math.min(l,y,x),de=Math.max(i,s,o),Se=Math.max(l,y,x);let Ce=n.next;for(;Ce!==e;){if(Ce.x>=B&&Ce.x<=de&&Ce.y>=U&&Ce.y<=Se&&fs(i,l,s,y,o,x,Ce.x,Ce.y)&&At(Ce.prev,Ce,Ce.next)>=0)return!1;Ce=Ce.next}return!0}function b_(r,e,t,n){const i=r.prev,s=r,o=r.next;if(At(i,s,o)>=0)return!1;const l=i.x,y=s.x,x=o.x,B=i.y,U=s.y,de=o.y,Se=Math.min(l,y,x),Ce=Math.min(B,U,de),Ie=Math.max(l,y,x),Ge=Math.max(B,U,de),He=Cl(Se,Ce,e,t,n),nt=Cl(Ie,Ge,e,t,n);let _e=r.prevZ,we=r.nextZ;for(;_e&&_e.z>=He&&we&&we.z<=nt;){if(_e.x>=Se&&_e.x<=Ie&&_e.y>=Ce&&_e.y<=Ge&&_e!==i&&_e!==o&&fs(l,B,y,U,x,de,_e.x,_e.y)&&At(_e.prev,_e,_e.next)>=0||(_e=_e.prevZ,we.x>=Se&&we.x<=Ie&&we.y>=Ce&&we.y<=Ge&&we!==i&&we!==o&&fs(l,B,y,U,x,de,we.x,we.y)&&At(we.prev,we,we.next)>=0))return!1;we=we.nextZ}for(;_e&&_e.z>=He;){if(_e.x>=Se&&_e.x<=Ie&&_e.y>=Ce&&_e.y<=Ge&&_e!==i&&_e!==o&&fs(l,B,y,U,x,de,_e.x,_e.y)&&At(_e.prev,_e,_e.next)>=0)return!1;_e=_e.prevZ}for(;we&&we.z<=nt;){if(we.x>=Se&&we.x<=Ie&&we.y>=Ce&&we.y<=Ge&&we!==i&&we!==o&&fs(l,B,y,U,x,de,we.x,we.y)&&At(we.prev,we,we.next)>=0)return!1;we=we.nextZ}return!0}function __(r,e){let t=r;do{const n=t.prev,i=t.next.next;!Ka(n,i)&&Gh(n,t,t.next,i)&&Ma(n,i)&&Ma(i,n)&&(e.push(n.i,t.i,i.i),bs(t),bs(t.next),t=r=i),t=t.next}while(t!==r);return ms(t)}function w_(r,e,t,n,i,s){let o=r;do{let l=o.next.next;for(;l!==o.prev;){if(o.i!==l.i&&C_(o,l)){let y=A_(o,l);o=ms(o,o.next),y=ms(y,y.next),vs(o,e,t,n,i,s,0),vs(y,e,t,n,i,s,0);return}l=l.next}o=o.next}while(o!==r)}function g_(r,e,t,n){let i=r;do i.z===0&&(i.z=Cl(i.x,i.y,e,t,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==r);i.prevZ.nextZ=null,i.prevZ=null,y_(i)}function y_(r){let e,t=1;do{let n=r,i;r=null;let s=null;for(e=0;n;){e++;let o=n,l=0;for(let x=0;x0||y>0&&o;)l!==0&&(y===0||!o||n.z<=o.z)?(i=n,n=n.nextZ,l--):(i=o,o=o.nextZ,y--),s?s.nextZ=i:r=i,i.prevZ=s,s=i;n=o}s.nextZ=null,t*=2}while(e>1);return r}function Cl(r,e,t,n,i){return r=(r-t)*i|0,e=(e-n)*i|0,r=(r|r<<8)&16711935,r=(r|r<<4)&252645135,r=(r|r<<2)&858993459,r=(r|r<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,r|e<<1}function x_(r,e,t,n,i,s,o,l){return(i-o)*(e-l)>=(r-o)*(s-l)&&(r-o)*(n-l)>=(t-o)*(e-l)&&(t-o)*(s-l)>=(i-o)*(n-l)}function fs(r,e,t,n,i,s,o,l){return!(r===o&&e===l)&&x_(r,e,t,n,i,s,o,l)}function C_(r,e){return r.next.i!==e.i&&r.prev.i!==e.i&&!E_(r,e)&&(Ma(r,e)&&Ma(e,r)&&P_(r,e)&&(At(r.prev,r,e.prev)||At(r,e.prev,e))||Ka(r,e)&&At(r.prev,r,r.next)>0&&At(e.prev,e,e.next)>0)}function At(r,e,t){return(e.y-r.y)*(t.x-e.x)-(e.x-r.x)*(t.y-e.y)}function Ka(r,e){return r.x===e.x&&r.y===e.y}function Gh(r,e,t,n){const i=Ea(At(r,e,t)),s=Ea(At(r,e,n)),o=Ea(At(t,n,r)),l=Ea(At(t,n,e));return!!(i!==s&&o!==l||i===0&&Ca(r,t,e)||s===0&&Ca(r,n,e)||o===0&&Ca(t,r,n)||l===0&&Ca(t,e,n))}function Ca(r,e,t){return e.x<=Math.max(r.x,t.x)&&e.x>=Math.min(r.x,t.x)&&e.y<=Math.max(r.y,t.y)&&e.y>=Math.min(r.y,t.y)}function Ea(r){return r>0?1:r<0?-1:0}function E_(r,e){let t=r;do{if(t.i!==r.i&&t.next.i!==r.i&&t.i!==e.i&&t.next.i!==e.i&&Gh(t,t.next,r,e))return!0;t=t.next}while(t!==r);return!1}function Ma(r,e){return At(r.prev,r,r.next)<0?At(r,e,r.next)>=0&&At(r,r.prev,e)>=0:At(r,e,r.prev)<0||At(r,r.next,e)<0}function P_(r,e){let t=r,n=!1;const i=(r.x+e.x)/2,s=(r.y+e.y)/2;do t.y>s!=t.next.y>s&&t.next.y!==t.y&&i<(t.next.x-t.x)*(s-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==r);return n}function A_(r,e){const t=El(r.i,r.x,r.y),n=El(e.i,e.x,e.y),i=r.next,s=e.prev;return r.next=e,e.prev=r,t.next=i,i.prev=t,n.next=t,t.prev=n,s.next=n,n.prev=s,n}function Bd(r,e,t,n){const i=El(r,e,t);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function bs(r){r.next.prev=r.prev,r.prev.next=r.next,r.prevZ&&(r.prevZ.nextZ=r.nextZ),r.nextZ&&(r.nextZ.prevZ=r.prevZ)}function El(r,e,t){return{i:r,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function S_(r,e,t,n){let i=0;for(let s=e,o=t-n;stypeof r=="string",Bl=(r,e)=>T_(r)&&e?r.toLowerCase():r,Uh=(r,e)=>(t,n,i=Number.POSITIVE_INFINITY)=>{const s=Bl(t,e?.caseInsensitive),o=r[s]||[];return o.push({handler:n,times:+i||Number.POSITIVE_INFINITY}),r[s]=o,{event:s,handler:n}},k_=r=>typeof r=="object";function Nl(r,e){function t(n,i){let s,o;k_(n)?(o=n.handler,s=n.event):(s=n,o=i);const l=Bl(s,e?.caseInsensitive),y=r[l];if(!y)return;const x=y.findIndex(B=>B.handler===o);x===-1||x>=y.length||y.splice(x,1)}return t}const L_=r=>!!r,zh=(r,e)=>{const t=Nl(r);return(...n)=>{const[i,s,o]=n,l=Bl(i,e?.caseInsensitive),y=r[l];if(!L_(y))return;const x=[...y];for(const de of x)--de.times<1&&t(l,de.handler);const B=o?.async!==void 0?o.async:e?.async,U=()=>{for(const de of x)de.handler(s)};if(B?setTimeout(U,0):U(),e?.isGlobal&&!o?.isNoGlobalBroadcast)try{jh.postMessage({event:l,news:s})}catch(de){if(de instanceof Error&&de.name==="DataCloneError")console.warn(`Could not broadcast '${l.toString()}' globally. Payload is not clonable.`);else throw de}}};function V_(r){return Object.keys(r)}const Hh=r=>()=>{for(const e of V_(r))delete r[e]},Kh=()=>({}),cP=r=>{const e=!!r?.async,t=!!r?.caseInsensitive,n=r?.stack||Kh();return{publish:zh(n,{async:e,caseInsensitive:t}),subscribe:Uh(n,{caseInsensitive:t}),unsubscribe:Nl(n,{caseInsensitive:t}),clear:Hh(n),stack:n}},ss=Kh(),O_={publish:zh(ss,{isGlobal:!0}),subscribe:Uh(ss),unsubscribe:Nl(ss),clear:Hh(ss),stack:ss};jh.onmessage=({data:{event:r,news:e}})=>O_.publish(r,e,{isNoGlobalBroadcast:!0});const R_=`
+precision mediump float;
+varying vec4 color;
+void main() {
+ gl_FragColor = color;
+}`,D_=`
+uniform mat4 projectionViewModel;
+uniform float aspectRatio;
+
+uniform sampler2D colorTex;
+uniform float colorTexRes;
+uniform float colorTexEps;
+uniform float width;
+uniform float useOpacity;
+uniform float useColorOpacity;
+uniform int miter;
+
+attribute vec3 prevPosition;
+attribute vec3 currPosition;
+attribute vec3 nextPosition;
+attribute float opacity;
+attribute float offsetScale;
+attribute float colorIndex;
+
+varying vec4 color;
+
+void main() {
+ vec2 aspectVec = vec2(aspectRatio, 1.0);
+ vec4 prevProjected = projectionViewModel * vec4(prevPosition, 1.0);
+ vec4 currProjected = projectionViewModel * vec4(currPosition, 1.0);
+ vec4 nextProjected = projectionViewModel * vec4(nextPosition, 1.0);
+
+ // get 2D screen space with W divide and aspect correction
+ vec2 prevScreen = prevProjected.xy / prevProjected.w * aspectVec;
+ vec2 currScreen = currProjected.xy / currProjected.w * aspectVec;
+ vec2 nextScreen = nextProjected.xy / nextProjected.w * aspectVec;
+
+ float len = width;
+
+ // starting point uses (next - current)
+ vec2 dir = vec2(0.0);
+ if (currScreen == prevScreen) {
+ dir = normalize(nextScreen - currScreen);
+ }
+ // ending point uses (current - previous)
+ else if (currScreen == nextScreen) {
+ dir = normalize(currScreen - prevScreen);
+ }
+ // somewhere in middle, needs a join
+ else {
+ // get directions from (C - B) and (B - A)
+ vec2 dirA = normalize((currScreen - prevScreen));
+ if (miter == 1) {
+ vec2 dirB = normalize((nextScreen - currScreen));
+ // now compute the miter join normal and length
+ vec2 tangent = normalize(dirA + dirB);
+ vec2 perp = vec2(-dirA.y, dirA.x);
+ vec2 miter = vec2(-tangent.y, tangent.x);
+ len = width / dot(miter, perp);
+ dir = tangent;
+ } else {
+ dir = dirA;
+ }
+ }
+
+ vec2 normal = vec2(-dir.y, dir.x) * len;
+ normal.x /= aspectRatio;
+ vec4 offset = vec4(normal * offsetScale, 0.0, 0.0);
+ gl_Position = currProjected + offset;
+
+ // Get color from texture
+ float colorRowIndex = floor((colorIndex + colorTexEps) / colorTexRes);
+ vec2 colorTexIndex = vec2(
+ (colorIndex / colorTexRes) - colorRowIndex + colorTexEps,
+ colorRowIndex / colorTexRes + colorTexEps
+ );
+
+ color = texture2D(colorTex, colorTexIndex);
+ color.a = useColorOpacity * color.a + useOpacity * opacity;
+}`,il=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),Yt=Float32Array.BYTES_PER_ELEMENT,M_=r=>r!==void 0&&Number.isFinite(r),sl=r=>r.length>0&&Array.isArray(r[0]),{push:qh,splice:I_}=Array.prototype,F_=(r,e=[])=>{let t=0;for(const n of r){for(let i=0;i{if(!r){console.error("Regl instance is undefined.");return}const Ce=new Float32Array(16);let Ie,Ge,He,nt,_e,we,$e,Ne,Mt,Ve,Ut,It,Ft,ht,_t,je,er,Ar,zt=de?2:3;const tr=()=>+(y.length===Ge||l!==null),Lr=()=>{Ve=r.buffer(),Ut=r.buffer(),It=r.buffer(),_t=r.buffer(),je={prevPosition:{buffer:(()=>Ve),offset:0,stride:Yt*3},currPosition:{buffer:(()=>Ve),offset:Yt*3*2,stride:Yt*3},nextPosition:{buffer:(()=>Ve),offset:Yt*3*4,stride:Yt*3},opacity:{buffer:(()=>Ut),offset:Yt*2,stride:Yt},offsetScale:{buffer:(()=>It),offset:Yt*2,stride:Yt},colorIndex:{buffer:(()=>_t),offset:Yt*2,stride:Yt}},er=r.elements(),Ar=r({attributes:je,depth:{enable:!de},blend:{enable:!0,func:{srcRGB:"src alpha",srcAlpha:"one",dstRGB:"one minus src alpha",dstAlpha:"one minus src alpha"}},uniforms:{projectionViewModel:(Ke,qe)=>{const it=Ke.projection||qe.projection,st=Ke.model||qe.model,cr=Ke.view||qe.view;return Wn(Ce,it,Wn(Ce,cr,st))},aspectRatio:({viewportWidth:Ke,viewportHeight:qe})=>Ke/qe,colorTex:()=>Ft,colorTexRes:()=>ht,colorTexEps:()=>.5/ht,pixelRatio:({pixelRatio:Ke})=>Ke,width:({pixelRatio:Ke,viewportHeight:qe})=>x/qe*Ke,useOpacity:tr,useColorOpacity:()=>+!tr(),miter:+!!U},elements:()=>er,vert:D_,frag:R_})},rr=()=>{Ie===1&&i.length%zt>0&&console.warn(`The length of points (${Ge}) does not match the dimensions (${zt}). Incomplete points are ignored.`),nt=i.flat().slice(0,Ge*zt),de&&(nt=$_(nt,2,3,Se)),s.length!==Ge&&(s=new Array(Ge).fill(0)),B.length!==Ge&&(B=new Array(Ge).fill(1));const Ke=s.slice(),qe=y.length===Ge?y.slice():new Array(Ge).fill(l===null?1:l),it=B.slice();let st=0;for(const cr of He){const at=st+cr-1;wn(nt,at,at,3),wn(nt,st,st,3),wn(Ke,at,at,1),wn(Ke,st,st,1),wn(qe,at,at,1),wn(qe,st,st,1),wn(it,at,at,1),wn(it,st,st,1),st+=cr+2}_e=new Float32Array(Pa(nt,3)),we=Pa(Ke),$e=Pa(qe),Ne=Pa(it,1,-1),Mt=F_(He),Ve({usage:"dynamic",type:"float",length:_e.length*Yt,data:_e}),Ut({usage:"dynamic",type:"float",length:$e.length*Yt,data:$e}),It({usage:"dynamic",type:"float",length:Ne.length*Yt,data:Ne}),_t({usage:"dynamic",type:"float",length:we.length*Yt,data:we}),er({primitive:"triangles",usage:"dynamic",type:Mt.length>2**16?"uint32":"uint16",data:Mt})},Ae=()=>{We(),Lr()},We=()=>{i=[],nt=[],_e=new Float32Array,Ne=[],Mt=[],Ve.destroy(),It.destroy(),er.destroy()},Ht=({projection:Ke,model:qe,view:it}={})=>{Ke&&(e=Ke),qe&&(t=qe),it&&(n=it),i&&i.length>1&&Ar({projection:e,model:t,view:n})},$t=(Ke,qe)=>{const it=qe.flat(2);return it.length===Ge?it:it.length===Ie?He.flatMap((st,cr)=>Array(st).fill(it[cr])):Ke},nr=()=>i,br=(Ke=[],{colorIndices:qe=s,opacities:it=y,widths:st=B,is2d:cr=de}={})=>{i=Ke,de=cr,zt=de?2:3,Ie=sl(i)?i.length:1,He=sl(i)?i.map(at=>Math.floor(at.length/zt)):[Math.floor(i.length/zt)],Ge=He.reduce((at,Rn)=>at+Rn,0),s=$t(s,qe),y=$t(y,it),B=$t(B,st),i&&Ge>1?rr():Ae()},Kr=()=>{const Ke=sl(o)?o:[o];ht=Math.max(2,Math.ceil(Math.sqrt(Ke.length)));const qe=new Uint8Array(ht**2*4);Ke.forEach((it,st)=>{qe[st*4]=Math.min(255,Math.max(0,Math.round(it[0]*255))),qe[st*4+1]=Math.min(255,Math.max(0,Math.round(it[1]*255))),qe[st*4+2]=Math.min(255,Math.max(0,Math.round(it[2]*255))),qe[st*4+3]=Number.isNaN(+it[3])?255:Math.min(255,Math.max(0,Math.round(it[3]*255)))}),Ft=r.texture({data:qe,shape:[ht,ht,4]})},Vr=(Ke,qe=l)=>{o=Ke,l=qe,Ft&&Ft.destroy(),Kr()},Or=()=>({color:o,miter:U,width:x}),cn=({color:Ke,opacity:qe,miter:it,width:st}={})=>{Ke&&Vr(Ke,qe||l),it&&(U=!!it),M_(st)&&(x=st)},dn=()=>({points:Ve,widths:It,opacities:Ut,colorIndices:_t}),li=()=>({points:_e,widths:Ne,opacities:$e,colorIndices:we});return Lr(),Kr(),i&&i.length>1&&br(i),{clear:Ae,destroy:We,draw:Ht,getPoints:nr,setPoints:br,getData:li,getBuffer:dn,getStyle:Or,setStyle:cn}};function B_(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var ka={exports:{}},N_=ka.exports,Nd;function G_(){return Nd||(Nd=1,(function(r,e){(function(t,n){r.exports=n()})(N_,(function(){var t=function(a){return a instanceof Uint8Array||a instanceof Uint16Array||a instanceof Uint32Array||a instanceof Int8Array||a instanceof Int16Array||a instanceof Int32Array||a instanceof Float32Array||a instanceof Float64Array||a instanceof Uint8ClampedArray},n=function(a,c){for(var v=Object.keys(c),V=0;V"u";case"symbol":return typeof a=="symbol"}}function de(a,c,v){U(a,c)||o("invalid parameter type"+y(v)+". expected "+c+", got "+typeof a)}function Se(a,c){a>=0&&(a|0)===a||o("invalid parameter type, ("+a+")"+y(c)+". must be a nonnegative integer")}function Ce(a,c,v){c.indexOf(a)<0&&o("invalid value"+y(v)+". must be one of: "+c)}var Ie=["gl","canvas","container","attributes","pixelRatio","extensions","optionalExtensions","profile","onDone"];function Ge(a){Object.keys(a).forEach(function(c){Ie.indexOf(c)<0&&o('invalid regl constructor argument "'+c+'". must be one of '+Ie)})}function He(a,c){for(a=a+"";a.length0&&c.push(new we("unknown",0,v))}}),c}function Ut(a,c){c.forEach(function(v){var V=a[v.file];if(V){var I=V.index[v.line];if(I){I.errors.push(v),V.hasErrors=!0;return}}a.unknown.hasErrors=!0,a.unknown.lines[0].errors.push(v)})}function It(a,c,v,V,I){if(!a.getShaderParameter(c,a.COMPILE_STATUS)){var L=a.getShaderInfoLog(c),D=V===a.FRAGMENT_SHADER?"fragment":"vertex";zt(v,"string",D+" shader source must be a string",I);var j=Mt(v,I),G=Ve(L);Ut(j,G),Object.keys(j).forEach(function(X){var W=j[X];if(!W.hasErrors)return;var Y=[""],ee=[""];function z(q,P){Y.push(q),ee.push(P||"")}z("file number "+X+": "+W.name+`
+`,"color:red;text-decoration:underline;font-weight:bold"),W.lines.forEach(function(q){if(q.errors.length>0){z(He(q.number,4)+"| ","background-color:yellow; font-weight:bold"),z(q.line+i,"color:red; background-color:yellow; font-weight:bold");var P=0;q.errors.forEach(function(R){var K=R.message,ue=/^\s*'(.*)'\s*:\s*(.*)$/.exec(K);if(ue){var N=ue[1];K=ue[2],N==="assign"&&(N="="),P=Math.max(q.line.indexOf(N,P),0)}else P=0;z(He("| ",6)),z(He("^^^",P+3)+i,"font-weight:bold"),z(He("| ",6)),z(K+i,"font-weight:bold")}),z(He("| ",6)+i)}else z(He(q.number,4)+"| "),z(q.line+i,"color:red")}),typeof document<"u"&&!window.chrome?(ee[0]=Y.join("%c"),console.log.apply(console,ee)):console.log(Y.join(""))}),l.raise("Error compiling "+D+" shader, "+j[0].name)}}function Ft(a,c,v,V,I){if(!a.getProgramParameter(c,a.LINK_STATUS)){var L=a.getProgramInfoLog(c),D=Mt(v,I),j=Mt(V,I),G='Error linking program with vertex shader, "'+j[0].name+'", and fragment shader "'+D[0].name+'"';typeof document<"u"?console.log("%c"+G+i+"%c"+L,"color:red;text-decoration:underline;font-weight:bold","color:red"):console.log(G+i+L),l.raise(G)}}function ht(a){a._commandRef=$e()}function _t(a,c,v,V){ht(a);function I(G){return G?V.id(G):0}a._fragId=I(a.static.frag),a._vertId=I(a.static.vert);function L(G,X){Object.keys(X).forEach(function(W){G[V.id(W)]=!0})}var D=a._uniformSet={};L(D,c.static),L(D,c.dynamic);var j=a._attributeSet={};L(j,v.static),L(j,v.dynamic),a._hasCount="count"in a.static||"count"in a.dynamic||"elements"in a.static||"elements"in a.dynamic}function je(a,c){var v=Ne();o(a+" in command "+(c||$e())+(v==="unknown"?"":" called from "+v))}function er(a,c,v){a||je(c,v||$e())}function Ar(a,c,v,V){a in c||je("unknown parameter ("+a+")"+y(v)+". possible values: "+Object.keys(c).join(),V||$e())}function zt(a,c,v,V){U(a,c)||je("invalid parameter type"+y(v)+". expected "+c+", got "+typeof a,V||$e())}function tr(a){a()}function Lr(a,c,v){a.texture?Ce(a.texture._texture.internalformat,c,"unsupported texture format for attachment"):Ce(a.renderbuffer._renderbuffer.format,v,"unsupported renderbuffer format for attachment")}var rr=33071,Ae=9728,We=9984,Ht=9985,$t=9986,nr=9987,br=5120,Kr=5121,Vr=5122,Or=5123,cn=5124,dn=5125,li=5126,Ke=32819,qe=32820,it=33635,st=34042,cr=36193,at={};at[br]=at[Kr]=1,at[Vr]=at[Or]=at[cr]=at[it]=at[Ke]=at[qe]=2,at[cn]=at[dn]=at[li]=at[st]=4;function Rn(a,c){return a===qe||a===Ke||a===it?2:a===st?4:at[a]*c}function Dn(a){return!(a&a-1)&&!!a}function Us(a,c,v){var V,I=c.width,L=c.height,D=c.channels;l(I>0&&I<=v.maxTextureSize&&L>0&&L<=v.maxTextureSize,"invalid texture shape"),(a.wrapS!==rr||a.wrapT!==rr)&&l(Dn(I)&&Dn(L),"incompatible wrap mode for texture, both width and height must be power of 2"),c.mipmask===1?I!==1&&L!==1&&l(a.minFilter!==We&&a.minFilter!==$t&&a.minFilter!==Ht&&a.minFilter!==nr,"min filter requires mipmap"):(l(Dn(I)&&Dn(L),"texture must be a square power of 2 to support mipmapping"),l(c.mipmask===(I<<1)-1,"missing or incomplete mipmap data")),c.type===li&&(v.extensions.indexOf("oes_texture_float_linear")<0&&l(a.minFilter===Ae&&a.magFilter===Ae,"filter not supported, must enable oes_texture_float_linear"),l(!a.genMipmaps,"mipmap generation not supported with float textures"));var j=c.images;for(V=0;V<16;++V)if(j[V]){var G=I>>V,X=L>>V;l(c.mipmask&1<0&&I<=V.maxTextureSize&&L>0&&L<=V.maxTextureSize,"invalid texture shape"),l(I===L,"cube map must be square"),l(c.wrapS===rr&&c.wrapT===rr,"wrap mode not supported by cube map");for(var j=0;j>W,z=L>>W;l(G.mipmask&1<1&&c===v&&(c==='"'||c==="'"))return['"'+ye(a.substr(1,a.length-2))+'"'];var V=/\[(false|true|null|\d+|'[^']*'|"[^"]*")\]/.exec(a);if(V)return Lt(a.substr(0,V.index)).concat(Lt(V[1])).concat(Lt(a.substr(V.index+V[0].length)));var I=a.split(".");if(I.length===1)return['"'+ye(a)+'"'];for(var L=[],D=0;D"u"?1:window.devicePixelRatio,W=!1,Y=function(q){q&&h.raise(q)},ee=function(){};if(typeof c=="string"?(h(typeof document<"u","selector queries only supported in DOM environments"),v=document.querySelector(c),h(v,"invalid query string for element")):typeof c=="object"?Qf(c)?v=c:Jf(c)?(L=c,I=L.canvas):(h.constructor(c),"gl"in c?L=c.gl:"canvas"in c?I=Uu(c.canvas):"container"in c&&(V=Uu(c.container)),"attributes"in c&&(D=c.attributes,h.type(D,"object","invalid context attributes")),"extensions"in c&&(j=ju(c.extensions)),"optionalExtensions"in c&&(G=ju(c.optionalExtensions)),"onDone"in c&&(h.type(c.onDone,"function","invalid or missing onDone callback"),Y=c.onDone),"profile"in c&&(W=!!c.profile),"pixelRatio"in c&&(X=+c.pixelRatio,h(X>0,"invalid pixel ratio"))):h.raise("invalid arguments to regl"),v&&(v.nodeName.toLowerCase()==="canvas"?I=v:V=v),!L){if(!I){h(typeof document<"u","must manually specify webgl context outside of DOM environments");var z=so(V||document.body,Y,X);if(!z)return null;I=z.canvas,ee=z.onDestroy}D.premultipliedAlpha===void 0&&(D.premultipliedAlpha=!0),L=Zf(I,D)}return L?{gl:L,canvas:I,container:V,extensions:j,optionalExtensions:G,pixelRatio:X,profile:W,onDone:Y,onDestroy:ee}:(ee(),Y("webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org"),null)}function tm(a,c){var v={};function V(D){h.type(D,"string","extension name must be string");var j=D.toLowerCase(),G;try{G=v[j]=a.getExtension(j)}catch{}return!!G}for(var I=0;I65535)<<4,a>>>=c,v=(a>255)<<3,a>>>=v,c|=v,v=(a>15)<<2,a>>>=v,c|=v,v=(a>3)<<1,a>>>=v,c|=v,c|a>>1}function Hu(){var a=dr(8,function(){return[]});function c(L){var D=um(L),j=a[zu(D)>>2];return j.length>0?j.pop():new ArrayBuffer(D)}function v(L){a[zu(L.byteLength)>>2].push(L)}function V(L,D){var j=null;switch(L){case rm:j=new Int8Array(c(D),0,D);break;case nm:j=new Uint8Array(c(D),0,D);break;case im:j=new Int16Array(c(2*D),0,D);break;case sm:j=new Uint16Array(c(2*D),0,D);break;case am:j=new Int32Array(c(4*D),0,D);break;case om:j=new Uint32Array(c(4*D),0,D);break;case lm:j=new Float32Array(c(4*D),0,D);break;default:return null}return j.length!==D?j.subarray(0,D):j}function I(L){v(L.buffer)}return{alloc:c,free:v,allocType:V,freeType:I}}var gt=Hu();gt.zero=Hu();var cm=3408,dm=3410,hm=3411,pm=3412,fm=3413,mm=3414,vm=3415,bm=33901,_m=33902,wm=3379,gm=3386,ym=34921,xm=36347,Cm=36348,Em=35661,Pm=35660,Am=34930,Sm=36349,Tm=34076,km=34024,Lm=7936,Vm=7937,Om=7938,Rm=35724,Dm=34047,Mm=36063,Im=34852,qs=3553,Ku=34067,Fm=34069,$m=33984,ji=6408,ao=5126,qu=5121,oo=36160,Bm=36053,Nm=36064,Gm=16384,jm=function(a,c){var v=1;c.ext_texture_filter_anisotropic&&(v=a.getParameter(Dm));var V=1,I=1;c.webgl_draw_buffers&&(V=a.getParameter(Im),I=a.getParameter(Mm));var L=!!c.oes_texture_float;if(L){var D=a.createTexture();a.bindTexture(qs,D),a.texImage2D(qs,0,ji,1,1,0,ji,ao,null);var j=a.createFramebuffer();if(a.bindFramebuffer(oo,j),a.framebufferTexture2D(oo,Nm,qs,D,0),a.bindTexture(qs,null),a.checkFramebufferStatus(oo)!==Bm)L=!1;else{a.viewport(0,0,1,1),a.clearColor(1,0,0,1),a.clear(Gm);var G=gt.allocType(ao,4);a.readPixels(0,0,1,1,ji,ao,G),a.getError()?L=!1:(a.deleteFramebuffer(j),a.deleteTexture(D),L=G[0]===1),gt.freeType(G)}}var X=typeof navigator<"u"&&(/MSIE/.test(navigator.userAgent)||/Trident\//.test(navigator.appVersion)||/Edge/.test(navigator.userAgent)),W=!0;if(!X){var Y=a.createTexture(),ee=gt.allocType(qu,36);a.activeTexture($m),a.bindTexture(Ku,Y),a.texImage2D(Fm,0,ji,3,3,0,ji,qu,ee),gt.freeType(ee),a.bindTexture(Ku,null),a.deleteTexture(Y),W=!a.getError()}return{colorBits:[a.getParameter(dm),a.getParameter(hm),a.getParameter(pm),a.getParameter(fm)],depthBits:a.getParameter(mm),stencilBits:a.getParameter(vm),subpixelBits:a.getParameter(cm),extensions:Object.keys(c).filter(function(z){return!!c[z]}),maxAnisotropic:v,maxDrawbuffers:V,maxColorAttachments:I,pointSizeDims:a.getParameter(bm),lineWidthDims:a.getParameter(_m),maxViewportDims:a.getParameter(gm),maxCombinedTextureUnits:a.getParameter(Em),maxCubeMapSize:a.getParameter(Tm),maxRenderbufferSize:a.getParameter(km),maxTextureUnits:a.getParameter(Am),maxTextureSize:a.getParameter(wm),maxAttributes:a.getParameter(ym),maxVertexUniforms:a.getParameter(xm),maxVertexTextureUnits:a.getParameter(Pm),maxVaryingVectors:a.getParameter(Cm),maxFragmentUniforms:a.getParameter(Sm),glsl:a.getParameter(Rm),renderer:a.getParameter(Vm),vendor:a.getParameter(Lm),version:a.getParameter(Om),readFloat:L,npotTextureCube:W}};function Sr(a){return!!a&&typeof a=="object"&&Array.isArray(a.shape)&&Array.isArray(a.stride)&&typeof a.offset=="number"&&a.shape.length===a.stride.length&&(Array.isArray(a.data)||t(a.data))}var hr=function(a){return Object.keys(a).map(function(c){return a[c]})},Xs={shape:Km,flatten:Hm};function Um(a,c,v){for(var V=0;V0){var ge;if(Array.isArray(R[0])){ie=Wu(R);for(var F=1,M=1;M0)if(typeof F[0]=="number"){var H=gt.allocType(N.dtype,F.length);Qu(H,F),ie(H,pe),gt.freeType(H)}else if(Array.isArray(F[0])||t(F[0])){te=Wu(F);var re=uo(F,te,N.dtype);ie(re,pe),gt.freeType(re)}else h.raise("invalid buffer data")}else if(Sr(F)){te=F.shape;var ne=F.stride,Le=0,Te=0,se=0,le=0;te.length===1?(Le=te[0],Te=1,se=ne[0],le=0):te.length===2?(Le=te[0],Te=te[1],se=ne[0],le=ne[1]):h.raise("invalid shape");var Ee=Array.isArray(F.data)?N.dtype:Ws(F.data),ke=gt.allocType(Ee,Le*Te);Ju(ke,F.data,Le,Te,se,le,F.offset),ie(ke,pe),gt.freeType(ke)}else h.raise("invalid data for buffer subdata");return oe}return K||oe(P),oe._reglType="buffer",oe._buffer=N,oe.subdata=ge,v.profile&&(oe.stats=N.stats),oe.destroy=function(){ee(N)},oe}function q(){hr(L).forEach(function(P){P.buffer=a.createBuffer(),a.bindBuffer(P.type,P.buffer),a.bufferData(P.type,P.persistentData||P.byteLength,P.usage)})}return v.profile&&(c.getTotalBufferSize=function(){var P=0;return Object.keys(L).forEach(function(R){P+=L[R].stats.size}),P}),{create:z,createStream:G,destroyStream:X,clear:function(){hr(L).forEach(ee),j.forEach(ee)},getBuffer:function(P){return P&&P._buffer instanceof D?P._buffer:null},restore:q,_initBuffer:Y}}var sv=0,av=0,ov=1,lv=1,uv=4,cv=4,fn={points:sv,point:av,lines:ov,line:lv,triangles:uv,triangle:cv,"line loop":2,"line strip":3,"triangle strip":5,"triangle fan":6},dv=0,hv=1,Ui=4,pv=5120,ui=5121,ec=5122,ci=5123,tc=5124,$n=5125,po=34963,fv=35040,mv=35044;function vv(a,c,v,V){var I={},L=0,D={uint8:ui,uint16:ci};c.oes_element_index_uint&&(D.uint32=$n);function j(q){this.id=L++,I[this.id]=this,this.buffer=q,this.primType=Ui,this.vertCount=0,this.type=0}j.prototype.bind=function(){this.buffer.bind()};var G=[];function X(q){var P=G.pop();return P||(P=new j(v.create(null,po,!0,!1)._buffer)),Y(P,q,fv,-1,-1,0,0),P}function W(q){G.push(q)}function Y(q,P,R,K,ue,N,oe){q.buffer.bind();var ie;if(P){var ge=oe;!oe&&(!t(P)||Sr(P)&&!t(P.data))&&(ge=c.oes_element_index_uint?$n:ci),v._initBuffer(q.buffer,P,R,ge,3)}else a.bufferData(po,N,R),q.buffer.dtype=ie||ui,q.buffer.usage=R,q.buffer.dimension=3,q.buffer.byteLength=N;if(ie=oe,!oe){switch(q.buffer.dtype){case ui:case pv:ie=ui;break;case ci:case ec:ie=ci;break;case $n:case tc:ie=$n;break;default:h.raise("unsupported type for element array")}q.buffer.dtype=ie}q.type=ie,h(ie!==$n||!!c.oes_element_index_uint,"32 bit element buffers not supported, enable oes_element_index_uint first");var F=ue;F<0&&(F=q.buffer.byteLength,ie===ci?F>>=1:ie===$n&&(F>>=2)),q.vertCount=F;var M=K;if(K<0){M=Ui;var pe=q.buffer.dimension;pe===1&&(M=dv),pe===2&&(M=hv),pe===3&&(M=Ui)}q.primType=M}function ee(q){V.elementsCount--,h(q.buffer!==null,"must not double destroy elements"),delete I[q.id],q.buffer.destroy(),q.buffer=null}function z(q,P){var R=v.create(null,po,!0),K=new j(R._buffer);V.elementsCount++;function ue(N){if(!N)R(),K.primType=Ui,K.vertCount=0,K.type=ui;else if(typeof N=="number")R(N),K.primType=Ui,K.vertCount=N|0,K.type=ui;else{var oe=null,ie=mv,ge=-1,F=-1,M=0,pe=0;Array.isArray(N)||t(N)||Sr(N)?oe=N:(h.type(N,"object","invalid arguments for elements"),"data"in N&&(oe=N.data,h(Array.isArray(oe)||t(oe)||Sr(oe),"invalid data for element buffer")),"usage"in N&&(h.parameter(N.usage,Ys,"invalid element buffer usage"),ie=Ys[N.usage]),"primitive"in N&&(h.parameter(N.primitive,fn,"invalid element buffer primitive"),ge=fn[N.primitive]),"count"in N&&(h(typeof N.count=="number"&&N.count>=0,"invalid vertex count for elements"),F=N.count|0),"type"in N&&(h.parameter(N.type,D,"invalid buffer type"),pe=D[N.type]),"length"in N?M=N.length|0:(M=F,pe===ci||pe===ec?M*=2:(pe===$n||pe===tc)&&(M*=4))),Y(K,oe,ie,ge,F,M,pe)}return ue}return ue(q),ue._reglType="elements",ue._elements=K,ue.subdata=function(N,oe){return R.subdata(N,oe),ue},ue.destroy=function(){ee(K)},ue}return{create:z,createStream:X,destroyStream:W,getElements:function(q){return typeof q=="function"&&q._elements instanceof j?q._elements:null},clear:function(){hr(I).forEach(ee)}}}var rc=new Float32Array(1),bv=new Uint32Array(rc.buffer),_v=5123;function nc(a){for(var c=gt.allocType(_v,a.length),v=0;v>>31<<15,L=(V<<1>>>24)-127,D=V>>13&1023;if(L<-24)c[v]=I;else if(L<-14){var j=-14-L;c[v]=I+(D+1024>>j)}else L>15?c[v]=I+31744:c[v]=I+(L+15<<10)+D}return c}function pt(a){return Array.isArray(a)||t(a)}var ic=function(a){return!(a&a-1)&&!!a},wv=34467,Rr=3553,fo=34067,Zs=34069,Bn=6408,mo=6406,Qs=6407,zi=6409,Js=6410,sc=32854,vo=32855,ac=36194,gv=32819,yv=32820,xv=33635,Cv=34042,bo=6402,ea=34041,_o=35904,wo=35906,di=36193,go=33776,yo=33777,xo=33778,Co=33779,oc=35986,lc=35987,uc=34798,cc=35840,dc=35841,hc=35842,pc=35843,fc=36196,hi=5121,Eo=5123,Po=5125,Hi=5126,Ev=10242,Pv=10243,Av=10497,Ao=33071,Sv=33648,Tv=10240,kv=10241,So=9728,Lv=9729,To=9984,mc=9985,vc=9986,ko=9987,Vv=33170,ta=4352,Ov=4353,Rv=4354,Dv=34046,Mv=3317,Iv=37440,Fv=37441,$v=37443,bc=37444,Ki=33984,Bv=[To,vc,mc,ko],ra=[0,zi,Js,Qs,Bn],gr={};gr[zi]=gr[mo]=gr[bo]=1,gr[ea]=gr[Js]=2,gr[Qs]=gr[_o]=3,gr[Bn]=gr[wo]=4;function pi(a){return"[object "+a+"]"}var _c=pi("HTMLCanvasElement"),wc=pi("OffscreenCanvas"),gc=pi("CanvasRenderingContext2D"),yc=pi("ImageBitmap"),xc=pi("HTMLImageElement"),Cc=pi("HTMLVideoElement"),Nv=Object.keys(lo).concat([_c,wc,gc,yc,xc,Cc]),fi=[];fi[hi]=1,fi[Hi]=4,fi[di]=2,fi[Eo]=2,fi[Po]=4;var Bt=[];Bt[sc]=2,Bt[vo]=2,Bt[ac]=2,Bt[ea]=4,Bt[go]=.5,Bt[yo]=.5,Bt[xo]=1,Bt[Co]=1,Bt[oc]=.5,Bt[lc]=1,Bt[uc]=1,Bt[cc]=.5,Bt[dc]=.25,Bt[hc]=.5,Bt[pc]=.25,Bt[fc]=.5;function Ec(a){return Array.isArray(a)&&(a.length===0||typeof a[0]=="number")}function Pc(a){if(!Array.isArray(a))return!1;var c=a.length;return!(c===0||!pt(a[0]))}function Nn(a){return Object.prototype.toString.call(a)}function Ac(a){return Nn(a)===_c}function Sc(a){return Nn(a)===wc}function Gv(a){return Nn(a)===gc}function jv(a){return Nn(a)===yc}function Uv(a){return Nn(a)===xc}function zv(a){return Nn(a)===Cc}function Lo(a){if(!a)return!1;var c=Nn(a);return Nv.indexOf(c)>=0?!0:Ec(a)||Pc(a)||Sr(a)}function Tc(a){return lo[Object.prototype.toString.call(a)]|0}function Hv(a,c){var v=c.length;switch(a.type){case hi:case Eo:case Po:case Hi:var V=gt.allocType(a.type,v);V.set(c),a.data=V;break;case di:a.data=nc(c);break;default:h.raise("unsupported texture type, must specify a typed array")}}function kc(a,c){return gt.allocType(a.type===di?Hi:a.type,c)}function Lc(a,c){a.type===di?(a.data=nc(c),gt.freeType(c)):a.data=c}function Kv(a,c,v,V,I,L){for(var D=a.width,j=a.height,G=a.channels,X=D*j*G,W=kc(a,X),Y=0,ee=0;ee=1;)j+=D*G*G,G/=2;return j}else return D*v*V}function qv(a,c,v,V,I,L,D){var j={"don't care":ta,"dont care":ta,nice:Rv,fast:Ov},G={repeat:Av,clamp:Ao,mirror:Sv},X={nearest:So,linear:Lv},W=n({mipmap:ko,"nearest mipmap nearest":To,"linear mipmap nearest":mc,"nearest mipmap linear":vc,"linear mipmap linear":ko},X),Y={none:0,browser:bc},ee={uint8:hi,rgba4:gv,rgb565:xv,"rgb5 a1":yv},z={alpha:mo,luminance:zi,"luminance alpha":Js,rgb:Qs,rgba:Bn,rgba4:sc,"rgb5 a1":vo,rgb565:ac},q={};c.ext_srgb&&(z.srgb=_o,z.srgba=wo),c.oes_texture_float&&(ee.float32=ee.float=Hi),c.oes_texture_half_float&&(ee.float16=ee["half float"]=di),c.webgl_depth_texture&&(n(z,{depth:bo,"depth stencil":ea}),n(ee,{uint16:Eo,uint32:Po,"depth stencil":Cv})),c.webgl_compressed_texture_s3tc&&n(q,{"rgb s3tc dxt1":go,"rgba s3tc dxt1":yo,"rgba s3tc dxt3":xo,"rgba s3tc dxt5":Co}),c.webgl_compressed_texture_atc&&n(q,{"rgb atc":oc,"rgba atc explicit alpha":lc,"rgba atc interpolated alpha":uc}),c.webgl_compressed_texture_pvrtc&&n(q,{"rgb pvrtc 4bppv1":cc,"rgb pvrtc 2bppv1":dc,"rgba pvrtc 4bppv1":hc,"rgba pvrtc 2bppv1":pc}),c.webgl_compressed_texture_etc1&&(q["rgb etc1"]=fc);var P=Array.prototype.slice.call(a.getParameter(wv));Object.keys(q).forEach(function(m){var O=q[m];P.indexOf(O)>=0&&(z[m]=O)});var R=Object.keys(z);v.textureFormats=R;var K=[];Object.keys(z).forEach(function(m){var O=z[m];K[O]=m});var ue=[];Object.keys(ee).forEach(function(m){var O=ee[m];ue[O]=m});var N=[];Object.keys(X).forEach(function(m){var O=X[m];N[O]=m});var oe=[];Object.keys(W).forEach(function(m){var O=W[m];oe[O]=m});var ie=[];Object.keys(G).forEach(function(m){var O=G[m];ie[O]=m});var ge=R.reduce(function(m,O){var k=z[O];return k===zi||k===mo||k===zi||k===Js||k===bo||k===ea||c.ext_srgb&&(k===_o||k===wo)?m[k]=k:k===vo||O.indexOf("rgba")>=0?m[k]=Bn:m[k]=Qs,m},{});function F(){this.internalformat=Bn,this.format=Bn,this.type=hi,this.compressed=!1,this.premultiplyAlpha=!1,this.flipY=!1,this.unpackAlignment=1,this.colorSpace=bc,this.width=0,this.height=0,this.channels=0}function M(m,O){m.internalformat=O.internalformat,m.format=O.format,m.type=O.type,m.compressed=O.compressed,m.premultiplyAlpha=O.premultiplyAlpha,m.flipY=O.flipY,m.unpackAlignment=O.unpackAlignment,m.colorSpace=O.colorSpace,m.width=O.width,m.height=O.height,m.channels=O.channels}function pe(m,O){if(!(typeof O!="object"||!O)){if("premultiplyAlpha"in O&&(h.type(O.premultiplyAlpha,"boolean","invalid premultiplyAlpha"),m.premultiplyAlpha=O.premultiplyAlpha),"flipY"in O&&(h.type(O.flipY,"boolean","invalid texture flip"),m.flipY=O.flipY),"alignment"in O&&(h.oneOf(O.alignment,[1,2,4,8],"invalid texture unpack alignment"),m.unpackAlignment=O.alignment),"colorSpace"in O&&(h.parameter(O.colorSpace,Y,"invalid colorSpace"),m.colorSpace=Y[O.colorSpace]),"type"in O){var k=O.type;h(c.oes_texture_float||!(k==="float"||k==="float32"),"you must enable the OES_texture_float extension in order to use floating point textures."),h(c.oes_texture_half_float||!(k==="half float"||k==="float16"),"you must enable the OES_texture_half_float extension in order to use 16-bit floating point textures."),h(c.webgl_depth_texture||!(k==="uint16"||k==="uint32"||k==="depth stencil"),"you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures."),h.parameter(k,ee,"invalid texture type"),m.type=ee[k]}var he=m.width,Re=m.height,p=m.channels,u=!1;"shape"in O?(h(Array.isArray(O.shape)&&O.shape.length>=2,"shape must be an array"),he=O.shape[0],Re=O.shape[1],O.shape.length===3&&(p=O.shape[2],h(p>0&&p<=4,"invalid number of channels"),u=!0),h(he>=0&&he<=v.maxTextureSize,"invalid width"),h(Re>=0&&Re<=v.maxTextureSize,"invalid height")):("radius"in O&&(he=Re=O.radius,h(he>=0&&he<=v.maxTextureSize,"invalid radius")),"width"in O&&(he=O.width,h(he>=0&&he<=v.maxTextureSize,"invalid width")),"height"in O&&(Re=O.height,h(Re>=0&&Re<=v.maxTextureSize,"invalid height")),"channels"in O&&(p=O.channels,h(p>0&&p<=4,"invalid number of channels"),u=!0)),m.width=he|0,m.height=Re|0,m.channels=p|0;var _=!1;if("format"in O){var E=O.format;h(c.webgl_depth_texture||!(E==="depth"||E==="depth stencil"),"you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures."),h.parameter(E,z,"invalid texture format");var S=m.internalformat=z[E];m.format=ge[S],E in ee&&("type"in O||(m.type=ee[E])),E in q&&(m.compressed=!0),_=!0}!u&&_?m.channels=gr[m.format]:u&&!_?m.channels!==ra[m.format]&&(m.format=m.internalformat=ra[m.channels]):_&&u&&h(m.channels===gr[m.format],"number of channels inconsistent with specified format")}}function te(m){a.pixelStorei(Iv,m.flipY),a.pixelStorei(Fv,m.premultiplyAlpha),a.pixelStorei($v,m.colorSpace),a.pixelStorei(Mv,m.unpackAlignment)}function H(){F.call(this),this.xOffset=0,this.yOffset=0,this.data=null,this.needsFree=!1,this.element=null,this.needsCopy=!1}function re(m,O){var k=null;if(Lo(O)?k=O:O&&(h.type(O,"object","invalid pixel data type"),pe(m,O),"x"in O&&(m.xOffset=O.x|0),"y"in O&&(m.yOffset=O.y|0),Lo(O.data)&&(k=O.data)),h(!m.compressed||k instanceof Uint8Array,"compressed texture data must be stored in a uint8array"),O.copy){h(!k,"can not specify copy and data field for the same texture");var he=I.viewportWidth,Re=I.viewportHeight;m.width=m.width||he-m.xOffset,m.height=m.height||Re-m.yOffset,m.needsCopy=!0,h(m.xOffset>=0&&m.xOffset=0&&m.yOffset0&&m.width<=he&&m.height>0&&m.height<=Re,"copy texture read out of bounds")}else if(!k)m.width=m.width||1,m.height=m.height||1,m.channels=m.channels||4;else if(t(k))m.channels=m.channels||4,m.data=k,!("type"in O)&&m.type===hi&&(m.type=Tc(k));else if(Ec(k))m.channels=m.channels||4,Hv(m,k),m.alignment=1,m.needsFree=!0;else if(Sr(k)){var p=k.data;!Array.isArray(p)&&m.type===hi&&(m.type=Tc(p));var u=k.shape,_=k.stride,E,S,g,w,C,d;u.length===3?(g=u[2],d=_[2]):(h(u.length===2,"invalid ndarray pixel data, must be 2 or 3D"),g=1,d=1),E=u[0],S=u[1],w=_[0],C=_[1],m.alignment=1,m.width=E,m.height=S,m.channels=g,m.format=m.internalformat=ra[g],m.needsFree=!0,Kv(m,p,w,C,d,k.offset)}else if(Ac(k)||Sc(k)||Gv(k))Ac(k)||Sc(k)?m.element=k:m.element=k.canvas,m.width=m.element.width,m.height=m.element.height,m.channels=4;else if(jv(k))m.element=k,m.width=k.width,m.height=k.height,m.channels=4;else if(Uv(k))m.element=k,m.width=k.naturalWidth,m.height=k.naturalHeight,m.channels=4;else if(zv(k))m.element=k,m.width=k.videoWidth,m.height=k.videoHeight,m.channels=4;else if(Pc(k)){var b=m.width||k[0].length,f=m.height||k.length,A=m.channels;pt(k[0][0])?A=A||k[0][0].length:A=A||1;for(var T=Xs.shape(k),$=1,Q=0;Q=0,"oes_texture_float extension not enabled"):m.type===di&&h(v.extensions.indexOf("oes_texture_half_float")>=0,"oes_texture_half_float extension not enabled")}function ne(m,O,k){var he=m.element,Re=m.data,p=m.internalformat,u=m.format,_=m.type,E=m.width,S=m.height;te(m),he?a.texImage2D(O,k,u,u,_,he):m.compressed?a.compressedTexImage2D(O,k,p,E,S,0,Re):m.needsCopy?(V(),a.copyTexImage2D(O,k,u,m.xOffset,m.yOffset,E,S,0)):a.texImage2D(O,k,u,E,S,0,u,_,Re||null)}function Le(m,O,k,he,Re){var p=m.element,u=m.data,_=m.internalformat,E=m.format,S=m.type,g=m.width,w=m.height;te(m),p?a.texSubImage2D(O,Re,k,he,E,S,p):m.compressed?a.compressedTexSubImage2D(O,Re,k,he,_,g,w,u):m.needsCopy?(V(),a.copyTexSubImage2D(O,Re,k,he,m.xOffset,m.yOffset,g,w)):a.texSubImage2D(O,Re,k,he,g,w,E,S,u)}var Te=[];function se(){return Te.pop()||new H}function le(m){m.needsFree&>.freeType(m.data),H.call(m),Te.push(m)}function Ee(){F.call(this),this.genMipmaps=!1,this.mipmapHint=ta,this.mipmask=0,this.images=Array(16)}function ke(m,O,k){var he=m.images[0]=se();m.mipmask=1,he.width=m.width=O,he.height=m.height=k,he.channels=m.channels=4}function De(m,O){var k=null;if(Lo(O))k=m.images[0]=se(),M(k,m),re(k,O),m.mipmask=1;else if(pe(m,O),Array.isArray(O.mipmap))for(var he=O.mipmap,Re=0;Re>=Re,k.height>>=Re,re(k,he[Re]),m.mipmask|=1<=0&&!("faces"in O)&&(m.genMipmaps=!0)}if("mag"in O){var he=O.mag;h.parameter(he,X),m.magFilter=X[he]}var Re=m.wrapS,p=m.wrapT;if("wrap"in O){var u=O.wrap;typeof u=="string"?(h.parameter(u,G),Re=p=G[u]):Array.isArray(u)&&(h.parameter(u[0],G),h.parameter(u[1],G),Re=G[u[0]],p=G[u[1]])}else{if("wrapS"in O){var _=O.wrapS;h.parameter(_,G),Re=G[_]}if("wrapT"in O){var E=O.wrapT;h.parameter(E,G),p=G[E]}}if(m.wrapS=Re,m.wrapT=p,"anisotropic"in O){var S=O.anisotropic;h(typeof S=="number"&&S>=1&&S<=v.maxAnisotropic,"aniso samples must be between 1 and "),m.anisotropic=O.anisotropic}if("mipmap"in O){var g=!1;switch(typeof O.mipmap){case"string":h.parameter(O.mipmap,j,"invalid mipmap hint"),m.mipmapHint=j[O.mipmap],m.genMipmaps=!0,g=!0;break;case"boolean":g=m.genMipmaps=O.mipmap;break;case"object":h(Array.isArray(O.mipmap),"invalid mipmap type"),m.genMipmaps=!1,g=!0;break;default:h.raise("invalid mipmap type")}g&&!("min"in O)&&(m.minFilter=To)}}function Et(m,O){a.texParameteri(O,kv,m.minFilter),a.texParameteri(O,Tv,m.magFilter),a.texParameteri(O,Ev,m.wrapS),a.texParameteri(O,Pv,m.wrapT),c.ext_texture_filter_anisotropic&&a.texParameteri(O,Dv,m.anisotropic),m.genMipmaps&&(a.hint(Vv,m.mipmapHint),a.generateMipmap(O))}var Pt=0,Vt={},Nt=v.maxTextureUnits,ft=Array(Nt).map(function(){return null});function Oe(m){F.call(this),this.mipmask=0,this.internalformat=Bn,this.id=Pt++,this.refCount=1,this.target=m,this.texture=a.createTexture(),this.unit=-1,this.bindCount=0,this.texInfo=new ot,D.profile&&(this.stats={size:0})}function Gt(m){a.activeTexture(Ki),a.bindTexture(m.target,m.texture)}function ze(){var m=ft[0];m?a.bindTexture(m.target,m.texture):a.bindTexture(Rr,null)}function xe(m){var O=m.texture;h(O,"must not double destroy texture");var k=m.unit,he=m.target;k>=0&&(a.activeTexture(Ki+k),a.bindTexture(he,null),ft[k]=null),a.deleteTexture(O),m.texture=null,m.params=null,m.pixels=null,m.refCount=0,delete Vt[m.id],L.textureCount--}n(Oe.prototype,{bind:function(){var m=this;m.bindCount+=1;var O=m.unit;if(O<0){for(var k=0;k0)continue;he.unit=-1}ft[k]=m,O=k;break}O>=Nt&&h.raise("insufficient number of texture units"),D.profile&&L.maxTextureUnits>C)-g,d.height=d.height||(k.height>>C)-w,h(k.type===d.type&&k.format===d.format&&k.internalformat===d.internalformat,"incompatible format for texture.subimage"),h(g>=0&&w>=0&&g+d.width<=k.width&&w+d.height<=k.height,"texture.subimage write out of bounds"),h(k.mipmask&1<>g;++g){var w=E>>g,C=S>>g;if(!w||!C)break;a.texImage2D(Rr,g,k.format,w,C,0,k.format,k.type,null)}return ze(),D.profile&&(k.stats.size=na(k.internalformat,k.type,E,S,!1,!1)),he}return he(m,O),he.subimage=Re,he.resize=p,he._reglType="texture2d",he._texture=k,D.profile&&(he.stats=k.stats),he.destroy=function(){k.decRef()},he}function Be(m,O,k,he,Re,p){var u=new Oe(fo);Vt[u.id]=u,L.cubeCount++;var _=new Array(6);function E(w,C,d,b,f,A){var T,$=u.texInfo;for(ot.call($),T=0;T<6;++T)_[T]=Fe();if(typeof w=="number"||!w){var Q=w|0||1;for(T=0;T<6;++T)ke(_[T],Q,Q)}else if(typeof w=="object")if(C)De(_[0],w),De(_[1],C),De(_[2],d),De(_[3],b),De(_[4],f),De(_[5],A);else if(xt($,w),pe(u,w),"faces"in w){var J=w.faces;for(h(Array.isArray(J)&&J.length===6,"cube faces must be a length 6 array"),T=0;T<6;++T)h(typeof J[T]=="object"&&!!J[T],"invalid input for cube map face"),M(_[T],u),De(_[T],J[T])}else for(T=0;T<6;++T)De(_[T],w);else h.raise("invalid arguments to cube map");for(M(u,_[0]),h.optional(function(){v.npotTextureCube||h(ic(u.width)&&ic(u.height),"your browser does not support non power or two texture dimensions")}),$.genMipmaps?u.mipmask=(_[0].width<<1)-1:u.mipmask=_[0].mipmask,h.textureCube(u,$,_,v),u.internalformat=_[0].internalformat,E.width=_[0].width,E.height=_[0].height,Gt(u),T=0;T<6;++T)lt(_[T],Zs+T);for(Et($,fo),ze(),D.profile&&(u.stats.size=na(u.internalformat,u.type,E.width,E.height,$.genMipmaps,!0)),E.format=K[u.internalformat],E.type=ue[u.type],E.mag=N[$.magFilter],E.min=oe[$.minFilter],E.wrapS=ie[$.wrapS],E.wrapT=ie[$.wrapT],T=0;T<6;++T)Ct(_[T]);return E}function S(w,C,d,b,f){h(!!C,"must specify image data"),h(typeof w=="number"&&w===(w|0)&&w>=0&&w<6,"invalid face");var A=d|0,T=b|0,$=f|0,Q=se();return M(Q,u),Q.width=0,Q.height=0,re(Q,C),Q.width=Q.width||(u.width>>$)-A,Q.height=Q.height||(u.height>>$)-T,h(u.type===Q.type&&u.format===Q.format&&u.internalformat===Q.internalformat,"incompatible format for texture.subimage"),h(A>=0&&T>=0&&A+Q.width<=u.width&&T+Q.height<=u.height,"texture.subimage write out of bounds"),h(u.mipmask&1<<$,"missing mipmap data"),h(Q.data||Q.element||Q.needsCopy,"missing image data"),Gt(u),Le(Q,Zs+w,A,T,$),ze(),le(Q),E}function g(w){var C=w|0;if(C!==u.width){E.width=u.width=C,E.height=u.height=C,Gt(u);for(var d=0;d<6;++d)for(var b=0;u.mipmask>>b;++b)a.texImage2D(Zs+d,b,u.format,C>>b,C>>b,0,u.format,u.type,null);return ze(),D.profile&&(u.stats.size=na(u.internalformat,u.type,E.width,E.height,!1,!0)),E}}return E(m,O,k,he,Re,p),E.subimage=S,E.resize=g,E._reglType="textureCube",E._texture=u,D.profile&&(E.stats=u.stats),E.destroy=function(){u.decRef()},E}function mt(){for(var m=0;m>he,k.height>>he,0,k.internalformat,k.type,null);else for(var Re=0;Re<6;++Re)a.texImage2D(Zs+Re,he,k.internalformat,k.width>>he,k.height>>he,0,k.internalformat,k.type,null);Et(k.texInfo,k.target)})}function qn(){for(var m=0;m=2,"invalid renderbuffer shape"),oe=M[0]|0,ie=M[1]|0}else"radius"in F&&(oe=ie=F.radius|0),"width"in F&&(oe=F.width|0),"height"in F&&(ie=F.height|0);"format"in F&&(h.parameter(F.format,L,"invalid renderbuffer format"),ge=L[F.format])}else typeof ue=="number"?(oe=ue|0,typeof N=="number"?ie=N|0:ie=oe):ue?h.raise("invalid arguments to renderbuffer constructor"):oe=ie=1;if(h(oe>0&&ie>0&&oe<=v.maxRenderbufferSize&&ie<=v.maxRenderbufferSize,"invalid renderbuffer size"),!(oe===P.width&&ie===P.height&&ge===P.format))return R.width=P.width=oe,R.height=P.height=ie,P.format=ge,a.bindRenderbuffer(mn,P.renderbuffer),a.renderbufferStorage(mn,ge,oe,ie),h(a.getError()===0,"invalid render buffer format"),I.profile&&(P.stats.size=Nc(P.format,P.width,P.height)),R.format=D[P.format],R}function K(ue,N){var oe=ue|0,ie=N|0||oe;return oe===P.width&&ie===P.height||(h(oe>0&&ie>0&&oe<=v.maxRenderbufferSize&&ie<=v.maxRenderbufferSize,"invalid renderbuffer size"),R.width=P.width=oe,R.height=P.height=ie,a.bindRenderbuffer(mn,P.renderbuffer),a.renderbufferStorage(mn,P.format,oe,ie),h(a.getError()===0,"invalid render buffer format"),I.profile&&(P.stats.size=Nc(P.format,P.width,P.height))),R}return R(z,q),R.resize=K,R._reglType="renderbuffer",R._renderbuffer=P,I.profile&&(R.stats=P.stats),R.destroy=function(){P.decRef()},R}I.profile&&(V.getTotalRenderbufferSize=function(){var z=0;return Object.keys(G).forEach(function(q){z+=G[q].stats.size}),z});function ee(){hr(G).forEach(function(z){z.renderbuffer=a.createRenderbuffer(),a.bindRenderbuffer(mn,z.renderbuffer),a.renderbufferStorage(mn,z.format,z.width,z.height)}),a.bindRenderbuffer(mn,null)}return{create:Y,clear:function(){hr(G).forEach(W)},restore:ee}},Xr=36160,Vo=36161,Gn=3553,sa=34069,Gc=36064,jc=36096,Uc=36128,zc=33306,Hc=36053,Yv=36054,Wv=36055,Zv=36057,Qv=36061,Jv=36193,eb=5121,tb=5126,Kc=6407,qc=6408,rb=6402,nb=[Kc,qc],Oo=[];Oo[qc]=4,Oo[Kc]=3;var aa=[];aa[eb]=1,aa[tb]=4,aa[Jv]=2;var ib=32854,sb=32855,ab=36194,ob=33189,lb=36168,Xc=34041,ub=35907,cb=34836,db=34842,hb=34843,pb=[ib,sb,ab,ub,db,hb,cb],mi={};mi[Hc]="complete",mi[Yv]="incomplete attachment",mi[Zv]="incomplete dimensions",mi[Wv]="incomplete, missing attachment",mi[Qv]="unsupported";function fb(a,c,v,V,I,L){var D={cur:null,next:null,dirty:!1,setFBO:null},j=["rgba"],G=["rgba4","rgb565","rgb5 a1"];c.ext_srgb&&G.push("srgba"),c.ext_color_buffer_half_float&&G.push("rgba16f","rgb16f"),c.webgl_color_buffer_float&&G.push("rgba32f");var X=["uint8"];c.oes_texture_half_float&&X.push("half float","float16"),c.oes_texture_float&&X.push("float","float32");function W(H,re,ne){this.target=H,this.texture=re,this.renderbuffer=ne;var Le=0,Te=0;re?(Le=re.width,Te=re.height):ne&&(Le=ne.width,Te=ne.height),this.width=Le,this.height=Te}function Y(H){H&&(H.texture&&H.texture._texture.decRef(),H.renderbuffer&&H.renderbuffer._renderbuffer.decRef())}function ee(H,re,ne){if(H)if(H.texture){var Le=H.texture._texture,Te=Math.max(1,Le.width),se=Math.max(1,Le.height);h(Te===re&&se===ne,"inconsistent width/height for supplied texture"),Le.refCount+=1}else{var le=H.renderbuffer._renderbuffer;h(le.width===re&&le.height===ne,"inconsistent width/height for renderbuffer"),le.refCount+=1}}function z(H,re){re&&(re.texture?a.framebufferTexture2D(Xr,H,re.target,re.texture._texture.texture,0):a.framebufferRenderbuffer(Xr,H,Vo,re.renderbuffer._renderbuffer.renderbuffer))}function q(H){var re=Gn,ne=null,Le=null,Te=H;typeof H=="object"&&(Te=H.data,"target"in H&&(re=H.target|0)),h.type(Te,"function","invalid attachment data");var se=Te._reglType;return se==="texture2d"?(ne=Te,h(re===Gn)):se==="textureCube"?(ne=Te,h(re>=sa&&re=2,"invalid shape for framebuffer"),ke=Gt[0],De=Gt[1]}else"radius"in Oe&&(ke=De=Oe.radius),"width"in Oe&&(ke=Oe.width),"height"in Oe&&(De=Oe.height);("color"in Oe||"colors"in Oe)&&(Fe=Oe.color||Oe.colors,Array.isArray(Fe)&&h(Fe.length===1||c.webgl_draw_buffers,"multiple render targets not supported")),Fe||("colorCount"in Oe&&(Et=Oe.colorCount|0,h(Et>0,"invalid color buffer count")),"colorTexture"in Oe&&(Ct=!!Oe.colorTexture,ot="rgba4"),"colorType"in Oe&&(xt=Oe.colorType,Ct?(h(c.oes_texture_float||!(xt==="float"||xt==="float32"),"you must enable OES_texture_float in order to use floating point framebuffer objects"),h(c.oes_texture_half_float||!(xt==="half float"||xt==="float16"),"you must enable OES_texture_half_float in order to use 16-bit floating point framebuffer objects")):xt==="half float"||xt==="float16"?(h(c.ext_color_buffer_half_float,"you must enable EXT_color_buffer_half_float to use 16-bit render buffers"),ot="rgba16f"):(xt==="float"||xt==="float32")&&(h(c.webgl_color_buffer_float,"you must enable WEBGL_color_buffer_float in order to use 32-bit floating point renderbuffers"),ot="rgba32f"),h.oneOf(xt,X,"invalid color type")),"colorFormat"in Oe&&(ot=Oe.colorFormat,j.indexOf(ot)>=0?Ct=!0:G.indexOf(ot)>=0?Ct=!1:h.optional(function(){Ct?h.oneOf(Oe.colorFormat,j,"invalid color format for texture"):h.oneOf(Oe.colorFormat,G,"invalid color format for renderbuffer")}))),("depthTexture"in Oe||"depthStencilTexture"in Oe)&&(ft=!!(Oe.depthTexture||Oe.depthStencilTexture),h(!ft||c.webgl_depth_texture,"webgl_depth_texture extension not supported")),"depth"in Oe&&(typeof Oe.depth=="boolean"?lt=Oe.depth:(Pt=Oe.depth,ct=!1)),"stencil"in Oe&&(typeof Oe.stencil=="boolean"?ct=Oe.stencil:(Vt=Oe.stencil,lt=!1)),"depthStencil"in Oe&&(typeof Oe.depthStencil=="boolean"?lt=ct=Oe.depthStencil:(Nt=Oe.depthStencil,lt=!1,ct=!1))}var ze=null,xe=null,Me=null,Be=null;if(Array.isArray(Fe))ze=Fe.map(q);else if(Fe)ze=[q(Fe)];else for(ze=new Array(Et),Ee=0;Ee=0||ze[Ee].renderbuffer&&pb.indexOf(ze[Ee].renderbuffer._renderbuffer.format)>=0,"framebuffer color attachment "+Ee+" is invalid"),ze[Ee]&&ze[Ee].texture){var Mr=Oo[ze[Ee].texture._texture.format]*aa[ze[Ee].texture._texture.type];mt===null?mt=Mr:h(mt===Mr,"all color attachments much have the same number of bits per pixel.")}return ee(xe,ke,De),h(!xe||xe.texture&&xe.texture._texture.format===rb||xe.renderbuffer&&xe.renderbuffer._renderbuffer.format===ob,"invalid depth attachment for framebuffer object"),ee(Me,ke,De),h(!Me||Me.renderbuffer&&Me.renderbuffer._renderbuffer.format===lb,"invalid stencil attachment for framebuffer object"),ee(Be,ke,De),h(!Be||Be.texture&&Be.texture._texture.format===Xc||Be.renderbuffer&&Be.renderbuffer._renderbuffer.format===Xc,"invalid depth-stencil attachment for framebuffer object"),ie(ne),ne.width=ke,ne.height=De,ne.colorAttachments=ze,ne.depthAttachment=xe,ne.stencilAttachment=Me,ne.depthStencilAttachment=Be,Le.color=ze.map(R),Le.depth=R(xe),Le.stencil=R(Me),Le.depthStencil=R(Be),Le.width=ne.width,Le.height=ne.height,F(ne),Le}function Te(se,le){h(D.next!==ne,"can not resize a framebuffer which is currently in use");var Ee=Math.max(se|0,1),ke=Math.max(le|0||Ee,1);if(Ee===ne.width&&ke===ne.height)return Le;for(var De=ne.colorAttachments,lt=0;lt=2,"invalid shape for framebuffer"),h(Ct[0]===Ct[1],"cube framebuffer must be square"),Ee=Ct[0]}else"radius"in Fe&&(Ee=Fe.radius|0),"width"in Fe?(Ee=Fe.width|0,"height"in Fe&&h(Fe.height===Ee,"must be square")):"height"in Fe&&(Ee=Fe.height|0);("color"in Fe||"colors"in Fe)&&(ke=Fe.color||Fe.colors,Array.isArray(ke)&&h(ke.length===1||c.webgl_draw_buffers,"multiple render targets not supported")),ke||("colorCount"in Fe&&(ct=Fe.colorCount|0,h(ct>0,"invalid color buffer count")),"colorType"in Fe&&(h.oneOf(Fe.colorType,X,"invalid color type"),lt=Fe.colorType),"colorFormat"in Fe&&(De=Fe.colorFormat,h.oneOf(Fe.colorFormat,j,"invalid color format for texture"))),"depth"in Fe&&(le.depth=Fe.depth),"stencil"in Fe&&(le.stencil=Fe.stencil),"depthStencil"in Fe&&(le.depthStencil=Fe.depthStencil)}var ot;if(ke)if(Array.isArray(ke))for(ot=[],se=0;se0&&(le.depth=re[0].depth,le.stencil=re[0].stencil,le.depthStencil=re[0].depthStencil),re[se]?re[se](le):re[se]=M(le)}return n(ne,{width:Ee,height:Ee,color:ot})}function Le(Te){var se,le=Te|0;if(h(le>0&&le<=v.maxCubeMapSize,"invalid radius for cube fbo"),le===ne.width)return ne;var Ee=ne.color;for(se=0;se{for(var lt=Object.keys(te),ct=0;ct=0,'invalid option for vao: "'+lt[ct]+'" valid options are '+Wc)}),h(Array.isArray(H),"attributes must be an array")}h(H.length0,"must specify at least one attribute");var ne={},Le=M.attributes;Le.length=H.length;for(var Te=0;Te=Ee.byteLength?ke.subdata(Ee):(ke.destroy(),M.buffers[Te]=null)),M.buffers[Te]||(ke=M.buffers[Te]=I.create(se,Yc,!1,!0)),le.buffer=I.getBuffer(ke),le.size=le.buffer.dimension|0,le.normalized=!1,le.type=le.buffer.dtype,le.offset=0,le.stride=0,le.divisor=0,le.state=1,ne[Te]=1}else I.getBuffer(se)?(le.buffer=I.getBuffer(se),le.size=le.buffer.dimension|0,le.normalized=!1,le.type=le.buffer.dtype,le.offset=0,le.stride=0,le.divisor=0,le.state=1):I.getBuffer(se.buffer)?(le.buffer=I.getBuffer(se.buffer),le.size=(+se.size||le.buffer.dimension)|0,le.normalized=!!se.normalized||!1,"type"in se?(h.parameter(se.type,Fn,"invalid buffer type"),le.type=Fn[se.type]):le.type=le.buffer.dtype,le.offset=(se.offset||0)|0,le.stride=(se.stride||0)|0,le.divisor=(se.divisor||0)|0,le.state=1,h(le.size>=1&&le.size<=4,"size must be between 1 and 4"),h(le.offset>=0,"invalid offset"),h(le.stride>=0&&le.stride<=255,"stride must be between 0 and 255"),h(le.divisor>=0,"divisor must be positive"),h(!le.divisor||!!c.angle_instanced_arrays,"ANGLE_instanced_arrays must be enabled to use divisor")):"x"in se?(h(Te>0,"first attribute must not be a constant"),le.x=+se.x||0,le.y=+se.y||0,le.z=+se.z||0,le.w=+se.w||0,le.state=2):h(!1,"invalid attribute spec for location "+Te)}for(var De=0;De1)for(var te=0;teP&&(P=R.stats.uniformsCount)}),P},v.getMaxAttributesCount=function(){var P=0;return W.forEach(function(R){R.stats.attributesCount>P&&(P=R.stats.attributesCount)}),P});function q(){I={},L={};for(var P=0;P=0,"missing vertex shader",K),h.command(R>=0,"missing fragment shader",K);var N=X[R];N||(N=X[R]={});var oe=N[P];if(oe&&(oe.refCount++,!ue))return oe;var ie=new ee(R,P);return v.shaderCount++,z(ie,K,ue),oe||(N[P]=ie),W.push(ie),n(ie,{destroy:function(){if(ie.refCount--,ie.refCount<=0){a.deleteProgram(ie.program);var ge=W.indexOf(ie);W.splice(ge,1),v.shaderCount--}N[ie.vertId].refCount<=0&&(a.deleteShader(L[ie.vertId]),delete L[ie.vertId],delete X[ie.fragId][ie.vertId]),Object.keys(X[ie.fragId]).length||(a.deleteShader(I[ie.fragId]),delete I[ie.fragId],delete X[ie.fragId])}})},restore:q,shader:G,frag:-1,vert:-1}}var yb=6408,qi=5121,xb=3333,la=5126;function Cb(a,c,v,V,I,L,D){function j(W){var Y;c.next===null?(h(I.preserveDrawingBuffer,'you must create a webgl context with "preserveDrawingBuffer":true in order to read pixels from the drawing buffer'),Y=qi):(h(c.next.colorAttachments[0].texture!==null,"You cannot read from a renderbuffer"),Y=c.next.colorAttachments[0].texture._texture.type,h.optional(function(){L.oes_texture_float?(h(Y===qi||Y===la,"Reading from a framebuffer is only allowed for the types 'uint8' and 'float'"),Y===la&&h(D.readFloat,"Reading 'float' values is not permitted in your browser. For a fallback, please see: https://www.npmjs.com/package/glsl-read-float")):h(Y===qi,"Reading from a framebuffer is only allowed for the type 'uint8'")}));var ee=0,z=0,q=V.framebufferWidth,P=V.framebufferHeight,R=null;t(W)?R=W:W&&(h.type(W,"object","invalid arguments to regl.read()"),ee=W.x|0,z=W.y|0,h(ee>=0&&ee=0&&z0&&q+ee<=V.framebufferWidth,"invalid width for read pixels"),h(P>0&&P+z<=V.framebufferHeight,"invalid height for read pixels"),v();var K=q*P*4;return R||(Y===qi?R=new Uint8Array(K):Y===la&&(R=R||new Float32Array(K))),h.isTypedArray(R,"data buffer for regl.read() must be a typedarray"),h(R.byteLength>=K,"data buffer for regl.read() too small"),a.pixelStorei(xb,4),a.readPixels(ee,z,q,P,yb,Y,R),R}function G(W){var Y;return c.setFBO({framebuffer:W.framebuffer},function(){Y=j(W)}),Y}function X(W){return!W||!("framebuffer"in W)?j(W):G(W)}return X}function vi(a){return Array.prototype.slice.call(a)}function bi(a){return vi(a).join("")}function Eb(){var a=0,c=[],v=[];function V(Y){for(var ee=0;ee0&&(Y.push(P,"="),Y.push.apply(Y,vi(arguments)),Y.push(";")),P}return n(ee,{def:q,toString:function(){return bi([z.length>0?"var "+z.join(",")+";":"",bi(Y)])}})}function L(){var Y=I(),ee=I(),z=Y.toString,q=ee.toString;function P(R,K){ee(R,K,"=",Y.def(R,K),";")}return n(function(){Y.apply(Y,vi(arguments))},{def:Y.def,entry:Y,exit:ee,save:P,set:function(R,K,ue){P(R,K),Y(R,K,"=",ue,";")},toString:function(){return z()+q()}})}function D(){var Y=bi(arguments),ee=L(),z=L(),q=ee.toString,P=z.toString;return n(ee,{then:function(){return ee.apply(ee,vi(arguments)),this},else:function(){return z.apply(z,vi(arguments)),this},toString:function(){var R=P();return R&&(R="else{"+R+"}"),bi(["if(",Y,"){",q(),"}",R])}})}var j=I(),G={};function X(Y,ee){var z=[];function q(){var N="a"+z.length;return z.push(N),N}ee=ee||0;for(var P=0;P":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519},bn={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386},Ad={frag:Tb,vert:kb},rl={cw:gd,ccw:tl};function xa(a){return Array.isArray(a)||t(a)||Sr(a)}function Sd(a){return a.sort(function(c,v){return c===Yr?-1:v===Yr?1:c=1,V>=2,c)}else if(v===ua){var I=a.data;return new Tt(I.thisDep,I.contextDep,I.propDep,c)}else{if(v===Jc)return new Tt(!1,!1,!1,c);if(v===ed){for(var L=!1,D=!1,j=!1,G=0;G=1&&(D=!0),W>=2&&(j=!0)}else X.type===ua&&(L=L||X.data.thisDep,D=D||X.data.contextDep,j=j||X.data.propDep)}return new Tt(L,D,j,c)}else return new Tt(v===$o,v===Fo,v===Io,c)}}var Td=new Tt(!1,!1,!1,function(){});function Hb(a,c,v,V,I,L,D,j,G,X,W,Y,ee,z,q){var P=X.Record,R={add:32774,subtract:32778,"reverse subtract":32779};v.ext_blend_minmax&&(R.min=Nb,R.max=Gb);var K=v.angle_instanced_arrays,ue=v.webgl_draw_buffers,N=v.oes_vertex_array_object,oe={dirty:!0,profile:q.profile},ie={},ge=[],F={},M={};function pe(p){return p.replace(".","_")}function te(p,u,_){var E=pe(p);ge.push(p),ie[E]=oe[E]=!!_,F[E]=u}function H(p,u,_){var E=pe(p);ge.push(p),Array.isArray(_)?(oe[E]=_.slice(),ie[E]=_.slice()):oe[E]=ie[E]=_,M[E]=u}te(td,Rb),te(rd,Ob),H(nd,"blendColor",[0,0,0,0]),H(Bo,"blendEquationSeparate",[Cd,Cd]),H(No,"blendFuncSeparate",[xd,yd,xd,yd]),te(id,Mb,!0),H(sd,"depthFunc",Ub),H(ad,"depthRange",[0,1]),H(od,"depthMask",!0),H(Go,Go,[!0,!0,!0,!0]),te(ld,Vb),H(ud,"cullFace",Kn),H(jo,jo,tl),H(Uo,Uo,1),te(cd,Fb),H(zo,"polygonOffset",[0,0]),te(dd,$b),te(hd,Bb),H(Ho,"sampleCoverage",[1,!1]),te(pd,Db),H(fd,"stencilMask",-1),H(Ko,"stencilFunc",[jb,0,-1]),H(qo,"stencilOpSeparate",[is,vn,vn,vn]),H(Xi,"stencilOpSeparate",[Kn,vn,vn,vn]),te(md,Ib),H(ca,"scissor",[0,0,a.drawingBufferWidth,a.drawingBufferHeight]),H(Yr,Yr,[0,0,a.drawingBufferWidth,a.drawingBufferHeight]);var re={gl:a,context:ee,strings:c,next:ie,current:oe,draw:Y,elements:L,buffer:I,shader:W,attributes:X.state,vao:X,uniforms:G,framebuffer:j,extensions:v,timer:z,isBufferArgs:xa},ne={primTypes:fn,compareFuncs:Ci,blendFuncs:Dr,blendEquations:R,stencilOps:bn,glTypes:Fn,orientationType:rl};h.optional(function(){re.isArrayLike=pt}),ue&&(ne.backBuffer=[Kn],ne.drawBuffer=dr(V.maxDrawbuffers,function(p){return p===0?[0]:dr(p,function(u){return zb+u})}));var Le=0;function Te(){var p=Eb(),u=p.link,_=p.global;p.id=Le++,p.batchId="0";var E=u(re),S=p.shared={props:"a0"};Object.keys(re).forEach(function(b){S[b]=_.def(E,".",b)}),h.optional(function(){p.CHECK=u(h),p.commandStr=h.guessCommand(),p.command=u(p.commandStr),p.assert=function(b,f,A){b("if(!(",f,"))",this.CHECK,".commandRaise(",u(A),",",this.command,");")},ne.invalidBlendCombinations=Pd});var g=p.next={},w=p.current={};Object.keys(M).forEach(function(b){Array.isArray(oe[b])&&(g[b]=_.def(S.next,".",b),w[b]=_.def(S.current,".",b))});var C=p.constants={};Object.keys(ne).forEach(function(b){C[b]=_.def(JSON.stringify(ne[b]))}),p.invoke=function(b,f){switch(f.type){case Mo:var A=["this",S.context,S.props,p.batchId];return b.def(u(f.data),".call(",A.slice(0,Math.max(f.data.length+1,4)),")");case Io:return b.def(S.props,f.data);case Fo:return b.def(S.context,f.data);case $o:return b.def("this",f.data);case ua:return f.data.append(p,b),f.data.ref;case Jc:return f.data.toString();case ed:return f.data.map(function(T){return p.invoke(b,T)})}},p.attribCache={};var d={};return p.scopeAttrib=function(b){var f=c.id(b);if(f in d)return d[f];var A=X.scope[f];A||(A=X.scope[f]=new P);var T=d[f]=u(A);return T},p}function se(p){var u=p.static,_=p.dynamic,E;if(Yi in u){var S=!!u[Yi];E=yt(function(w,C){return S}),E.enable=S}else if(Yi in _){var g=_[Yi];E=sr(g,function(w,C){return w.invoke(C,g)})}return E}function le(p,u){var _=p.static,E=p.dynamic;if(jn in _){var S=_[jn];return S?(S=j.getFramebuffer(S),h.command(S,"invalid framebuffer object"),yt(function(w,C){var d=w.link(S),b=w.shared;C.set(b.framebuffer,".next",d);var f=b.context;return C.set(f,"."+gi,d+".width"),C.set(f,"."+yi,d+".height"),d})):yt(function(w,C){var d=w.shared;C.set(d.framebuffer,".next","null");var b=d.context;return C.set(b,"."+gi,b+"."+bd),C.set(b,"."+yi,b+"."+_d),"null"})}else if(jn in E){var g=E[jn];return sr(g,function(w,C){var d=w.invoke(C,g),b=w.shared,f=b.framebuffer,A=C.def(f,".getFramebuffer(",d,")");h.optional(function(){w.assert(C,"!"+d+"||"+A,"invalid framebuffer object")}),C.set(f,".next",A);var T=b.context;return C.set(T,"."+gi,A+"?"+A+".width:"+T+"."+bd),C.set(T,"."+yi,A+"?"+A+".height:"+T+"."+_d),A})}else return null}function Ee(p,u,_){var E=p.static,S=p.dynamic;function g(d){if(d in E){var b=E[d];h.commandType(b,"object","invalid "+d,_.commandStr);var f=!0,A=b.x|0,T=b.y|0,$,Q;return"width"in b?($=b.width|0,h.command($>=0,"invalid "+d,_.commandStr)):f=!1,"height"in b?(Q=b.height|0,h.command(Q>=0,"invalid "+d,_.commandStr)):f=!1,new Tt(!f&&u&&u.thisDep,!f&&u&&u.contextDep,!f&&u&&u.propDep,function(Z,ve){var ce=Z.shared.context,fe=$;"width"in b||(fe=ve.def(ce,".",gi,"-",A));var me=Q;return"height"in b||(me=ve.def(ce,".",yi,"-",T)),[A,T,fe,me]})}else if(d in S){var J=S[d],ae=sr(J,function(Z,ve){var ce=Z.invoke(ve,J);h.optional(function(){Z.assert(ve,ce+"&&typeof "+ce+'==="object"',"invalid "+d)});var fe=Z.shared.context,me=ve.def(ce,".x|0"),be=ve.def(ce,".y|0"),Pe=ve.def('"width" in ',ce,"?",ce,".width|0:","(",fe,".",gi,"-",me,")"),Je=ve.def('"height" in ',ce,"?",ce,".height|0:","(",fe,".",yi,"-",be,")");return h.optional(function(){Z.assert(ve,Pe+">=0&&"+Je+">=0","invalid "+d)}),[me,be,Pe,Je]});return u&&(ae.thisDep=ae.thisDep||u.thisDep,ae.contextDep=ae.contextDep||u.contextDep,ae.propDep=ae.propDep||u.propDep),ae}else return u?new Tt(u.thisDep,u.contextDep,u.propDep,function(Z,ve){var ce=Z.shared.context;return[0,0,ve.def(ce,".",gi),ve.def(ce,".",yi)]}):null}var w=g(Yr);if(w){var C=w;w=new Tt(w.thisDep,w.contextDep,w.propDep,function(d,b){var f=C.append(d,b),A=d.shared.context;return b.set(A,"."+Pb,f[2]),b.set(A,"."+Ab,f[3]),f})}return{viewport:w,scissor_box:g(ca)}}function ke(p,u){var _=p.static,E=typeof _[Zi]=="string"&&typeof _[Wi]=="string";if(E){if(Object.keys(u.dynamic).length>0)return null;var S=u.static,g=Object.keys(S);if(g.length>0&&typeof S[g[0]]=="number"){for(var w=[],C=0;C=0,"invalid "+ve,u.commandStr),yt(function(be,Pe){return ce&&(be.OFFSET=fe),fe})}else if(ve in E){var me=E[ve];return sr(me,function(be,Pe){var Je=be.invoke(Pe,me);return ce&&(be.OFFSET=Je,h.optional(function(){be.assert(Pe,Je+">=0","invalid "+ve)})),Je})}else if(ce){if(d)return yt(function(be,Pe){return be.OFFSET=0,0});if(g)return new Tt(C.thisDep,C.contextDep,C.propDep,function(be,Pe){return Pe.def(be.shared.vao+".currentVAO?"+be.shared.vao+".currentVAO.offset:0")})}else if(g)return new Tt(C.thisDep,C.contextDep,C.propDep,function(be,Pe){return Pe.def(be.shared.vao+".currentVAO?"+be.shared.vao+".currentVAO.instances:-1")});return null}var $=T(da,!0);function Q(){if(Hn in _){var ve=_[Hn]|0;return S.count=ve,h.command(typeof ve=="number"&&ve>=0,"invalid vertex count",u.commandStr),yt(function(){return ve})}else if(Hn in E){var ce=E[Hn];return sr(ce,function(Pe,Je){var Ot=Pe.invoke(Je,ce);return h.optional(function(){Pe.assert(Je,"typeof "+Ot+'==="number"&&'+Ot+">=0&&"+Ot+"===("+Ot+"|0)","invalid vertex count")}),Ot})}else if(d)if(_n(f)){if(f)return $?new Tt($.thisDep,$.contextDep,$.propDep,function(Pe,Je){var Ot=Je.def(Pe.ELEMENTS,".vertCount-",Pe.OFFSET);return h.optional(function(){Pe.assert(Je,Ot+">=0","invalid vertex offset/element buffer too small")}),Ot}):yt(function(Pe,Je){return Je.def(Pe.ELEMENTS,".vertCount")});var fe=yt(function(){return-1});return h.optional(function(){fe.MISSING=!0}),fe}else{var me=new Tt(f.thisDep||$.thisDep,f.contextDep||$.contextDep,f.propDep||$.propDep,function(Pe,Je){var Ot=Pe.ELEMENTS;return Pe.OFFSET?Je.def(Ot,"?",Ot,".vertCount-",Pe.OFFSET,":-1"):Je.def(Ot,"?",Ot,".vertCount:-1")});return h.optional(function(){me.DYNAMIC=!0}),me}else if(g){var be=new Tt(C.thisDep,C.contextDep,C.propDep,function(Pe,Je){return Je.def(Pe.shared.vao,".currentVAO?",Pe.shared.vao,".currentVAO.count:-1")});return be}return null}var J=A(),ae=Q(),Z=T(ha,!1);return{elements:f,primitive:J,count:ae,instances:Z,offset:$,vao:C,vaoActive:g,elementsActive:d,static:S}}function ct(p,u){var _=p.static,E=p.dynamic,S={};return ge.forEach(function(g){var w=pe(g);function C(d,b){if(g in _){var f=d(_[g]);S[w]=yt(function(){return f})}else if(g in E){var A=E[g];S[w]=sr(A,function(T,$){return b(T,$,T.invoke($,A))})}}switch(g){case ld:case rd:case td:case pd:case id:case md:case cd:case dd:case hd:case od:return C(function(d){return h.commandType(d,"boolean",g,u.commandStr),d},function(d,b,f){return h.optional(function(){d.assert(b,"typeof "+f+'==="boolean"',"invalid flag "+g,d.commandStr)}),f});case sd:return C(function(d){return h.commandParameter(d,Ci,"invalid "+g,u.commandStr),Ci[d]},function(d,b,f){var A=d.constants.compareFuncs;return h.optional(function(){d.assert(b,f+" in "+A,"invalid "+g+", must be one of "+Object.keys(Ci))}),b.def(A,"[",f,"]")});case ad:return C(function(d){return h.command(pt(d)&&d.length===2&&typeof d[0]=="number"&&typeof d[1]=="number"&&d[0]<=d[1],"depth range is 2d array",u.commandStr),d},function(d,b,f){h.optional(function(){d.assert(b,d.shared.isArrayLike+"("+f+")&&"+f+".length===2&&typeof "+f+'[0]==="number"&&typeof '+f+'[1]==="number"&&'+f+"[0]<="+f+"[1]","depth range must be a 2d array")});var A=b.def("+",f,"[0]"),T=b.def("+",f,"[1]");return[A,T]});case No:return C(function(d){h.commandType(d,"object","blend.func",u.commandStr);var b="srcRGB"in d?d.srcRGB:d.src,f="srcAlpha"in d?d.srcAlpha:d.src,A="dstRGB"in d?d.dstRGB:d.dst,T="dstAlpha"in d?d.dstAlpha:d.dst;return h.commandParameter(b,Dr,w+".srcRGB",u.commandStr),h.commandParameter(f,Dr,w+".srcAlpha",u.commandStr),h.commandParameter(A,Dr,w+".dstRGB",u.commandStr),h.commandParameter(T,Dr,w+".dstAlpha",u.commandStr),h.command(Pd.indexOf(b+", "+A)===-1,"unallowed blending combination (srcRGB, dstRGB) = ("+b+", "+A+")",u.commandStr),[Dr[b],Dr[A],Dr[f],Dr[T]]},function(d,b,f){var A=d.constants.blendFuncs;h.optional(function(){d.assert(b,f+"&&typeof "+f+'==="object"',"invalid blend func, must be an object")});function T(ce,fe){var me=b.def('"',ce,fe,'" in ',f,"?",f,".",ce,fe,":",f,".",ce);return h.optional(function(){d.assert(b,me+" in "+A,"invalid "+g+"."+ce+fe+", must be one of "+Object.keys(Dr))}),me}var $=T("src","RGB"),Q=T("dst","RGB");h.optional(function(){var ce=d.constants.invalidBlendCombinations;d.assert(b,ce+".indexOf("+$+'+", "+'+Q+") === -1 ","unallowed blending combination for (srcRGB, dstRGB)")});var J=b.def(A,"[",$,"]"),ae=b.def(A,"[",T("src","Alpha"),"]"),Z=b.def(A,"[",Q,"]"),ve=b.def(A,"[",T("dst","Alpha"),"]");return[J,Z,ae,ve]});case Bo:return C(function(d){if(typeof d=="string")return h.commandParameter(d,R,"invalid "+g,u.commandStr),[R[d],R[d]];if(typeof d=="object")return h.commandParameter(d.rgb,R,g+".rgb",u.commandStr),h.commandParameter(d.alpha,R,g+".alpha",u.commandStr),[R[d.rgb],R[d.alpha]];h.commandRaise("invalid blend.equation",u.commandStr)},function(d,b,f){var A=d.constants.blendEquations,T=b.def(),$=b.def(),Q=d.cond("typeof ",f,'==="string"');return h.optional(function(){function J(ae,Z,ve){d.assert(ae,ve+" in "+A,"invalid "+Z+", must be one of "+Object.keys(R))}J(Q.then,g,f),d.assert(Q.else,f+"&&typeof "+f+'==="object"',"invalid "+g),J(Q.else,g+".rgb",f+".rgb"),J(Q.else,g+".alpha",f+".alpha")}),Q.then(T,"=",$,"=",A,"[",f,"];"),Q.else(T,"=",A,"[",f,".rgb];",$,"=",A,"[",f,".alpha];"),b(Q),[T,$]});case nd:return C(function(d){return h.command(pt(d)&&d.length===4,"blend.color must be a 4d array",u.commandStr),dr(4,function(b){return+d[b]})},function(d,b,f){return h.optional(function(){d.assert(b,d.shared.isArrayLike+"("+f+")&&"+f+".length===4","blend.color must be a 4d array")}),dr(4,function(A){return b.def("+",f,"[",A,"]")})});case fd:return C(function(d){return h.commandType(d,"number",w,u.commandStr),d|0},function(d,b,f){return h.optional(function(){d.assert(b,"typeof "+f+'==="number"',"invalid stencil.mask")}),b.def(f,"|0")});case Ko:return C(function(d){h.commandType(d,"object",w,u.commandStr);var b=d.cmp||"keep",f=d.ref||0,A="mask"in d?d.mask:-1;return h.commandParameter(b,Ci,g+".cmp",u.commandStr),h.commandType(f,"number",g+".ref",u.commandStr),h.commandType(A,"number",g+".mask",u.commandStr),[Ci[b],f,A]},function(d,b,f){var A=d.constants.compareFuncs;h.optional(function(){function J(){d.assert(b,Array.prototype.join.call(arguments,""),"invalid stencil.func")}J(f+"&&typeof ",f,'==="object"'),J('!("cmp" in ',f,")||(",f,".cmp in ",A,")")});var T=b.def('"cmp" in ',f,"?",A,"[",f,".cmp]",":",vn),$=b.def(f,".ref|0"),Q=b.def('"mask" in ',f,"?",f,".mask|0:-1");return[T,$,Q]});case qo:case Xi:return C(function(d){h.commandType(d,"object",w,u.commandStr);var b=d.fail||"keep",f=d.zfail||"keep",A=d.zpass||"keep";return h.commandParameter(b,bn,g+".fail",u.commandStr),h.commandParameter(f,bn,g+".zfail",u.commandStr),h.commandParameter(A,bn,g+".zpass",u.commandStr),[g===Xi?Kn:is,bn[b],bn[f],bn[A]]},function(d,b,f){var A=d.constants.stencilOps;h.optional(function(){d.assert(b,f+"&&typeof "+f+'==="object"',"invalid "+g)});function T($){return h.optional(function(){d.assert(b,'!("'+$+'" in '+f+")||("+f+"."+$+" in "+A+")","invalid "+g+"."+$+", must be one of "+Object.keys(bn))}),b.def('"',$,'" in ',f,"?",A,"[",f,".",$,"]:",vn)}return[g===Xi?Kn:is,T("fail"),T("zfail"),T("zpass")]});case zo:return C(function(d){h.commandType(d,"object",w,u.commandStr);var b=d.factor|0,f=d.units|0;return h.commandType(b,"number",w+".factor",u.commandStr),h.commandType(f,"number",w+".units",u.commandStr),[b,f]},function(d,b,f){h.optional(function(){d.assert(b,f+"&&typeof "+f+'==="object"',"invalid "+g)});var A=b.def(f,".factor|0"),T=b.def(f,".units|0");return[A,T]});case ud:return C(function(d){var b=0;return d==="front"?b=is:d==="back"&&(b=Kn),h.command(!!b,w,u.commandStr),b},function(d,b,f){return h.optional(function(){d.assert(b,f+'==="front"||'+f+'==="back"',"invalid cull.face")}),b.def(f,'==="front"?',is,":",Kn)});case Uo:return C(function(d){return h.command(typeof d=="number"&&d>=V.lineWidthDims[0]&&d<=V.lineWidthDims[1],"invalid line width, must be a positive number between "+V.lineWidthDims[0]+" and "+V.lineWidthDims[1],u.commandStr),d},function(d,b,f){return h.optional(function(){d.assert(b,"typeof "+f+'==="number"&&'+f+">="+V.lineWidthDims[0]+"&&"+f+"<="+V.lineWidthDims[1],"invalid line width")}),f});case jo:return C(function(d){return h.commandParameter(d,rl,w,u.commandStr),rl[d]},function(d,b,f){return h.optional(function(){d.assert(b,f+'==="cw"||'+f+'==="ccw"',"invalid frontFace, must be one of cw,ccw")}),b.def(f+'==="cw"?'+gd+":"+tl)});case Go:return C(function(d){return h.command(pt(d)&&d.length===4,"color.mask must be length 4 array",u.commandStr),d.map(function(b){return!!b})},function(d,b,f){return h.optional(function(){d.assert(b,d.shared.isArrayLike+"("+f+")&&"+f+".length===4","invalid color.mask")}),dr(4,function(A){return"!!"+f+"["+A+"]"})});case Ho:return C(function(d){h.command(typeof d=="object"&&d,w,u.commandStr);var b="value"in d?d.value:1,f=!!d.invert;return h.command(typeof b=="number"&&b>=0&&b<=1,"sample.coverage.value must be a number between 0 and 1",u.commandStr),[b,f]},function(d,b,f){h.optional(function(){d.assert(b,f+"&&typeof "+f+'==="object"',"invalid sample.coverage")});var A=b.def('"value" in ',f,"?+",f,".value:1"),T=b.def("!!",f,".invert");return[A,T]})}}),S}function Fe(p,u){var _=p.static,E=p.dynamic,S={};return Object.keys(_).forEach(function(g){var w=_[g],C;if(typeof w=="number"||typeof w=="boolean")C=yt(function(){return w});else if(typeof w=="function"){var d=w._reglType;d==="texture2d"||d==="textureCube"?C=yt(function(b){return b.link(w)}):d==="framebuffer"||d==="framebufferCube"?(h.command(w.color.length>0,'missing color attachment for framebuffer sent to uniform "'+g+'"',u.commandStr),C=yt(function(b){return b.link(w.color[0])})):h.commandRaise('invalid data for uniform "'+g+'"',u.commandStr)}else pt(w)?C=yt(function(b){var f=b.global.def("[",dr(w.length,function(A){return h.command(typeof w[A]=="number"||typeof w[A]=="boolean","invalid uniform "+g,b.commandStr),w[A]}),"]");return f}):h.commandRaise('invalid or missing data for uniform "'+g+'"',u.commandStr);C.value=w,S[g]=C}),Object.keys(E).forEach(function(g){var w=E[g];S[g]=sr(w,function(C,d){return C.invoke(d,w)})}),S}function Ct(p,u){var _=p.static,E=p.dynamic,S={};return Object.keys(_).forEach(function(g){var w=_[g],C=c.id(g),d=new P;if(xa(w))d.state=wi,d.buffer=I.getBuffer(I.create(w,xi,!1,!0)),d.type=0;else{var b=I.getBuffer(w);if(b)d.state=wi,d.buffer=b,d.type=0;else if(h.command(typeof w=="object"&&w,"invalid data for attribute "+g,u.commandStr),"constant"in w){var f=w.constant;d.buffer="null",d.state=Do,typeof f=="number"?d.x=f:(h.command(pt(f)&&f.length>0&&f.length<=4,"invalid constant for attribute "+g,u.commandStr),_i.forEach(function(Z,ve){ve=0,'invalid offset for attribute "'+g+'"',u.commandStr);var T=w.stride|0;h.command(T>=0&&T<256,'invalid stride for attribute "'+g+'", must be integer betweeen [0, 255]',u.commandStr);var $=w.size|0;h.command(!("size"in w)||$>0&&$<=4,'invalid size for attribute "'+g+'", must be 1,2,3,4',u.commandStr);var Q=!!w.normalized,J=0;"type"in w&&(h.commandParameter(w.type,Fn,"invalid type for attribute "+g,u.commandStr),J=Fn[w.type]);var ae=w.divisor|0;h.optional(function(){"divisor"in w&&(h.command(ae===0||K,'cannot specify divisor for attribute "'+g+'", instancing not supported',u.commandStr),h.command(ae>=0,'invalid divisor for attribute "'+g+'"',u.commandStr));var Z=u.commandStr,ve=["buffer","offset","divisor","normalized","type","size","stride"];Object.keys(w).forEach(function(ce){h.command(ve.indexOf(ce)>=0,'unknown parameter "'+ce+'" for attribute pointer "'+g+'" (valid parameters are '+ve+")",Z)})}),d.buffer=b,d.state=wi,d.size=$,d.normalized=Q,d.type=J||b.dtype,d.offset=A,d.stride=T,d.divisor=ae}}S[g]=yt(function(Z,ve){var ce=Z.attribCache;if(C in ce)return ce[C];var fe={isStream:!1};return Object.keys(d).forEach(function(me){fe[me]=d[me]}),d.buffer&&(fe.buffer=Z.link(d.buffer),fe.type=fe.type||fe.buffer+".dtype"),ce[C]=fe,fe})}),Object.keys(E).forEach(function(g){var w=E[g];function C(d,b){var f=d.invoke(b,w),A=d.shared,T=d.constants,$=A.isBufferArgs,Q=A.buffer;h.optional(function(){d.assert(b,f+"&&(typeof "+f+'==="object"||typeof '+f+'==="function")&&('+$+"("+f+")||"+Q+".getBuffer("+f+")||"+Q+".getBuffer("+f+".buffer)||"+$+"("+f+'.buffer)||("constant" in '+f+"&&(typeof "+f+'.constant==="number"||'+A.isArrayLike+"("+f+".constant))))",'invalid dynamic attribute "'+g+'"')});var J={isStream:b.def(!1)},ae=new P;ae.state=wi,Object.keys(ae).forEach(function(fe){J[fe]=b.def(""+ae[fe])});var Z=J.buffer,ve=J.type;b("if(",$,"(",f,")){",J.isStream,"=true;",Z,"=",Q,".createStream(",xi,",",f,");",ve,"=",Z,".dtype;","}else{",Z,"=",Q,".getBuffer(",f,");","if(",Z,"){",ve,"=",Z,".dtype;",'}else if("constant" in ',f,"){",J.state,"=",Do,";","if(typeof "+f+'.constant === "number"){',J[_i[0]],"=",f,".constant;",_i.slice(1).map(function(fe){return J[fe]}).join("="),"=0;","}else{",_i.map(function(fe,me){return J[fe]+"="+f+".constant.length>"+me+"?"+f+".constant["+me+"]:0;"}).join(""),"}}else{","if(",$,"(",f,".buffer)){",Z,"=",Q,".createStream(",xi,",",f,".buffer);","}else{",Z,"=",Q,".getBuffer(",f,".buffer);","}",ve,'="type" in ',f,"?",T.glTypes,"[",f,".type]:",Z,".dtype;",J.normalized,"=!!",f,".normalized;");function ce(fe){b(J[fe],"=",f,".",fe,"|0;")}return ce("size"),ce("offset"),ce("stride"),ce("divisor"),b("}}"),b.exit("if(",J.isStream,"){",Q,".destroyStream(",Z,");","}"),J}S[g]=sr(w,C)}),S}function ot(p){var u=p.static,_=p.dynamic,E={};return Object.keys(u).forEach(function(S){var g=u[S];E[S]=yt(function(w,C){return typeof g=="number"||typeof g=="boolean"?""+g:w.link(g)})}),Object.keys(_).forEach(function(S){var g=_[S];E[S]=sr(g,function(w,C){return w.invoke(C,g)})}),E}function xt(p,u,_,E,S){var g=p.static,w=p.dynamic;h.optional(function(){var ce=[jn,Wi,Zi,Un,zn,da,Hn,ha,Yi,Qi].concat(ge);function fe(me){Object.keys(me).forEach(function(be){h.command(ce.indexOf(be)>=0,'unknown parameter "'+be+'"',S.commandStr)})}fe(g),fe(w)});var C=ke(p,u),d=le(p),b=Ee(p,d,S),f=lt(p,S),A=ct(p,S),T=De(p,S,C);function $(ce){var fe=b[ce];fe&&(A[ce]=fe)}$(Yr),$(pe(ca));var Q=Object.keys(A).length>0,J={framebuffer:d,draw:f,shader:T,state:A,dirty:Q,scopeVAO:null,drawVAO:null,useVAO:!1,attributes:{}};if(J.profile=se(p),J.uniforms=Fe(_,S),J.drawVAO=J.scopeVAO=f.vao,!J.drawVAO&&T.program&&!C&&v.angle_instanced_arrays&&f.static.elements){var ae=!0,Z=T.program.attributes.map(function(ce){var fe=u.static[ce];return ae=ae&&!!fe,fe});if(ae&&Z.length>0){var ve=X.getVAO(X.createVAO({attributes:Z,elements:f.static.elements}));J.drawVAO=new Tt(null,null,null,function(ce,fe){return ce.link(ve)}),J.useVAO=!0}}return C?J.useVAO=!0:J.attributes=Ct(u,S),J.context=ot(E),J}function Et(p,u,_){var E=p.shared,S=E.context,g=p.scope();Object.keys(_).forEach(function(w){u.save(S,"."+w);var C=_[w],d=C.append(p,u);Array.isArray(d)?g(S,".",w,"=[",d.join(),"];"):g(S,".",w,"=",d,";")}),u(g)}function Pt(p,u,_,E){var S=p.shared,g=S.gl,w=S.framebuffer,C;ue&&(C=u.def(S.extensions,".webgl_draw_buffers"));var d=p.constants,b=d.drawBuffer,f=d.backBuffer,A;_?A=_.append(p,u):A=u.def(w,".next"),E||u("if(",A,"!==",w,".cur){"),u("if(",A,"){",g,".bindFramebuffer(",Ed,",",A,".framebuffer);"),ue&&u(C,".drawBuffersWEBGL(",b,"[",A,".colorAttachments.length]);"),u("}else{",g,".bindFramebuffer(",Ed,",null);"),ue&&u(C,".drawBuffersWEBGL(",f,");"),u("}",w,".cur=",A,";"),E||u("}")}function Vt(p,u,_){var E=p.shared,S=E.gl,g=p.current,w=p.next,C=E.current,d=E.next,b=p.cond(C,".dirty");ge.forEach(function(f){var A=pe(f);if(!(A in _.state)){var T,$;if(A in w){T=w[A],$=g[A];var Q=dr(oe[A].length,function(ae){return b.def(T,"[",ae,"]")});b(p.cond(Q.map(function(ae,Z){return ae+"!=="+$+"["+Z+"]"}).join("||")).then(S,".",M[A],"(",Q,");",Q.map(function(ae,Z){return $+"["+Z+"]="+ae}).join(";"),";"))}else{T=b.def(d,".",A);var J=p.cond(T,"!==",C,".",A);b(J),A in F?J(p.cond(T).then(S,".enable(",F[A],");").else(S,".disable(",F[A],");"),C,".",A,"=",T,";"):J(S,".",M[A],"(",T,");",C,".",A,"=",T,";")}}}),Object.keys(_.state).length===0&&b(C,".dirty=false;"),u(b)}function Nt(p,u,_,E){var S=p.shared,g=p.current,w=S.current,C=S.gl;Sd(Object.keys(_)).forEach(function(d){var b=_[d];if(!(E&&!E(b))){var f=b.append(p,u);if(F[d]){var A=F[d];_n(b)?f?u(C,".enable(",A,");"):u(C,".disable(",A,");"):u(p.cond(f).then(C,".enable(",A,");").else(C,".disable(",A,");")),u(w,".",d,"=",f,";")}else if(pt(f)){var T=g[d];u(C,".",M[d],"(",f,");",f.map(function($,Q){return T+"["+Q+"]="+$}).join(";"),";")}else u(C,".",M[d],"(",f,");",w,".",d,"=",f,";")}})}function ft(p,u){K&&(p.instancing=u.def(p.shared.extensions,".angle_instanced_arrays"))}function Oe(p,u,_,E,S){var g=p.shared,w=p.stats,C=g.current,d=g.timer,b=_.profile;function f(){return typeof performance>"u"?"Date.now()":"performance.now()"}var A,T;function $(ce){A=u.def(),ce(A,"=",f(),";"),typeof S=="string"?ce(w,".count+=",S,";"):ce(w,".count++;"),z&&(E?(T=u.def(),ce(T,"=",d,".getNumPendingQueries();")):ce(d,".beginQuery(",w,");"))}function Q(ce){ce(w,".cpuTime+=",f(),"-",A,";"),z&&(E?ce(d,".pushScopeStats(",T,",",d,".getNumPendingQueries(),",w,");"):ce(d,".endQuery();"))}function J(ce){var fe=u.def(C,".profile");u(C,".profile=",ce,";"),u.exit(C,".profile=",fe,";")}var ae;if(b){if(_n(b)){b.enable?($(u),Q(u.exit),J("true")):J("false");return}ae=b.append(p,u),J(ae)}else ae=u.def(C,".profile");var Z=p.block();$(Z),u("if(",ae,"){",Z,"}");var ve=p.block();Q(ve),u.exit("if(",ae,"){",ve,"}")}function Gt(p,u,_,E,S){var g=p.shared;function w(d){switch(d){case pa:case va:case wa:return 2;case fa:case ba:case ga:return 3;case ma:case _a:case ya:return 4;default:return 1}}function C(d,b,f){var A=g.gl,T=u.def(d,".location"),$=u.def(g.attributes,"[",T,"]"),Q=f.state,J=f.buffer,ae=[f.x,f.y,f.z,f.w],Z=["buffer","normalized","offset","stride"];function ve(){u("if(!",$,".buffer){",A,".enableVertexAttribArray(",T,");}");var fe=f.type,me;if(f.size?me=u.def(f.size,"||",b):me=b,u("if(",$,".type!==",fe,"||",$,".size!==",me,"||",Z.map(function(Pe){return $+"."+Pe+"!=="+f[Pe]}).join("||"),"){",A,".bindBuffer(",xi,",",J,".buffer);",A,".vertexAttribPointer(",[T,me,fe,f.normalized,f.stride,f.offset],");",$,".type=",fe,";",$,".size=",me,";",Z.map(function(Pe){return $+"."+Pe+"="+f[Pe]+";"}).join(""),"}"),K){var be=f.divisor;u("if(",$,".divisor!==",be,"){",p.instancing,".vertexAttribDivisorANGLE(",[T,be],");",$,".divisor=",be,";}")}}function ce(){u("if(",$,".buffer){",A,".disableVertexAttribArray(",T,");",$,".buffer=null;","}if(",_i.map(function(fe,me){return $+"."+fe+"!=="+ae[me]}).join("||"),"){",A,".vertexAttrib4f(",T,",",ae,");",_i.map(function(fe,me){return $+"."+fe+"="+ae[me]+";"}).join(""),"}")}Q===wi?ve():Q===Do?ce():(u("if(",Q,"===",wi,"){"),ve(),u("}else{"),ce(),u("}"))}E.forEach(function(d){var b=d.name,f=_.attributes[b],A;if(f){if(!S(f))return;A=f.append(p,u)}else{if(!S(Td))return;var T=p.scopeAttrib(b);h.optional(function(){p.assert(u,T+".state","missing attribute "+b)}),A={},Object.keys(new P).forEach(function($){A[$]=u.def(T,".",$)})}C(p.link(d),w(d.info.type),A)})}function ze(p,u,_,E,S,g){for(var w=p.shared,C=w.gl,d,b=0;b1){for(var Ot=[],Wr=[],Zr=0;Zr=0","missing vertex count")})):(be=Pe.def(w,".",Hn),h.optional(function(){p.assert(Pe,be+">=0","missing vertex count")})),be}var f=d();function A(me){var be=C[me];return be?be.contextDep&&E.contextDynamic||be.propDep?be.append(p,_):be.append(p,u):u.def(w,".",me)}var T=A(zn),$=A(da),Q=b();if(typeof Q=="number"){if(Q===0)return}else _("if(",Q,"){"),_.exit("}");var J,ae;K&&(J=A(ha),ae=p.instancing);var Z=f+".type",ve=C.elements&&_n(C.elements)&&!C.vaoActive;function ce(){function me(){_(ae,".drawElementsInstancedANGLE(",[T,Q,Z,$+"<<(("+Z+"-"+Qc+")>>1)",J],");")}function be(){_(ae,".drawArraysInstancedANGLE(",[T,$,Q,J],");")}f&&f!=="null"?ve?me():(_("if(",f,"){"),me(),_("}else{"),be(),_("}")):be()}function fe(){function me(){_(g+".drawElements("+[T,Q,Z,$+"<<(("+Z+"-"+Qc+")>>1)"]+");")}function be(){_(g+".drawArrays("+[T,$,Q]+");")}f&&f!=="null"?ve?me():(_("if(",f,"){"),me(),_("}else{"),be(),_("}")):be()}K&&(typeof J!="number"||J>=0)?typeof J=="string"?(_("if(",J,">0){"),ce(),_("}else if(",J,"<0){"),fe(),_("}")):ce():fe()}function Me(p,u,_,E,S){var g=Te(),w=g.proc("body",S);return h.optional(function(){g.commandStr=u.commandStr,g.command=g.link(u.commandStr)}),K&&(g.instancing=w.def(g.shared.extensions,".angle_instanced_arrays")),p(g,w,_,E),g.compile().body}function Be(p,u,_,E){ft(p,u),_.useVAO?_.drawVAO?u(p.shared.vao,".setVAO(",_.drawVAO.append(p,u),");"):u(p.shared.vao,".setVAO(",p.shared.vao,".targetVAO);"):(u(p.shared.vao,".setVAO(null);"),Gt(p,u,_,E.attributes,function(){return!0})),ze(p,u,_,E.uniforms,function(){return!0},!1),xe(p,u,u,_)}function mt(p,u){var _=p.proc("draw",1);ft(p,_),Et(p,_,u.context),Pt(p,_,u.framebuffer),Vt(p,_,u),Nt(p,_,u.state),Oe(p,_,u,!1,!0);var E=u.shader.progVar.append(p,_);if(_(p.shared.gl,".useProgram(",E,".program);"),u.shader.program)Be(p,_,u,u.shader.program);else{_(p.shared.vao,".setVAO(null);");var S=p.global.def("{}"),g=_.def(E,".id"),w=_.def(S,"[",g,"]");_(p.cond(w).then(w,".call(this,a0);").else(w,"=",S,"[",g,"]=",p.link(function(C){return Me(Be,p,u,C,1)}),"(",E,");",w,".call(this,a0);"))}Object.keys(u.state).length>0&&_(p.shared.current,".dirty=true;"),p.shared.vao&&_(p.shared.vao,".setVAO(null);")}function Mr(p,u,_,E){p.batchId="a1",ft(p,u);function S(){return!0}Gt(p,u,_,E.attributes,S),ze(p,u,_,E.uniforms,S,!1),xe(p,u,u,_)}function qn(p,u,_,E){ft(p,u);var S=_.contextDep,g=u.def(),w="a0",C="a1",d=u.def();p.shared.props=d,p.batchId=g;var b=p.scope(),f=p.scope();u(b.entry,"for(",g,"=0;",g,"<",C,";++",g,"){",d,"=",w,"[",g,"];",f,"}",b.exit);function A(Z){return Z.contextDep&&S||Z.propDep}function T(Z){return!A(Z)}if(_.needsContext&&Et(p,f,_.context),_.needsFramebuffer&&Pt(p,f,_.framebuffer),Nt(p,f,_.state,A),_.profile&&A(_.profile)&&Oe(p,f,_,!1,!0),E)_.useVAO?_.drawVAO?A(_.drawVAO)?f(p.shared.vao,".setVAO(",_.drawVAO.append(p,f),");"):b(p.shared.vao,".setVAO(",_.drawVAO.append(p,b),");"):b(p.shared.vao,".setVAO(",p.shared.vao,".targetVAO);"):(b(p.shared.vao,".setVAO(null);"),Gt(p,b,_,E.attributes,T),Gt(p,f,_,E.attributes,A)),ze(p,b,_,E.uniforms,T,!1),ze(p,f,_,E.uniforms,A,!0),xe(p,b,f,_);else{var $=p.global.def("{}"),Q=_.shader.progVar.append(p,f),J=f.def(Q,".id"),ae=f.def($,"[",J,"]");f(p.shared.gl,".useProgram(",Q,".program);","if(!",ae,"){",ae,"=",$,"[",J,"]=",p.link(function(Z){return Me(Mr,p,_,Z,2)}),"(",Q,");}",ae,".call(this,a0[",g,"],",g,");")}}function m(p,u){var _=p.proc("batch",2);p.batchId="0",ft(p,_);var E=!1,S=!0;Object.keys(u.context).forEach(function($){E=E||u.context[$].propDep}),E||(Et(p,_,u.context),S=!1);var g=u.framebuffer,w=!1;g?(g.propDep?E=w=!0:g.contextDep&&E&&(w=!0),w||Pt(p,_,g)):Pt(p,_,null),u.state.viewport&&u.state.viewport.propDep&&(E=!0);function C($){return $.contextDep&&E||$.propDep}Vt(p,_,u),Nt(p,_,u.state,function($){return!C($)}),(!u.profile||!C(u.profile))&&Oe(p,_,u,!1,"a1"),u.contextDep=E,u.needsContext=S,u.needsFramebuffer=w;var d=u.shader.progVar;if(d.contextDep&&E||d.propDep)qn(p,_,u,null);else{var b=d.append(p,_);if(_(p.shared.gl,".useProgram(",b,".program);"),u.shader.program)qn(p,_,u,u.shader.program);else{_(p.shared.vao,".setVAO(null);");var f=p.global.def("{}"),A=_.def(b,".id"),T=_.def(f,"[",A,"]");_(p.cond(T).then(T,".call(this,a0,a1);").else(T,"=",f,"[",A,"]=",p.link(function($){return Me(qn,p,u,$,2)}),"(",b,");",T,".call(this,a0,a1);"))}}Object.keys(u.state).length>0&&_(p.shared.current,".dirty=true;"),p.shared.vao&&_(p.shared.vao,".setVAO(null);")}function O(p,u){var _=p.proc("scope",3);p.batchId="a2";var E=p.shared,S=E.current;Et(p,_,u.context),u.framebuffer&&u.framebuffer.append(p,_),Sd(Object.keys(u.state)).forEach(function(w){var C=u.state[w],d=C.append(p,_);pt(d)?d.forEach(function(b,f){_.set(p.next[w],"["+f+"]",b)}):_.set(E.next,"."+w,d)}),Oe(p,_,u,!0,!0),[Un,da,Hn,ha,zn].forEach(function(w){var C=u.draw[w];C&&_.set(E.draw,"."+w,""+C.append(p,_))}),Object.keys(u.uniforms).forEach(function(w){var C=u.uniforms[w].append(p,_);Array.isArray(C)&&(C="["+C.join()+"]"),_.set(E.uniforms,"["+c.id(w)+"]",C)}),Object.keys(u.attributes).forEach(function(w){var C=u.attributes[w].append(p,_),d=p.scopeAttrib(w);Object.keys(new P).forEach(function(b){_.set(d,"."+b,C[b])})}),u.scopeVAO&&_.set(E.vao,".targetVAO",u.scopeVAO.append(p,_));function g(w){var C=u.shader[w];C&&_.set(E.shader,"."+w,C.append(p,_))}g(Wi),g(Zi),Object.keys(u.state).length>0&&(_(S,".dirty=true;"),_.exit(S,".dirty=true;")),_("a1(",p.shared.context,",a0,",p.batchId,");")}function k(p){if(!(typeof p!="object"||pt(p))){for(var u=Object.keys(p),_=0;_=0;--xe){var Me=ne[xe];Me&&Me(z,null,0)}v.flush(),X&&X.update()}function ke(){!le&&ne.length>0&&(le=qr.next(Ee))}function De(){le&&(qr.cancel(Ee),le=null)}function lt(xe){xe.preventDefault(),I=!0,De(),Le.forEach(function(Me){Me()})}function ct(xe){v.getError(),I=!1,L.restore(),ie.restore(),K.restore(),ge.restore(),F.restore(),M.restore(),N.restore(),X&&X.restore(),pe.procs.refresh(),ke(),Te.forEach(function(Me){Me()})}re&&(re.addEventListener(Ld,lt,!1),re.addEventListener(Vd,ct,!1));function Fe(){ne.length=0,De(),re&&(re.removeEventListener(Ld,lt),re.removeEventListener(Vd,ct)),ie.clear(),M.clear(),F.clear(),N.clear(),ge.clear(),ue.clear(),K.clear(),X&&X.clear(),se.forEach(function(xe){xe()})}function Ct(xe){h(!!xe,"invalid args to regl({...})"),h.type(xe,"object","invalid args to regl({...})");function Me(S){var g=n({},S);delete g.uniforms,delete g.attributes,delete g.context,delete g.vao,"stencil"in g&&g.stencil.op&&(g.stencil.opBack=g.stencil.opFront=g.stencil.op,delete g.stencil.op);function w(C){if(C in g){var d=g[C];delete g[C],Object.keys(d).forEach(function(b){g[C+"."+b]=d[b]})}}return w("blend"),w("depth"),w("cull"),w("stencil"),w("polygonOffset"),w("scissor"),w("sample"),"vao"in S&&(g.vao=S.vao),g}function Be(S,g){var w={},C={};return Object.keys(S).forEach(function(d){var b=S[d];if(wt.isDynamic(b)){C[d]=wt.unbox(b,d);return}else if(g&&Array.isArray(b)){for(var f=0;f0)return Re.call(this,_(S|0),S|0)}else if(Array.isArray(S)){if(S.length)return Re.call(this,S,S.length)}else return he.call(this,S)}return n(E,{stats:O,destroy:function(){k.destroy()}})}var ot=M.setFBO=Ct({framebuffer:wt.define.call(null,Od,"framebuffer")});function xt(xe,Me){var Be=0;pe.procs.poll();var mt=Me.color;mt&&(v.clearColor(+mt[0]||0,+mt[1]||0,+mt[2]||0,+mt[3]||0),Be|=Wb),"depth"in Me&&(v.clearDepth(+Me.depth),Be|=Zb),"stencil"in Me&&(v.clearStencil(Me.stencil|0),Be|=Qb),h(!!Be,"called regl.clear with no buffer specified"),v.clear(Be)}function Et(xe){if(h(typeof xe=="object"&&xe,"regl.clear() takes an object as input"),"framebuffer"in xe)if(xe.framebuffer&&xe.framebuffer_reglType==="framebufferCube")for(var Me=0;Me<6;++Me)ot(n({framebuffer:xe.framebuffer.faces[Me]},xe),xt);else ot(xe,xt);else xt(null,xe)}function Pt(xe){h.type(xe,"function","regl.frame() callback must be a function"),ne.push(xe);function Me(){var Be=Rd(ne,xe);h(Be>=0,"cannot cancel a frame twice");function mt(){var Mr=Rd(ne,mt);ne[Mr]=ne[ne.length-1],ne.length-=1,ne.length<=0&&De()}ne[Be]=mt}return ke(),{cancel:Me}}function Vt(){var xe=H.viewport,Me=H.scissor_box;xe[0]=xe[1]=Me[0]=Me[1]=0,z.viewportWidth=z.framebufferWidth=z.drawingBufferWidth=xe[2]=Me[2]=v.drawingBufferWidth,z.viewportHeight=z.framebufferHeight=z.drawingBufferHeight=xe[3]=Me[3]=v.drawingBufferHeight}function Nt(){z.tick+=1,z.time=Oe(),Vt(),pe.procs.poll()}function ft(){ge.refresh(),Vt(),pe.procs.refresh(),X&&X.update()}function Oe(){return(hn()-W)/1e3}ft();function Gt(xe,Me){h.type(Me,"function","listener callback must be a function");var Be;switch(xe){case"frame":return Pt(Me);case"lost":Be=Le;break;case"restore":Be=Te;break;case"destroy":Be=se;break;default:h.raise("invalid event, must be one of frame,lost,restore,destroy")}return Be.push(Me),{cancel:function(){for(var mt=0;mt=0},read:te,destroy:Fe,_gl:v,_refresh:ft,poll:function(){Nt(),X&&X.update()},now:Oe,stats:j});return c.onDone(null,ze),ze}return r_}))})(ka)),ka.exports}var j_=G_();const hP=B_(j_);function ut(r){return r==null}function Gl(r){return r!==null&&typeof r=="object"}function Pl(r){return r!==null&&typeof r=="object"}function U_(r,e){if(r.length!==e.length)return!1;for(let t=0;t{const s=r[i],o=e[i];return Pl(s)&&Pl(o)?Object.assign(Object.assign({},n),{[i]:Jn(s,o)}):Object.assign(Object.assign({},n),{[i]:i in e?o:s})},{})}function jl(r){return Gl(r)?"target"in r:!1}const z_={alreadydisposed:()=>"View has been already disposed",invalidparams:r=>`Invalid parameters for '${r.name}'`,nomatchingcontroller:r=>`No matching controller for '${r.key}'`,nomatchingview:r=>`No matching view for '${JSON.stringify(r.params)}'`,notbindable:()=>"Value is not bindable",notcompatible:r=>`Not compatible with plugin '${r.id}'`,propertynotfound:r=>`Property '${r.name}' not found`,shouldneverhappen:()=>"This error should never happen"};let qt=class Ti{static alreadyDisposed(){return new Ti({type:"alreadydisposed"})}static notBindable(){return new Ti({type:"notbindable"})}static notCompatible(e,t){return new Ti({type:"notcompatible",context:{id:`${e}.${t}`}})}static propertyNotFound(e){return new Ti({type:"propertynotfound",context:{name:e}})}static shouldNeverHappen(){return new Ti({type:"shouldneverhappen"})}constructor(e){var t;this.message=(t=z_[e.type](e.context))!==null&&t!==void 0?t:"Unexpected error",this.name=this.constructor.name,this.stack=new Error(this.message).stack,this.type=e.type}toString(){return this.message}},Gd=class Xh{constructor(e,t){this.obj_=e,this.key=t}static isBindable(e){return!(e===null||typeof e!="object"&&typeof e!="function")}read(){return this.obj_[this.key]}write(e){this.obj_[this.key]=e}writeProperty(e,t){const n=this.read();if(!Xh.isBindable(n))throw qt.notBindable();if(!(e in n))throw qt.propertyNotFound(e);n[e]=t}},kt=class{constructor(){this.observers_={}}on(e,t,n){var i;let s=this.observers_[e];return s||(s=this.observers_[e]=[]),s.push({handler:t,key:(i=n?.key)!==null&&i!==void 0?i:t}),this}off(e,t){const n=this.observers_[e];return n&&(this.observers_[e]=n.filter(i=>i.key!==t)),this}emit(e,t){const n=this.observers_[e];n&&n.forEach(i=>{i.handler(t)})}},H_=class{constructor(e,t){var n;this.constraint_=t?.constraint,this.equals_=(n=t?.equals)!==null&&n!==void 0?n:((i,s)=>i===s),this.emitter=new kt,this.rawValue_=e}get constraint(){return this.constraint_}get rawValue(){return this.rawValue_}set rawValue(e){this.setRawValue(e,{forceEmit:!1,last:!0})}setRawValue(e,t){const n=t??{forceEmit:!1,last:!0},i=this.constraint_?this.constraint_.constrain(e):e,s=this.rawValue_;this.equals_(s,i)&&!n.forceEmit||(this.emitter.emit("beforechange",{sender:this}),this.rawValue_=i,this.emitter.emit("change",{options:n,previousRawValue:s,rawValue:i,sender:this}))}},K_=class{constructor(e){this.emitter=new kt,this.value_=e}get rawValue(){return this.value_}set rawValue(e){this.setRawValue(e,{forceEmit:!1,last:!0})}setRawValue(e,t){const n=t??{forceEmit:!1,last:!0},i=this.value_;i===e&&!n.forceEmit||(this.emitter.emit("beforechange",{sender:this}),this.value_=e,this.emitter.emit("change",{options:n,previousRawValue:i,rawValue:this.value_,sender:this}))}},q_=class{constructor(e){this.emitter=new kt,this.onValueBeforeChange_=this.onValueBeforeChange_.bind(this),this.onValueChange_=this.onValueChange_.bind(this),this.value_=e,this.value_.emitter.on("beforechange",this.onValueBeforeChange_),this.value_.emitter.on("change",this.onValueChange_)}get rawValue(){return this.value_.rawValue}onValueBeforeChange_(e){this.emitter.emit("beforechange",Object.assign(Object.assign({},e),{sender:this}))}onValueChange_(e){this.emitter.emit("change",Object.assign(Object.assign({},e),{sender:this}))}};function dt(r,e){const t=e?.constraint,n=e?.equals;return!t&&!n?new K_(r):new H_(r,e)}function X_(r){return[new q_(r),(e,t)=>{r.setRawValue(e,t)}]}let Ue=class Yh{constructor(e){this.emitter=new kt,this.valMap_=e;for(const t in this.valMap_)this.valMap_[t].emitter.on("change",()=>{this.emitter.emit("change",{key:t,sender:this})})}static createCore(e){return Object.keys(e).reduce((n,i)=>Object.assign(n,{[i]:dt(e[i])}),{})}static fromObject(e){const t=this.createCore(e);return new Yh(t)}get(e){return this.valMap_[e].rawValue}set(e,t){this.valMap_[e].rawValue=t}value(e){return this.valMap_[e]}},Ts=class{constructor(e){this.values=Ue.fromObject({max:e.max,min:e.min})}constrain(e){const t=this.values.get("max"),n=this.values.get("min");return Math.min(Math.max(e,n),t)}},Y_=class{constructor(e){this.values=Ue.fromObject({max:e.max,min:e.min})}constrain(e){const t=this.values.get("max"),n=this.values.get("min");let i=e;return ut(n)||(i=Math.max(i,n)),ut(t)||(i=Math.min(i,t)),i}},W_=class{constructor(e,t=0){this.step=e,this.origin=t}constrain(e){const t=this.origin%this.step,n=Math.round((e-t)/this.step);return t+n*this.step}},Z_=class{constructor(e){this.text=e}evaluate(){return Number(this.text)}toString(){return this.text}};const Q_={"**":(r,e)=>Math.pow(r,e),"*":(r,e)=>r*e,"/":(r,e)=>r/e,"%":(r,e)=>r%e,"+":(r,e)=>r+e,"-":(r,e)=>r-e,"<<":(r,e)=>r<>":(r,e)=>r>>e,">>>":(r,e)=>r>>>e,"&":(r,e)=>r&e,"^":(r,e)=>r^e,"|":(r,e)=>r|e};let J_=class{constructor(e,t,n){this.left=t,this.operator=e,this.right=n}evaluate(){const e=Q_[this.operator];if(!e)throw new Error(`unexpected binary operator: '${this.operator}`);return e(this.left.evaluate(),this.right.evaluate())}toString(){return["b(",this.left.toString(),this.operator,this.right.toString(),")"].join(" ")}};const ew={"+":r=>r,"-":r=>-r,"~":r=>~r};let tw=class{constructor(e,t){this.operator=e,this.expression=t}evaluate(){const e=ew[this.operator];if(!e)throw new Error(`unexpected unary operator: '${this.operator}`);return e(this.expression.evaluate())}toString(){return["u(",this.operator,this.expression.toString(),")"].join(" ")}};function Ul(r){return(e,t)=>{for(let n=0;ne.startsWith(i,t))[0];return n?(t+=n.length,t+=_s(e,t).length,{cursor:t,operator:n}):null}function gw(r,e){return(t,n)=>{const i=r(t,n);if(!i)return null;n=i.cursor;let s=i.evaluable;for(;;){const o=ww(e,t,n);if(!o)break;n=o.cursor;const l=r(t,n);if(!l)return null;n=l.cursor,s=new J_(o.operator,s,l.evaluable)}return s?{cursor:n,evaluable:s}:null}}const yw=[["**"],["*","/","%"],["+","-"],["<<",">>>",">>"],["&"],["^"],["|"]].reduce((r,e)=>gw(r,e),Zh);function Qh(r,e){return e+=_s(r,e).length,yw(r,e)}function xw(r){const e=Qh(r,0);return!e||e.cursor+_s(r,e.cursor).length!==r.length?null:e.evaluable}function on(r){var e;const t=xw(r);return(e=t?.evaluate())!==null&&e!==void 0?e:null}function Jh(r){if(typeof r=="number")return r;if(typeof r=="string"){const e=on(r);if(!ut(e))return e}return 0}function Cw(r){return String(r)}function lr(r){return e=>e.toFixed(Math.max(Math.min(r,20),0))}function et(r,e,t,n,i){const s=(r-e)/(t-e);return n+s*(i-n)}function jd(r){return String(r.toFixed(10)).split(".")[1].replace(/0+$/,"").length}function Rt(r,e,t){return Math.min(Math.max(r,e),t)}function ep(r,e){return(r%e+e)%e}function Ew(r,e){return ut(r.step)?Math.max(jd(e),2):jd(r.step)}function tp(r){var e;return(e=r.step)!==null&&e!==void 0?e:1}function rp(r,e){var t;const n=Math.abs((t=r.step)!==null&&t!==void 0?t:e);return n===0?.1:Math.pow(10,Math.floor(Math.log10(n))-1)}function np(r,e){return ut(r.step)?null:new W_(r.step,e)}function ip(r){return!ut(r.max)&&!ut(r.min)?new Ts({max:r.max,min:r.min}):!ut(r.max)||!ut(r.min)?new Y_({max:r.max,min:r.min}):null}function sp(r,e){var t,n,i;return{formatter:(t=r.format)!==null&&t!==void 0?t:lr(Ew(r,e)),keyScale:(n=r.keyScale)!==null&&n!==void 0?n:tp(r),pointerScale:(i=r.pointerScale)!==null&&i!==void 0?i:rp(r,e)}}function ap(r){return{format:r.optional.function,keyScale:r.optional.number,max:r.optional.number,min:r.optional.number,pointerScale:r.optional.number,step:r.optional.number}}function Hl(r){return{constraint:r.constraint,textProps:Ue.fromObject(sp(r.params,r.initialValue))}}let ii=class{constructor(e){this.controller=e}get element(){return this.controller.view.element}get disabled(){return this.controller.viewProps.get("disabled")}set disabled(e){this.controller.viewProps.set("disabled",e)}get hidden(){return this.controller.viewProps.get("hidden")}set hidden(e){this.controller.viewProps.set("hidden",e)}dispose(){this.controller.viewProps.set("disposed",!0)}importState(e){return this.controller.importState(e)}exportState(){return this.controller.exportState()}},qa=class{constructor(e){this.target=e}},ks=class extends qa{constructor(e,t,n){super(e),this.value=t,this.last=n??!0}},Pw=class extends qa{constructor(e,t){super(e),this.expanded=t}},Aw=class extends qa{constructor(e,t){super(e),this.index=t}},Sw=class extends qa{constructor(e,t){super(e),this.native=t}},gs=class extends ii{constructor(e){super(e),this.onValueChange_=this.onValueChange_.bind(this),this.emitter_=new kt,this.controller.value.emitter.on("change",this.onValueChange_)}get label(){return this.controller.labelController.props.get("label")}set label(e){this.controller.labelController.props.set("label",e)}get key(){return this.controller.value.binding.target.key}get tag(){return this.controller.tag}set tag(e){this.controller.tag=e}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}refresh(){this.controller.value.fetch()}onValueChange_(e){const t=this.controller.value;this.emitter_.emit("change",new ks(this,t.binding.target.read(),e.options.last))}};class Tw{constructor(e,t){this.onValueBeforeChange_=this.onValueBeforeChange_.bind(this),this.onValueChange_=this.onValueChange_.bind(this),this.binding=t,this.value_=e,this.value_.emitter.on("beforechange",this.onValueBeforeChange_),this.value_.emitter.on("change",this.onValueChange_),this.emitter=new kt}get rawValue(){return this.value_.rawValue}set rawValue(e){this.value_.rawValue=e}setRawValue(e,t){this.value_.setRawValue(e,t)}fetch(){this.value_.rawValue=this.binding.read()}push(){this.binding.write(this.value_.rawValue)}onValueBeforeChange_(e){this.emitter.emit("beforechange",Object.assign(Object.assign({},e),{sender:this}))}onValueChange_(e){this.push(),this.emitter.emit("change",Object.assign(Object.assign({},e),{sender:this}))}}function kw(r){if(!("binding"in r))return!1;const e=r.binding;return jl(e)&&"read"in e&&"write"in e}function Lw(r,e){const n=Object.keys(e).reduce((i,s)=>{if(i===void 0)return;const o=e[s],l=o(r[s]);return l.succeeded?Object.assign(Object.assign({},i),{[s]:l.value}):void 0},{});return n}function Vw(r,e){return r.reduce((t,n)=>{if(t===void 0)return;const i=e(n);if(!(!i.succeeded||i.value===void 0))return[...t,i.value]},[])}function Ow(r){return r===null?!1:typeof r=="object"}function Jr(r){return e=>t=>{if(!e&&t===void 0)return{succeeded:!1,value:void 0};if(e&&t===void 0)return{succeeded:!0,value:void 0};const n=r(t);return n!==void 0?{succeeded:!0,value:n}:{succeeded:!1,value:void 0}}}function Ud(r){return{custom:e=>Jr(e)(r),boolean:Jr(e=>typeof e=="boolean"?e:void 0)(r),number:Jr(e=>typeof e=="number"?e:void 0)(r),string:Jr(e=>typeof e=="string"?e:void 0)(r),function:Jr(e=>typeof e=="function"?e:void 0)(r),constant:e=>Jr(t=>t===e?e:void 0)(r),raw:Jr(e=>e)(r),object:e=>Jr(t=>{if(Ow(t))return Lw(t,e)})(r),array:e=>Jr(t=>{if(Array.isArray(t))return Vw(t,e)})(r)}}const Al={optional:Ud(!0),required:Ud(!1)};function bt(r,e){const t=e(Al),n=Al.required.object(t)(r);return n.succeeded?n.value:void 0}function fr(r,e,t,n){if(e&&!e(r))return!1;const i=bt(r,t);return i?n(i):!1}function mr(r,e){var t;return Jn((t=r?.())!==null&&t!==void 0?t:{},e)}function Zn(r){return"value"in r}function op(r){if(!Gl(r)||!("binding"in r))return!1;const e=r.binding;return jl(e)}const $r="http://www.w3.org/2000/svg";function Ia(r){r.offsetHeight}function Rw(r,e){const t=r.style.transition;r.style.transition="none",e(),r.style.transition=t}function Kl(r){return r.ontouchstart!==void 0}function Dw(){return globalThis}function Mw(){return Dw().document}function Iw(r){const e=r.ownerDocument.defaultView;return e&&"document"in e?r.getContext("2d",{willReadFrequently:!0}):null}const Fw={check:' ',dropdown:' ',p2dpad:' '};function Xa(r,e){const t=r.createElementNS($r,"svg");return t.innerHTML=Fw[e],t}function lp(r,e,t){r.insertBefore(e,r.children[t])}function ql(r){r.parentElement&&r.parentElement.removeChild(r)}function up(r){for(;r.children.length>0;)r.removeChild(r.children[0])}function $w(r){for(;r.childNodes.length>0;)r.removeChild(r.childNodes[0])}function cp(r){return r.relatedTarget?r.relatedTarget:"explicitOriginalTarget"in r?r.explicitOriginalTarget:null}function sn(r,e){r.emitter.on("change",t=>{e(t.rawValue)}),e(r.rawValue)}function Nr(r,e,t){sn(r.value(e),t)}const Bw="tp";function Xe(r){return(t,n)=>[Bw,"-",r,"v",t?`_${t}`:"",n?`-${n}`:""].join("")}const as=Xe("lbl");function Nw(r,e){const t=r.createDocumentFragment();return e.split(`
+`).map(i=>r.createTextNode(i)).forEach((i,s)=>{s>0&&t.appendChild(r.createElement("br")),t.appendChild(i)}),t}let dp=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(as()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(as("l")),Nr(t.props,"label",s=>{ut(s)?this.element.classList.add(as(void 0,"nol")):(this.element.classList.remove(as(void 0,"nol")),$w(n),n.appendChild(Nw(e,s)))}),this.element.appendChild(n),this.labelElement=n;const i=e.createElement("div");i.classList.add(as("v")),this.element.appendChild(i),this.valueElement=i}},hp=class{constructor(e,t){this.props=t.props,this.valueController=t.valueController,this.viewProps=t.valueController.viewProps,this.view=new dp(e,{props:t.props,viewProps:this.viewProps}),this.view.valueElement.appendChild(this.valueController.view.element)}importProps(e){return fr(e,null,t=>({label:t.optional.string}),t=>(this.props.set("label",t.label),!0))}exportProps(){return mr(null,{label:this.props.get("label")})}};function Gw(){return["veryfirst","first","last","verylast"]}const zd=Xe(""),Hd={veryfirst:"vfst",first:"fst",last:"lst",verylast:"vlst"};let Ya=class{constructor(e){this.parent_=null,this.blade=e.blade,this.view=e.view,this.viewProps=e.viewProps;const t=this.view.element;this.blade.value("positions").emitter.on("change",()=>{Gw().forEach(n=>{t.classList.remove(zd(void 0,Hd[n]))}),this.blade.get("positions").forEach(n=>{t.classList.add(zd(void 0,Hd[n]))})}),this.viewProps.handleDispose(()=>{ql(t)})}get parent(){return this.parent_}set parent(e){this.parent_=e,this.viewProps.set("parent",this.parent_?this.parent_.viewProps:null)}importState(e){return fr(e,null,t=>({disabled:t.required.boolean,hidden:t.required.boolean}),t=>(this.viewProps.importState(t),!0))}exportState(){return mr(null,Object.assign({},this.viewProps.exportState()))}};class ei extends Ya{constructor(e,t){if(t.value!==t.valueController.value)throw qt.shouldNeverHappen();const n=t.valueController.viewProps,i=new hp(e,{blade:t.blade,props:t.props,valueController:t.valueController});super(Object.assign(Object.assign({},t),{view:new dp(e,{props:t.props,viewProps:n}),viewProps:n})),this.labelController=i,this.value=t.value,this.valueController=t.valueController,this.view.valueElement.appendChild(this.valueController.view.element)}importState(e){return fr(e,t=>{var n,i,s;return super.importState(t)&&this.labelController.importProps(t)&&((s=(i=(n=this.valueController).importProps)===null||i===void 0?void 0:i.call(n,e))!==null&&s!==void 0?s:!0)},t=>({value:t.optional.raw}),t=>(t.value&&(this.value.rawValue=t.value),!0))}exportState(){var e,t,n;return mr(()=>super.exportState(),Object.assign(Object.assign({value:this.value.rawValue},this.labelController.exportProps()),(n=(t=(e=this.valueController).exportProps)===null||t===void 0?void 0:t.call(e))!==null&&n!==void 0?n:{}))}}function Kd(r){const e=Object.assign({},r);return delete e.value,e}class pp extends ei{constructor(e,t){super(e,t),this.tag=t.tag}importState(e){return fr(e,t=>super.importState(Kd(e)),t=>({tag:t.optional.string}),t=>(this.tag=t.tag,!0))}exportState(){return mr(()=>Kd(super.exportState()),{binding:{key:this.value.binding.target.key,value:this.value.binding.target.read()},tag:this.tag})}}function jw(r){return Zn(r)&&op(r.value)}class Uw extends pp{importState(e){return fr(e,t=>super.importState(t),t=>({binding:t.required.object({value:t.required.raw})}),t=>(this.value.binding.inject(t.binding.value),this.value.fetch(),!0))}}function zw(r){return Zn(r)&&kw(r.value)}function fp(r,e){for(;r.lengthr.length?t.splice(0,t.length-r.length):fp(t,r.length),t}class Xw{constructor(e){this.emitter=new kt,this.onTick_=this.onTick_.bind(this),this.onValueBeforeChange_=this.onValueBeforeChange_.bind(this),this.onValueChange_=this.onValueChange_.bind(this),this.binding=e.binding,this.value_=dt(Hw(e.bufferSize)),this.value_.emitter.on("beforechange",this.onValueBeforeChange_),this.value_.emitter.on("change",this.onValueChange_),this.ticker=e.ticker,this.ticker.emitter.on("tick",this.onTick_),this.fetch()}get rawValue(){return this.value_.rawValue}set rawValue(e){this.value_.rawValue=e}setRawValue(e,t){this.value_.setRawValue(e,t)}fetch(){this.value_.rawValue=qw(this.value_.rawValue,this.binding.read())}onTick_(){this.fetch()}onValueBeforeChange_(e){this.emitter.emit("beforechange",Object.assign(Object.assign({},e),{sender:this}))}onValueChange_(e){this.emitter.emit("change",Object.assign(Object.assign({},e),{sender:this}))}}function Yw(r){if(!("binding"in r))return!1;const e=r.binding;return jl(e)&&"read"in e&&!("write"in e)}class Ww extends pp{exportState(){return mr(()=>super.exportState(),{binding:{readonly:!0}})}}function Zw(r){return Zn(r)&&Yw(r.value)}let Qw=class extends ii{get label(){return this.controller.labelController.props.get("label")}set label(e){this.controller.labelController.props.set("label",e)}get title(){var e;return(e=this.controller.buttonController.props.get("title"))!==null&&e!==void 0?e:""}set title(e){this.controller.buttonController.props.set("title",e)}on(e,t){const n=t.bind(this);return this.controller.buttonController.emitter.on(e,s=>{n(new Sw(this,s.nativeEvent))}),this}off(e,t){return this.controller.buttonController.emitter.off(e,t),this}};function Jw(r,e,t){t?r.classList.add(e):r.classList.remove(e)}function Ii(r,e){return t=>{Jw(r,e,t)}}function Xl(r,e){sn(r,t=>{e.textContent=t??""})}const al=Xe("btn");let e0=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(al()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("button");n.classList.add(al("b")),t.viewProps.bindDisabled(n),this.element.appendChild(n),this.buttonElement=n;const i=e.createElement("div");i.classList.add(al("t")),Xl(t.props.value("title"),i),this.buttonElement.appendChild(i)}},t0=class{constructor(e,t){this.emitter=new kt,this.onClick_=this.onClick_.bind(this),this.props=t.props,this.viewProps=t.viewProps,this.view=new e0(e,{props:this.props,viewProps:this.viewProps}),this.view.buttonElement.addEventListener("click",this.onClick_)}importProps(e){return fr(e,null,t=>({title:t.optional.string}),t=>(this.props.set("title",t.title),!0))}exportProps(){return mr(null,{title:this.props.get("title")})}onClick_(e){this.emitter.emit("click",{nativeEvent:e,sender:this})}},qd=class extends Ya{constructor(e,t){const n=new t0(e,{props:t.buttonProps,viewProps:t.viewProps}),i=new hp(e,{blade:t.blade,props:t.labelProps,valueController:n});super({blade:t.blade,view:i.view,viewProps:t.viewProps}),this.buttonController=n,this.labelController=i}importState(e){return fr(e,t=>super.importState(t)&&this.buttonController.importProps(t)&&this.labelController.importProps(t),()=>({}),()=>!0)}exportState(){return mr(()=>super.exportState(),Object.assign(Object.assign({},this.buttonController.exportProps()),this.labelController.exportProps()))}},mp=class{constructor(e){const[t,n]=e.split("-"),i=t.split(".");this.major=parseInt(i[0],10),this.minor=parseInt(i[1],10),this.patch=parseInt(i[2],10),this.prerelease=n??null}toString(){const e=[this.major,this.minor,this.patch].join(".");return this.prerelease!==null?[e,this.prerelease].join("-"):e}};const Fi=new mp("2.0.5");function Qt(r){return Object.assign({core:Fi},r)}const r0=Qt({id:"button",type:"blade",accept(r){const e=bt(r,t=>({title:t.required.string,view:t.required.constant("button"),label:t.optional.string}));return e?{params:e}:null},controller(r){return new qd(r.document,{blade:r.blade,buttonProps:Ue.fromObject({title:r.params.title}),labelProps:Ue.fromObject({label:r.params.label}),viewProps:r.viewProps})},api(r){return r.controller instanceof qd?new Qw(r.controller):null}});function n0(r,e){return r.addBlade(Object.assign(Object.assign({},e),{view:"button"}))}function i0(r,e){return r.addBlade(Object.assign(Object.assign({},e),{view:"folder"}))}function s0(r,e){return r.addBlade(Object.assign(Object.assign({},e),{view:"tab"}))}function a0(r){return Gl(r)?"refresh"in r&&typeof r.refresh=="function":!1}function o0(r,e){if(!Gd.isBindable(r))throw qt.notBindable();return new Gd(r,e)}let l0=class{constructor(e,t){this.onRackValueChange_=this.onRackValueChange_.bind(this),this.controller_=e,this.emitter_=new kt,this.pool_=t,this.controller_.rack.emitter.on("valuechange",this.onRackValueChange_)}get children(){return this.controller_.rack.children.map(e=>this.pool_.createApi(e))}addBinding(e,t,n){const i=n??{},s=this.controller_.element.ownerDocument,o=this.pool_.createBinding(s,o0(e,t),i),l=this.pool_.createBindingApi(o);return this.add(l,i.index)}addFolder(e){return i0(this,e)}addButton(e){return n0(this,e)}addTab(e){return s0(this,e)}add(e,t){const n=e.controller;return this.controller_.rack.add(n,t),e}remove(e){this.controller_.rack.remove(e.controller)}addBlade(e){const t=this.controller_.element.ownerDocument,n=this.pool_.createBlade(t,e),i=this.pool_.createApi(n);return this.add(i,e.index)}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}refresh(){this.children.forEach(e=>{a0(e)&&e.refresh()})}onRackValueChange_(e){const t=e.bladeController,n=this.pool_.createApi(t),i=op(t.value)?t.value.binding:null;this.emitter_.emit("change",new ks(n,i?i.target.read():t.value.rawValue,e.options.last))}},Yl=class extends ii{constructor(e,t){super(e),this.rackApi_=new l0(e.rackController,t)}refresh(){this.rackApi_.refresh()}},Wl=class extends Ya{constructor(e){super({blade:e.blade,view:e.view,viewProps:e.rackController.viewProps}),this.rackController=e.rackController}importState(e){return fr(e,t=>super.importState(t),t=>({children:t.required.array(t.required.raw)}),t=>this.rackController.rack.children.every((n,i)=>n.importState(t.children[i])))}exportState(){return mr(()=>super.exportState(),{children:this.rackController.rack.children.map(e=>e.exportState())})}};function Sl(r){return"rackController"in r}let u0=class{constructor(e){this.emitter=new kt,this.items_=[],this.cache_=new Set,this.onSubListAdd_=this.onSubListAdd_.bind(this),this.onSubListRemove_=this.onSubListRemove_.bind(this),this.extract_=e}get items(){return this.items_}allItems(){return Array.from(this.cache_)}find(e){for(const t of this.allItems())if(e(t))return t;return null}includes(e){return this.cache_.has(e)}add(e,t){if(this.includes(e))throw qt.shouldNeverHappen();const n=t!==void 0?t:this.items_.length;this.items_.splice(n,0,e),this.cache_.add(e);const i=this.extract_(e);i&&(i.emitter.on("add",this.onSubListAdd_),i.emitter.on("remove",this.onSubListRemove_),i.allItems().forEach(s=>{this.cache_.add(s)})),this.emitter.emit("add",{index:n,item:e,root:this,target:this})}remove(e){const t=this.items_.indexOf(e);if(t<0)return;this.items_.splice(t,1),this.cache_.delete(e);const n=this.extract_(e);n&&(n.allItems().forEach(i=>{this.cache_.delete(i)}),n.emitter.off("add",this.onSubListAdd_),n.emitter.off("remove",this.onSubListRemove_)),this.emitter.emit("remove",{index:t,item:e,root:this,target:this})}onSubListAdd_(e){this.cache_.add(e.item),this.emitter.emit("add",{index:e.index,item:e.item,root:this,target:e.target})}onSubListRemove_(e){this.cache_.delete(e.item),this.emitter.emit("remove",{index:e.index,item:e.item,root:this,target:e.target})}};function c0(r,e){for(let t=0;t!i.viewProps.get("hidden")),t=e[0],n=e[e.length-1];this.bcSet_.items.forEach(i=>{const s=[];i===t&&(s.push("first"),(!this.blade_||this.blade_.get("positions").includes("veryfirst"))&&s.push("veryfirst")),i===n&&(s.push("last"),(!this.blade_||this.blade_.get("positions").includes("verylast"))&&s.push("verylast")),i.blade.set("positions",s)})}onChildPositionsChange_(){this.updatePositions_(),this.emitter.emit("layout",{sender:this})}onChildViewPropsChange_(e){this.updatePositions_(),this.emitter.emit("layout",{sender:this})}onChildDispose_(){this.bcSet_.items.filter(t=>t.viewProps.get("disposed")).forEach(t=>{this.bcSet_.remove(t)})}onChildValueChange_(e){const t=c0(this.find(Zn),e.sender);if(!t)throw qt.alreadyDisposed();this.emitter.emit("valuechange",{bladeController:t,options:e.options,sender:this})}onRackLayout_(e){this.updatePositions_(),this.emitter.emit("layout",{sender:this})}onRackValueChange_(e){this.emitter.emit("valuechange",{bladeController:e.bladeController,options:e.options,sender:this})}onBladePositionsChange_(){this.updatePositions_()}},Zl=class{constructor(e){this.onRackAdd_=this.onRackAdd_.bind(this),this.onRackRemove_=this.onRackRemove_.bind(this),this.element=e.element,this.viewProps=e.viewProps;const t=new h0({blade:e.root?void 0:e.blade,viewProps:e.viewProps});t.emitter.on("add",this.onRackAdd_),t.emitter.on("remove",this.onRackRemove_),this.rack=t,this.viewProps.handleDispose(()=>{for(let n=this.rack.children.length-1;n>=0;n--)this.rack.children[n].viewProps.set("disposed",!0)})}onRackAdd_(e){e.root&&lp(this.element,e.bladeController.view.element,e.index)}onRackRemove_(e){e.root&&ql(e.bladeController.view.element)}};function $i(){return new Ue({positions:dt([],{equals:U_})})}let Ql=class vp extends Ue{constructor(e){super(e)}static create(e){const t={completed:!0,expanded:e,expandedHeight:null,shouldFixHeight:!1,temporaryExpanded:null},n=Ue.createCore(t);return new vp(n)}get styleExpanded(){var e;return(e=this.get("temporaryExpanded"))!==null&&e!==void 0?e:this.get("expanded")}get styleHeight(){if(!this.styleExpanded)return"0";const e=this.get("expandedHeight");return this.get("shouldFixHeight")&&!ut(e)?`${e}px`:"auto"}bindExpandedClass(e,t){const n=()=>{this.styleExpanded?e.classList.add(t):e.classList.remove(t)};Nr(this,"expanded",n),Nr(this,"temporaryExpanded",n)}cleanUpTransition(){this.set("shouldFixHeight",!1),this.set("expandedHeight",null),this.set("completed",!0)}};function p0(r,e){let t=0;return Rw(e,()=>{r.set("expandedHeight",null),r.set("temporaryExpanded",!0),Ia(e),t=e.clientHeight,r.set("temporaryExpanded",null),Ia(e)}),t}function Xd(r,e){e.style.height=r.styleHeight}function Jl(r,e){r.value("expanded").emitter.on("beforechange",()=>{if(r.set("completed",!1),ut(r.get("expandedHeight"))){const t=p0(r,e);t>0&&r.set("expandedHeight",t)}r.set("shouldFixHeight",!0),Ia(e)}),r.emitter.on("change",()=>{Xd(r,e)}),Xd(r,e),e.addEventListener("transitionend",t=>{t.propertyName==="height"&&r.cleanUpTransition()})}let bp=class extends Yl{constructor(e,t){super(e,t),this.emitter_=new kt,this.controller.foldable.value("expanded").emitter.on("change",n=>{this.emitter_.emit("fold",new Pw(this,n.sender.rawValue))}),this.rackApi_.on("change",n=>{this.emitter_.emit("change",n)})}get expanded(){return this.controller.foldable.get("expanded")}set expanded(e){this.controller.foldable.set("expanded",e)}get title(){return this.controller.props.get("title")}set title(e){this.controller.props.set("title",e)}get children(){return this.rackApi_.children}addBinding(e,t,n){return this.rackApi_.addBinding(e,t,n)}addFolder(e){return this.rackApi_.addFolder(e)}addButton(e){return this.rackApi_.addButton(e)}addTab(e){return this.rackApi_.addTab(e)}add(e,t){return this.rackApi_.add(e,t)}remove(e){this.rackApi_.remove(e)}addBlade(e){return this.rackApi_.addBlade(e)}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}};const _p=Xe("cnt");let f0=class{constructor(e,t){var n;this.className_=Xe((n=t.viewName)!==null&&n!==void 0?n:"fld"),this.element=e.createElement("div"),this.element.classList.add(this.className_(),_p()),t.viewProps.bindClassModifiers(this.element),this.foldable_=t.foldable,this.foldable_.bindExpandedClass(this.element,this.className_(void 0,"expanded")),Nr(this.foldable_,"completed",Ii(this.element,this.className_(void 0,"cpl")));const i=e.createElement("button");i.classList.add(this.className_("b")),Nr(t.props,"title",x=>{ut(x)?this.element.classList.add(this.className_(void 0,"not")):this.element.classList.remove(this.className_(void 0,"not"))}),t.viewProps.bindDisabled(i),this.element.appendChild(i),this.buttonElement=i;const s=e.createElement("div");s.classList.add(this.className_("i")),this.element.appendChild(s);const o=e.createElement("div");o.classList.add(this.className_("t")),Xl(t.props.value("title"),o),this.buttonElement.appendChild(o),this.titleElement=o;const l=e.createElement("div");l.classList.add(this.className_("m")),this.buttonElement.appendChild(l);const y=e.createElement("div");y.classList.add(this.className_("c")),this.element.appendChild(y),this.containerElement=y}},Tl=class extends Wl{constructor(e,t){var n;const i=Ql.create((n=t.expanded)!==null&&n!==void 0?n:!0),s=new f0(e,{foldable:i,props:t.props,viewName:t.root?"rot":void 0,viewProps:t.viewProps});super(Object.assign(Object.assign({},t),{rackController:new Zl({blade:t.blade,element:s.containerElement,root:t.root,viewProps:t.viewProps}),view:s})),this.onTitleClick_=this.onTitleClick_.bind(this),this.props=t.props,this.foldable=i,Jl(this.foldable,this.view.containerElement),this.rackController.rack.emitter.on("add",()=>{this.foldable.cleanUpTransition()}),this.rackController.rack.emitter.on("remove",()=>{this.foldable.cleanUpTransition()}),this.view.buttonElement.addEventListener("click",this.onTitleClick_)}get document(){return this.view.element.ownerDocument}importState(e){return fr(e,t=>super.importState(t),t=>({expanded:t.required.boolean,title:t.optional.string}),t=>(this.foldable.set("expanded",t.expanded),this.props.set("title",t.title),!0))}exportState(){return mr(()=>super.exportState(),{expanded:this.foldable.get("expanded"),title:this.props.get("title")})}onTitleClick_(){this.foldable.set("expanded",!this.foldable.get("expanded"))}};const m0=Qt({id:"folder",type:"blade",accept(r){const e=bt(r,t=>({title:t.required.string,view:t.required.constant("folder"),expanded:t.optional.boolean}));return e?{params:e}:null},controller(r){return new Tl(r.document,{blade:r.blade,expanded:r.params.expanded,props:Ue.fromObject({title:r.params.title}),viewProps:r.viewProps})},api(r){return r.controller instanceof Tl?new bp(r.controller,r.pool):null}}),v0=Xe("");function Yd(r,e){return Ii(r,v0(void 0,e))}let si=class wp extends Ue{constructor(e){var t;super(e),this.onDisabledChange_=this.onDisabledChange_.bind(this),this.onParentChange_=this.onParentChange_.bind(this),this.onParentGlobalDisabledChange_=this.onParentGlobalDisabledChange_.bind(this),[this.globalDisabled_,this.setGlobalDisabled_]=X_(dt(this.getGlobalDisabled_())),this.value("disabled").emitter.on("change",this.onDisabledChange_),this.value("parent").emitter.on("change",this.onParentChange_),(t=this.get("parent"))===null||t===void 0||t.globalDisabled.emitter.on("change",this.onParentGlobalDisabledChange_)}static create(e){var t,n,i;const s=e??{};return new wp(Ue.createCore({disabled:(t=s.disabled)!==null&&t!==void 0?t:!1,disposed:!1,hidden:(n=s.hidden)!==null&&n!==void 0?n:!1,parent:(i=s.parent)!==null&&i!==void 0?i:null}))}get globalDisabled(){return this.globalDisabled_}bindClassModifiers(e){sn(this.globalDisabled_,Yd(e,"disabled")),Nr(this,"hidden",Yd(e,"hidden"))}bindDisabled(e){sn(this.globalDisabled_,t=>{e.disabled=t})}bindTabIndex(e){sn(this.globalDisabled_,t=>{e.tabIndex=t?-1:0})}handleDispose(e){this.value("disposed").emitter.on("change",t=>{t&&e()})}importState(e){this.set("disabled",e.disabled),this.set("hidden",e.hidden)}exportState(){return{disabled:this.get("disabled"),hidden:this.get("hidden")}}getGlobalDisabled_(){const e=this.get("parent");return(e?e.globalDisabled.rawValue:!1)||this.get("disabled")}updateGlobalDisabled_(){this.setGlobalDisabled_(this.getGlobalDisabled_())}onDisabledChange_(){this.updateGlobalDisabled_()}onParentGlobalDisabledChange_(){this.updateGlobalDisabled_()}onParentChange_(e){var t;const n=e.previousRawValue;n?.globalDisabled.emitter.off("change",this.onParentGlobalDisabledChange_),(t=this.get("parent"))===null||t===void 0||t.globalDisabled.emitter.on("change",this.onParentGlobalDisabledChange_),this.updateGlobalDisabled_()}};const Wd=Xe("tbp");let b0=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Wd()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(Wd("c")),this.element.appendChild(n),this.containerElement=n}};const os=Xe("tbi");let _0=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(os()),t.viewProps.bindClassModifiers(this.element),Nr(t.props,"selected",s=>{s?this.element.classList.add(os(void 0,"sel")):this.element.classList.remove(os(void 0,"sel"))});const n=e.createElement("button");n.classList.add(os("b")),t.viewProps.bindDisabled(n),this.element.appendChild(n),this.buttonElement=n;const i=e.createElement("div");i.classList.add(os("t")),Xl(t.props.value("title"),i),this.buttonElement.appendChild(i),this.titleElement=i}},w0=class{constructor(e,t){this.emitter=new kt,this.onClick_=this.onClick_.bind(this),this.props=t.props,this.viewProps=t.viewProps,this.view=new _0(e,{props:t.props,viewProps:t.viewProps}),this.view.buttonElement.addEventListener("click",this.onClick_)}onClick_(){this.emitter.emit("click",{sender:this})}},kl=class extends Wl{constructor(e,t){const n=new b0(e,{viewProps:t.viewProps});super(Object.assign(Object.assign({},t),{rackController:new Zl({blade:t.blade,element:n.containerElement,viewProps:t.viewProps}),view:n})),this.onItemClick_=this.onItemClick_.bind(this),this.ic_=new w0(e,{props:t.itemProps,viewProps:si.create()}),this.ic_.emitter.on("click",this.onItemClick_),this.props=t.props,Nr(this.props,"selected",i=>{this.itemController.props.set("selected",i),this.viewProps.set("hidden",!i)})}get itemController(){return this.ic_}importState(e){return fr(e,t=>super.importState(t),t=>({selected:t.required.boolean,title:t.required.string}),t=>(this.ic_.props.set("selected",t.selected),this.ic_.props.set("title",t.title),!0))}exportState(){return mr(()=>super.exportState(),{selected:this.ic_.props.get("selected"),title:this.ic_.props.get("title")})}onItemClick_(){this.props.set("selected",!0)}},g0=class extends Yl{constructor(e,t){super(e,t),this.emitter_=new kt,this.onSelect_=this.onSelect_.bind(this),this.pool_=t,this.rackApi_.on("change",n=>{this.emitter_.emit("change",n)}),this.controller.tab.selectedIndex.emitter.on("change",this.onSelect_)}get pages(){return this.rackApi_.children}addPage(e){const t=this.controller.view.element.ownerDocument,n=new kl(t,{blade:$i(),itemProps:Ue.fromObject({selected:!1,title:e.title}),props:Ue.fromObject({selected:!1}),viewProps:si.create()}),i=this.pool_.createApi(n);return this.rackApi_.add(i,e.index)}removePage(e){this.rackApi_.remove(this.rackApi_.children[e])}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}onSelect_(e){this.emitter_.emit("select",new Aw(this,e.rawValue))}},y0=class extends Yl{get title(){var e;return(e=this.controller.itemController.props.get("title"))!==null&&e!==void 0?e:""}set title(e){this.controller.itemController.props.set("title",e)}get selected(){return this.controller.props.get("selected")}set selected(e){this.controller.props.set("selected",e)}get children(){return this.rackApi_.children}addButton(e){return this.rackApi_.addButton(e)}addFolder(e){return this.rackApi_.addFolder(e)}addTab(e){return this.rackApi_.addTab(e)}add(e,t){this.rackApi_.add(e,t)}remove(e){this.rackApi_.remove(e)}addBinding(e,t,n){return this.rackApi_.addBinding(e,t,n)}addBlade(e){return this.rackApi_.addBlade(e)}};const Zd=-1;let x0=class{constructor(){this.onItemSelectedChange_=this.onItemSelectedChange_.bind(this),this.empty=dt(!0),this.selectedIndex=dt(Zd),this.items_=[]}add(e,t){const n=t??this.items_.length;this.items_.splice(n,0,e),e.emitter.on("change",this.onItemSelectedChange_),this.keepSelection_()}remove(e){const t=this.items_.indexOf(e);t<0||(this.items_.splice(t,1),e.emitter.off("change",this.onItemSelectedChange_),this.keepSelection_())}keepSelection_(){if(this.items_.length===0){this.selectedIndex.rawValue=Zd,this.empty.rawValue=!0;return}const e=this.items_.findIndex(t=>t.rawValue);e<0?(this.items_.forEach((t,n)=>{t.rawValue=n===0}),this.selectedIndex.rawValue=0):(this.items_.forEach((t,n)=>{t.rawValue=n===e}),this.selectedIndex.rawValue=e),this.empty.rawValue=!1}onItemSelectedChange_(e){if(e.rawValue){const t=this.items_.findIndex(n=>n===e.sender);this.items_.forEach((n,i)=>{n.rawValue=i===t}),this.selectedIndex.rawValue=t}else this.keepSelection_()}};const ls=Xe("tab");let C0=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(ls(),_p()),t.viewProps.bindClassModifiers(this.element),sn(t.empty,Ii(this.element,ls(void 0,"nop")));const n=e.createElement("div");n.classList.add(ls("t")),this.element.appendChild(n),this.itemsElement=n;const i=e.createElement("div");i.classList.add(ls("i")),this.element.appendChild(i);const s=e.createElement("div");s.classList.add(ls("c")),this.element.appendChild(s),this.contentsElement=s}},Qd=class extends Wl{constructor(e,t){const n=new x0,i=new C0(e,{empty:n.empty,viewProps:t.viewProps});super({blade:t.blade,rackController:new Zl({blade:t.blade,element:i.contentsElement,viewProps:t.viewProps}),view:i}),this.onRackAdd_=this.onRackAdd_.bind(this),this.onRackRemove_=this.onRackRemove_.bind(this);const s=this.rackController.rack;s.emitter.on("add",this.onRackAdd_),s.emitter.on("remove",this.onRackRemove_),this.tab=n}add(e,t){this.rackController.rack.add(e,t)}remove(e){this.rackController.rack.remove(this.rackController.rack.children[e])}onRackAdd_(e){if(!e.root)return;const t=e.bladeController;lp(this.view.itemsElement,t.itemController.view.element,e.index),t.itemController.viewProps.set("parent",this.viewProps),this.tab.add(t.props.value("selected"))}onRackRemove_(e){if(!e.root)return;const t=e.bladeController;ql(t.itemController.view.element),t.itemController.viewProps.set("parent",null),this.tab.remove(t.props.value("selected"))}};const gp=Qt({id:"tab",type:"blade",accept(r){const e=bt(r,t=>({pages:t.required.array(t.required.object({title:t.required.string})),view:t.required.constant("tab")}));return!e||e.pages.length===0?null:{params:e}},controller(r){const e=new Qd(r.document,{blade:r.blade,viewProps:r.viewProps});return r.params.pages.forEach(t=>{const n=new kl(r.document,{blade:$i(),itemProps:Ue.fromObject({selected:!1,title:t.title}),props:Ue.fromObject({selected:!1}),viewProps:si.create()});e.add(n)}),e},api(r){return r.controller instanceof Qd?new g0(r.controller,r.pool):r.controller instanceof kl?new y0(r.controller,r.pool):null}});function E0(r,e){const t=r.accept(e.params);if(!t)return null;const n=bt(e.params,i=>({disabled:i.optional.boolean,hidden:i.optional.boolean}));return r.controller({blade:$i(),document:e.document,params:Object.assign(Object.assign({},t.params),{disabled:n?.disabled,hidden:n?.hidden}),viewProps:si.create({disabled:n?.disabled,hidden:n?.hidden})})}let eu=class extends gs{get options(){return this.controller.valueController.props.get("options")}set options(e){this.controller.valueController.props.set("options",e)}};class P0{constructor(){this.disabled=!1,this.emitter=new kt}dispose(){}tick(){this.disabled||this.emitter.emit("tick",{sender:this})}}class A0{constructor(e,t){this.disabled_=!1,this.timerId_=null,this.onTick_=this.onTick_.bind(this),this.doc_=e,this.emitter=new kt,this.interval_=t,this.setTimer_()}get disabled(){return this.disabled_}set disabled(e){this.disabled_=e,this.disabled_?this.clearTimer_():this.setTimer_()}dispose(){this.clearTimer_()}clearTimer_(){if(this.timerId_===null)return;const e=this.doc_.defaultView;e&&e.clearInterval(this.timerId_),this.timerId_=null}setTimer_(){if(this.clearTimer_(),this.interval_<=0)return;const e=this.doc_.defaultView;e&&(this.timerId_=e.setInterval(this.onTick_,this.interval_))}onTick_(){this.disabled_||this.emitter.emit("tick",{sender:this})}}let Ls=class{constructor(e){this.constraints=e}constrain(e){return this.constraints.reduce((t,n)=>n.constrain(t),e)}};function Fa(r,e){if(r instanceof e)return r;if(r instanceof Ls){const t=r.constraints.reduce((n,i)=>n||(i instanceof e?i:null),null);if(t)return t}return null}let Vs=class{constructor(e){this.values=Ue.fromObject({options:e})}constrain(e){const t=this.values.get("options");return t.length===0||t.filter(i=>i.value===e).length>0?e:t[0].value}};function Os(r){var e;const t=Al;if(Array.isArray(r))return(e=bt({items:r},n=>({items:n.required.array(n.required.object({text:n.required.string,value:n.required.raw}))})))===null||e===void 0?void 0:e.items;if(typeof r=="object")return t.required.raw(r).value}function tu(r){if(Array.isArray(r))return r;const e=[];return Object.keys(r).forEach(t=>{e.push({text:t,value:r[t]})}),e}function ru(r){return ut(r)?null:new Vs(tu(r))}const ol=Xe("lst");let S0=class{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.props_=t.props,this.element=e.createElement("div"),this.element.classList.add(ol()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("select");n.classList.add(ol("s")),t.viewProps.bindDisabled(n),this.element.appendChild(n),this.selectElement=n;const i=e.createElement("div");i.classList.add(ol("m")),i.appendChild(Xa(e,"dropdown")),this.element.appendChild(i),t.value.emitter.on("change",this.onValueChange_),this.value_=t.value,Nr(this.props_,"options",s=>{up(this.selectElement),s.forEach(o=>{const l=e.createElement("option");l.textContent=o.text,this.selectElement.appendChild(l)}),this.update_()})}update_(){const e=this.props_.get("options").map(t=>t.value);this.selectElement.selectedIndex=e.indexOf(this.value_.rawValue)}onValueChange_(){this.update_()}},Vn=class{constructor(e,t){this.onSelectChange_=this.onSelectChange_.bind(this),this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.view=new S0(e,{props:this.props,value:this.value,viewProps:this.viewProps}),this.view.selectElement.addEventListener("change",this.onSelectChange_)}onSelectChange_(e){const t=e.currentTarget;this.value.rawValue=this.props.get("options")[t.selectedIndex].value}importProps(e){return fr(e,null,t=>({options:t.required.custom(Os)}),t=>(this.props.set("options",tu(t.options)),!0))}exportProps(){return mr(null,{options:this.props.get("options")})}};const Jd=Xe("pop");let T0=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Jd()),t.viewProps.bindClassModifiers(this.element),sn(t.shows,Ii(this.element,Jd(void 0,"v")))}},yp=class{constructor(e,t){this.shows=dt(!1),this.viewProps=t.viewProps,this.view=new T0(e,{shows:this.shows,viewProps:this.viewProps})}};const eh=Xe("txt");let k0=class{constructor(e,t){this.onChange_=this.onChange_.bind(this),this.element=e.createElement("div"),this.element.classList.add(eh()),t.viewProps.bindClassModifiers(this.element),this.props_=t.props,this.props_.emitter.on("change",this.onChange_);const n=e.createElement("input");n.classList.add(eh("i")),n.type="text",t.viewProps.bindDisabled(n),this.element.appendChild(n),this.inputElement=n,t.value.emitter.on("change",this.onChange_),this.value_=t.value,this.refresh()}refresh(){const e=this.props_.get("formatter");this.inputElement.value=e(this.value_.rawValue)}onChange_(){this.refresh()}},ys=class{constructor(e,t){this.onInputChange_=this.onInputChange_.bind(this),this.parser_=t.parser,this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.view=new k0(e,{props:t.props,value:this.value,viewProps:this.viewProps}),this.view.inputElement.addEventListener("change",this.onInputChange_)}onInputChange_(e){const n=e.currentTarget.value,i=this.parser_(n);ut(i)||(this.value.rawValue=i),this.view.refresh()}};function L0(r){return String(r)}function xp(r){return r==="false"?!1:!!r}function th(r){return L0(r)}function V0(r){return e=>r.reduce((t,n)=>t!==null?t:n(e),null)}const O0=lr(0);function $a(r){return O0(r)+"%"}function Cp(r){return String(r)}function Ll(r){return r}function Bi({primary:r,secondary:e,forward:t,backward:n}){let i=!1;function s(o){i||(i=!0,o(),i=!1)}r.emitter.on("change",o=>{s(()=>{e.setRawValue(t(r.rawValue,e.rawValue),o.options)})}),e.emitter.on("change",o=>{s(()=>{r.setRawValue(n(r.rawValue,e.rawValue),o.options)}),s(()=>{e.setRawValue(t(r.rawValue,e.rawValue),o.options)})}),s(()=>{e.setRawValue(t(r.rawValue,e.rawValue),{forceEmit:!1,last:!0})})}function ar(r,e){const t=r*(e.altKey?.1:1)*(e.shiftKey?10:1);return e.upKey?+t:e.downKey?-t:0}function xs(r){return{altKey:r.altKey,downKey:r.key==="ArrowDown",shiftKey:r.shiftKey,upKey:r.key==="ArrowUp"}}function ln(r){return{altKey:r.altKey,downKey:r.key==="ArrowLeft",shiftKey:r.shiftKey,upKey:r.key==="ArrowRight"}}function R0(r){return r==="ArrowUp"||r==="ArrowDown"}function Ep(r){return R0(r)||r==="ArrowLeft"||r==="ArrowRight"}function ll(r,e){var t,n;const i=e.ownerDocument.defaultView,s=e.getBoundingClientRect();return{x:r.pageX-(((t=i&&i.scrollX)!==null&&t!==void 0?t:0)+s.left),y:r.pageY-(((n=i&&i.scrollY)!==null&&n!==void 0?n:0)+s.top)}}let ai=class{constructor(e){this.lastTouch_=null,this.onDocumentMouseMove_=this.onDocumentMouseMove_.bind(this),this.onDocumentMouseUp_=this.onDocumentMouseUp_.bind(this),this.onMouseDown_=this.onMouseDown_.bind(this),this.onTouchEnd_=this.onTouchEnd_.bind(this),this.onTouchMove_=this.onTouchMove_.bind(this),this.onTouchStart_=this.onTouchStart_.bind(this),this.elem_=e,this.emitter=new kt,e.addEventListener("touchstart",this.onTouchStart_,{passive:!1}),e.addEventListener("touchmove",this.onTouchMove_,{passive:!0}),e.addEventListener("touchend",this.onTouchEnd_),e.addEventListener("mousedown",this.onMouseDown_)}computePosition_(e){const t=this.elem_.getBoundingClientRect();return{bounds:{width:t.width,height:t.height},point:e?{x:e.x,y:e.y}:null}}onMouseDown_(e){var t;e.preventDefault(),(t=e.currentTarget)===null||t===void 0||t.focus();const n=this.elem_.ownerDocument;n.addEventListener("mousemove",this.onDocumentMouseMove_),n.addEventListener("mouseup",this.onDocumentMouseUp_),this.emitter.emit("down",{altKey:e.altKey,data:this.computePosition_(ll(e,this.elem_)),sender:this,shiftKey:e.shiftKey})}onDocumentMouseMove_(e){this.emitter.emit("move",{altKey:e.altKey,data:this.computePosition_(ll(e,this.elem_)),sender:this,shiftKey:e.shiftKey})}onDocumentMouseUp_(e){const t=this.elem_.ownerDocument;t.removeEventListener("mousemove",this.onDocumentMouseMove_),t.removeEventListener("mouseup",this.onDocumentMouseUp_),this.emitter.emit("up",{altKey:e.altKey,data:this.computePosition_(ll(e,this.elem_)),sender:this,shiftKey:e.shiftKey})}onTouchStart_(e){e.preventDefault();const t=e.targetTouches.item(0),n=this.elem_.getBoundingClientRect();this.emitter.emit("down",{altKey:e.altKey,data:this.computePosition_(t?{x:t.clientX-n.left,y:t.clientY-n.top}:void 0),sender:this,shiftKey:e.shiftKey}),this.lastTouch_=t}onTouchMove_(e){const t=e.targetTouches.item(0),n=this.elem_.getBoundingClientRect();this.emitter.emit("move",{altKey:e.altKey,data:this.computePosition_(t?{x:t.clientX-n.left,y:t.clientY-n.top}:void 0),sender:this,shiftKey:e.shiftKey}),this.lastTouch_=t}onTouchEnd_(e){var t;const n=(t=e.targetTouches.item(0))!==null&&t!==void 0?t:this.lastTouch_,i=this.elem_.getBoundingClientRect();this.emitter.emit("up",{altKey:e.altKey,data:this.computePosition_(n?{x:n.clientX-i.left,y:n.clientY-i.top}:void 0),sender:this,shiftKey:e.shiftKey})}};const xr=Xe("txt");let D0=class{constructor(e,t){this.onChange_=this.onChange_.bind(this),this.props_=t.props,this.props_.emitter.on("change",this.onChange_),this.element=e.createElement("div"),this.element.classList.add(xr(),xr(void 0,"num")),t.arrayPosition&&this.element.classList.add(xr(void 0,t.arrayPosition)),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("input");n.classList.add(xr("i")),n.type="text",t.viewProps.bindDisabled(n),this.element.appendChild(n),this.inputElement=n,this.onDraggingChange_=this.onDraggingChange_.bind(this),this.dragging_=t.dragging,this.dragging_.emitter.on("change",this.onDraggingChange_),this.element.classList.add(xr()),this.inputElement.classList.add(xr("i"));const i=e.createElement("div");i.classList.add(xr("k")),this.element.appendChild(i),this.knobElement=i;const s=e.createElementNS($r,"svg");s.classList.add(xr("g")),this.knobElement.appendChild(s);const o=e.createElementNS($r,"path");o.classList.add(xr("gb")),s.appendChild(o),this.guideBodyElem_=o;const l=e.createElementNS($r,"path");l.classList.add(xr("gh")),s.appendChild(l),this.guideHeadElem_=l;const y=e.createElement("div");y.classList.add(Xe("tt")()),this.knobElement.appendChild(y),this.tooltipElem_=y,t.value.emitter.on("change",this.onChange_),this.value=t.value,this.refresh()}onDraggingChange_(e){if(e.rawValue===null){this.element.classList.remove(xr(void 0,"drg"));return}this.element.classList.add(xr(void 0,"drg"));const t=e.rawValue/this.props_.get("pointerScale"),n=t+(t>0?-1:t<0?1:0),i=Rt(-n,-4,4);this.guideHeadElem_.setAttributeNS(null,"d",[`M ${n+i},0 L${n},4 L${n+i},8`,`M ${t},-1 L${t},9`].join(" ")),this.guideBodyElem_.setAttributeNS(null,"d",`M 0,4 L${t},4`);const s=this.props_.get("formatter");this.tooltipElem_.textContent=s(this.value.rawValue),this.tooltipElem_.style.left=`${t}px`}refresh(){const e=this.props_.get("formatter");this.inputElement.value=e(this.value.rawValue)}onChange_(){this.refresh()}},Rs=class{constructor(e,t){var n;this.originRawValue_=0,this.onInputChange_=this.onInputChange_.bind(this),this.onInputKeyDown_=this.onInputKeyDown_.bind(this),this.onInputKeyUp_=this.onInputKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.parser_=t.parser,this.props=t.props,this.sliderProps_=(n=t.sliderProps)!==null&&n!==void 0?n:null,this.value=t.value,this.viewProps=t.viewProps,this.dragging_=dt(null),this.view=new D0(e,{arrayPosition:t.arrayPosition,dragging:this.dragging_,props:this.props,value:this.value,viewProps:this.viewProps}),this.view.inputElement.addEventListener("change",this.onInputChange_),this.view.inputElement.addEventListener("keydown",this.onInputKeyDown_),this.view.inputElement.addEventListener("keyup",this.onInputKeyUp_);const i=new ai(this.view.knobElement);i.emitter.on("down",this.onPointerDown_),i.emitter.on("move",this.onPointerMove_),i.emitter.on("up",this.onPointerUp_)}constrainValue_(e){var t,n;const i=(t=this.sliderProps_)===null||t===void 0?void 0:t.get("min"),s=(n=this.sliderProps_)===null||n===void 0?void 0:n.get("max");let o=e;return i!==void 0&&(o=Math.max(o,i)),s!==void 0&&(o=Math.min(o,s)),o}onInputChange_(e){const n=e.currentTarget.value,i=this.parser_(n);ut(i)||(this.value.rawValue=this.constrainValue_(i)),this.view.refresh()}onInputKeyDown_(e){const t=ar(this.props.get("keyScale"),xs(e));t!==0&&this.value.setRawValue(this.constrainValue_(this.value.rawValue+t),{forceEmit:!1,last:!1})}onInputKeyUp_(e){ar(this.props.get("keyScale"),xs(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}onPointerDown_(){this.originRawValue_=this.value.rawValue,this.dragging_.rawValue=0}computeDraggingValue_(e){if(!e.point)return null;const t=e.point.x-e.bounds.width/2;return this.constrainValue_(this.originRawValue_+t*this.props.get("pointerScale"))}onPointerMove_(e){const t=this.computeDraggingValue_(e.data);t!==null&&(this.value.setRawValue(t,{forceEmit:!1,last:!1}),this.dragging_.rawValue=this.value.rawValue-this.originRawValue_)}onPointerUp_(e){const t=this.computeDraggingValue_(e.data);t!==null&&(this.value.setRawValue(t,{forceEmit:!0,last:!0}),this.dragging_.rawValue=null)}};const ul=Xe("sld");let M0=class{constructor(e,t){this.onChange_=this.onChange_.bind(this),this.props_=t.props,this.props_.emitter.on("change",this.onChange_),this.element=e.createElement("div"),this.element.classList.add(ul()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(ul("t")),t.viewProps.bindTabIndex(n),this.element.appendChild(n),this.trackElement=n;const i=e.createElement("div");i.classList.add(ul("k")),this.trackElement.appendChild(i),this.knobElement=i,t.value.emitter.on("change",this.onChange_),this.value=t.value,this.update_()}update_(){const e=Rt(et(this.value.rawValue,this.props_.get("min"),this.props_.get("max"),0,100),0,100);this.knobElement.style.width=`${e}%`}onChange_(){this.update_()}},I0=class{constructor(e,t){this.onKeyDown_=this.onKeyDown_.bind(this),this.onKeyUp_=this.onKeyUp_.bind(this),this.onPointerDownOrMove_=this.onPointerDownOrMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.props=t.props,this.view=new M0(e,{props:this.props,value:this.value,viewProps:this.viewProps}),this.ptHandler_=new ai(this.view.trackElement),this.ptHandler_.emitter.on("down",this.onPointerDownOrMove_),this.ptHandler_.emitter.on("move",this.onPointerDownOrMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.trackElement.addEventListener("keydown",this.onKeyDown_),this.view.trackElement.addEventListener("keyup",this.onKeyUp_)}handlePointerEvent_(e,t){e.point&&this.value.setRawValue(et(Rt(e.point.x,0,e.bounds.width),0,e.bounds.width,this.props.get("min"),this.props.get("max")),t)}onPointerDownOrMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onKeyDown_(e){const t=ar(this.props.get("keyScale"),ln(e));t!==0&&this.value.setRawValue(this.value.rawValue+t,{forceEmit:!1,last:!1})}onKeyUp_(e){ar(this.props.get("keyScale"),ln(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}};const cl=Xe("sldtxt");let F0=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(cl());const n=e.createElement("div");n.classList.add(cl("s")),this.sliderView_=t.sliderView,n.appendChild(this.sliderView_.element),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(cl("t")),this.textView_=t.textView,i.appendChild(this.textView_.element),this.element.appendChild(i)}},Ba=class{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.sliderC_=new I0(e,{props:t.sliderProps,value:t.value,viewProps:this.viewProps}),this.textC_=new Rs(e,{parser:t.parser,props:t.textProps,sliderProps:t.sliderProps,value:t.value,viewProps:t.viewProps}),this.view=new F0(e,{sliderView:this.sliderC_.view,textView:this.textC_.view})}get sliderController(){return this.sliderC_}get textController(){return this.textC_}importProps(e){return fr(e,null,t=>({max:t.required.number,min:t.required.number}),t=>{const n=this.sliderC_.props;return n.set("max",t.max),n.set("min",t.min),!0})}exportProps(){const e=this.sliderC_.props;return mr(null,{max:e.get("max"),min:e.get("min")})}};function Pp(r){return{sliderProps:new Ue({keyScale:r.keyScale,max:r.max,min:r.min}),textProps:new Ue({formatter:dt(r.formatter),keyScale:r.keyScale,pointerScale:dt(r.pointerScale)})}}const $0={containerUnitSize:"cnt-usz"};function Ap(r){return`--${$0[r]}`}function Cs(r){return ap(r)}function Sn(r){if(Pl(r))return bt(r,Cs)}function rn(r,e){if(!r)return;const t=[],n=np(r,e);n&&t.push(n);const i=ip(r);return i&&t.push(i),new Ls(t)}function B0(r){return r?r.major===Fi.major:!1}function Sp(r){if(r==="inline"||r==="popup")return r}function Ds(r,e){r.write(e)}const Aa=Xe("ckb");let N0=class{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.element=e.createElement("div"),this.element.classList.add(Aa()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("label");n.classList.add(Aa("l")),this.element.appendChild(n),this.labelElement=n;const i=e.createElement("input");i.classList.add(Aa("i")),i.type="checkbox",this.labelElement.appendChild(i),this.inputElement=i,t.viewProps.bindDisabled(this.inputElement);const s=e.createElement("div");s.classList.add(Aa("w")),this.labelElement.appendChild(s);const o=Xa(e,"check");s.appendChild(o),t.value.emitter.on("change",this.onValueChange_),this.value=t.value,this.update_()}update_(){this.inputElement.checked=this.value.rawValue}onValueChange_(){this.update_()}},G0=class{constructor(e,t){this.onInputChange_=this.onInputChange_.bind(this),this.onLabelMouseDown_=this.onLabelMouseDown_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.view=new N0(e,{value:this.value,viewProps:this.viewProps}),this.view.inputElement.addEventListener("change",this.onInputChange_),this.view.labelElement.addEventListener("mousedown",this.onLabelMouseDown_)}onInputChange_(e){const t=e.currentTarget;this.value.rawValue=t.checked,e.preventDefault(),e.stopPropagation()}onLabelMouseDown_(e){e.preventDefault()}};function j0(r){const e=[],t=ru(r.options);return t&&e.push(t),new Ls(e)}const U0=Qt({id:"input-bool",type:"input",accept:(r,e)=>{if(typeof r!="boolean")return null;const t=bt(e,n=>({options:n.optional.custom(Os),readonly:n.optional.constant(!1)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>xp,constraint:r=>j0(r.params),writer:r=>Ds},controller:r=>{const e=r.document,t=r.value,n=r.constraint,i=n&&Fa(n,Vs);return i?new Vn(e,{props:new Ue({options:i.values.value("options")}),value:t,viewProps:r.viewProps}):new G0(e,{value:t,viewProps:r.viewProps})},api(r){return typeof r.controller.value.rawValue!="boolean"?null:r.controller.valueController instanceof Vn?new eu(r.controller):null}}),Xn=Xe("col");let z0=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Xn()),t.foldable.bindExpandedClass(this.element,Xn(void 0,"expanded")),Nr(t.foldable,"completed",Ii(this.element,Xn(void 0,"cpl")));const n=e.createElement("div");n.classList.add(Xn("h")),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(Xn("s")),n.appendChild(i),this.swatchElement=i;const s=e.createElement("div");if(s.classList.add(Xn("t")),n.appendChild(s),this.textElement=s,t.pickerLayout==="inline"){const o=e.createElement("div");o.classList.add(Xn("p")),this.element.appendChild(o),this.pickerElement=o}else this.pickerElement=null}};function H0(r,e,t){const n=Rt(r/255,0,1),i=Rt(e/255,0,1),s=Rt(t/255,0,1),o=Math.max(n,i,s),l=Math.min(n,i,s),y=o-l;let x=0,B=0;const U=(l+o)/2;return y!==0&&(B=y/(1-Math.abs(o+l-1)),n===o?x=(i-s)/y:i===o?x=2+(s-n)/y:x=4+(n-i)/y,x=x/6+(x<0?1:0)),[x*360,B*100,U*100]}function K0(r,e,t){const n=(r%360+360)%360,i=Rt(e/100,0,1),s=Rt(t/100,0,1),o=(1-Math.abs(2*s-1))*i,l=o*(1-Math.abs(n/60%2-1)),y=s-o/2;let x,B,U;return n>=0&&n<60?[x,B,U]=[o,l,0]:n>=60&&n<120?[x,B,U]=[l,o,0]:n>=120&&n<180?[x,B,U]=[0,o,l]:n>=180&&n<240?[x,B,U]=[0,l,o]:n>=240&&n<300?[x,B,U]=[l,0,o]:[x,B,U]=[o,0,l],[(x+y)*255,(B+y)*255,(U+y)*255]}function q0(r,e,t){const n=Rt(r/255,0,1),i=Rt(e/255,0,1),s=Rt(t/255,0,1),o=Math.max(n,i,s),l=Math.min(n,i,s),y=o-l;let x;y===0?x=0:o===n?x=60*(((i-s)/y%6+6)%6):o===i?x=60*((s-n)/y+2):x=60*((n-i)/y+4);const B=o===0?0:y/o,U=o;return[x,B*100,U*100]}function Tp(r,e,t){const n=ep(r,360),i=Rt(e/100,0,1),s=Rt(t/100,0,1),o=s*i,l=o*(1-Math.abs(n/60%2-1)),y=s-o;let x,B,U;return n>=0&&n<60?[x,B,U]=[o,l,0]:n>=60&&n<120?[x,B,U]=[l,o,0]:n>=120&&n<180?[x,B,U]=[0,o,l]:n>=180&&n<240?[x,B,U]=[0,l,o]:n>=240&&n<300?[x,B,U]=[l,0,o]:[x,B,U]=[o,0,l],[(x+y)*255,(B+y)*255,(U+y)*255]}function X0(r,e,t){const n=t+e*(100-Math.abs(2*t-100))/200;return[r,n!==0?e*(100-Math.abs(2*t-100))/n:0,t+e*(100-Math.abs(2*t-100))/200]}function Y0(r,e,t){const n=100-Math.abs(t*(200-e)/100-100);return[r,n!==0?e*t/n:0,t*(200-e)/200]}function Gr(r){return[r[0],r[1],r[2]]}function Wa(r,e){return[r[0],r[1],r[2],e]}const W0={hsl:{hsl:(r,e,t)=>[r,e,t],hsv:X0,rgb:K0},hsv:{hsl:Y0,hsv:(r,e,t)=>[r,e,t],rgb:Tp},rgb:{hsl:H0,hsv:q0,rgb:(r,e,t)=>[r,e,t]}};function Ri(r,e){return[e==="float"?1:r==="rgb"?255:360,e==="float"?1:r==="rgb"?255:100,e==="float"?1:r==="rgb"?255:100]}function Z0(r,e){return r===e?e:ep(r,e)}function kp(r,e,t){var n;const i=Ri(e,t);return[e==="rgb"?Rt(r[0],0,i[0]):Z0(r[0],i[0]),Rt(r[1],0,i[1]),Rt(r[2],0,i[2]),Rt((n=r[3])!==null&&n!==void 0?n:1,0,1)]}function rh(r,e,t,n){const i=Ri(e,t),s=Ri(e,n);return r.map((o,l)=>o/i[l]*s[l])}function Lp(r,e,t){const n=rh(r,e.mode,e.type,"int"),i=W0[e.mode][t.mode](...n);return rh(i,t.mode,"int",t.type)}let rt=class Vp{static black(){return new Vp([0,0,0],"rgb")}constructor(e,t){this.type="int",this.mode=t,this.comps_=kp(e,t,this.type)}getComponents(e){return Wa(Lp(Gr(this.comps_),{mode:this.mode,type:this.type},{mode:e??this.mode,type:this.type}),this.comps_[3])}toRgbaObject(){const e=this.getComponents("rgb");return{r:e[0],g:e[1],b:e[2],a:e[3]}}};const gn=Xe("colp");let Q0=class{constructor(e,t){this.alphaViews_=null,this.element=e.createElement("div"),this.element.classList.add(gn()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(gn("hsv"));const i=e.createElement("div");i.classList.add(gn("sv")),this.svPaletteView_=t.svPaletteView,i.appendChild(this.svPaletteView_.element),n.appendChild(i);const s=e.createElement("div");s.classList.add(gn("h")),this.hPaletteView_=t.hPaletteView,s.appendChild(this.hPaletteView_.element),n.appendChild(s),this.element.appendChild(n);const o=e.createElement("div");if(o.classList.add(gn("rgb")),this.textsView_=t.textsView,o.appendChild(this.textsView_.element),this.element.appendChild(o),t.alphaViews){this.alphaViews_={palette:t.alphaViews.palette,text:t.alphaViews.text};const l=e.createElement("div");l.classList.add(gn("a"));const y=e.createElement("div");y.classList.add(gn("ap")),y.appendChild(this.alphaViews_.palette.element),l.appendChild(y);const x=e.createElement("div");x.classList.add(gn("at")),x.appendChild(this.alphaViews_.text.element),l.appendChild(x),this.element.appendChild(l)}}get allFocusableElements(){const e=[this.svPaletteView_.element,this.hPaletteView_.element,this.textsView_.modeSelectElement,...this.textsView_.inputViews.map(t=>t.inputElement)];return this.alphaViews_&&e.push(this.alphaViews_.palette.element,this.alphaViews_.text.inputElement),e}};function J0(r){return r==="int"?"int":r==="float"?"float":void 0}function nu(r){return bt(r,e=>({color:e.optional.object({alpha:e.optional.boolean,type:e.optional.custom(J0)}),expanded:e.optional.boolean,picker:e.optional.custom(Sp),readonly:e.optional.constant(!1)}))}function ti(r){return r?.1:1}function Op(r){var e;return(e=r.color)===null||e===void 0?void 0:e.type}let iu=class{constructor(e,t){this.type="float",this.mode=t,this.comps_=kp(e,t,this.type)}getComponents(e){return Wa(Lp(Gr(this.comps_),{mode:this.mode,type:this.type},{mode:e??this.mode,type:this.type}),this.comps_[3])}toRgbaObject(){const e=this.getComponents("rgb");return{r:e[0],g:e[1],b:e[2],a:e[3]}}};const eg={int:(r,e)=>new rt(r,e),float:(r,e)=>new iu(r,e)};function su(r,e,t){return eg[t](r,e)}function tg(r){return r.type==="float"}function rg(r){return r.type==="int"}function ng(r){const e=r.getComponents(),t=Ri(r.mode,"int");return new rt([Math.round(et(e[0],0,1,0,t[0])),Math.round(et(e[1],0,1,0,t[1])),Math.round(et(e[2],0,1,0,t[2])),e[3]],r.mode)}function ig(r){const e=r.getComponents(),t=Ri(r.mode,"int");return new iu([et(e[0],0,t[0],0,1),et(e[1],0,t[1],0,1),et(e[2],0,t[2],0,1),e[3]],r.mode)}function Wt(r,e){if(r.type===e)return r;if(rg(r)&&e==="float")return ig(r);if(tg(r)&&e==="int")return ng(r);throw qt.shouldNeverHappen()}function sg(r,e){return r.alpha===e.alpha&&r.mode===e.mode&&r.notation===e.notation&&r.type===e.type}function Er(r,e){const t=r.match(/^(.+)%$/);return Math.min(t?parseFloat(t[1])*.01*e:parseFloat(r),e)}const ag={deg:r=>r,grad:r=>r*360/400,rad:r=>r*360/(2*Math.PI),turn:r=>r*360};function Rp(r){const e=r.match(/^([0-9.]+?)(deg|grad|rad|turn)$/);if(!e)return parseFloat(r);const t=parseFloat(e[1]),n=e[2];return ag[n](t)}function Dp(r){const e=r.match(/^rgb\(\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[Er(e[1],255),Er(e[2],255),Er(e[3],255)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])?null:t}function og(r){const e=Dp(r);return e?new rt(e,"rgb"):null}function Mp(r){const e=r.match(/^rgba\(\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[Er(e[1],255),Er(e[2],255),Er(e[3],255),Er(e[4],1)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])||isNaN(t[3])?null:t}function lg(r){const e=Mp(r);return e?new rt(e,"rgb"):null}function Ip(r){const e=r.match(/^hsl\(\s*([0-9A-Fa-f.]+(?:deg|grad|rad|turn)?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[Rp(e[1]),Er(e[2],100),Er(e[3],100)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])?null:t}function ug(r){const e=Ip(r);return e?new rt(e,"hsl"):null}function Fp(r){const e=r.match(/^hsla\(\s*([0-9A-Fa-f.]+(?:deg|grad|rad|turn)?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[Rp(e[1]),Er(e[2],100),Er(e[3],100),Er(e[4],1)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])||isNaN(t[3])?null:t}function cg(r){const e=Fp(r);return e?new rt(e,"hsl"):null}function $p(r){const e=r.match(/^#([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$/);if(e)return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)];const t=r.match(/^(?:#|0x)([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$/);return t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]:null}function dg(r){const e=$p(r);return e?new rt(e,"rgb"):null}function Bp(r){const e=r.match(/^#([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$/);if(e)return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16),et(parseInt(e[4]+e[4],16),0,255,0,1)];const t=r.match(/^(?:#|0x)?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$/);return t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16),et(parseInt(t[4],16),0,255,0,1)]:null}function hg(r){const e=Bp(r);return e?new rt(e,"rgb"):null}function Np(r){const e=r.match(/^\{\s*r\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*g\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*b\s*:\s*([0-9A-Fa-f.]+%?)\s*\}$/);if(!e)return null;const t=[parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])?null:t}function pg(r){return e=>{const t=Np(e);return t?su(t,"rgb",r):null}}function Gp(r){const e=r.match(/^\{\s*r\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*g\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*b\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*a\s*:\s*([0-9A-Fa-f.]+%?)\s*\}$/);if(!e)return null;const t=[parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3]),parseFloat(e[4])];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])||isNaN(t[3])?null:t}function fg(r){return e=>{const t=Gp(e);return t?su(t,"rgb",r):null}}const mg=[{parser:$p,result:{alpha:!1,mode:"rgb",notation:"hex"}},{parser:Bp,result:{alpha:!0,mode:"rgb",notation:"hex"}},{parser:Dp,result:{alpha:!1,mode:"rgb",notation:"func"}},{parser:Mp,result:{alpha:!0,mode:"rgb",notation:"func"}},{parser:Ip,result:{alpha:!1,mode:"hsl",notation:"func"}},{parser:Fp,result:{alpha:!0,mode:"hsl",notation:"func"}},{parser:Np,result:{alpha:!1,mode:"rgb",notation:"object"}},{parser:Gp,result:{alpha:!0,mode:"rgb",notation:"object"}}];function vg(r){return mg.reduce((e,{parser:t,result:n})=>e||(t(r)?n:null),null)}function bg(r,e="int"){const t=vg(r);return t?t.notation==="hex"&&e!=="float"?Object.assign(Object.assign({},t),{type:"int"}):t.notation==="func"?Object.assign(Object.assign({},t),{type:e}):null:null}function Ms(r){const e=[dg,hg,og,lg,ug,cg];e.push(pg("int"),fg("int"));const t=V0(e);return n=>{const i=t(n);return i?Wt(i,r):null}}function _g(r){const e=Ms("int");if(typeof r!="string")return rt.black();const t=e(r);return t??rt.black()}function jp(r){const e=Rt(Math.floor(r),0,255).toString(16);return e.length===1?`0${e}`:e}function au(r,e="#"){const t=Gr(r.getComponents("rgb")).map(jp).join("");return`${e}${t}`}function ou(r,e="#"){const t=r.getComponents("rgb"),n=[t[0],t[1],t[2],t[3]*255].map(jp).join("");return`${e}${n}`}function Up(r){const e=lr(0),t=Wt(r,"int");return`rgb(${Gr(t.getComponents("rgb")).map(i=>e(i)).join(", ")})`}function La(r){const e=lr(2),t=lr(0);return`rgba(${Wt(r,"int").getComponents("rgb").map((s,o)=>(o===3?e:t)(s)).join(", ")})`}function wg(r){const e=[lr(0),$a,$a],t=Wt(r,"int");return`hsl(${Gr(t.getComponents("hsl")).map((i,s)=>e[s](i)).join(", ")})`}function gg(r){const e=[lr(0),$a,$a,lr(2)];return`hsla(${Wt(r,"int").getComponents("hsl").map((i,s)=>e[s](i)).join(", ")})`}function zp(r,e){const t=lr(e==="float"?2:0),n=["r","g","b"],i=Wt(r,e);return`{${Gr(i.getComponents("rgb")).map((o,l)=>`${n[l]}: ${t(o)}`).join(", ")}}`}function yg(r){return e=>zp(e,r)}function Hp(r,e){const t=lr(2),n=lr(e==="float"?2:0),i=["r","g","b","a"];return`{${Wt(r,e).getComponents("rgb").map((l,y)=>{const x=y===3?t:n;return`${i[y]}: ${x(l)}`}).join(", ")}}`}function xg(r){return e=>Hp(e,r)}const Cg=[{format:{alpha:!1,mode:"rgb",notation:"hex",type:"int"},stringifier:au},{format:{alpha:!0,mode:"rgb",notation:"hex",type:"int"},stringifier:ou},{format:{alpha:!1,mode:"rgb",notation:"func",type:"int"},stringifier:Up},{format:{alpha:!0,mode:"rgb",notation:"func",type:"int"},stringifier:La},{format:{alpha:!1,mode:"hsl",notation:"func",type:"int"},stringifier:wg},{format:{alpha:!0,mode:"hsl",notation:"func",type:"int"},stringifier:gg},...["int","float"].reduce((r,e)=>[...r,{format:{alpha:!1,mode:"rgb",notation:"object",type:e},stringifier:yg(e)},{format:{alpha:!0,mode:"rgb",notation:"object",type:e},stringifier:xg(e)}],[])];function Kp(r){return Cg.reduce((e,t)=>e||(sg(t.format,r)?t.stringifier:null),null)}const us=Xe("apl");let Eg=class{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.value=t.value,this.value.emitter.on("change",this.onValueChange_),this.element=e.createElement("div"),this.element.classList.add(us()),t.viewProps.bindClassModifiers(this.element),t.viewProps.bindTabIndex(this.element);const n=e.createElement("div");n.classList.add(us("b")),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(us("c")),n.appendChild(i),this.colorElem_=i;const s=e.createElement("div");s.classList.add(us("m")),this.element.appendChild(s),this.markerElem_=s;const o=e.createElement("div");o.classList.add(us("p")),this.markerElem_.appendChild(o),this.previewElem_=o,this.update_()}update_(){const e=this.value.rawValue,t=e.getComponents("rgb"),n=new rt([t[0],t[1],t[2],0],"rgb"),i=new rt([t[0],t[1],t[2],255],"rgb"),s=["to right",La(n),La(i)];this.colorElem_.style.background=`linear-gradient(${s.join(",")})`,this.previewElem_.style.backgroundColor=La(e);const o=et(t[3],0,1,0,100);this.markerElem_.style.left=`${o}%`}onValueChange_(){this.update_()}},Pg=class{constructor(e,t){this.onKeyDown_=this.onKeyDown_.bind(this),this.onKeyUp_=this.onKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.view=new Eg(e,{value:this.value,viewProps:this.viewProps}),this.ptHandler_=new ai(this.view.element),this.ptHandler_.emitter.on("down",this.onPointerDown_),this.ptHandler_.emitter.on("move",this.onPointerMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.element.addEventListener("keydown",this.onKeyDown_),this.view.element.addEventListener("keyup",this.onKeyUp_)}handlePointerEvent_(e,t){if(!e.point)return;const n=e.point.x/e.bounds.width,i=this.value.rawValue,[s,o,l]=i.getComponents("hsv");this.value.setRawValue(new rt([s,o,l,n],"hsv"),t)}onPointerDown_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onKeyDown_(e){const t=ar(ti(!0),ln(e));if(t===0)return;const n=this.value.rawValue,[i,s,o,l]=n.getComponents("hsv");this.value.setRawValue(new rt([i,s,o,l+t],"hsv"),{forceEmit:!1,last:!1})}onKeyUp_(e){ar(ti(!0),ln(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}};const Ei=Xe("coltxt");function Ag(r){const e=r.createElement("select"),t=[{text:"RGB",value:"rgb"},{text:"HSL",value:"hsl"},{text:"HSV",value:"hsv"},{text:"HEX",value:"hex"}];return e.appendChild(t.reduce((n,i)=>{const s=r.createElement("option");return s.textContent=i.text,s.value=i.value,n.appendChild(s),n},r.createDocumentFragment())),e}let Sg=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Ei()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(Ei("m")),this.modeElem_=Ag(e),this.modeElem_.classList.add(Ei("ms")),n.appendChild(this.modeSelectElement),t.viewProps.bindDisabled(this.modeElem_);const i=e.createElement("div");i.classList.add(Ei("mm")),i.appendChild(Xa(e,"dropdown")),n.appendChild(i),this.element.appendChild(n);const s=e.createElement("div");s.classList.add(Ei("w")),this.element.appendChild(s),this.inputsElem_=s,this.inputViews_=t.inputViews,this.applyInputViews_(),sn(t.mode,o=>{this.modeElem_.value=o})}get modeSelectElement(){return this.modeElem_}get inputViews(){return this.inputViews_}set inputViews(e){this.inputViews_=e,this.applyInputViews_()}applyInputViews_(){up(this.inputsElem_);const e=this.element.ownerDocument;this.inputViews_.forEach(t=>{const n=e.createElement("div");n.classList.add(Ei("c")),n.appendChild(t.element),this.inputsElem_.appendChild(n)})}};function Tg(r){return lr(r==="float"?2:0)}function kg(r,e,t){const n=Ri(r,e)[t];return new Ts({min:0,max:n})}function Lg(r,e,t){return new Rs(r,{arrayPosition:t===0?"fst":t===2?"lst":"mid",parser:e.parser,props:Ue.fromObject({formatter:Tg(e.colorType),keyScale:ti(!1),pointerScale:e.colorType==="float"?.01:1}),value:dt(0,{constraint:kg(e.colorMode,e.colorType,t)}),viewProps:e.viewProps})}function Vg(r,e){const t={colorMode:e.colorMode,colorType:e.colorType,parser:on,viewProps:e.viewProps};return[0,1,2].map(n=>{const i=Lg(r,t,n);return Bi({primary:e.value,secondary:i.value,forward(s){return Wt(s,e.colorType).getComponents(e.colorMode)[n]},backward(s,o){const l=e.colorMode,x=Wt(s,e.colorType).getComponents(l);x[n]=o;const B=su(Wa(Gr(x),x[3]),l,e.colorType);return Wt(B,"int")}}),i})}function Og(r,e){const t=new ys(r,{parser:Ms("int"),props:Ue.fromObject({formatter:au}),value:dt(rt.black()),viewProps:e.viewProps});return Bi({primary:e.value,secondary:t.value,forward:n=>new rt(Gr(n.getComponents()),n.mode),backward:(n,i)=>new rt(Wa(Gr(i.getComponents(n.mode)),n.getComponents()[3]),n.mode)}),[t]}function Rg(r){return r!=="hex"}let Dg=class{constructor(e,t){this.onModeSelectChange_=this.onModeSelectChange_.bind(this),this.colorType_=t.colorType,this.value=t.value,this.viewProps=t.viewProps,this.colorMode=dt(this.value.rawValue.mode),this.ccs_=this.createComponentControllers_(e),this.view=new Sg(e,{mode:this.colorMode,inputViews:[this.ccs_[0].view,this.ccs_[1].view,this.ccs_[2].view],viewProps:this.viewProps}),this.view.modeSelectElement.addEventListener("change",this.onModeSelectChange_)}createComponentControllers_(e){const t=this.colorMode.rawValue;return Rg(t)?Vg(e,{colorMode:t,colorType:this.colorType_,value:this.value,viewProps:this.viewProps}):Og(e,{value:this.value,viewProps:this.viewProps})}onModeSelectChange_(e){const t=e.currentTarget;this.colorMode.rawValue=t.value,this.ccs_=this.createComponentControllers_(this.view.element.ownerDocument),this.view.inputViews=this.ccs_.map(n=>n.view)}};const dl=Xe("hpl");let Mg=class{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.value=t.value,this.value.emitter.on("change",this.onValueChange_),this.element=e.createElement("div"),this.element.classList.add(dl()),t.viewProps.bindClassModifiers(this.element),t.viewProps.bindTabIndex(this.element);const n=e.createElement("div");n.classList.add(dl("c")),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(dl("m")),this.element.appendChild(i),this.markerElem_=i,this.update_()}update_(){const e=this.value.rawValue,[t]=e.getComponents("hsv");this.markerElem_.style.backgroundColor=Up(new rt([t,100,100],"hsv"));const n=et(t,0,360,0,100);this.markerElem_.style.left=`${n}%`}onValueChange_(){this.update_()}},Ig=class{constructor(e,t){this.onKeyDown_=this.onKeyDown_.bind(this),this.onKeyUp_=this.onKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.view=new Mg(e,{value:this.value,viewProps:this.viewProps}),this.ptHandler_=new ai(this.view.element),this.ptHandler_.emitter.on("down",this.onPointerDown_),this.ptHandler_.emitter.on("move",this.onPointerMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.element.addEventListener("keydown",this.onKeyDown_),this.view.element.addEventListener("keyup",this.onKeyUp_)}handlePointerEvent_(e,t){if(!e.point)return;const n=et(Rt(e.point.x,0,e.bounds.width),0,e.bounds.width,0,360),i=this.value.rawValue,[,s,o,l]=i.getComponents("hsv");this.value.setRawValue(new rt([n,s,o,l],"hsv"),t)}onPointerDown_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onKeyDown_(e){const t=ar(ti(!1),ln(e));if(t===0)return;const n=this.value.rawValue,[i,s,o,l]=n.getComponents("hsv");this.value.setRawValue(new rt([i+t,s,o,l],"hsv"),{forceEmit:!1,last:!1})}onKeyUp_(e){ar(ti(!1),ln(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}};const hl=Xe("svp"),nh=64;let Fg=class{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.value=t.value,this.value.emitter.on("change",this.onValueChange_),this.element=e.createElement("div"),this.element.classList.add(hl()),t.viewProps.bindClassModifiers(this.element),t.viewProps.bindTabIndex(this.element);const n=e.createElement("canvas");n.height=nh,n.width=nh,n.classList.add(hl("c")),this.element.appendChild(n),this.canvasElement=n;const i=e.createElement("div");i.classList.add(hl("m")),this.element.appendChild(i),this.markerElem_=i,this.update_()}update_(){const e=Iw(this.canvasElement);if(!e)return;const n=this.value.rawValue.getComponents("hsv"),i=this.canvasElement.width,s=this.canvasElement.height,o=e.getImageData(0,0,i,s),l=o.data;for(let B=0;Bn.getComponents()[3],backward:(n,i)=>{const s=n.getComponents();return s[3]=i,new rt(s,n.mode)}}),this.textsC_=new Dg(e,{colorType:t.colorType,value:this.value,viewProps:this.viewProps}),this.view=new Q0(e,{alphaViews:this.alphaIcs_?{palette:this.alphaIcs_.palette.view,text:this.alphaIcs_.text.view}:null,hPaletteView:this.hPaletteC_.view,supportsAlpha:t.supportsAlpha,svPaletteView:this.svPaletteC_.view,textsView:this.textsC_.view,viewProps:this.viewProps})}get textsController(){return this.textsC_}};const pl=Xe("colsw");let Ng=class{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),t.value.emitter.on("change",this.onValueChange_),this.value=t.value,this.element=e.createElement("div"),this.element.classList.add(pl()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(pl("sw")),this.element.appendChild(n),this.swatchElem_=n;const i=e.createElement("button");i.classList.add(pl("b")),t.viewProps.bindDisabled(i),this.element.appendChild(i),this.buttonElement=i,this.update_()}update_(){const e=this.value.rawValue;this.swatchElem_.style.backgroundColor=ou(e)}onValueChange_(){this.update_()}},Gg=class{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.view=new Ng(e,{value:this.value,viewProps:this.viewProps})}},lu=class{constructor(e,t){this.onButtonBlur_=this.onButtonBlur_.bind(this),this.onButtonClick_=this.onButtonClick_.bind(this),this.onPopupChildBlur_=this.onPopupChildBlur_.bind(this),this.onPopupChildKeydown_=this.onPopupChildKeydown_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.foldable_=Ql.create(t.expanded),this.swatchC_=new Gg(e,{value:this.value,viewProps:this.viewProps});const n=this.swatchC_.view.buttonElement;n.addEventListener("blur",this.onButtonBlur_),n.addEventListener("click",this.onButtonClick_),this.textC_=new ys(e,{parser:t.parser,props:Ue.fromObject({formatter:t.formatter}),value:this.value,viewProps:this.viewProps}),this.view=new z0(e,{foldable:this.foldable_,pickerLayout:t.pickerLayout}),this.view.swatchElement.appendChild(this.swatchC_.view.element),this.view.textElement.appendChild(this.textC_.view.element),this.popC_=t.pickerLayout==="popup"?new yp(e,{viewProps:this.viewProps}):null;const i=new Bg(e,{colorType:t.colorType,supportsAlpha:t.supportsAlpha,value:this.value,viewProps:this.viewProps});i.view.allFocusableElements.forEach(s=>{s.addEventListener("blur",this.onPopupChildBlur_),s.addEventListener("keydown",this.onPopupChildKeydown_)}),this.pickerC_=i,this.popC_?(this.view.element.appendChild(this.popC_.view.element),this.popC_.view.element.appendChild(i.view.element),Bi({primary:this.foldable_.value("expanded"),secondary:this.popC_.shows,forward:s=>s,backward:(s,o)=>o})):this.view.pickerElement&&(this.view.pickerElement.appendChild(this.pickerC_.view.element),Jl(this.foldable_,this.view.pickerElement))}get textController(){return this.textC_}onButtonBlur_(e){if(!this.popC_)return;const t=this.view.element,n=e.relatedTarget;(!n||!t.contains(n))&&(this.popC_.shows.rawValue=!1)}onButtonClick_(){this.foldable_.set("expanded",!this.foldable_.get("expanded")),this.foldable_.get("expanded")&&this.pickerC_.view.allFocusableElements[0].focus()}onPopupChildBlur_(e){if(!this.popC_)return;const t=this.popC_.view.element,n=cp(e);n&&t.contains(n)||n&&n===this.swatchC_.view.buttonElement&&!Kl(t.ownerDocument)||(this.popC_.shows.rawValue=!1)}onPopupChildKeydown_(e){this.popC_?e.key==="Escape"&&(this.popC_.shows.rawValue=!1):this.view.pickerElement&&e.key==="Escape"&&this.swatchC_.view.buttonElement.focus()}};function jg(r){return Gr(r.getComponents("rgb")).reduce((e,t)=>e<<8|Math.floor(t)&255,0)}function Ug(r){return r.getComponents("rgb").reduce((e,t,n)=>{const i=Math.floor(n===3?t*255:t)&255;return e<<8|i},0)>>>0}function zg(r){return new rt([r>>16&255,r>>8&255,r&255],"rgb")}function Hg(r){return new rt([r>>24&255,r>>16&255,r>>8&255,et(r&255,0,255,0,1)],"rgb")}function Kg(r){return typeof r!="number"?rt.black():zg(r)}function qg(r){return typeof r!="number"?rt.black():Hg(r)}function Va(r,e){return typeof r!="object"||ut(r)?!1:e in r&&typeof r[e]=="number"}function qp(r){return Va(r,"r")&&Va(r,"g")&&Va(r,"b")}function Xp(r){return qp(r)&&Va(r,"a")}function Yp(r){return qp(r)}function uu(r,e){if(r.mode!==e.mode||r.type!==e.type)return!1;const t=r.getComponents(),n=e.getComponents();for(let i=0;i{Ds(t,e(n))}:null}function Yg(r){const e=r?Ug:jg;return(t,n)=>{Ds(t,e(n))}}function Wg(r,e,t){const i=Wt(e,t).toRgbaObject();r.writeProperty("r",i.r),r.writeProperty("g",i.g),r.writeProperty("b",i.b),r.writeProperty("a",i.a)}function Zg(r,e,t){const i=Wt(e,t).toRgbaObject();r.writeProperty("r",i.r),r.writeProperty("g",i.g),r.writeProperty("b",i.b)}function Qg(r,e){return(t,n)=>{r?Wg(t,n,e):Zg(t,n,e)}}function Jg(r){var e;return!!(!((e=r?.color)===null||e===void 0)&&e.alpha)}function ey(r){return r?e=>ou(e,"0x"):e=>au(e,"0x")}function ty(r){return"color"in r||r.view==="color"}const ry=Qt({id:"input-color-number",type:"input",accept:(r,e)=>{if(typeof r!="number"||!ty(e))return null;const t=nu(e);return t?{initialValue:r,params:Object.assign(Object.assign({},t),{supportsAlpha:Jg(e)})}:null},binding:{reader:r=>r.params.supportsAlpha?qg:Kg,equals:uu,writer:r=>Yg(r.params.supportsAlpha)},controller:r=>{var e,t;return new lu(r.document,{colorType:"int",expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,formatter:ey(r.params.supportsAlpha),parser:Ms("int"),pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",supportsAlpha:r.params.supportsAlpha,value:r.value,viewProps:r.viewProps})}});function ny(r,e){if(!Yp(r))return Wt(rt.black(),e);if(e==="int"){const t=ih(r);return new rt(t,"rgb")}if(e==="float"){const t=ih(r);return new iu(t,"rgb")}return Wt(rt.black(),"int")}function iy(r){return Xp(r)}function sy(r){return e=>{const t=ny(e,r);return Wt(t,"int")}}function ay(r,e){return t=>r?Hp(t,e):zp(t,e)}const oy=Qt({id:"input-color-object",type:"input",accept:(r,e)=>{var t;if(!Yp(r))return null;const n=nu(e);return n?{initialValue:r,params:Object.assign(Object.assign({},n),{colorType:(t=Op(e))!==null&&t!==void 0?t:"int"})}:null},binding:{reader:r=>sy(r.params.colorType),equals:uu,writer:r=>Qg(iy(r.initialValue),r.params.colorType)},controller:r=>{var e,t;const n=Xp(r.initialValue);return new lu(r.document,{colorType:r.params.colorType,expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,formatter:ay(n,r.params.colorType),parser:Ms("int"),pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",supportsAlpha:n,value:r.value,viewProps:r.viewProps})}}),ly=Qt({id:"input-color-string",type:"input",accept:(r,e)=>{if(typeof r!="string"||e.view==="text")return null;const t=bg(r,Op(e));if(!t)return null;const n=Kp(t);if(!n)return null;const i=nu(e);return i?{initialValue:r,params:Object.assign(Object.assign({},i),{format:t,stringifier:n})}:null},binding:{reader:()=>_g,equals:uu,writer:r=>{const e=Xg(r.params.format);if(!e)throw qt.notBindable();return e}},controller:r=>{var e,t;return new lu(r.document,{colorType:r.params.format.type,expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,formatter:r.params.stringifier,parser:Ms("int"),pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",supportsAlpha:r.params.format.alpha,value:r.value,viewProps:r.viewProps})}});let cu=class{constructor(e){this.components=e.components,this.asm_=e.assembly}constrain(e){const t=this.asm_.toComponents(e).map((n,i)=>{var s,o;return(o=(s=this.components[i])===null||s===void 0?void 0:s.constrain(n))!==null&&o!==void 0?o:n});return this.asm_.fromComponents(t)}};const sh=Xe("pndtxt");let uy=class{constructor(e,t){this.textViews=t.textViews,this.element=e.createElement("div"),this.element.classList.add(sh()),this.textViews.forEach(n=>{const i=e.createElement("div");i.classList.add(sh("a")),i.appendChild(n.element),this.element.appendChild(i)})}};function cy(r,e,t){return new Rs(r,{arrayPosition:t===0?"fst":t===e.axes.length-1?"lst":"mid",parser:e.parser,props:e.axes[t].textProps,value:dt(0,{constraint:e.axes[t].constraint}),viewProps:e.viewProps})}let du=class{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.acs_=t.axes.map((n,i)=>cy(e,t,i)),this.acs_.forEach((n,i)=>{Bi({primary:this.value,secondary:n.value,forward:s=>t.assembly.toComponents(s)[i],backward:(s,o)=>{const l=t.assembly.toComponents(s);return l[i]=o,t.assembly.fromComponents(l)}})}),this.view=new uy(e,{textViews:this.acs_.map(n=>n.view)})}get textControllers(){return this.acs_}},dy=class extends gs{get max(){return this.controller.valueController.sliderController.props.get("max")}set max(e){this.controller.valueController.sliderController.props.set("max",e)}get min(){return this.controller.valueController.sliderController.props.get("min")}set min(e){this.controller.valueController.sliderController.props.set("min",e)}};function hy(r,e){const t=[],n=np(r,e);n&&t.push(n);const i=ip(r);i&&t.push(i);const s=ru(r.options);return s&&t.push(s),new Ls(t)}const py=Qt({id:"input-number",type:"input",accept:(r,e)=>{if(typeof r!="number")return null;const t=bt(e,n=>Object.assign(Object.assign({},ap(n)),{options:n.optional.custom(Os),readonly:n.optional.constant(!1)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>Jh,constraint:r=>hy(r.params,r.initialValue),writer:r=>Ds},controller:r=>{const e=r.value,t=r.constraint,n=t&&Fa(t,Vs);if(n)return new Vn(r.document,{props:new Ue({options:n.values.value("options")}),value:e,viewProps:r.viewProps});const i=sp(r.params,e.rawValue),s=t&&Fa(t,Ts);return s?new Ba(r.document,Object.assign(Object.assign({},Pp(Object.assign(Object.assign({},i),{keyScale:dt(i.keyScale),max:s.values.value("max"),min:s.values.value("min")}))),{parser:on,value:e,viewProps:r.viewProps})):new Rs(r.document,{parser:on,props:Ue.fromObject(i),value:e,viewProps:r.viewProps})},api(r){return typeof r.controller.value.rawValue!="number"?null:r.controller.valueController instanceof Ba?new dy(r.controller):r.controller.valueController instanceof Vn?new eu(r.controller):null}});let kn=class{constructor(e=0,t=0){this.x=e,this.y=t}getComponents(){return[this.x,this.y]}static isObject(e){if(ut(e))return!1;const t=e.x,n=e.y;return!(typeof t!="number"||typeof n!="number")}static equals(e,t){return e.x===t.x&&e.y===t.y}toObject(){return{x:this.x,y:this.y}}};const Wp={toComponents:r=>r.getComponents(),fromComponents:r=>new kn(...r)},Pi=Xe("p2d");let fy=class{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Pi()),t.viewProps.bindClassModifiers(this.element),sn(t.expanded,Ii(this.element,Pi(void 0,"expanded")));const n=e.createElement("div");n.classList.add(Pi("h")),this.element.appendChild(n);const i=e.createElement("button");i.classList.add(Pi("b")),i.appendChild(Xa(e,"p2dpad")),t.viewProps.bindDisabled(i),n.appendChild(i),this.buttonElement=i;const s=e.createElement("div");if(s.classList.add(Pi("t")),n.appendChild(s),this.textElement=s,t.pickerLayout==="inline"){const o=e.createElement("div");o.classList.add(Pi("p")),this.element.appendChild(o),this.pickerElement=o}else this.pickerElement=null}};const yn=Xe("p2dp");let my=class{constructor(e,t){this.onFoldableChange_=this.onFoldableChange_.bind(this),this.onPropsChange_=this.onPropsChange_.bind(this),this.onValueChange_=this.onValueChange_.bind(this),this.props_=t.props,this.props_.emitter.on("change",this.onPropsChange_),this.element=e.createElement("div"),this.element.classList.add(yn()),t.layout==="popup"&&this.element.classList.add(yn(void 0,"p")),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(yn("p")),t.viewProps.bindTabIndex(n),this.element.appendChild(n),this.padElement=n;const i=e.createElementNS($r,"svg");i.classList.add(yn("g")),this.padElement.appendChild(i),this.svgElem_=i;const s=e.createElementNS($r,"line");s.classList.add(yn("ax")),s.setAttributeNS(null,"x1","0"),s.setAttributeNS(null,"y1","50%"),s.setAttributeNS(null,"x2","100%"),s.setAttributeNS(null,"y2","50%"),this.svgElem_.appendChild(s);const o=e.createElementNS($r,"line");o.classList.add(yn("ax")),o.setAttributeNS(null,"x1","50%"),o.setAttributeNS(null,"y1","0"),o.setAttributeNS(null,"x2","50%"),o.setAttributeNS(null,"y2","100%"),this.svgElem_.appendChild(o);const l=e.createElementNS($r,"line");l.classList.add(yn("l")),l.setAttributeNS(null,"x1","50%"),l.setAttributeNS(null,"y1","50%"),this.svgElem_.appendChild(l),this.lineElem_=l;const y=e.createElement("div");y.classList.add(yn("m")),this.padElement.appendChild(y),this.markerElem_=y,t.value.emitter.on("change",this.onValueChange_),this.value=t.value,this.update_()}get allFocusableElements(){return[this.padElement]}update_(){const[e,t]=this.value.rawValue.getComponents(),n=this.props_.get("max"),i=et(e,-n,+n,0,100),s=et(t,-n,+n,0,100),o=this.props_.get("invertsY")?100-s:s;this.lineElem_.setAttributeNS(null,"x2",`${i}%`),this.lineElem_.setAttributeNS(null,"y2",`${o}%`),this.markerElem_.style.left=`${i}%`,this.markerElem_.style.top=`${o}%`}onValueChange_(){this.update_()}onPropsChange_(){this.update_()}onFoldableChange_(){this.update_()}};function ah(r,e,t){return[ar(e[0],ln(r)),ar(e[1],xs(r))*(t?1:-1)]}let vy=class{constructor(e,t){this.onPadKeyDown_=this.onPadKeyDown_.bind(this),this.onPadKeyUp_=this.onPadKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.view=new my(e,{layout:t.layout,props:this.props,value:this.value,viewProps:this.viewProps}),this.ptHandler_=new ai(this.view.padElement),this.ptHandler_.emitter.on("down",this.onPointerDown_),this.ptHandler_.emitter.on("move",this.onPointerMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.padElement.addEventListener("keydown",this.onPadKeyDown_),this.view.padElement.addEventListener("keyup",this.onPadKeyUp_)}handlePointerEvent_(e,t){if(!e.point)return;const n=this.props.get("max"),i=et(e.point.x,0,e.bounds.width,-n,+n),s=et(this.props.get("invertsY")?e.bounds.height-e.point.y:e.point.y,0,e.bounds.height,-n,+n);this.value.setRawValue(new kn(i,s),t)}onPointerDown_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onPadKeyDown_(e){Ep(e.key)&&e.preventDefault();const[t,n]=ah(e,[this.props.get("xKeyScale"),this.props.get("yKeyScale")],this.props.get("invertsY"));t===0&&n===0||this.value.setRawValue(new kn(this.value.rawValue.x+t,this.value.rawValue.y+n),{forceEmit:!1,last:!1})}onPadKeyUp_(e){const[t,n]=ah(e,[this.props.get("xKeyScale"),this.props.get("yKeyScale")],this.props.get("invertsY"));t===0&&n===0||this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}},by=class{constructor(e,t){var n,i;this.onPopupChildBlur_=this.onPopupChildBlur_.bind(this),this.onPopupChildKeydown_=this.onPopupChildKeydown_.bind(this),this.onPadButtonBlur_=this.onPadButtonBlur_.bind(this),this.onPadButtonClick_=this.onPadButtonClick_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.foldable_=Ql.create(t.expanded),this.popC_=t.pickerLayout==="popup"?new yp(e,{viewProps:this.viewProps}):null;const s=new vy(e,{layout:t.pickerLayout,props:new Ue({invertsY:dt(t.invertsY),max:dt(t.max),xKeyScale:t.axes[0].textProps.value("keyScale"),yKeyScale:t.axes[1].textProps.value("keyScale")}),value:this.value,viewProps:this.viewProps});s.view.allFocusableElements.forEach(o=>{o.addEventListener("blur",this.onPopupChildBlur_),o.addEventListener("keydown",this.onPopupChildKeydown_)}),this.pickerC_=s,this.textC_=new du(e,{assembly:Wp,axes:t.axes,parser:t.parser,value:this.value,viewProps:this.viewProps}),this.view=new fy(e,{expanded:this.foldable_.value("expanded"),pickerLayout:t.pickerLayout,viewProps:this.viewProps}),this.view.textElement.appendChild(this.textC_.view.element),(n=this.view.buttonElement)===null||n===void 0||n.addEventListener("blur",this.onPadButtonBlur_),(i=this.view.buttonElement)===null||i===void 0||i.addEventListener("click",this.onPadButtonClick_),this.popC_?(this.view.element.appendChild(this.popC_.view.element),this.popC_.view.element.appendChild(this.pickerC_.view.element),Bi({primary:this.foldable_.value("expanded"),secondary:this.popC_.shows,forward:o=>o,backward:(o,l)=>l})):this.view.pickerElement&&(this.view.pickerElement.appendChild(this.pickerC_.view.element),Jl(this.foldable_,this.view.pickerElement))}get textController(){return this.textC_}onPadButtonBlur_(e){if(!this.popC_)return;const t=this.view.element,n=e.relatedTarget;(!n||!t.contains(n))&&(this.popC_.shows.rawValue=!1)}onPadButtonClick_(){this.foldable_.set("expanded",!this.foldable_.get("expanded")),this.foldable_.get("expanded")&&this.pickerC_.view.allFocusableElements[0].focus()}onPopupChildBlur_(e){if(!this.popC_)return;const t=this.popC_.view.element,n=cp(e);n&&t.contains(n)||n&&n===this.view.buttonElement&&!Kl(t.ownerDocument)||(this.popC_.shows.rawValue=!1)}onPopupChildKeydown_(e){this.popC_?e.key==="Escape"&&(this.popC_.shows.rawValue=!1):this.view.pickerElement&&e.key==="Escape"&&this.view.buttonElement.focus()}};function _y(r){return kn.isObject(r)?new kn(r.x,r.y):new kn}function wy(r,e){r.writeProperty("x",e.x),r.writeProperty("y",e.y)}function gy(r,e){return new cu({assembly:Wp,components:[rn(Object.assign(Object.assign({},r),r.x),e.x),rn(Object.assign(Object.assign({},r),r.y),e.y)]})}function oh(r,e){var t,n;if(!ut(r.min)||!ut(r.max))return Math.max(Math.abs((t=r.min)!==null&&t!==void 0?t:0),Math.abs((n=r.max)!==null&&n!==void 0?n:0));const i=tp(r);return Math.max(Math.abs(i)*10,Math.abs(e)*10)}function yy(r,e){var t,n;const i=oh(Jn(r,(t=r.x)!==null&&t!==void 0?t:{}),e.x),s=oh(Jn(r,(n=r.y)!==null&&n!==void 0?n:{}),e.y);return Math.max(i,s)}function xy(r){if(!("y"in r))return!1;const e=r.y;return e&&"inverted"in e?!!e.inverted:!1}const Cy=Qt({id:"input-point2d",type:"input",accept:(r,e)=>{if(!kn.isObject(r))return null;const t=bt(e,n=>Object.assign(Object.assign({},Cs(n)),{expanded:n.optional.boolean,picker:n.optional.custom(Sp),readonly:n.optional.constant(!1),x:n.optional.custom(Sn),y:n.optional.object(Object.assign(Object.assign({},Cs(n)),{inverted:n.optional.boolean}))}));return t?{initialValue:r,params:t}:null},binding:{reader:()=>_y,constraint:r=>gy(r.params,r.initialValue),equals:kn.equals,writer:()=>wy},controller:r=>{var e,t;const n=r.document,i=r.value,s=r.constraint,o=[r.params.x,r.params.y];return new by(n,{axes:i.rawValue.getComponents().map((l,y)=>{var x;return Hl({constraint:s.components[y],initialValue:l,params:Jn(r.params,(x=o[y])!==null&&x!==void 0?x:{})})}),expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,invertsY:xy(r.params),max:yy(r.params,i.rawValue),parser:on,pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",value:i,viewProps:r.viewProps})}});let ki=class{constructor(e=0,t=0,n=0){this.x=e,this.y=t,this.z=n}getComponents(){return[this.x,this.y,this.z]}static isObject(e){if(ut(e))return!1;const t=e.x,n=e.y,i=e.z;return!(typeof t!="number"||typeof n!="number"||typeof i!="number")}static equals(e,t){return e.x===t.x&&e.y===t.y&&e.z===t.z}toObject(){return{x:this.x,y:this.y,z:this.z}}};const Zp={toComponents:r=>r.getComponents(),fromComponents:r=>new ki(...r)};function Ey(r){return ki.isObject(r)?new ki(r.x,r.y,r.z):new ki}function Py(r,e){r.writeProperty("x",e.x),r.writeProperty("y",e.y),r.writeProperty("z",e.z)}function Ay(r,e){return new cu({assembly:Zp,components:[rn(Object.assign(Object.assign({},r),r.x),e.x),rn(Object.assign(Object.assign({},r),r.y),e.y),rn(Object.assign(Object.assign({},r),r.z),e.z)]})}const Sy=Qt({id:"input-point3d",type:"input",accept:(r,e)=>{if(!ki.isObject(r))return null;const t=bt(e,n=>Object.assign(Object.assign({},Cs(n)),{readonly:n.optional.constant(!1),x:n.optional.custom(Sn),y:n.optional.custom(Sn),z:n.optional.custom(Sn)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>Ey,constraint:r=>Ay(r.params,r.initialValue),equals:ki.equals,writer:r=>Py},controller:r=>{const e=r.value,t=r.constraint,n=[r.params.x,r.params.y,r.params.z];return new du(r.document,{assembly:Zp,axes:e.rawValue.getComponents().map((i,s)=>{var o;return Hl({constraint:t.components[s],initialValue:i,params:Jn(r.params,(o=n[s])!==null&&o!==void 0?o:{})})}),parser:on,value:e,viewProps:r.viewProps})}});let Li=class{constructor(e=0,t=0,n=0,i=0){this.x=e,this.y=t,this.z=n,this.w=i}getComponents(){return[this.x,this.y,this.z,this.w]}static isObject(e){if(ut(e))return!1;const t=e.x,n=e.y,i=e.z,s=e.w;return!(typeof t!="number"||typeof n!="number"||typeof i!="number"||typeof s!="number")}static equals(e,t){return e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w}toObject(){return{x:this.x,y:this.y,z:this.z,w:this.w}}};const Qp={toComponents:r=>r.getComponents(),fromComponents:r=>new Li(...r)};function Ty(r){return Li.isObject(r)?new Li(r.x,r.y,r.z,r.w):new Li}function ky(r,e){r.writeProperty("x",e.x),r.writeProperty("y",e.y),r.writeProperty("z",e.z),r.writeProperty("w",e.w)}function Ly(r,e){return new cu({assembly:Qp,components:[rn(Object.assign(Object.assign({},r),r.x),e.x),rn(Object.assign(Object.assign({},r),r.y),e.y),rn(Object.assign(Object.assign({},r),r.z),e.z),rn(Object.assign(Object.assign({},r),r.w),e.w)]})}const Vy=Qt({id:"input-point4d",type:"input",accept:(r,e)=>{if(!Li.isObject(r))return null;const t=bt(e,n=>Object.assign(Object.assign({},Cs(n)),{readonly:n.optional.constant(!1),w:n.optional.custom(Sn),x:n.optional.custom(Sn),y:n.optional.custom(Sn),z:n.optional.custom(Sn)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>Ty,constraint:r=>Ly(r.params,r.initialValue),equals:Li.equals,writer:r=>ky},controller:r=>{const e=r.value,t=r.constraint,n=[r.params.x,r.params.y,r.params.z,r.params.w];return new du(r.document,{assembly:Qp,axes:e.rawValue.getComponents().map((i,s)=>{var o;return Hl({constraint:t.components[s],initialValue:i,params:Jn(r.params,(o=n[s])!==null&&o!==void 0?o:{})})}),parser:on,value:e,viewProps:r.viewProps})}});function Oy(r){const e=[],t=ru(r.options);return t&&e.push(t),new Ls(e)}const Ry=Qt({id:"input-string",type:"input",accept:(r,e)=>{if(typeof r!="string")return null;const t=bt(e,n=>({readonly:n.optional.constant(!1),options:n.optional.custom(Os)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>Cp,constraint:r=>Oy(r.params),writer:r=>Ds},controller:r=>{const e=r.document,t=r.value,n=r.constraint,i=n&&Fa(n,Vs);return i?new Vn(e,{props:new Ue({options:i.values.value("options")}),value:t,viewProps:r.viewProps}):new ys(e,{parser:s=>s,props:Ue.fromObject({formatter:Ll}),value:t,viewProps:r.viewProps})},api(r){return typeof r.controller.value.rawValue!="string"?null:r.controller.valueController instanceof Vn?new eu(r.controller):null}}),Is={monitor:{defaultInterval:200,defaultRows:3}},lh=Xe("mll");let Dy=class{constructor(e,t){this.onValueUpdate_=this.onValueUpdate_.bind(this),this.formatter_=t.formatter,this.element=e.createElement("div"),this.element.classList.add(lh()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("textarea");n.classList.add(lh("i")),n.style.height=`calc(var(${Ap("containerUnitSize")}) * ${t.rows})`,n.readOnly=!0,t.viewProps.bindDisabled(n),this.element.appendChild(n),this.textareaElem_=n,t.value.emitter.on("change",this.onValueUpdate_),this.value=t.value,this.update_()}update_(){const e=this.textareaElem_,t=e.scrollTop===e.scrollHeight-e.clientHeight,n=[];this.value.rawValue.forEach(i=>{i!==void 0&&n.push(this.formatter_(i))}),e.textContent=n.join(`
+`),t&&(e.scrollTop=e.scrollHeight)}onValueUpdate_(){this.update_()}},hu=class{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.view=new Dy(e,{formatter:t.formatter,rows:t.rows,value:this.value,viewProps:this.viewProps})}};const uh=Xe("sgl");let My=class{constructor(e,t){this.onValueUpdate_=this.onValueUpdate_.bind(this),this.formatter_=t.formatter,this.element=e.createElement("div"),this.element.classList.add(uh()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("input");n.classList.add(uh("i")),n.readOnly=!0,n.type="text",t.viewProps.bindDisabled(n),this.element.appendChild(n),this.inputElement=n,t.value.emitter.on("change",this.onValueUpdate_),this.value=t.value,this.update_()}update_(){const e=this.value.rawValue,t=e[e.length-1];this.inputElement.value=t!==void 0?this.formatter_(t):""}onValueUpdate_(){this.update_()}},pu=class{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.view=new My(e,{formatter:t.formatter,value:this.value,viewProps:this.viewProps})}};const Iy=Qt({id:"monitor-bool",type:"monitor",accept:(r,e)=>{if(typeof r!="boolean")return null;const t=bt(e,n=>({readonly:n.required.constant(!0),rows:n.optional.number}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>xp},controller:r=>{var e;return r.value.rawValue.length===1?new pu(r.document,{formatter:th,value:r.value,viewProps:r.viewProps}):new hu(r.document,{formatter:th,rows:(e=r.params.rows)!==null&&e!==void 0?e:Is.monitor.defaultRows,value:r.value,viewProps:r.viewProps})}});let Fy=class extends gs{get max(){return this.controller.valueController.props.get("max")}set max(e){this.controller.valueController.props.set("max",e)}get min(){return this.controller.valueController.props.get("min")}set min(e){this.controller.valueController.props.set("min",e)}};const xn=Xe("grl");let $y=class{constructor(e,t){this.onCursorChange_=this.onCursorChange_.bind(this),this.onValueUpdate_=this.onValueUpdate_.bind(this),this.element=e.createElement("div"),this.element.classList.add(xn()),t.viewProps.bindClassModifiers(this.element),this.formatter_=t.formatter,this.props_=t.props,this.cursor_=t.cursor,this.cursor_.emitter.on("change",this.onCursorChange_);const n=e.createElementNS($r,"svg");n.classList.add(xn("g")),n.style.height=`calc(var(${Ap("containerUnitSize")}) * ${t.rows})`,this.element.appendChild(n),this.svgElem_=n;const i=e.createElementNS($r,"polyline");this.svgElem_.appendChild(i),this.lineElem_=i;const s=e.createElement("div");s.classList.add(xn("t"),Xe("tt")()),this.element.appendChild(s),this.tooltipElem_=s,t.value.emitter.on("change",this.onValueUpdate_),this.value=t.value,this.update_()}get graphElement(){return this.svgElem_}update_(){const{clientWidth:e,clientHeight:t}=this.element,n=this.value.rawValue.length-1,i=this.props_.get("min"),s=this.props_.get("max"),o=[];this.value.rawValue.forEach((U,de)=>{if(U===void 0)return;const Se=et(de,0,n,0,e),Ce=et(U,i,s,t,0);o.push([Se,Ce].join(","))}),this.lineElem_.setAttributeNS(null,"points",o.join(" "));const l=this.tooltipElem_,y=this.value.rawValue[this.cursor_.rawValue];if(y===void 0){l.classList.remove(xn("t","a"));return}const x=et(this.cursor_.rawValue,0,n,0,e),B=et(y,i,s,t,0);l.style.left=`${x}px`,l.style.top=`${B}px`,l.textContent=`${this.formatter_(y)}`,l.classList.contains(xn("t","a"))||(l.classList.add(xn("t","a"),xn("t","in")),Ia(l),l.classList.remove(xn("t","in")))}onValueUpdate_(){this.update_()}onCursorChange_(){this.update_()}},Jp=class{constructor(e,t){if(this.onGraphMouseMove_=this.onGraphMouseMove_.bind(this),this.onGraphMouseLeave_=this.onGraphMouseLeave_.bind(this),this.onGraphPointerDown_=this.onGraphPointerDown_.bind(this),this.onGraphPointerMove_=this.onGraphPointerMove_.bind(this),this.onGraphPointerUp_=this.onGraphPointerUp_.bind(this),this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.cursor_=dt(-1),this.view=new $y(e,{cursor:this.cursor_,formatter:t.formatter,rows:t.rows,props:this.props,value:this.value,viewProps:this.viewProps}),!Kl(e))this.view.element.addEventListener("mousemove",this.onGraphMouseMove_),this.view.element.addEventListener("mouseleave",this.onGraphMouseLeave_);else{const n=new ai(this.view.element);n.emitter.on("down",this.onGraphPointerDown_),n.emitter.on("move",this.onGraphPointerMove_),n.emitter.on("up",this.onGraphPointerUp_)}}importProps(e){return fr(e,null,t=>({max:t.required.number,min:t.required.number}),t=>(this.props.set("max",t.max),this.props.set("min",t.min),!0))}exportProps(){return mr(null,{max:this.props.get("max"),min:this.props.get("min")})}onGraphMouseLeave_(){this.cursor_.rawValue=-1}onGraphMouseMove_(e){const{clientWidth:t}=this.view.element;this.cursor_.rawValue=Math.floor(et(e.offsetX,0,t,0,this.value.rawValue.length))}onGraphPointerDown_(e){this.onGraphPointerMove_(e)}onGraphPointerMove_(e){if(!e.data.point){this.cursor_.rawValue=-1;return}this.cursor_.rawValue=Math.floor(et(e.data.point.x,0,e.data.bounds.width,0,this.value.rawValue.length))}onGraphPointerUp_(){this.cursor_.rawValue=-1}};function Vl(r){return ut(r.format)?lr(2):r.format}function By(r){var e;return r.value.rawValue.length===1?new pu(r.document,{formatter:Vl(r.params),value:r.value,viewProps:r.viewProps}):new hu(r.document,{formatter:Vl(r.params),rows:(e=r.params.rows)!==null&&e!==void 0?e:Is.monitor.defaultRows,value:r.value,viewProps:r.viewProps})}function Ny(r){var e,t,n;return new Jp(r.document,{formatter:Vl(r.params),rows:(e=r.params.rows)!==null&&e!==void 0?e:Is.monitor.defaultRows,props:Ue.fromObject({max:(t=r.params.max)!==null&&t!==void 0?t:100,min:(n=r.params.min)!==null&&n!==void 0?n:0}),value:r.value,viewProps:r.viewProps})}function ch(r){return r.view==="graph"}const Gy=Qt({id:"monitor-number",type:"monitor",accept:(r,e)=>{if(typeof r!="number")return null;const t=bt(e,n=>({format:n.optional.function,max:n.optional.number,min:n.optional.number,readonly:n.required.constant(!0),rows:n.optional.number,view:n.optional.string}));return t?{initialValue:r,params:t}:null},binding:{defaultBufferSize:r=>ch(r)?64:1,reader:r=>Jh},controller:r=>ch(r.params)?Ny(r):By(r),api:r=>r.controller.valueController instanceof Jp?new Fy(r.controller):null}),jy=Qt({id:"monitor-string",type:"monitor",accept:(r,e)=>{if(typeof r!="string")return null;const t=bt(e,n=>({multiline:n.optional.boolean,readonly:n.required.constant(!0),rows:n.optional.number}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>Cp},controller:r=>{var e;const t=r.value;return t.rawValue.length>1||r.params.multiline?new hu(r.document,{formatter:Ll,rows:(e=r.params.rows)!==null&&e!==void 0?e:Is.monitor.defaultRows,value:t,viewProps:r.viewProps}):new pu(r.document,{formatter:Ll,value:t,viewProps:r.viewProps})}});class Uy{constructor(){this.map_=new Map}get(e){var t;return(t=this.map_.get(e))!==null&&t!==void 0?t:null}has(e){return this.map_.has(e)}add(e,t){return this.map_.set(e,t),e.viewProps.handleDispose(()=>{this.map_.delete(e)}),t}}class zy{constructor(e){this.target=e.target,this.reader_=e.reader,this.writer_=e.writer}read(){return this.reader_(this.target.read())}write(e){this.writer_(this.target,e)}inject(e){this.write(this.reader_(e))}}function Hy(r,e){var t;const n=r.accept(e.target.read(),e.params);if(ut(n))return null;const i={target:e.target,initialValue:n.initialValue,params:n.params},s=bt(e.params,U=>({disabled:U.optional.boolean,hidden:U.optional.boolean,label:U.optional.string,tag:U.optional.string})),o=r.binding.reader(i),l=r.binding.constraint?r.binding.constraint(i):void 0,y=new zy({reader:o,target:e.target,writer:r.binding.writer(i)}),x=new Tw(dt(o(n.initialValue),{constraint:l,equals:r.binding.equals}),y),B=r.controller({constraint:l,document:e.document,initialValue:n.initialValue,params:n.params,value:x,viewProps:si.create({disabled:s?.disabled,hidden:s?.hidden})});return new Uw(e.document,{blade:$i(),props:Ue.fromObject({label:"label"in e.params?(t=s?.label)!==null&&t!==void 0?t:null:e.target.key}),tag:s?.tag,value:x,valueController:B})}class Ky{constructor(e){this.target=e.target,this.reader_=e.reader}read(){return this.reader_(this.target.read())}}function qy(r,e){return e===0?new P0:new A0(r,e??Is.monitor.defaultInterval)}function Xy(r,e){var t,n,i;const s=r.accept(e.target.read(),e.params);if(ut(s))return null;const o={target:e.target,initialValue:s.initialValue,params:s.params},l=bt(e.params,de=>({bufferSize:de.optional.number,disabled:de.optional.boolean,hidden:de.optional.boolean,interval:de.optional.number,label:de.optional.string})),y=r.binding.reader(o),x=(n=(t=l?.bufferSize)!==null&&t!==void 0?t:r.binding.defaultBufferSize&&r.binding.defaultBufferSize(s.params))!==null&&n!==void 0?n:1,B=new Xw({binding:new Ky({reader:y,target:e.target}),bufferSize:x,ticker:qy(e.document,l?.interval)}),U=r.controller({document:e.document,params:s.params,value:B,viewProps:si.create({disabled:l?.disabled,hidden:l?.hidden})});return U.viewProps.bindDisabled(B.ticker),U.viewProps.handleDispose(()=>{B.ticker.dispose()}),new Ww(e.document,{blade:$i(),props:Ue.fromObject({label:"label"in e.params?(i=l?.label)!==null&&i!==void 0?i:null:e.target.key}),value:B,valueController:U})}class Yy{constructor(e){this.pluginsMap_={blades:[],inputs:[],monitors:[]},this.apiCache_=e}getAll(){return[...this.pluginsMap_.blades,...this.pluginsMap_.inputs,...this.pluginsMap_.monitors]}register(e,t){if(!B0(t.core))throw qt.notCompatible(e,t.id);t.type==="blade"?this.pluginsMap_.blades.unshift(t):t.type==="input"?this.pluginsMap_.inputs.unshift(t):t.type==="monitor"&&this.pluginsMap_.monitors.unshift(t)}createInput_(e,t,n){return this.pluginsMap_.inputs.reduce((i,s)=>i??Hy(s,{document:e,target:t,params:n}),null)}createMonitor_(e,t,n){return this.pluginsMap_.monitors.reduce((i,s)=>i??Xy(s,{document:e,params:n,target:t}),null)}createBinding(e,t,n){const i=t.read();if(ut(i))throw new qt({context:{key:t.key},type:"nomatchingcontroller"});const s=this.createInput_(e,t,n);if(s)return s;const o=this.createMonitor_(e,t,n);if(o)return o;throw new qt({context:{key:t.key},type:"nomatchingcontroller"})}createBlade(e,t){const n=this.pluginsMap_.blades.reduce((i,s)=>i??E0(s,{document:e,params:t}),null);if(!n)throw new qt({type:"nomatchingview",context:{params:t}});return n}createInputBindingApi_(e){const t=this.pluginsMap_.inputs.reduce((n,i)=>{var s,o;return n||((o=(s=i.api)===null||s===void 0?void 0:s.call(i,{controller:e}))!==null&&o!==void 0?o:null)},null);return this.apiCache_.add(e,t??new gs(e))}createMonitorBindingApi_(e){const t=this.pluginsMap_.monitors.reduce((n,i)=>{var s,o;return n||((o=(s=i.api)===null||s===void 0?void 0:s.call(i,{controller:e}))!==null&&o!==void 0?o:null)},null);return this.apiCache_.add(e,t??new gs(e))}createBindingApi(e){if(this.apiCache_.has(e))return this.apiCache_.get(e);if(zw(e))return this.createInputBindingApi_(e);if(Zw(e))return this.createMonitorBindingApi_(e);throw qt.shouldNeverHappen()}createApi(e){if(this.apiCache_.has(e))return this.apiCache_.get(e);if(jw(e))return this.createBindingApi(e);const t=this.pluginsMap_.blades.reduce((n,i)=>n??i.api({controller:e,pool:this}),null);if(!t)throw qt.shouldNeverHappen();return this.apiCache_.add(e,t)}}const Wy=new Uy;function Zy(){const r=new Yy(Wy);return[Cy,Sy,Vy,Ry,py,ly,oy,ry,U0,Iy,jy,Gy,r0,m0,gp].forEach(e=>{r.register("core",e)}),r}class Qy extends ii{constructor(e){super(e),this.emitter_=new kt,this.controller.value.emitter.on("change",t=>{this.emitter_.emit("change",new ks(this,t.rawValue))})}get label(){return this.controller.labelController.props.get("label")}set label(e){this.controller.labelController.props.set("label",e)}get options(){return this.controller.valueController.props.get("options")}set options(e){this.controller.valueController.props.set("options",e)}get value(){return this.controller.value.rawValue}set value(e){this.controller.value.rawValue=e}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}}class Jy extends ii{}class ex extends ii{constructor(e){super(e),this.emitter_=new kt,this.controller.value.emitter.on("change",t=>{this.emitter_.emit("change",new ks(this,t.rawValue))})}get label(){return this.controller.labelController.props.get("label")}set label(e){this.controller.labelController.props.set("label",e)}get max(){return this.controller.valueController.sliderController.props.get("max")}set max(e){this.controller.valueController.sliderController.props.set("max",e)}get min(){return this.controller.valueController.sliderController.props.get("min")}set min(e){this.controller.valueController.sliderController.props.set("min",e)}get value(){return this.controller.value.rawValue}set value(e){this.controller.value.rawValue=e}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}}class tx extends ii{constructor(e){super(e),this.emitter_=new kt,this.controller.value.emitter.on("change",t=>{this.emitter_.emit("change",new ks(this,t.rawValue))})}get label(){return this.controller.labelController.props.get("label")}set label(e){this.controller.labelController.props.set("label",e)}get formatter(){return this.controller.valueController.props.get("formatter")}set formatter(e){this.controller.valueController.props.set("formatter",e)}get value(){return this.controller.value.rawValue}set value(e){this.controller.value.rawValue=e}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}}const rx=(function(){return{id:"list",type:"blade",core:Fi,accept(r){const e=bt(r,t=>({options:t.required.custom(Os),value:t.required.raw,view:t.required.constant("list"),label:t.optional.string}));return e?{params:e}:null},controller(r){const e=new Vs(tu(r.params.options)),t=dt(r.params.value,{constraint:e}),n=new Vn(r.document,{props:new Ue({options:e.values.value("options")}),value:t,viewProps:r.viewProps});return new ei(r.document,{blade:r.blade,props:Ue.fromObject({label:r.params.label}),value:t,valueController:n})},api(r){return!(r.controller instanceof ei)||!(r.controller.valueController instanceof Vn)?null:new Qy(r.controller)}}})();class nx extends bp{constructor(e,t){super(e,t)}get element(){return this.controller.view.element}}class ix extends Tl{constructor(e,t){super(e,{expanded:t.expanded,blade:t.blade,props:t.props,root:!0,viewProps:t.viewProps})}}const dh=Xe("spr");class sx{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(dh()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("hr");n.classList.add(dh("r")),this.element.appendChild(n)}}class hh extends Ya{constructor(e,t){super(Object.assign(Object.assign({},t),{view:new sx(e,{viewProps:t.viewProps})}))}}const ax={id:"separator",type:"blade",core:Fi,accept(r){const e=bt(r,t=>({view:t.required.constant("separator")}));return e?{params:e}:null},controller(r){return new hh(r.document,{blade:r.blade,viewProps:r.viewProps})},api(r){return r.controller instanceof hh?new Jy(r.controller):null}},ox={id:"slider",type:"blade",core:Fi,accept(r){const e=bt(r,t=>({max:t.required.number,min:t.required.number,view:t.required.constant("slider"),format:t.optional.function,label:t.optional.string,value:t.optional.number}));return e?{params:e}:null},controller(r){var e,t;const n=(e=r.params.value)!==null&&e!==void 0?e:0,i=new Ts({max:r.params.max,min:r.params.min}),s=dt(n,{constraint:i}),o=new Ba(r.document,Object.assign(Object.assign({},Pp({formatter:(t=r.params.format)!==null&&t!==void 0?t:Cw,keyScale:dt(1),max:i.values.value("max"),min:i.values.value("min"),pointerScale:rp(r.params,n)})),{parser:on,value:s,viewProps:r.viewProps}));return new ei(r.document,{blade:r.blade,props:Ue.fromObject({label:r.params.label}),value:s,valueController:o})},api(r){return!(r.controller instanceof ei)||!(r.controller.valueController instanceof Ba)?null:new ex(r.controller)}},lx=(function(){return{id:"text",type:"blade",core:Fi,accept(r){const e=bt(r,t=>({parse:t.required.function,value:t.required.raw,view:t.required.constant("text"),format:t.optional.function,label:t.optional.string}));return e?{params:e}:null},controller(r){var e;const t=dt(r.params.value),n=new ys(r.document,{parser:r.params.parse,props:Ue.fromObject({formatter:(e=r.params.format)!==null&&e!==void 0?e:(i=>String(i))}),value:t,viewProps:r.viewProps});return new ei(r.document,{blade:r.blade,props:Ue.fromObject({label:r.params.label}),value:t,valueController:n})},api(r){return!(r.controller instanceof ei)||!(r.controller.valueController instanceof ys)?null:new tx(r.controller)}}})();function ux(r){const e=r.createElement("div");return e.classList.add(Xe("dfw")()),r.body&&r.body.appendChild(e),e}function cx(r,e,t){if(r.querySelector(`style[data-tp-style=${e}]`))return;const n=r.createElement("style");n.dataset.tpStyle=e,n.textContent=t,r.head.appendChild(n)}class JA extends nx{constructor(e){var t,n;const i=e??{},s=(t=i.document)!==null&&t!==void 0?t:Mw(),o=Zy(),l=new ix(s,{expanded:i.expanded,blade:$i(),props:Ue.fromObject({title:i.title}),viewProps:si.create()});super(l,o),this.pool_=o,this.containerElem_=(n=i.container)!==null&&n!==void 0?n:ux(s),this.containerElem_.appendChild(this.element),this.doc_=s,this.usesDefaultWrapper_=!i.container,this.setUpDefaultPlugins_()}get document(){if(!this.doc_)throw qt.alreadyDisposed();return this.doc_}dispose(){const e=this.containerElem_;if(!e)throw qt.alreadyDisposed();if(this.usesDefaultWrapper_){const t=e.parentElement;t&&t.removeChild(e)}this.containerElem_=null,this.doc_=null,super.dispose()}registerPlugin(e){e.css&&cx(this.document,`plugin-${e.id}`,e.css),("plugin"in e?[e.plugin]:"plugins"in e?e.plugins:[]).forEach(n=>{this.pool_.register(e.id,n)})}setUpDefaultPlugins_(){this.registerPlugin({id:"default",css:'.tp-tbiv_b,.tp-coltxtv_ms,.tp-colswv_b,.tp-ckbv_i,.tp-sglv_i,.tp-mllv_i,.tp-grlv_g,.tp-txtv_i,.tp-p2dpv_p,.tp-colswv_sw,.tp-rotv_b,.tp-fldv_b,.tp-p2dv_b,.tp-btnv_b,.tp-lstv_s{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:rgba(0,0,0,0);border-width:0;font-family:inherit;font-size:inherit;font-weight:inherit;margin:0;outline:none;padding:0}.tp-p2dv_b,.tp-btnv_b,.tp-lstv_s{background-color:var(--btn-bg);border-radius:var(--bld-br);color:var(--btn-fg);cursor:pointer;display:block;font-weight:bold;height:var(--cnt-usz);line-height:var(--cnt-usz);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tp-p2dv_b:hover,.tp-btnv_b:hover,.tp-lstv_s:hover{background-color:var(--btn-bg-h)}.tp-p2dv_b:focus,.tp-btnv_b:focus,.tp-lstv_s:focus{background-color:var(--btn-bg-f)}.tp-p2dv_b:active,.tp-btnv_b:active,.tp-lstv_s:active{background-color:var(--btn-bg-a)}.tp-p2dv_b:disabled,.tp-btnv_b:disabled,.tp-lstv_s:disabled{opacity:.5}.tp-rotv_c>.tp-cntv.tp-v-lst,.tp-tbpv_c>.tp-cntv.tp-v-lst,.tp-fldv_c>.tp-cntv.tp-v-lst{margin-bottom:calc(-1*var(--cnt-vp))}.tp-rotv_c>.tp-fldv.tp-v-lst .tp-fldv_c,.tp-tbpv_c>.tp-fldv.tp-v-lst .tp-fldv_c,.tp-fldv_c>.tp-fldv.tp-v-lst .tp-fldv_c{border-bottom-left-radius:0}.tp-rotv_c>.tp-fldv.tp-v-lst .tp-fldv_b,.tp-tbpv_c>.tp-fldv.tp-v-lst .tp-fldv_b,.tp-fldv_c>.tp-fldv.tp-v-lst .tp-fldv_b{border-bottom-left-radius:0}.tp-rotv_c>*:not(.tp-v-fst),.tp-tbpv_c>*:not(.tp-v-fst),.tp-fldv_c>*:not(.tp-v-fst){margin-top:var(--cnt-usp)}.tp-rotv_c>.tp-sprv:not(.tp-v-fst),.tp-tbpv_c>.tp-sprv:not(.tp-v-fst),.tp-fldv_c>.tp-sprv:not(.tp-v-fst),.tp-rotv_c>.tp-cntv:not(.tp-v-fst),.tp-tbpv_c>.tp-cntv:not(.tp-v-fst),.tp-fldv_c>.tp-cntv:not(.tp-v-fst){margin-top:var(--cnt-vp)}.tp-rotv_c>.tp-sprv+*:not(.tp-v-hidden),.tp-tbpv_c>.tp-sprv+*:not(.tp-v-hidden),.tp-fldv_c>.tp-sprv+*:not(.tp-v-hidden),.tp-rotv_c>.tp-cntv+*:not(.tp-v-hidden),.tp-tbpv_c>.tp-cntv+*:not(.tp-v-hidden),.tp-fldv_c>.tp-cntv+*:not(.tp-v-hidden){margin-top:var(--cnt-vp)}.tp-rotv_c>.tp-sprv:not(.tp-v-hidden)+.tp-sprv,.tp-tbpv_c>.tp-sprv:not(.tp-v-hidden)+.tp-sprv,.tp-fldv_c>.tp-sprv:not(.tp-v-hidden)+.tp-sprv,.tp-rotv_c>.tp-cntv:not(.tp-v-hidden)+.tp-cntv,.tp-tbpv_c>.tp-cntv:not(.tp-v-hidden)+.tp-cntv,.tp-fldv_c>.tp-cntv:not(.tp-v-hidden)+.tp-cntv{margin-top:0}.tp-tbpv_c>.tp-cntv,.tp-fldv_c>.tp-cntv{margin-left:4px}.tp-tbpv_c>.tp-fldv>.tp-fldv_b,.tp-fldv_c>.tp-fldv>.tp-fldv_b{border-top-left-radius:var(--bld-br);border-bottom-left-radius:var(--bld-br)}.tp-tbpv_c>.tp-fldv.tp-fldv-expanded>.tp-fldv_b,.tp-fldv_c>.tp-fldv.tp-fldv-expanded>.tp-fldv_b{border-bottom-left-radius:0}.tp-tbpv_c .tp-fldv>.tp-fldv_c,.tp-fldv_c .tp-fldv>.tp-fldv_c{border-bottom-left-radius:var(--bld-br)}.tp-tbpv_c>.tp-cntv+.tp-fldv>.tp-fldv_b,.tp-fldv_c>.tp-cntv+.tp-fldv>.tp-fldv_b{border-top-left-radius:0}.tp-tbpv_c>.tp-cntv+.tp-tabv>.tp-tabv_t,.tp-fldv_c>.tp-cntv+.tp-tabv>.tp-tabv_t{border-top-left-radius:0}.tp-tbpv_c>.tp-tabv>.tp-tabv_t,.tp-fldv_c>.tp-tabv>.tp-tabv_t{border-top-left-radius:var(--bld-br)}.tp-tbpv_c .tp-tabv>.tp-tabv_c,.tp-fldv_c .tp-tabv>.tp-tabv_c{border-bottom-left-radius:var(--bld-br)}.tp-rotv_b,.tp-fldv_b{background-color:var(--cnt-bg);color:var(--cnt-fg);cursor:pointer;display:block;height:calc(var(--cnt-usz) + 4px);line-height:calc(var(--cnt-usz) + 4px);overflow:hidden;padding-left:var(--cnt-hp);padding-right:calc(4px + var(--cnt-usz) + var(--cnt-hp));position:relative;text-align:left;text-overflow:ellipsis;white-space:nowrap;width:100%;transition:border-radius .2s ease-in-out .2s}.tp-rotv_b:hover,.tp-fldv_b:hover{background-color:var(--cnt-bg-h)}.tp-rotv_b:focus,.tp-fldv_b:focus{background-color:var(--cnt-bg-f)}.tp-rotv_b:active,.tp-fldv_b:active{background-color:var(--cnt-bg-a)}.tp-rotv_b:disabled,.tp-fldv_b:disabled{opacity:.5}.tp-rotv_m,.tp-fldv_m{background:linear-gradient(to left, var(--cnt-fg), var(--cnt-fg) 2px, transparent 2px, transparent 4px, var(--cnt-fg) 4px);border-radius:2px;bottom:0;content:"";display:block;height:6px;right:calc(var(--cnt-hp) + (var(--cnt-usz) + 4px - 6px)/2 - 2px);margin:auto;opacity:.5;position:absolute;top:0;transform:rotate(90deg);transition:transform .2s ease-in-out;width:6px}.tp-rotv.tp-rotv-expanded .tp-rotv_m,.tp-fldv.tp-fldv-expanded>.tp-fldv_b>.tp-fldv_m{transform:none}.tp-rotv_c,.tp-fldv_c{box-sizing:border-box;height:0;opacity:0;overflow:hidden;padding-bottom:0;padding-top:0;position:relative;transition:height .2s ease-in-out,opacity .2s linear,padding .2s ease-in-out}.tp-rotv.tp-rotv-cpl:not(.tp-rotv-expanded) .tp-rotv_c,.tp-fldv.tp-fldv-cpl:not(.tp-fldv-expanded)>.tp-fldv_c{display:none}.tp-rotv.tp-rotv-expanded .tp-rotv_c,.tp-fldv.tp-fldv-expanded>.tp-fldv_c{opacity:1;padding-bottom:var(--cnt-vp);padding-top:var(--cnt-vp);transform:none;overflow:visible;transition:height .2s ease-in-out,opacity .2s linear .2s,padding .2s ease-in-out}.tp-txtv_i,.tp-p2dpv_p,.tp-colswv_sw{background-color:var(--in-bg);border-radius:var(--bld-br);box-sizing:border-box;color:var(--in-fg);font-family:inherit;height:var(--cnt-usz);line-height:var(--cnt-usz);min-width:0;width:100%}.tp-txtv_i:hover,.tp-p2dpv_p:hover,.tp-colswv_sw:hover{background-color:var(--in-bg-h)}.tp-txtv_i:focus,.tp-p2dpv_p:focus,.tp-colswv_sw:focus{background-color:var(--in-bg-f)}.tp-txtv_i:active,.tp-p2dpv_p:active,.tp-colswv_sw:active{background-color:var(--in-bg-a)}.tp-txtv_i:disabled,.tp-p2dpv_p:disabled,.tp-colswv_sw:disabled{opacity:.5}.tp-lstv,.tp-coltxtv_m{position:relative}.tp-lstv_s{padding:0 20px 0 4px;width:100%}.tp-lstv_m,.tp-coltxtv_mm{bottom:0;margin:auto;pointer-events:none;position:absolute;right:2px;top:0}.tp-lstv_m svg,.tp-coltxtv_mm svg{bottom:0;height:16px;margin:auto;position:absolute;right:0;top:0;width:16px}.tp-lstv_m svg path,.tp-coltxtv_mm svg path{fill:currentColor}.tp-sglv_i,.tp-mllv_i,.tp-grlv_g{background-color:var(--mo-bg);border-radius:var(--bld-br);box-sizing:border-box;color:var(--mo-fg);height:var(--cnt-usz);scrollbar-color:currentColor rgba(0,0,0,0);scrollbar-width:thin;width:100%}.tp-sglv_i::-webkit-scrollbar,.tp-mllv_i::-webkit-scrollbar,.tp-grlv_g::-webkit-scrollbar{height:8px;width:8px}.tp-sglv_i::-webkit-scrollbar-corner,.tp-mllv_i::-webkit-scrollbar-corner,.tp-grlv_g::-webkit-scrollbar-corner{background-color:rgba(0,0,0,0)}.tp-sglv_i::-webkit-scrollbar-thumb,.tp-mllv_i::-webkit-scrollbar-thumb,.tp-grlv_g::-webkit-scrollbar-thumb{background-clip:padding-box;background-color:currentColor;border:rgba(0,0,0,0) solid 2px;border-radius:4px}.tp-pndtxtv,.tp-coltxtv_w{display:flex}.tp-pndtxtv_a,.tp-coltxtv_c{width:100%}.tp-pndtxtv_a+.tp-pndtxtv_a,.tp-coltxtv_c+.tp-pndtxtv_a,.tp-pndtxtv_a+.tp-coltxtv_c,.tp-coltxtv_c+.tp-coltxtv_c{margin-left:2px}.tp-rotv{--bs-bg: var(--tp-base-background-color, hsl(230, 7%, 17%));--bs-br: var(--tp-base-border-radius, 6px);--bs-ff: var(--tp-base-font-family, Roboto Mono, Source Code Pro, Menlo, Courier, monospace);--bs-sh: var(--tp-base-shadow-color, rgba(0, 0, 0, 0.2));--bld-br: var(--tp-blade-border-radius, 2px);--bld-hp: var(--tp-blade-horizontal-padding, 4px);--bld-vw: var(--tp-blade-value-width, 160px);--btn-bg: var(--tp-button-background-color, hsl(230, 7%, 70%));--btn-bg-a: var(--tp-button-background-color-active, #d6d7db);--btn-bg-f: var(--tp-button-background-color-focus, #c8cad0);--btn-bg-h: var(--tp-button-background-color-hover, #bbbcc4);--btn-fg: var(--tp-button-foreground-color, hsl(230, 7%, 17%));--cnt-bg: var(--tp-container-background-color, rgba(187, 188, 196, 0.1));--cnt-bg-a: var(--tp-container-background-color-active, rgba(187, 188, 196, 0.25));--cnt-bg-f: var(--tp-container-background-color-focus, rgba(187, 188, 196, 0.2));--cnt-bg-h: var(--tp-container-background-color-hover, rgba(187, 188, 196, 0.15));--cnt-fg: var(--tp-container-foreground-color, hsl(230, 7%, 75%));--cnt-hp: var(--tp-container-horizontal-padding, 4px);--cnt-vp: var(--tp-container-vertical-padding, 4px);--cnt-usp: var(--tp-container-unit-spacing, 4px);--cnt-usz: var(--tp-container-unit-size, 20px);--in-bg: var(--tp-input-background-color, rgba(187, 188, 196, 0.1));--in-bg-a: var(--tp-input-background-color-active, rgba(187, 188, 196, 0.25));--in-bg-f: var(--tp-input-background-color-focus, rgba(187, 188, 196, 0.2));--in-bg-h: var(--tp-input-background-color-hover, rgba(187, 188, 196, 0.15));--in-fg: var(--tp-input-foreground-color, hsl(230, 7%, 75%));--lbl-fg: var(--tp-label-foreground-color, rgba(187, 188, 196, 0.7));--mo-bg: var(--tp-monitor-background-color, rgba(0, 0, 0, 0.2));--mo-fg: var(--tp-monitor-foreground-color, rgba(187, 188, 196, 0.7));--grv-fg: var(--tp-groove-foreground-color, rgba(187, 188, 196, 0.1))}.tp-btnv_b{width:100%}.tp-btnv_t{text-align:center}.tp-ckbv_l{display:block;position:relative}.tp-ckbv_i{left:0;opacity:0;position:absolute;top:0}.tp-ckbv_w{background-color:var(--in-bg);border-radius:var(--bld-br);cursor:pointer;display:block;height:var(--cnt-usz);position:relative;width:var(--cnt-usz)}.tp-ckbv_w svg{display:block;height:16px;inset:0;margin:auto;opacity:0;position:absolute;width:16px}.tp-ckbv_w svg path{fill:none;stroke:var(--in-fg);stroke-width:2}.tp-ckbv_i:hover+.tp-ckbv_w{background-color:var(--in-bg-h)}.tp-ckbv_i:focus+.tp-ckbv_w{background-color:var(--in-bg-f)}.tp-ckbv_i:active+.tp-ckbv_w{background-color:var(--in-bg-a)}.tp-ckbv_i:checked+.tp-ckbv_w svg{opacity:1}.tp-ckbv.tp-v-disabled .tp-ckbv_w{opacity:.5}.tp-colv{position:relative}.tp-colv_h{display:flex}.tp-colv_s{flex-grow:0;flex-shrink:0;width:var(--cnt-usz)}.tp-colv_t{flex:1;margin-left:4px}.tp-colv_p{height:0;margin-top:0;opacity:0;overflow:hidden;transition:height .2s ease-in-out,opacity .2s linear,margin .2s ease-in-out}.tp-colv.tp-colv-expanded.tp-colv-cpl .tp-colv_p{overflow:visible}.tp-colv.tp-colv-expanded .tp-colv_p{margin-top:var(--cnt-usp);opacity:1}.tp-colv .tp-popv{left:calc(-1*var(--cnt-hp));right:calc(-1*var(--cnt-hp));top:var(--cnt-usz)}.tp-colpv_h,.tp-colpv_ap{margin-left:6px;margin-right:6px}.tp-colpv_h{margin-top:var(--cnt-usp)}.tp-colpv_rgb{display:flex;margin-top:var(--cnt-usp);width:100%}.tp-colpv_a{display:flex;margin-top:var(--cnt-vp);padding-top:calc(var(--cnt-vp) + 2px);position:relative}.tp-colpv_a::before{background-color:var(--grv-fg);content:"";height:2px;left:calc(-1*var(--cnt-hp));position:absolute;right:calc(-1*var(--cnt-hp));top:0}.tp-colpv.tp-v-disabled .tp-colpv_a::before{opacity:.5}.tp-colpv_ap{align-items:center;display:flex;flex:3}.tp-colpv_at{flex:1;margin-left:4px}.tp-svpv{border-radius:var(--bld-br);outline:none;overflow:hidden;position:relative}.tp-svpv.tp-v-disabled{opacity:.5}.tp-svpv_c{cursor:crosshair;display:block;height:calc(var(--cnt-usz)*4);width:100%}.tp-svpv_m{border-radius:100%;border:rgba(255,255,255,.75) solid 2px;box-sizing:border-box;filter:drop-shadow(0 0 1px rgba(0, 0, 0, 0.3));height:12px;margin-left:-6px;margin-top:-6px;pointer-events:none;position:absolute;width:12px}.tp-svpv:focus .tp-svpv_m{border-color:#fff}.tp-hplv{cursor:pointer;height:var(--cnt-usz);outline:none;position:relative}.tp-hplv.tp-v-disabled{opacity:.5}.tp-hplv_c{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAABCAYAAABubagXAAAAQ0lEQVQoU2P8z8Dwn0GCgQEDi2OK/RBgYHjBgIpfovFh8j8YBIgzFGQxuqEgPhaDOT5gOhPkdCxOZeBg+IDFZZiGAgCaSSMYtcRHLgAAAABJRU5ErkJggg==);background-position:left top;background-repeat:no-repeat;background-size:100% 100%;border-radius:2px;display:block;height:4px;left:0;margin-top:-2px;position:absolute;top:50%;width:100%}.tp-hplv_m{border-radius:var(--bld-br);border:rgba(255,255,255,.75) solid 2px;box-shadow:0 0 2px rgba(0,0,0,.1);box-sizing:border-box;height:12px;left:50%;margin-left:-6px;margin-top:-6px;position:absolute;top:50%;width:12px}.tp-hplv:focus .tp-hplv_m{border-color:#fff}.tp-aplv{cursor:pointer;height:var(--cnt-usz);outline:none;position:relative;width:100%}.tp-aplv.tp-v-disabled{opacity:.5}.tp-aplv_b{background-color:#fff;background-image:linear-gradient(to top right, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%),linear-gradient(to top right, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%);background-size:4px 4px;background-position:0 0,2px 2px;border-radius:2px;display:block;height:4px;left:0;margin-top:-2px;overflow:hidden;position:absolute;top:50%;width:100%}.tp-aplv_c{inset:0;position:absolute}.tp-aplv_m{background-color:#fff;background-image:linear-gradient(to top right, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%),linear-gradient(to top right, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%);background-size:12px 12px;background-position:0 0,6px 6px;border-radius:var(--bld-br);box-shadow:0 0 2px rgba(0,0,0,.1);height:12px;left:50%;margin-left:-6px;margin-top:-6px;overflow:hidden;position:absolute;top:50%;width:12px}.tp-aplv_p{border-radius:var(--bld-br);border:rgba(255,255,255,.75) solid 2px;box-sizing:border-box;inset:0;position:absolute}.tp-aplv:focus .tp-aplv_p{border-color:#fff}.tp-colswv{background-color:#fff;background-image:linear-gradient(to top right, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%),linear-gradient(to top right, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%);background-size:10px 10px;background-position:0 0,5px 5px;border-radius:var(--bld-br);overflow:hidden}.tp-colswv.tp-v-disabled{opacity:.5}.tp-colswv_sw{border-radius:0}.tp-colswv_b{cursor:pointer;display:block;height:var(--cnt-usz);left:0;position:absolute;top:0;width:var(--cnt-usz)}.tp-colswv_b:focus::after{border:rgba(255,255,255,.75) solid 2px;border-radius:var(--bld-br);content:"";display:block;inset:0;position:absolute}.tp-coltxtv{display:flex;width:100%}.tp-coltxtv_m{margin-right:4px}.tp-coltxtv_ms{border-radius:var(--bld-br);color:var(--lbl-fg);cursor:pointer;height:var(--cnt-usz);line-height:var(--cnt-usz);padding:0 18px 0 4px}.tp-coltxtv_ms:hover{background-color:var(--in-bg-h)}.tp-coltxtv_ms:focus{background-color:var(--in-bg-f)}.tp-coltxtv_ms:active{background-color:var(--in-bg-a)}.tp-coltxtv_mm{color:var(--lbl-fg)}.tp-coltxtv.tp-v-disabled .tp-coltxtv_mm{opacity:.5}.tp-coltxtv_w{flex:1}.tp-dfwv{position:absolute;top:8px;right:8px;width:256px}.tp-fldv{position:relative}.tp-fldv_t{padding-left:4px}.tp-fldv_b:disabled .tp-fldv_m{display:none}.tp-fldv_c{padding-left:4px}.tp-fldv_i{bottom:0;color:var(--cnt-bg);left:0;overflow:hidden;position:absolute;top:calc(var(--cnt-usz) + 4px);width:max(var(--bs-br),4px)}.tp-fldv_i::before{background-color:currentColor;bottom:0;content:"";left:0;position:absolute;top:0;width:4px}.tp-fldv_b:hover+.tp-fldv_i{color:var(--cnt-bg-h)}.tp-fldv_b:focus+.tp-fldv_i{color:var(--cnt-bg-f)}.tp-fldv_b:active+.tp-fldv_i{color:var(--cnt-bg-a)}.tp-fldv.tp-v-disabled>.tp-fldv_i{opacity:.5}.tp-grlv{position:relative}.tp-grlv_g{display:block;height:calc(var(--cnt-usz)*3)}.tp-grlv_g polyline{fill:none;stroke:var(--mo-fg);stroke-linejoin:round}.tp-grlv_t{margin-top:-4px;transition:left .05s,top .05s;visibility:hidden}.tp-grlv_t.tp-grlv_t-a{visibility:visible}.tp-grlv_t.tp-grlv_t-in{transition:none}.tp-grlv.tp-v-disabled .tp-grlv_g{opacity:.5}.tp-grlv .tp-ttv{background-color:var(--mo-fg)}.tp-grlv .tp-ttv::before{border-top-color:var(--mo-fg)}.tp-lblv{align-items:center;display:flex;line-height:1.3;padding-left:var(--cnt-hp);padding-right:var(--cnt-hp)}.tp-lblv.tp-lblv-nol{display:block}.tp-lblv_l{color:var(--lbl-fg);flex:1;-webkit-hyphens:auto;hyphens:auto;overflow:hidden;padding-left:4px;padding-right:16px}.tp-lblv.tp-v-disabled .tp-lblv_l{opacity:.5}.tp-lblv.tp-lblv-nol .tp-lblv_l{display:none}.tp-lblv_v{align-self:flex-start;flex-grow:0;flex-shrink:0;width:var(--bld-vw)}.tp-lblv.tp-lblv-nol .tp-lblv_v{width:100%}.tp-lstv_s{padding:0 20px 0 var(--bld-hp);width:100%}.tp-lstv_m{color:var(--btn-fg)}.tp-sglv_i{padding-left:var(--bld-hp);padding-right:var(--bld-hp)}.tp-sglv.tp-v-disabled .tp-sglv_i{opacity:.5}.tp-mllv_i{display:block;height:calc(var(--cnt-usz)*3);line-height:var(--cnt-usz);padding-left:var(--bld-hp);padding-right:var(--bld-hp);resize:none;white-space:pre}.tp-mllv.tp-v-disabled .tp-mllv_i{opacity:.5}.tp-p2dv{position:relative}.tp-p2dv_h{display:flex}.tp-p2dv_b{height:var(--cnt-usz);margin-right:4px;position:relative;width:var(--cnt-usz)}.tp-p2dv_b svg{display:block;height:16px;left:50%;margin-left:-8px;margin-top:-8px;position:absolute;top:50%;width:16px}.tp-p2dv_b svg path{stroke:currentColor;stroke-width:2}.tp-p2dv_b svg circle{fill:currentColor}.tp-p2dv_t{flex:1}.tp-p2dv_p{height:0;margin-top:0;opacity:0;overflow:hidden;transition:height .2s ease-in-out,opacity .2s linear,margin .2s ease-in-out}.tp-p2dv.tp-p2dv-expanded .tp-p2dv_p{margin-top:var(--cnt-usp);opacity:1}.tp-p2dv .tp-popv{left:calc(-1*var(--cnt-hp));right:calc(-1*var(--cnt-hp));top:var(--cnt-usz)}.tp-p2dpv{padding-left:calc(var(--cnt-usz) + 4px)}.tp-p2dpv_p{cursor:crosshair;height:0;overflow:hidden;padding-bottom:100%;position:relative}.tp-p2dpv.tp-v-disabled .tp-p2dpv_p{opacity:.5}.tp-p2dpv_g{display:block;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.tp-p2dpv_ax{opacity:.1;stroke:var(--in-fg);stroke-dasharray:1}.tp-p2dpv_l{opacity:.5;stroke:var(--in-fg);stroke-dasharray:1}.tp-p2dpv_m{border:var(--in-fg) solid 1px;border-radius:50%;box-sizing:border-box;height:4px;margin-left:-2px;margin-top:-2px;position:absolute;width:4px}.tp-p2dpv_p:focus .tp-p2dpv_m{background-color:var(--in-fg);border-width:0}.tp-popv{background-color:var(--bs-bg);border-radius:var(--bs-br);box-shadow:0 2px 4px var(--bs-sh);display:none;max-width:var(--bld-vw);padding:var(--cnt-vp) var(--cnt-hp);position:absolute;visibility:hidden;z-index:1000}.tp-popv.tp-popv-v{display:block;visibility:visible}.tp-sldv.tp-v-disabled{opacity:.5}.tp-sldv_t{box-sizing:border-box;cursor:pointer;height:var(--cnt-usz);margin:0 6px;outline:none;position:relative}.tp-sldv_t::before{background-color:var(--in-bg);border-radius:1px;content:"";display:block;height:2px;inset:0;margin:auto;position:absolute}.tp-sldv_k{height:100%;left:0;position:absolute;top:0}.tp-sldv_k::before{background-color:var(--in-fg);border-radius:1px;content:"";display:block;height:2px;inset:0;margin-bottom:auto;margin-top:auto;position:absolute}.tp-sldv_k::after{background-color:var(--btn-bg);border-radius:var(--bld-br);bottom:0;content:"";display:block;height:12px;margin-bottom:auto;margin-top:auto;position:absolute;right:-6px;top:0;width:12px}.tp-sldv_t:hover .tp-sldv_k::after{background-color:var(--btn-bg-h)}.tp-sldv_t:focus .tp-sldv_k::after{background-color:var(--btn-bg-f)}.tp-sldv_t:active .tp-sldv_k::after{background-color:var(--btn-bg-a)}.tp-sldtxtv{display:flex}.tp-sldtxtv_s{flex:2}.tp-sldtxtv_t{flex:1;margin-left:4px}.tp-tabv{position:relative}.tp-tabv_t{align-items:flex-end;color:var(--cnt-bg);display:flex;overflow:hidden;position:relative}.tp-tabv_t:hover{color:var(--cnt-bg-h)}.tp-tabv_t:has(*:focus){color:var(--cnt-bg-f)}.tp-tabv_t:has(*:active){color:var(--cnt-bg-a)}.tp-tabv_t::before{background-color:currentColor;bottom:0;content:"";height:2px;left:0;pointer-events:none;position:absolute;right:0}.tp-tabv.tp-v-disabled .tp-tabv_t::before{opacity:.5}.tp-tabv.tp-tabv-nop .tp-tabv_t{height:calc(var(--cnt-usz) + 4px);position:relative}.tp-tabv.tp-tabv-nop .tp-tabv_t::before{background-color:var(--cnt-bg);bottom:0;content:"";height:2px;left:0;position:absolute;right:0}.tp-tabv_i{bottom:0;color:var(--cnt-bg);left:0;overflow:hidden;position:absolute;top:calc(var(--cnt-usz) + 4px);width:max(var(--bs-br),4px)}.tp-tabv_i::before{background-color:currentColor;bottom:0;content:"";left:0;position:absolute;top:0;width:4px}.tp-tabv_t:hover+.tp-tabv_i{color:var(--cnt-bg-h)}.tp-tabv_t:has(*:focus)+.tp-tabv_i{color:var(--cnt-bg-f)}.tp-tabv_t:has(*:active)+.tp-tabv_i{color:var(--cnt-bg-a)}.tp-tabv.tp-v-disabled>.tp-tabv_i{opacity:.5}.tp-tbiv{flex:1;min-width:0;position:relative}.tp-tbiv+.tp-tbiv{margin-left:2px}.tp-tbiv+.tp-tbiv.tp-v-disabled::before{opacity:.5}.tp-tbiv_b{display:block;padding-left:calc(var(--cnt-hp) + 4px);padding-right:calc(var(--cnt-hp) + 4px);position:relative;width:100%}.tp-tbiv_b:disabled{opacity:.5}.tp-tbiv_b::before{background-color:var(--cnt-bg);content:"";inset:0 0 2px;pointer-events:none;position:absolute}.tp-tbiv_b:hover::before{background-color:var(--cnt-bg-h)}.tp-tbiv_b:focus::before{background-color:var(--cnt-bg-f)}.tp-tbiv_b:active::before{background-color:var(--cnt-bg-a)}.tp-tbiv_t{color:var(--cnt-fg);height:calc(var(--cnt-usz) + 4px);line-height:calc(var(--cnt-usz) + 4px);opacity:.5;overflow:hidden;position:relative;text-overflow:ellipsis}.tp-tbiv.tp-tbiv-sel .tp-tbiv_t{opacity:1}.tp-tbpv_c{padding-bottom:var(--cnt-vp);padding-left:4px;padding-top:var(--cnt-vp)}.tp-txtv{position:relative}.tp-txtv_i{padding-left:var(--bld-hp);padding-right:var(--bld-hp)}.tp-txtv.tp-txtv-fst .tp-txtv_i{border-bottom-right-radius:0;border-top-right-radius:0}.tp-txtv.tp-txtv-mid .tp-txtv_i{border-radius:0}.tp-txtv.tp-txtv-lst .tp-txtv_i{border-bottom-left-radius:0;border-top-left-radius:0}.tp-txtv.tp-txtv-num .tp-txtv_i{text-align:right}.tp-txtv.tp-txtv-drg .tp-txtv_i{opacity:.3}.tp-txtv_k{cursor:pointer;height:100%;left:calc(var(--bld-hp) - 5px);position:absolute;top:0;width:12px}.tp-txtv_k::before{background-color:var(--in-fg);border-radius:1px;bottom:0;content:"";height:calc(var(--cnt-usz) - 4px);left:50%;margin-bottom:auto;margin-left:-1px;margin-top:auto;opacity:.1;position:absolute;top:0;transition:border-radius .1s,height .1s,transform .1s,width .1s;width:2px}.tp-txtv_k:hover::before,.tp-txtv.tp-txtv-drg .tp-txtv_k::before{opacity:1}.tp-txtv.tp-txtv-drg .tp-txtv_k::before{border-radius:50%;height:4px;transform:translateX(-1px);width:4px}.tp-txtv_g{bottom:0;display:block;height:8px;left:50%;margin:auto;overflow:visible;pointer-events:none;position:absolute;top:0;visibility:hidden;width:100%}.tp-txtv.tp-txtv-drg .tp-txtv_g{visibility:visible}.tp-txtv_gb{fill:none;stroke:var(--in-fg);stroke-dasharray:1}.tp-txtv_gh{fill:none;stroke:var(--in-fg)}.tp-txtv .tp-ttv{margin-left:6px;visibility:hidden}.tp-txtv.tp-txtv-drg .tp-ttv{visibility:visible}.tp-ttv{background-color:var(--in-fg);border-radius:var(--bld-br);color:var(--bs-bg);padding:2px 4px;pointer-events:none;position:absolute;transform:translate(-50%, -100%)}.tp-ttv::before{border-color:var(--in-fg) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0);border-style:solid;border-width:2px;box-sizing:border-box;content:"";font-size:.9em;height:4px;left:50%;margin-left:-2px;position:absolute;top:100%;width:4px}.tp-rotv{background-color:var(--bs-bg);border-radius:var(--bs-br);box-shadow:0 2px 4px var(--bs-sh);font-family:var(--bs-ff);font-size:11px;font-weight:500;line-height:1;text-align:left}.tp-rotv_b{border-bottom-left-radius:var(--bs-br);border-bottom-right-radius:var(--bs-br);border-top-left-radius:var(--bs-br);border-top-right-radius:var(--bs-br);padding-left:calc(4px + var(--cnt-usz) + var(--cnt-hp));text-align:center}.tp-rotv.tp-rotv-expanded .tp-rotv_b{border-bottom-left-radius:0;border-bottom-right-radius:0;transition-delay:0s;transition-duration:0s}.tp-rotv.tp-rotv-not>.tp-rotv_b{display:none}.tp-rotv_b:disabled .tp-rotv_m{display:none}.tp-rotv_c>.tp-fldv.tp-v-lst>.tp-fldv_c{border-bottom-left-radius:var(--bs-br);border-bottom-right-radius:var(--bs-br)}.tp-rotv_c>.tp-fldv.tp-v-lst>.tp-fldv_i{border-bottom-left-radius:var(--bs-br)}.tp-rotv_c>.tp-fldv.tp-v-lst:not(.tp-fldv-expanded)>.tp-fldv_b{border-bottom-left-radius:var(--bs-br);border-bottom-right-radius:var(--bs-br)}.tp-rotv_c>.tp-fldv.tp-v-lst.tp-fldv-expanded>.tp-fldv_b{transition-delay:0s;transition-duration:0s}.tp-rotv_c .tp-fldv.tp-v-vlst:not(.tp-fldv-expanded)>.tp-fldv_b{border-bottom-right-radius:var(--bs-br)}.tp-rotv.tp-rotv-not .tp-rotv_c>.tp-fldv.tp-v-fst{margin-top:calc(-1*var(--cnt-vp))}.tp-rotv.tp-rotv-not .tp-rotv_c>.tp-fldv.tp-v-fst>.tp-fldv_b{border-top-left-radius:var(--bs-br);border-top-right-radius:var(--bs-br)}.tp-rotv_c>.tp-tabv.tp-v-lst>.tp-tabv_c{border-bottom-left-radius:var(--bs-br);border-bottom-right-radius:var(--bs-br)}.tp-rotv_c>.tp-tabv.tp-v-lst>.tp-tabv_i{border-bottom-left-radius:var(--bs-br)}.tp-rotv.tp-rotv-not .tp-rotv_c>.tp-tabv.tp-v-fst{margin-top:calc(-1*var(--cnt-vp))}.tp-rotv.tp-rotv-not .tp-rotv_c>.tp-tabv.tp-v-fst>.tp-tabv_t{border-top-left-radius:var(--bs-br);border-top-right-radius:var(--bs-br)}.tp-rotv.tp-v-disabled,.tp-rotv .tp-v-disabled{pointer-events:none}.tp-rotv.tp-v-hidden,.tp-rotv .tp-v-hidden{display:none}.tp-sprv_r{background-color:var(--grv-fg);border-width:0;display:block;height:2px;margin:0;width:100%}.tp-sprv.tp-v-disabled .tp-sprv_r{opacity:.5}',plugins:[rx,ax,ox,gp,lx]})}}new mp("4.0.5");function vt(r){return r==null}function fu(r){return r!==null&&typeof r=="object"}function Ol(r){return r!==null&&typeof r=="object"}function dx(r,e){if(r.length!==e.length)return!1;for(let t=0;t{const s=r[i],o=e[i];return Ol(s)&&Ol(o)?Object.assign(Object.assign({},n),{[i]:ri(s,o)}):Object.assign(Object.assign({},n),{[i]:i in e?o:s})},{})}function hx(r){return fu(r)?"target"in r:!1}const px={alreadydisposed:()=>"View has been already disposed",invalidparams:r=>`Invalid parameters for '${r.name}'`,nomatchingcontroller:r=>`No matching controller for '${r.key}'`,nomatchingview:r=>`No matching view for '${JSON.stringify(r.params)}'`,notbindable:()=>"Value is not bindable",notcompatible:r=>`Not compatible with plugin '${r.id}'`,propertynotfound:r=>`Property '${r.name}' not found`,shouldneverhappen:()=>"This error should never happen"};class pr{static alreadyDisposed(){return new pr({type:"alreadydisposed"})}static notBindable(){return new pr({type:"notbindable"})}static notCompatible(e,t){return new pr({type:"notcompatible",context:{id:`${e}.${t}`}})}static propertyNotFound(e){return new pr({type:"propertynotfound",context:{name:e}})}static shouldNeverHappen(){return new pr({type:"shouldneverhappen"})}constructor(e){var t;this.message=(t=px[e.type](e.context))!==null&&t!==void 0?t:"Unexpected error",this.name=this.constructor.name,this.stack=new Error(this.message).stack,this.type=e.type}toString(){return this.message}}class Na{constructor(e,t){this.obj_=e,this.key=t}static isBindable(e){return!(e===null||typeof e!="object"&&typeof e!="function")}read(){return this.obj_[this.key]}write(e){this.obj_[this.key]=e}writeProperty(e,t){const n=this.read();if(!Na.isBindable(n))throw pr.notBindable();if(!(e in n))throw pr.propertyNotFound(e);n[e]=t}}class vr{constructor(){this.observers_={}}on(e,t,n){var i;let s=this.observers_[e];return s||(s=this.observers_[e]=[]),s.push({handler:t,key:(i=n?.key)!==null&&i!==void 0?i:t}),this}off(e,t){const n=this.observers_[e];return n&&(this.observers_[e]=n.filter(i=>i.key!==t)),this}emit(e,t){const n=this.observers_[e];n&&n.forEach(i=>{i.handler(t)})}}class fx{constructor(e,t){var n;this.constraint_=t?.constraint,this.equals_=(n=t?.equals)!==null&&n!==void 0?n:((i,s)=>i===s),this.emitter=new vr,this.rawValue_=e}get constraint(){return this.constraint_}get rawValue(){return this.rawValue_}set rawValue(e){this.setRawValue(e,{forceEmit:!1,last:!0})}setRawValue(e,t){const n=t??{forceEmit:!1,last:!0},i=this.constraint_?this.constraint_.constrain(e):e,s=this.rawValue_;this.equals_(s,i)&&!n.forceEmit||(this.emitter.emit("beforechange",{sender:this}),this.rawValue_=i,this.emitter.emit("change",{options:n,previousRawValue:s,rawValue:i,sender:this}))}}class mx{constructor(e){this.emitter=new vr,this.value_=e}get rawValue(){return this.value_}set rawValue(e){this.setRawValue(e,{forceEmit:!1,last:!0})}setRawValue(e,t){const n=t??{forceEmit:!1,last:!0},i=this.value_;i===e&&!n.forceEmit||(this.emitter.emit("beforechange",{sender:this}),this.value_=e,this.emitter.emit("change",{options:n,previousRawValue:i,rawValue:this.value_,sender:this}))}}class vx{constructor(e){this.emitter=new vr,this.onValueBeforeChange_=this.onValueBeforeChange_.bind(this),this.onValueChange_=this.onValueChange_.bind(this),this.value_=e,this.value_.emitter.on("beforechange",this.onValueBeforeChange_),this.value_.emitter.on("change",this.onValueChange_)}get rawValue(){return this.value_.rawValue}onValueBeforeChange_(e){this.emitter.emit("beforechange",Object.assign(Object.assign({},e),{sender:this}))}onValueChange_(e){this.emitter.emit("change",Object.assign(Object.assign({},e),{sender:this}))}}function jt(r,e){const t=e?.constraint,n=e?.equals;return!t&&!n?new mx(r):new fx(r,e)}function bx(r){return[new vx(r),(e,t)=>{r.setRawValue(e,t)}]}class Ze{constructor(e){this.emitter=new vr,this.valMap_=e;for(const t in this.valMap_)this.valMap_[t].emitter.on("change",()=>{this.emitter.emit("change",{key:t,sender:this})})}static createCore(e){return Object.keys(e).reduce((n,i)=>Object.assign(n,{[i]:jt(e[i])}),{})}static fromObject(e){const t=this.createCore(e);return new Ze(t)}get(e){return this.valMap_[e].rawValue}set(e,t){this.valMap_[e].rawValue=t}value(e){return this.valMap_[e]}}class Za{constructor(e){this.values=Ze.fromObject({max:e.max,min:e.min})}constrain(e){const t=this.values.get("max"),n=this.values.get("min");return Math.min(Math.max(e,n),t)}}class _x{constructor(e){this.values=Ze.fromObject({max:e.max,min:e.min})}constrain(e){const t=this.values.get("max"),n=this.values.get("min");let i=e;return vt(n)||(i=Math.max(i,n)),vt(t)||(i=Math.min(i,t)),i}}class wx{constructor(e,t=0){this.step=e,this.origin=t}constrain(e){const t=this.origin%this.step,n=Math.round((e-t)/this.step);return t+n*this.step}}class gx{constructor(e){this.text=e}evaluate(){return Number(this.text)}toString(){return this.text}}const yx={"**":(r,e)=>Math.pow(r,e),"*":(r,e)=>r*e,"/":(r,e)=>r/e,"%":(r,e)=>r%e,"+":(r,e)=>r+e,"-":(r,e)=>r-e,"<<":(r,e)=>r<>":(r,e)=>r>>e,">>>":(r,e)=>r>>>e,"&":(r,e)=>r&e,"^":(r,e)=>r^e,"|":(r,e)=>r|e};class xx{constructor(e,t,n){this.left=t,this.operator=e,this.right=n}evaluate(){const e=yx[this.operator];if(!e)throw new Error(`unexpected binary operator: '${this.operator}`);return e(this.left.evaluate(),this.right.evaluate())}toString(){return["b(",this.left.toString(),this.operator,this.right.toString(),")"].join(" ")}}const Cx={"+":r=>r,"-":r=>-r,"~":r=>~r};class Ex{constructor(e,t){this.operator=e,this.expression=t}evaluate(){const e=Cx[this.operator];if(!e)throw new Error(`unexpected unary operator: '${this.operator}`);return e(this.expression.evaluate())}toString(){return["u(",this.operator,this.expression.toString(),")"].join(" ")}}function mu(r){return(e,t)=>{for(let n=0;ne.startsWith(i,t))[0];return n?(t+=n.length,t+=Es(e,t).length,{cursor:t,operator:n}):null}function Ux(r,e){return(t,n)=>{const i=r(t,n);if(!i)return null;n=i.cursor;let s=i.evaluable;for(;;){const o=jx(e,t,n);if(!o)break;n=o.cursor;const l=r(t,n);if(!l)return null;n=l.cursor,s=new xx(o.operator,s,l.evaluable)}return s?{cursor:n,evaluable:s}:null}}const zx=[["**"],["*","/","%"],["+","-"],["<<",">>>",">>"],["&"],["^"],["|"]].reduce((r,e)=>Ux(r,e),tf);function rf(r,e){return e+=Es(r,e).length,zx(r,e)}function Hx(r){const e=rf(r,0);return!e||e.cursor+Es(r,e.cursor).length!==r.length?null:e.evaluable}function On(r){var e;const t=Hx(r);return(e=t?.evaluate())!==null&&e!==void 0?e:null}function nf(r){if(typeof r=="number")return r;if(typeof r=="string"){const e=On(r);if(!vt(e))return e}return 0}function ur(r){return e=>e.toFixed(Math.max(Math.min(r,20),0))}function tt(r,e,t,n,i){const s=(r-e)/(t-e);return n+s*(i-n)}function ph(r){return String(r.toFixed(10)).split(".")[1].replace(/0+$/,"").length}function Dt(r,e,t){return Math.min(Math.max(r,e),t)}function sf(r,e){return(r%e+e)%e}function Kx(r,e){return vt(r.step)?Math.max(ph(e),2):ph(r.step)}function af(r){var e;return(e=r.step)!==null&&e!==void 0?e:1}function qx(r,e){var t;const n=Math.abs((t=r.step)!==null&&t!==void 0?t:e);return n===0?.1:Math.pow(10,Math.floor(Math.log10(n))-1)}function of(r,e){return vt(r.step)?null:new wx(r.step,e)}function lf(r){return!vt(r.max)&&!vt(r.min)?new Za({max:r.max,min:r.min}):!vt(r.max)||!vt(r.min)?new _x({max:r.max,min:r.min}):null}function uf(r,e){var t,n,i;return{formatter:(t=r.format)!==null&&t!==void 0?t:ur(Kx(r,e)),keyScale:(n=r.keyScale)!==null&&n!==void 0?n:af(r),pointerScale:(i=r.pointerScale)!==null&&i!==void 0?i:qx(r,e)}}function cf(r){return{format:r.optional.function,keyScale:r.optional.number,max:r.optional.number,min:r.optional.number,pointerScale:r.optional.number,step:r.optional.number}}function bu(r){return{constraint:r.constraint,textProps:Ze.fromObject(uf(r.params,r.initialValue))}}class _u{constructor(e){this.controller=e}get element(){return this.controller.view.element}get disabled(){return this.controller.viewProps.get("disabled")}set disabled(e){this.controller.viewProps.set("disabled",e)}get hidden(){return this.controller.viewProps.get("hidden")}set hidden(e){this.controller.viewProps.set("hidden",e)}dispose(){this.controller.viewProps.set("disposed",!0)}importState(e){return this.controller.importState(e)}exportState(){return this.controller.exportState()}}class Qa{constructor(e){this.target=e}}class df extends Qa{constructor(e,t,n){super(e),this.value=t,this.last=n??!0}}class Xx extends Qa{constructor(e,t){super(e),this.expanded=t}}class Yx extends Qa{constructor(e,t){super(e),this.index=t}}class Wx extends Qa{constructor(e,t){super(e),this.native=t}}class wu extends _u{constructor(e){super(e),this.onValueChange_=this.onValueChange_.bind(this),this.emitter_=new vr,this.controller.value.emitter.on("change",this.onValueChange_)}get label(){return this.controller.labelController.props.get("label")}set label(e){this.controller.labelController.props.set("label",e)}get key(){return this.controller.value.binding.target.key}get tag(){return this.controller.tag}set tag(e){this.controller.tag=e}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}refresh(){this.controller.value.fetch()}onValueChange_(e){const t=this.controller.value;this.emitter_.emit("change",new df(this,t.binding.target.read(),e.options.last))}}function Zx(r,e){const n=Object.keys(e).reduce((i,s)=>{if(i===void 0)return;const o=e[s],l=o(r[s]);return l.succeeded?Object.assign(Object.assign({},i),{[s]:l.value}):void 0},{});return n}function Qx(r,e){return r.reduce((t,n)=>{if(t===void 0)return;const i=e(n);if(!(!i.succeeded||i.value===void 0))return[...t,i.value]},[])}function Jx(r){return r===null?!1:typeof r=="object"}function en(r){return e=>t=>{if(!e&&t===void 0)return{succeeded:!1,value:void 0};if(e&&t===void 0)return{succeeded:!0,value:void 0};const n=r(t);return n!==void 0?{succeeded:!0,value:n}:{succeeded:!1,value:void 0}}}function fh(r){return{custom:e=>en(e)(r),boolean:en(e=>typeof e=="boolean"?e:void 0)(r),number:en(e=>typeof e=="number"?e:void 0)(r),string:en(e=>typeof e=="string"?e:void 0)(r),function:en(e=>typeof e=="function"?e:void 0)(r),constant:e=>en(t=>t===e?e:void 0)(r),raw:en(e=>e)(r),object:e=>en(t=>{if(Jx(t))return Zx(t,e)})(r),array:e=>en(t=>{if(Array.isArray(t))return Qx(t,e)})(r)}}const Rl={optional:fh(!0),required:fh(!1)};function Xt(r,e){const t=e(Rl),n=Rl.required.object(t)(r);return n.succeeded?n.value:void 0}function zr(r,e,t,n){if(e&&!e(r))return!1;const i=Xt(r,t);return i?n(i):!1}function Hr(r,e){var t;return ri((t=r?.())!==null&&t!==void 0?t:{},e)}function Oa(r){return"value"in r}function eC(r){if(!fu(r)||!("binding"in r))return!1;const e=r.binding;return hx(e)}const Br="http://www.w3.org/2000/svg";function Ga(r){r.offsetHeight}function tC(r,e){const t=r.style.transition;r.style.transition="none",e(),r.style.transition=t}function gu(r){return r.ontouchstart!==void 0}function rC(r){const e=r.ownerDocument.defaultView;return e&&"document"in e?r.getContext("2d",{willReadFrequently:!0}):null}const nC={check:' ',dropdown:' ',p2dpad:' '};function Ja(r,e){const t=r.createElementNS(Br,"svg");return t.innerHTML=nC[e],t}function hf(r,e,t){r.insertBefore(e,r.children[t])}function yu(r){r.parentElement&&r.parentElement.removeChild(r)}function pf(r){for(;r.children.length>0;)r.removeChild(r.children[0])}function iC(r){for(;r.childNodes.length>0;)r.removeChild(r.childNodes[0])}function ff(r){return r.relatedTarget?r.relatedTarget:"explicitOriginalTarget"in r?r.explicitOriginalTarget:null}function an(r,e){r.emitter.on("change",t=>{e(t.rawValue)}),e(r.rawValue)}function jr(r,e,t){an(r.value(e),t)}const sC="tp";function Qe(r){return(t,n)=>[sC,"-",r,"v",t?`_${t}`:"",n?`-${n}`:""].join("")}const cs=Qe("lbl");function aC(r,e){const t=r.createDocumentFragment();return e.split(`
+`).map(i=>r.createTextNode(i)).forEach((i,s)=>{s>0&&t.appendChild(r.createElement("br")),t.appendChild(i)}),t}class oC{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(cs()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(cs("l")),jr(t.props,"label",s=>{vt(s)?this.element.classList.add(cs(void 0,"nol")):(this.element.classList.remove(cs(void 0,"nol")),iC(n),n.appendChild(aC(e,s)))}),this.element.appendChild(n),this.labelElement=n;const i=e.createElement("div");i.classList.add(cs("v")),this.element.appendChild(i),this.valueElement=i}}class lC{constructor(e,t){this.props=t.props,this.valueController=t.valueController,this.viewProps=t.valueController.viewProps,this.view=new oC(e,{props:t.props,viewProps:this.viewProps}),this.view.valueElement.appendChild(this.valueController.view.element)}importProps(e){return zr(e,null,t=>({label:t.optional.string}),t=>(this.props.set("label",t.label),!0))}exportProps(){return Hr(null,{label:this.props.get("label")})}}function uC(){return["veryfirst","first","last","verylast"]}const mh=Qe(""),vh={veryfirst:"vfst",first:"fst",last:"lst",verylast:"vlst"};class mf{constructor(e){this.parent_=null,this.blade=e.blade,this.view=e.view,this.viewProps=e.viewProps;const t=this.view.element;this.blade.value("positions").emitter.on("change",()=>{uC().forEach(n=>{t.classList.remove(mh(void 0,vh[n]))}),this.blade.get("positions").forEach(n=>{t.classList.add(mh(void 0,vh[n]))})}),this.viewProps.handleDispose(()=>{yu(t)})}get parent(){return this.parent_}set parent(e){this.parent_=e,this.viewProps.set("parent",this.parent_?this.parent_.viewProps:null)}importState(e){return zr(e,null,t=>({disabled:t.required.boolean,hidden:t.required.boolean}),t=>(this.viewProps.importState(t),!0))}exportState(){return Hr(null,Object.assign({},this.viewProps.exportState()))}}class cC extends _u{get label(){return this.controller.labelController.props.get("label")}set label(e){this.controller.labelController.props.set("label",e)}get title(){var e;return(e=this.controller.buttonController.props.get("title"))!==null&&e!==void 0?e:""}set title(e){this.controller.buttonController.props.set("title",e)}on(e,t){const n=t.bind(this);return this.controller.buttonController.emitter.on(e,s=>{n(new Wx(this,s.nativeEvent))}),this}off(e,t){return this.controller.buttonController.emitter.off(e,t),this}}function dC(r,e,t){t?r.classList.add(e):r.classList.remove(e)}function Ni(r,e){return t=>{dC(r,e,t)}}function xu(r,e){an(r,t=>{e.textContent=t??""})}const fl=Qe("btn");class hC{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(fl()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("button");n.classList.add(fl("b")),t.viewProps.bindDisabled(n),this.element.appendChild(n),this.buttonElement=n;const i=e.createElement("div");i.classList.add(fl("t")),xu(t.props.value("title"),i),this.buttonElement.appendChild(i)}}class pC{constructor(e,t){this.emitter=new vr,this.onClick_=this.onClick_.bind(this),this.props=t.props,this.viewProps=t.viewProps,this.view=new hC(e,{props:this.props,viewProps:this.viewProps}),this.view.buttonElement.addEventListener("click",this.onClick_)}importProps(e){return zr(e,null,t=>({title:t.optional.string}),t=>(this.props.set("title",t.title),!0))}exportProps(){return Hr(null,{title:this.props.get("title")})}onClick_(e){this.emitter.emit("click",{nativeEvent:e,sender:this})}}class bh extends mf{constructor(e,t){const n=new pC(e,{props:t.buttonProps,viewProps:t.viewProps}),i=new lC(e,{blade:t.blade,props:t.labelProps,valueController:n});super({blade:t.blade,view:i.view,viewProps:t.viewProps}),this.buttonController=n,this.labelController=i}importState(e){return zr(e,t=>super.importState(t)&&this.buttonController.importProps(t)&&this.labelController.importProps(t),()=>({}),()=>!0)}exportState(){return Hr(()=>super.exportState(),Object.assign(Object.assign({},this.buttonController.exportProps()),this.labelController.exportProps()))}}class fC{constructor(e){const[t,n]=e.split("-"),i=t.split(".");this.major=parseInt(i[0],10),this.minor=parseInt(i[1],10),this.patch=parseInt(i[2],10),this.prerelease=n??null}toString(){const e=[this.major,this.minor,this.patch].join(".");return this.prerelease!==null?[e,this.prerelease].join("-"):e}}const mC=new fC("2.0.5");function Jt(r){return Object.assign({core:mC},r)}Jt({id:"button",type:"blade",accept(r){const e=Xt(r,t=>({title:t.required.string,view:t.required.constant("button"),label:t.optional.string}));return e?{params:e}:null},controller(r){return new bh(r.document,{blade:r.blade,buttonProps:Ze.fromObject({title:r.params.title}),labelProps:Ze.fromObject({label:r.params.label}),viewProps:r.viewProps})},api(r){return r.controller instanceof bh?new cC(r.controller):null}});function vC(r,e){return r.addBlade(Object.assign(Object.assign({},e),{view:"button"}))}function bC(r,e){return r.addBlade(Object.assign(Object.assign({},e),{view:"folder"}))}function _C(r,e){return r.addBlade(Object.assign(Object.assign({},e),{view:"tab"}))}function wC(r){return fu(r)?"refresh"in r&&typeof r.refresh=="function":!1}function gC(r,e){if(!Na.isBindable(r))throw pr.notBindable();return new Na(r,e)}class yC{constructor(e,t){this.onRackValueChange_=this.onRackValueChange_.bind(this),this.controller_=e,this.emitter_=new vr,this.pool_=t,this.controller_.rack.emitter.on("valuechange",this.onRackValueChange_)}get children(){return this.controller_.rack.children.map(e=>this.pool_.createApi(e))}addBinding(e,t,n){const i=n??{},s=this.controller_.element.ownerDocument,o=this.pool_.createBinding(s,gC(e,t),i),l=this.pool_.createBindingApi(o);return this.add(l,i.index)}addFolder(e){return bC(this,e)}addButton(e){return vC(this,e)}addTab(e){return _C(this,e)}add(e,t){const n=e.controller;return this.controller_.rack.add(n,t),e}remove(e){this.controller_.rack.remove(e.controller)}addBlade(e){const t=this.controller_.element.ownerDocument,n=this.pool_.createBlade(t,e),i=this.pool_.createApi(n);return this.add(i,e.index)}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}refresh(){this.children.forEach(e=>{wC(e)&&e.refresh()})}onRackValueChange_(e){const t=e.bladeController,n=this.pool_.createApi(t),i=eC(t.value)?t.value.binding:null;this.emitter_.emit("change",new df(n,i?i.target.read():t.value.rawValue,e.options.last))}}class Cu extends _u{constructor(e,t){super(e),this.rackApi_=new yC(e.rackController,t)}refresh(){this.rackApi_.refresh()}}class Eu extends mf{constructor(e){super({blade:e.blade,view:e.view,viewProps:e.rackController.viewProps}),this.rackController=e.rackController}importState(e){return zr(e,t=>super.importState(t),t=>({children:t.required.array(t.required.raw)}),t=>this.rackController.rack.children.every((n,i)=>n.importState(t.children[i])))}exportState(){return Hr(()=>super.exportState(),{children:this.rackController.rack.children.map(e=>e.exportState())})}}function Dl(r){return"rackController"in r}class xC{constructor(e){this.emitter=new vr,this.items_=[],this.cache_=new Set,this.onSubListAdd_=this.onSubListAdd_.bind(this),this.onSubListRemove_=this.onSubListRemove_.bind(this),this.extract_=e}get items(){return this.items_}allItems(){return Array.from(this.cache_)}find(e){for(const t of this.allItems())if(e(t))return t;return null}includes(e){return this.cache_.has(e)}add(e,t){if(this.includes(e))throw pr.shouldNeverHappen();const n=t!==void 0?t:this.items_.length;this.items_.splice(n,0,e),this.cache_.add(e);const i=this.extract_(e);i&&(i.emitter.on("add",this.onSubListAdd_),i.emitter.on("remove",this.onSubListRemove_),i.allItems().forEach(s=>{this.cache_.add(s)})),this.emitter.emit("add",{index:n,item:e,root:this,target:this})}remove(e){const t=this.items_.indexOf(e);if(t<0)return;this.items_.splice(t,1),this.cache_.delete(e);const n=this.extract_(e);n&&(n.allItems().forEach(i=>{this.cache_.delete(i)}),n.emitter.off("add",this.onSubListAdd_),n.emitter.off("remove",this.onSubListRemove_)),this.emitter.emit("remove",{index:t,item:e,root:this,target:this})}onSubListAdd_(e){this.cache_.add(e.item),this.emitter.emit("add",{index:e.index,item:e.item,root:this,target:e.target})}onSubListRemove_(e){this.cache_.delete(e.item),this.emitter.emit("remove",{index:e.index,item:e.item,root:this,target:e.target})}}function CC(r,e){for(let t=0;t!i.viewProps.get("hidden")),t=e[0],n=e[e.length-1];this.bcSet_.items.forEach(i=>{const s=[];i===t&&(s.push("first"),(!this.blade_||this.blade_.get("positions").includes("veryfirst"))&&s.push("veryfirst")),i===n&&(s.push("last"),(!this.blade_||this.blade_.get("positions").includes("verylast"))&&s.push("verylast")),i.blade.set("positions",s)})}onChildPositionsChange_(){this.updatePositions_(),this.emitter.emit("layout",{sender:this})}onChildViewPropsChange_(e){this.updatePositions_(),this.emitter.emit("layout",{sender:this})}onChildDispose_(){this.bcSet_.items.filter(t=>t.viewProps.get("disposed")).forEach(t=>{this.bcSet_.remove(t)})}onChildValueChange_(e){const t=CC(this.find(Oa),e.sender);if(!t)throw pr.alreadyDisposed();this.emitter.emit("valuechange",{bladeController:t,options:e.options,sender:this})}onRackLayout_(e){this.updatePositions_(),this.emitter.emit("layout",{sender:this})}onRackValueChange_(e){this.emitter.emit("valuechange",{bladeController:e.bladeController,options:e.options,sender:this})}onBladePositionsChange_(){this.updatePositions_()}}class Pu{constructor(e){this.onRackAdd_=this.onRackAdd_.bind(this),this.onRackRemove_=this.onRackRemove_.bind(this),this.element=e.element,this.viewProps=e.viewProps;const t=new PC({blade:e.root?void 0:e.blade,viewProps:e.viewProps});t.emitter.on("add",this.onRackAdd_),t.emitter.on("remove",this.onRackRemove_),this.rack=t,this.viewProps.handleDispose(()=>{for(let n=this.rack.children.length-1;n>=0;n--)this.rack.children[n].viewProps.set("disposed",!0)})}onRackAdd_(e){e.root&&hf(this.element,e.bladeController.view.element,e.index)}onRackRemove_(e){e.root&&yu(e.bladeController.view.element)}}function vf(){return new Ze({positions:jt([],{equals:dx})})}class Fs extends Ze{constructor(e){super(e)}static create(e){const t={completed:!0,expanded:e,expandedHeight:null,shouldFixHeight:!1,temporaryExpanded:null},n=Ze.createCore(t);return new Fs(n)}get styleExpanded(){var e;return(e=this.get("temporaryExpanded"))!==null&&e!==void 0?e:this.get("expanded")}get styleHeight(){if(!this.styleExpanded)return"0";const e=this.get("expandedHeight");return this.get("shouldFixHeight")&&!vt(e)?`${e}px`:"auto"}bindExpandedClass(e,t){const n=()=>{this.styleExpanded?e.classList.add(t):e.classList.remove(t)};jr(this,"expanded",n),jr(this,"temporaryExpanded",n)}cleanUpTransition(){this.set("shouldFixHeight",!1),this.set("expandedHeight",null),this.set("completed",!0)}}function AC(r,e){let t=0;return tC(e,()=>{r.set("expandedHeight",null),r.set("temporaryExpanded",!0),Ga(e),t=e.clientHeight,r.set("temporaryExpanded",null),Ga(e)}),t}function _h(r,e){e.style.height=r.styleHeight}function Au(r,e){r.value("expanded").emitter.on("beforechange",()=>{if(r.set("completed",!1),vt(r.get("expandedHeight"))){const t=AC(r,e);t>0&&r.set("expandedHeight",t)}r.set("shouldFixHeight",!0),Ga(e)}),r.emitter.on("change",()=>{_h(r,e)}),_h(r,e),e.addEventListener("transitionend",t=>{t.propertyName==="height"&&r.cleanUpTransition()})}class SC extends Cu{constructor(e,t){super(e,t),this.emitter_=new vr,this.controller.foldable.value("expanded").emitter.on("change",n=>{this.emitter_.emit("fold",new Xx(this,n.sender.rawValue))}),this.rackApi_.on("change",n=>{this.emitter_.emit("change",n)})}get expanded(){return this.controller.foldable.get("expanded")}set expanded(e){this.controller.foldable.set("expanded",e)}get title(){return this.controller.props.get("title")}set title(e){this.controller.props.set("title",e)}get children(){return this.rackApi_.children}addBinding(e,t,n){return this.rackApi_.addBinding(e,t,n)}addFolder(e){return this.rackApi_.addFolder(e)}addButton(e){return this.rackApi_.addButton(e)}addTab(e){return this.rackApi_.addTab(e)}add(e,t){return this.rackApi_.add(e,t)}remove(e){this.rackApi_.remove(e)}addBlade(e){return this.rackApi_.addBlade(e)}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}}const bf=Qe("cnt");class TC{constructor(e,t){var n;this.className_=Qe((n=t.viewName)!==null&&n!==void 0?n:"fld"),this.element=e.createElement("div"),this.element.classList.add(this.className_(),bf()),t.viewProps.bindClassModifiers(this.element),this.foldable_=t.foldable,this.foldable_.bindExpandedClass(this.element,this.className_(void 0,"expanded")),jr(this.foldable_,"completed",Ni(this.element,this.className_(void 0,"cpl")));const i=e.createElement("button");i.classList.add(this.className_("b")),jr(t.props,"title",x=>{vt(x)?this.element.classList.add(this.className_(void 0,"not")):this.element.classList.remove(this.className_(void 0,"not"))}),t.viewProps.bindDisabled(i),this.element.appendChild(i),this.buttonElement=i;const s=e.createElement("div");s.classList.add(this.className_("i")),this.element.appendChild(s);const o=e.createElement("div");o.classList.add(this.className_("t")),xu(t.props.value("title"),o),this.buttonElement.appendChild(o),this.titleElement=o;const l=e.createElement("div");l.classList.add(this.className_("m")),this.buttonElement.appendChild(l);const y=e.createElement("div");y.classList.add(this.className_("c")),this.element.appendChild(y),this.containerElement=y}}class wh extends Eu{constructor(e,t){var n;const i=Fs.create((n=t.expanded)!==null&&n!==void 0?n:!0),s=new TC(e,{foldable:i,props:t.props,viewName:t.root?"rot":void 0,viewProps:t.viewProps});super(Object.assign(Object.assign({},t),{rackController:new Pu({blade:t.blade,element:s.containerElement,root:t.root,viewProps:t.viewProps}),view:s})),this.onTitleClick_=this.onTitleClick_.bind(this),this.props=t.props,this.foldable=i,Au(this.foldable,this.view.containerElement),this.rackController.rack.emitter.on("add",()=>{this.foldable.cleanUpTransition()}),this.rackController.rack.emitter.on("remove",()=>{this.foldable.cleanUpTransition()}),this.view.buttonElement.addEventListener("click",this.onTitleClick_)}get document(){return this.view.element.ownerDocument}importState(e){return zr(e,t=>super.importState(t),t=>({expanded:t.required.boolean,title:t.optional.string}),t=>(this.foldable.set("expanded",t.expanded),this.props.set("title",t.title),!0))}exportState(){return Hr(()=>super.exportState(),{expanded:this.foldable.get("expanded"),title:this.props.get("title")})}onTitleClick_(){this.foldable.set("expanded",!this.foldable.get("expanded"))}}Jt({id:"folder",type:"blade",accept(r){const e=Xt(r,t=>({title:t.required.string,view:t.required.constant("folder"),expanded:t.optional.boolean}));return e?{params:e}:null},controller(r){return new wh(r.document,{blade:r.blade,expanded:r.params.expanded,props:Ze.fromObject({title:r.params.title}),viewProps:r.viewProps})},api(r){return r.controller instanceof wh?new SC(r.controller,r.pool):null}});const kC=Qe("");function gh(r,e){return Ni(r,kC(void 0,e))}class $s extends Ze{constructor(e){var t;super(e),this.onDisabledChange_=this.onDisabledChange_.bind(this),this.onParentChange_=this.onParentChange_.bind(this),this.onParentGlobalDisabledChange_=this.onParentGlobalDisabledChange_.bind(this),[this.globalDisabled_,this.setGlobalDisabled_]=bx(jt(this.getGlobalDisabled_())),this.value("disabled").emitter.on("change",this.onDisabledChange_),this.value("parent").emitter.on("change",this.onParentChange_),(t=this.get("parent"))===null||t===void 0||t.globalDisabled.emitter.on("change",this.onParentGlobalDisabledChange_)}static create(e){var t,n,i;const s=e??{};return new $s(Ze.createCore({disabled:(t=s.disabled)!==null&&t!==void 0?t:!1,disposed:!1,hidden:(n=s.hidden)!==null&&n!==void 0?n:!1,parent:(i=s.parent)!==null&&i!==void 0?i:null}))}get globalDisabled(){return this.globalDisabled_}bindClassModifiers(e){an(this.globalDisabled_,gh(e,"disabled")),jr(this,"hidden",gh(e,"hidden"))}bindDisabled(e){an(this.globalDisabled_,t=>{e.disabled=t})}bindTabIndex(e){an(this.globalDisabled_,t=>{e.tabIndex=t?-1:0})}handleDispose(e){this.value("disposed").emitter.on("change",t=>{t&&e()})}importState(e){this.set("disabled",e.disabled),this.set("hidden",e.hidden)}exportState(){return{disabled:this.get("disabled"),hidden:this.get("hidden")}}getGlobalDisabled_(){const e=this.get("parent");return(e?e.globalDisabled.rawValue:!1)||this.get("disabled")}updateGlobalDisabled_(){this.setGlobalDisabled_(this.getGlobalDisabled_())}onDisabledChange_(){this.updateGlobalDisabled_()}onParentGlobalDisabledChange_(){this.updateGlobalDisabled_()}onParentChange_(e){var t;const n=e.previousRawValue;n?.globalDisabled.emitter.off("change",this.onParentGlobalDisabledChange_),(t=this.get("parent"))===null||t===void 0||t.globalDisabled.emitter.on("change",this.onParentGlobalDisabledChange_),this.updateGlobalDisabled_()}}const yh=Qe("tbp");class LC{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(yh()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(yh("c")),this.element.appendChild(n),this.containerElement=n}}const ds=Qe("tbi");class VC{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(ds()),t.viewProps.bindClassModifiers(this.element),jr(t.props,"selected",s=>{s?this.element.classList.add(ds(void 0,"sel")):this.element.classList.remove(ds(void 0,"sel"))});const n=e.createElement("button");n.classList.add(ds("b")),t.viewProps.bindDisabled(n),this.element.appendChild(n),this.buttonElement=n;const i=e.createElement("div");i.classList.add(ds("t")),xu(t.props.value("title"),i),this.buttonElement.appendChild(i),this.titleElement=i}}class OC{constructor(e,t){this.emitter=new vr,this.onClick_=this.onClick_.bind(this),this.props=t.props,this.viewProps=t.viewProps,this.view=new VC(e,{props:t.props,viewProps:t.viewProps}),this.view.buttonElement.addEventListener("click",this.onClick_)}onClick_(){this.emitter.emit("click",{sender:this})}}class Ml extends Eu{constructor(e,t){const n=new LC(e,{viewProps:t.viewProps});super(Object.assign(Object.assign({},t),{rackController:new Pu({blade:t.blade,element:n.containerElement,viewProps:t.viewProps}),view:n})),this.onItemClick_=this.onItemClick_.bind(this),this.ic_=new OC(e,{props:t.itemProps,viewProps:$s.create()}),this.ic_.emitter.on("click",this.onItemClick_),this.props=t.props,jr(this.props,"selected",i=>{this.itemController.props.set("selected",i),this.viewProps.set("hidden",!i)})}get itemController(){return this.ic_}importState(e){return zr(e,t=>super.importState(t),t=>({selected:t.required.boolean,title:t.required.string}),t=>(this.ic_.props.set("selected",t.selected),this.ic_.props.set("title",t.title),!0))}exportState(){return Hr(()=>super.exportState(),{selected:this.ic_.props.get("selected"),title:this.ic_.props.get("title")})}onItemClick_(){this.props.set("selected",!0)}}class RC extends Cu{constructor(e,t){super(e,t),this.emitter_=new vr,this.onSelect_=this.onSelect_.bind(this),this.pool_=t,this.rackApi_.on("change",n=>{this.emitter_.emit("change",n)}),this.controller.tab.selectedIndex.emitter.on("change",this.onSelect_)}get pages(){return this.rackApi_.children}addPage(e){const t=this.controller.view.element.ownerDocument,n=new Ml(t,{blade:vf(),itemProps:Ze.fromObject({selected:!1,title:e.title}),props:Ze.fromObject({selected:!1}),viewProps:$s.create()}),i=this.pool_.createApi(n);return this.rackApi_.add(i,e.index)}removePage(e){this.rackApi_.remove(this.rackApi_.children[e])}on(e,t){const n=t.bind(this);return this.emitter_.on(e,i=>{n(i)},{key:t}),this}off(e,t){return this.emitter_.off(e,t),this}onSelect_(e){this.emitter_.emit("select",new Yx(this,e.rawValue))}}class DC extends Cu{get title(){var e;return(e=this.controller.itemController.props.get("title"))!==null&&e!==void 0?e:""}set title(e){this.controller.itemController.props.set("title",e)}get selected(){return this.controller.props.get("selected")}set selected(e){this.controller.props.set("selected",e)}get children(){return this.rackApi_.children}addButton(e){return this.rackApi_.addButton(e)}addFolder(e){return this.rackApi_.addFolder(e)}addTab(e){return this.rackApi_.addTab(e)}add(e,t){this.rackApi_.add(e,t)}remove(e){this.rackApi_.remove(e)}addBinding(e,t,n){return this.rackApi_.addBinding(e,t,n)}addBlade(e){return this.rackApi_.addBlade(e)}}const xh=-1;class MC{constructor(){this.onItemSelectedChange_=this.onItemSelectedChange_.bind(this),this.empty=jt(!0),this.selectedIndex=jt(xh),this.items_=[]}add(e,t){const n=t??this.items_.length;this.items_.splice(n,0,e),e.emitter.on("change",this.onItemSelectedChange_),this.keepSelection_()}remove(e){const t=this.items_.indexOf(e);t<0||(this.items_.splice(t,1),e.emitter.off("change",this.onItemSelectedChange_),this.keepSelection_())}keepSelection_(){if(this.items_.length===0){this.selectedIndex.rawValue=xh,this.empty.rawValue=!0;return}const e=this.items_.findIndex(t=>t.rawValue);e<0?(this.items_.forEach((t,n)=>{t.rawValue=n===0}),this.selectedIndex.rawValue=0):(this.items_.forEach((t,n)=>{t.rawValue=n===e}),this.selectedIndex.rawValue=e),this.empty.rawValue=!1}onItemSelectedChange_(e){if(e.rawValue){const t=this.items_.findIndex(n=>n===e.sender);this.items_.forEach((n,i)=>{n.rawValue=i===t}),this.selectedIndex.rawValue=t}else this.keepSelection_()}}const hs=Qe("tab");class IC{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(hs(),bf()),t.viewProps.bindClassModifiers(this.element),an(t.empty,Ni(this.element,hs(void 0,"nop")));const n=e.createElement("div");n.classList.add(hs("t")),this.element.appendChild(n),this.itemsElement=n;const i=e.createElement("div");i.classList.add(hs("i")),this.element.appendChild(i);const s=e.createElement("div");s.classList.add(hs("c")),this.element.appendChild(s),this.contentsElement=s}}class Ch extends Eu{constructor(e,t){const n=new MC,i=new IC(e,{empty:n.empty,viewProps:t.viewProps});super({blade:t.blade,rackController:new Pu({blade:t.blade,element:i.contentsElement,viewProps:t.viewProps}),view:i}),this.onRackAdd_=this.onRackAdd_.bind(this),this.onRackRemove_=this.onRackRemove_.bind(this);const s=this.rackController.rack;s.emitter.on("add",this.onRackAdd_),s.emitter.on("remove",this.onRackRemove_),this.tab=n}add(e,t){this.rackController.rack.add(e,t)}remove(e){this.rackController.rack.remove(this.rackController.rack.children[e])}onRackAdd_(e){if(!e.root)return;const t=e.bladeController;hf(this.view.itemsElement,t.itemController.view.element,e.index),t.itemController.viewProps.set("parent",this.viewProps),this.tab.add(t.props.value("selected"))}onRackRemove_(e){if(!e.root)return;const t=e.bladeController;yu(t.itemController.view.element),t.itemController.viewProps.set("parent",null),this.tab.remove(t.props.value("selected"))}}Jt({id:"tab",type:"blade",accept(r){const e=Xt(r,t=>({pages:t.required.array(t.required.object({title:t.required.string})),view:t.required.constant("tab")}));return!e||e.pages.length===0?null:{params:e}},controller(r){const e=new Ch(r.document,{blade:r.blade,viewProps:r.viewProps});return r.params.pages.forEach(t=>{const n=new Ml(r.document,{blade:vf(),itemProps:Ze.fromObject({selected:!1,title:t.title}),props:Ze.fromObject({selected:!1}),viewProps:$s.create()});e.add(n)}),e},api(r){return r.controller instanceof Ch?new RC(r.controller,r.pool):r.controller instanceof Ml?new DC(r.controller,r.pool):null}});class Su extends wu{get options(){return this.controller.valueController.props.get("options")}set options(e){this.controller.valueController.props.set("options",e)}}class Bs{constructor(e){this.constraints=e}constrain(e){return this.constraints.reduce((t,n)=>n.constrain(t),e)}}function ja(r,e){if(r instanceof e)return r;if(r instanceof Bs){const t=r.constraints.reduce((n,i)=>n||(i instanceof e?i:null),null);if(t)return t}return null}class eo{constructor(e){this.values=Ze.fromObject({options:e})}constrain(e){const t=this.values.get("options");return t.length===0||t.filter(i=>i.value===e).length>0?e:t[0].value}}function to(r){var e;const t=Rl;if(Array.isArray(r))return(e=Xt({items:r},n=>({items:n.required.array(n.required.object({text:n.required.string,value:n.required.raw}))})))===null||e===void 0?void 0:e.items;if(typeof r=="object")return t.required.raw(r).value}function _f(r){if(Array.isArray(r))return r;const e=[];return Object.keys(r).forEach(t=>{e.push({text:t,value:r[t]})}),e}function Tu(r){return vt(r)?null:new eo(_f(r))}const ml=Qe("lst");class FC{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.props_=t.props,this.element=e.createElement("div"),this.element.classList.add(ml()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("select");n.classList.add(ml("s")),t.viewProps.bindDisabled(n),this.element.appendChild(n),this.selectElement=n;const i=e.createElement("div");i.classList.add(ml("m")),i.appendChild(Ja(e,"dropdown")),this.element.appendChild(i),t.value.emitter.on("change",this.onValueChange_),this.value_=t.value,jr(this.props_,"options",s=>{pf(this.selectElement),s.forEach(o=>{const l=e.createElement("option");l.textContent=o.text,this.selectElement.appendChild(l)}),this.update_()})}update_(){const e=this.props_.get("options").map(t=>t.value);this.selectElement.selectedIndex=e.indexOf(this.value_.rawValue)}onValueChange_(){this.update_()}}class Di{constructor(e,t){this.onSelectChange_=this.onSelectChange_.bind(this),this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.view=new FC(e,{props:this.props,value:this.value,viewProps:this.viewProps}),this.view.selectElement.addEventListener("change",this.onSelectChange_)}onSelectChange_(e){const t=e.currentTarget;this.value.rawValue=this.props.get("options")[t.selectedIndex].value}importProps(e){return zr(e,null,t=>({options:t.required.custom(to)}),t=>(this.props.set("options",_f(t.options)),!0))}exportProps(){return Hr(null,{options:this.props.get("options")})}}const Eh=Qe("pop");class $C{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Eh()),t.viewProps.bindClassModifiers(this.element),an(t.shows,Ni(this.element,Eh(void 0,"v")))}}class wf{constructor(e,t){this.shows=jt(!1),this.viewProps=t.viewProps,this.view=new $C(e,{shows:this.shows,viewProps:this.viewProps})}}const Ph=Qe("txt");class BC{constructor(e,t){this.onChange_=this.onChange_.bind(this),this.element=e.createElement("div"),this.element.classList.add(Ph()),t.viewProps.bindClassModifiers(this.element),this.props_=t.props,this.props_.emitter.on("change",this.onChange_);const n=e.createElement("input");n.classList.add(Ph("i")),n.type="text",t.viewProps.bindDisabled(n),this.element.appendChild(n),this.inputElement=n,t.value.emitter.on("change",this.onChange_),this.value_=t.value,this.refresh()}refresh(){const e=this.props_.get("formatter");this.inputElement.value=e(this.value_.rawValue)}onChange_(){this.refresh()}}class ku{constructor(e,t){this.onInputChange_=this.onInputChange_.bind(this),this.parser_=t.parser,this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.view=new BC(e,{props:t.props,value:this.value,viewProps:this.viewProps}),this.view.inputElement.addEventListener("change",this.onInputChange_)}onInputChange_(e){const n=e.currentTarget.value,i=this.parser_(n);vt(i)||(this.value.rawValue=i),this.view.refresh()}}function NC(r){return String(r)}function gf(r){return r==="false"?!1:!!r}function Ah(r){return NC(r)}function GC(r){return e=>r.reduce((t,n)=>t!==null?t:n(e),null)}const jC=ur(0);function Ua(r){return jC(r)+"%"}function yf(r){return String(r)}function Il(r){return r}function Gi({primary:r,secondary:e,forward:t,backward:n}){let i=!1;function s(o){i||(i=!0,o(),i=!1)}r.emitter.on("change",o=>{s(()=>{e.setRawValue(t(r.rawValue,e.rawValue),o.options)})}),e.emitter.on("change",o=>{s(()=>{r.setRawValue(n(r.rawValue,e.rawValue),o.options)}),s(()=>{e.setRawValue(t(r.rawValue,e.rawValue),o.options)})}),s(()=>{e.setRawValue(t(r.rawValue,e.rawValue),{forceEmit:!1,last:!0})})}function or(r,e){const t=r*(e.altKey?.1:1)*(e.shiftKey?10:1);return e.upKey?+t:e.downKey?-t:0}function As(r){return{altKey:r.altKey,downKey:r.key==="ArrowDown",shiftKey:r.shiftKey,upKey:r.key==="ArrowUp"}}function un(r){return{altKey:r.altKey,downKey:r.key==="ArrowLeft",shiftKey:r.shiftKey,upKey:r.key==="ArrowRight"}}function UC(r){return r==="ArrowUp"||r==="ArrowDown"}function xf(r){return UC(r)||r==="ArrowLeft"||r==="ArrowRight"}function vl(r,e){var t,n;const i=e.ownerDocument.defaultView,s=e.getBoundingClientRect();return{x:r.pageX-(((t=i&&i.scrollX)!==null&&t!==void 0?t:0)+s.left),y:r.pageY-(((n=i&&i.scrollY)!==null&&n!==void 0?n:0)+s.top)}}class oi{constructor(e){this.lastTouch_=null,this.onDocumentMouseMove_=this.onDocumentMouseMove_.bind(this),this.onDocumentMouseUp_=this.onDocumentMouseUp_.bind(this),this.onMouseDown_=this.onMouseDown_.bind(this),this.onTouchEnd_=this.onTouchEnd_.bind(this),this.onTouchMove_=this.onTouchMove_.bind(this),this.onTouchStart_=this.onTouchStart_.bind(this),this.elem_=e,this.emitter=new vr,e.addEventListener("touchstart",this.onTouchStart_,{passive:!1}),e.addEventListener("touchmove",this.onTouchMove_,{passive:!0}),e.addEventListener("touchend",this.onTouchEnd_),e.addEventListener("mousedown",this.onMouseDown_)}computePosition_(e){const t=this.elem_.getBoundingClientRect();return{bounds:{width:t.width,height:t.height},point:e?{x:e.x,y:e.y}:null}}onMouseDown_(e){var t;e.preventDefault(),(t=e.currentTarget)===null||t===void 0||t.focus();const n=this.elem_.ownerDocument;n.addEventListener("mousemove",this.onDocumentMouseMove_),n.addEventListener("mouseup",this.onDocumentMouseUp_),this.emitter.emit("down",{altKey:e.altKey,data:this.computePosition_(vl(e,this.elem_)),sender:this,shiftKey:e.shiftKey})}onDocumentMouseMove_(e){this.emitter.emit("move",{altKey:e.altKey,data:this.computePosition_(vl(e,this.elem_)),sender:this,shiftKey:e.shiftKey})}onDocumentMouseUp_(e){const t=this.elem_.ownerDocument;t.removeEventListener("mousemove",this.onDocumentMouseMove_),t.removeEventListener("mouseup",this.onDocumentMouseUp_),this.emitter.emit("up",{altKey:e.altKey,data:this.computePosition_(vl(e,this.elem_)),sender:this,shiftKey:e.shiftKey})}onTouchStart_(e){e.preventDefault();const t=e.targetTouches.item(0),n=this.elem_.getBoundingClientRect();this.emitter.emit("down",{altKey:e.altKey,data:this.computePosition_(t?{x:t.clientX-n.left,y:t.clientY-n.top}:void 0),sender:this,shiftKey:e.shiftKey}),this.lastTouch_=t}onTouchMove_(e){const t=e.targetTouches.item(0),n=this.elem_.getBoundingClientRect();this.emitter.emit("move",{altKey:e.altKey,data:this.computePosition_(t?{x:t.clientX-n.left,y:t.clientY-n.top}:void 0),sender:this,shiftKey:e.shiftKey}),this.lastTouch_=t}onTouchEnd_(e){var t;const n=(t=e.targetTouches.item(0))!==null&&t!==void 0?t:this.lastTouch_,i=this.elem_.getBoundingClientRect();this.emitter.emit("up",{altKey:e.altKey,data:this.computePosition_(n?{x:n.clientX-i.left,y:n.clientY-i.top}:void 0),sender:this,shiftKey:e.shiftKey})}}const Cr=Qe("txt");class zC{constructor(e,t){this.onChange_=this.onChange_.bind(this),this.props_=t.props,this.props_.emitter.on("change",this.onChange_),this.element=e.createElement("div"),this.element.classList.add(Cr(),Cr(void 0,"num")),t.arrayPosition&&this.element.classList.add(Cr(void 0,t.arrayPosition)),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("input");n.classList.add(Cr("i")),n.type="text",t.viewProps.bindDisabled(n),this.element.appendChild(n),this.inputElement=n,this.onDraggingChange_=this.onDraggingChange_.bind(this),this.dragging_=t.dragging,this.dragging_.emitter.on("change",this.onDraggingChange_),this.element.classList.add(Cr()),this.inputElement.classList.add(Cr("i"));const i=e.createElement("div");i.classList.add(Cr("k")),this.element.appendChild(i),this.knobElement=i;const s=e.createElementNS(Br,"svg");s.classList.add(Cr("g")),this.knobElement.appendChild(s);const o=e.createElementNS(Br,"path");o.classList.add(Cr("gb")),s.appendChild(o),this.guideBodyElem_=o;const l=e.createElementNS(Br,"path");l.classList.add(Cr("gh")),s.appendChild(l),this.guideHeadElem_=l;const y=e.createElement("div");y.classList.add(Qe("tt")()),this.knobElement.appendChild(y),this.tooltipElem_=y,t.value.emitter.on("change",this.onChange_),this.value=t.value,this.refresh()}onDraggingChange_(e){if(e.rawValue===null){this.element.classList.remove(Cr(void 0,"drg"));return}this.element.classList.add(Cr(void 0,"drg"));const t=e.rawValue/this.props_.get("pointerScale"),n=t+(t>0?-1:t<0?1:0),i=Dt(-n,-4,4);this.guideHeadElem_.setAttributeNS(null,"d",[`M ${n+i},0 L${n},4 L${n+i},8`,`M ${t},-1 L${t},9`].join(" ")),this.guideBodyElem_.setAttributeNS(null,"d",`M 0,4 L${t},4`);const s=this.props_.get("formatter");this.tooltipElem_.textContent=s(this.value.rawValue),this.tooltipElem_.style.left=`${t}px`}refresh(){const e=this.props_.get("formatter");this.inputElement.value=e(this.value.rawValue)}onChange_(){this.refresh()}}class Ns{constructor(e,t){var n;this.originRawValue_=0,this.onInputChange_=this.onInputChange_.bind(this),this.onInputKeyDown_=this.onInputKeyDown_.bind(this),this.onInputKeyUp_=this.onInputKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.parser_=t.parser,this.props=t.props,this.sliderProps_=(n=t.sliderProps)!==null&&n!==void 0?n:null,this.value=t.value,this.viewProps=t.viewProps,this.dragging_=jt(null),this.view=new zC(e,{arrayPosition:t.arrayPosition,dragging:this.dragging_,props:this.props,value:this.value,viewProps:this.viewProps}),this.view.inputElement.addEventListener("change",this.onInputChange_),this.view.inputElement.addEventListener("keydown",this.onInputKeyDown_),this.view.inputElement.addEventListener("keyup",this.onInputKeyUp_);const i=new oi(this.view.knobElement);i.emitter.on("down",this.onPointerDown_),i.emitter.on("move",this.onPointerMove_),i.emitter.on("up",this.onPointerUp_)}constrainValue_(e){var t,n;const i=(t=this.sliderProps_)===null||t===void 0?void 0:t.get("min"),s=(n=this.sliderProps_)===null||n===void 0?void 0:n.get("max");let o=e;return i!==void 0&&(o=Math.max(o,i)),s!==void 0&&(o=Math.min(o,s)),o}onInputChange_(e){const n=e.currentTarget.value,i=this.parser_(n);vt(i)||(this.value.rawValue=this.constrainValue_(i)),this.view.refresh()}onInputKeyDown_(e){const t=or(this.props.get("keyScale"),As(e));t!==0&&this.value.setRawValue(this.constrainValue_(this.value.rawValue+t),{forceEmit:!1,last:!1})}onInputKeyUp_(e){or(this.props.get("keyScale"),As(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}onPointerDown_(){this.originRawValue_=this.value.rawValue,this.dragging_.rawValue=0}computeDraggingValue_(e){if(!e.point)return null;const t=e.point.x-e.bounds.width/2;return this.constrainValue_(this.originRawValue_+t*this.props.get("pointerScale"))}onPointerMove_(e){const t=this.computeDraggingValue_(e.data);t!==null&&(this.value.setRawValue(t,{forceEmit:!1,last:!1}),this.dragging_.rawValue=this.value.rawValue-this.originRawValue_)}onPointerUp_(e){const t=this.computeDraggingValue_(e.data);t!==null&&(this.value.setRawValue(t,{forceEmit:!0,last:!0}),this.dragging_.rawValue=null)}}const bl=Qe("sld");class HC{constructor(e,t){this.onChange_=this.onChange_.bind(this),this.props_=t.props,this.props_.emitter.on("change",this.onChange_),this.element=e.createElement("div"),this.element.classList.add(bl()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(bl("t")),t.viewProps.bindTabIndex(n),this.element.appendChild(n),this.trackElement=n;const i=e.createElement("div");i.classList.add(bl("k")),this.trackElement.appendChild(i),this.knobElement=i,t.value.emitter.on("change",this.onChange_),this.value=t.value,this.update_()}update_(){const e=Dt(tt(this.value.rawValue,this.props_.get("min"),this.props_.get("max"),0,100),0,100);this.knobElement.style.width=`${e}%`}onChange_(){this.update_()}}class KC{constructor(e,t){this.onKeyDown_=this.onKeyDown_.bind(this),this.onKeyUp_=this.onKeyUp_.bind(this),this.onPointerDownOrMove_=this.onPointerDownOrMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.props=t.props,this.view=new HC(e,{props:this.props,value:this.value,viewProps:this.viewProps}),this.ptHandler_=new oi(this.view.trackElement),this.ptHandler_.emitter.on("down",this.onPointerDownOrMove_),this.ptHandler_.emitter.on("move",this.onPointerDownOrMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.trackElement.addEventListener("keydown",this.onKeyDown_),this.view.trackElement.addEventListener("keyup",this.onKeyUp_)}handlePointerEvent_(e,t){e.point&&this.value.setRawValue(tt(Dt(e.point.x,0,e.bounds.width),0,e.bounds.width,this.props.get("min"),this.props.get("max")),t)}onPointerDownOrMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onKeyDown_(e){const t=or(this.props.get("keyScale"),un(e));t!==0&&this.value.setRawValue(this.value.rawValue+t,{forceEmit:!1,last:!1})}onKeyUp_(e){or(this.props.get("keyScale"),un(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}}const _l=Qe("sldtxt");class qC{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(_l());const n=e.createElement("div");n.classList.add(_l("s")),this.sliderView_=t.sliderView,n.appendChild(this.sliderView_.element),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(_l("t")),this.textView_=t.textView,i.appendChild(this.textView_.element),this.element.appendChild(i)}}class Sh{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.sliderC_=new KC(e,{props:t.sliderProps,value:t.value,viewProps:this.viewProps}),this.textC_=new Ns(e,{parser:t.parser,props:t.textProps,sliderProps:t.sliderProps,value:t.value,viewProps:t.viewProps}),this.view=new qC(e,{sliderView:this.sliderC_.view,textView:this.textC_.view})}get sliderController(){return this.sliderC_}get textController(){return this.textC_}importProps(e){return zr(e,null,t=>({max:t.required.number,min:t.required.number}),t=>{const n=this.sliderC_.props;return n.set("max",t.max),n.set("min",t.min),!0})}exportProps(){const e=this.sliderC_.props;return Hr(null,{max:e.get("max"),min:e.get("min")})}}function XC(r){return{sliderProps:new Ze({keyScale:r.keyScale,max:r.max,min:r.min}),textProps:new Ze({formatter:jt(r.formatter),keyScale:r.keyScale,pointerScale:jt(r.pointerScale)})}}const YC={containerUnitSize:"cnt-usz"};function Cf(r){return`--${YC[r]}`}function Ss(r){return cf(r)}function Tn(r){if(Ol(r))return Xt(r,Ss)}function nn(r,e){if(!r)return;const t=[],n=of(r,e);n&&t.push(n);const i=lf(r);return i&&t.push(i),new Bs(t)}function Ef(r){if(r==="inline"||r==="popup")return r}function Gs(r,e){r.write(e)}const Sa=Qe("ckb");class WC{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.element=e.createElement("div"),this.element.classList.add(Sa()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("label");n.classList.add(Sa("l")),this.element.appendChild(n),this.labelElement=n;const i=e.createElement("input");i.classList.add(Sa("i")),i.type="checkbox",this.labelElement.appendChild(i),this.inputElement=i,t.viewProps.bindDisabled(this.inputElement);const s=e.createElement("div");s.classList.add(Sa("w")),this.labelElement.appendChild(s);const o=Ja(e,"check");s.appendChild(o),t.value.emitter.on("change",this.onValueChange_),this.value=t.value,this.update_()}update_(){this.inputElement.checked=this.value.rawValue}onValueChange_(){this.update_()}}class ZC{constructor(e,t){this.onInputChange_=this.onInputChange_.bind(this),this.onLabelMouseDown_=this.onLabelMouseDown_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.view=new WC(e,{value:this.value,viewProps:this.viewProps}),this.view.inputElement.addEventListener("change",this.onInputChange_),this.view.labelElement.addEventListener("mousedown",this.onLabelMouseDown_)}onInputChange_(e){const t=e.currentTarget;this.value.rawValue=t.checked,e.preventDefault(),e.stopPropagation()}onLabelMouseDown_(e){e.preventDefault()}}function QC(r){const e=[],t=Tu(r.options);return t&&e.push(t),new Bs(e)}Jt({id:"input-bool",type:"input",accept:(r,e)=>{if(typeof r!="boolean")return null;const t=Xt(e,n=>({options:n.optional.custom(to),readonly:n.optional.constant(!1)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>gf,constraint:r=>QC(r.params),writer:r=>Gs},controller:r=>{const e=r.document,t=r.value,n=r.constraint,i=n&&ja(n,eo);return i?new Di(e,{props:new Ze({options:i.values.value("options")}),value:t,viewProps:r.viewProps}):new ZC(e,{value:t,viewProps:r.viewProps})},api(r){return typeof r.controller.value.rawValue!="boolean"?null:r.controller.valueController instanceof Di?new Su(r.controller):null}});const Yn=Qe("col");class JC{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Yn()),t.foldable.bindExpandedClass(this.element,Yn(void 0,"expanded")),jr(t.foldable,"completed",Ni(this.element,Yn(void 0,"cpl")));const n=e.createElement("div");n.classList.add(Yn("h")),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(Yn("s")),n.appendChild(i),this.swatchElement=i;const s=e.createElement("div");if(s.classList.add(Yn("t")),n.appendChild(s),this.textElement=s,t.pickerLayout==="inline"){const o=e.createElement("div");o.classList.add(Yn("p")),this.element.appendChild(o),this.pickerElement=o}else this.pickerElement=null}}function eE(r,e,t){const n=Dt(r/255,0,1),i=Dt(e/255,0,1),s=Dt(t/255,0,1),o=Math.max(n,i,s),l=Math.min(n,i,s),y=o-l;let x=0,B=0;const U=(l+o)/2;return y!==0&&(B=y/(1-Math.abs(o+l-1)),n===o?x=(i-s)/y:i===o?x=2+(s-n)/y:x=4+(n-i)/y,x=x/6+(x<0?1:0)),[x*360,B*100,U*100]}function tE(r,e,t){const n=(r%360+360)%360,i=Dt(e/100,0,1),s=Dt(t/100,0,1),o=(1-Math.abs(2*s-1))*i,l=o*(1-Math.abs(n/60%2-1)),y=s-o/2;let x,B,U;return n>=0&&n<60?[x,B,U]=[o,l,0]:n>=60&&n<120?[x,B,U]=[l,o,0]:n>=120&&n<180?[x,B,U]=[0,o,l]:n>=180&&n<240?[x,B,U]=[0,l,o]:n>=240&&n<300?[x,B,U]=[l,0,o]:[x,B,U]=[o,0,l],[(x+y)*255,(B+y)*255,(U+y)*255]}function rE(r,e,t){const n=Dt(r/255,0,1),i=Dt(e/255,0,1),s=Dt(t/255,0,1),o=Math.max(n,i,s),l=Math.min(n,i,s),y=o-l;let x;y===0?x=0:o===n?x=60*(((i-s)/y%6+6)%6):o===i?x=60*((s-n)/y+2):x=60*((n-i)/y+4);const B=o===0?0:y/o,U=o;return[x,B*100,U*100]}function Pf(r,e,t){const n=sf(r,360),i=Dt(e/100,0,1),s=Dt(t/100,0,1),o=s*i,l=o*(1-Math.abs(n/60%2-1)),y=s-o;let x,B,U;return n>=0&&n<60?[x,B,U]=[o,l,0]:n>=60&&n<120?[x,B,U]=[l,o,0]:n>=120&&n<180?[x,B,U]=[0,o,l]:n>=180&&n<240?[x,B,U]=[0,l,o]:n>=240&&n<300?[x,B,U]=[l,0,o]:[x,B,U]=[o,0,l],[(x+y)*255,(B+y)*255,(U+y)*255]}function nE(r,e,t){const n=t+e*(100-Math.abs(2*t-100))/200;return[r,n!==0?e*(100-Math.abs(2*t-100))/n:0,t+e*(100-Math.abs(2*t-100))/200]}function iE(r,e,t){const n=100-Math.abs(t*(200-e)/100-100);return[r,n!==0?e*t/n:0,t*(200-e)/200]}function Ur(r){return[r[0],r[1],r[2]]}function ro(r,e){return[r[0],r[1],r[2],e]}const sE={hsl:{hsl:(r,e,t)=>[r,e,t],hsv:nE,rgb:tE},hsv:{hsl:iE,hsv:(r,e,t)=>[r,e,t],rgb:Pf},rgb:{hsl:eE,hsv:rE,rgb:(r,e,t)=>[r,e,t]}};function Mi(r,e){return[e==="float"?1:r==="rgb"?255:360,e==="float"?1:r==="rgb"?255:100,e==="float"?1:r==="rgb"?255:100]}function aE(r,e){return r===e?e:sf(r,e)}function Af(r,e,t){var n;const i=Mi(e,t);return[e==="rgb"?Dt(r[0],0,i[0]):aE(r[0],i[0]),Dt(r[1],0,i[1]),Dt(r[2],0,i[2]),Dt((n=r[3])!==null&&n!==void 0?n:1,0,1)]}function Th(r,e,t,n){const i=Mi(e,t),s=Mi(e,n);return r.map((o,l)=>o/i[l]*s[l])}function Sf(r,e,t){const n=Th(r,e.mode,e.type,"int"),i=sE[e.mode][t.mode](...n);return Th(i,t.mode,"int",t.type)}class Ye{static black(){return new Ye([0,0,0],"rgb")}constructor(e,t){this.type="int",this.mode=t,this.comps_=Af(e,t,this.type)}getComponents(e){return ro(Sf(Ur(this.comps_),{mode:this.mode,type:this.type},{mode:e??this.mode,type:this.type}),this.comps_[3])}toRgbaObject(){const e=this.getComponents("rgb");return{r:e[0],g:e[1],b:e[2],a:e[3]}}}const Cn=Qe("colp");class oE{constructor(e,t){this.alphaViews_=null,this.element=e.createElement("div"),this.element.classList.add(Cn()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(Cn("hsv"));const i=e.createElement("div");i.classList.add(Cn("sv")),this.svPaletteView_=t.svPaletteView,i.appendChild(this.svPaletteView_.element),n.appendChild(i);const s=e.createElement("div");s.classList.add(Cn("h")),this.hPaletteView_=t.hPaletteView,s.appendChild(this.hPaletteView_.element),n.appendChild(s),this.element.appendChild(n);const o=e.createElement("div");if(o.classList.add(Cn("rgb")),this.textsView_=t.textsView,o.appendChild(this.textsView_.element),this.element.appendChild(o),t.alphaViews){this.alphaViews_={palette:t.alphaViews.palette,text:t.alphaViews.text};const l=e.createElement("div");l.classList.add(Cn("a"));const y=e.createElement("div");y.classList.add(Cn("ap")),y.appendChild(this.alphaViews_.palette.element),l.appendChild(y);const x=e.createElement("div");x.classList.add(Cn("at")),x.appendChild(this.alphaViews_.text.element),l.appendChild(x),this.element.appendChild(l)}}get allFocusableElements(){const e=[this.svPaletteView_.element,this.hPaletteView_.element,this.textsView_.modeSelectElement,...this.textsView_.inputViews.map(t=>t.inputElement)];return this.alphaViews_&&e.push(this.alphaViews_.palette.element,this.alphaViews_.text.inputElement),e}}function lE(r){return r==="int"?"int":r==="float"?"float":void 0}function Lu(r){return Xt(r,e=>({color:e.optional.object({alpha:e.optional.boolean,type:e.optional.custom(lE)}),expanded:e.optional.boolean,picker:e.optional.custom(Ef),readonly:e.optional.constant(!1)}))}function ni(r){return r?.1:1}function Tf(r){var e;return(e=r.color)===null||e===void 0?void 0:e.type}class Vu{constructor(e,t){this.type="float",this.mode=t,this.comps_=Af(e,t,this.type)}getComponents(e){return ro(Sf(Ur(this.comps_),{mode:this.mode,type:this.type},{mode:e??this.mode,type:this.type}),this.comps_[3])}toRgbaObject(){const e=this.getComponents("rgb");return{r:e[0],g:e[1],b:e[2],a:e[3]}}}const uE={int:(r,e)=>new Ye(r,e),float:(r,e)=>new Vu(r,e)};function Ou(r,e,t){return uE[t](r,e)}function cE(r){return r.type==="float"}function dE(r){return r.type==="int"}function hE(r){const e=r.getComponents(),t=Mi(r.mode,"int");return new Ye([Math.round(tt(e[0],0,1,0,t[0])),Math.round(tt(e[1],0,1,0,t[1])),Math.round(tt(e[2],0,1,0,t[2])),e[3]],r.mode)}function pE(r){const e=r.getComponents(),t=Mi(r.mode,"int");return new Vu([tt(e[0],0,t[0],0,1),tt(e[1],0,t[1],0,1),tt(e[2],0,t[2],0,1),e[3]],r.mode)}function Zt(r,e){if(r.type===e)return r;if(dE(r)&&e==="float")return pE(r);if(cE(r)&&e==="int")return hE(r);throw pr.shouldNeverHappen()}function fE(r,e){return r.alpha===e.alpha&&r.mode===e.mode&&r.notation===e.notation&&r.type===e.type}function Pr(r,e){const t=r.match(/^(.+)%$/);return Math.min(t?parseFloat(t[1])*.01*e:parseFloat(r),e)}const mE={deg:r=>r,grad:r=>r*360/400,rad:r=>r*360/(2*Math.PI),turn:r=>r*360};function kf(r){const e=r.match(/^([0-9.]+?)(deg|grad|rad|turn)$/);if(!e)return parseFloat(r);const t=parseFloat(e[1]),n=e[2];return mE[n](t)}function Lf(r){const e=r.match(/^rgb\(\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[Pr(e[1],255),Pr(e[2],255),Pr(e[3],255)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])?null:t}function vE(r){const e=Lf(r);return e?new Ye(e,"rgb"):null}function Vf(r){const e=r.match(/^rgba\(\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[Pr(e[1],255),Pr(e[2],255),Pr(e[3],255),Pr(e[4],1)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])||isNaN(t[3])?null:t}function bE(r){const e=Vf(r);return e?new Ye(e,"rgb"):null}function Of(r){const e=r.match(/^hsl\(\s*([0-9A-Fa-f.]+(?:deg|grad|rad|turn)?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[kf(e[1]),Pr(e[2],100),Pr(e[3],100)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])?null:t}function _E(r){const e=Of(r);return e?new Ye(e,"hsl"):null}function Rf(r){const e=r.match(/^hsla\(\s*([0-9A-Fa-f.]+(?:deg|grad|rad|turn)?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*,\s*([0-9A-Fa-f.]+%?)\s*\)$/);if(!e)return null;const t=[kf(e[1]),Pr(e[2],100),Pr(e[3],100),Pr(e[4],1)];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])||isNaN(t[3])?null:t}function wE(r){const e=Rf(r);return e?new Ye(e,"hsl"):null}function Df(r){const e=r.match(/^#([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$/);if(e)return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)];const t=r.match(/^(?:#|0x)([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$/);return t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]:null}function gE(r){const e=Df(r);return e?new Ye(e,"rgb"):null}function Mf(r){const e=r.match(/^#([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$/);if(e)return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16),tt(parseInt(e[4]+e[4],16),0,255,0,1)];const t=r.match(/^(?:#|0x)?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$/);return t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16),tt(parseInt(t[4],16),0,255,0,1)]:null}function yE(r){const e=Mf(r);return e?new Ye(e,"rgb"):null}function If(r){const e=r.match(/^\{\s*r\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*g\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*b\s*:\s*([0-9A-Fa-f.]+%?)\s*\}$/);if(!e)return null;const t=[parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])?null:t}function xE(r){return e=>{const t=If(e);return t?Ou(t,"rgb",r):null}}function Ff(r){const e=r.match(/^\{\s*r\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*g\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*b\s*:\s*([0-9A-Fa-f.]+%?)\s*,\s*a\s*:\s*([0-9A-Fa-f.]+%?)\s*\}$/);if(!e)return null;const t=[parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3]),parseFloat(e[4])];return isNaN(t[0])||isNaN(t[1])||isNaN(t[2])||isNaN(t[3])?null:t}function CE(r){return e=>{const t=Ff(e);return t?Ou(t,"rgb",r):null}}const EE=[{parser:Df,result:{alpha:!1,mode:"rgb",notation:"hex"}},{parser:Mf,result:{alpha:!0,mode:"rgb",notation:"hex"}},{parser:Lf,result:{alpha:!1,mode:"rgb",notation:"func"}},{parser:Vf,result:{alpha:!0,mode:"rgb",notation:"func"}},{parser:Of,result:{alpha:!1,mode:"hsl",notation:"func"}},{parser:Rf,result:{alpha:!0,mode:"hsl",notation:"func"}},{parser:If,result:{alpha:!1,mode:"rgb",notation:"object"}},{parser:Ff,result:{alpha:!0,mode:"rgb",notation:"object"}}];function PE(r){return EE.reduce((e,{parser:t,result:n})=>e||(t(r)?n:null),null)}function AE(r,e="int"){const t=PE(r);return t?t.notation==="hex"&&e!=="float"?Object.assign(Object.assign({},t),{type:"int"}):t.notation==="func"?Object.assign(Object.assign({},t),{type:e}):null:null}function js(r){const e=[gE,yE,vE,bE,_E,wE];e.push(xE("int"),CE("int"));const t=GC(e);return n=>{const i=t(n);return i?Zt(i,r):null}}function SE(r){const e=js("int");if(typeof r!="string")return Ye.black();const t=e(r);return t??Ye.black()}function $f(r){const e=Dt(Math.floor(r),0,255).toString(16);return e.length===1?`0${e}`:e}function Ru(r,e="#"){const t=Ur(r.getComponents("rgb")).map($f).join("");return`${e}${t}`}function Du(r,e="#"){const t=r.getComponents("rgb"),n=[t[0],t[1],t[2],t[3]*255].map($f).join("");return`${e}${n}`}function Bf(r){const e=ur(0),t=Zt(r,"int");return`rgb(${Ur(t.getComponents("rgb")).map(i=>e(i)).join(", ")})`}function Ra(r){const e=ur(2),t=ur(0);return`rgba(${Zt(r,"int").getComponents("rgb").map((s,o)=>(o===3?e:t)(s)).join(", ")})`}function TE(r){const e=[ur(0),Ua,Ua],t=Zt(r,"int");return`hsl(${Ur(t.getComponents("hsl")).map((i,s)=>e[s](i)).join(", ")})`}function kE(r){const e=[ur(0),Ua,Ua,ur(2)];return`hsla(${Zt(r,"int").getComponents("hsl").map((i,s)=>e[s](i)).join(", ")})`}function Nf(r,e){const t=ur(e==="float"?2:0),n=["r","g","b"],i=Zt(r,e);return`{${Ur(i.getComponents("rgb")).map((o,l)=>`${n[l]}: ${t(o)}`).join(", ")}}`}function LE(r){return e=>Nf(e,r)}function Gf(r,e){const t=ur(2),n=ur(e==="float"?2:0),i=["r","g","b","a"];return`{${Zt(r,e).getComponents("rgb").map((l,y)=>{const x=y===3?t:n;return`${i[y]}: ${x(l)}`}).join(", ")}}`}function VE(r){return e=>Gf(e,r)}const OE=[{format:{alpha:!1,mode:"rgb",notation:"hex",type:"int"},stringifier:Ru},{format:{alpha:!0,mode:"rgb",notation:"hex",type:"int"},stringifier:Du},{format:{alpha:!1,mode:"rgb",notation:"func",type:"int"},stringifier:Bf},{format:{alpha:!0,mode:"rgb",notation:"func",type:"int"},stringifier:Ra},{format:{alpha:!1,mode:"hsl",notation:"func",type:"int"},stringifier:TE},{format:{alpha:!0,mode:"hsl",notation:"func",type:"int"},stringifier:kE},...["int","float"].reduce((r,e)=>[...r,{format:{alpha:!1,mode:"rgb",notation:"object",type:e},stringifier:LE(e)},{format:{alpha:!0,mode:"rgb",notation:"object",type:e},stringifier:VE(e)}],[])];function jf(r){return OE.reduce((e,t)=>e||(fE(t.format,r)?t.stringifier:null),null)}const ps=Qe("apl");class RE{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.value=t.value,this.value.emitter.on("change",this.onValueChange_),this.element=e.createElement("div"),this.element.classList.add(ps()),t.viewProps.bindClassModifiers(this.element),t.viewProps.bindTabIndex(this.element);const n=e.createElement("div");n.classList.add(ps("b")),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(ps("c")),n.appendChild(i),this.colorElem_=i;const s=e.createElement("div");s.classList.add(ps("m")),this.element.appendChild(s),this.markerElem_=s;const o=e.createElement("div");o.classList.add(ps("p")),this.markerElem_.appendChild(o),this.previewElem_=o,this.update_()}update_(){const e=this.value.rawValue,t=e.getComponents("rgb"),n=new Ye([t[0],t[1],t[2],0],"rgb"),i=new Ye([t[0],t[1],t[2],255],"rgb"),s=["to right",Ra(n),Ra(i)];this.colorElem_.style.background=`linear-gradient(${s.join(",")})`,this.previewElem_.style.backgroundColor=Ra(e);const o=tt(t[3],0,1,0,100);this.markerElem_.style.left=`${o}%`}onValueChange_(){this.update_()}}class DE{constructor(e,t){this.onKeyDown_=this.onKeyDown_.bind(this),this.onKeyUp_=this.onKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.view=new RE(e,{value:this.value,viewProps:this.viewProps}),this.ptHandler_=new oi(this.view.element),this.ptHandler_.emitter.on("down",this.onPointerDown_),this.ptHandler_.emitter.on("move",this.onPointerMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.element.addEventListener("keydown",this.onKeyDown_),this.view.element.addEventListener("keyup",this.onKeyUp_)}handlePointerEvent_(e,t){if(!e.point)return;const n=e.point.x/e.bounds.width,i=this.value.rawValue,[s,o,l]=i.getComponents("hsv");this.value.setRawValue(new Ye([s,o,l,n],"hsv"),t)}onPointerDown_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onKeyDown_(e){const t=or(ni(!0),un(e));if(t===0)return;const n=this.value.rawValue,[i,s,o,l]=n.getComponents("hsv");this.value.setRawValue(new Ye([i,s,o,l+t],"hsv"),{forceEmit:!1,last:!1})}onKeyUp_(e){or(ni(!0),un(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}}const Ai=Qe("coltxt");function ME(r){const e=r.createElement("select"),t=[{text:"RGB",value:"rgb"},{text:"HSL",value:"hsl"},{text:"HSV",value:"hsv"},{text:"HEX",value:"hex"}];return e.appendChild(t.reduce((n,i)=>{const s=r.createElement("option");return s.textContent=i.text,s.value=i.value,n.appendChild(s),n},r.createDocumentFragment())),e}class IE{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Ai()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(Ai("m")),this.modeElem_=ME(e),this.modeElem_.classList.add(Ai("ms")),n.appendChild(this.modeSelectElement),t.viewProps.bindDisabled(this.modeElem_);const i=e.createElement("div");i.classList.add(Ai("mm")),i.appendChild(Ja(e,"dropdown")),n.appendChild(i),this.element.appendChild(n);const s=e.createElement("div");s.classList.add(Ai("w")),this.element.appendChild(s),this.inputsElem_=s,this.inputViews_=t.inputViews,this.applyInputViews_(),an(t.mode,o=>{this.modeElem_.value=o})}get modeSelectElement(){return this.modeElem_}get inputViews(){return this.inputViews_}set inputViews(e){this.inputViews_=e,this.applyInputViews_()}applyInputViews_(){pf(this.inputsElem_);const e=this.element.ownerDocument;this.inputViews_.forEach(t=>{const n=e.createElement("div");n.classList.add(Ai("c")),n.appendChild(t.element),this.inputsElem_.appendChild(n)})}}function FE(r){return ur(r==="float"?2:0)}function $E(r,e,t){const n=Mi(r,e)[t];return new Za({min:0,max:n})}function BE(r,e,t){return new Ns(r,{arrayPosition:t===0?"fst":t===2?"lst":"mid",parser:e.parser,props:Ze.fromObject({formatter:FE(e.colorType),keyScale:ni(!1),pointerScale:e.colorType==="float"?.01:1}),value:jt(0,{constraint:$E(e.colorMode,e.colorType,t)}),viewProps:e.viewProps})}function NE(r,e){const t={colorMode:e.colorMode,colorType:e.colorType,parser:On,viewProps:e.viewProps};return[0,1,2].map(n=>{const i=BE(r,t,n);return Gi({primary:e.value,secondary:i.value,forward(s){return Zt(s,e.colorType).getComponents(e.colorMode)[n]},backward(s,o){const l=e.colorMode,x=Zt(s,e.colorType).getComponents(l);x[n]=o;const B=Ou(ro(Ur(x),x[3]),l,e.colorType);return Zt(B,"int")}}),i})}function GE(r,e){const t=new ku(r,{parser:js("int"),props:Ze.fromObject({formatter:Ru}),value:jt(Ye.black()),viewProps:e.viewProps});return Gi({primary:e.value,secondary:t.value,forward:n=>new Ye(Ur(n.getComponents()),n.mode),backward:(n,i)=>new Ye(ro(Ur(i.getComponents(n.mode)),n.getComponents()[3]),n.mode)}),[t]}function jE(r){return r!=="hex"}class UE{constructor(e,t){this.onModeSelectChange_=this.onModeSelectChange_.bind(this),this.colorType_=t.colorType,this.value=t.value,this.viewProps=t.viewProps,this.colorMode=jt(this.value.rawValue.mode),this.ccs_=this.createComponentControllers_(e),this.view=new IE(e,{mode:this.colorMode,inputViews:[this.ccs_[0].view,this.ccs_[1].view,this.ccs_[2].view],viewProps:this.viewProps}),this.view.modeSelectElement.addEventListener("change",this.onModeSelectChange_)}createComponentControllers_(e){const t=this.colorMode.rawValue;return jE(t)?NE(e,{colorMode:t,colorType:this.colorType_,value:this.value,viewProps:this.viewProps}):GE(e,{value:this.value,viewProps:this.viewProps})}onModeSelectChange_(e){const t=e.currentTarget;this.colorMode.rawValue=t.value,this.ccs_=this.createComponentControllers_(this.view.element.ownerDocument),this.view.inputViews=this.ccs_.map(n=>n.view)}}const wl=Qe("hpl");class zE{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.value=t.value,this.value.emitter.on("change",this.onValueChange_),this.element=e.createElement("div"),this.element.classList.add(wl()),t.viewProps.bindClassModifiers(this.element),t.viewProps.bindTabIndex(this.element);const n=e.createElement("div");n.classList.add(wl("c")),this.element.appendChild(n);const i=e.createElement("div");i.classList.add(wl("m")),this.element.appendChild(i),this.markerElem_=i,this.update_()}update_(){const e=this.value.rawValue,[t]=e.getComponents("hsv");this.markerElem_.style.backgroundColor=Bf(new Ye([t,100,100],"hsv"));const n=tt(t,0,360,0,100);this.markerElem_.style.left=`${n}%`}onValueChange_(){this.update_()}}class HE{constructor(e,t){this.onKeyDown_=this.onKeyDown_.bind(this),this.onKeyUp_=this.onKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.view=new zE(e,{value:this.value,viewProps:this.viewProps}),this.ptHandler_=new oi(this.view.element),this.ptHandler_.emitter.on("down",this.onPointerDown_),this.ptHandler_.emitter.on("move",this.onPointerMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.element.addEventListener("keydown",this.onKeyDown_),this.view.element.addEventListener("keyup",this.onKeyUp_)}handlePointerEvent_(e,t){if(!e.point)return;const n=tt(Dt(e.point.x,0,e.bounds.width),0,e.bounds.width,0,360),i=this.value.rawValue,[,s,o,l]=i.getComponents("hsv");this.value.setRawValue(new Ye([n,s,o,l],"hsv"),t)}onPointerDown_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onKeyDown_(e){const t=or(ni(!1),un(e));if(t===0)return;const n=this.value.rawValue,[i,s,o,l]=n.getComponents("hsv");this.value.setRawValue(new Ye([i+t,s,o,l],"hsv"),{forceEmit:!1,last:!1})}onKeyUp_(e){or(ni(!1),un(e))!==0&&this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}}const gl=Qe("svp"),kh=64;class KE{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),this.value=t.value,this.value.emitter.on("change",this.onValueChange_),this.element=e.createElement("div"),this.element.classList.add(gl()),t.viewProps.bindClassModifiers(this.element),t.viewProps.bindTabIndex(this.element);const n=e.createElement("canvas");n.height=kh,n.width=kh,n.classList.add(gl("c")),this.element.appendChild(n),this.canvasElement=n;const i=e.createElement("div");i.classList.add(gl("m")),this.element.appendChild(i),this.markerElem_=i,this.update_()}update_(){const e=rC(this.canvasElement);if(!e)return;const n=this.value.rawValue.getComponents("hsv"),i=this.canvasElement.width,s=this.canvasElement.height,o=e.getImageData(0,0,i,s),l=o.data;for(let B=0;Bn.getComponents()[3],backward:(n,i)=>{const s=n.getComponents();return s[3]=i,new Ye(s,n.mode)}}),this.textsC_=new UE(e,{colorType:t.colorType,value:this.value,viewProps:this.viewProps}),this.view=new oE(e,{alphaViews:this.alphaIcs_?{palette:this.alphaIcs_.palette.view,text:this.alphaIcs_.text.view}:null,hPaletteView:this.hPaletteC_.view,supportsAlpha:t.supportsAlpha,svPaletteView:this.svPaletteC_.view,textsView:this.textsC_.view,viewProps:this.viewProps})}get textsController(){return this.textsC_}}const yl=Qe("colsw");class YE{constructor(e,t){this.onValueChange_=this.onValueChange_.bind(this),t.value.emitter.on("change",this.onValueChange_),this.value=t.value,this.element=e.createElement("div"),this.element.classList.add(yl()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(yl("sw")),this.element.appendChild(n),this.swatchElem_=n;const i=e.createElement("button");i.classList.add(yl("b")),t.viewProps.bindDisabled(i),this.element.appendChild(i),this.buttonElement=i,this.update_()}update_(){const e=this.value.rawValue;this.swatchElem_.style.backgroundColor=Du(e)}onValueChange_(){this.update_()}}class WE{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.view=new YE(e,{value:this.value,viewProps:this.viewProps})}}class Mu{constructor(e,t){this.onButtonBlur_=this.onButtonBlur_.bind(this),this.onButtonClick_=this.onButtonClick_.bind(this),this.onPopupChildBlur_=this.onPopupChildBlur_.bind(this),this.onPopupChildKeydown_=this.onPopupChildKeydown_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.foldable_=Fs.create(t.expanded),this.swatchC_=new WE(e,{value:this.value,viewProps:this.viewProps});const n=this.swatchC_.view.buttonElement;n.addEventListener("blur",this.onButtonBlur_),n.addEventListener("click",this.onButtonClick_),this.textC_=new ku(e,{parser:t.parser,props:Ze.fromObject({formatter:t.formatter}),value:this.value,viewProps:this.viewProps}),this.view=new JC(e,{foldable:this.foldable_,pickerLayout:t.pickerLayout}),this.view.swatchElement.appendChild(this.swatchC_.view.element),this.view.textElement.appendChild(this.textC_.view.element),this.popC_=t.pickerLayout==="popup"?new wf(e,{viewProps:this.viewProps}):null;const i=new XE(e,{colorType:t.colorType,supportsAlpha:t.supportsAlpha,value:this.value,viewProps:this.viewProps});i.view.allFocusableElements.forEach(s=>{s.addEventListener("blur",this.onPopupChildBlur_),s.addEventListener("keydown",this.onPopupChildKeydown_)}),this.pickerC_=i,this.popC_?(this.view.element.appendChild(this.popC_.view.element),this.popC_.view.element.appendChild(i.view.element),Gi({primary:this.foldable_.value("expanded"),secondary:this.popC_.shows,forward:s=>s,backward:(s,o)=>o})):this.view.pickerElement&&(this.view.pickerElement.appendChild(this.pickerC_.view.element),Au(this.foldable_,this.view.pickerElement))}get textController(){return this.textC_}onButtonBlur_(e){if(!this.popC_)return;const t=this.view.element,n=e.relatedTarget;(!n||!t.contains(n))&&(this.popC_.shows.rawValue=!1)}onButtonClick_(){this.foldable_.set("expanded",!this.foldable_.get("expanded")),this.foldable_.get("expanded")&&this.pickerC_.view.allFocusableElements[0].focus()}onPopupChildBlur_(e){if(!this.popC_)return;const t=this.popC_.view.element,n=ff(e);n&&t.contains(n)||n&&n===this.swatchC_.view.buttonElement&&!gu(t.ownerDocument)||(this.popC_.shows.rawValue=!1)}onPopupChildKeydown_(e){this.popC_?e.key==="Escape"&&(this.popC_.shows.rawValue=!1):this.view.pickerElement&&e.key==="Escape"&&this.swatchC_.view.buttonElement.focus()}}function ZE(r){return Ur(r.getComponents("rgb")).reduce((e,t)=>e<<8|Math.floor(t)&255,0)}function QE(r){return r.getComponents("rgb").reduce((e,t,n)=>{const i=Math.floor(n===3?t*255:t)&255;return e<<8|i},0)>>>0}function JE(r){return new Ye([r>>16&255,r>>8&255,r&255],"rgb")}function e1(r){return new Ye([r>>24&255,r>>16&255,r>>8&255,tt(r&255,0,255,0,1)],"rgb")}function t1(r){return typeof r!="number"?Ye.black():JE(r)}function r1(r){return typeof r!="number"?Ye.black():e1(r)}function Da(r,e){return typeof r!="object"||vt(r)?!1:e in r&&typeof r[e]=="number"}function Uf(r){return Da(r,"r")&&Da(r,"g")&&Da(r,"b")}function zf(r){return Uf(r)&&Da(r,"a")}function Hf(r){return Uf(r)}function Iu(r,e){if(r.mode!==e.mode||r.type!==e.type)return!1;const t=r.getComponents(),n=e.getComponents();for(let i=0;i{Gs(t,e(n))}:null}function i1(r){const e=r?QE:ZE;return(t,n)=>{Gs(t,e(n))}}function s1(r,e,t){const i=Zt(e,t).toRgbaObject();r.writeProperty("r",i.r),r.writeProperty("g",i.g),r.writeProperty("b",i.b),r.writeProperty("a",i.a)}function a1(r,e,t){const i=Zt(e,t).toRgbaObject();r.writeProperty("r",i.r),r.writeProperty("g",i.g),r.writeProperty("b",i.b)}function o1(r,e){return(t,n)=>{r?s1(t,n,e):a1(t,n,e)}}function l1(r){var e;return!!(!((e=r?.color)===null||e===void 0)&&e.alpha)}function u1(r){return r?e=>Du(e,"0x"):e=>Ru(e,"0x")}function c1(r){return"color"in r||r.view==="color"}Jt({id:"input-color-number",type:"input",accept:(r,e)=>{if(typeof r!="number"||!c1(e))return null;const t=Lu(e);return t?{initialValue:r,params:Object.assign(Object.assign({},t),{supportsAlpha:l1(e)})}:null},binding:{reader:r=>r.params.supportsAlpha?r1:t1,equals:Iu,writer:r=>i1(r.params.supportsAlpha)},controller:r=>{var e,t;return new Mu(r.document,{colorType:"int",expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,formatter:u1(r.params.supportsAlpha),parser:js("int"),pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",supportsAlpha:r.params.supportsAlpha,value:r.value,viewProps:r.viewProps})}});function d1(r,e){if(!Hf(r))return Zt(Ye.black(),e);if(e==="int"){const t=Lh(r);return new Ye(t,"rgb")}if(e==="float"){const t=Lh(r);return new Vu(t,"rgb")}return Zt(Ye.black(),"int")}function h1(r){return zf(r)}function p1(r){return e=>{const t=d1(e,r);return Zt(t,"int")}}function f1(r,e){return t=>r?Gf(t,e):Nf(t,e)}Jt({id:"input-color-object",type:"input",accept:(r,e)=>{var t;if(!Hf(r))return null;const n=Lu(e);return n?{initialValue:r,params:Object.assign(Object.assign({},n),{colorType:(t=Tf(e))!==null&&t!==void 0?t:"int"})}:null},binding:{reader:r=>p1(r.params.colorType),equals:Iu,writer:r=>o1(h1(r.initialValue),r.params.colorType)},controller:r=>{var e,t;const n=zf(r.initialValue);return new Mu(r.document,{colorType:r.params.colorType,expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,formatter:f1(n,r.params.colorType),parser:js("int"),pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",supportsAlpha:n,value:r.value,viewProps:r.viewProps})}});Jt({id:"input-color-string",type:"input",accept:(r,e)=>{if(typeof r!="string"||e.view==="text")return null;const t=AE(r,Tf(e));if(!t)return null;const n=jf(t);if(!n)return null;const i=Lu(e);return i?{initialValue:r,params:Object.assign(Object.assign({},i),{format:t,stringifier:n})}:null},binding:{reader:()=>SE,equals:Iu,writer:r=>{const e=n1(r.params.format);if(!e)throw pr.notBindable();return e}},controller:r=>{var e,t;return new Mu(r.document,{colorType:r.params.format.type,expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,formatter:r.params.stringifier,parser:js("int"),pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",supportsAlpha:r.params.format.alpha,value:r.value,viewProps:r.viewProps})}});class Fu{constructor(e){this.components=e.components,this.asm_=e.assembly}constrain(e){const t=this.asm_.toComponents(e).map((n,i)=>{var s,o;return(o=(s=this.components[i])===null||s===void 0?void 0:s.constrain(n))!==null&&o!==void 0?o:n});return this.asm_.fromComponents(t)}}const Vh=Qe("pndtxt");class m1{constructor(e,t){this.textViews=t.textViews,this.element=e.createElement("div"),this.element.classList.add(Vh()),this.textViews.forEach(n=>{const i=e.createElement("div");i.classList.add(Vh("a")),i.appendChild(n.element),this.element.appendChild(i)})}}function v1(r,e,t){return new Ns(r,{arrayPosition:t===0?"fst":t===e.axes.length-1?"lst":"mid",parser:e.parser,props:e.axes[t].textProps,value:jt(0,{constraint:e.axes[t].constraint}),viewProps:e.viewProps})}class $u{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.acs_=t.axes.map((n,i)=>v1(e,t,i)),this.acs_.forEach((n,i)=>{Gi({primary:this.value,secondary:n.value,forward:s=>t.assembly.toComponents(s)[i],backward:(s,o)=>{const l=t.assembly.toComponents(s);return l[i]=o,t.assembly.fromComponents(l)}})}),this.view=new m1(e,{textViews:this.acs_.map(n=>n.view)})}get textControllers(){return this.acs_}}class b1 extends wu{get max(){return this.controller.valueController.sliderController.props.get("max")}set max(e){this.controller.valueController.sliderController.props.set("max",e)}get min(){return this.controller.valueController.sliderController.props.get("min")}set min(e){this.controller.valueController.sliderController.props.set("min",e)}}function _1(r,e){const t=[],n=of(r,e);n&&t.push(n);const i=lf(r);i&&t.push(i);const s=Tu(r.options);return s&&t.push(s),new Bs(t)}Jt({id:"input-number",type:"input",accept:(r,e)=>{if(typeof r!="number")return null;const t=Xt(e,n=>Object.assign(Object.assign({},cf(n)),{options:n.optional.custom(to),readonly:n.optional.constant(!1)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>nf,constraint:r=>_1(r.params,r.initialValue),writer:r=>Gs},controller:r=>{const e=r.value,t=r.constraint,n=t&&ja(t,eo);if(n)return new Di(r.document,{props:new Ze({options:n.values.value("options")}),value:e,viewProps:r.viewProps});const i=uf(r.params,e.rawValue),s=t&&ja(t,Za);return s?new Sh(r.document,Object.assign(Object.assign({},XC(Object.assign(Object.assign({},i),{keyScale:jt(i.keyScale),max:s.values.value("max"),min:s.values.value("min")}))),{parser:On,value:e,viewProps:r.viewProps})):new Ns(r.document,{parser:On,props:Ze.fromObject(i),value:e,viewProps:r.viewProps})},api(r){return typeof r.controller.value.rawValue!="number"?null:r.controller.valueController instanceof Sh?new b1(r.controller):r.controller.valueController instanceof Di?new Su(r.controller):null}});class Ln{constructor(e=0,t=0){this.x=e,this.y=t}getComponents(){return[this.x,this.y]}static isObject(e){if(vt(e))return!1;const t=e.x,n=e.y;return!(typeof t!="number"||typeof n!="number")}static equals(e,t){return e.x===t.x&&e.y===t.y}toObject(){return{x:this.x,y:this.y}}}const Kf={toComponents:r=>r.getComponents(),fromComponents:r=>new Ln(...r)},Si=Qe("p2d");class w1{constructor(e,t){this.element=e.createElement("div"),this.element.classList.add(Si()),t.viewProps.bindClassModifiers(this.element),an(t.expanded,Ni(this.element,Si(void 0,"expanded")));const n=e.createElement("div");n.classList.add(Si("h")),this.element.appendChild(n);const i=e.createElement("button");i.classList.add(Si("b")),i.appendChild(Ja(e,"p2dpad")),t.viewProps.bindDisabled(i),n.appendChild(i),this.buttonElement=i;const s=e.createElement("div");if(s.classList.add(Si("t")),n.appendChild(s),this.textElement=s,t.pickerLayout==="inline"){const o=e.createElement("div");o.classList.add(Si("p")),this.element.appendChild(o),this.pickerElement=o}else this.pickerElement=null}}const En=Qe("p2dp");class g1{constructor(e,t){this.onFoldableChange_=this.onFoldableChange_.bind(this),this.onPropsChange_=this.onPropsChange_.bind(this),this.onValueChange_=this.onValueChange_.bind(this),this.props_=t.props,this.props_.emitter.on("change",this.onPropsChange_),this.element=e.createElement("div"),this.element.classList.add(En()),t.layout==="popup"&&this.element.classList.add(En(void 0,"p")),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("div");n.classList.add(En("p")),t.viewProps.bindTabIndex(n),this.element.appendChild(n),this.padElement=n;const i=e.createElementNS(Br,"svg");i.classList.add(En("g")),this.padElement.appendChild(i),this.svgElem_=i;const s=e.createElementNS(Br,"line");s.classList.add(En("ax")),s.setAttributeNS(null,"x1","0"),s.setAttributeNS(null,"y1","50%"),s.setAttributeNS(null,"x2","100%"),s.setAttributeNS(null,"y2","50%"),this.svgElem_.appendChild(s);const o=e.createElementNS(Br,"line");o.classList.add(En("ax")),o.setAttributeNS(null,"x1","50%"),o.setAttributeNS(null,"y1","0"),o.setAttributeNS(null,"x2","50%"),o.setAttributeNS(null,"y2","100%"),this.svgElem_.appendChild(o);const l=e.createElementNS(Br,"line");l.classList.add(En("l")),l.setAttributeNS(null,"x1","50%"),l.setAttributeNS(null,"y1","50%"),this.svgElem_.appendChild(l),this.lineElem_=l;const y=e.createElement("div");y.classList.add(En("m")),this.padElement.appendChild(y),this.markerElem_=y,t.value.emitter.on("change",this.onValueChange_),this.value=t.value,this.update_()}get allFocusableElements(){return[this.padElement]}update_(){const[e,t]=this.value.rawValue.getComponents(),n=this.props_.get("max"),i=tt(e,-n,+n,0,100),s=tt(t,-n,+n,0,100),o=this.props_.get("invertsY")?100-s:s;this.lineElem_.setAttributeNS(null,"x2",`${i}%`),this.lineElem_.setAttributeNS(null,"y2",`${o}%`),this.markerElem_.style.left=`${i}%`,this.markerElem_.style.top=`${o}%`}onValueChange_(){this.update_()}onPropsChange_(){this.update_()}onFoldableChange_(){this.update_()}}function Oh(r,e,t){return[or(e[0],un(r)),or(e[1],As(r))*(t?1:-1)]}class y1{constructor(e,t){this.onPadKeyDown_=this.onPadKeyDown_.bind(this),this.onPadKeyUp_=this.onPadKeyUp_.bind(this),this.onPointerDown_=this.onPointerDown_.bind(this),this.onPointerMove_=this.onPointerMove_.bind(this),this.onPointerUp_=this.onPointerUp_.bind(this),this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.view=new g1(e,{layout:t.layout,props:this.props,value:this.value,viewProps:this.viewProps}),this.ptHandler_=new oi(this.view.padElement),this.ptHandler_.emitter.on("down",this.onPointerDown_),this.ptHandler_.emitter.on("move",this.onPointerMove_),this.ptHandler_.emitter.on("up",this.onPointerUp_),this.view.padElement.addEventListener("keydown",this.onPadKeyDown_),this.view.padElement.addEventListener("keyup",this.onPadKeyUp_)}handlePointerEvent_(e,t){if(!e.point)return;const n=this.props.get("max"),i=tt(e.point.x,0,e.bounds.width,-n,+n),s=tt(this.props.get("invertsY")?e.bounds.height-e.point.y:e.point.y,0,e.bounds.height,-n,+n);this.value.setRawValue(new Ln(i,s),t)}onPointerDown_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerMove_(e){this.handlePointerEvent_(e.data,{forceEmit:!1,last:!1})}onPointerUp_(e){this.handlePointerEvent_(e.data,{forceEmit:!0,last:!0})}onPadKeyDown_(e){xf(e.key)&&e.preventDefault();const[t,n]=Oh(e,[this.props.get("xKeyScale"),this.props.get("yKeyScale")],this.props.get("invertsY"));t===0&&n===0||this.value.setRawValue(new Ln(this.value.rawValue.x+t,this.value.rawValue.y+n),{forceEmit:!1,last:!1})}onPadKeyUp_(e){const[t,n]=Oh(e,[this.props.get("xKeyScale"),this.props.get("yKeyScale")],this.props.get("invertsY"));t===0&&n===0||this.value.setRawValue(this.value.rawValue,{forceEmit:!0,last:!0})}}class x1{constructor(e,t){var n,i;this.onPopupChildBlur_=this.onPopupChildBlur_.bind(this),this.onPopupChildKeydown_=this.onPopupChildKeydown_.bind(this),this.onPadButtonBlur_=this.onPadButtonBlur_.bind(this),this.onPadButtonClick_=this.onPadButtonClick_.bind(this),this.value=t.value,this.viewProps=t.viewProps,this.foldable_=Fs.create(t.expanded),this.popC_=t.pickerLayout==="popup"?new wf(e,{viewProps:this.viewProps}):null;const s=new y1(e,{layout:t.pickerLayout,props:new Ze({invertsY:jt(t.invertsY),max:jt(t.max),xKeyScale:t.axes[0].textProps.value("keyScale"),yKeyScale:t.axes[1].textProps.value("keyScale")}),value:this.value,viewProps:this.viewProps});s.view.allFocusableElements.forEach(o=>{o.addEventListener("blur",this.onPopupChildBlur_),o.addEventListener("keydown",this.onPopupChildKeydown_)}),this.pickerC_=s,this.textC_=new $u(e,{assembly:Kf,axes:t.axes,parser:t.parser,value:this.value,viewProps:this.viewProps}),this.view=new w1(e,{expanded:this.foldable_.value("expanded"),pickerLayout:t.pickerLayout,viewProps:this.viewProps}),this.view.textElement.appendChild(this.textC_.view.element),(n=this.view.buttonElement)===null||n===void 0||n.addEventListener("blur",this.onPadButtonBlur_),(i=this.view.buttonElement)===null||i===void 0||i.addEventListener("click",this.onPadButtonClick_),this.popC_?(this.view.element.appendChild(this.popC_.view.element),this.popC_.view.element.appendChild(this.pickerC_.view.element),Gi({primary:this.foldable_.value("expanded"),secondary:this.popC_.shows,forward:o=>o,backward:(o,l)=>l})):this.view.pickerElement&&(this.view.pickerElement.appendChild(this.pickerC_.view.element),Au(this.foldable_,this.view.pickerElement))}get textController(){return this.textC_}onPadButtonBlur_(e){if(!this.popC_)return;const t=this.view.element,n=e.relatedTarget;(!n||!t.contains(n))&&(this.popC_.shows.rawValue=!1)}onPadButtonClick_(){this.foldable_.set("expanded",!this.foldable_.get("expanded")),this.foldable_.get("expanded")&&this.pickerC_.view.allFocusableElements[0].focus()}onPopupChildBlur_(e){if(!this.popC_)return;const t=this.popC_.view.element,n=ff(e);n&&t.contains(n)||n&&n===this.view.buttonElement&&!gu(t.ownerDocument)||(this.popC_.shows.rawValue=!1)}onPopupChildKeydown_(e){this.popC_?e.key==="Escape"&&(this.popC_.shows.rawValue=!1):this.view.pickerElement&&e.key==="Escape"&&this.view.buttonElement.focus()}}function C1(r){return Ln.isObject(r)?new Ln(r.x,r.y):new Ln}function E1(r,e){r.writeProperty("x",e.x),r.writeProperty("y",e.y)}function P1(r,e){return new Fu({assembly:Kf,components:[nn(Object.assign(Object.assign({},r),r.x),e.x),nn(Object.assign(Object.assign({},r),r.y),e.y)]})}function Rh(r,e){var t,n;if(!vt(r.min)||!vt(r.max))return Math.max(Math.abs((t=r.min)!==null&&t!==void 0?t:0),Math.abs((n=r.max)!==null&&n!==void 0?n:0));const i=af(r);return Math.max(Math.abs(i)*10,Math.abs(e)*10)}function A1(r,e){var t,n;const i=Rh(ri(r,(t=r.x)!==null&&t!==void 0?t:{}),e.x),s=Rh(ri(r,(n=r.y)!==null&&n!==void 0?n:{}),e.y);return Math.max(i,s)}function S1(r){if(!("y"in r))return!1;const e=r.y;return e&&"inverted"in e?!!e.inverted:!1}Jt({id:"input-point2d",type:"input",accept:(r,e)=>{if(!Ln.isObject(r))return null;const t=Xt(e,n=>Object.assign(Object.assign({},Ss(n)),{expanded:n.optional.boolean,picker:n.optional.custom(Ef),readonly:n.optional.constant(!1),x:n.optional.custom(Tn),y:n.optional.object(Object.assign(Object.assign({},Ss(n)),{inverted:n.optional.boolean}))}));return t?{initialValue:r,params:t}:null},binding:{reader:()=>C1,constraint:r=>P1(r.params,r.initialValue),equals:Ln.equals,writer:()=>E1},controller:r=>{var e,t;const n=r.document,i=r.value,s=r.constraint,o=[r.params.x,r.params.y];return new x1(n,{axes:i.rawValue.getComponents().map((l,y)=>{var x;return bu({constraint:s.components[y],initialValue:l,params:ri(r.params,(x=o[y])!==null&&x!==void 0?x:{})})}),expanded:(e=r.params.expanded)!==null&&e!==void 0?e:!1,invertsY:S1(r.params),max:A1(r.params,i.rawValue),parser:On,pickerLayout:(t=r.params.picker)!==null&&t!==void 0?t:"popup",value:i,viewProps:r.viewProps})}});class Vi{constructor(e=0,t=0,n=0){this.x=e,this.y=t,this.z=n}getComponents(){return[this.x,this.y,this.z]}static isObject(e){if(vt(e))return!1;const t=e.x,n=e.y,i=e.z;return!(typeof t!="number"||typeof n!="number"||typeof i!="number")}static equals(e,t){return e.x===t.x&&e.y===t.y&&e.z===t.z}toObject(){return{x:this.x,y:this.y,z:this.z}}}const qf={toComponents:r=>r.getComponents(),fromComponents:r=>new Vi(...r)};function T1(r){return Vi.isObject(r)?new Vi(r.x,r.y,r.z):new Vi}function k1(r,e){r.writeProperty("x",e.x),r.writeProperty("y",e.y),r.writeProperty("z",e.z)}function L1(r,e){return new Fu({assembly:qf,components:[nn(Object.assign(Object.assign({},r),r.x),e.x),nn(Object.assign(Object.assign({},r),r.y),e.y),nn(Object.assign(Object.assign({},r),r.z),e.z)]})}Jt({id:"input-point3d",type:"input",accept:(r,e)=>{if(!Vi.isObject(r))return null;const t=Xt(e,n=>Object.assign(Object.assign({},Ss(n)),{readonly:n.optional.constant(!1),x:n.optional.custom(Tn),y:n.optional.custom(Tn),z:n.optional.custom(Tn)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>T1,constraint:r=>L1(r.params,r.initialValue),equals:Vi.equals,writer:r=>k1},controller:r=>{const e=r.value,t=r.constraint,n=[r.params.x,r.params.y,r.params.z];return new $u(r.document,{assembly:qf,axes:e.rawValue.getComponents().map((i,s)=>{var o;return bu({constraint:t.components[s],initialValue:i,params:ri(r.params,(o=n[s])!==null&&o!==void 0?o:{})})}),parser:On,value:e,viewProps:r.viewProps})}});class Oi{constructor(e=0,t=0,n=0,i=0){this.x=e,this.y=t,this.z=n,this.w=i}getComponents(){return[this.x,this.y,this.z,this.w]}static isObject(e){if(vt(e))return!1;const t=e.x,n=e.y,i=e.z,s=e.w;return!(typeof t!="number"||typeof n!="number"||typeof i!="number"||typeof s!="number")}static equals(e,t){return e.x===t.x&&e.y===t.y&&e.z===t.z&&e.w===t.w}toObject(){return{x:this.x,y:this.y,z:this.z,w:this.w}}}const Xf={toComponents:r=>r.getComponents(),fromComponents:r=>new Oi(...r)};function V1(r){return Oi.isObject(r)?new Oi(r.x,r.y,r.z,r.w):new Oi}function O1(r,e){r.writeProperty("x",e.x),r.writeProperty("y",e.y),r.writeProperty("z",e.z),r.writeProperty("w",e.w)}function R1(r,e){return new Fu({assembly:Xf,components:[nn(Object.assign(Object.assign({},r),r.x),e.x),nn(Object.assign(Object.assign({},r),r.y),e.y),nn(Object.assign(Object.assign({},r),r.z),e.z),nn(Object.assign(Object.assign({},r),r.w),e.w)]})}Jt({id:"input-point4d",type:"input",accept:(r,e)=>{if(!Oi.isObject(r))return null;const t=Xt(e,n=>Object.assign(Object.assign({},Ss(n)),{readonly:n.optional.constant(!1),w:n.optional.custom(Tn),x:n.optional.custom(Tn),y:n.optional.custom(Tn),z:n.optional.custom(Tn)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>V1,constraint:r=>R1(r.params,r.initialValue),equals:Oi.equals,writer:r=>O1},controller:r=>{const e=r.value,t=r.constraint,n=[r.params.x,r.params.y,r.params.z,r.params.w];return new $u(r.document,{assembly:Xf,axes:e.rawValue.getComponents().map((i,s)=>{var o;return bu({constraint:t.components[s],initialValue:i,params:ri(r.params,(o=n[s])!==null&&o!==void 0?o:{})})}),parser:On,value:e,viewProps:r.viewProps})}});function D1(r){const e=[],t=Tu(r.options);return t&&e.push(t),new Bs(e)}Jt({id:"input-string",type:"input",accept:(r,e)=>{if(typeof r!="string")return null;const t=Xt(e,n=>({readonly:n.optional.constant(!1),options:n.optional.custom(to)}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>yf,constraint:r=>D1(r.params),writer:r=>Gs},controller:r=>{const e=r.document,t=r.value,n=r.constraint,i=n&&ja(n,eo);return i?new Di(e,{props:new Ze({options:i.values.value("options")}),value:t,viewProps:r.viewProps}):new ku(e,{parser:s=>s,props:Ze.fromObject({formatter:Il}),value:t,viewProps:r.viewProps})},api(r){return typeof r.controller.value.rawValue!="string"?null:r.controller.valueController instanceof Di?new Su(r.controller):null}});const no={monitor:{defaultRows:3}},Dh=Qe("mll");class M1{constructor(e,t){this.onValueUpdate_=this.onValueUpdate_.bind(this),this.formatter_=t.formatter,this.element=e.createElement("div"),this.element.classList.add(Dh()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("textarea");n.classList.add(Dh("i")),n.style.height=`calc(var(${Cf("containerUnitSize")}) * ${t.rows})`,n.readOnly=!0,t.viewProps.bindDisabled(n),this.element.appendChild(n),this.textareaElem_=n,t.value.emitter.on("change",this.onValueUpdate_),this.value=t.value,this.update_()}update_(){const e=this.textareaElem_,t=e.scrollTop===e.scrollHeight-e.clientHeight,n=[];this.value.rawValue.forEach(i=>{i!==void 0&&n.push(this.formatter_(i))}),e.textContent=n.join(`
+`),t&&(e.scrollTop=e.scrollHeight)}onValueUpdate_(){this.update_()}}class Bu{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.view=new M1(e,{formatter:t.formatter,rows:t.rows,value:this.value,viewProps:this.viewProps})}}const Mh=Qe("sgl");class I1{constructor(e,t){this.onValueUpdate_=this.onValueUpdate_.bind(this),this.formatter_=t.formatter,this.element=e.createElement("div"),this.element.classList.add(Mh()),t.viewProps.bindClassModifiers(this.element);const n=e.createElement("input");n.classList.add(Mh("i")),n.readOnly=!0,n.type="text",t.viewProps.bindDisabled(n),this.element.appendChild(n),this.inputElement=n,t.value.emitter.on("change",this.onValueUpdate_),this.value=t.value,this.update_()}update_(){const e=this.value.rawValue,t=e[e.length-1];this.inputElement.value=t!==void 0?this.formatter_(t):""}onValueUpdate_(){this.update_()}}class Nu{constructor(e,t){this.value=t.value,this.viewProps=t.viewProps,this.view=new I1(e,{formatter:t.formatter,value:this.value,viewProps:this.viewProps})}}Jt({id:"monitor-bool",type:"monitor",accept:(r,e)=>{if(typeof r!="boolean")return null;const t=Xt(e,n=>({readonly:n.required.constant(!0),rows:n.optional.number}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>gf},controller:r=>{var e;return r.value.rawValue.length===1?new Nu(r.document,{formatter:Ah,value:r.value,viewProps:r.viewProps}):new Bu(r.document,{formatter:Ah,rows:(e=r.params.rows)!==null&&e!==void 0?e:no.monitor.defaultRows,value:r.value,viewProps:r.viewProps})}});class F1 extends wu{get max(){return this.controller.valueController.props.get("max")}set max(e){this.controller.valueController.props.set("max",e)}get min(){return this.controller.valueController.props.get("min")}set min(e){this.controller.valueController.props.set("min",e)}}const Pn=Qe("grl");class $1{constructor(e,t){this.onCursorChange_=this.onCursorChange_.bind(this),this.onValueUpdate_=this.onValueUpdate_.bind(this),this.element=e.createElement("div"),this.element.classList.add(Pn()),t.viewProps.bindClassModifiers(this.element),this.formatter_=t.formatter,this.props_=t.props,this.cursor_=t.cursor,this.cursor_.emitter.on("change",this.onCursorChange_);const n=e.createElementNS(Br,"svg");n.classList.add(Pn("g")),n.style.height=`calc(var(${Cf("containerUnitSize")}) * ${t.rows})`,this.element.appendChild(n),this.svgElem_=n;const i=e.createElementNS(Br,"polyline");this.svgElem_.appendChild(i),this.lineElem_=i;const s=e.createElement("div");s.classList.add(Pn("t"),Qe("tt")()),this.element.appendChild(s),this.tooltipElem_=s,t.value.emitter.on("change",this.onValueUpdate_),this.value=t.value,this.update_()}get graphElement(){return this.svgElem_}update_(){const{clientWidth:e,clientHeight:t}=this.element,n=this.value.rawValue.length-1,i=this.props_.get("min"),s=this.props_.get("max"),o=[];this.value.rawValue.forEach((U,de)=>{if(U===void 0)return;const Se=tt(de,0,n,0,e),Ce=tt(U,i,s,t,0);o.push([Se,Ce].join(","))}),this.lineElem_.setAttributeNS(null,"points",o.join(" "));const l=this.tooltipElem_,y=this.value.rawValue[this.cursor_.rawValue];if(y===void 0){l.classList.remove(Pn("t","a"));return}const x=tt(this.cursor_.rawValue,0,n,0,e),B=tt(y,i,s,t,0);l.style.left=`${x}px`,l.style.top=`${B}px`,l.textContent=`${this.formatter_(y)}`,l.classList.contains(Pn("t","a"))||(l.classList.add(Pn("t","a"),Pn("t","in")),Ga(l),l.classList.remove(Pn("t","in")))}onValueUpdate_(){this.update_()}onCursorChange_(){this.update_()}}class Yf{constructor(e,t){if(this.onGraphMouseMove_=this.onGraphMouseMove_.bind(this),this.onGraphMouseLeave_=this.onGraphMouseLeave_.bind(this),this.onGraphPointerDown_=this.onGraphPointerDown_.bind(this),this.onGraphPointerMove_=this.onGraphPointerMove_.bind(this),this.onGraphPointerUp_=this.onGraphPointerUp_.bind(this),this.props=t.props,this.value=t.value,this.viewProps=t.viewProps,this.cursor_=jt(-1),this.view=new $1(e,{cursor:this.cursor_,formatter:t.formatter,rows:t.rows,props:this.props,value:this.value,viewProps:this.viewProps}),!gu(e))this.view.element.addEventListener("mousemove",this.onGraphMouseMove_),this.view.element.addEventListener("mouseleave",this.onGraphMouseLeave_);else{const n=new oi(this.view.element);n.emitter.on("down",this.onGraphPointerDown_),n.emitter.on("move",this.onGraphPointerMove_),n.emitter.on("up",this.onGraphPointerUp_)}}importProps(e){return zr(e,null,t=>({max:t.required.number,min:t.required.number}),t=>(this.props.set("max",t.max),this.props.set("min",t.min),!0))}exportProps(){return Hr(null,{max:this.props.get("max"),min:this.props.get("min")})}onGraphMouseLeave_(){this.cursor_.rawValue=-1}onGraphMouseMove_(e){const{clientWidth:t}=this.view.element;this.cursor_.rawValue=Math.floor(tt(e.offsetX,0,t,0,this.value.rawValue.length))}onGraphPointerDown_(e){this.onGraphPointerMove_(e)}onGraphPointerMove_(e){if(!e.data.point){this.cursor_.rawValue=-1;return}this.cursor_.rawValue=Math.floor(tt(e.data.point.x,0,e.data.bounds.width,0,this.value.rawValue.length))}onGraphPointerUp_(){this.cursor_.rawValue=-1}}function Fl(r){return vt(r.format)?ur(2):r.format}function B1(r){var e;return r.value.rawValue.length===1?new Nu(r.document,{formatter:Fl(r.params),value:r.value,viewProps:r.viewProps}):new Bu(r.document,{formatter:Fl(r.params),rows:(e=r.params.rows)!==null&&e!==void 0?e:no.monitor.defaultRows,value:r.value,viewProps:r.viewProps})}function N1(r){var e,t,n;return new Yf(r.document,{formatter:Fl(r.params),rows:(e=r.params.rows)!==null&&e!==void 0?e:no.monitor.defaultRows,props:Ze.fromObject({max:(t=r.params.max)!==null&&t!==void 0?t:100,min:(n=r.params.min)!==null&&n!==void 0?n:0}),value:r.value,viewProps:r.viewProps})}function Ih(r){return r.view==="graph"}Jt({id:"monitor-number",type:"monitor",accept:(r,e)=>{if(typeof r!="number")return null;const t=Xt(e,n=>({format:n.optional.function,max:n.optional.number,min:n.optional.number,readonly:n.required.constant(!0),rows:n.optional.number,view:n.optional.string}));return t?{initialValue:r,params:t}:null},binding:{defaultBufferSize:r=>Ih(r)?64:1,reader:r=>nf},controller:r=>Ih(r.params)?N1(r):B1(r),api:r=>r.controller.valueController instanceof Yf?new F1(r.controller):null});Jt({id:"monitor-string",type:"monitor",accept:(r,e)=>{if(typeof r!="string")return null;const t=Xt(e,n=>({multiline:n.optional.boolean,readonly:n.required.constant(!0),rows:n.optional.number}));return t?{initialValue:r,params:t}:null},binding:{reader:r=>yf},controller:r=>{var e;const t=r.value;return t.rawValue.length>1||r.params.multiline?new Bu(r.document,{formatter:Il,rows:(e=r.params.rows)!==null&&e!==void 0?e:no.monitor.defaultRows,value:t,viewProps:r.viewProps}):new Nu(r.document,{formatter:Il,value:t,viewProps:r.viewProps})}});function eS(r,e,t,n){function i(s){return s instanceof t?s:new t(function(o){o(s)})}return new(t||(t=Promise))(function(s,o){function l(B){try{x(n.next(B))}catch(U){o(U)}}function y(B){try{x(n.throw(B))}catch(U){o(U)}}function x(B){B.done?s(B.value):i(B.value).then(l,y)}x((n=n.apply(r,e||[])).next())})}function Fh(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function za(r){return this instanceof za?(this.v=r,this):new za(r)}function tS(r,e,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=t.apply(r,e||[]),i,s=[];return i={},o("next"),o("throw"),o("return"),i[Symbol.asyncIterator]=function(){return this},i;function o(de){n[de]&&(i[de]=function(Se){return new Promise(function(Ce,Ie){s.push([de,Se,Ce,Ie])>1||l(de,Se)})})}function l(de,Se){try{y(n[de](Se))}catch(Ce){U(s[0][3],Ce)}}function y(de){de.value instanceof za?Promise.resolve(de.value.v).then(x,B):U(s[0][2],de)}function x(de){l("next",de)}function B(de){l("throw",de)}function U(de,Se){de(Se),s.shift(),s.length&&l(s[0][0],s[0][1])}}function rS(r){var e,t;return e={},n("next"),n("throw",function(i){throw i}),n("return"),e[Symbol.iterator]=function(){return this},e;function n(i,s){e[i]=r[i]?function(o){return(t=!t)?{value:za(r[i](o)),done:!1}:s?s(o):o}:s}}function nS(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=r[Symbol.asyncIterator],t;return e?e.call(r):(r=typeof Fh=="function"?Fh(r):r[Symbol.iterator](),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(s){t[s]=r[s]&&function(o){return new Promise(function(l,y){o=r[s](o),i(l,y,o.done,o.value)})}}function i(s,o,l,y){Promise.resolve(y).then(function(x){s({value:x,done:l})},o)}}const xl=2,Fr=4,tn=4,G1=4,An=new Int32Array(2),$h=new Float32Array(An.buffer),Bh=new Float64Array(An.buffer),Ta=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;var $l;(function(r){r[r.UTF8_BYTES=1]="UTF8_BYTES",r[r.UTF16_STRING=2]="UTF16_STRING"})($l||($l={}));class Ha{constructor(e){this.bytes_=e,this.position_=0,this.text_decoder_=new TextDecoder}static allocate(e){return new Ha(new Uint8Array(e))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(e){this.position_=e}capacity(){return this.bytes_.length}readInt8(e){return this.readUint8(e)<<24>>24}readUint8(e){return this.bytes_[e]}readInt16(e){return this.readUint16(e)<<16>>16}readUint16(e){return this.bytes_[e]|this.bytes_[e+1]<<8}readInt32(e){return this.bytes_[e]|this.bytes_[e+1]<<8|this.bytes_[e+2]<<16|this.bytes_[e+3]<<24}readUint32(e){return this.readInt32(e)>>>0}readInt64(e){return BigInt.asIntN(64,BigInt(this.readUint32(e))+(BigInt(this.readUint32(e+4))<>8}writeUint16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeInt32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeUint32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeInt64(e,t){this.writeInt32(e,Number(BigInt.asIntN(32,t))),this.writeInt32(e+4,Number(BigInt.asIntN(32,t>>BigInt(32))))}writeUint64(e,t){this.writeUint32(e,Number(BigInt.asUintN(32,t))),this.writeUint32(e+4,Number(BigInt.asUintN(32,t>>BigInt(32))))}writeFloat32(e,t){$h[0]=t,this.writeInt32(e,An[0])}writeFloat64(e,t){Bh[0]=t,this.writeInt32(e,An[Ta?0:1]),this.writeInt32(e+4,An[Ta?1:0])}getBufferIdentifier(){if(this.bytes_.lengththis.minalign&&(this.minalign=e);const n=~(this.bb.capacity()-this.space+t)+1&e-1;for(;this.space=0&&this.vtable[t]==0;t--);const n=t+1;for(;t>=0;t--)this.addInt16(this.vtable[t]!=0?e-this.vtable[t]:0);const i=2;this.addInt16(e-this.object_start);const s=(n+i)*xl;this.addInt16(s);let o=0;const l=this.space;e:for(t=0;t=0;o--)this.writeInt8(s.charCodeAt(o))}this.prep(this.minalign,Fr+i),this.addOffset(e),i&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(e,t){this.finish(e,t,!0)}requiredField(e,t){const n=this.bb.capacity()-e,i=n-this.bb.readInt32(n);if(!(t
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
diff --git a/biome.json b/biome.json
deleted file mode 100644
index a32ea705..00000000
--- a/biome.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json",
- "assist": { "actions": { "source": { "organizeImports": "on" } } },
- "formatter": {
- "indentStyle": "space",
- "indentWidth": 2,
- "lineWidth": 80
- },
- "javascript": {
- "formatter": {
- "quoteStyle": "single"
- }
- },
- "linter": {
- "enabled": true,
- "rules": {
- "complexity": {
- "noExcessiveCognitiveComplexity": "off"
- },
- "style": {
- "noDefaultExport": "off"
- },
- "suspicious": {
- "noConsole": "error"
- },
- "recommended": true
- }
- },
- "files": {
- "includes": ["**/src/**", "!**/src/kdbush-class.js"]
- }
-}
diff --git a/codemeta.json b/codemeta.json
deleted file mode 100644
index 22909329..00000000
--- a/codemeta.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "@context": "https://raw.githubusercontent.com/codemeta/codemeta/master/codemeta.jsonld",
- "@type": "Code",
- "author": [
- {
- "@id": "http://orcid.org/0000-0001-8432-4835",
- "@type": "Person",
- "name": "Fritz Lekschas",
- "affiliation": "Independent Researcher, USA"
- }
- ],
- "identifier": "",
- "codeRepository": "https://github.com/flekschas/regl-scatterplot",
- "datePublished": "2023-02-12",
- "dateModified": "2023-02-12",
- "dateCreated": "2023-02-12",
- "description": "A Scalable Interactive JavaScript-based Scatter Plot",
- "keywords": "scatter plot, 2D scatter, interactive data visualization, JavaScript, embedding plot, WebGL",
- "license": "MIT",
- "title": "regl-scatterplot",
- "version": "v1.5.1"
-}
diff --git a/connected-points-by-segments.html b/connected-points-by-segments.html
new file mode 100644
index 00000000..706d962e
--- /dev/null
+++ b/connected-points-by-segments.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
diff --git a/connected-points.html b/connected-points.html
new file mode 100644
index 00000000..484bb52c
--- /dev/null
+++ b/connected-points.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
diff --git a/dynamic-opacity.html b/dynamic-opacity.html
new file mode 100644
index 00000000..9512b6bb
--- /dev/null
+++ b/dynamic-opacity.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
diff --git a/embedded.html b/embedded.html
new file mode 100644
index 00000000..9278fb0d
--- /dev/null
+++ b/embedded.html
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regl Scatterplot
+
+
+
+
+
diff --git a/example/annotations.js b/example/annotations.js
deleted file mode 100644
index 7bdaafb0..00000000
--- a/example/annotations.js
+++ /dev/null
@@ -1,165 +0,0 @@
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-
-let points = { x: [], y: [], z: [], w: [] };
-let numPoints = 100000;
-let pointSize = 2;
-let opacity = 0.33;
-let selection = [];
-
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-
-const gaussianRandom = (mean = 0, stdev = 1) => {
- const u = 1 - Math.random();
- const v = Math.random();
- const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);
- // Transform to the desired mean and standard deviation:
- return z * stdev + mean;
-};
-
-const selectHandler = ({ points: selectedPoints }) => {
- selection = selectedPoints;
- if (selection.length === 1) {
- const x = points.x[selection[0]];
- const y = points.y[selection[0]];
- const category = points.z[selection[0]];
- const value = points.w[selection[0]];
- console.log(
- `Selected: ${selectedPoints}`,
- `X: ${x}\nY: ${y}\nCategory: ${category}\nValue: ${value}`
- );
- }
-};
-
-const deselectHandler = () => {
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- opacity,
- showReticle,
- reticleColor,
- lassoOnLongPress: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (l) => {
- const s = (Math.log10(l) / Math.log10(100000)) ** 2;
- const clusters = [
- {
- length: l * (7 / 16),
- cx: -0.48,
- cy: 0.46,
- stdx: 0.05 * s,
- stdy: 0.1 * s,
- },
- {
- length: l * (5 / 16),
- cx: 0.49,
- cy: 0.5,
- stdx: 0.07 * s,
- stdy: 0.066 * s,
- },
- {
- length: l * (3 / 16),
- cx: 0.48,
- cy: -0.51,
- stdx: 0.12 * s,
- stdy: 0.05 * s,
- },
- {
- length: l * (1 / 16),
- cx: -0.49,
- cy: -0.51,
- stdx: 0.033 * s,
- stdy: 0.033 * s,
- },
- ];
-
- let x = [];
- let y = [];
- let z = [];
- let w = [];
-
- clusters.forEach(({ length, cx, cy, stdx, stdy }, i) => {
- x = x.concat(Array.from({ length }, () => gaussianRandom(cx, stdx)));
- y = y.concat(Array.from({ length }, () => gaussianRandom(cy, stdy)));
- z = z.concat(Array.from({ length }, () => i));
- w = w.concat(Array.from({ length }, () => Math.random()));
- });
-
- return { x, y, z, w };
-};
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-const colorsCat = ['#3a78aa', '#aa3a99'];
-scatterplot.set({ colorBy: 'category', pointColor: colorsCat });
-
-const colorsScale = ['#009E73', '#CC79A7', '#56B4E9', '#F0E442'];
-scatterplot.set({ colorBy: 'z', pointColor: colorsScale });
-
-setNumPoints(numPoints);
-
-scatterplot.drawAnnotations([
- { x: 0, lineColor: [1, 1, 1, 0.1], lineWidth: 1 },
- { y: 0, lineColor: [1, 1, 1, 0.1], lineWidth: 1 },
- { y: 0.5, x1: -0.9, x2: 0.9, lineColor: [1, 1, 1, 1], lineWidth: 1 },
- {
- x1: -1,
- y1: -1,
- x2: 1,
- y2: 1,
- lineColor: [1, 1, 1, 0.25],
- lineWidth: 1,
- },
- {
- x1: -0.5,
- y1: -0.5,
- x2: 0.5,
- y2: 0.5,
- lineColor: [1, 1, 1, 0.25],
- lineWidth: 1,
- },
- {
- x1: -0.25,
- y1: -0.25,
- x2: 0.25,
- y2: 0.25,
- lineColor: [1, 1, 1, 0.25],
- lineWidth: 1,
- },
- {
- vertices: [
- [-0.66, -0.5],
- [-0.5, -0.33],
- [-0.33, -0.45],
- [-0.33, -0.6],
- [-0.5, -0.7],
- [-0.66, -0.5],
- ],
- lineColor: '#D55E00',
- lineWidth: 1,
- },
-]);
diff --git a/example/axes.js b/example/axes.js
deleted file mode 100644
index 5971cdfd..00000000
--- a/example/axes.js
+++ /dev/null
@@ -1,138 +0,0 @@
-import { axisBottom, axisRight } from 'd3-axis';
-import { scaleLinear } from 'd3-scale';
-import { select } from 'd3-selection';
-
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const parentWrapper = document.querySelector('#parent-wrapper');
-const canvasWrapper = document.querySelector('#canvas-wrapper');
-const canvas = document.querySelector('#canvas');
-
-const xDomain = [0, 42];
-const yDomain = [0, 4.2];
-const xScale = scaleLinear().domain(xDomain);
-const yScale = scaleLinear().domain(yDomain);
-const xAxis = axisBottom(xScale);
-const yAxis = axisRight(yScale);
-const axisContainer = select(parentWrapper).append('svg');
-const xAxisContainer = axisContainer.append('g');
-const yAxisContainer = axisContainer.append('g');
-const xAxisPadding = 20;
-const yAxisPadding = 40;
-
-axisContainer.node().style.position = 'absolute';
-axisContainer.node().style.top = 0;
-axisContainer.node().style.left = 0;
-axisContainer.node().style.width = '100%';
-axisContainer.node().style.height = '100%';
-axisContainer.node().style.pointerEvents = 'none';
-
-canvasWrapper.style.right = `${yAxisPadding}px`;
-canvasWrapper.style.bottom = `${xAxisPadding}px`;
-
-let { width, height } = canvasWrapper.getBoundingClientRect();
-
-xAxisContainer.attr('transform', `translate(0, ${height})`).call(xAxis);
-yAxisContainer.attr('transform', `translate(${width}, 0)`).call(yAxis);
-
-// Render grid
-xAxis.tickSizeInner(-height);
-yAxis.tickSizeInner(-width);
-
-let points = [];
-let numPoints = 100000;
-let pointSize = 2;
-let opacity = 0.5;
-let selection = [];
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- pointSize,
- opacity,
- xScale,
- yScale,
- showReticle: true,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-scatterplot.subscribe('view', (event) => {
- xAxisContainer.call(xAxis.scale(event.xScale));
- yAxisContainer.call(yAxis.scale(event.yScale));
-});
-
-scatterplot.subscribe(
- 'init',
- () => {
- xAxisContainer.call(xAxis.scale(scatterplot.get('xScale')));
- yAxisContainer.call(yAxis.scale(scatterplot.get('yScale')));
- },
- 1
-);
-
-const resizeHandler = () => {
- ({ width, height } = canvasWrapper.getBoundingClientRect());
-
- xAxisContainer.attr('transform', `translate(0, ${height})`).call(xAxis);
- yAxisContainer.attr('transform', `translate(${width}, 0)`).call(yAxis);
-
- // Render grid
- xAxis.tickSizeInner(-height);
- yAxis.tickSizeInner(-width);
-};
-
-window.addEventListener('resize', resizeHandler);
-window.addEventListener('orientationchange', resizeHandler);
-
-const generatePoints = (num) =>
- new Array(num).fill().map(() => [
- -1 + Math.random() * 2, // x
- -1 + Math.random() * 2, // y
- Math.round(Math.random() * 9), // category
- Math.random(), // value
- ]);
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-scatterplot.set({
- colorBy: 'category',
- pointColor: [
- '#d192b7',
- '#6fb2e4',
- '#eecb62',
- '#56bf92',
- '#dca237',
- '#3a84cc',
- '#c76526',
- ],
-});
-
-setNumPoints(numPoints);
diff --git a/example/connected-points-by-segments.js b/example/connected-points-by-segments.js
deleted file mode 100644
index 5124b011..00000000
--- a/example/connected-points-by-segments.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-
-let points = [];
-let numPoints = 9000;
-let pointSize = 1;
-let opacity = 0.33;
-let selection = [];
-
-const pointSizeMax = 10;
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-const showPointConnections = true;
-const pointConnectionColor = [1, 1, 1, 0.15];
-const pointConnectionSize = 2;
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- opacity,
- showReticle,
- reticleColor,
- showPointConnections,
- pointConnectionColor,
- pointConnectionSize,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (num) => {
- const numPointsPerGroup = Math.round(num / 3); // 9.000 / 3 => 3000
- const numPointsPerStep = Math.round(numPointsPerGroup / 5); // 3000 / 5 => 600
- // 600 * 3 => 1800 (lines)
-
- const outPoints = [];
-
- for (let g = 0; g < 3; g++) {
- for (let i = 0; i < numPointsPerStep; i++) {
- for (let s = 0; s < 5; s++) {
- outPoints.push([
- -0.6 + g * 0.6 + (Math.random() * 0.3 - 0.15), // x
- -0.9 + s * 0.45, // y
- g, // category
- Math.random(), // value
- g * numPointsPerStep + i, // to identify connected points
- ]);
- }
- }
- }
-
- return outPoints;
-};
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-const getPointSizeRange = (basePointSize) =>
- Array.from(
- { length: 100 },
- (_, i) => 1 + (i / 99) * (basePointSize * pointSizeMax - 1)
- );
-
-const setPointSize = (newPointSize) => {
- scatterplot.set({ pointSize: getPointSizeRange(newPointSize) });
-};
-
-createMenu({ scatterplot, setNumPoints, setPointSize });
-
-scatterplot.set({
- colorBy: 'valueZ',
- sizeBy: 'valueW',
- pointColor: [
- [255, 128, 203, 128],
- [87, 199, 255, 128],
- [238, 228, 98, 128],
- ],
- pointConnectionColorBy: 'segment',
- pointConnectionColor: Array(200)
- .fill()
- .map((v, i) => [i + 55, i + 55, i + 55, 10]),
- pointConnectionSizeBy: 'segment',
- pointConnectionSize: Array(20)
- .fill()
- .map((v, i) => 1 + i / 4),
- pointConnectionOpacityBy: 'segment',
- pointConnectionOpacity: Array(64)
- .fill()
- .map((v, i) => (i + 8) / 256),
-});
-
-setPointSize(pointSize)
-setNumPoints(numPoints);
diff --git a/example/connected-points.js b/example/connected-points.js
deleted file mode 100644
index 2b12a3b7..00000000
--- a/example/connected-points.js
+++ /dev/null
@@ -1,136 +0,0 @@
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-
-let points = [];
-let numPoints = 9000;
-let pointSize = 1;
-let opacity = 0.33;
-let selection = [];
-
-const pointSizeMax = 10;
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-const showPointConnections = true;
-const pointConnectionColor = [1, 1, 1, 0.15];
-const pointConnectionSize = 2;
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- opacity,
- showReticle,
- reticleColor,
- showPointConnections,
- pointConnectionColor,
- pointConnectionSize,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (num) => {
- const numPointsPerGroup = Math.round(num / 3); // 9.000 / 3 => 3000
- const numPointsPerStep = Math.round(numPointsPerGroup / 5); // 3000 / 5 => 600
- // 600 * 3 => 1800 (lines)
-
- const outPoints = [];
-
- for (let g = 0; g < 3; g++) {
- for (let i = 0; i < numPointsPerStep; i++) {
- for (let s = 0; s < 5; s++) {
- outPoints.push([
- -0.6 + g * 0.6 + (Math.random() * 0.3 - 0.15), // x
- -0.9 + s * 0.45, // y
- g, // category
- Math.random(), // value
- g * numPointsPerStep + i, // to identify connected points
- // (s + 2) % 5, // specifies the order of the connected points
- ]);
- }
- }
- }
-
- return outPoints;
-};
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-const getPointSizeRange = (basePointSize) =>
- Array.from(
- { length: 100 },
- (_, i) => 1 + (i / 99) * (basePointSize * pointSizeMax - 1)
- );
-
-const setPointSize = (newPointSize) => {
- scatterplot.set({ pointSize: getPointSizeRange(newPointSize) });
-};
-
-createMenu({ scatterplot, setNumPoints, setPointSize });
-
-scatterplot.set({
- colorBy: 'valueZ',
- sizeBy: 'valueW',
- pointColor: [
- [255, 128, 203, 128],
- [87, 199, 255, 128],
- [238, 228, 98, 128],
- ],
- pointConnectionColorBy: 'valueZ',
- pointConnectionColor: [
- [255, 128, 203, 6],
- [87, 199, 255, 6],
- [238, 228, 98, 6],
- ],
- pointConnectionColorActive: [
- [255, 128, 203, 128],
- [87, 199, 255, 128],
- [238, 228, 98, 128],
- ],
- pointConnectionColorHover: [
- [255, 128, 203, 99],
- [87, 199, 255, 99],
- [238, 228, 98, 99],
- ],
- pointConnectionOpacityBy: 'valueW',
- pointConnectionOpacity: Array(10)
- .fill()
- .map((v, i) => (i + 1) / 100),
- pointConnectionSizeBy: 'valueW',
- pointConnectionSize: Array(18)
- .fill()
- .map((v, i) => (i + 1) / 2),
-});
-
-setPointSize(pointSize);
-setNumPoints(numPoints);
diff --git a/example/dynamic-opacity.js b/example/dynamic-opacity.js
deleted file mode 100644
index 2e5a212a..00000000
--- a/example/dynamic-opacity.js
+++ /dev/null
@@ -1,122 +0,0 @@
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-
-let points = [];
-let numPoints = 1000000;
-let pointSize = 2;
-let opacityByDensityFill = 0.15;
-let selection = [];
-
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- pointColor: '#fff',
- opacityBy: 'density',
- showReticle,
- reticleColor,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (num) => {
- const newPoints = [];
-
- let xn = 2.644838333129883;
- let yn = 4.060488700866699;
- let zn = 2.8982460498809814;
- let xn1;
- let yn1;
- let zn1;
- const a = 0.2;
- const b = 0.2;
- const c = 5.7;
- const dt = 0.006;
-
- let minX = Infinity;
- let maxX = -Infinity;
- let minY = Infinity;
- let maxY = -Infinity;
- for (let i = 0; i <= num; i++) {
- let dx = -yn - zn;
- let dy = xn + a * yn;
- let dz = b + zn * (xn - c);
-
- const xh = xn + 0.5 * dt * dx;
- const yh = yn + 0.5 * dt * dy;
- const zh = zn + 0.5 * dt * dz;
-
- dx = -yh - zh;
- dy = xh + a * yh;
- dz = b + zh * (xh - c);
-
- xn1 = xn + dt * dx;
- yn1 = yn + dt * dy;
- zn1 = zn + dt * dz;
-
- newPoints.push([xn1, yn1, 0, 0]);
-
- minX = xn1 < minX ? xn1 : minX;
- maxX = xn1 > maxX ? xn1 : maxX;
- minY = yn1 < minY ? yn1 : minY;
- maxY = yn1 > maxY ? yn1 : maxY;
-
- xn = xn1;
- yn = yn1;
- zn = zn1;
- }
-
- const dX = maxX - minX;
- const dY = maxY - minY;
-
- for (let i = 0; i <= num; i++) {
- newPoints[i][0] -= minX;
- newPoints[i][0] /= dX / 2;
- newPoints[i][0] -= 1;
- newPoints[i][1] -= minY;
- newPoints[i][1] /= dY / 2;
- newPoints[i][1] -= 1;
- }
-
- return newPoints;
-};
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-setNumPoints(numPoints);
diff --git a/example/embedded.js b/example/embedded.js
deleted file mode 100644
index 16864eeb..00000000
--- a/example/embedded.js
+++ /dev/null
@@ -1,136 +0,0 @@
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { saveAsPng, checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-const numPointsEl = document.querySelector('#num-points');
-const numPointsValEl = document.querySelector('#num-points-value');
-const pointSizeEl = document.querySelector('#point-size');
-const pointSizeValEl = document.querySelector('#point-size-value');
-const opacityEl = document.querySelector('#opacity');
-const opacityValEl = document.querySelector('#opacity-value');
-const clickLassoInitiatorEl = document.querySelector('#click-lasso-initiator');
-const resetEl = document.querySelector('#reset');
-const exportEl = document.querySelector('#export');
-const exampleEl = document.querySelector('#example-basic');
-
-const canvasWrapper = canvas.parentNode;
-canvasWrapper.style.padding = '15rem 0';
-canvasWrapper.style.height = '100vh';
-canvasWrapper.parentNode.style.overflow = 'auto';
-
-exampleEl.setAttribute('class', 'active');
-exampleEl.removeAttribute('href');
-
-let points = [];
-let numPoints = 100000;
-let pointSize = 4;
-let opacity = 0.33;
-let selection = [];
-
-const reticleColor = [1, 1, 0.878431373, 0.33];
-
-const selectHandler = ({ points: selectedPoints }) => {
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `Selected: ${selectedPoints}`,
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- pointSize,
- showReticle: true,
- reticleColor,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-exportEl.addEventListener('click', () => saveAsPng(scatterplot));
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (num) =>
- new Array(num).fill().map(() => [
- -0.8 + Math.random() * 1.6, // x
- -0.8 + Math.random() * 1.6, // y
- Math.round(Math.random()), // category
- Math.random(), // value
- ]);
-
-const setNumPoints = (newNumPoints) => {
- numPoints = newNumPoints;
- numPointsEl.value = numPoints;
- numPointsValEl.innerHTML = numPoints;
- points = generatePoints(numPoints);
- scatterplot.draw(points);
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-const numPointsInputHandler = (event) => {
- numPointsValEl.innerHTML = `${+event.target
- .value} release to redraw `;
-};
-
-numPointsEl.addEventListener('input', numPointsInputHandler);
-
-const numPointsChangeHandler = (event) => setNumPoints(+event.target.value);
-
-numPointsEl.addEventListener('change', numPointsChangeHandler);
-
-const setPointSize = (newPointSize) => {
- pointSize = newPointSize;
- pointSizeEl.value = pointSize;
- pointSizeValEl.innerHTML = pointSize;
- scatterplot.set({ pointSize });
-};
-
-const pointSizeInputHandler = (event) => setPointSize(+event.target.value);
-
-pointSizeEl.addEventListener('input', pointSizeInputHandler);
-
-const setOpacity = (newOpacity) => {
- opacity = newOpacity;
- opacityEl.value = opacity;
- opacityValEl.innerHTML = opacity;
- scatterplot.set({ opacity });
-};
-
-const opacityInputHandler = (event) => setOpacity(+event.target.value);
-
-opacityEl.addEventListener('input', opacityInputHandler);
-
-const clickLassoInitiatorChangeHandler = (event) => {
- scatterplot.set({
- lassoInitiator: event.target.checked,
- });
-};
-
-clickLassoInitiatorEl.addEventListener(
- 'change',
- clickLassoInitiatorChangeHandler
-);
-clickLassoInitiatorEl.checked = scatterplot.get('lassoInitiator');
-
-const resetClickHandler = () => {
- scatterplot.reset();
-};
-
-resetEl.addEventListener('click', resetClickHandler);
-
-setPointSize(pointSize);
-setOpacity(opacity);
-setNumPoints(numPoints);
diff --git a/example/index.js b/example/index.js
deleted file mode 100644
index c012fa4f..00000000
--- a/example/index.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-
-let points = { x: [], y: [], z: [], w: [] };
-let numPoints = 100000;
-let pointSize = 2;
-let opacity = 0.33;
-let selection = [];
-
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-
-const pointoverHandler = (pointId) => {
- const x = points.x[pointId];
- const y = points.y[pointId];
- const category = points.z[pointId];
- const value = points.w[pointId];
- console.log(
- `Out point: ${pointId}`,
- `X: ${x}\nY: ${y}\nCategory: ${category}\nValue: ${value}`
- );
-};
-
-const pointoutHandler = (pointId) => {
- const x = points.x[pointId];
- const y = points.y[pointId];
- const category = points.z[pointId];
- const value = points.w[pointId];
- console.log(
- `Out point: ${pointId}`,
- `X: ${x}\nY: ${y}\nCategory: ${category}\nValue: ${value}`
- );
-};
-
-const selectHandler = ({ points: selectedPoints }) => {
- selection = selectedPoints;
- if (selection.length === 1) {
- const x = points.x[selection[0]];
- const y = points.y[selection[0]];
- const category = points.z[selection[0]];
- const value = points.w[selection[0]];
- console.log(
- `Selected: ${selectedPoints}`,
- `X: ${x}\nY: ${y}\nCategory: ${category}\nValue: ${value}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- showReticle,
- reticleColor,
- opacity,
- lassoOnLongPress: true,
- lassoType: 'brush'
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('pointover', pointoverHandler);
-scatterplot.subscribe('pointout', pointoutHandler);
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (length) => ({
- x: Array.from({ length }, () => -1 + Math.random() * 2),
- y: Array.from({ length }, () => -1 + Math.random() * 2),
- z: Array.from({ length }, () => Math.round(Math.random())), // category
- w: Array.from({ length }, () => Math.random()), // value
-});
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(numPoints);
- scatterplot.draw(points);
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-const colorsCat = ['#3a78aa', '#aa3a99'];
-scatterplot.set({ colorBy: 'category', pointColor: colorsCat });
-
-const colorsScale = [
- '#002072', // dark blue
- '#162b79',
- '#233680',
- '#2e4186',
- '#394d8d',
- '#425894',
- '#4b649a',
- '#5570a1',
- '#5e7ca7',
- '#6789ae',
- '#7195b4',
- '#7ba2ba',
- '#85aec0',
- '#90bbc6',
- '#9cc7cc',
- '#a9d4d2',
- '#b8e0d7',
- '#c8ecdc',
- '#ddf7df',
- '#ffffe0', // bright yellow
-];
-scatterplot.set({ colorBy: 'value', pointColor: colorsScale });
-
-setNumPoints(numPoints);
diff --git a/example/menu.js b/example/menu.js
deleted file mode 100644
index 8224f4f4..00000000
--- a/example/menu.js
+++ /dev/null
@@ -1,313 +0,0 @@
-import { Pane } from 'tweakpane';
-
-import { LinkPlugin } from './tweakpane-link-plugin';
-import { saveAsPng } from './utils';
-
-const DEFAULT_PARAMS = {
- numPoints: 100000,
- pointSize: 2,
- opacity: 0.33,
- opacityByDensity: false,
- lassoInit: 'longPress',
- lassoType: 'freeform',
- lassoBrushSize: 24,
-};
-
-const set = (scatterplot, keyValuePairs) => {
- if (Array.isArray(scatterplot)) {
- for (const s of scatterplot) {
- s.set(keyValuePairs);
- }
- } else {
- scatterplot.set(keyValuePairs);
- }
-}
-
-export function createMenu({
- scatterplot,
- setNumPoints,
- setPointSize,
- setOpacity,
- opacityChangesDisabled,
-}) {
- let init = false;
-
- const refScatterplot = Array.isArray(scatterplot)
- ? scatterplot[0]
- : scatterplot;
-
- const params = {
- ...DEFAULT_PARAMS,
- numPoints: 0,
- pointSize: Array.isArray(refScatterplot.get('pointSize'))
- ? refScatterplot.get('pointSize')[0]
- : refScatterplot.get('pointSize'),
- opacity: refScatterplot.get('opacity'),
- opacityByDensity: refScatterplot.get('opacityBy') === 'density',
- lassoType: refScatterplot.get('lassoType'),
- lassoBrushSize: refScatterplot.get('lassoBrushSize'),
- };
- const initialParams = { ...params };
-
- const pane = new Pane({
- title: 'Details',
- container: document.getElementById('controls'),
- });
- pane.registerPlugin({ id: 'link', plugins: [LinkPlugin] });
-
- const settings = pane.addFolder({ title: 'Settings' });
-
- const numPoints = settings.addBinding(
- params,
- 'numPoints',
- { label: 'Num Points', min: 1000, step: 1000, max: 2000000 }
- );
- numPoints.disabled = true;
- if (setNumPoints) {
- numPoints.on('change', ({ last, value }) => {
- if (init && last) setNumPoints(value);
- });
- }
-
- const pointSize = settings.addBinding(
- params, 'pointSize', { label: 'Point Size', min: 1, max: 32, step: 1 }
- );
- pointSize.disabled = Array.isArray(refScatterplot.get('pointSize'));
- pointSize.on('change', ({ value }) => {
- if (setPointSize) {
- setPointSize(value);
- } else {
- set(scatterplot, { pointSize: value });
- }
- });
-
- const opacity = settings.addBinding(
- params,
- 'opacity',
- { label: 'Opacity', min: 0.01, max: 1, step: 0.01 }
- );
- opacity.disabled = params.opacityByDensity || Boolean(opacityChangesDisabled);
- opacity.on('change', ({ value }) => {
- if (setOpacity) {
- setOpacity(value);
- } else {
- set(scatterplot, { opacity: value });
- }
- });
-
- const opacityByDensity = settings.addBinding(
- params,
- 'opacityByDensity',
- { label: 'Dynamic Opacity' }
- );
- opacityByDensity.disabled = Boolean(opacityChangesDisabled);
- opacityByDensity.on('change', ({ value }) => {
- set(scatterplot, { opacityBy: value ? 'density' : null });
- opacity.disabled = value;
- });
-
- const lassoInit = settings.addBinding(
- params,
- 'lassoInit',
- {
- label: 'Lasso Init',
- options: {
- 'On Long Press': 'longPress',
- 'Via Click Initiator': 'clickInitiator'
- }
- }
- );
- lassoInit.on('change', ({ value }) => {
- switch (value) {
- case 'longPress': {
- set(scatterplot, {
- lassoInitiator: false,
- lassoOnLongPress: true,
- });
- break;
- }
- case 'clickInitiator': {
- set(scatterplot, {
- lassoInitiator: true,
- lassoOnLongPress: false,
- });
- break;
- }
- }
- });
-
- const lassoType = settings.addBinding(
- params,
- 'lassoType',
- {
- label: 'Lasso Type',
- options: {
- 'Freeform': 'freeform',
- 'Brush': 'brush',
- 'Rectangle': 'rectangle',
- }
- }
- );
- lassoType.on('change', ({ value }) => {
- switch (value) {
- case 'freeform': {
- set(scatterplot, { lassoType: 'freeform' });
- break;
- }
- case 'brush': {
- set(scatterplot, { lassoType: 'brush' });
- break;
- }
- case 'rectangle': {
- set(scatterplot, { lassoType: 'rectangle' });
- break;
- }
- }
- lassoBrushSize.hidden = value !== 'brush';
- });
-
- const lassoBrushSize = settings.addBinding(
- params,
- 'lassoBrushSize',
- { label: 'Brush Size', min: 1, max: 256, step: 1 }
- );
- lassoBrushSize.hidden = params.lassoType !== 'brush';
- lassoBrushSize.on('change', ({ value }) => {
- set(scatterplot, { lassoBrushSize: value });
- });
-
- const reset = settings.addButton({ title: 'Reset' });
- reset.on('click', () => {
- for (const [key, value] of Object.entries(initialParams)) {
- params[key] = value;
- }
- pane.refresh();
- })
-
- const examples = pane.addFolder({ title: 'Examples' });
-
- const pathname = window.location.pathname.slice(1);
-
- examples.addBlade({
- view: 'link',
- label: 'Color Encoding',
- link: 'index.html',
- active: pathname === '' || pathname === 'index.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Size & Opacity Encoding',
- link: 'size-encoding.html',
- active: pathname === 'size-encoding.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Dynamic Opacity',
- link: 'dynamic-opacity.html',
- active: pathname === 'dynamic-opacity.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Axes',
- link: 'axes.html',
- active: pathname === 'axes.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Text Labels',
- link: 'text-labels.html',
- active: pathname === 'text-labels.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Annotations',
- link: 'annotations.html',
- active: pathname === 'annotations.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Programmatic Lasso',
- link: 'programmatic-lasso.html',
- active: pathname === 'programmatic-lasso.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Multiple Instances',
- link: 'multiple-instances.html',
- active: pathname === 'multiple-instances.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Transition',
- link: 'transition.html',
- active: pathname === 'transition.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Point Connections',
- link: 'connected-points.html',
- active: pathname === 'connected-points.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Point Connections by Line Segments',
- link: 'connected-points-by-segments.html',
- active: pathname === 'connected-points-by-segments.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Background Image',
- link: 'texture-background.html',
- active: pathname === 'texture-background.html',
- });
-
- examples.addBlade({
- view: 'link',
- label: 'Performance Mode (20M Points)',
- link: 'performance-mode.html',
- active: pathname === 'performance-mode.html',
- });
-
- const info = pane.addFolder({ title: 'Info', expanded: false });
-
- info.addBlade({
- view: 'text',
- label: 'version',
- parse: (v) => String(v),
- value: refScatterplot.get('version'),
- disabled: true,
- });
-
- const download = pane.addButton({ title: 'Download as PNG' });
- download.on('click', () => {
- saveAsPng(scatterplot);
- });
-
- const sourceCode = pane.addButton({ title: 'Source Code' });
- sourceCode.on('click', () => {
- window.open(
- 'https://github.com/flekschas/regl-scatterplot', '_blank'
- ).focus();
- });
-
- refScatterplot.subscribe('draw', () => {
- params.numPoints = refScatterplot.get('points').length;
- initialParams.numPoints = params.numPoints;
- if (setNumPoints) numPoints.disabled = false;
- pane.refresh();
- init = true;
- }, 1);
-}
-
-export default createMenu;
diff --git a/example/multiple-instances.js b/example/multiple-instances.js
deleted file mode 100644
index 0faeae47..00000000
--- a/example/multiple-instances.js
+++ /dev/null
@@ -1,245 +0,0 @@
-/* eslint no-console: 0 */
-import { tableFromIPC } from 'apache-arrow';
-import createScatterplot, { createRenderer } from '../src';
-import createMenu from './menu';
-import { showModal, closeModal } from './utils';
-
-/**
- * General configuration
- */
-const NUM_COLUMNS = 2;
-const NUM_ROWS = 2;
-const POINT_SIZE = 3;
-const OPACITY = 0.66;
-const FASHION_MNIST_CLASS_LABELS = [
- 'T-shirt/top',
- 'Trouser',
- 'Pullover',
- 'Dress',
- 'Coat',
- 'Sandal',
- 'Shirt',
- 'Sneaker',
- 'Bag',
- 'Ankle boot',
-];
-const CLASS_COLORS = [
- '#FFFF00',
- '#1CE6FF',
- '#FF34FF',
- '#FF4A46',
- '#008941',
- '#006FA6',
- '#A30059',
- '#FFDBE5',
- '#7A4900',
- '#0000A6',
-];
-
-/**
- * Load Embedding Example
- */
-const whenData = fetch(
- 'https://storage.googleapis.com/flekschas/regl-scatterplot/fashion-mnist-embeddings.arrow'
-);
-
-/**
- * Modal
- */
-showModal('Loading...');
-
-/**
- * Add info to footer
- */
-const footer = document.querySelector('#footer');
-footer.classList.remove('hidden');
-const infoContent = document.querySelector('#info-content');
-infoContent.innerHTML = `
-Fashion MNIST embedding using four different techniques: PCA, t-SNE, UMAP, and a convolutional autoencoder.
- Select a point so see the corresponding image.
-`;
-
-/**
- * Note
- */
-const parentWrapper = document.querySelector('#parent-wrapper');
-const noteEl = document.createElement('div');
-noteEl.id = 'note';
-noteEl.style.opacity = 0;
-parentWrapper.appendChild(noteEl);
-
-const showNote = (text, color) => {
- noteEl.style.opacity = 1;
- noteEl.style.background = color;
- noteEl.textContent = text;
-};
-
-const hideNote = () => {
- noteEl.style.opacity = 0;
-};
-
-/**
- * Image
- */
-const centerNoteEl = document.createElement('div');
-centerNoteEl.id = 'center-note';
-centerNoteEl.style.opacity = 0;
-const imgEl = document.createElement('div');
-imgEl.style.width = '56px';
-imgEl.style.height = '56px';
-imgEl.style.backgroundColor = 'black';
-imgEl.style.backgroundSize = 'cover';
-imgEl.style.backgroundRepeat = 'no-repeat';
-centerNoteEl.appendChild(imgEl);
-parentWrapper.appendChild(centerNoteEl);
-
-const zeroPad = (num, places) => String(num).padStart(places, '0');
-
-const showImg = (pointId, classId) => {
- const img = new Image();
- const imgId = zeroPad(pointId, 5);
- const src = `https://storage.googleapis.com/flekschas/regl-scatterplot/fashion-mnist-images/${imgId}.png`;
- img.onload = () => {
- centerNoteEl.style.opacity = 1;
- centerNoteEl.style.transform = 'translate(-50%, -50%) scale(1)';
- imgEl.style.backgroundImage = `url("${src}")`;
- centerNoteEl.style.background = CLASS_COLORS[classId];
- };
- img.src = src;
-};
-
-const hideImg = () => {
- centerNoteEl.style.opacity = 0;
- centerNoteEl.style.transform = 'translate(-50%, -50%) scale(0)';
-};
-
-/**
- * Set up the HTML template
- */
-parentWrapper.style.display = 'grid';
-parentWrapper.style.gridTemplateColumns = `repeat(${NUM_COLUMNS}, minmax(0, 1fr))`;
-parentWrapper.style.gridTemplateRows = `repeat(2, minmax(0, 1fr))`;
-parentWrapper.style.gap = '1rem';
-
-const baseCanvas = document.querySelector('#canvas');
-const baseCanvasWrapper = document.querySelector('#canvas-wrapper');
-baseCanvasWrapper.style.position = 'relative';
-
-const canvases = [baseCanvas];
-
-for (let i = 0; i < NUM_COLUMNS * NUM_ROWS - 1; i++) {
- const newCanvas = baseCanvas.cloneNode();
- const newCanvasWrapper = baseCanvasWrapper.cloneNode();
- newCanvasWrapper.appendChild(newCanvas);
- parentWrapper.appendChild(newCanvasWrapper);
- canvases.push(newCanvas);
-}
-
-/**
- * Create a reusable renderer
- */
-const renderer = createRenderer();
-
-if (!renderer.isSupported) {
- showModal(
- 'Unfortunately, your browser does not support all WebGL extensions required by regl-scatterplot',
- true
- );
-}
-
-/**
- * Create a scatter plot instances
- */
-
-const scatterplots = canvases.map((canvas) =>
- createScatterplot({
- renderer,
- canvas,
- pointSize: POINT_SIZE,
- opacity: OPACITY,
- lassoOnLongPress: true,
- })
-);
-
-console.log(`Scatterplot v${scatterplots[0].get('version')}`);
-
-createMenu({ scatterplot: scatterplots });
-
-/**
- * Link scatter plots
- */
-const syncSelection = (source, selectedPoints, classIds) => {
- scatterplots
- .filter((sp) => sp !== source)
- .forEach((sp) => {
- sp.select(selectedPoints, { preventEvent: true });
- });
-
- scatterplots.forEach((sp) => {
- sp.zoomToPoints(selectedPoints, {
- padding: 0.2,
- transition: true,
- transitionDuration: 1500,
- });
- });
-
- const pointId =
- selectedPoints[Math.floor(Math.random() * (selectedPoints.length - 1))];
- showImg(pointId, classIds[pointId]);
-};
-
-const syncDeselection = (source) => {
- scatterplots
- .filter((sp) => sp !== source)
- .forEach((sp) => {
- sp.deselect({ preventEvent: true });
- });
-
- scatterplots.forEach((sp) => {
- sp.zoomToOrigin({
- transition: true,
- transitionDuration: 1500,
- });
- });
-
- hideImg();
-};
-
-/**
- * Finally, draw points 🎉
- */
-
-whenData
- .then((data) => tableFromIPC(data))
- .then((table) => {
- closeModal();
- const columnValues = table.data[0].children.map((data) => data.values);
- const classIds = columnValues[columnValues.length - 1];
-
- scatterplots.forEach((sp, i) => {
- sp.draw({
- x: columnValues[i * 2],
- y: columnValues[i * 2 + 1],
- z: classIds,
- });
- sp.set({
- colorBy: 'z',
- pointColor: CLASS_COLORS,
- });
- sp.subscribe('pointover', (pointId) => {
- showNote(
- FASHION_MNIST_CLASS_LABELS[classIds[pointId]],
- CLASS_COLORS[classIds[pointId]]
- );
- });
- sp.subscribe('pointout', hideNote);
- sp.subscribe('select', ({ points }) =>
- syncSelection(sp, points, classIds)
- );
- sp.subscribe('deselect', () => syncDeselection(sp));
- });
- })
- .catch((error) => {
- showModal('Could not load embedding... Damn...', true);
- console.error(error);
- });
diff --git a/example/performance-mode-point-worker.js b/example/performance-mode-point-worker.js
deleted file mode 100644
index 25d495dc..00000000
--- a/example/performance-mode-point-worker.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* eslint-env worker */
-/* eslint no-restricted-globals: 1 */
-
-const worker = function worker() {
- self.onmessage = function onmessage(event) {
- const num = event.data;
- const bins = 10;
-
- try {
- let points = [];
-
- const range = 2 / bins;
- const numPerBin = num / bins ** 2;
-
- for (let i = 0; i < bins; i++) {
- for (let j = 0; j < bins; j++) {
- const xStart = -1 + j * range;
- const yStart = -1 + i * range;
- const tmp = [];
- for (let k = 0; k < numPerBin; k++) {
- tmp.push([
- xStart + Math.random() * range, // x
- yStart + Math.random() * range, // y
- Math.round(Math.random()), // category
- Math.random(), // value
- ]);
- }
- points = points.concat(
- tmp.sort((a, b) => a[0] - b[0] || a[1] - b[1])
- );
- }
- }
-
- self.postMessage({ points });
- } catch (error) {
- self.postMessage({ error });
- }
- };
-};
-
-export default worker;
diff --git a/example/performance-mode.js b/example/performance-mode.js
deleted file mode 100644
index 44da2269..00000000
--- a/example/performance-mode.js
+++ /dev/null
@@ -1,186 +0,0 @@
-import { createWorker } from '@flekschas/utils';
-import { saveAsPng, checkSupport } from './utils';
-
-import createScatterplot from '../src';
-import createMenu from './menu';
-import pointWorkerFn from './performance-mode-point-worker';
-
-const modal = document.querySelector('#modal');
-const modalText = document.querySelector('#modal span');
-const canvas = document.querySelector('#canvas');
-const numPointsEl = document.querySelector('#num-points');
-const numPointsValEl = document.querySelector('#num-points-value');
-const pointSizeEl = document.querySelector('#point-size');
-const pointSizeValEl = document.querySelector('#point-size-value');
-const opacityEl = document.querySelector('#opacity');
-const opacityValEl = document.querySelector('#opacity-value');
-const clickLassoInitiatorEl = document.querySelector('#click-lasso-initiator');
-const resetEl = document.querySelector('#reset');
-const exportEl = document.querySelector('#export');
-const exampleEl = document.querySelector('#example-performance-mode');
-
-exampleEl.setAttribute('class', 'active');
-exampleEl.removeAttribute('href');
-
-let points = [];
-let numPoints = 20000000;
-let pointSize = 0.25;
-let opacity = 0.33;
-let selection = [];
-
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-
-const pointWorker = createWorker(pointWorkerFn);
-
-const generatePoints = (num) =>
- new Promise((resolve, reject) => {
- pointWorker.onmessage = (e) => {
- if (e.data.error) reject(e.data.error);
- else resolve(e.data.points);
- };
- pointWorker.postMessage(num);
- });
-
-const showModal = (text) => {
- modal.style.display = 'flex';
- modalText.textContent = text;
-};
-
-const closeModal = () => {
- modal.style.display = 'none';
- modalText.textContent = '';
-};
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- showReticle: true,
- performanceMode: true,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-exportEl.addEventListener('click', () => saveAsPng(scatterplot));
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const setNumPoints = (newNumPoints) => {
- showModal(
- `Hang tight. Generating ${(numPoints / 1000000).toFixed(
- 1
- )} million points...`
- );
- numPoints = newNumPoints;
- numPointsEl.value = numPoints;
- numPointsValEl.innerHTML = numPoints;
-
- generatePoints(numPoints).then((newPoints) => {
- points = newPoints;
- scatterplot.draw(points);
- closeModal();
- });
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-const numPointsInputHandler = (event) => {
- numPointsValEl.innerHTML = `${+event.target
- .value} release to redraw `;
-};
-
-numPointsEl.addEventListener('input', numPointsInputHandler);
-
-const numPointsChangeHandler = (event) => setNumPoints(+event.target.value);
-
-numPointsEl.addEventListener('change', numPointsChangeHandler);
-
-const setPointSize = (newPointSize) => {
- pointSize = newPointSize;
- pointSizeEl.value = pointSize;
- pointSizeValEl.innerHTML = pointSize;
- scatterplot.set({ pointSize });
-};
-
-const pointSizeInputHandler = (event) => setPointSize(+event.target.value);
-
-pointSizeEl.addEventListener('input', pointSizeInputHandler);
-
-const setOpacity = (newOpacity) => {
- opacity = newOpacity;
- opacityEl.value = opacity;
- opacityValEl.innerHTML = opacity;
- scatterplot.set({ opacity });
-};
-
-const opacityInputHandler = (event) => setOpacity(+event.target.value);
-
-opacityEl.addEventListener('input', opacityInputHandler);
-
-const clickLassoInitiatorChangeHandler = (event) => {
- scatterplot.set({
- lassoInitiator: event.target.checked,
- });
-};
-
-clickLassoInitiatorEl.addEventListener(
- 'change',
- clickLassoInitiatorChangeHandler
-);
-clickLassoInitiatorEl.checked = scatterplot.get('lassoInitiator');
-
-const resetClickHandler = () => {
- scatterplot.reset();
-};
-
-resetEl.addEventListener('click', resetClickHandler);
-
-const colorsScale = [
- '#002072', // dark blue
- '#162b79',
- '#233680',
- '#2e4186',
- '#394d8d',
- '#425894',
- '#4b649a',
- '#5570a1',
- '#5e7ca7',
- '#6789ae',
- '#7195b4',
- '#7ba2ba',
- '#85aec0',
- '#90bbc6',
- '#9cc7cc',
- '#a9d4d2',
- '#b8e0d7',
- '#c8ecdc',
- '#ddf7df',
- '#ffffe0', // bright yellow
-];
-scatterplot.set({ colorBy: 'value', pointColor: colorsScale });
-
-setPointSize(pointSize);
-setOpacity(opacity);
-setNumPoints(numPoints);
diff --git a/example/programmatic-lasso.js b/example/programmatic-lasso.js
deleted file mode 100644
index a4a24e82..00000000
--- a/example/programmatic-lasso.js
+++ /dev/null
@@ -1,293 +0,0 @@
-import { axisBottom, axisRight } from 'd3-axis';
-import { scaleLinear } from 'd3-scale';
-import { select } from 'd3-selection';
-
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const parentWrapper = document.querySelector('#parent-wrapper');
-const canvasWrapper = document.querySelector('#canvas-wrapper');
-const canvas = document.querySelector('#canvas');
-
-// Create button container with grid layout
-const buttonContainer = document.createElement('div');
-buttonContainer.style.cssText = `
- position: absolute;
- top: 10px;
- left: 10px;
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 6px;
- max-width: 400px;
- max-height: calc(100vh - 20px);
- overflow-y: auto;
- z-index: 1000;
-`;
-parentWrapper.appendChild(buttonContainer);
-
-const xDomain = [0, 100];
-const yDomain = [0, 100];
-const xScale = scaleLinear().domain(xDomain);
-const yScale = scaleLinear().domain(yDomain);
-const xAxis = axisBottom(xScale);
-const yAxis = axisRight(yScale);
-const axisContainer = select(parentWrapper).append('svg');
-const xAxisContainer = axisContainer.append('g');
-const yAxisContainer = axisContainer.append('g');
-const xAxisPadding = 20;
-const yAxisPadding = 40;
-
-axisContainer.node().style.position = 'absolute';
-axisContainer.node().style.top = 0;
-axisContainer.node().style.left = 0;
-axisContainer.node().style.width = '100%';
-axisContainer.node().style.height = '100%';
-axisContainer.node().style.pointerEvents = 'none';
-
-canvasWrapper.style.right = `${yAxisPadding}px`;
-canvasWrapper.style.bottom = `${xAxisPadding}px`;
-
-let { width, height } = canvasWrapper.getBoundingClientRect();
-
-xAxisContainer.attr('transform', `translate(0, ${height})`).call(xAxis);
-yAxisContainer.attr('transform', `translate(${width}, 0)`).call(yAxis);
-
-// Render grid
-xAxis.tickSizeInner(-height);
-yAxis.tickSizeInner(-width);
-
-let points = [];
-let numPoints = 5000;
-let pointSize = 4;
-let opacity = 0.66;
-let selection = [];
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints.length, 'points');
- selection = selectedPoints;
-};
-
-const deselectHandler = () => {
- console.log('Deselected');
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- pointSize,
- opacity,
- xScale,
- yScale,
- showReticle: true,
- lassoInitiator: true,
- pointColor: [0.33, 0.5, 1, 1],
- pointColorActive: [1, 0.5, 0, 1],
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-scatterplot.subscribe('view', (event) => {
- xAxisContainer.call(xAxis.scale(event.xScale));
- yAxisContainer.call(yAxis.scale(event.yScale));
-});
-
-scatterplot.subscribe(
- 'init',
- () => {
- xAxisContainer.call(xAxis.scale(scatterplot.get('xScale')));
- yAxisContainer.call(yAxis.scale(scatterplot.get('yScale')));
- },
- 1
-);
-
-const resizeHandler = () => {
- ({ width, height } = canvasWrapper.getBoundingClientRect());
-
- xAxisContainer.attr('transform', `translate(0, ${height})`).call(xAxis);
- yAxisContainer.attr('transform', `translate(${width}, 0)`).call(yAxis);
-
- // Render grid
- xAxis.tickSizeInner(-height);
- yAxis.tickSizeInner(-width);
-};
-
-window.addEventListener('resize', resizeHandler);
-window.addEventListener('orientationchange', resizeHandler);
-
-// Generate points in DATA SPACE (not NDC)
-const generatePoints = (num) => {
- const pts = [];
- for (let i = 0; i < num; i++) {
- const x = Math.random() * 100; // 0 to 100 (data space)
- const y = Math.random() * 100; // 0 to 100 (data space)
-
- // Convert to NDC for scatterplot
- const xNdc = (x / 100) * 2 - 1;
- const yNdc = (y / 100) * 2 - 1;
-
- pts.push([
- xNdc,
- yNdc,
- Math.round(Math.random() * 4), // category
- Math.random(), // value
- x, // store original x for reference
- y, // store original y for reference
- ]);
- }
- return pts;
-};
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-scatterplot.set({
- colorBy: 'category',
- pointColor: [
- '#3a84cc',
- '#56bf92',
- '#eecb62',
- '#c76526',
- '#d192b7',
- ],
-});
-
-// Helper function to create a button
-const createButton = (label, onClick, wide = false) => {
- const btn = document.createElement('button');
- btn.textContent = label;
- btn.style.cssText = `
- padding: 6px 10px;
- background: #3a84cc;
- color: white;
- border: none;
- border-radius: 3px;
- cursor: pointer;
- font-size: 11px;
- white-space: nowrap;
- text-align: center;
- ${wide ? 'grid-column: 1 / -1;' : ''}
- `;
- btn.addEventListener('mouseenter', () => {
- btn.style.background = '#2a6cb0';
- });
- btn.addEventListener('mouseleave', () => {
- btn.style.background = '#3a84cc';
- });
- btn.addEventListener('click', onClick);
- return btn;
-};
-
-// Button 1: Select bottom-left triangle
-buttonContainer.appendChild(
- createButton('△ Bottom-Left', () => {
- scatterplot.lassoSelect([
- [10, 10],
- [40, 10],
- [10, 40],
- ]);
- })
-);
-
-// Button 2: Select top-right circle (approximated by polygon)
-buttonContainer.appendChild(
- createButton('○ Top-Right', () => {
- const cx = 75;
- const cy = 75;
- const radius = 20;
- const sides = 16;
- const polygon = [];
-
- for (let i = 0; i < sides; i++) {
- const angle = (i / sides) * Math.PI * 2;
- polygon.push([
- cx + Math.cos(angle) * radius,
- cy + Math.sin(angle) * radius,
- ]);
- }
-
- scatterplot.lassoSelect(polygon);
- })
-);
-
-// Button 3: Select center rectangle
-buttonContainer.appendChild(
- createButton('▭ Center', () => {
- scatterplot.lassoSelect([
- [30, 30],
- [70, 30],
- [70, 70],
- [30, 70],
- ]);
- })
-);
-
-// Button 4: Add diagonal stripe (merge)
-buttonContainer.appendChild(
- createButton('+ Diagonal (Merge)', () => {
- scatterplot.lassoSelect(
- [
- [0, 40],
- [60, 100],
- [70, 100],
- [10, 40],
- ],
- { merge: true }
- );
- })
-);
-
-// Button 5: Remove center square
-buttonContainer.appendChild(
- createButton('− Center (Remove)', () => {
- scatterplot.lassoSelect(
- [
- [40, 40],
- [60, 40],
- [60, 60],
- [40, 60],
- ],
- { remove: true }
- );
- })
-);
-
-// Button 6: Star shape
-buttonContainer.appendChild(
- createButton('★ Star', () => {
- const cx = 50;
- const cy = 50;
- const outerRadius = 30;
- const innerRadius = 15;
- const points = 5;
- const polygon = [];
-
- for (let i = 0; i < points * 2; i++) {
- const angle = (i / (points * 2)) * Math.PI * 2 - Math.PI / 2;
- const radius = i % 2 === 0 ? outerRadius : innerRadius;
- polygon.push([
- cx + Math.cos(angle) * radius,
- cy + Math.sin(angle) * radius,
- ]);
- }
-
- scatterplot.lassoSelect(polygon);
- })
-);
-
-// Button 7: Deselect all (wide button)
-buttonContainer.appendChild(
- createButton('✕ Deselect All', () => {
- scatterplot.deselect();
- }, true)
-);
-
-setNumPoints(numPoints);
diff --git a/example/size-encoding.js b/example/size-encoding.js
deleted file mode 100644
index 480c2987..00000000
--- a/example/size-encoding.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import { scaleLog } from 'd3-scale';
-import { randomExponential } from 'd3-random';
-
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-
-let points = [];
-let numPoints = 100000;
-let pointSize = 2;
-let opacity = 1.0;
-let selection = [];
-
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- opacity,
- showReticle,
- reticleColor,
- lassoInitiator: true,
- opacityInactiveScale: 0.66,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const rndA = randomExponential(2);
-const rndB = randomExponential(4);
-const rndC = randomExponential(5);
-
-const generatePoints = (num) => {
- const newPoints = [
- ...new Array(Math.round((num * 2) / 12)).fill().map(() => [
- -1 + (Math.random() * 2 * 1) / 3, // x
- -1 + Math.random() * 2, // y
- 0, // category
- rndA(), // value
- ]),
- ...new Array(Math.round((num * 4) / 12)).fill().map(() => [
- -1 + 2 / 3 + (Math.random() * 2 * 1) / 3, // x
- -1 + Math.random() * 2, // y
- 1, // category
- rndB(), // value
- ]),
- ...new Array(Math.round((num * 6) / 12)).fill().map(() => [
- -1 + 4 / 3 + (Math.random() * 2 * 1) / 3, // x
- -1 + Math.random() * 2, // y
- 2, // category
- rndC(), // value
- ]),
- ];
-
- const [minVal, maxVal] = newPoints.reduce(
- ([min, max], point) => [Math.min(min, point[3]), Math.max(max, point[3])],
- [Infinity, -Infinity]
- );
-
- const valRange = maxVal - minVal;
-
- newPoints.forEach((point) => {
- point[3] = (point[3] - minVal) / valRange;
- });
-
- return newPoints;
-};
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-const getPointSizeRange = (basePointSize) => {
- const pointSizeScale = scaleLog()
- .domain([1, 10])
- .range([basePointSize, basePointSize * 10]);
-
- return Array.from(
- { length: 100 }, (_, i) => pointSizeScale(1 + (i / 99) * 9)
- );
-};
-
-const setPointSize = (newPointSize) => {
- scatterplot.set({ pointSize: getPointSizeRange(newPointSize) });
-};
-
-const getOpacityRange = (baseOpacity) =>
- Array.from({ length: 10 }, (_, i) => ((i + 1) / 10) * baseOpacity);
-
-const setOpacity = (newOpacity) => {
- scatterplot.set({ opacity: getOpacityRange(newOpacity) });
-};
-
-createMenu({ scatterplot, setNumPoints, setPointSize, setOpacity });
-
-scatterplot.set({
- colorBy: 'category',
- pointColor: ['#ff80cb', '#57c7ff', '#eee462'],
- sizeBy: 'w',
- opacityBy: 'w',
-});
-
-setPointSize(pointSize);
-setOpacity(opacity);
-setNumPoints(numPoints);
diff --git a/example/text-labels.js b/example/text-labels.js
deleted file mode 100644
index 7d133fb1..00000000
--- a/example/text-labels.js
+++ /dev/null
@@ -1,155 +0,0 @@
-import { scaleLinear, scaleLog } from 'd3-scale';
-
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-const canvasWrapper = document.querySelector('#canvas-wrapper');
-
-const noteEl = document.createElement('div');
-noteEl.id = 'note';
-noteEl.textContent = 'Zoom in to see labels!';
-canvasWrapper.appendChild(noteEl);
-
-const textOverlayEl = document.createElement('canvas');
-textOverlayEl.id = '#text-overlay';
-textOverlayEl.style.position = 'absolute';
-textOverlayEl.style.top = 0;
-textOverlayEl.style.right = 0;
-textOverlayEl.style.bottom = 0;
-textOverlayEl.style.left = 0;
-textOverlayEl.style.pointerEvents = 'none';
-
-canvasWrapper.appendChild(textOverlayEl);
-
-const resizeTextOverlay = () => {
- const { width, height } = canvasWrapper.getBoundingClientRect();
- textOverlayEl.width = width * window.devicePixelRatio;
- textOverlayEl.height = height * window.devicePixelRatio;
- textOverlayEl.style.width = `${width}px`;
- textOverlayEl.style.height = `${height}px`;
-};
-resizeTextOverlay();
-
-window.addEventListener('resize', resizeTextOverlay);
-
-const overlayFontSize = 12;
-const textOverlayCtx = textOverlayEl.getContext('2d');
-textOverlayCtx.font = `${
- overlayFontSize * window.devicePixelRatio
-}px sans-serif`;
-textOverlayCtx.textAlign = 'center';
-
-let points = [];
-let numPoints = 10000;
-let pointSize = 4;
-let opacity = 1.0;
-let selection = [];
-
-const maxPointLabels = 200;
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- opacity,
- showReticle,
- reticleColor,
- xScale: scaleLinear().domain([-1, 1]),
- yScale: scaleLinear().domain([-1, 1]),
- pointColor: '#fff',
- opacityBy: 'density',
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-});
-
-scatterplot.subscribe('deselect', () => {
- selection = [];
-});
-
-const showPointLabels = (pointsInView, xScale, yScale) => {
- textOverlayCtx.clearRect(0, 0, textOverlayEl.width, textOverlayEl.height);
- textOverlayCtx.fillStyle = 'rgb(255, 255, 255)';
-
- const dpr = window.devicePixelRatio;
-
- for (let i = 0; i < pointsInView.length; i++) {
- const [x, y] = points[pointsInView[i]];
- textOverlayCtx.fillText(
- pointsInView[i],
- xScale(x) * dpr,
- yScale(y) * dpr - overlayFontSize * 1.2 * dpr
- );
- }
-};
-
-const hidePointLabels = () => {
- textOverlayCtx.clearRect(0, 0, canvas.width, canvas.height);
-};
-
-scatterplot.subscribe('drawing', ({ xScale, yScale }) => {
- const pointsInView = scatterplot.get('pointsInView');
- if (pointsInView.length <= maxPointLabels) {
- showPointLabels(pointsInView, xScale, yScale);
- } else {
- hidePointLabels();
- }
-});
-
-const generatePoints = (num) =>
- Array.from({ length: num }, () => [
- -1 + Math.random() * 2,
- -1 + Math.random() * 2,
- ]);
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-const getPointSizeRange = (basePointSize) => {
- const pointSizeScale = scaleLog()
- .domain([1, 10])
- .range([basePointSize, basePointSize * 10]);
-
- return Array.from(
- { length: 100 }, (_, i) => pointSizeScale(1 + (i / 99) * 9)
- );
-};
-
-const setPointSize = (newPointSize) => {
- scatterplot.set({ pointSize: getPointSizeRange(newPointSize) });
-};
-
-const getOpacityRange = (baseOpacity) =>
- Array.from({ length: 10 }, (_, i) => ((i + 1) / 10) * baseOpacity);
-
-const setOpacity = (newOpacity) => {
- scatterplot.set({ opacity: getOpacityRange(newOpacity) });
-};
-
-createMenu({ scatterplot, setNumPoints, setPointSize });
-
-setPointSize(pointSize);
-setOpacity(opacity);
-setNumPoints(numPoints);
diff --git a/example/texture-background.js b/example/texture-background.js
deleted file mode 100644
index c21675bf..00000000
--- a/example/texture-background.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-
-const { width, height } = canvas.getBoundingClientRect();
-
-let points = [];
-let numPoints = 100000;
-let pointSize = 3;
-let opacity = 1;
-let selection = [];
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- pointSize,
- opacity,
- showReticle: true,
- backgroundImage: `https://picsum.photos/${Math.min(640, width)}/${Math.min(
- 640,
- height
- )}/?random`,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (num) =>
- new Array(num).fill().map(() => [
- -1 + Math.random() * 2, // x
- -1 + Math.random() * 2, // y
- Math.round(Math.random()), // category
- Math.random(), // value
- ]);
-
-const setNumPoints = (newNumPoints) => {
- points = generatePoints(newNumPoints);
- scatterplot.draw(points);
-};
-
-createMenu({ scatterplot, setNumPoints });
-
-scatterplot.set({ colorBy: 'category', pointColor: ['#3a78aa', '#aa3a99'] });
-
-setNumPoints(numPoints);
diff --git a/example/transition-old.js b/example/transition-old.js
deleted file mode 100644
index f087b872..00000000
--- a/example/transition-old.js
+++ /dev/null
@@ -1,184 +0,0 @@
-/* eslint no-console: 0 */
-
-import createScatterplot from '../src';
-import { saveAsPng, checkSupport } from './utils';
-
-const canvas = document.querySelector('#canvas');
-const numPointsEl = document.querySelector('#num-points');
-const numPointsValEl = document.querySelector('#num-points-value');
-const pointSizeEl = document.querySelector('#point-size');
-const pointSizeValEl = document.querySelector('#point-size-value');
-const opacityEl = document.querySelector('#opacity');
-const opacityValEl = document.querySelector('#opacity-value');
-const clickLassoInitiatorEl = document.querySelector('#click-lasso-initiator');
-const resetEl = document.querySelector('#reset');
-const exportEl = document.querySelector('#export');
-const exampleEl = document.querySelector('#example-transition');
-
-exampleEl.setAttribute('class', 'active');
-exampleEl.removeAttribute('href');
-
-let points = [];
-let pointStates = [];
-let numPoints = 100000;
-let pointSize = 2;
-let opacity = 0.33;
-let selection = [];
-
-const lassoMinDelay = 10;
-const lassoMinDist = 2;
-const showReticle = true;
-const reticleColor = [1, 1, 0.878431373, 0.33];
-
-const selectHandler = ({ points: selectedPoints }) => {
- console.log('Selected:', selectedPoints);
- selection = selectedPoints;
- if (selection.length === 1) {
- const point = points[selection[0]];
- console.log(
- `X: ${point[0]}\nY: ${point[1]}\nCategory: ${point[2]}\nValue: ${point[3]}`
- );
- }
-};
-
-const deselectHandler = () => {
- console.log('Deselected:', selection);
- selection = [];
-};
-
-const scatterplot = createScatterplot({
- canvas,
- lassoMinDelay,
- lassoMinDist,
- pointSize,
- showReticle,
- reticleColor,
- lassoInitiator: true,
-});
-
-checkSupport(scatterplot);
-
-exportEl.addEventListener('click', () => saveAsPng(scatterplot));
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-scatterplot.subscribe('select', selectHandler);
-scatterplot.subscribe('deselect', deselectHandler);
-
-const generatePoints = (num) => [
- ...new Array(Math.round(num / 2)).fill().map(() => [
- -1 + Math.random(), // x
- -1 + (Math.random() * 2) / 3, // y
- 0, // category
- Math.random() * 0.33, // value
- ]),
- ...new Array(Math.round(num / 2)).fill().map(() => [
- Math.random(), // x
- -1 + Math.random() * 2, // y
- 1, // category
- 0.66 + Math.random() * 0.33, // value
- ]),
-];
-
-const setNumPoint = (newNumPoints) => {
- numPoints = newNumPoints;
- numPointsEl.value = numPoints;
- numPointsValEl.innerHTML = numPoints;
- points = generatePoints(numPoints);
- pointStates = [
- points,
- points.map(([x, y, c, v], j) =>
- j < points.length / 2
- ? [x, (y + 1) * 3 - 1, c, v + 0.66]
- : [x, (y + 1) / 3 - 1, c, v - 0.66]
- ),
- ];
- scatterplot.draw(points);
-};
-
-const numPointsInputHandler = (event) => {
- numPointsValEl.innerHTML = `${+event.target
- .value} release to redraw `;
-};
-
-numPointsEl.addEventListener('input', numPointsInputHandler);
-
-const numPointsChangeHandler = (event) => setNumPoint(+event.target.value);
-
-numPointsEl.addEventListener('change', numPointsChangeHandler);
-
-const setPointSize = (newPointSize) => {
- pointSize = newPointSize;
- pointSizeEl.value = pointSize;
- pointSizeValEl.innerHTML = pointSize;
- scatterplot.set({ pointSize });
-};
-
-const pointSizeInputHandler = (event) => setPointSize(+event.target.value);
-
-pointSizeEl.addEventListener('input', pointSizeInputHandler);
-
-const setOpacity = (newOpacity) => {
- opacity = newOpacity;
- opacityEl.value = opacity;
- opacityValEl.innerHTML = opacity;
- scatterplot.set({ opacity });
-};
-
-const opacityInputHandler = (event) => setOpacity(+event.target.value);
-
-opacityEl.addEventListener('input', opacityInputHandler);
-
-const clickLassoInitiatorChangeHandler = (event) => {
- scatterplot.set({
- lassoInitiator: event.target.checked,
- });
-};
-
-clickLassoInitiatorEl.addEventListener(
- 'change',
- clickLassoInitiatorChangeHandler
-);
-clickLassoInitiatorEl.checked = scatterplot.get('lassoInitiator');
-
-const resetClickHandler = () => {
- scatterplot.reset();
-};
-
-resetEl.addEventListener('click', resetClickHandler);
-
-const colorsCat = ['#3a78aa', '#aa3a99'];
-scatterplot.set({ colorBy: 'category', pointColor: colorsCat });
-
-const colorsScale = [
- '#ff80cb', // bright pink
- '#df80b8',
- '#bf80a5',
- '#9f8092',
- '#808080',
- '#75919f',
- '#6ba3bf',
- '#61b5df',
- '#57c7ff', // bright blue
-];
-scatterplot.set({ colorBy: 'value', pointColor: colorsScale });
-
-setPointSize(pointSize);
-setOpacity(opacity);
-setNumPoint(numPoints);
-
-let i = 0;
-const transitionPoints = () => {
- i++;
- scatterplot
- .draw(pointStates[i % pointStates.length], {
- transition: true,
- transitionDuration: 1000 - ((i - 1) % 5) * 150,
- transitionEasing: 'quadInOut',
- })
- .then(() => {
- setTimeout(transitionPoints, +!(i % 5) * 3000);
- });
-};
-
-transitionPoints();
diff --git a/example/transition.js b/example/transition.js
deleted file mode 100644
index 107aed76..00000000
--- a/example/transition.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import { tableFromIPC } from 'apache-arrow';
-
-import createScatterplot from '../src';
-import createMenu from './menu';
-import { checkSupport, showModal, closeModal } from './utils';
-
-const CLASS_COLORS = [
- '#FFFF00', // bright yellow
- '#1CFFD9', // turrtoise
- '#FF34FF', // pink/purple
- '#FF4A46', // pale red
- '#008941', // forrest green
- '#1966FF', // dark blue
- '#C00069', // violette
- '#FFDBE5', // almost white
- '#FF9900', // yellow
- '#8148D5', // grass green
-];
-
-/**
- * Load Embedding Example
- */
-const whenData = fetch(
- 'https://storage.googleapis.com/flekschas/regl-scatterplot/cities.arrow'
-);
-
-/**
- * Modal
- */
-showModal('Loading...');
-
-/**
- * Add info to footer
- */
-const footer = document.querySelector('#footer');
-footer.classList.remove('hidden');
-const infoContent = document.querySelector('#info-content');
-infoContent.innerHTML = `
-GeoNames – Cities Dataset visualized in three: by the cities' geographic location, by the total population across contintents, and by the citie's latitude distribution.
-`;
-
-const canvas = document.querySelector('#canvas');
-
-let pointSize = 1.5;
-
-const scatterplot = createScatterplot({
- canvas,
- pointSize,
- lassoOnLongPress: true,
-});
-
-checkSupport(scatterplot);
-
-console.log(`Scatterplot v${scatterplot.get('version')}`);
-
-createMenu({ scatterplot, opacityChangesDisabled: true });
-
-whenData
- .then((data) => tableFromIPC(data))
- .then((table) => {
- closeModal();
- const columnValues = table.data[0].children.map((data) => data.values);
-
- const population = columnValues[columnValues.length - 2];
- const continents = columnValues[columnValues.length - 1];
-
- const staticOpacity = new Float32Array(population.length);
- for (let i = 0; i < population.length; i++) {
- staticOpacity[i] = 1;
- }
-
- scatterplot.draw({
- x: columnValues[0],
- y: columnValues[1],
- z: continents,
- w: population,
- });
- scatterplot.set({
- colorBy: 'z',
- pointColor: CLASS_COLORS,
- opacityBy: 'w',
- opacity: Array.from({ length: 10 }, (_, i) => 0.33 + (i / 9) * 0.33),
- });
-
- let i = 0;
- const transitionPoints = () => {
- i++;
-
- const startCol = (i % 3) * 2;
-
- scatterplot
- .draw(
- {
- x: columnValues[startCol],
- y: columnValues[startCol + 1],
- z: continents,
- w: [population, staticOpacity, staticOpacity][i % 3],
- },
- {
- transition: true,
- transitionDuration: 750,
- transitionEasing: 'quadInOut',
- }
- )
- .then(() => {
- setTimeout(transitionPoints, 2500);
- });
- };
-
- setTimeout(transitionPoints, 2500);
- });
diff --git a/example/tweakpane-link-plugin.js b/example/tweakpane-link-plugin.js
deleted file mode 100644
index b82db44a..00000000
--- a/example/tweakpane-link-plugin.js
+++ /dev/null
@@ -1,136 +0,0 @@
-import {
- bindValue,
- createPlugin,
- parseRecord,
- BladeApi,
- BladeController,
- ValueMap
-} from '@tweakpane/core';
-
-class LinkController extends BladeController {
- constructor(doc, config) {
- super({
- ...config,
- view: new LinkView(doc, {
- props: config.props,
- viewProps: config.viewProps,
- }),
- });
- }
-}
-
-class LinkView {
- constructor(doc, { props, viewProps }) {
- // Create view elements
- this.element = doc.createElement('div');
- this.element.classList.add('tp-link');
- viewProps.bindClassModifiers(this.element);
-
- // Create an `a` element for user interaction
- const linkElement = doc.createElement('a');
- viewProps.bindDisabled(linkElement);
-
- function setLink(link) {
- linkElement.href = link ?? '';
- }
-
- function setLabel(label) {
- linkElement.textContent = label ?? '';
- }
-
- function setActive(active) {
- if (active) {
- linkElement.classList.add('active');
- linkElement.removeAttribute('href');
- linkElement.removeAttribute('target');
- } else {
- linkElement.classList.remove('active');
- setLink(props.get('link'));
- setNewPage(props.get('newPage'));
- }
- }
-
- function setNewPage(newPage) {
- if (newPage) {
- linkElement.target = '_blank';
- } else {
- linkElement.removeAttribute('target');
- }
- }
-
- bindValue(props.value('link'), setLink);
- bindValue(props.value('label'), setLabel);
- bindValue(props.value('active'), setActive);
- bindValue(props.value('newPage'), setNewPage);
-
- this.element.appendChild(linkElement);
- this.linkElement = linkElement;
- }
-}
-
-class LinkApi extends BladeApi {
- get label() {
- return this.controller.props.get('label') ?? '';
- }
-
- set label(label) {
- this.controller.props.set('label', label);
- }
-
- get link() {
- return this.controller.props.get('link');
- }
-
- set link(link) {
- this.controller.props.set('link', link);
- }
-
- get active() {
- return this.controller.props.get('active');
- }
-
- set active(active) {
- this.controller.props.set('active', Boolean(active));
- }
-
- get newPage() {
- return this.controller.props.get('newPage');
- }
-
- set newPage(newPage) {
- this.controller.props.set('newPage', Boolean(newPage));
- }
-}
-
-export const LinkPlugin = createPlugin({
- id: 'link',
- type: 'blade',
- accept(params) {
- const result = parseRecord(params, (p) => ({
- view: p.required.constant('link'),
- link: p.required.string,
- label: p.required.string,
- active: p.optional.boolean,
- newPage: p.optional.boolean,
- }));
- return result ? { params: result } : null;
- },
- controller(args) {
- return new LinkController(args.document, {
- blade: args.blade,
- props: ValueMap.fromObject({
- label: args.params.label,
- link: args.params.link,
- active: args.params.active,
- newPage: args.params.newPage,
- }),
- viewProps: args.viewProps,
- });
- },
- api(args) {
- if (!(args.controller instanceof LinkController)) {
- return null;
- }
- return new LinkApi(args.controller);
- },
-});
diff --git a/example/utils.js b/example/utils.js
deleted file mode 100644
index 14fdaef6..00000000
--- a/example/utils.js
+++ /dev/null
@@ -1,62 +0,0 @@
-export function downloadBlob(blob, name = 'file.txt') {
- const link = document.createElement('a');
- link.href = URL.createObjectURL(blob);
- link.download = name;
-
- document.body.appendChild(link);
-
- link.dispatchEvent(
- new MouseEvent('click', {
- bubbles: true,
- cancelable: true,
- view: window,
- })
- );
-
- document.body.removeChild(link);
-}
-
-export function saveAsPng(scatterplot) {
- const imageObject = new Image();
- imageObject.onload = () => {
- scatterplot.get('canvas').toBlob((blob) => {
- downloadBlob(blob, 'regl-scatterplot.png');
- });
- };
- imageObject.src = scatterplot.get('canvas').toDataURL();
-}
-
-export function closeModal() {
- const modal = document.querySelector('#modal');
- const modalText = document.querySelector('#modal-text');
- modal.style.display = 'none';
- modalText.textContent = '';
-}
-
-export function showModal(text, isError, isClosable) {
- const modal = document.querySelector('#modal');
- modal.style.display = 'flex';
-
- const modalText = document.querySelector('#modal-text');
- modalText.style.color = isError ? '#cc79A7' : '#bbb';
- modalText.textContent = text;
-
- const modalClose = document.querySelector('#modal-close');
- if (isClosable) {
- modalClose.style.display = 'block';
- modalClose.style.background = isError ? '#cc79A7' : '#bbb';
- modalClose.addEventListener('click', closeModal, { once: true });
- } else {
- modalClose.style.display = 'none';
- }
-}
-
-export function checkSupport(scatterplot) {
- if (!scatterplot.isSupported) {
- showModal(
- 'Your browser does not support all necessary WebGL features. The scatter plot might not render properly.',
- true,
- true
- );
- }
-}
diff --git a/public/favicon.png b/favicon.png
similarity index 100%
rename from public/favicon.png
rename to favicon.png
diff --git a/public/index.html b/index.html
similarity index 96%
rename from public/index.html
rename to index.html
index dccce48a..5fe658d6 100644
--- a/public/index.html
+++ b/index.html
@@ -11,7 +11,7 @@
/>
-
+
+
+
+
@@ -437,5 +440,5 @@ Regl Scatterplot
-
+