react-sync-board 1.1.4 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -56,7 +56,7 @@ Check the top-level render call using <`+O+">.")}return y}}function nr(i,y){{if(
56
56
  *
57
57
  * This source code is licensed under the MIT license found in the
58
58
  * LICENSE file in the root directory of this source tree.
59
- */var Et;function br(){return Et||(Et=1,process.env.NODE_ENV!=="production"&&function(){typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error);var e=f,t=bt();function r(d,c){return d===c&&(d!==0||1/d===1/c)||d!==d&&c!==c}var n=typeof Object.is=="function"?Object.is:r,o=t.useSyncExternalStore,s=e.useRef,a=e.useEffect,u=e.useMemo,l=e.useDebugValue;function m(d,c,_,b,C){var h=s(null),S;h.current===null?(S={hasValue:!1,value:null},h.current=S):S=h.current;var E=u(function(){var I=!1,w,g,P=function(Y){if(!I){I=!0,w=Y;var N=b(Y);if(C!==void 0&&S.hasValue){var H=S.value;if(C(H,N))return g=H,H}return g=N,N}var T=w,D=g;if(n(T,Y))return D;var A=b(Y);return C!==void 0&&C(D,A)?D:(w=Y,g=A,A)},M=_===void 0?null:_,j=function(){return P(c())},$=M===null?void 0:function(){return P(M())};return[j,$]},[c,_,b,C]),x=E[0],v=E[1],p=o(d,x,v);return a(function(){S.hasValue=!0,S.value=p},[p]),l(p),p}Je.useSyncExternalStoreWithSelector=m,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error)}()),Je}(function(e){process.env.NODE_ENV==="production"?e.exports=Sr():e.exports=br()})(gr);const _r=pe(Ke),{useSyncExternalStoreWithSelector:Er}=_r;function $e(e,t=e.getState,r){const n=Er(e.subscribe,e.getState,e.getServerState||e.getState,t,r);return f.useDebugValue(n),n}const ye=(e,t)=>e.classList&&e.classList.contains(t),Oe=(e,t)=>ye(e,t)?e:e.parentNode?Oe(e.parentNode,t):!1,wt=(e,t)=>e.x>t.left&&e.x<t.left+t.width&&e.y>t.top&&e.y<t.top+t.height,wr=(e,t)=>Array.from(e.querySelectorAll(".corner")).every(n=>{const{top:o,left:s}=n.getBoundingClientRect();return wt({x:s,y:o},t)}),Cr=(e,t)=>{const r=t.getBoundingClientRect();return wr(e,r)},Ze=(e,t)=>{const n=e.getElementsByClassName(`item ${t}`)[0];return n||console.error(`Missing item ${t}`),n},Te=e=>{var r,n;const t=(r=e==null?void 0:e.dataset)==null?void 0:r.id;return t||console.error("getIdFromElem call fails",e,JSON.stringify(e==null?void 0:e.dataset),(n=e==null?void 0:e.dataset)==null?void 0:n.id),t},Ct=(e,t=document)=>{const r=e.reduce((n,o)=>{const s=Ze(t,o);if(!s)return null;const{left:a,right:u,top:l,bottom:m}=s.getBoundingClientRect();let d;return n?d=n:d={left:a,top:l,right:u,bottom:m},d.left=Math.min(a,d.left),d.top=Math.min(l,d.top),d.right=Math.max(u,d.right),d.bottom=Math.max(m,d.bottom),d},null);return r&&(r.width=r.right-r.left,r.height=r.bottom-r.top,r)},xr=({x:e,y:t,width:r,height:n},{type:o="grid",size:s=1,offset:a={x:0,y:0}})=>{const[u,l]=[e+r/2-a.x,t+n/2-a.y];let m,d,c,_,b,C,h,S,E,x;const v=s/1.1547;switch(o){case"grid":m=Math.round(u/s)*s,d=Math.round(l/s)*s;break;case"hexH":c=2*v,_=3*s,b=Math.round(u/c)*c,h=Math.round(l/_)*_,C=b>u?b-v:b+v,S=h>l?h-1.5*s:h+1.5*s,E=Math.hypot(b-u,h-l),x=Math.hypot(C-u,S-l),E<x?(m=b,d=h):(m=C,d=S);break;case"hexV":c=3*s,_=2*v,b=Math.round(u/c)*c,h=Math.round(l/_)*_,C=b>u?b-1.5*s:b+1.5*s,S=h>l?h-v:h+v,E=Math.hypot(b-u,h-l),x=Math.hypot(C-u,S-l),E<x?(m=b,d=h):(m=C,d=S);break;default:m=e+r/2,d=t+n/2}return{x:m+a.x-r/2,y:d+a.y-n/2}},xt=["#037758","#99092a","#067070","#c6650f","#008726","#3d7004","#348402","#057f58","#b58612","#c44c01","#0a7704","#0e910e","#027377","#c99e02","#054160","#157a01","#b10de2","#0d6289","#bc5d03","#ba0cd1","#d39f10","#0c4c7a","#460782","#a51f10","#cecb10","#9b0943","#607f0c","#007a4b","#bf0daa","#af0ad8"],It=()=>xt[Math.floor(Math.random()*xt.length)],Ir=!1,Qe=({wire:e,storeName:t,noSync:r=[],defaultValue:n},o)=>(s,a,u)=>{s({ready:!1});const l=[];(async()=>{try{const b=await e.call(`${t}_getValue`);Ir&&console.log("init from peer with value",b),s(C=>({...C,...b}))}catch{n!==void 0&&s(n)}l.push(await e.register(`${t}_getValue`,()=>Object.fromEntries(Object.entries(a()).filter(([b,C])=>typeof C!="function"&&!r.includes(b))),{invoke:"first"})),l.push(e.subscribe(`${t}_call`,([b,C])=>{c[b](...C)})),s({ready:!0})})();const d=o(s,a,u),c={...d},_=Object.fromEntries(Object.entries(d).map(([b,C])=>typeof C=="function"&&!b.startsWith("get")&&!r.includes(b)?[b,(...S)=>{const E=C(...S);return e.publish(`${t}_call`,[b,S]),E}]:[b,C]));return _.unsub=()=>{l.forEach(b=>b())},_};function Ae(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[n,o]of e)if(!Object.is(o,t.get(n)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let n=0;n<r.length;n++)if(!Object.prototype.hasOwnProperty.call(t,r[n])||!Object.is(e[r[n]],t[r[n]]))return!1;return!0}const Ot=f.createContext(),Or=(e,t)=>({items:{},getItems:()=>t().items,setItems:r=>e({items:r}),updateItems:r=>e(n=>({items:{...n.items,...r}})),moveItems:(r,n)=>e(({items:o})=>{const s={...o};return r.forEach(a=>{const u=o[a];u&&(s[a]={...u,x:(u.x||0)+n.x,y:(u.y||0)+n.y,moving:!0})}),{items:s}})}),Tr=(e,t)=>({itemIds:[],setItemIds:r=>e({itemIds:r}),getItemIds:()=>t().itemIds,insert:(r,n)=>e(o=>{const s=[...o.itemIds];return s.splice(r,0,n),{itemIds:s}}),remove:r=>e(n=>{const o=[...n.itemIds];return o.splice(r,1),{itemIds:o}}),updateItemIds:(r,n)=>e(o=>{const s=[...o.itemIds];return s[r]=n,{items:s}}),updateManyItemIds:r=>e(n=>({items:n.itemIds.map((o,s)=>r[s]!==void 0?r[s]:o)}))}),kr=(e,t)=>({removeItemsById:r=>e(n=>({itemIds:n.itemIds.filter(o=>!r.includes(o)),items:Object.fromEntries(Object.entries(n.items).filter(([o])=>!r.includes(o)))})),getItemList:()=>{const r=t().items;return t().itemIds.map(n=>r[n])},setItemList:r=>e({items:Object.fromEntries(r.map(n=>[n.id,n])),itemIds:r.map(({id:n})=>n)}),insertItems:(r,n)=>e(o=>{let s;const a=r.map(({id:u})=>u);if(n){const u=o.itemIds.findIndex(l=>l===n);s=[...o.itemIds],s.splice(u,0,...a)}else s=[...o.itemIds,...a];return{items:{...o.items,...Object.fromEntries(r.map(u=>[u.id,u]))},itemIds:s}})}),Pr=(e,t)=>({boardConfig:{},getBoardConfig:()=>t().boardConfig,setBoardConfig:r=>e({boardConfig:r}),updateBoardConfig:r=>e(n=>({boardConfig:{...n.boardConfig,...r}}))}),Mr=(e,t)=>({session:{},getSessionInfo:()=>t().session,setSessionInfo:r=>e({session:r}),updateSessionInfo:r=>e(n=>({session:{...n.session,...r}}))}),Tt=({storeName:e,children:t,defaultValue:r})=>{const{wire:n}=Ie("room"),[o,s]=f.useState(!1),[a]=f.useState(()=>Re(Qe({wire:n,storeName:e,defaultValue:r},(...u)=>({...Or(...u),...Tr(...u),...kr(...u),...Pr(...u),...Mr(...u)}))));return console.log(a),f.useEffect(()=>{const u=a.subscribe(l=>{l.ready&&(u(),s(!0))})},[a]),o?k(Ot.Provider,{value:a,children:t}):null},ie=(e,t)=>{const r=f.useContext(Ot);return $e(r,e,t||Ae)},jr=()=>{const[e,t]=ie(n=>[n.itemIds,n.items]);return f.useMemo(()=>e.map(n=>t[n]),[e,t])},Rr=()=>{const[e,t,r]=ie(a=>[a.items,a.itemIds,a.getItemList]),[n,o]=f.useState(r()),[,s]=f.useTransition();return f.useEffect(()=>{const a=r();s(()=>{o(a)})},[e,t,r]),n},kt=5e4,Pt=f.createContext(),Dr=(e,t)=>({config:{itemTemplates:{},actions:{},uid:null,itemExtent:{},boardWrapperRect:{},boardSize:kt},updateConfiguration:r=>e(n=>({config:{...n.config,...r}})),getConfiguration:()=>t().config}),$r=(e,t)=>({boardState:{movingItems:!1,selecting:!1,zooming:!1,panning:!1,translateX:0,translateY:0,scale:1},updateBoardState:r=>e(n=>({boardState:{...n.boardState,...r}})),getBoardState:()=>t().boardState}),Ar=(e,t)=>({interactions:{},getInteractions:()=>t().interactions,register:(r,n)=>e(o=>{const s=[...o.interactions[r]||[]];return s.push(n),{interactions:{...o.interaction,[r]:s}}}),unregister:(r,n)=>e(o=>{const s=(o.interactions[r]||[]).filter(a=>a!==n);return{interactions:{...o.interaction,[r]:s}}}),callInteractions:(r,n)=>{t().interactions[r]&&t().interactions[r].forEach(o=>{o(n)})}}),Lr=(e,t)=>({selection:[],setSelection:r=>e(n=>JSON.stringify(n.selection)!==JSON.stringify(r)?{selection:r}:{}),getSelection:()=>t().selection,select:r=>e(n=>({selection:[...n.selection,...r]})),unselect:r=>e(n=>({selection:n.selection.filter(o=>!r.includes(o))})),clear:()=>e(r=>r.selection.length>0?{selection:[]}:{}),reverse:()=>e(r=>{const n=[...r.selection];return n.reverse(),{selection:n}}),selectionBox:null,setSelectionBox:r=>e(n=>{const o=n.selectionBox;return!o||!r||o.top!==r.top||o.left!==r.left||o.width!==r.width||o.height!==r.height?{selectionBox:r}:{}})}),Mt=({children:e})=>{const[t]=f.useState(()=>Re((...r)=>({...Dr(...r),...$r(...r),...Ar(...r),...Lr(...r)})));return k(Pt.Provider,{value:t,children:e})},Q=(e,t)=>{const r=f.useContext(Pt);return $e(r,e,t||Ae)},zr=()=>{const[e]=Q(t=>[t.selection]);return e};function et(e){const t=f.useRef(e);return t.current=e,f.useMemo(()=>Object.freeze({get current(){return t.current}}),[])}function Br(e){const t=et(e);f.useEffect(()=>()=>{t.current()},[])}function tt(e,t,r,n=0){const o=f.useRef(),s=f.useRef(),a=f.useRef(),u=()=>{o.current&&(clearTimeout(o.current),o.current=void 0),s.current&&(clearTimeout(s.current),s.current=void 0)};return Br(u),f.useMemo(()=>{const l=()=>{if(!a.current)return;const d=a.current;a.current=void 0,e.apply(d.this,d.args),u()},m=function(...d){o.current&&clearTimeout(o.current),a.current={args:d,this:this},o.current=setTimeout(l,r),n>0&&!s.current&&(s.current=setTimeout(l,n))};return Object.defineProperties(m,{length:{value:e.length},name:{value:`${e.name||"anonymous"}__debounced__${r}`}}),m},[r,n,...t])}const Le=100,Se=1e3,Yr=.8,jt=({x:e,y:t,scale:r,itemExtent:{right:n,left:o,top:s,bottom:a},boardWrapperRect:u,boardSize:l})=>{const m={left:-n*r+Le*r,right:u.width-o*r-Le*r,top:-a*r+Le*r,bottom:u.height-s*r-Le*r,maxRight:u.width-l*r,maxLeft:u.height-l*r},d=Math.min(Math.max(e,m.left,m.maxRight),m.right,0),c=Math.min(Math.max(t,m.top,m.maxLeft),m.bottom,0);return[d,c]},ze=()=>{const[e,t,r,n,o]=Q(h=>[h.getBoardState,h.updateBoardState,h.config.itemExtent,h.getConfiguration,h.updateConfiguration]),s=f.useRef([.1,8]),[a]=ie(h=>[h.getItemList]),u=f.useCallback(()=>{const{translateX:h,translateY:S,scale:E}=e();return{translateX:h,translateY:S,scale:E}},[e]),l=f.useCallback(h=>{const{itemExtent:S,boardWrapperRect:E,boardSize:x}=n(),v=e(),{translateX:p,translateY:I,scale:w}={...v,...h(v)};let g=w;w!==v.scale&&(g>s.current[1]&&([,g]=s.current),g<s.current[0]&&([g]=s.current));let[P,M]=[p,I];(p!==v.translateX||I!==v.translateY)&&([P,M]=jt({x:p,y:I,scale:g,itemExtent:S,boardWrapperRect:E,boardSize:x})),t({translateX:P,translateY:M,scale:g})},[e,n,t]),m=f.useCallback((h,S)=>{const{itemExtent:E,boardWrapperRect:x,boardSize:v}=n();let p=S;p||(p={x:x.width/2,y:x.height/2});const I=e();let w=I.scale*h;w>s.current[1]&&([,w]=s.current),w<s.current[0]&&([w]=s.current);const g=p.x-x.left,P=p.y-x.top,M=g-(g-I.translateX)*w/I.scale,j=P-(P-I.translateY)*w/I.scale,[$,Y]=jt({x:M,y:j,scale:w,itemExtent:E,boardWrapperRect:x,boardSize:v});t({scale:w,translateX:$,translateY:Y})},[e,n,t]),d=f.useCallback(({left:h,top:S,width:E,height:x})=>{const{boardWrapperRect:v}=n(),p=v.width/E,I=v.height/x,g=Math.min(p,I)*Yr,P=v.width/2-(h+E/2)*g,M=v.height/2-(S+x/2)*g;t({translateX:P,translateY:M,scale:g})},[n,t]),c=f.useCallback(async()=>{const{itemExtent:{width:h,height:S},boardWrapperRect:E}=n(),x=E.width/h,v=E.height/S,p=Math.min(x,v);s.current=[Math.max(p*.5,.05),Math.max(p*10,10)]},[n]),_=f.useCallback(()=>{const{boardWrapperRect:h,boardSize:S}=n(),{translateX:E,translateY:x,scale:v}=e();return{x:(h.width/2-E)/v-S/2,y:(h.height/2-x)/v-S/2}},[e,n]),b=f.useCallback(()=>{const h=a(),{boardWrapperRect:S,boardWrapper:E,boardSize:x}=n(),{scale:v,translateX:p,translateY:I}=e(),{left:w,top:g,width:P,height:M}=Ct(h.map(({id:$})=>$),E)||{left:x/2*v+S.left+p,top:x/2*v+S.top+I,width:0,height:0},j={left:(w-S.left-p)/v,top:(g-S.top-I)/v,width:P/v,height:M/v};if(j.right=j.left+j.width,j.bottom=j.top+j.height,j.width<Se){const $=(Se-j.width)/2;j.left-=$,j.right+=$,j.width=Se}if(j.height<Se){const $=(Se-j.height)/2;j.top-=$,j.bottom+=$,j.height=Se}o({itemExtent:j})},[e,n,a,o]),C=tt(()=>b(),[b],200);return f.useEffect(()=>{r.left&&c()},[c,r]),{setDim:l,getDim:u,zoomTo:m,zoomToCenter:m,zoomToExtent:d,getCenter:_,updateItemExtent:C}},Rt=e=>{const[t,r,n]=Q(({register:a,unregister:u,callInteractions:l})=>[a,u,l]),o=f.useCallback(a=>(t(e,a),()=>{r(e,a)}),[e,t,r]),s=f.useCallback(a=>{n(e,a)},[n,e]);return{register:o,call:s}},Be=()=>{const{call:e}=Rt("place"),{getCenter:t,updateItemExtent:r}=ze(),[n,o,s,a]=Q(T=>[T.clear,T.reverse,T.unselect,T.getConfiguration]),{getItems:u,getItemIds:l,setItemIds:m,updateItems:d,moveItems:c,removeItemsById:_,getItemList:b,insertItems:C,setItemList:h}=ie(({getItems:T,getItemIds:D,setItemIds:A,updateItems:W,moveItems:z,removeItemsById:K,getItemList:G,insertItems:re,setItemList:ne})=>({getItems:T,getItemIds:D,setItemIds:A,updateItems:W,moveItems:z,removeItemsById:K,getItemList:G,insertItems:re,setItemList:ne})),S=f.useCallback((T,D)=>{let A=D;typeof D=="object"&&(A=()=>D);const W=l().filter(G=>T.includes(G)),z=u(),K=Object.fromEntries(W.map(G=>[G,A({...z[G]})]));d(K),r()},[l,u,r,d]),E=f.useCallback(T=>{h(T),n(),r()},[n,h,r]),x=f.useCallback((T,D)=>{S([T],D)},[S]),v=f.useCallback((T,D)=>{c(T,D),r()},[c,r]),p=f.useCallback(T=>{const D=l(),A=D.filter(z=>!T.includes(z)),W=D.filter(z=>T.includes(z));m([...A,...W])},[l,m]),I=f.useCallback((T,{type:D,size:A}={})=>{const{boardWrapper:W}=a(),z={},K=u();T.forEach(G=>{const re=K[G],ne=Ze(W,G);if(!ne)return;const oe={type:D||"grid",size:A||1,offset:{x:0,y:0},...re.grid},F=xr({x:re.x,y:re.y,width:ne.clientWidth,height:ne.clientHeight},oe);z[G]={...re,...F}}),d(z)},[a,u,d]),w=f.useCallback((T,D)=>{p(T),S(T,A=>{const W={...A};return delete W.moving,W}),I(T,D),e(T),r()},[S,e,p,I,r]),g=f.useCallback(T=>{m(T)},[m]),P=f.useCallback(T=>{const D=l(),A=D.filter(z=>T.includes(z)),W=D.map(z=>T.includes(z)?A.pop():z);m(W),o()},[l,o,m]),M=f.useCallback((T,D)=>{const A=u(),W=T.map(F=>A[F]),z=D.map(F=>A[F]),K=D.reduce((F,te)=>(F[te]=W.shift(),F),{}),G=z.reduce((F,te)=>{const me=K[te.id],be={...te,x:me.x,y:me.y};return F[te.id]=be,F},{});d(G);const re=T.reduce((F,te)=>(F[te]=D.shift(),F),{}),oe=l().map(F=>T.includes(F)?re[F]:F);m(oe)},[u,d,l,m]),j=f.useCallback((T,D)=>{const A=t(),W=T.map((z,K)=>!z.x||!z.y?{...z,x:A.x+2*K,y:A.y+2*K}:z);C(W,D),r()},[t,C,r]),$=f.useCallback((T,D)=>{j([T],D)},[j]),Y=f.useCallback(T=>{s(T),_(T)},[s,_]),N=f.useCallback(T=>{const D=u();return T.map(A=>D[A])},[u]),H=f.useCallback(({target:T,clientX:D,clientY:A},{returnLocked:W=!1,passLocked:z=!1}={})=>{if(["INPUT","TEXTAREA"].includes(T.tagName))return null;const K=Oe(T,"item");if(K){if(ye(K,"selected"))return K;if(!z&&ye(K,"locked")&&!ye(T,"passthrough"))return W?K:null;if(ye(T,"passthrough")){const G=l(),{boardWrapper:re}=a(),ne=G.reduce((oe,F)=>{const te=Ze(re,F),me=te.getBoundingClientRect();return wt({x:D,y:A},me)&&oe.unshift(te),oe},[]);for(let oe=0;oe<ne.length;oe+=1){const F=ne[oe];if(F!==K&&(z||!ye(F,"locked")))return F}return null}}return K},[a,l]);return{putItemsOnTop:p,batchUpdateItems:S,updateItemOrder:g,moveItems:v,placeItems:w,updateItem:x,swapItems:M,reverseItemsOrder:P,setItemList:E,pushItem:$,pushItems:j,removeItems:Y,getItemList:b,findElementUnderPointer:H,getItems:N}};var Nr=function e(t,r){if(t===r)return!0;if(t&&r&&typeof t=="object"&&typeof r=="object"){if(t.constructor!==r.constructor)return!1;var n,o,s;if(Array.isArray(t)){if(n=t.length,n!=r.length)return!1;for(o=n;o--!==0;)if(!e(t[o],r[o]))return!1;return!0}if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(o of t.entries())if(!r.has(o[0]))return!1;for(o of t.entries())if(!e(o[1],r.get(o[0])))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(o of t.entries())if(!r.has(o[0]))return!1;return!0}if(ArrayBuffer.isView(t)&&ArrayBuffer.isView(r)){if(n=t.length,n!=r.length)return!1;for(o=n;o--!==0;)if(t[o]!==r[o])return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if(s=Object.keys(t),n=s.length,n!==Object.keys(r).length)return!1;for(o=n;o--!==0;)if(!Object.prototype.hasOwnProperty.call(r,s[o]))return!1;for(o=n;o--!==0;){var a=s[o];if(!e(t[a],r[a]))return!1}return!0}return t!==t&&r!==r};function Ur(e,t,r,n=0){f.useEffect(tt(e,t,r,n),t)}const Xr=(e,t)=>{if(e.type in t){const r=t[e.type].defaultActions;return typeof r=="function"?r(e):r}return[]},Dt=(e,t)=>{const{actions:r=Xr(e,t)}=e;return r.map(n=>typeof n=="string"?{name:n}:n)},Wr=()=>{const[e,t]=ie(c=>[c.items,c.getItems]),[r,n,o]=Q(c=>[c.config.itemTemplates,c.selection,c.getSelection]),[s,a]=f.useState([]),u=f.useRef(!1),[,l]=f.useTransition();f.useEffect(()=>(u.current=!0,()=>{u.current=!1}),[]);const m=f.useCallback(c=>{const _=t();if(c)return[c,c.map(C=>_[C])];const b=o();return[b,b.map(C=>_[C])]},[t,o]),d=f.useCallback(()=>{const[c,_]=m();if(c.length>0){if(!u.current)return;const b=_.reduce((C,h)=>{const S=Dt(h,r);return C.filter(E=>S.some(x=>Nr(E,x)))},Dt(_[0],r));l(()=>{a(b)})}else l(()=>{a([])})},[m,r]);return Ur(()=>d(),[e,n,d],100),{availableActions:s}},Vr=()=>{const[e]=Q(t=>[t.selectionBox]);return e};let ge=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,r)=>(r&=63,r<36?t+=r.toString(36):r<62?t+=(r-26).toString(36).toUpperCase():r>62?t+="-":t+="_",t),"");const $t=f.createContext(),rt=e=>{localStorage.setItem("user",JSON.stringify(e))},Fr=()=>{if(localStorage.user){const t={name:"Player",color:It(),uid:ge(),...JSON.parse(localStorage.user)};return rt(t),t}const e={name:"Player",color:It(),uid:ge()};return rt(e),e},Kr=e=>(t,r)=>({isSpaceMaster:!1,users:{},getUser:()=>r().users[e],getUsers:()=>r().users,getUserList:()=>Object.values(r().users),getLocalUsers:()=>{if(!r().users[e])return[];const{space:n}=r().users[e];return r().getUserList().filter(({space:o})=>o===n)},addUser:n=>t(o=>({users:{...o.users,[n.id]:n}})),updateUser:(n,o)=>t(s=>{if(!s.users[n])return{};const a={...s.users[n],...o,id:n,uid:s.users[n].uid};return a.id===e&&rt(a),setTimeout(()=>r().electSpaceMaster(),100),{users:{...s.users,[n]:a}}}),removeUser:n=>t(o=>{const s={...o.users};return delete s[n],setTimeout(()=>r().electSpaceMaster(),100),{users:s}}),updateCurrentUser:n=>r().updateUser(e,n),joinSpace:n=>r().updateUser(e,{space:n,spaceJoinedTimestamp:Date.now()}),electSpaceMaster:()=>{const n=r().getLocalUsers(),o={uid:null,timestamp:Date.now()};Object.values(n).forEach(({spaceJoinedTimestamp:s,id:a})=>{s<o.timestamp&&(o.id=a,o.timestamp=s)}),t({isSpaceMaster:o.id===e})}}),Hr=e=>({cursors:{},moveCursor:(t,r)=>e(n=>({cursors:{...n.cursors,[t]:r}})),removeCursor:t=>e(r=>{const n={...r.cursors};return delete n[t],{cursors:n}})}),At=({storeName:e,children:t})=>{const{wire:r,isMaster:n}=Ie("room"),[o,s]=f.useState(null),[a,u]=f.useState(!1),l=f.useRef(!1);return f.useEffect(()=>{let m=!0;const d=[];if(!o&&!l.current)return l.current=!0,(()=>{const _=Re(Qe({wire:r,storeName:e,noSync:["updateCurrentUser","joinSpace","isSpaceMaster","electSpaceMaster"]},(...C)=>({...Kr(r.userId)(...C),...Hr(...C)}))),b=_.subscribe(C=>{C.ready&&(b(),m&&s(_))})})(),()=>{m=!1,l.current=!1,d.forEach(_=>_())}},[o,e,r,r.userId]),f.useEffect(()=>{if(o)return o.getState().addUser({...Fr(),id:r.userId}),u(!0),()=>{o.getState().removeUser(r.userId)}},[n,o,r]),f.useEffect(()=>{if(o){const m=r.subscribe("userLeave",d=>{o.getState().removeUser(d)});return()=>{m()}}},[n,o,r]),f.useEffect(()=>{n&&o&&o.getState().updateCurrentUser({isMaster:n})},[n,o,r]),a?k($t.Provider,{value:o,children:t}):null},he=(e,t)=>{const r=f.useContext($t);return $e(r,e,t||Ae)},qr=()=>{const[e,t,r,n,o]=he(u=>[u.isSpaceMaster,u.getUser(),u.users,u.updateCurrentUser,u.joinSpace]),s=f.useMemo(()=>Object.values(r),[r]),a=f.useMemo(()=>{const{space:u}=t;return s.filter(({space:l})=>l===u)},[t,s]);return{isSpaceMaster:e,currentUser:t,updateCurrentUser:n,users:s,localUsers:a,joinSpace:o}},Gr=()=>{const[e,t,r]=ie(o=>[o.boardConfig,o.getBoardConfig,o.setBoardConfig]),n=f.useCallback(o=>{let s=o;typeof o=="object"&&(s=()=>o);const a=t(),u=s(a);r(u)},[t,r]);return[e,n]},Jr=()=>{const[e]=Q(t=>[t.boardState]);return e},Zr=()=>{const[e,t,r,n]=ie(o=>[o.getSessionInfo,o.setSessionInfo,o.updateSessionInfo,o.session]);return{getSessionInfo:e,setSessionInfo:t,sessionInfo:n,updateSessionInfo:r}},Lt=f.createContext(),Qr=({user:{name:e,uid:t,color:r},content:n})=>({type:"message",user:{name:e,uid:t,color:r},content:n,uid:ge(),timestamp:new Date().toISOString()}),en=(e,t)=>({messages:[],setMessages:r=>e({messages:r.map(n=>({...n,timestamp:Date.parse(n.timestamp)}))}),addMessage:r=>e(n=>({messages:[...n.messages,{...r,timestamp:Date.parse(r.timestamp)}]})),sendMessage:(r,n)=>{const o=Qr({user:r,content:n});o&&t().addMessage(o)}}),zt=({storeName:e,children:t,defaultValue:r=[]})=>{const{wire:n}=Ie("room"),[o]=f.useState(()=>Re(Qe({wire:n,storeName:e,defaultValue:r,noSync:["sendMessage"]},(...s)=>({...en(...s)}))));return k(Lt.Provider,{value:o,children:t})},tn=(e,t)=>{const r=f.useContext(Lt);return $e(r,e,t||Ae)},rn=()=>{},nn=(e=rn)=>{const t=he(a=>a.getUser()),[r,n,o]=tn(a=>[a.messages,a.setMessages,a.sendMessage]);f.useEffect(()=>{r.length&&e()},[r,e]);const s=f.useCallback(a=>{o(t,a)},[t,o]);return{messages:r,setMessages:n,sendMessage:s}},Bt=({children:e,session:t})=>{const r=he(n=>n.joinSpace);return f.useEffect(()=>(r(t),()=>{r(null)}),[r,t]),e},on=({socket:e,room:t,session:r,items:n=[],messages:o=[],LoadingComponent:s,...a})=>{const[u]=f.useState(t||ge()),[l]=f.useState(r||ge()),[m]=f.useState(()=>({itemIds:n.map(({id:c})=>c),items:Object.fromEntries(n.map(c=>[c.id,c]))}));return Ie("room")?k(zt,{storeName:`${l}_messages`,defaultValue:o,children:k(Mt,{children:k(Tt,{storeName:`${l}_item`,defaultValue:m,children:k(Bt,{...a,session:l})})})}):k(gt,{room:u,channel:"room",socket:e,LoadingComponent:s,children:k(At,{storeName:`${u}_users`,children:k(zt,{storeName:`${l}_messages`,defaultValue:o,children:k(Mt,{children:k(Tt,{storeName:`${l}_item`,defaultValue:m,children:k(Bt,{...a,session:l})})})})})})},sn=({socket:e,room:t,children:r,LoadingComponent:n})=>{const[o]=f.useState(t||ge());return k(gt,{room:o,channel:"room",socket:e,LoadingComponent:n,children:k(At,{storeName:`${o}_users`,children:r})})},nt=()=>{const e=navigator.userAgent.toLowerCase();return/mac os ?x 10/.test(e)},an=(()=>{const e=document.createElement("iframe");e.src="#",document.body.appendChild(e);const t=e.contentWindow.document;t.open(),t.write("<!DOCTYPE html><html><head></head><body><span>a</span></body></html>"),t.close();const r=t.body.firstElementChild.offsetHeight;return document.body.removeChild(e),r})(),cn=800,Yt=(e,t)=>{const r=Object.keys(e).map(n=>Number(n)).find(n=>n!==t);return e[r]},Nt=([e,t],[r,n])=>{const o=Math.abs(e-r),s=Math.abs(t-n);return Math.hypot(o,s)},ve=()=>{},un=e=>t=>{const{event:r}=t;return r.isPropagationStopped()?null:e(t)},ln=e=>async(...t)=>{try{await e(...t)}catch(r){console.error(r)}};class fn{constructor(){ar(this,"lastPromise",Promise.resolve(!0))}add(t,...r){return new Promise((n,o)=>{this.lastPromise=this.lastPromise.then(()=>un(ln(t))(...r)).then(n).catch(o)})}}const ae=new fn,Ye=({children:e,onDrag:t=ve,onDragStart:r=ve,onDragEnd:n=ve,onPan:o=ve,onTap:s=ve,onLongTap:a=ve,onDoubleTap:u=ve,onZoom:l,mainAction:m="drag"})=>{const d=f.useRef(null),c=f.useRef({moving:!1,pointers:{},mainPointer:void 0}),_=E=>{const{deltaX:x,deltaY:v,clientX:p,clientY:I,deltaMode:w,ctrlKey:g,altKey:P,metaKey:M,target:j}=E;if(!(P||g&&!nt()))if(nt()&&!g)ae.add(o,{deltaX:-2*x,deltaY:-2*v,button:1,ctrlKey:g,metaKey:M,target:j,event:E});else{if(l===void 0||!v)return;let $=v;switch(w){case 1:$*=an;break;case 2:$*=cn;break}nt()&&($*=2),ae.add(l,{scale:$,clientX:p,clientY:I,event:E})}},b=E=>{const{target:x,button:v,clientX:p,clientY:I,pointerId:w,altKey:g,ctrlKey:P,metaKey:M,isPrimary:j}=E;if(c.current.pointers[w]={clientX:p,clientY:I},j&&(c.current.mainPointer=void 0),c.current.mainPointer!==void 0){if(c.current.mainPointer!==w)try{const{clientX:$,clientY:Y}=Yt(c.current.pointers,w),N=($+p)/2,H=(Y+I)/2,T=Nt([$,Y],[p,I]);Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:I,prevX:N,prevY:H,startDistance:T,prevDistance:T})}catch($){console.log("Error while getting other pointer. Ignoring",$),c.current.mainPointer}return}c.current.mainPointer=w,Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:I,prevX:p,prevY:I,currentButton:v,pointerDownEvent:E,target:x,timeStart:Date.now(),longTapTimeout:setTimeout(async()=>{c.current.noTap=!0,ae.add(a,{clientX:p,clientY:I,altKey:g,ctrlKey:P,metaKey:M,target:x,event:E})},750)});try{x.setPointerCapture(w)}catch($){console.log("Fail to capture pointer",$)}},C=E=>{if(c.current.pressed){const{pointerId:x,clientX:v,clientY:p,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,buttons:M,pointerType:j}=E;c.current.pointers[x]={clientX:v,clientY:p},c.current.moving=!0;const $=Object.keys(c.current.pointers).length===2;let Y,N,H;if($){const{clientX:W,clientY:z}=Yt(c.current.pointers,x);Y=(W+v)/2,N=(z+p)/2,H=Nt([W,z],[v,p])}else Y=v,N=p;let T=w||I||g||P||M!==1;m!=="drag"&&(T=!T);const D=!T,A=T;if(D){c.current.gestureStart||(d.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout),ae.add(r,{deltaX:0,deltaY:0,startX:c.current.startX,startY:c.current.startY,clientX:c.current.startX,clientY:c.current.startY,distanceX:0,distanceY:0,button:c.current.currentButton,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,target:c.current.target,event:c.current.pointerDownEvent}));const W=Y-c.current.prevX,z=N-c.current.prevY,K=Y-c.current.startX,G=N-c.current.startY;ae.add(t,{deltaX:W,deltaY:z,startX:c.current.startX,startY:c.current.startY,clientX:Y,clientY:N,distanceX:K,distanceY:G,button:c.current.currentButton,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,target:c.current.target,event:E})}if(A){c.current.gestureStart||(d.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout));const W=Y-c.current.prevX,z=N-c.current.prevY,{target:K}=c.current;if(ae.add(o,{deltaX:W,deltaY:z,button:c.current.currentButton,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,target:K,event:E}),H!==c.current.prevDistance&&l){const G=c.current.prevDistance-H;Math.abs(G)>0&&(ae.add(l,{scale:G*3,clientX:Y,clientY:N,event:E}),c.current.prevDistance=H)}}c.current.prevX=Y,c.current.prevY=N}},h=E=>{const{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P,pointerId:M}=E;if(c.current.pointers[M]&&(delete c.current.pointers[M],c.current.mainPointer===M)){for(;Object.keys(c.current.pointers).length>0;){c.current.mainPointer=Number(Object.keys(c.current.pointers)[0]);try{c.current.target.setPointerCapture(c.current.mainPointer);return}catch(j){console.log("Fails to set pointer capture",j),c.current.mainPointer=void 0,delete c.current.pointers[Object.keys(c.current.pointers)[0]]}}if(c.current.mainPointer=void 0,c.current.pressed=!1,clearTimeout(c.current.longTapTimeout),c.current.moving)c.current.moving=!1,ae.add(n,{deltaX:x-c.current.prevX,deltaY:v-c.current.prevY,startX:c.current.startX,startY:c.current.startY,clientX:x,clientY:v,distanceX:x-c.current.startX,distanceY:v-c.current.startY,button:c.current.currentButton,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,event:E}),d.current.style.cursor="auto";else{const j=Date.now();c.current.noTap?c.current.noTap=!1:c.current.timeStart-j<300&&ae.add(s,{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P,event:E})}}};return k("div",{onWheel:_,onPointerDown:b,onPointerMove:C,onPointerUp:h,onPointerOut:h,onPointerLeave:h,onPointerCancel:h,onDoubleClick:E=>{const{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P}=E;ae.add(u,{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P,event:E})},style:{touchAction:"none"},ref:d,children:e})},ot=({onResize:e,...t})=>{const[r]=Q(o=>[o.getBoardState]);return k(Ye,{onDrag:({deltaX:o,deltaY:s,event:a})=>{a.stopPropagation();const{scale:u}=r();e({width:o/u,height:s/u})},children:k("div",{...t})})};let dn={data:""},mn=e=>typeof window=="object"?((e?e.querySelector("#_goober"):window._goober)||Object.assign((e||document.head).appendChild(document.createElement("style")),{innerHTML:" ",id:"_goober"})).firstChild:e||dn,pn=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,gn=/\/\*[^]*?\*\/| +/g,Ut=/\n+/g,de=(e,t)=>{let r="",n="",o="";for(let s in e){let a=e[s];s[0]=="@"?s[1]=="i"?r=s+" "+a+";":n+=s[1]=="f"?de(a,s):s+"{"+de(a,s[1]=="k"?"":t)+"}":typeof a=="object"?n+=de(a,t?t.replace(/([^,])+/g,u=>s.replace(/(^:.*)|([^,])+/g,l=>/&/.test(l)?l.replace(/&/g,u):u?u+" "+l:l)):s):a!=null&&(s=/^--/.test(s)?s:s.replace(/[A-Z]/g,"-$&").toLowerCase(),o+=de.p?de.p(s,a):s+":"+a+";")}return r+(t&&o?t+"{"+o+"}":o)+n},ue={},Xt=e=>{if(typeof e=="object"){let t="";for(let r in e)t+=r+Xt(e[r]);return t}return e},hn=(e,t,r,n,o)=>{let s=Xt(e),a=ue[s]||(ue[s]=(l=>{let m=0,d=11;for(;m<l.length;)d=101*d+l.charCodeAt(m++)>>>0;return"go"+d})(s));if(!ue[a]){let l=s!==e?e:(m=>{let d,c,_=[{}];for(;d=pn.exec(m.replace(gn,""));)d[4]?_.shift():d[3]?(c=d[3].replace(Ut," ").trim(),_.unshift(_[0][c]=_[0][c]||{})):_[0][d[1]]=d[2].replace(Ut," ").trim();return _[0]})(e);ue[a]=de(o?{["@keyframes "+a]:l}:l,r?"":"."+a)}let u=r&&ue.g?ue.g:null;return r&&(ue.g=ue[a]),((l,m,d,c)=>{c?m.data=m.data.replace(c,l):m.data.indexOf(l)===-1&&(m.data=d?l+m.data:m.data+l)})(ue[a],t,n,u),a},vn=(e,t,r)=>e.reduce((n,o,s)=>{let a=t[s];if(a&&a.call){let u=a(r),l=u&&u.props&&u.props.className||/^go/.test(u)&&u;a=l?"."+l:u&&typeof u=="object"?u.props?"":de(u,""):u===!1?"":u}return n+o+(a??"")},"");function q(e){let t=this||{},r=e.call?e(t.p):e;return hn(r.unshift?r.raw?vn(r,[].slice.call(arguments,1),t.p):r.reduce((n,o)=>Object.assign(n,o&&o.call?o(t.p):o),{}):r,mn(t.target),t.g,t.o,t.k)}q.bind({g:1}),q.bind({k:1});function yn(e,t,r,n){de.p=t}var Sn=function e(t,r){if(t===r)return!0;if(t&&r&&typeof t=="object"&&typeof r=="object"){if(t.constructor!==r.constructor)return!1;var n,o,s;if(Array.isArray(t)){if(n=t.length,n!=r.length)return!1;for(o=n;o--!==0;)if(!e(t[o],r[o]))return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if(s=Object.keys(t),n=s.length,n!==Object.keys(r).length)return!1;for(o=n;o--!==0;)if(!Object.prototype.hasOwnProperty.call(r,s[o]))return!1;for(o=n;o--!==0;){var a=s[o];if(!e(t[a],r[a]))return!1}return!0}return t!==t&&r!==r};const bn=q`
59
+ */var Et;function br(){return Et||(Et=1,process.env.NODE_ENV!=="production"&&function(){typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error);var e=f,t=bt();function r(d,c){return d===c&&(d!==0||1/d===1/c)||d!==d&&c!==c}var n=typeof Object.is=="function"?Object.is:r,o=t.useSyncExternalStore,s=e.useRef,a=e.useEffect,u=e.useMemo,l=e.useDebugValue;function m(d,c,_,b,C){var h=s(null),S;h.current===null?(S={hasValue:!1,value:null},h.current=S):S=h.current;var E=u(function(){var I=!1,w,g,P=function(Y){if(!I){I=!0,w=Y;var N=b(Y);if(C!==void 0&&S.hasValue){var H=S.value;if(C(H,N))return g=H,H}return g=N,N}var T=w,D=g;if(n(T,Y))return D;var A=b(Y);return C!==void 0&&C(D,A)?D:(w=Y,g=A,A)},M=_===void 0?null:_,j=function(){return P(c())},$=M===null?void 0:function(){return P(M())};return[j,$]},[c,_,b,C]),x=E[0],v=E[1],p=o(d,x,v);return a(function(){S.hasValue=!0,S.value=p},[p]),l(p),p}Je.useSyncExternalStoreWithSelector=m,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error)}()),Je}(function(e){process.env.NODE_ENV==="production"?e.exports=Sr():e.exports=br()})(gr);const _r=pe(Ke),{useSyncExternalStoreWithSelector:Er}=_r;function $e(e,t=e.getState,r){const n=Er(e.subscribe,e.getState,e.getServerState||e.getState,t,r);return f.useDebugValue(n),n}const ye=(e,t)=>e.classList&&e.classList.contains(t),Oe=(e,t)=>ye(e,t)?e:e.parentNode?Oe(e.parentNode,t):!1,wt=(e,t)=>e.x>t.left&&e.x<t.left+t.width&&e.y>t.top&&e.y<t.top+t.height,wr=(e,t)=>Array.from(e.querySelectorAll(".corner")).every(n=>{const{top:o,left:s}=n.getBoundingClientRect();return wt({x:s,y:o},t)}),Cr=(e,t)=>{const r=t.getBoundingClientRect();return wr(e,r)},Ze=(e,t)=>{const n=e.getElementsByClassName(`item ${t}`)[0];return n||console.error(`Missing item ${t}`),n},Te=e=>{var r,n;const t=(r=e==null?void 0:e.dataset)==null?void 0:r.id;return t||console.error("getIdFromElem call fails",e,JSON.stringify(e==null?void 0:e.dataset),(n=e==null?void 0:e.dataset)==null?void 0:n.id),t},Ct=(e,t=document)=>{const r=e.reduce((n,o)=>{const s=Ze(t,o);if(!s)return null;const{left:a,right:u,top:l,bottom:m}=s.getBoundingClientRect();let d;return n?d=n:d={left:a,top:l,right:u,bottom:m},d.left=Math.min(a,d.left),d.top=Math.min(l,d.top),d.right=Math.max(u,d.right),d.bottom=Math.max(m,d.bottom),d},null);return r&&(r.width=r.right-r.left,r.height=r.bottom-r.top,r)},xr=({x:e,y:t,width:r,height:n},{type:o="grid",size:s=1,offset:a={x:0,y:0}})=>{const[u,l]=[e+r/2-a.x,t+n/2-a.y];let m,d,c,_,b,C,h,S,E,x;const v=s/1.1547;switch(o){case"grid":m=Math.round(u/s)*s,d=Math.round(l/s)*s;break;case"hexH":c=2*v,_=3*s,b=Math.round(u/c)*c,h=Math.round(l/_)*_,C=b>u?b-v:b+v,S=h>l?h-1.5*s:h+1.5*s,E=Math.hypot(b-u,h-l),x=Math.hypot(C-u,S-l),E<x?(m=b,d=h):(m=C,d=S);break;case"hexV":c=3*s,_=2*v,b=Math.round(u/c)*c,h=Math.round(l/_)*_,C=b>u?b-1.5*s:b+1.5*s,S=h>l?h-v:h+v,E=Math.hypot(b-u,h-l),x=Math.hypot(C-u,S-l),E<x?(m=b,d=h):(m=C,d=S);break;default:m=e+r/2,d=t+n/2}return{x:m+a.x-r/2,y:d+a.y-n/2}},xt=["#037758","#99092a","#067070","#c6650f","#008726","#3d7004","#348402","#057f58","#b58612","#c44c01","#0a7704","#0e910e","#027377","#c99e02","#054160","#157a01","#b10de2","#0d6289","#bc5d03","#ba0cd1","#d39f10","#0c4c7a","#460782","#a51f10","#cecb10","#9b0943","#607f0c","#007a4b","#bf0daa","#af0ad8"],It=()=>xt[Math.floor(Math.random()*xt.length)],Ir=!1,Qe=({wire:e,storeName:t,noSync:r=[],defaultValue:n},o)=>(s,a,u)=>{s({ready:!1});const l=[];(async()=>{try{const b=await e.call(`${t}_getValue`);Ir&&console.log("init from peer with value",b),s(C=>({...C,...b}))}catch{n!==void 0&&s(n)}l.push(await e.register(`${t}_getValue`,()=>Object.fromEntries(Object.entries(a()).filter(([b,C])=>typeof C!="function"&&!r.includes(b))),{invoke:"first"})),l.push(e.subscribe(`${t}_call`,([b,C])=>{c[b](...C)})),s({ready:!0})})();const d=o(s,a,u),c={...d},_=Object.fromEntries(Object.entries(d).map(([b,C])=>typeof C=="function"&&!b.startsWith("get")&&!r.includes(b)?[b,(...S)=>{const E=C(...S);return e.publish(`${t}_call`,[b,S]),E}]:[b,C]));return _.unsub=()=>{l.forEach(b=>b())},_};function Ae(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[n,o]of e)if(!Object.is(o,t.get(n)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let n=0;n<r.length;n++)if(!Object.prototype.hasOwnProperty.call(t,r[n])||!Object.is(e[r[n]],t[r[n]]))return!1;return!0}const Ot=f.createContext(),Or=(e,t)=>({items:{},getItems:()=>t().items,setItems:r=>e({items:r}),updateItems:r=>e(n=>({items:{...n.items,...r}})),moveItems:(r,n)=>e(({items:o})=>{const s={...o};return r.forEach(a=>{const u=o[a];u&&(s[a]={...u,x:(u.x||0)+n.x,y:(u.y||0)+n.y,moving:!0})}),{items:s}})}),Tr=(e,t)=>({itemIds:[],setItemIds:r=>e({itemIds:r}),getItemIds:()=>t().itemIds,insert:(r,n)=>e(o=>{const s=[...o.itemIds];return s.splice(r,0,n),{itemIds:s}}),remove:r=>e(n=>{const o=[...n.itemIds];return o.splice(r,1),{itemIds:o}}),updateItemIds:(r,n)=>e(o=>{const s=[...o.itemIds];return s[r]=n,{items:s}}),updateManyItemIds:r=>e(n=>({items:n.itemIds.map((o,s)=>r[s]!==void 0?r[s]:o)}))}),kr=(e,t)=>({removeItemsById:r=>e(n=>({itemIds:n.itemIds.filter(o=>!r.includes(o)),items:Object.fromEntries(Object.entries(n.items).filter(([o])=>!r.includes(o)))})),getItemList:()=>{const r=t().items;return t().itemIds.map(n=>r[n])},setItemList:r=>e({items:Object.fromEntries(r.map(n=>[n.id,n])),itemIds:r.map(({id:n})=>n)}),insertItems:(r,n)=>e(o=>{let s;const a=r.map(({id:u})=>u);if(n){const u=o.itemIds.findIndex(l=>l===n);s=[...o.itemIds],s.splice(u,0,...a)}else s=[...o.itemIds,...a];return{items:{...o.items,...Object.fromEntries(r.map(u=>[u.id,u]))},itemIds:s}})}),Pr=(e,t)=>({boardConfig:{},getBoardConfig:()=>t().boardConfig,setBoardConfig:r=>e({boardConfig:r}),updateBoardConfig:r=>e(n=>({boardConfig:{...n.boardConfig,...r}}))}),Mr=(e,t)=>({session:{},getSessionInfo:()=>t().session,setSessionInfo:r=>e({session:r}),updateSessionInfo:r=>e(n=>({session:{...n.session,...r}}))}),Tt=({storeName:e,children:t,defaultValue:r})=>{const{wire:n}=Ie("room"),[o,s]=f.useState(!1),[a]=f.useState(()=>Re(Qe({wire:n,storeName:e,defaultValue:r},(...u)=>({...Or(...u),...Tr(...u),...kr(...u),...Pr(...u),...Mr(...u)}))));return f.useEffect(()=>{const u=a.subscribe(l=>{l.ready&&(u(),s(!0))})},[a]),o?k(Ot.Provider,{value:a,children:t}):null},ie=(e,t)=>{const r=f.useContext(Ot);return $e(r,e,t||Ae)},jr=()=>{const[e,t]=ie(n=>[n.itemIds,n.items]);return f.useMemo(()=>e.map(n=>t[n]),[e,t])},Rr=()=>{const[e,t,r]=ie(a=>[a.items,a.itemIds,a.getItemList]),[n,o]=f.useState(r()),[,s]=f.useTransition();return f.useEffect(()=>{const a=r();s(()=>{o(a)})},[e,t,r]),n},kt=5e4,Pt=f.createContext(),Dr=(e,t)=>({config:{itemTemplates:{},actions:{},uid:null,itemExtent:{},boardWrapperRect:{},boardSize:kt},updateConfiguration:r=>e(n=>({config:{...n.config,...r}})),getConfiguration:()=>t().config}),$r=(e,t)=>({boardState:{movingItems:!1,selecting:!1,zooming:!1,panning:!1,translateX:0,translateY:0,scale:1},updateBoardState:r=>e(n=>({boardState:{...n.boardState,...r}})),getBoardState:()=>t().boardState}),Ar=(e,t)=>({interactions:{},getInteractions:()=>t().interactions,register:(r,n)=>e(o=>{const s=[...o.interactions[r]||[]];return s.push(n),{interactions:{...o.interaction,[r]:s}}}),unregister:(r,n)=>e(o=>{const s=(o.interactions[r]||[]).filter(a=>a!==n);return{interactions:{...o.interaction,[r]:s}}}),callInteractions:(r,n)=>{t().interactions[r]&&t().interactions[r].forEach(o=>{o(n)})}}),Lr=(e,t)=>({selection:[],setSelection:r=>e(n=>JSON.stringify(n.selection)!==JSON.stringify(r)?{selection:r}:{}),getSelection:()=>t().selection,select:r=>e(n=>({selection:[...n.selection,...r]})),unselect:r=>e(n=>({selection:n.selection.filter(o=>!r.includes(o))})),clear:()=>e(r=>r.selection.length>0?{selection:[]}:{}),reverse:()=>e(r=>{const n=[...r.selection];return n.reverse(),{selection:n}}),selectionBox:null,setSelectionBox:r=>e(n=>{const o=n.selectionBox;return!o||!r||o.top!==r.top||o.left!==r.left||o.width!==r.width||o.height!==r.height?{selectionBox:r}:{}})}),Mt=({children:e})=>{const[t]=f.useState(()=>Re((...r)=>({...Dr(...r),...$r(...r),...Ar(...r),...Lr(...r)})));return k(Pt.Provider,{value:t,children:e})},Q=(e,t)=>{const r=f.useContext(Pt);return $e(r,e,t||Ae)},zr=()=>{const[e]=Q(t=>[t.selection]);return e};function et(e){const t=f.useRef(e);return t.current=e,f.useMemo(()=>Object.freeze({get current(){return t.current}}),[])}function Br(e){const t=et(e);f.useEffect(()=>()=>{t.current()},[])}function tt(e,t,r,n=0){const o=f.useRef(),s=f.useRef(),a=f.useRef(),u=()=>{o.current&&(clearTimeout(o.current),o.current=void 0),s.current&&(clearTimeout(s.current),s.current=void 0)};return Br(u),f.useMemo(()=>{const l=()=>{if(!a.current)return;const d=a.current;a.current=void 0,e.apply(d.this,d.args),u()},m=function(...d){o.current&&clearTimeout(o.current),a.current={args:d,this:this},o.current=setTimeout(l,r),n>0&&!s.current&&(s.current=setTimeout(l,n))};return Object.defineProperties(m,{length:{value:e.length},name:{value:`${e.name||"anonymous"}__debounced__${r}`}}),m},[r,n,...t])}const Le=100,Se=1e3,Yr=.8,jt=({x:e,y:t,scale:r,itemExtent:{right:n,left:o,top:s,bottom:a},boardWrapperRect:u,boardSize:l})=>{const m={left:-n*r+Le*r,right:u.width-o*r-Le*r,top:-a*r+Le*r,bottom:u.height-s*r-Le*r,maxRight:u.width-l*r,maxLeft:u.height-l*r},d=Math.min(Math.max(e,m.left,m.maxRight),m.right,0),c=Math.min(Math.max(t,m.top,m.maxLeft),m.bottom,0);return[d,c]},ze=()=>{const[e,t,r,n,o]=Q(h=>[h.getBoardState,h.updateBoardState,h.config.itemExtent,h.getConfiguration,h.updateConfiguration]),s=f.useRef([.1,8]),[a]=ie(h=>[h.getItemList]),u=f.useCallback(()=>{const{translateX:h,translateY:S,scale:E}=e();return{translateX:h,translateY:S,scale:E}},[e]),l=f.useCallback(h=>{const{itemExtent:S,boardWrapperRect:E,boardSize:x}=n(),v=e(),{translateX:p,translateY:I,scale:w}={...v,...h(v)};let g=w;w!==v.scale&&(g>s.current[1]&&([,g]=s.current),g<s.current[0]&&([g]=s.current));let[P,M]=[p,I];(p!==v.translateX||I!==v.translateY)&&([P,M]=jt({x:p,y:I,scale:g,itemExtent:S,boardWrapperRect:E,boardSize:x})),t({translateX:P,translateY:M,scale:g})},[e,n,t]),m=f.useCallback((h,S)=>{const{itemExtent:E,boardWrapperRect:x,boardSize:v}=n();let p=S;p||(p={x:x.width/2,y:x.height/2});const I=e();let w=I.scale*h;w>s.current[1]&&([,w]=s.current),w<s.current[0]&&([w]=s.current);const g=p.x-x.left,P=p.y-x.top,M=g-(g-I.translateX)*w/I.scale,j=P-(P-I.translateY)*w/I.scale,[$,Y]=jt({x:M,y:j,scale:w,itemExtent:E,boardWrapperRect:x,boardSize:v});t({scale:w,translateX:$,translateY:Y})},[e,n,t]),d=f.useCallback(({left:h,top:S,width:E,height:x})=>{const{boardWrapperRect:v}=n(),p=v.width/E,I=v.height/x,g=Math.min(p,I)*Yr,P=v.width/2-(h+E/2)*g,M=v.height/2-(S+x/2)*g;t({translateX:P,translateY:M,scale:g})},[n,t]),c=f.useCallback(async()=>{const{itemExtent:{width:h,height:S},boardWrapperRect:E}=n(),x=E.width/h,v=E.height/S,p=Math.min(x,v);s.current=[Math.max(p*.5,.05),Math.max(p*10,10)]},[n]),_=f.useCallback(()=>{const{boardWrapperRect:h,boardSize:S}=n(),{translateX:E,translateY:x,scale:v}=e();return{x:(h.width/2-E)/v-S/2,y:(h.height/2-x)/v-S/2}},[e,n]),b=f.useCallback(()=>{const h=a(),{boardWrapperRect:S,boardWrapper:E,boardSize:x}=n(),{scale:v,translateX:p,translateY:I}=e(),{left:w,top:g,width:P,height:M}=Ct(h.map(({id:$})=>$),E)||{left:x/2*v+S.left+p,top:x/2*v+S.top+I,width:0,height:0},j={left:(w-S.left-p)/v,top:(g-S.top-I)/v,width:P/v,height:M/v};if(j.right=j.left+j.width,j.bottom=j.top+j.height,j.width<Se){const $=(Se-j.width)/2;j.left-=$,j.right+=$,j.width=Se}if(j.height<Se){const $=(Se-j.height)/2;j.top-=$,j.bottom+=$,j.height=Se}o({itemExtent:j})},[e,n,a,o]),C=tt(()=>b(),[b],200);return f.useEffect(()=>{r.left&&c()},[c,r]),{setDim:l,getDim:u,zoomTo:m,zoomToCenter:m,zoomToExtent:d,getCenter:_,updateItemExtent:C}},Rt=e=>{const[t,r,n]=Q(({register:a,unregister:u,callInteractions:l})=>[a,u,l]),o=f.useCallback(a=>(t(e,a),()=>{r(e,a)}),[e,t,r]),s=f.useCallback(a=>{n(e,a)},[n,e]);return{register:o,call:s}},Be=()=>{const{call:e}=Rt("place"),{getCenter:t,updateItemExtent:r}=ze(),[n,o,s,a]=Q(T=>[T.clear,T.reverse,T.unselect,T.getConfiguration]),{getItems:u,getItemIds:l,setItemIds:m,updateItems:d,moveItems:c,removeItemsById:_,getItemList:b,insertItems:C,setItemList:h}=ie(({getItems:T,getItemIds:D,setItemIds:A,updateItems:W,moveItems:z,removeItemsById:K,getItemList:G,insertItems:re,setItemList:ne})=>({getItems:T,getItemIds:D,setItemIds:A,updateItems:W,moveItems:z,removeItemsById:K,getItemList:G,insertItems:re,setItemList:ne})),S=f.useCallback((T,D)=>{let A=D;typeof D=="object"&&(A=()=>D);const W=l().filter(G=>T.includes(G)),z=u(),K=Object.fromEntries(W.map(G=>[G,A({...z[G]})]));d(K),r()},[l,u,r,d]),E=f.useCallback(T=>{h(T),n(),r()},[n,h,r]),x=f.useCallback((T,D)=>{S([T],D)},[S]),v=f.useCallback((T,D)=>{c(T,D),r()},[c,r]),p=f.useCallback(T=>{const D=l(),A=D.filter(z=>!T.includes(z)),W=D.filter(z=>T.includes(z));m([...A,...W])},[l,m]),I=f.useCallback((T,{type:D,size:A}={})=>{const{boardWrapper:W}=a(),z={},K=u();T.forEach(G=>{const re=K[G],ne=Ze(W,G);if(!ne)return;const oe={type:D||"grid",size:A||1,offset:{x:0,y:0},...re.grid},F=xr({x:re.x,y:re.y,width:ne.clientWidth,height:ne.clientHeight},oe);z[G]={...re,...F}}),d(z)},[a,u,d]),w=f.useCallback((T,D)=>{p(T),S(T,A=>{const W={...A};return delete W.moving,W}),I(T,D),e(T),r()},[S,e,p,I,r]),g=f.useCallback(T=>{m(T)},[m]),P=f.useCallback(T=>{const D=l(),A=D.filter(z=>T.includes(z)),W=D.map(z=>T.includes(z)?A.pop():z);m(W),o()},[l,o,m]),M=f.useCallback((T,D)=>{const A=u(),W=T.map(F=>A[F]),z=D.map(F=>A[F]),K=D.reduce((F,te)=>(F[te]=W.shift(),F),{}),G=z.reduce((F,te)=>{const me=K[te.id],be={...te,x:me.x,y:me.y};return F[te.id]=be,F},{});d(G);const re=T.reduce((F,te)=>(F[te]=D.shift(),F),{}),oe=l().map(F=>T.includes(F)?re[F]:F);m(oe)},[u,d,l,m]),j=f.useCallback((T,D)=>{const A=t(),W=T.map((z,K)=>!z.x||!z.y?{...z,x:A.x+2*K,y:A.y+2*K}:z);C(W,D),r()},[t,C,r]),$=f.useCallback((T,D)=>{j([T],D)},[j]),Y=f.useCallback(T=>{s(T),_(T)},[s,_]),N=f.useCallback(T=>{const D=u();return T.map(A=>D[A])},[u]),H=f.useCallback(({target:T,clientX:D,clientY:A},{returnLocked:W=!1,passLocked:z=!1}={})=>{if(["INPUT","TEXTAREA"].includes(T.tagName))return null;const K=Oe(T,"item");if(K){if(ye(K,"selected"))return K;if(!z&&ye(K,"locked")&&!ye(T,"passthrough"))return W?K:null;if(ye(T,"passthrough")){const G=l(),{boardWrapper:re}=a(),ne=G.reduce((oe,F)=>{const te=Ze(re,F),me=te.getBoundingClientRect();return wt({x:D,y:A},me)&&oe.unshift(te),oe},[]);for(let oe=0;oe<ne.length;oe+=1){const F=ne[oe];if(F!==K&&(z||!ye(F,"locked")))return F}return null}}return K},[a,l]);return{putItemsOnTop:p,batchUpdateItems:S,updateItemOrder:g,moveItems:v,placeItems:w,updateItem:x,swapItems:M,reverseItemsOrder:P,setItemList:E,pushItem:$,pushItems:j,removeItems:Y,getItemList:b,findElementUnderPointer:H,getItems:N}};var Nr=function e(t,r){if(t===r)return!0;if(t&&r&&typeof t=="object"&&typeof r=="object"){if(t.constructor!==r.constructor)return!1;var n,o,s;if(Array.isArray(t)){if(n=t.length,n!=r.length)return!1;for(o=n;o--!==0;)if(!e(t[o],r[o]))return!1;return!0}if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(o of t.entries())if(!r.has(o[0]))return!1;for(o of t.entries())if(!e(o[1],r.get(o[0])))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(o of t.entries())if(!r.has(o[0]))return!1;return!0}if(ArrayBuffer.isView(t)&&ArrayBuffer.isView(r)){if(n=t.length,n!=r.length)return!1;for(o=n;o--!==0;)if(t[o]!==r[o])return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if(s=Object.keys(t),n=s.length,n!==Object.keys(r).length)return!1;for(o=n;o--!==0;)if(!Object.prototype.hasOwnProperty.call(r,s[o]))return!1;for(o=n;o--!==0;){var a=s[o];if(!e(t[a],r[a]))return!1}return!0}return t!==t&&r!==r};function Ur(e,t,r,n=0){f.useEffect(tt(e,t,r,n),t)}const Xr=(e,t)=>{if(e.type in t){const r=t[e.type].defaultActions;return typeof r=="function"?r(e):r}return[]},Dt=(e,t)=>{const{actions:r=Xr(e,t)}=e;return r.map(n=>typeof n=="string"?{name:n}:n)},Wr=()=>{const[e,t]=ie(c=>[c.items,c.getItems]),[r,n,o]=Q(c=>[c.config.itemTemplates,c.selection,c.getSelection]),[s,a]=f.useState([]),u=f.useRef(!1),[,l]=f.useTransition();f.useEffect(()=>(u.current=!0,()=>{u.current=!1}),[]);const m=f.useCallback(c=>{const _=t();if(c)return[c,c.map(C=>_[C])];const b=o();return[b,b.map(C=>_[C])]},[t,o]),d=f.useCallback(()=>{const[c,_]=m();if(c.length>0){if(!u.current)return;const b=_.reduce((C,h)=>{const S=Dt(h,r);return C.filter(E=>S.some(x=>Nr(E,x)))},Dt(_[0],r));l(()=>{a(b)})}else l(()=>{a([])})},[m,r]);return Ur(()=>d(),[e,n,d],100),{availableActions:s}},Vr=()=>{const[e]=Q(t=>[t.selectionBox]);return e};let ge=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,r)=>(r&=63,r<36?t+=r.toString(36):r<62?t+=(r-26).toString(36).toUpperCase():r>62?t+="-":t+="_",t),"");const $t=f.createContext(),rt=e=>{localStorage.setItem("user",JSON.stringify(e))},Fr=()=>{if(localStorage.user){const t={name:"Player",color:It(),uid:ge(),...JSON.parse(localStorage.user)};return rt(t),t}const e={name:"Player",color:It(),uid:ge()};return rt(e),e},Kr=e=>(t,r)=>({isSpaceMaster:!1,users:{},getUser:()=>r().users[e],getUsers:()=>r().users,getUserList:()=>Object.values(r().users),getLocalUsers:()=>{if(!r().users[e])return[];const{space:n}=r().users[e];return r().getUserList().filter(({space:o})=>o===n)},addUser:n=>t(o=>({users:{...o.users,[n.id]:n}})),updateUser:(n,o)=>t(s=>{if(!s.users[n])return{};const a={...s.users[n],...o,id:n,uid:s.users[n].uid};return a.id===e&&rt(a),setTimeout(()=>r().electSpaceMaster(),100),{users:{...s.users,[n]:a}}}),removeUser:n=>t(o=>{const s={...o.users};return delete s[n],setTimeout(()=>r().electSpaceMaster(),100),{users:s}}),updateCurrentUser:n=>r().updateUser(e,n),joinSpace:n=>r().updateUser(e,{space:n,spaceJoinedTimestamp:Date.now()}),electSpaceMaster:()=>{const n=r().getLocalUsers(),o={uid:null,timestamp:Date.now()};Object.values(n).forEach(({spaceJoinedTimestamp:s,id:a})=>{s<o.timestamp&&(o.id=a,o.timestamp=s)}),t({isSpaceMaster:o.id===e})}}),Hr=e=>({cursors:{},moveCursor:(t,r)=>e(n=>({cursors:{...n.cursors,[t]:r}})),removeCursor:t=>e(r=>{const n={...r.cursors};return delete n[t],{cursors:n}})}),At=({storeName:e,children:t})=>{const{wire:r,isMaster:n}=Ie("room"),[o,s]=f.useState(null),[a,u]=f.useState(!1),l=f.useRef(!1);return f.useEffect(()=>{let m=!0;const d=[];if(!o&&!l.current)return l.current=!0,(()=>{const _=Re(Qe({wire:r,storeName:e,noSync:["updateCurrentUser","joinSpace","isSpaceMaster","electSpaceMaster"]},(...C)=>({...Kr(r.userId)(...C),...Hr(...C)}))),b=_.subscribe(C=>{C.ready&&(b(),m&&s(_))})})(),()=>{m=!1,l.current=!1,d.forEach(_=>_())}},[o,e,r,r.userId]),f.useEffect(()=>{if(o)return o.getState().addUser({...Fr(),id:r.userId}),u(!0),()=>{o.getState().removeUser(r.userId)}},[n,o,r]),f.useEffect(()=>{if(o){const m=r.subscribe("userLeave",d=>{o.getState().removeUser(d)});return()=>{m()}}},[n,o,r]),f.useEffect(()=>{n&&o&&o.getState().updateCurrentUser({isMaster:n})},[n,o,r]),a?k($t.Provider,{value:o,children:t}):null},he=(e,t)=>{const r=f.useContext($t);return $e(r,e,t||Ae)},qr=()=>{const[e,t,r,n,o]=he(u=>[u.isSpaceMaster,u.getUser(),u.users,u.updateCurrentUser,u.joinSpace]),s=f.useMemo(()=>Object.values(r),[r]),a=f.useMemo(()=>{const{space:u}=t;return s.filter(({space:l})=>l===u)},[t,s]);return{isSpaceMaster:e,currentUser:t,updateCurrentUser:n,users:s,localUsers:a,joinSpace:o}},Gr=()=>{const[e,t,r]=ie(o=>[o.boardConfig,o.getBoardConfig,o.setBoardConfig]),n=f.useCallback(o=>{let s=o;typeof o=="object"&&(s=()=>o);const a=t(),u=s(a);r(u)},[t,r]);return[e,n]},Jr=()=>{const[e]=Q(t=>[t.boardState]);return e},Zr=()=>{const[e,t,r,n]=ie(o=>[o.getSessionInfo,o.setSessionInfo,o.updateSessionInfo,o.session]);return{getSessionInfo:e,setSessionInfo:t,sessionInfo:n,updateSessionInfo:r}},Lt=f.createContext(),Qr=({user:{name:e,uid:t,color:r},content:n})=>({type:"message",user:{name:e,uid:t,color:r},content:n,uid:ge(),timestamp:new Date().toISOString()}),en=(e,t)=>({messages:[],setMessages:r=>e({messages:r.map(n=>({...n,timestamp:Date.parse(n.timestamp)}))}),addMessage:r=>e(n=>({messages:[...n.messages,{...r,timestamp:Date.parse(r.timestamp)}]})),sendMessage:(r,n)=>{const o=Qr({user:r,content:n});o&&t().addMessage(o)}}),zt=({storeName:e,children:t,defaultValue:r=[]})=>{const{wire:n}=Ie("room"),[o]=f.useState(()=>Re(Qe({wire:n,storeName:e,defaultValue:r,noSync:["sendMessage"]},(...s)=>({...en(...s)}))));return k(Lt.Provider,{value:o,children:t})},tn=(e,t)=>{const r=f.useContext(Lt);return $e(r,e,t||Ae)},rn=()=>{},nn=(e=rn)=>{const t=he(a=>a.getUser()),[r,n,o]=tn(a=>[a.messages,a.setMessages,a.sendMessage]);f.useEffect(()=>{r.length&&e()},[r,e]);const s=f.useCallback(a=>{o(t,a)},[t,o]);return{messages:r,setMessages:n,sendMessage:s}},Bt=({children:e,session:t})=>{const r=he(n=>n.joinSpace);return f.useEffect(()=>(r(t),()=>{r(null)}),[r,t]),e},on=({socket:e,room:t,session:r,items:n=[],messages:o=[],LoadingComponent:s,...a})=>{const[u]=f.useState(t||ge()),[l]=f.useState(r||ge()),[m]=f.useState(()=>({itemIds:n.map(({id:c})=>c),items:Object.fromEntries(n.map(c=>[c.id,c]))}));return Ie("room")?k(zt,{storeName:`${l}_messages`,defaultValue:o,children:k(Mt,{children:k(Tt,{storeName:`${l}_item`,defaultValue:m,children:k(Bt,{...a,session:l})})})}):k(gt,{room:u,channel:"room",socket:e,LoadingComponent:s,children:k(At,{storeName:`${u}_users`,children:k(zt,{storeName:`${l}_messages`,defaultValue:o,children:k(Mt,{children:k(Tt,{storeName:`${l}_item`,defaultValue:m,children:k(Bt,{...a,session:l})})})})})})},sn=({socket:e,room:t,children:r,LoadingComponent:n})=>{const[o]=f.useState(t||ge());return k(gt,{room:o,channel:"room",socket:e,LoadingComponent:n,children:k(At,{storeName:`${o}_users`,children:r})})},nt=()=>{const e=navigator.userAgent.toLowerCase();return/mac os ?x 10/.test(e)},an=(()=>{const e=document.createElement("iframe");e.src="#",document.body.appendChild(e);const t=e.contentWindow.document;t.open(),t.write("<!DOCTYPE html><html><head></head><body><span>a</span></body></html>"),t.close();const r=t.body.firstElementChild.offsetHeight;return document.body.removeChild(e),r})(),cn=800,Yt=(e,t)=>{const r=Object.keys(e).map(n=>Number(n)).find(n=>n!==t);return e[r]},Nt=([e,t],[r,n])=>{const o=Math.abs(e-r),s=Math.abs(t-n);return Math.hypot(o,s)},ve=()=>{},un=e=>t=>{const{event:r}=t;return r.isPropagationStopped()?null:e(t)},ln=e=>async(...t)=>{try{await e(...t)}catch(r){console.error(r)}};class fn{constructor(){ar(this,"lastPromise",Promise.resolve(!0))}add(t,...r){return new Promise((n,o)=>{this.lastPromise=this.lastPromise.then(()=>un(ln(t))(...r)).then(n).catch(o)})}}const ae=new fn,Ye=({children:e,onDrag:t=ve,onDragStart:r=ve,onDragEnd:n=ve,onPan:o=ve,onTap:s=ve,onLongTap:a=ve,onDoubleTap:u=ve,onZoom:l,mainAction:m="drag"})=>{const d=f.useRef(null),c=f.useRef({moving:!1,pointers:{},mainPointer:void 0}),_=E=>{const{deltaX:x,deltaY:v,clientX:p,clientY:I,deltaMode:w,ctrlKey:g,altKey:P,metaKey:M,target:j}=E;if(!(P||g&&!nt()))if(nt()&&!g)ae.add(o,{deltaX:-2*x,deltaY:-2*v,button:1,ctrlKey:g,metaKey:M,target:j,event:E});else{if(l===void 0||!v)return;let $=v;switch(w){case 1:$*=an;break;case 2:$*=cn;break}nt()&&($*=2),ae.add(l,{scale:$,clientX:p,clientY:I,event:E})}},b=E=>{const{target:x,button:v,clientX:p,clientY:I,pointerId:w,altKey:g,ctrlKey:P,metaKey:M,isPrimary:j}=E;if(c.current.pointers[w]={clientX:p,clientY:I},j&&(c.current.mainPointer=void 0),c.current.mainPointer!==void 0){if(c.current.mainPointer!==w)try{const{clientX:$,clientY:Y}=Yt(c.current.pointers,w),N=($+p)/2,H=(Y+I)/2,T=Nt([$,Y],[p,I]);Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:I,prevX:N,prevY:H,startDistance:T,prevDistance:T})}catch($){console.log("Error while getting other pointer. Ignoring",$),c.current.mainPointer}return}c.current.mainPointer=w,Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:I,prevX:p,prevY:I,currentButton:v,pointerDownEvent:E,target:x,timeStart:Date.now(),longTapTimeout:setTimeout(async()=>{c.current.noTap=!0,ae.add(a,{clientX:p,clientY:I,altKey:g,ctrlKey:P,metaKey:M,target:x,event:E})},750)});try{x.setPointerCapture(w)}catch($){console.log("Fail to capture pointer",$)}},C=E=>{if(c.current.pressed){const{pointerId:x,clientX:v,clientY:p,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,buttons:M,pointerType:j}=E;c.current.pointers[x]={clientX:v,clientY:p},c.current.moving=!0;const $=Object.keys(c.current.pointers).length===2;let Y,N,H;if($){const{clientX:W,clientY:z}=Yt(c.current.pointers,x);Y=(W+v)/2,N=(z+p)/2,H=Nt([W,z],[v,p])}else Y=v,N=p;let T=w||I||g||P||M!==1;m!=="drag"&&(T=!T);const D=!T,A=T;if(D){c.current.gestureStart||(d.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout),ae.add(r,{deltaX:0,deltaY:0,startX:c.current.startX,startY:c.current.startY,clientX:c.current.startX,clientY:c.current.startY,distanceX:0,distanceY:0,button:c.current.currentButton,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,target:c.current.target,event:c.current.pointerDownEvent}));const W=Y-c.current.prevX,z=N-c.current.prevY,K=Y-c.current.startX,G=N-c.current.startY;ae.add(t,{deltaX:W,deltaY:z,startX:c.current.startX,startY:c.current.startY,clientX:Y,clientY:N,distanceX:K,distanceY:G,button:c.current.currentButton,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,target:c.current.target,event:E})}if(A){c.current.gestureStart||(d.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout));const W=Y-c.current.prevX,z=N-c.current.prevY,{target:K}=c.current;if(ae.add(o,{deltaX:W,deltaY:z,button:c.current.currentButton,altKey:I,shiftKey:w,ctrlKey:g,metaKey:P,target:K,event:E}),H!==c.current.prevDistance&&l){const G=c.current.prevDistance-H;Math.abs(G)>0&&(ae.add(l,{scale:G*3,clientX:Y,clientY:N,event:E}),c.current.prevDistance=H)}}c.current.prevX=Y,c.current.prevY=N}},h=E=>{const{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P,pointerId:M}=E;if(c.current.pointers[M]&&(delete c.current.pointers[M],c.current.mainPointer===M)){for(;Object.keys(c.current.pointers).length>0;){c.current.mainPointer=Number(Object.keys(c.current.pointers)[0]);try{c.current.target.setPointerCapture(c.current.mainPointer);return}catch(j){console.log("Fails to set pointer capture",j),c.current.mainPointer=void 0,delete c.current.pointers[Object.keys(c.current.pointers)[0]]}}if(c.current.mainPointer=void 0,c.current.pressed=!1,clearTimeout(c.current.longTapTimeout),c.current.moving)c.current.moving=!1,ae.add(n,{deltaX:x-c.current.prevX,deltaY:v-c.current.prevY,startX:c.current.startX,startY:c.current.startY,clientX:x,clientY:v,distanceX:x-c.current.startX,distanceY:v-c.current.startY,button:c.current.currentButton,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,event:E}),d.current.style.cursor="auto";else{const j=Date.now();c.current.noTap?c.current.noTap=!1:c.current.timeStart-j<300&&ae.add(s,{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P,event:E})}}};return k("div",{onWheel:_,onPointerDown:b,onPointerMove:C,onPointerUp:h,onPointerOut:h,onPointerLeave:h,onPointerCancel:h,onDoubleClick:E=>{const{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P}=E;ae.add(u,{clientX:x,clientY:v,altKey:p,shiftKey:I,ctrlKey:w,metaKey:g,target:P,event:E})},style:{touchAction:"none"},ref:d,children:e})},ot=({onResize:e,...t})=>{const[r]=Q(o=>[o.getBoardState]);return k(Ye,{onDrag:({deltaX:o,deltaY:s,event:a})=>{a.stopPropagation();const{scale:u}=r();e({width:o/u,height:s/u})},children:k("div",{...t})})};let dn={data:""},mn=e=>typeof window=="object"?((e?e.querySelector("#_goober"):window._goober)||Object.assign((e||document.head).appendChild(document.createElement("style")),{innerHTML:" ",id:"_goober"})).firstChild:e||dn,pn=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,gn=/\/\*[^]*?\*\/| +/g,Ut=/\n+/g,de=(e,t)=>{let r="",n="",o="";for(let s in e){let a=e[s];s[0]=="@"?s[1]=="i"?r=s+" "+a+";":n+=s[1]=="f"?de(a,s):s+"{"+de(a,s[1]=="k"?"":t)+"}":typeof a=="object"?n+=de(a,t?t.replace(/([^,])+/g,u=>s.replace(/(^:.*)|([^,])+/g,l=>/&/.test(l)?l.replace(/&/g,u):u?u+" "+l:l)):s):a!=null&&(s=/^--/.test(s)?s:s.replace(/[A-Z]/g,"-$&").toLowerCase(),o+=de.p?de.p(s,a):s+":"+a+";")}return r+(t&&o?t+"{"+o+"}":o)+n},ue={},Xt=e=>{if(typeof e=="object"){let t="";for(let r in e)t+=r+Xt(e[r]);return t}return e},hn=(e,t,r,n,o)=>{let s=Xt(e),a=ue[s]||(ue[s]=(l=>{let m=0,d=11;for(;m<l.length;)d=101*d+l.charCodeAt(m++)>>>0;return"go"+d})(s));if(!ue[a]){let l=s!==e?e:(m=>{let d,c,_=[{}];for(;d=pn.exec(m.replace(gn,""));)d[4]?_.shift():d[3]?(c=d[3].replace(Ut," ").trim(),_.unshift(_[0][c]=_[0][c]||{})):_[0][d[1]]=d[2].replace(Ut," ").trim();return _[0]})(e);ue[a]=de(o?{["@keyframes "+a]:l}:l,r?"":"."+a)}let u=r&&ue.g?ue.g:null;return r&&(ue.g=ue[a]),((l,m,d,c)=>{c?m.data=m.data.replace(c,l):m.data.indexOf(l)===-1&&(m.data=d?l+m.data:m.data+l)})(ue[a],t,n,u),a},vn=(e,t,r)=>e.reduce((n,o,s)=>{let a=t[s];if(a&&a.call){let u=a(r),l=u&&u.props&&u.props.className||/^go/.test(u)&&u;a=l?"."+l:u&&typeof u=="object"?u.props?"":de(u,""):u===!1?"":u}return n+o+(a??"")},"");function q(e){let t=this||{},r=e.call?e(t.p):e;return hn(r.unshift?r.raw?vn(r,[].slice.call(arguments,1),t.p):r.reduce((n,o)=>Object.assign(n,o&&o.call?o(t.p):o),{}):r,mn(t.target),t.g,t.o,t.k)}q.bind({g:1}),q.bind({k:1});function yn(e,t,r,n){de.p=t}var Sn=function e(t,r){if(t===r)return!0;if(t&&r&&typeof t=="object"&&typeof r=="object"){if(t.constructor!==r.constructor)return!1;var n,o,s;if(Array.isArray(t)){if(n=t.length,n!=r.length)return!1;for(o=n;o--!==0;)if(!e(t[o],r[o]))return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if(s=Object.keys(t),n=s.length,n!==Object.keys(r).length)return!1;for(o=n;o--!==0;)if(!Object.prototype.hasOwnProperty.call(r,s[o]))return!1;for(o=n;o--!==0;){var a=s[o];if(!e(t[a],r[a]))return!1}return!0}return t!==t&&r!==r};const bn=q`
60
60
  display: inline-block;
61
61
  transition: transform 150ms;
62
62
  user-select: none;