diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 00000000..e69de29b
diff --git a/CNAME b/CNAME
new file mode 100644
index 00000000..24989d3e
--- /dev/null
+++ b/CNAME
@@ -0,0 +1 @@
+reagraph.dev
diff --git a/assets/Api-af41c602.js b/assets/Api-af41c602.js
new file mode 100644
index 00000000..4ae12fe0
--- /dev/null
+++ b/assets/Api-af41c602.js
@@ -0,0 +1,4 @@
+import{j as r}from"./jsx-runtime-5926aa06.js";import{M as e,A as i}from"./index-96a2bc4b.js";import{G as m}from"./RadialMenu-93524eec.js";import"./index-ebeaab24.js";import{u as s}from"./index-bda0bad7.js";import"./iframe-608d8974.js";import"../sb-preview/runtime.js";import"./chunk-4NMOSTKD-82fbb5f2.js";import"./index-d475d2ea.js";import"./index-9c09ad76.js";import"./extends-98964cd2.js";import"./index-84cea9da.js";import"./index-356e4a49.js";import"./index-6279214a.esm-cc44dd6d.js";import"./client-180092d5.js";function D(t={}){const{wrapper:o}=Object.assign({},s(),t.components);return o?r.jsx(o,Object.assign({},t,{children:r.jsx(n,{})})):n();function n(){const a=Object.assign({h1:"h1",a:"a"},s(),t.components);return r.jsxs(r.Fragment,{children:[r.jsx(e,{title:"Docs/API/GraphCanvas"}),`
+`,r.jsx(a.h1,{id:"graphcanvas",children:r.jsx(a.a,{href:"https://github.com/reaviz/reagraph/blob/master/src/GraphCanvas.tsx",target:"_blank",rel:"nofollow noopener noreferrer",children:"GraphCanvas"})}),`
+`,r.jsx(i,{of:m})]})}}export{D as default};
+//# sourceMappingURL=Api-af41c602.js.map
diff --git a/assets/Api-af41c602.js.map b/assets/Api-af41c602.js.map
new file mode 100644
index 00000000..396e2d2c
--- /dev/null
+++ b/assets/Api-af41c602.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Api-af41c602.js","sources":["../../docs/Api.mdx"],"sourcesContent":["import { Meta, Story, ArgsTable } from '@storybook/blocks';\nimport { GraphCanvas } from '../src';\n\n\n\n# [GraphCanvas](https://github.com/reaviz/reagraph/blob/master/src/GraphCanvas.tsx)\n
+
+ {JSON.stringify(collapsed, null, 2)}
+
+
+
+
+ {JSON.stringify(collapsed, null, 2)}
+
+
+ 1)p.splice(k,1);else return R.extend(!0,{},p[k])}},T}();return fe&&fe.fn&&(fe.fn.overlayScrollbars=function(T,m){var n=this;return fe.isPlainObject(T)?(fe.each(n,function(){Ws(this,T,m)}),n):Ws(n,T)}),Ws})}}),is=wi(zi()),Ui=({options:Ut={},extensions:ue,className:er,children:Pr,...B})=>{let Ie=cs.useRef(),v=cs.useRef();return cs.useEffect(()=>(v.current=(0,is.default)(Ie.current,Ut,ue),Vc(v.current,er),()=>{is.default.valid(v.current)&&(v.current.destroy(),v.current=null)}),[]),cs.useEffect(()=>{is.default.valid(v.current)&&v.current.options(Ut)},[Ut]),cs.useEffect(()=>{is.default.valid(v.current)&&Vc(v.current,er)},[er]),lt.createElement("div",{className:"os-host",...B,ref:Ie},lt.createElement("div",{className:"os-resize-observer-host"}),lt.createElement("div",{className:"os-padding"},lt.createElement("div",{className:"os-viewport"},lt.createElement("div",{className:"os-content"},Pr))),lt.createElement("div",{className:"os-scrollbar os-scrollbar-horizontal "},lt.createElement("div",{className:"os-scrollbar-track"},lt.createElement("div",{className:"os-scrollbar-handle"}))),lt.createElement("div",{className:"os-scrollbar os-scrollbar-vertical"},lt.createElement("div",{className:"os-scrollbar-track"},lt.createElement("div",{className:"os-scrollbar-handle"}))),lt.createElement("div",{className:"os-scrollbar-corner"}))};function Vc(Ut,ue){if(is.default.valid(Ut)){let{host:er}=Ut.getElements(),Pr=new RegExp(`(^os-host([-_].+|)$)|${Ut.options().className.replace(/\s/g,"$|")}$`,"g"),B=er.className.split(" ").filter(Ie=>Ie.match(Pr)).join(" ");er.className=`${B} ${ue||""}`}}var Ji=Ui;export{Ui as OverlayScrollbarsComponent,Ji as default};
+//# sourceMappingURL=OverlayScrollbars-VAV6LJAB-f81de3e5.js.map
diff --git a/assets/OverlayScrollbars-VAV6LJAB-f81de3e5.js.map b/assets/OverlayScrollbars-VAV6LJAB-f81de3e5.js.map
new file mode 100644
index 00000000..058ff5ad
--- /dev/null
+++ b/assets/OverlayScrollbars-VAV6LJAB-f81de3e5.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"OverlayScrollbars-VAV6LJAB-f81de3e5.js","sources":["../../node_modules/@storybook/components/dist/OverlayScrollbars-VAV6LJAB.mjs"],"sourcesContent":["import { __commonJS, __toESM } from './chunk-NNAAFZ4U.mjs';\nimport React, { useRef, useEffect } from 'react';\n\nvar require_OverlayScrollbars=__commonJS({\"../../node_modules/overlayscrollbars/js/OverlayScrollbars.js\"(exports,module){(function(global,factory){typeof define==\"function\"&&define.amd?define(function(){return factory(global,global.document,void 0)}):typeof module==\"object\"&&typeof module.exports==\"object\"?module.exports=factory(global,global.document,void 0):factory(global,global.document,void 0);})(typeof window<\"u\"?window:exports,function(window2,document,undefined2){var PLUGINNAME=\"OverlayScrollbars\",TYPES={o:\"object\",f:\"function\",a:\"array\",s:\"string\",b:\"boolean\",n:\"number\",u:\"undefined\",z:\"null\"},LEXICON={c:\"class\",s:\"style\",i:\"id\",l:\"length\",p:\"prototype\",ti:\"tabindex\",oH:\"offsetHeight\",cH:\"clientHeight\",sH:\"scrollHeight\",oW:\"offsetWidth\",cW:\"clientWidth\",sW:\"scrollWidth\",hOP:\"hasOwnProperty\",bCR:\"getBoundingClientRect\"},VENDORS=function(){var jsCache={},cssCache={},cssPrefixes=[\"-webkit-\",\"-moz-\",\"-o-\",\"-ms-\"],jsPrefixes=[\"WebKit\",\"Moz\",\"O\",\"MS\"];function firstLetterToUpper(str){return str.charAt(0).toUpperCase()+str.slice(1)}return {_cssPrefixes:cssPrefixes,_jsPrefixes:jsPrefixes,_cssProperty:function(name){var result=cssCache[name];if(cssCache[LEXICON.hOP](name))return result;for(var uppercasedName=firstLetterToUpper(name),elmStyle=document.createElement(\"div\")[LEXICON.s],resultPossibilities,i=0,v,currVendorWithoutDashes;i 1&&isNaN(y.y)||n>2&&isNaN(y.z)){var _=Mm*(n>2?Math.cbrt(.5+m):n>1?Math.sqrt(.5+m):m),b=m*Pm,T=m*Lm;n===1?y.x=_:n===2?(y.x=_*Math.cos(b),y.y=_*Math.sin(b)):(y.x=_*Math.sin(b)*Math.cos(T),y.y=_*Math.cos(b),y.z=_*Math.sin(b)*Math.sin(T))}(isNaN(y.vx)||n>1&&isNaN(y.vy)||n>2&&isNaN(y.vz))&&(y.vx=0,n>1&&(y.vy=0),n>2&&(y.vz=0))}}function w(m){return m.initialize&&m.initialize(t,d,n),m}return v(),r={tick:g,restart:function(){return c.restart(h),r},stop:function(){return c.stop(),r},numDimensions:function(m){return arguments.length?(n=Math.min(jl,Math.max(1,Math.round(m))),l.forEach(w),r):n},nodes:function(m){return arguments.length?(t=m,v(),l.forEach(w),r):t},alpha:function(m){return arguments.length?(i=+m,r):i},alphaMin:function(m){return arguments.length?(o=+m,r):o},alphaDecay:function(m){return arguments.length?(a=+m,r):+a},alphaTarget:function(m){return arguments.length?(s=+m,r):s},velocityDecay:function(m){return arguments.length?(u=1-m,r):1-u},randomSource:function(m){return arguments.length?(d=m,l.forEach(w),r):d},force:function(m,p){return arguments.length>1?(p==null?l.delete(m):l.set(m,w(p)),r):l.get(m)},find:function(){var m=Array.prototype.slice.call(arguments),p=m.shift()||0,y=(n>1?m.shift():null)||0,_=(n>2?m.shift():null)||0,b=m.shift()||1/0,T=0,x=t.length,E,S,U,D,O,k;for(b*=b,T=0;T >>4;if((A+=15&Oe)>R){W&&E(0);break}if(Oe||E(2),ve<256)k[I++]=ve;else{if(ve==256){re=A,G=null;break}var Ie=ve-254;if(ve>264){var ze=i[le=ve-257];Ie=b(O,A,(1<c&&(c=v));if(o>u||a>l||s>c)return this;this.cover(o,a,s).cover(u,l,c);for(let f=0;f1&&(n.vy+=b*g.value*i/E),e>2&&(n.vz+=T*g.value*i/E)),!0;if(g.length||E>=u)return;(g.data!==n||g.next)&&(_===0&&(_=Ft(r),E+=_*_),e>1&&b===0&&(b=Ft(r),E+=b*b),e>2&&T===0&&(T=Ft(r),E+=T*T),E1&&(n.vy+=b*x),e>2&&(n.vz+=T*x));while(g=g.next)}return c.initialize=function(g,...v){t=g,r=v.find(w=>typeof w=="function")||Math.random,e=v.find(w=>[1,2,3].includes(w))||2,f()},c.strength=function(g){return arguments.length?(o=typeof g=="function"?g:Ze(+g),f(),c):o},c.distanceMin=function(g){return arguments.length?(s=g*g,c):Math.sqrt(s)},c.distanceMax=function(g){return arguments.length?(u=g*g,c):Math.sqrt(u)},c.theta=function(g){return arguments.length?(l=g*g,c):Math.sqrt(l)},c}function Gm(t,e,n,r){var i,o,a=Ze(.1),s,u;typeof t!="function"&&(t=Ze(+t)),e==null&&(e=0),n==null&&(n=0),r==null&&(r=0);function l(f){for(var d=0,h=i.length;d=0;)n+=r[i].value;e.value=n})}function ov(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}function av(t){for(var e=this,n=sv(e,t),r=[e];e!==n;)e=e.parent,r.push(e);for(var i=r.length;t!==n;)r.splice(i,0,t),t=t.parent;return r}function sv(t,e){if(t===e)return t;var n=t.ancestors(),r=e.ancestors(),i=null;for(t=n.pop(),e=r.pop();t===e;)i=t,t=n.pop(),e=r.pop();return i}function uv(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}function lv(){return Array.from(this)}function cv(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}function fv(){var t=this,e=[];return t.each(function(n){n!==t&&e.push({source:n.parent,target:n})}),e}function*dv(){var t=this,e,n=[t],r,i,o;do for(e=n.reverse(),n=[];t=e.pop();)if(yield t,r=t.children)for(i=0,o=r.length;i=0)if(x=Math.pow(n[a+rt]-S[o+tn],2)+Math.pow(n[a+Ke]-S[o+nn],2),h=S[o+Nn],4*h*h/x2e3,strongGravityMode:!0,gravity:.05,scalingRatio:10,slowDown:1+Math.log(e)}}var Su=dd.bind(null,!1);Su.assign=dd.bind(null,!0);Su.inferSettings=Qv;var Jv=Su;const e0=It(Jv);var t0=Eu,n0=Gn,r0={dimensions:["x","y"],center:.5,rng:Math.random,scale:1};function hd(t,e,n){if(!n0(e))throw new Error("graphology-layout/random: the given graph is not a valid graphology instance.");n=t0(n,r0);var r=n.dimensions;if(!Array.isArray(r)||r.length<1)throw new Error("graphology-layout/random: given dimensions are invalid.");var i=r.length,o=n.center,a=n.rng,s=n.scale,u=(o-.5)*s;function l(f){for(var d=0;d 4294967295 is not supported.")},t.getSignedPointerArray=function(u){var l=u-1;return l<=i?Int8Array:l<=o?Int16Array:l<=a?Int32Array:Float64Array},t.getNumberType=function(u){return u===(u|0)?Math.sign(u)===-1?u<=127&&u>=-128?Int8Array:u<=32767&&u>=-32768?Int16Array:Int32Array:u<=255?Uint8Array:u<=65535?Uint16Array:Uint32Array:Float64Array};var s={Uint8Array:1,Int8Array:2,Uint16Array:3,Int16Array:4,Uint32Array:5,Int32Array:6,Float32Array:7,Float64Array:8};t.getMinimalRepresentation=function(u,l){var c=null,f=0,d,h,g,v,w;for(v=0,w=u.length;v0))return[];if(t===e)return[t];const r=e>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?vo(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?vo(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=F0.exec(t))?new At(e[1],e[2],e[3],1):(e=G0.exec(t))?new At(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=z0.exec(t))?vo(e[1],e[2],e[3],e[4]):(e=N0.exec(t))?vo(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=V0.exec(t))?sc(e[1],e[2]/100,e[3]/100,1):(e=B0.exec(t))?sc(e[1],e[2]/100,e[3]/100,e[4]):tc.hasOwnProperty(t)?ic(tc[t]):t==="transparent"?new At(NaN,NaN,NaN,0):null}function ic(t){return new At(t>>16&255,t>>8&255,t&255,1)}function vo(t,e,n,r){return r<=0&&(t=e=n=NaN),new At(t,e,n,r)}function q0(t){return t instanceof Gi||(t=Ai(t)),t?(t=t.rgb(),new At(t.r,t.g,t.b,t.opacity)):new At}function js(t,e,n,r){return arguments.length===1?q0(t):new At(t,e,n,r??1)}function At(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}Cu(At,js,wd(Gi,{brighter(t){return t=t==null?$o:Math.pow($o,t),new At(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Ti:Math.pow(Ti,t),new At(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new At(Hn(this.r),Hn(this.g),Hn(this.b),jo(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:oc,formatHex:oc,formatHex8:W0,formatRgb:ac,toString:ac}));function oc(){return`#${qn(this.r)}${qn(this.g)}${qn(this.b)}`}function W0(){return`#${qn(this.r)}${qn(this.g)}${qn(this.b)}${qn((isNaN(this.opacity)?1:this.opacity)*255)}`}function ac(){const t=jo(this.opacity);return`${t===1?"rgb(":"rgba("}${Hn(this.r)}, ${Hn(this.g)}, ${Hn(this.b)}${t===1?")":`, ${t})`}`}function jo(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Hn(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function qn(t){return t=Hn(t),(t<16?"0":"")+t.toString(16)}function sc(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Xt(t,e,n,r)}function bd(t){if(t instanceof Xt)return new Xt(t.h,t.s,t.l,t.opacity);if(t instanceof Gi||(t=Ai(t)),!t)return new Xt;if(t instanceof Xt)return t;t=t.rgb();var e=t.r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),o=Math.max(e,n,r),a=NaN,s=o-i,u=(o+i)/2;return s?(e===o?a=(n-r)/s+(nu)&&(u=d),a.set(c,d)}),t!=="none"){const c=Ad().domain([s,u]).rangeRound([i,o]);for(const[f,d]of a)a.set(f,c(d))}return a}const Cy=20;function ky(t,e){return(n,r)=>e==="all"||e==="nodes"&&n==="node"||e==="edges"&&n==="edge"?!0:e==="auto"&&n==="node"?t<=Cy?!0:r>7:!1}function Od(t,e){switch(e){case"above":return t;case"below":return-t;case"inline":case"natural":default:return 0}}function Dy(t,e,n){t.clear();for(const r of e)try{t.addNode(r.id,r)}catch({message:i}){console.error(`[Graph] ${i}`)}for(const r of n)t.addEdge(r.source,r.target,r);return t}function Uy({graph:t,layout:e,sizingType:n,labelType:r,sizingAttribute:i,defaultNodeSize:o,minNodeSize:a,maxNodeSize:s}){const u=[],l=[],c=new Map,f=Oy({graph:t,type:n,attribute:i,minSize:a,maxSize:s,defaultSize:o}),d=t.nodes.length,h=ky(d,r);return t.forEachNode((g,v)=>{const w=e.getNodePosition(g),{data:m,fill:p,icon:y,label:_,size:b,...T}=v,x=f.get(v.id),E=h("node",x),U=(t.inboundNeighbors(v.id)||[]).map(O=>t.getNodeAttributes(O)),D={...v,size:x,labelVisible:E,label:_,icon:y,fill:p,parents:U,data:{...T,...m??{}},position:{...w,x:w.x||0,y:w.y||0,z:w.z||1}};c.set(v.id,D),u.push(D)}),t.forEachEdge((g,v)=>{const w=c.get(v.source),m=c.get(v.target);if(w&&m){const{data:p,id:y,label:_,size:b,...T}=v,x=h("edge",b);l.push({...v,id:y,label:_,labelVisible:x,size:b,data:{...T,id:y,...p||{}}})}}),{nodes:u,edges:l}}const mc=t=>{let e;const n=new Set,r=(u,l)=>{const c=typeof u=="function"?u(e):u;if(c!==e){const f=e;e=l?c:Object.assign({},e,c),n.forEach(d=>d(e,f))}},i=()=>e,s={setState:r,getState:i,subscribe:u=>(n.add(u),()=>n.delete(u)),destroy:()=>n.clear()};return e=t(r,i,s),s},Iy=t=>t?mc(t):mc;var Cd={exports:{}},kd={},Dd={exports:{}},Ud={};/**
+ * @license React
+ * use-sync-external-store-shim.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var Er=C;function My(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var Py=typeof Object.is=="function"?Object.is:My,Ly=Er.useState,Ry=Er.useEffect,Fy=Er.useLayoutEffect,Gy=Er.useDebugValue;function zy(t,e){var n=e(),r=Ly({inst:{value:n,getSnapshot:e}}),i=r[0].inst,o=r[1];return Fy(function(){i.value=n,i.getSnapshot=e,vs(i)&&o({inst:i})},[t,n,e]),Ry(function(){return vs(i)&&o({inst:i}),t(function(){vs(i)&&o({inst:i})})},[t]),Gy(n),n}function vs(t){var e=t.getSnapshot;t=t.value;try{var n=e();return!Py(t,n)}catch{return!0}}function Ny(t,e){return e()}var Vy=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?Ny:zy;Ud.useSyncExternalStore=Er.useSyncExternalStore!==void 0?Er.useSyncExternalStore:Vy;Dd.exports=Ud;var By=Dd.exports;/**
+ * @license React
+ * use-sync-external-store-shim/with-selector.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */var wa=C,$y=By;function jy(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var qy=typeof Object.is=="function"?Object.is:jy,Wy=$y.useSyncExternalStore,Hy=wa.useRef,Yy=wa.useEffect,Ky=wa.useMemo,Xy=wa.useDebugValue;kd.useSyncExternalStoreWithSelector=function(t,e,n,r,i){var o=Hy(null);if(o.current===null){var a={hasValue:!1,value:null};o.current=a}else a=o.current;o=Ky(function(){function u(h){if(!l){if(l=!0,c=h,h=r(h),i!==void 0&&a.hasValue){var g=a.value;if(i(g,h))return f=g}return f=h}if(g=f,qy(c,h))return g;var v=r(h);return i!==void 0&&i(g,v)?g:(c=h,f=v)}var l=!1,c,f,d=n===void 0?null:n;return[function(){return u(e())},d===null?void 0:function(){return u(d())}]},[e,n,r,i]);var s=Wy(t,o[0],o[1]);return Yy(function(){a.hasValue=!0,a.value=s},[s]),Xy(s),s};Cd.exports=kd;var Zy=Cd.exports;const Qy=It(Zy),{useSyncExternalStoreWithSelector:Jy}=Qy;function Id(t,e=t.getState,n){const r=Jy(t.subscribe,t.getState,t.getServerState||t.getState,e,n);return C.useDebugValue(r),r}const vc=t=>{const e=typeof t=="function"?Iy(t):t,n=(r,i)=>Id(e,r,i);return Object.assign(n,e),n},e1=t=>t?vc(t):vc;var t1=e1;function n1(){const t=C.createContext(void 0);return{Provider:({createStore:i,children:o})=>{const a=C.useRef();return a.current||(a.current=i()),C.createElement(t.Provider,{value:a.current},o)},useStore:(i,o)=>{const a=C.useContext(t);if(!a)throw new Error("Seems like you have not used zustand provider as an ancestor.");return Id(a,i,o)},useStoreApi:()=>{const i=C.useContext(t);if(!i)throw new Error("Seems like you have not used zustand provider as an ancestor.");return C.useMemo(()=>({getState:i.getState,setState:i.setState,subscribe:i.subscribe,destroy:i.destroy}),[i])}}}const Qt={mass:10,tension:1e3,friction:300,precision:.1};function Md(t,e,n){const r=e.getLength(),i=t==="end"?r:r/2,o=t==="end"?n/2:0,a=(i-o)/r,s=e.getPointAt(a),u=e.getTangentAt(a);return[s,u]}function Pd(t){return[t+6,2+t/1.5]}function Ld(t,e,n=0){const r=new Ee(t.x,t.y||0,t.z||0),i=new Ee(e.x,e.y||0,e.z||0),o=new Ee().addVectors(r,i).divideScalar(2);return o.setLength(o.length()+n)}function r1(t,e,n=-1){const r=t.clone(),i=e.clone(),o=new Ee().subVectors(i,r),a=o.length(),s=o.clone().normalize(),u=new Ee().subVectors(i,r).divideScalar(2),l=Math.abs(s.x)%1,c=new Ee(-s.y,s.x-l*s.z,l*s.y).normalize(),f=new Ee().add(r).add(u).add(c.multiplyScalar(a/4).multiplyScalar(n));return[t,f,e]}function Oi(t,e,n,r,i){const o=yc(t,n,e),a=yc(n,t,r);return i?new Np(...r1(o,a)):new Vp(o,a)}function Ci(t){return new Ee(t.position.x,t.position.y,t.position.z||0)}function yc(t,e,n){const r=t.distanceTo(e);return t.clone().add(e.clone().sub(t).multiplyScalar(n/r))}function _c(t){let e=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let s of t)e=Math.min(e,s.position.x),n=Math.max(n,s.position.x),r=Math.min(r,s.position.y),i=Math.max(i,s.position.y),o=Math.min(o,s.position.z),a=Math.max(a,s.position.z);return{minX:e,maxX:n,minY:r,maxY:i,minZ:o,maxZ:a,x:(n+e)/2,y:(i+r)/2,z:(a+o)/2}}var Iu={exports:{}},vr=typeof Reflect=="object"?Reflect:null,wc=vr&&typeof vr.apply=="function"?vr.apply:function(e,n,r){return Function.prototype.apply.call(e,n,r)},Po;vr&&typeof vr.ownKeys=="function"?Po=vr.ownKeys:Object.getOwnPropertySymbols?Po=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Po=function(e){return Object.getOwnPropertyNames(e)};function i1(t){console&&console.warn&&console.warn(t)}var Rd=Number.isNaN||function(e){return e!==e};function Ne(){Ne.init.call(this)}Iu.exports=Ne;Iu.exports.once=u1;Ne.EventEmitter=Ne;Ne.prototype._events=void 0;Ne.prototype._eventsCount=0;Ne.prototype._maxListeners=void 0;var bc=10;function ba(t){if(typeof t!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof t)}Object.defineProperty(Ne,"defaultMaxListeners",{enumerable:!0,get:function(){return bc},set:function(t){if(typeof t!="number"||t<0||Rd(t))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+t+".");bc=t}});Ne.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};Ne.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||Rd(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function Fd(t){return t._maxListeners===void 0?Ne.defaultMaxListeners:t._maxListeners}Ne.prototype.getMaxListeners=function(){return Fd(this)};Ne.prototype.emit=function(e){for(var n=[],r=1;rMath.abs(t)<1e-10?0:t;function uh(t,e,n=""){let r="matrix3d(";for(let i=0;i!==16;i++)r+=Hs(e[i]*t.elements[i])+(i!==15?",":")");return n+r}const R_=(t=>e=>uh(e,t))([1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1]),F_=(t=>(e,n)=>uh(e,t(n),"translate(-50%,-50%)"))(t=>[1/t,1/t,1/t,1,-1/t,-1/t,-1/t,-1,1/t,1/t,1/t,1,1,1,1,1]),Gu=C.forwardRef(({children:t,eps:e=.001,style:n,className:r,prepend:i,center:o,fullscreen:a,portal:s,distanceFactor:u,sprite:l=!1,transform:c=!1,occlude:f,onOcclude:d,zIndexRange:h=[16777271,0],calculatePosition:g=U_,as:v="div",wrapperClass:w,pointerEvents:m="auto",...p},y)=>{var _;const b=at(({gl:A})=>A),T=at(({camera:A})=>A),x=at(({scene:A})=>A),E=at(({size:A})=>A),S=at(({raycaster:A})=>A),[U]=C.useState(()=>document.createElement(v)),D=C.useRef(),O=C.useRef(null),k=C.useRef(0),M=C.useRef([0,0]),N=C.useRef(null),B=C.useRef(null),W=(_=s==null?void 0:s.current)!==null&&_!==void 0?_:b.domElement.parentNode;C.useLayoutEffect(()=>{if(O.current){const A=D.current=dg(U);if(x.updateMatrixWorld(),c)U.style.cssText="position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;";else{const I=g(O.current,T,E);U.style.cssText=`position:absolute;top:0;left:0;transform:translate3d(${I[0]}px,${I[1]}px,0);transform-origin:0 0;`}return W&&(i?W.prepend(U):W.appendChild(U)),()=>{W&&W.removeChild(U),A.unmount()}}},[W,c]),C.useLayoutEffect(()=>{w&&(U.className=w)},[w]);const J=C.useMemo(()=>c?{position:"absolute",top:0,left:0,width:E.width,height:E.height,transformStyle:"preserve-3d",pointerEvents:"none"}:{position:"absolute",transform:o?"translate3d(-50%,-50%,0)":"none",...a&&{top:-E.height/2,left:-E.width/2,width:E.width,height:E.height},...n},[n,o,a,E,c]),L=C.useMemo(()=>({position:"absolute",pointerEvents:m}),[m]);C.useLayoutEffect(()=>{if(c){var A;(A=D.current)==null||A.render(C.createElement("div",{ref:N,style:J},C.createElement("div",{ref:B,style:L},C.createElement("div",{ref:y,className:r,style:n,children:t}))))}else{var I;(I=D.current)==null||I.render(C.createElement("div",{ref:y,style:J,className:r,children:t}))}});const V=C.useRef(!0);return va(()=>{if(O.current){T.updateMatrixWorld(),O.current.updateWorldMatrix(!0,!1);const A=c?M.current:g(O.current,T,E);if(c||Math.abs(k.current-T.zoom)>e||Math.abs(M.current[0]-A[0])>e||Math.abs(M.current[1]-A[1])>e){const I=I_(O.current,T);let G=!1;typeof f=="boolean"?f===!0&&(G=[x]):Array.isArray(f)&&(G=f.map(P=>P.current));const F=V.current;if(G){const P=M_(O.current,T,S,G);V.current=P&&!I}else V.current=!I;if(F!==V.current&&(d?d(!V.current):U.style.display=V.current?"block":"none"),U.style.zIndex=`${L_(O.current,T,h)}`,c){const[P,j]=[E.width/2,E.height/2],R=T.projectionMatrix.elements[5]*j,{isOrthographicCamera:z,top:q,left:ie,bottom:Q,right:K}=T,Se=R_(T.matrixWorldInverse),xe=z?`scale(${R})translate(${Hs(-(K+ie)/2)}px,${Hs((q+Q)/2)}px)`:`translateZ(${R}px)`;let ee=O.current.matrixWorld;l&&(ee=T.matrixWorldInverse.clone().transpose().copyPosition(ee).scale(O.current.scale),ee.elements[3]=ee.elements[7]=ee.elements[11]=0,ee.elements[15]=1),U.style.width=E.width+"px",U.style.height=E.height+"px",U.style.perspective=z?"":`${R}px`,N.current&&B.current&&(N.current.style.transform=`${xe}${Se}translate(${P}px,${j}px)`,B.current.style.transform=F_(ee,1/((u||10)/400)))}else{const P=u===void 0?1:P_(O.current,T)*u;U.style.transform=`translate3d(${A[0]}px,${A[1]}px,0) scale(${P})`}M.current=A,k.current=T.zoom}}}),C.createElement("group",ya({},p,{ref:O}))});function Lo(t,e="pointer",n="auto"){C.useEffect(()=>{if(t)return document.body.style.cursor=e,()=>void(document.body.style.cursor=n)},[t])}function G_(t){return function(e){t.forEach(function(n){typeof n=="function"?n(e):n!=null&&(n.current=e)})}}const bo=(t,e)=>{const n=t[0].index!==null,r=new Set(Object.keys(t[0].attributes)),i=new Set(Object.keys(t[0].morphAttributes)),o={},a={},s=t[0].morphTargetsRelative,u=new Bf;let l=0;if(t.forEach((c,f)=>{let d=0;if(n!==(c.index!==null))return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+f+". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them."),null;for(let h in c.attributes){if(!r.has(h))return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+f+'. All geometries must have compatible attributes; make sure "'+h+'" attribute exists among all geometries, or in none of them.'),null;o[h]===void 0&&(o[h]=[]),o[h].push(c.attributes[h]),d++}if(d!==r.size)return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+f+". Make sure all geometries have the same number of attributes."),null;if(s!==c.morphTargetsRelative)return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+f+". .morphTargetsRelative must be consistent throughout all geometries."),null;for(let h in c.morphAttributes){if(!i.has(h))return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+f+". .morphAttributes must be consistent throughout all geometries."),null;a[h]===void 0&&(a[h]=[]),a[h].push(c.morphAttributes[h])}if(u.userData.mergedUserData=u.userData.mergedUserData||[],u.userData.mergedUserData.push(c.userData),e){let h;if(c.index)h=c.index.count;else if(c.attributes.position!==void 0)h=c.attributes.position.count;else return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+f+". The geometry must have either an index or a position attribute"),null;u.addGroup(l,h,f),l+=h}}),n){let c=0;const f=[];t.forEach(d=>{const h=d.index;for(let g=0;gq[2]&&(q[2]=Dt),Sn>q[3]&&(q[3]=Sn),qe%B===0&&(tt={start:qe,end:qe,rect:[o,o,-o,-o]},ie.push(tt)),tt.end++;const jt=tt.rect;if(dt