react-sync-board 1.2.5 → 1.2.6
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 <`+I+">.")}return _}}function sr(i,_){{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 wt;function Cr(){return wt||(wt=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=d,t=Et();function r(f,c){return f===c&&(f!==0||1/f===1/c)||f!==f&&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(f,c,h,b,v){var E=s(null),O;E.current===null?(O={hasValue:!1,value:null},E.current=O):O=E.current;var y=u(function(){var C=!1,g,S,T=function(A){if(!C){C=!0,g=A;var N=b(A);if(v!==void 0&&O.hasValue){var W=O.value;if(v(W,N))return S=W,W}return S=N,N}var Z=g,M=S;if(n(Z,A))return M;var $=b(A);return v!==void 0&&v(M,$)?M:(g=A,S=$,$)},P=h===void 0?null:h,D=function(){return T(c())},j=P===null?void 0:function(){return T(P())};return[D,j]},[c,h,b,v]),w=y[0],x=y[1],p=o(f,w,x);return a(function(){O.hasValue=!0,O.value=p},[p]),l(p),p}Ze.useSyncExternalStoreWithSelector=m,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error)}()),Ze}(function(e){process.env.NODE_ENV==="production"?e.exports=Er():e.exports=Cr()})(yr);const wr=me(He),{useSyncExternalStoreWithSelector:xr}=wr;function $e(e,t=e.getState,r){const n=xr(e.subscribe,e.getState,e.getServerState||e.getState,t,r);return d.useDebugValue(n),n}const he=(e,t)=>e.classList&&e.classList.contains(t),Oe=(e,t)=>he(e,t)?e:e.parentNode?Oe(e.parentNode,t):!1,Ae=([e,t],[r,n])=>{const o=Math.abs(e-r),s=Math.abs(t-n);return Math.hypot(o,s)},xt=(e,t,r)=>{const n=r*Math.PI/180,o=e*Math.cos(n)-t*Math.sin(n),s=e*Math.sin(n)+t*Math.cos(n);return[o,s]},Qe=([e,t],{scale:r,rotate:n,translateX:o,translateY:s})=>{const a=(e-o)/r,u=(t-s)/r;return xt(a,u,-n)},Le=([e,t],{scale:r,rotate:n,translateX:o,translateY:s})=>{const[a,u]=xt(e,t,n);return[a*r+o,u*r+s]},It=(e,t,r,n)=>{const o=e.x,s=e.y,a=t.x,u=t.y,l=r.x,m=r.y,f=a-o,c=u-s,h=o-l,b=s-m,v=f*f+c*c,E=2*(h*f+b*c),O=h*h+b*b-n*n,y=E*E-4*v*O;if(y<0)return[];const w=(-E+Math.sqrt(y))/(2*v),x=(-E-Math.sqrt(y))/(2*v),p=[];return w>=0&&w<=1&&p.push({x:o+w*f,y:s+w*c}),x>=0&&x<=1&&p.push({x:o+x*f,y:s+x*c}),p},et=(e,t)=>e.x>t.left&&e.x<t.left+t.width&&e.y>t.top&&e.y<t.top+t.height,Ir=(e,t)=>Array.from(e.querySelectorAll(".corner")).every(n=>{const{top:o,left:s}=n.getBoundingClientRect();return et({x:s,y:o},t)}),Or=(e,t)=>{const r=t.getBoundingClientRect();return Ir(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},Tr=(e,t=document)=>{const r=e.reduce((n,o)=>{const s=ze(t,o);if(!s)return n||null;const{left:a,right:u,top:l,bottom:m}=s.getBoundingClientRect();let f;return n?f=n:f={left:a,top:l,right:u,bottom:m},f.left=Math.min(a,f.left),f.top=Math.min(l,f.top),f.right=Math.max(u,f.right),f.bottom=Math.max(m,f.bottom),f},null);return r&&(r.width=r.right-r.left,r.height=r.bottom-r.top,r)},Ot=(e,t,r=null)=>(r===null&&(r=new Set),!Array.isArray(t)||t.length===0?[]:t.map(n=>r.has(n)?[]:(r.add(n),[n,...Ot(e,e[n].linkedItems,r)])).flat()),Tt=(e,t,r)=>{const n=new Set(Ot(e,r));return t.filter(o=>n.has(o))},kr=({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,f,c,h,b,v,E,O,y,w;const x=s/1.1547;switch(o){case"grid":m=Math.round(u/s)*s,f=Math.round(l/s)*s;break;case"hexH":c=2*x,h=3*s,b=Math.round(u/c)*c,E=Math.round(l/h)*h,v=b>u?b-x:b+x,O=E>l?E-1.5*s:E+1.5*s,y=Math.hypot(b-u,E-l),w=Math.hypot(v-u,O-l),y<w?(m=b,f=E):(m=v,f=O);break;case"hexV":c=3*s,h=2*x,b=Math.round(u/c)*c,E=Math.round(l/h)*h,v=b>u?b-1.5*s:b+1.5*s,O=E>l?E-x:E+x,y=Math.hypot(b-u,E-l),w=Math.hypot(v-u,O-l),y<w?(m=b,f=E):(m=v,f=O);break;default:m=e+r/2,f=t+n/2}return{x:m+a.x-r/2,y:f+a.y-n/2}},kt=["#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"],Pt=()=>kt[Math.floor(Math.random()*kt.length)],Pr=!1,tt=({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`);Pr&&console.log("init from peer with value",b),s(v=>({...v,...b}))}catch{n!==void 0&&s(n)}l.push(await e.register(`${t}_getValue`,()=>Object.fromEntries(Object.entries(a()).filter(([b,v])=>typeof v!="function"&&!r.includes(b))),{invoke:"first"})),l.push(e.subscribe(`${t}_call`,([b,v])=>{c[b](...v)})),s({ready:!0})})();const f=o(s,a,u),c={...f},h=Object.fromEntries(Object.entries(f).map(([b,v])=>typeof v=="function"&&!b.startsWith("get")&&!r.includes(b)?[b,(...O)=>{const y=v(...O);return e.publish(`${t}_call`,[b,O]),y}]:[b,v]));return h.unsub=()=>{l.forEach(b=>b())},h};function Ye(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 Mt=d.createContext(),Mr=(e,t)=>({items:{},getItems:()=>t().items,setItems:r=>e({items:r}),updateItems:(r,n=!1)=>e(o=>n?{items:Object.fromEntries(Object.entries(o.items).map(([a,u])=>r[a]?[a,{...u,...r[a]}]:[a,u]))}:{items:{...o.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}})}),jr=(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)}))}),Dr=(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}})}),Rr=(e,t)=>({boardConfig:{},getBoardConfig:()=>t().boardConfig,setBoardConfig:r=>e({boardConfig:r}),updateBoardConfig:r=>e(n=>({boardConfig:{...n.boardConfig,...r}}))}),$r=(e,t)=>({session:{},getSessionInfo:()=>t().session,setSessionInfo:r=>e({session:r}),updateSessionInfo:r=>e(n=>({session:{...n.session,...r}}))}),jt=({storeName:e,children:t,defaultValue:r})=>{const{wire:n}=Ie("room"),[o,s]=d.useState(!1),[a]=d.useState(()=>De(tt({wire:n,storeName:e,defaultValue:r},(...u)=>({...Mr(...u),...jr(...u),...Dr(...u),...Rr(...u),...$r(...u)}))));return d.useEffect(()=>{const u=a.subscribe(l=>{l.ready&&(u(),s(!0))})},[a]),o?k(Mt.Provider,{value:a,children:t}):null},oe=(e,t)=>{const r=d.useContext(Mt);return $e(r,e,t||Ye)},Ar=()=>{const[e,t]=oe(n=>[n.itemIds,n.items]);return d.useMemo(()=>e.map(n=>t[n]),[e,t])},Lr=()=>{const[e,t,r]=oe(a=>[a.items,a.itemIds,a.getItemList]),[n,o]=d.useState(r()),[,s]=d.useTransition();return d.useEffect(()=>{const a=r();s(()=>{o(a)})},[e,t,r]),n},Dt=5e4,Rt=d.createContext(),zr=(e,t)=>({config:{itemTemplates:{},actions:{},uid:null,itemExtent:{x:0,y:0,radius:0},boardWrapperRect:{},boardSize:Dt},updateConfiguration:r=>e(n=>({config:{...n.config,...r}})),getConfiguration:()=>t().config}),Yr=(e,t)=>({boardState:{movingItems:!1,selecting:!1,zooming:!1,panning:!1,translateX:0,translateY:0,scale:1,rotate:0},updateBoardState:r=>e(n=>({boardState:{...n.boardState,...r}})),getBoardState:()=>t().boardState}),Br=(e,t)=>({interactions:{},getInteractions:()=>t().interactions,register:(r,n)=>e(o=>{const s=[...o.interactions[r]||[]];return s.push(n),{interactions:{...o.interactions,[r]:s}}}),unregister:(r,n)=>e(o=>{const s=(o.interactions[r]||[]).filter(a=>a!==n);return{interactions:{...o.interactions,[r]:s}}}),callInteractions:(r,n)=>{t().interactions[r]&&t().interactions[r].forEach(o=>{setTimeout(()=>o(n),0)})}}),Nr=(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}:{}})}),$t=({children:e})=>{const[t]=d.useState(()=>De((...r)=>({...zr(...r),...Yr(...r),...Br(...r),...Nr(...r)})));return k(Rt.Provider,{value:t,children:e})},Q=(e,t)=>{const r=d.useContext(Rt);return $e(r,e,t||Ye)},Xr=()=>{const[e]=Q(t=>[t.selection]);return e};function rt(e){const t=d.useRef(e);return t.current=e,d.useMemo(()=>Object.freeze({get current(){return t.current}}),[])}function Ur(e){const t=rt(e);d.useEffect(()=>()=>{t.current()},[])}function nt(e,t,r,n=0){const o=d.useRef(),s=d.useRef(),a=d.useRef(),u=()=>{o.current&&(clearTimeout(o.current),o.current=void 0),s.current&&(clearTimeout(s.current),s.current=void 0)};return Ur(u),d.useMemo(()=>{const l=()=>{if(!a.current)return;const f=a.current;a.current=void 0,e.apply(f.this,f.args),u()},m=function(...f){o.current&&clearTimeout(o.current),a.current={args:f,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 Wr=100,Vr=1e3,Fr=.8,Kr=({x:e,y:t,scale:r,rotate:n,itemExtent:o,boardWrapperRect:s,boardSize:a})=>{let[u,l]=[e,t];const m=Qe([s.width/2,s.height/2],{translateX:u,translateY:l,scale:r,rotate:n}),f={x:o.x+a/2,y:o.y+a/2},c={x:a/2,y:a/2},h=Ae(m,[f.x,f.y]),b=Math.min(s.width,s.height),v=o.radius+b/2/r-Wr/r;if(h>v){const y=It({x:m[0],y:m[1]},f,f,v-1/r)[0],[w,x]=Le([-y.x,-y.y],{translateX:s.width/2,translateY:s.height/2,scale:r,rotate:n});u=w,l=x}const E=Ae(m,[c.x,c.y]),O=a/2-Ae([0,0],[s.width,s.height])/r;if(E>O){const y=It({x:m[0],y:m[1]},c,c,O-1/r)[0];if(y){const[w,x]=Le([-y.x,-y.y],{translateX:s.width/2,translateY:s.height/2,scale:r,rotate:n});u=w,l=x}}return[u,l]},ve=()=>{const[e,t,r,n,o]=Q(p=>[p.getBoardState,p.updateBoardState,p.config.itemExtent,p.getConfiguration,p.updateConfiguration]),s=d.useRef([.15,5]),[a]=oe(p=>[p.getItemList]),u=d.useCallback(()=>{const{translateX:p,translateY:C,scale:g,rotate:S}=e();return{translateX:p,translateY:C,scale:g,rotate:S}},[e]),l=d.useCallback((p,C)=>Qe([p,C],e()),[e]),m=d.useCallback((p,C)=>Le([p,C],e()),[e]),f=d.useCallback((p,C)=>{const{scale:g,rotate:S}=e();return Qe([p,C],{translateX:0,translateY:0,rotate:S,scale:g})},[e]),c=d.useCallback(p=>p>s.current[1]?s.current[1]:p<s.current[0]?s.current[0]:p,[]),h=d.useCallback(p=>{const{itemExtent:C,boardWrapperRect:g,boardSize:S}=n(),T=e(),{translateX:P,translateY:D,scale:j,rotate:A}={...T,...p(T)},N=c(j);let[W,Z]=[P,D];(P!==T.translateX||D!==T.translateY)&&([W,Z]=Kr({x:P,y:D,scale:N,rotate:A,itemExtent:C,boardWrapperRect:g,boardSize:S})),t({translateX:W,translateY:Z,scale:N,rotate:A})},[c,e,n,t]),b=d.useCallback(p=>{let C=g=>({...g,...p});typeof p=="function"&&(C=p),h(g=>({...g,...C({translateX:g.translateX,translateY:g.translateY})}))},[h]),v=d.useCallback(({to:p,factor:C})=>{const{boardWrapperRect:g}=n();let S=p;S||(S={x:g.left+g.width/2,y:g.top+g.height/2});const T=e(),P=c(T.scale*C),D=S.x-g.left,j=S.y-g.top,A=D-(D-T.translateX)*P/T.scale,N=j-(j-T.translateY)*P/T.scale;h(W=>({...W,translateX:A,translateY:N,scale:P}))},[c,e,n,h]),E=d.useCallback(({x:p,y:C,radius:g})=>{const{rotate:S}=e(),{boardWrapperRect:T,boardSize:P}=n(),D=T.width/(g*2),j=T.height/(g*2),A=c(Math.min(D,j)*Fr),[N,W]=Le([-P/2-p,-P/2-C],{translateX:T.width/2,translateY:T.height/2,scale:A,rotate:S});h(Z=>({...Z,translateX:N,translateY:W,scale:A}))},[c,e,n,h]),O=d.useCallback(()=>{const{boardWrapperRect:p,boardSize:C}=n(),[g,S]=l(p.width/2,p.height/2);return{x:g-C/2,y:S-C/2}},[l,n]),y=d.useCallback(()=>{const p=a(),{boardWrapper:C,boardSize:g}=n(),S=p.reduce((P,D)=>{const j=ze(C,D.id);return P.left=Math.min(D.x,P.left),P.top=Math.min(D.y,P.top),P.right=Math.max(D.x+j.offsetWidth,P.right),P.bottom=Math.max(D.y+j.offsetHeight,P.bottom),P},{left:g/2,top:g/2,right:-g/2,bottom:-g/2}),T={x:(S.right+S.left)/2,y:(S.bottom+S.top)/2};T.radius=Math.max(Ae([T.x,T.y],[S.left,S.top]),Vr),o({itemExtent:T})},[n,a,o]),w=d.useCallback(p=>{let C=()=>p;typeof p=="function"&&(C=p),h(g=>({...g,rotate:C(g.rotate)})),y(),E(r)},[r,h,y,E]),x=nt(()=>y(),[y],200);return{setDim:h,rotateBoard:w,moveBoard:b,getDim:u,zoomTo:v,zoomToCenter:v,zoomToExtent:E,getCenter:O,updateItemExtent:x,vectorFromWrapperToBoard:f,fromWrapperToBoard:l,fromBoardToWrapper:m}},ot=e=>{const[t,r,n]=Q(({register:a,unregister:u,callInteractions:l})=>[a,u,l]),o=d.useCallback(a=>(t(e,a),()=>{r(e,a)}),[e,t,r]),s=d.useCallback(a=>{n(e,a)},[n,e]);return{register:o,call:s}},Be=()=>{const{call:e}=ot("place"),{call:t}=ot("delete"),{getCenter:r,updateItemExtent:n}=ve(),[o,s,a,u]=Q(M=>[M.clear,M.reverse,M.unselect,M.getConfiguration]),{getItems:l,getItemIds:m,setItemIds:f,updateItems:c,moveItems:h,removeItemsById:b,getItemList:v,insertItems:E,setItemList:O}=oe(({getItems:M,getItemIds:$,setItemIds:z,updateItems:F,moveItems:Y,removeItemsById:K,getItemList:q,insertItems:re,setItemList:ee})=>({getItems:M,getItemIds:$,setItemIds:z,updateItems:F,moveItems:Y,removeItemsById:K,getItemList:q,insertItems:re,setItemList:ee})),y=d.useCallback((M,$,z=!1)=>{let F=$;typeof $=="object"&&(F=()=>$);const Y=m().filter(ee=>M.includes(ee)),K=l(),q=Y.map(ee=>{const se=K[ee];return z?[ee,F(se)]:[ee,F({...se})]}).filter(([,ee])=>ee);if(q.length===0)return;const re=Object.fromEntries(q);c(re,z),n()},[m,l,n,c]),w=d.useCallback(M=>{O(M),o(),n()},[o,O,n]),x=d.useCallback((M,$,z=!1)=>{y([M],$,z)},[y]),p=d.useCallback((M,$)=>{h(Tt(l(),m(),M),$),n()},[m,l,h,n]),C=d.useCallback(M=>{const $=m(),z=$.filter(Y=>!M.includes(Y)),F=$.filter(Y=>M.includes(Y));f([...z,...F])},[m,f]),g=d.useCallback((M,{type:$,size:z}={})=>{const{boardWrapper:F}=u();y(M,Y=>{const K=ze(F,Y.id);if(!K)return;const q={type:$||"grid",size:z||1,offset:{x:0,y:0},...Y.grid};return kr({x:Y.x,y:Y.y,width:K.clientWidth,height:K.clientHeight},q)},!0)},[u,y]),S=d.useCallback((M,$)=>{const z=Tt(l(),m(),M);C(z),y(z,{moving:!1},!0),g(z,$),e(M),n()},[y,e,m,l,C,g,n]),T=d.useCallback(M=>{f(M)},[f]),P=d.useCallback(M=>{const $=m(),z=$.filter(Y=>M.includes(Y)),F=$.map(Y=>M.includes(Y)?z.pop():Y);f(F),s()},[m,s,f]),D=d.useCallback((M,$)=>{const z=l(),F=Object.fromEntries($.map((q,re)=>{const ee=z[M[re]];return[q,{x:ee.x,y:ee.y}]}));y(M,q=>F[q.id],!0);const Y=Object.fromEntries(M.map((q,re)=>[q,$[re]])),K=m().map(q=>M.includes(q)?Y[q]:q);f(K)},[l,y,m,f]),j=d.useCallback((M,$)=>{const z=r(),F=M.map((Y,K)=>!Y.x||!Y.y?{...Y,x:z.x+2*K,y:z.y+2*K}:Y);E(F,$),n()},[r,E,n]),A=d.useCallback((M,$)=>{j([M],$)},[j]),N=d.useCallback(M=>{a(M),b(M),t(M)},[a,b,t]),W=d.useCallback(M=>{const $=l();return M.map(z=>$[z])},[l]),Z=d.useCallback(({target:M,clientX:$,clientY:z},{returnLocked:F=!1,passLocked:Y=!1}={})=>{if(["INPUT","TEXTAREA"].includes(M.tagName))return null;const K=Oe(M,"item");if(K){if(he(K,"selected"))return K;if(!Y&&he(K,"locked")&&!he(M,"passthrough"))return F?K:null;if(he(M,"passthrough")){const q=m(),{boardWrapper:re}=u(),ee=q.reduce((se,le)=>{const Se=ze(re,le),be=Se.getBoundingClientRect();return et({x:$,y:z},be)&&se.unshift(Se),se},[]);for(let se=0;se<ee.length;se+=1){const le=ee[se];if(le!==K&&(Y||!he(le,"locked")))return le}return null}}return K},[u,m]);return{putItemsOnTop:C,batchUpdateItems:y,updateItemOrder:T,moveItems:p,placeItems:S,updateItem:x,swapItems:D,reverseItemsOrder:P,setItemList:w,pushItem:A,pushItems:j,removeItems:N,getItemList:v,findElementUnderPointer:Z,getItems:W}};var Hr=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 qr(e,t,r,n=0){d.useEffect(nt(e,t,r,n),t)}const Gr=(e,t)=>{if(e.type in t){const r=t[e.type].defaultActions;return typeof r=="function"?r(e):r}return[]},At=(e,t)=>{const{actions:r=Gr(e,t)}=e;return r.map(n=>typeof n=="string"?{name:n}:n)},Jr=()=>{const[e,t]=oe(c=>[c.items,c.getItems]),[r,n,o]=Q(c=>[c.config.itemTemplates,c.selection,c.getSelection]),[s,a]=d.useState([]),u=d.useRef(!1),[,l]=d.useTransition();d.useEffect(()=>(u.current=!0,()=>{u.current=!1}),[]);const m=d.useCallback(c=>{const h=t();if(c)return[c,c.map(v=>h[v])];const b=o();return[b,b.map(v=>h[v])]},[t,o]),f=d.useCallback(()=>{const[c,h]=m();if(c.length>0){if(!u.current)return;const b=h.reduce((v,E)=>{const O=At(E,r);return v.filter(y=>O.some(w=>Hr(y,w)))},At(h[0],r));l(()=>{a(b)})}else l(()=>{a([])})},[m,r]);return qr(()=>f(),[e,n,f],100),{availableActions:s}},Zr=()=>{const[e]=Q(t=>[t.selectionBox]);return e};let pe=(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 Lt=d.createContext(),st=e=>{localStorage.setItem("user",JSON.stringify(e))},Qr=()=>{if(localStorage.user){const t={name:"Player",color:Pt(),uid:pe(),...JSON.parse(localStorage.user)};return st(t),t}const e={name:"Player",color:Pt(),uid:pe()};return st(e),e},en=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&&st(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})}}),tn=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}})}),zt=({storeName:e,children:t})=>{const{wire:r,isMaster:n}=Ie("room"),[o,s]=d.useState(null),[a,u]=d.useState(!1),l=d.useRef(!1);return d.useEffect(()=>{let m=!0;const f=[];if(!o&&!l.current)return l.current=!0,(()=>{const h=De(tt({wire:r,storeName:e,noSync:["updateCurrentUser","joinSpace","isSpaceMaster","electSpaceMaster"]},(...v)=>({...en(r.userId)(...v),...tn(...v)}))),b=h.subscribe(v=>{v.ready&&(b(),m&&s(h))})})(),()=>{m=!1,l.current=!1,f.forEach(h=>h())}},[o,e,r,r.userId]),d.useEffect(()=>{if(o)return o.getState().addUser({...Qr(),id:r.userId}),u(!0),()=>{o.getState().removeUser(r.userId)}},[n,o,r]),d.useEffect(()=>{if(o){const m=r.subscribe("userLeave",f=>{o.getState().removeUser(f)});return()=>{m()}}},[n,o,r]),d.useEffect(()=>{n&&o&&o.getState().updateCurrentUser({isMaster:n})},[n,o,r]),a?k(Lt.Provider,{value:o,children:t}):null},ye=(e,t)=>{const r=d.useContext(Lt);return $e(r,e,t||Ye)},rn=()=>{const[e,t,r,n,o]=ye(u=>[u.isSpaceMaster,u.getUser(),u.users,u.updateCurrentUser,u.joinSpace]),s=d.useMemo(()=>Object.values(r),[r]),a=d.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}},nn=()=>{const[e,t,r]=oe(o=>[o.boardConfig,o.getBoardConfig,o.setBoardConfig]),n=d.useCallback(o=>{let s=o;typeof o=="object"&&(s=()=>o);const a=t(),u=s(a);r(u)},[t,r]);return[e,n]},on=()=>{const[e]=Q(t=>[t.boardState]);return e},sn=()=>{const[e,t,r,n]=oe(o=>[o.getSessionInfo,o.setSessionInfo,o.updateSessionInfo,o.session]);return{getSessionInfo:e,setSessionInfo:t,sessionInfo:n,updateSessionInfo:r}},Yt=d.createContext(),an=({user:{name:e,uid:t,color:r},content:n})=>({type:"message",user:{name:e,uid:t,color:r},content:n,uid:pe(),timestamp:new Date().toISOString()}),cn=(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=an({user:r,content:n});o&&t().addMessage(o)}}),Bt=({storeName:e,children:t,defaultValue:r=[]})=>{const{wire:n}=Ie("room"),[o]=d.useState(()=>De(tt({wire:n,storeName:e,defaultValue:r,noSync:["sendMessage"]},(...s)=>({...cn(...s)}))));return k(Yt.Provider,{value:o,children:t})},un=(e,t)=>{const r=d.useContext(Yt);return $e(r,e,t||Ye)},ln=()=>{},fn=(e=ln)=>{const t=ye(a=>a.getUser()),[r,n,o]=un(a=>[a.messages,a.setMessages,a.sendMessage]);d.useEffect(()=>{r.length&&e()},[r,e]);const s=d.useCallback(a=>{o(t,a)},[t,o]);return{messages:r,setMessages:n,sendMessage:s}},Nt=({children:e,session:t})=>{const r=ye(n=>n.joinSpace);return d.useEffect(()=>(r(t),()=>{r(null)}),[r,t]),e},dn=({socket:e,room:t,session:r,items:n=[],messages:o=[],LoadingComponent:s,...a})=>{const[u]=d.useState(t||pe()),[l]=d.useState(r||pe()),[m]=d.useState(()=>({itemIds:n.map(({id:c})=>c),items:Object.fromEntries(n.map(c=>[c.id,c]))}));return Ie("room")?k(Bt,{storeName:`${l}_messages`,defaultValue:o,children:k($t,{children:k(jt,{storeName:`${l}_item`,defaultValue:m,children:k(Nt,{...a,session:l})})})}):k(vt,{room:u,channel:"room",socket:e,LoadingComponent:s,children:k(zt,{storeName:`${u}_users`,children:k(Bt,{storeName:`${l}_messages`,defaultValue:o,children:k($t,{children:k(jt,{storeName:`${l}_item`,defaultValue:m,children:k(Nt,{...a,session:l})})})})})})},mn=({socket:e,room:t,children:r,LoadingComponent:n})=>{const[o]=d.useState(t||pe());return k(vt,{room:o,channel:"room",socket:e,LoadingComponent:n,children:k(zt,{storeName:`${o}_users`,children:r})})},it=()=>{const e=navigator.userAgent.toLowerCase();return/mac os ?x 10/.test(e)},pn=(()=>{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})(),gn=800,Xt=(e,t)=>{const r=Object.keys(e).map(n=>Number(n)).find(n=>n!==t);return e[r]},Ut=([e,t],[r,n])=>{const o=Math.abs(e-r),s=Math.abs(t-n);return Math.hypot(o,s)},ge=()=>{},hn=e=>t=>{const{event:r}=t;return r.isPropagationStopped()?null:e(t)},vn=e=>async(...t)=>{try{await e(...t)}catch(r){console.error(r)}};class yn{constructor(){ur(this,"lastPromise",Promise.resolve(!0))}add(t,...r){return new Promise((n,o)=>{this.lastPromise=this.lastPromise.then(()=>hn(vn(t))(...r)).then(n).catch(o)})}}const ie=new yn,Ne=({children:e,onDrag:t=ge,onDragStart:r=ge,onDragEnd:n=ge,onPan:o=ge,onTap:s=ge,onLongTap:a=ge,onDoubleTap:u=ge,onZoom:l,mainAction:m="drag"})=>{const f=d.useRef(null),c=d.useRef({moving:!1,pointers:{},mainPointer:void 0}),h=y=>{const{deltaX:w,deltaY:x,clientX:p,clientY:C,deltaMode:g,ctrlKey:S,altKey:T,metaKey:P,target:D}=y;if(!(T||S&&!it()))if(it()&&!S)ie.add(o,{deltaX:-2*w,deltaY:-2*x,button:1,ctrlKey:S,metaKey:P,target:D,event:y});else{if(l===void 0||!x)return;let j=x;switch(g){case 1:j*=pn;break;case 2:j*=gn;break}it()&&(j*=2),ie.add(l,{scale:j,clientX:p,clientY:C,event:y})}},b=y=>{const{target:w,button:x,clientX:p,clientY:C,pointerId:g,altKey:S,ctrlKey:T,metaKey:P,isPrimary:D}=y;if(c.current.pointers[g]={clientX:p,clientY:C},D&&(c.current.mainPointer=void 0),c.current.mainPointer!==void 0){if(c.current.mainPointer!==g)try{const{clientX:j,clientY:A}=Xt(c.current.pointers,g),N=(j+p)/2,W=(A+C)/2,Z=Ut([j,A],[p,C]);Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:C,prevX:N,prevY:W,startDistance:Z,prevDistance:Z})}catch(j){console.log("Error while getting other pointer. Ignoring",j),c.current.mainPointer}return}c.current.mainPointer=g,Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:C,prevX:p,prevY:C,currentButton:x,pointerDownEvent:y,startDistance:0,prevDistance:0,target:w,timeStart:Date.now(),longTapTimeout:setTimeout(async()=>{c.current.noTap=!0,ie.add(a,{clientX:p,clientY:C,altKey:S,ctrlKey:T,metaKey:P,target:w,event:y})},750)});try{w.setPointerCapture(g)}catch(j){console.log("Fail to capture pointer",j)}},v=y=>{if(c.current.pressed){const{pointerId:w,clientX:x,clientY:p,altKey:C,shiftKey:g,ctrlKey:S,metaKey:T,buttons:P}=y;c.current.pointers[w]={clientX:x,clientY:p},c.current.moving=!0;const D=Object.keys(c.current.pointers).length===2;let j,A,N=0;if(D){const{clientX:$,clientY:z}=Xt(c.current.pointers,w);j=($+x)/2,A=(z+p)/2,N=Ut([$,z],[x,p])}else j=x,A=p;let W=g||C||S||T||P!==1;m!=="drag"&&(W=!W);const Z=!W,M=W;if(Z){c.current.gestureStart||(f.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout),ie.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:C,shiftKey:g,ctrlKey:S,metaKey:T,target:c.current.target,event:c.current.pointerDownEvent}));const $=j-c.current.prevX,z=A-c.current.prevY,F=j-c.current.startX,Y=A-c.current.startY;ie.add(t,{deltaX:$,deltaY:z,startX:c.current.startX,startY:c.current.startY,clientX:j,clientY:A,distanceX:F,distanceY:Y,button:c.current.currentButton,altKey:C,shiftKey:g,ctrlKey:S,metaKey:T,target:c.current.target,event:y})}if(M){c.current.gestureStart||(f.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout));const $=j-c.current.prevX,z=A-c.current.prevY,{target:F}=c.current;if(ie.add(o,{deltaX:$,deltaY:z,button:c.current.currentButton,altKey:C,shiftKey:g,ctrlKey:S,metaKey:T,target:F,event:y}),N!==c.current.prevDistance&&l){const Y=c.current.prevDistance-N;Math.abs(Y)>0&&(ie.add(l,{scale:Y*3,clientX:j,clientY:A,event:y}),c.current.prevDistance=N)}}c.current.prevX=j,c.current.prevY=A}},E=y=>{const{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T,pointerId:P}=y;if(c.current.pointers[P]){if(delete c.current.pointers[P],c.current.mainPointer!==P){const{clientX:D,clientY:j}=c.current.pointers[c.current.mainPointer];Object.assign(c.current,{prevX:D,prevY:j,prevDistance:0,startDistance:0});return}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);const{clientX:D,clientY:j}=c.current.pointers[c.current.mainPointer];Object.assign(c.current,{prevX:D,prevY:j,prevDistance:0,startDistance:0});return}catch(D){console.log("Fails to set pointer capture",D),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,ie.add(n,{deltaX:w-c.current.prevX,deltaY:x-c.current.prevY,startX:c.current.startX,startY:c.current.startY,clientX:w,clientY:x,distanceX:w-c.current.startX,distanceY:x-c.current.startY,button:c.current.currentButton,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,event:y}),f.current.style.cursor="auto";else{const D=Date.now();c.current.noTap?c.current.noTap=!1:c.current.timeStart-D<300&&ie.add(s,{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T,event:y})}}};return k("div",{onWheel:h,onPointerDown:b,onPointerMove:v,onPointerUp:E,onPointerOut:E,onPointerLeave:E,onPointerCancel:E,onDoubleClick:y=>{const{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T}=y;ie.add(u,{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T,event:y})},style:{touchAction:"none"},ref:f,children:e})},at=({onResize:e,...t})=>{const[r]=Q(o=>[o.getBoardState]);return k(Ne,{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 Sn={data:""},bn=e=>typeof window=="object"?((e?e.querySelector("#_goober"):window._goober)||Object.assign((e||document.head).appendChild(document.createElement("style")),{innerHTML:" ",id:"_goober"})).firstChild:e||Sn,_n=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,En=/\/\*[^]*?\*\/| +/g,Wt=/\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},ce={},Vt=e=>{if(typeof e=="object"){let t="";for(let r in e)t+=r+Vt(e[r]);return t}return e},Cn=(e,t,r,n,o)=>{let s=Vt(e),a=ce[s]||(ce[s]=(l=>{let m=0,f=11;for(;m<l.length;)f=101*f+l.charCodeAt(m++)>>>0;return"go"+f})(s));if(!ce[a]){let l=s!==e?e:(m=>{let f,c,h=[{}];for(;f=_n.exec(m.replace(En,""));)f[4]?h.shift():f[3]?(c=f[3].replace(Wt," ").trim(),h.unshift(h[0][c]=h[0][c]||{})):h[0][f[1]]=f[2].replace(Wt," ").trim();return h[0]})(e);ce[a]=de(o?{["@keyframes "+a]:l}:l,r?"":"."+a)}let u=r&&ce.g?ce.g:null;return r&&(ce.g=ce[a]),((l,m,f,c)=>{c?m.data=m.data.replace(c,l):m.data.indexOf(l)===-1&&(m.data=f?l+m.data:m.data+l)})(ce[a],t,n,u),a},wn=(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 H(e){let t=this||{},r=e.call?e(t.p):e;return Cn(r.unshift?r.raw?wn(r,[].slice.call(arguments,1),t.p):r.reduce((n,o)=>Object.assign(n,o&&o.call?o(t.p):o),{}):r,bn(t.target),t.g,t.o,t.k)}H.bind({g:1}),H.bind({k:1});function xn(e,t,r,n){de.p=t}var In=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 On=H`
|
|
59
|
+
*/var wt;function Cr(){return wt||(wt=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=d,t=Et();function r(f,c){return f===c&&(f!==0||1/f===1/c)||f!==f&&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(f,c,h,b,v){var E=s(null),O;E.current===null?(O={hasValue:!1,value:null},E.current=O):O=E.current;var y=u(function(){var C=!1,g,S,T=function(A){if(!C){C=!0,g=A;var N=b(A);if(v!==void 0&&O.hasValue){var W=O.value;if(v(W,N))return S=W,W}return S=N,N}var Z=g,M=S;if(n(Z,A))return M;var $=b(A);return v!==void 0&&v(M,$)?M:(g=A,S=$,$)},P=h===void 0?null:h,D=function(){return T(c())},j=P===null?void 0:function(){return T(P())};return[D,j]},[c,h,b,v]),w=y[0],x=y[1],p=o(f,w,x);return a(function(){O.hasValue=!0,O.value=p},[p]),l(p),p}Ze.useSyncExternalStoreWithSelector=m,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error)}()),Ze}(function(e){process.env.NODE_ENV==="production"?e.exports=Er():e.exports=Cr()})(yr);const wr=me(He),{useSyncExternalStoreWithSelector:xr}=wr;function $e(e,t=e.getState,r){const n=xr(e.subscribe,e.getState,e.getServerState||e.getState,t,r);return d.useDebugValue(n),n}const he=(e,t)=>e.classList&&e.classList.contains(t),Oe=(e,t)=>he(e,t)?e:e.parentNode?Oe(e.parentNode,t):!1,Ae=([e,t],[r,n])=>{const o=Math.abs(e-r),s=Math.abs(t-n);return Math.hypot(o,s)},xt=(e,t,r)=>{const n=r*Math.PI/180,o=e*Math.cos(n)-t*Math.sin(n),s=e*Math.sin(n)+t*Math.cos(n);return[o,s]},Qe=([e,t],{scale:r,rotate:n,translateX:o,translateY:s})=>{const a=(e-o)/r,u=(t-s)/r;return xt(a,u,-n)},Le=([e,t],{scale:r,rotate:n,translateX:o,translateY:s})=>{const[a,u]=xt(e,t,n);return[a*r+o,u*r+s]},It=(e,t,r,n)=>{const o=e.x,s=e.y,a=t.x,u=t.y,l=r.x,m=r.y,f=a-o,c=u-s,h=o-l,b=s-m,v=f*f+c*c,E=2*(h*f+b*c),O=h*h+b*b-n*n,y=E*E-4*v*O;if(y<0)return[];const w=(-E+Math.sqrt(y))/(2*v),x=(-E-Math.sqrt(y))/(2*v),p=[];return w>=0&&w<=1&&p.push({x:o+w*f,y:s+w*c}),x>=0&&x<=1&&p.push({x:o+x*f,y:s+x*c}),p},et=(e,t)=>e.x>t.left&&e.x<t.left+t.width&&e.y>t.top&&e.y<t.top+t.height,Ir=(e,t)=>Array.from(e.querySelectorAll(".corner")).every(n=>{const{top:o,left:s}=n.getBoundingClientRect();return et({x:s,y:o},t)}),Or=(e,t)=>{const r=t.getBoundingClientRect();return Ir(e,r)},ze=(e,t)=>{try{const n=e.getElementsByClassName(`item ${t}`)[0];return n||console.error(`Missing item ${t}`),n}catch{console.error(`Error while getting item with id ${t} with wrapper`,e);return}},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},Tr=(e,t=document)=>{const r=e.reduce((n,o)=>{const s=ze(t,o);if(!s)return n||null;const{left:a,right:u,top:l,bottom:m}=s.getBoundingClientRect();let f;return n?f=n:f={left:a,top:l,right:u,bottom:m},f.left=Math.min(a,f.left),f.top=Math.min(l,f.top),f.right=Math.max(u,f.right),f.bottom=Math.max(m,f.bottom),f},null);return r&&(r.width=r.right-r.left,r.height=r.bottom-r.top,r)},Ot=(e,t,r=null)=>(r===null&&(r=new Set),!Array.isArray(t)||t.length===0?[]:t.map(n=>r.has(n)?[]:(r.add(n),[n,...Ot(e,e[n].linkedItems,r)])).flat()),Tt=(e,t,r)=>{const n=new Set(Ot(e,r));return t.filter(o=>n.has(o))},kr=({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,f,c,h,b,v,E,O,y,w;const x=s/1.1547;switch(o){case"grid":m=Math.round(u/s)*s,f=Math.round(l/s)*s;break;case"hexH":c=2*x,h=3*s,b=Math.round(u/c)*c,E=Math.round(l/h)*h,v=b>u?b-x:b+x,O=E>l?E-1.5*s:E+1.5*s,y=Math.hypot(b-u,E-l),w=Math.hypot(v-u,O-l),y<w?(m=b,f=E):(m=v,f=O);break;case"hexV":c=3*s,h=2*x,b=Math.round(u/c)*c,E=Math.round(l/h)*h,v=b>u?b-1.5*s:b+1.5*s,O=E>l?E-x:E+x,y=Math.hypot(b-u,E-l),w=Math.hypot(v-u,O-l),y<w?(m=b,f=E):(m=v,f=O);break;default:m=e+r/2,f=t+n/2}return{x:m+a.x-r/2,y:f+a.y-n/2}},kt=["#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"],Pt=()=>kt[Math.floor(Math.random()*kt.length)],Pr=!1,tt=({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`);Pr&&console.log("init from peer with value",b),s(v=>({...v,...b}))}catch{n!==void 0&&s(n)}l.push(await e.register(`${t}_getValue`,()=>Object.fromEntries(Object.entries(a()).filter(([b,v])=>typeof v!="function"&&!r.includes(b))),{invoke:"first"})),l.push(e.subscribe(`${t}_call`,([b,v])=>{c[b](...v)})),s({ready:!0})})();const f=o(s,a,u),c={...f},h=Object.fromEntries(Object.entries(f).map(([b,v])=>typeof v=="function"&&!b.startsWith("get")&&!r.includes(b)?[b,(...O)=>{const y=v(...O);return e.publish(`${t}_call`,[b,O]),y}]:[b,v]));return h.unsub=()=>{l.forEach(b=>b())},h};function Ye(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 Mt=d.createContext(),Mr=(e,t)=>({items:{},getItems:()=>t().items,setItems:r=>e({items:r}),updateItems:(r,n=!1)=>e(o=>n?{items:Object.fromEntries(Object.entries(o.items).map(([a,u])=>r[a]?[a,{...u,...r[a]}]:[a,u]))}:{items:{...o.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}})}),jr=(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)}))}),Dr=(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}})}),Rr=(e,t)=>({boardConfig:{},getBoardConfig:()=>t().boardConfig,setBoardConfig:r=>e({boardConfig:r}),updateBoardConfig:r=>e(n=>({boardConfig:{...n.boardConfig,...r}}))}),$r=(e,t)=>({session:{},getSessionInfo:()=>t().session,setSessionInfo:r=>e({session:r}),updateSessionInfo:r=>e(n=>({session:{...n.session,...r}}))}),jt=({storeName:e,children:t,defaultValue:r})=>{const{wire:n}=Ie("room"),[o,s]=d.useState(!1),[a]=d.useState(()=>De(tt({wire:n,storeName:e,defaultValue:r},(...u)=>({...Mr(...u),...jr(...u),...Dr(...u),...Rr(...u),...$r(...u)}))));return d.useEffect(()=>{const u=a.subscribe(l=>{l.ready&&(u(),s(!0))})},[a]),o?k(Mt.Provider,{value:a,children:t}):null},oe=(e,t)=>{const r=d.useContext(Mt);return $e(r,e,t||Ye)},Ar=()=>{const[e,t]=oe(n=>[n.itemIds,n.items]);return d.useMemo(()=>e.map(n=>t[n]),[e,t])},Lr=()=>{const[e,t,r]=oe(a=>[a.items,a.itemIds,a.getItemList]),[n,o]=d.useState(r()),[,s]=d.useTransition();return d.useEffect(()=>{const a=r();s(()=>{o(a)})},[e,t,r]),n},Dt=5e4,Rt=d.createContext(),zr=(e,t)=>({config:{itemTemplates:{},actions:{},uid:null,itemExtent:{x:0,y:0,radius:0},boardWrapperRect:{},boardSize:Dt},updateConfiguration:r=>e(n=>({config:{...n.config,...r}})),getConfiguration:()=>t().config}),Yr=(e,t)=>({boardState:{movingItems:!1,selecting:!1,zooming:!1,panning:!1,translateX:0,translateY:0,scale:1,rotate:0},updateBoardState:r=>e(n=>({boardState:{...n.boardState,...r}})),getBoardState:()=>t().boardState}),Br=(e,t)=>({interactions:{},getInteractions:()=>t().interactions,register:(r,n)=>e(o=>{const s=[...o.interactions[r]||[]];return s.push(n),{interactions:{...o.interactions,[r]:s}}}),unregister:(r,n)=>e(o=>{const s=(o.interactions[r]||[]).filter(a=>a!==n);return{interactions:{...o.interactions,[r]:s}}}),callInteractions:(r,n)=>{t().interactions[r]&&t().interactions[r].forEach(o=>{setTimeout(()=>o(n),0)})}}),Nr=(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}:{}})}),$t=({children:e})=>{const[t]=d.useState(()=>De((...r)=>({...zr(...r),...Yr(...r),...Br(...r),...Nr(...r)})));return k(Rt.Provider,{value:t,children:e})},Q=(e,t)=>{const r=d.useContext(Rt);return $e(r,e,t||Ye)},Xr=()=>{const[e]=Q(t=>[t.selection]);return e};function rt(e){const t=d.useRef(e);return t.current=e,d.useMemo(()=>Object.freeze({get current(){return t.current}}),[])}function Ur(e){const t=rt(e);d.useEffect(()=>()=>{t.current()},[])}function nt(e,t,r,n=0){const o=d.useRef(),s=d.useRef(),a=d.useRef(),u=()=>{o.current&&(clearTimeout(o.current),o.current=void 0),s.current&&(clearTimeout(s.current),s.current=void 0)};return Ur(u),d.useMemo(()=>{const l=()=>{if(!a.current)return;const f=a.current;a.current=void 0,e.apply(f.this,f.args),u()},m=function(...f){o.current&&clearTimeout(o.current),a.current={args:f,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 Wr=100,Vr=1e3,Fr=.8,Kr=({x:e,y:t,scale:r,rotate:n,itemExtent:o,boardWrapperRect:s,boardSize:a})=>{let[u,l]=[e,t];const m=Qe([s.width/2,s.height/2],{translateX:u,translateY:l,scale:r,rotate:n}),f={x:o.x+a/2,y:o.y+a/2},c={x:a/2,y:a/2},h=Ae(m,[f.x,f.y]),b=Math.min(s.width,s.height),v=o.radius+b/2/r-Wr/r;if(h>v){const y=It({x:m[0],y:m[1]},f,f,v-1/r)[0],[w,x]=Le([-y.x,-y.y],{translateX:s.width/2,translateY:s.height/2,scale:r,rotate:n});u=w,l=x}const E=Ae(m,[c.x,c.y]),O=a/2-Ae([0,0],[s.width,s.height])/r;if(E>O){const y=It({x:m[0],y:m[1]},c,c,O-1/r)[0];if(y){const[w,x]=Le([-y.x,-y.y],{translateX:s.width/2,translateY:s.height/2,scale:r,rotate:n});u=w,l=x}}return[u,l]},ve=()=>{const[e,t,r,n,o]=Q(p=>[p.getBoardState,p.updateBoardState,p.config.itemExtent,p.getConfiguration,p.updateConfiguration]),s=d.useRef([.15,5]),[a]=oe(p=>[p.getItemList]),u=d.useCallback(()=>{const{translateX:p,translateY:C,scale:g,rotate:S}=e();return{translateX:p,translateY:C,scale:g,rotate:S}},[e]),l=d.useCallback((p,C)=>Qe([p,C],e()),[e]),m=d.useCallback((p,C)=>Le([p,C],e()),[e]),f=d.useCallback((p,C)=>{const{scale:g,rotate:S}=e();return Qe([p,C],{translateX:0,translateY:0,rotate:S,scale:g})},[e]),c=d.useCallback(p=>p>s.current[1]?s.current[1]:p<s.current[0]?s.current[0]:p,[]),h=d.useCallback(p=>{const{itemExtent:C,boardWrapperRect:g,boardSize:S}=n(),T=e(),{translateX:P,translateY:D,scale:j,rotate:A}={...T,...p(T)},N=c(j);let[W,Z]=[P,D];(P!==T.translateX||D!==T.translateY)&&([W,Z]=Kr({x:P,y:D,scale:N,rotate:A,itemExtent:C,boardWrapperRect:g,boardSize:S})),t({translateX:W,translateY:Z,scale:N,rotate:A})},[c,e,n,t]),b=d.useCallback(p=>{let C=g=>({...g,...p});typeof p=="function"&&(C=p),h(g=>({...g,...C({translateX:g.translateX,translateY:g.translateY})}))},[h]),v=d.useCallback(({to:p,factor:C})=>{const{boardWrapperRect:g}=n();let S=p;S||(S={x:g.left+g.width/2,y:g.top+g.height/2});const T=e(),P=c(T.scale*C),D=S.x-g.left,j=S.y-g.top,A=D-(D-T.translateX)*P/T.scale,N=j-(j-T.translateY)*P/T.scale;h(W=>({...W,translateX:A,translateY:N,scale:P}))},[c,e,n,h]),E=d.useCallback(({x:p,y:C,radius:g})=>{const{rotate:S}=e(),{boardWrapperRect:T,boardSize:P}=n(),D=T.width/(g*2),j=T.height/(g*2),A=c(Math.min(D,j)*Fr),[N,W]=Le([-P/2-p,-P/2-C],{translateX:T.width/2,translateY:T.height/2,scale:A,rotate:S});h(Z=>({...Z,translateX:N,translateY:W,scale:A}))},[c,e,n,h]),O=d.useCallback(()=>{const{boardWrapperRect:p,boardSize:C}=n(),[g,S]=l(p.width/2,p.height/2);return{x:g-C/2,y:S-C/2}},[l,n]),y=d.useCallback(()=>{const p=a(),{boardWrapper:C,boardSize:g}=n(),S=p.reduce((P,D)=>{const j=ze(C,D.id);return j&&(P.left=Math.min(D.x,P.left),P.top=Math.min(D.y,P.top),P.right=Math.max(D.x+j.offsetWidth,P.right),P.bottom=Math.max(D.y+j.offsetHeight,P.bottom)),P},{left:g/2,top:g/2,right:-g/2,bottom:-g/2}),T={x:(S.right+S.left)/2,y:(S.bottom+S.top)/2};T.radius=Math.max(Ae([T.x,T.y],[S.left,S.top]),Vr),o({itemExtent:T})},[n,a,o]),w=d.useCallback(p=>{let C=()=>p;typeof p=="function"&&(C=p),h(g=>({...g,rotate:C(g.rotate)})),y(),E(r)},[r,h,y,E]),x=nt(()=>y(),[y],200);return{setDim:h,rotateBoard:w,moveBoard:b,getDim:u,zoomTo:v,zoomToCenter:v,zoomToExtent:E,getCenter:O,updateItemExtent:x,vectorFromWrapperToBoard:f,fromWrapperToBoard:l,fromBoardToWrapper:m}},ot=e=>{const[t,r,n]=Q(({register:a,unregister:u,callInteractions:l})=>[a,u,l]),o=d.useCallback(a=>(t(e,a),()=>{r(e,a)}),[e,t,r]),s=d.useCallback(a=>{n(e,a)},[n,e]);return{register:o,call:s}},Be=()=>{const{call:e}=ot("place"),{call:t}=ot("delete"),{getCenter:r,updateItemExtent:n}=ve(),[o,s,a,u]=Q(M=>[M.clear,M.reverse,M.unselect,M.getConfiguration]),{getItems:l,getItemIds:m,setItemIds:f,updateItems:c,moveItems:h,removeItemsById:b,getItemList:v,insertItems:E,setItemList:O}=oe(({getItems:M,getItemIds:$,setItemIds:z,updateItems:F,moveItems:Y,removeItemsById:K,getItemList:q,insertItems:re,setItemList:ee})=>({getItems:M,getItemIds:$,setItemIds:z,updateItems:F,moveItems:Y,removeItemsById:K,getItemList:q,insertItems:re,setItemList:ee})),y=d.useCallback((M,$,z=!1)=>{let F=$;typeof $=="object"&&(F=()=>$);const Y=m().filter(ee=>M.includes(ee)),K=l(),q=Y.map(ee=>{const se=K[ee];return z?[ee,F(se)]:[ee,F({...se})]}).filter(([,ee])=>ee);if(q.length===0)return;const re=Object.fromEntries(q);c(re,z),n()},[m,l,n,c]),w=d.useCallback(M=>{O(M),o(),n()},[o,O,n]),x=d.useCallback((M,$,z=!1)=>{y([M],$,z)},[y]),p=d.useCallback((M,$)=>{h(Tt(l(),m(),M),$),n()},[m,l,h,n]),C=d.useCallback(M=>{const $=m(),z=$.filter(Y=>!M.includes(Y)),F=$.filter(Y=>M.includes(Y));f([...z,...F])},[m,f]),g=d.useCallback((M,{type:$,size:z}={})=>{const{boardWrapper:F}=u();y(M,Y=>{const K=ze(F,Y.id);if(!K)return;const q={type:$||"grid",size:z||1,offset:{x:0,y:0},...Y.grid};return kr({x:Y.x,y:Y.y,width:K.clientWidth,height:K.clientHeight},q)},!0)},[u,y]),S=d.useCallback((M,$)=>{const z=Tt(l(),m(),M);C(z),y(z,{moving:!1},!0),g(z,$),e(M),n()},[y,e,m,l,C,g,n]),T=d.useCallback(M=>{f(M)},[f]),P=d.useCallback(M=>{const $=m(),z=$.filter(Y=>M.includes(Y)),F=$.map(Y=>M.includes(Y)?z.pop():Y);f(F),s()},[m,s,f]),D=d.useCallback((M,$)=>{const z=l(),F=Object.fromEntries($.map((q,re)=>{const ee=z[M[re]];return[q,{x:ee.x,y:ee.y}]}));y(M,q=>F[q.id],!0);const Y=Object.fromEntries(M.map((q,re)=>[q,$[re]])),K=m().map(q=>M.includes(q)?Y[q]:q);f(K)},[l,y,m,f]),j=d.useCallback((M,$)=>{const z=r(),F=M.map((Y,K)=>!Y.x||!Y.y?{...Y,x:z.x+2*K,y:z.y+2*K}:Y);E(F,$),n()},[r,E,n]),A=d.useCallback((M,$)=>{j([M],$)},[j]),N=d.useCallback(M=>{a(M),b(M),t(M)},[a,b,t]),W=d.useCallback(M=>{const $=l();return M.map(z=>$[z])},[l]),Z=d.useCallback(({target:M,clientX:$,clientY:z},{returnLocked:F=!1,passLocked:Y=!1}={})=>{if(["INPUT","TEXTAREA"].includes(M.tagName))return null;const K=Oe(M,"item");if(K){if(he(K,"selected"))return K;if(!Y&&he(K,"locked")&&!he(M,"passthrough"))return F?K:null;if(he(M,"passthrough")){const q=m(),{boardWrapper:re}=u(),ee=q.reduce((se,le)=>{const Se=ze(re,le),be=Se.getBoundingClientRect();return et({x:$,y:z},be)&&se.unshift(Se),se},[]);for(let se=0;se<ee.length;se+=1){const le=ee[se];if(le!==K&&(Y||!he(le,"locked")))return le}return null}}return K},[u,m]);return{putItemsOnTop:C,batchUpdateItems:y,updateItemOrder:T,moveItems:p,placeItems:S,updateItem:x,swapItems:D,reverseItemsOrder:P,setItemList:w,pushItem:A,pushItems:j,removeItems:N,getItemList:v,findElementUnderPointer:Z,getItems:W}};var Hr=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 qr(e,t,r,n=0){d.useEffect(nt(e,t,r,n),t)}const Gr=(e,t)=>{if(e.type in t){const r=t[e.type].defaultActions;return typeof r=="function"?r(e):r}return[]},At=(e,t)=>{const{actions:r=Gr(e,t)}=e;return r.map(n=>typeof n=="string"?{name:n}:n)},Jr=()=>{const[e,t]=oe(c=>[c.items,c.getItems]),[r,n,o]=Q(c=>[c.config.itemTemplates,c.selection,c.getSelection]),[s,a]=d.useState([]),u=d.useRef(!1),[,l]=d.useTransition();d.useEffect(()=>(u.current=!0,()=>{u.current=!1}),[]);const m=d.useCallback(c=>{const h=t();if(c)return[c,c.map(v=>h[v])];const b=o();return[b,b.map(v=>h[v])]},[t,o]),f=d.useCallback(()=>{const[c,h]=m();if(c.length>0){if(!u.current)return;const b=h.reduce((v,E)=>{const O=At(E,r);return v.filter(y=>O.some(w=>Hr(y,w)))},At(h[0],r));l(()=>{a(b)})}else l(()=>{a([])})},[m,r]);return qr(()=>f(),[e,n,f],100),{availableActions:s}},Zr=()=>{const[e]=Q(t=>[t.selectionBox]);return e};let pe=(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 Lt=d.createContext(),st=e=>{localStorage.setItem("user",JSON.stringify(e))},Qr=()=>{if(localStorage.user){const t={name:"Player",color:Pt(),uid:pe(),...JSON.parse(localStorage.user)};return st(t),t}const e={name:"Player",color:Pt(),uid:pe()};return st(e),e},en=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&&st(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})}}),tn=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}})}),zt=({storeName:e,children:t})=>{const{wire:r,isMaster:n}=Ie("room"),[o,s]=d.useState(null),[a,u]=d.useState(!1),l=d.useRef(!1);return d.useEffect(()=>{let m=!0;const f=[];if(!o&&!l.current)return l.current=!0,(()=>{const h=De(tt({wire:r,storeName:e,noSync:["updateCurrentUser","joinSpace","isSpaceMaster","electSpaceMaster"]},(...v)=>({...en(r.userId)(...v),...tn(...v)}))),b=h.subscribe(v=>{v.ready&&(b(),m&&s(h))})})(),()=>{m=!1,l.current=!1,f.forEach(h=>h())}},[o,e,r,r.userId]),d.useEffect(()=>{if(o)return o.getState().addUser({...Qr(),id:r.userId}),u(!0),()=>{o.getState().removeUser(r.userId)}},[n,o,r]),d.useEffect(()=>{if(o){const m=r.subscribe("userLeave",f=>{o.getState().removeUser(f)});return()=>{m()}}},[n,o,r]),d.useEffect(()=>{n&&o&&o.getState().updateCurrentUser({isMaster:n})},[n,o,r]),a?k(Lt.Provider,{value:o,children:t}):null},ye=(e,t)=>{const r=d.useContext(Lt);return $e(r,e,t||Ye)},rn=()=>{const[e,t,r,n,o]=ye(u=>[u.isSpaceMaster,u.getUser(),u.users,u.updateCurrentUser,u.joinSpace]),s=d.useMemo(()=>Object.values(r),[r]),a=d.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}},nn=()=>{const[e,t,r]=oe(o=>[o.boardConfig,o.getBoardConfig,o.setBoardConfig]),n=d.useCallback(o=>{let s=o;typeof o=="object"&&(s=()=>o);const a=t(),u=s(a);r(u)},[t,r]);return[e,n]},on=()=>{const[e]=Q(t=>[t.boardState]);return e},sn=()=>{const[e,t,r,n]=oe(o=>[o.getSessionInfo,o.setSessionInfo,o.updateSessionInfo,o.session]);return{getSessionInfo:e,setSessionInfo:t,sessionInfo:n,updateSessionInfo:r}},Yt=d.createContext(),an=({user:{name:e,uid:t,color:r},content:n})=>({type:"message",user:{name:e,uid:t,color:r},content:n,uid:pe(),timestamp:new Date().toISOString()}),cn=(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=an({user:r,content:n});o&&t().addMessage(o)}}),Bt=({storeName:e,children:t,defaultValue:r=[]})=>{const{wire:n}=Ie("room"),[o]=d.useState(()=>De(tt({wire:n,storeName:e,defaultValue:r,noSync:["sendMessage"]},(...s)=>({...cn(...s)}))));return k(Yt.Provider,{value:o,children:t})},un=(e,t)=>{const r=d.useContext(Yt);return $e(r,e,t||Ye)},ln=()=>{},fn=(e=ln)=>{const t=ye(a=>a.getUser()),[r,n,o]=un(a=>[a.messages,a.setMessages,a.sendMessage]);d.useEffect(()=>{r.length&&e()},[r,e]);const s=d.useCallback(a=>{o(t,a)},[t,o]);return{messages:r,setMessages:n,sendMessage:s}},Nt=({children:e,session:t})=>{const r=ye(n=>n.joinSpace);return d.useEffect(()=>(r(t),()=>{r(null)}),[r,t]),e},dn=({socket:e,room:t,session:r,items:n=[],messages:o=[],LoadingComponent:s,...a})=>{const[u]=d.useState(t||pe()),[l]=d.useState(r||pe()),[m]=d.useState(()=>({itemIds:n.map(({id:c})=>c),items:Object.fromEntries(n.map(c=>[c.id,c]))}));return Ie("room")?k(Bt,{storeName:`${l}_messages`,defaultValue:o,children:k($t,{children:k(jt,{storeName:`${l}_item`,defaultValue:m,children:k(Nt,{...a,session:l})})})}):k(vt,{room:u,channel:"room",socket:e,LoadingComponent:s,children:k(zt,{storeName:`${u}_users`,children:k(Bt,{storeName:`${l}_messages`,defaultValue:o,children:k($t,{children:k(jt,{storeName:`${l}_item`,defaultValue:m,children:k(Nt,{...a,session:l})})})})})})},mn=({socket:e,room:t,children:r,LoadingComponent:n})=>{const[o]=d.useState(t||pe());return k(vt,{room:o,channel:"room",socket:e,LoadingComponent:n,children:k(zt,{storeName:`${o}_users`,children:r})})},it=()=>{const e=navigator.userAgent.toLowerCase();return/mac os ?x 10/.test(e)},pn=(()=>{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})(),gn=800,Xt=(e,t)=>{const r=Object.keys(e).map(n=>Number(n)).find(n=>n!==t);return e[r]},Ut=([e,t],[r,n])=>{const o=Math.abs(e-r),s=Math.abs(t-n);return Math.hypot(o,s)},ge=()=>{},hn=e=>t=>{const{event:r}=t;return r.isPropagationStopped()?null:e(t)},vn=e=>async(...t)=>{try{await e(...t)}catch(r){console.error(r)}};class yn{constructor(){ur(this,"lastPromise",Promise.resolve(!0))}add(t,...r){return new Promise((n,o)=>{this.lastPromise=this.lastPromise.then(()=>hn(vn(t))(...r)).then(n).catch(o)})}}const ie=new yn,Ne=({children:e,onDrag:t=ge,onDragStart:r=ge,onDragEnd:n=ge,onPan:o=ge,onTap:s=ge,onLongTap:a=ge,onDoubleTap:u=ge,onZoom:l,mainAction:m="drag"})=>{const f=d.useRef(null),c=d.useRef({moving:!1,pointers:{},mainPointer:void 0}),h=y=>{const{deltaX:w,deltaY:x,clientX:p,clientY:C,deltaMode:g,ctrlKey:S,altKey:T,metaKey:P,target:D}=y;if(!(T||S&&!it()))if(it()&&!S)ie.add(o,{deltaX:-2*w,deltaY:-2*x,button:1,ctrlKey:S,metaKey:P,target:D,event:y});else{if(l===void 0||!x)return;let j=x;switch(g){case 1:j*=pn;break;case 2:j*=gn;break}it()&&(j*=2),ie.add(l,{scale:j,clientX:p,clientY:C,event:y})}},b=y=>{const{target:w,button:x,clientX:p,clientY:C,pointerId:g,altKey:S,ctrlKey:T,metaKey:P,isPrimary:D}=y;if(c.current.pointers[g]={clientX:p,clientY:C},D&&(c.current.mainPointer=void 0),c.current.mainPointer!==void 0){if(c.current.mainPointer!==g)try{const{clientX:j,clientY:A}=Xt(c.current.pointers,g),N=(j+p)/2,W=(A+C)/2,Z=Ut([j,A],[p,C]);Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:C,prevX:N,prevY:W,startDistance:Z,prevDistance:Z})}catch(j){console.log("Error while getting other pointer. Ignoring",j),c.current.mainPointer}return}c.current.mainPointer=g,Object.assign(c.current,{pressed:!0,moving:!1,gestureStart:!1,startX:p,startY:C,prevX:p,prevY:C,currentButton:x,pointerDownEvent:y,startDistance:0,prevDistance:0,target:w,timeStart:Date.now(),longTapTimeout:setTimeout(async()=>{c.current.noTap=!0,ie.add(a,{clientX:p,clientY:C,altKey:S,ctrlKey:T,metaKey:P,target:w,event:y})},750)});try{w.setPointerCapture(g)}catch(j){console.log("Fail to capture pointer",j)}},v=y=>{if(c.current.pressed){const{pointerId:w,clientX:x,clientY:p,altKey:C,shiftKey:g,ctrlKey:S,metaKey:T,buttons:P}=y;c.current.pointers[w]={clientX:x,clientY:p},c.current.moving=!0;const D=Object.keys(c.current.pointers).length===2;let j,A,N=0;if(D){const{clientX:$,clientY:z}=Xt(c.current.pointers,w);j=($+x)/2,A=(z+p)/2,N=Ut([$,z],[x,p])}else j=x,A=p;let W=g||C||S||T||P!==1;m!=="drag"&&(W=!W);const Z=!W,M=W;if(Z){c.current.gestureStart||(f.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout),ie.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:C,shiftKey:g,ctrlKey:S,metaKey:T,target:c.current.target,event:c.current.pointerDownEvent}));const $=j-c.current.prevX,z=A-c.current.prevY,F=j-c.current.startX,Y=A-c.current.startY;ie.add(t,{deltaX:$,deltaY:z,startX:c.current.startX,startY:c.current.startY,clientX:j,clientY:A,distanceX:F,distanceY:Y,button:c.current.currentButton,altKey:C,shiftKey:g,ctrlKey:S,metaKey:T,target:c.current.target,event:y})}if(M){c.current.gestureStart||(f.current.style.cursor="move",c.current.gestureStart=!0,clearTimeout(c.current.longTapTimeout));const $=j-c.current.prevX,z=A-c.current.prevY,{target:F}=c.current;if(ie.add(o,{deltaX:$,deltaY:z,button:c.current.currentButton,altKey:C,shiftKey:g,ctrlKey:S,metaKey:T,target:F,event:y}),N!==c.current.prevDistance&&l){const Y=c.current.prevDistance-N;Math.abs(Y)>0&&(ie.add(l,{scale:Y*3,clientX:j,clientY:A,event:y}),c.current.prevDistance=N)}}c.current.prevX=j,c.current.prevY=A}},E=y=>{const{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T,pointerId:P}=y;if(c.current.pointers[P]){if(delete c.current.pointers[P],c.current.mainPointer!==P){const{clientX:D,clientY:j}=c.current.pointers[c.current.mainPointer];Object.assign(c.current,{prevX:D,prevY:j,prevDistance:0,startDistance:0});return}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);const{clientX:D,clientY:j}=c.current.pointers[c.current.mainPointer];Object.assign(c.current,{prevX:D,prevY:j,prevDistance:0,startDistance:0});return}catch(D){console.log("Fails to set pointer capture",D),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,ie.add(n,{deltaX:w-c.current.prevX,deltaY:x-c.current.prevY,startX:c.current.startX,startY:c.current.startY,clientX:w,clientY:x,distanceX:w-c.current.startX,distanceY:x-c.current.startY,button:c.current.currentButton,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,event:y}),f.current.style.cursor="auto";else{const D=Date.now();c.current.noTap?c.current.noTap=!1:c.current.timeStart-D<300&&ie.add(s,{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T,event:y})}}};return k("div",{onWheel:h,onPointerDown:b,onPointerMove:v,onPointerUp:E,onPointerOut:E,onPointerLeave:E,onPointerCancel:E,onDoubleClick:y=>{const{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T}=y;ie.add(u,{clientX:w,clientY:x,altKey:p,shiftKey:C,ctrlKey:g,metaKey:S,target:T,event:y})},style:{touchAction:"none"},ref:f,children:e})},at=({onResize:e,...t})=>{const[r]=Q(o=>[o.getBoardState]);return k(Ne,{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 Sn={data:""},bn=e=>typeof window=="object"?((e?e.querySelector("#_goober"):window._goober)||Object.assign((e||document.head).appendChild(document.createElement("style")),{innerHTML:" ",id:"_goober"})).firstChild:e||Sn,_n=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,En=/\/\*[^]*?\*\/| +/g,Wt=/\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},ce={},Vt=e=>{if(typeof e=="object"){let t="";for(let r in e)t+=r+Vt(e[r]);return t}return e},Cn=(e,t,r,n,o)=>{let s=Vt(e),a=ce[s]||(ce[s]=(l=>{let m=0,f=11;for(;m<l.length;)f=101*f+l.charCodeAt(m++)>>>0;return"go"+f})(s));if(!ce[a]){let l=s!==e?e:(m=>{let f,c,h=[{}];for(;f=_n.exec(m.replace(En,""));)f[4]?h.shift():f[3]?(c=f[3].replace(Wt," ").trim(),h.unshift(h[0][c]=h[0][c]||{})):h[0][f[1]]=f[2].replace(Wt," ").trim();return h[0]})(e);ce[a]=de(o?{["@keyframes "+a]:l}:l,r?"":"."+a)}let u=r&&ce.g?ce.g:null;return r&&(ce.g=ce[a]),((l,m,f,c)=>{c?m.data=m.data.replace(c,l):m.data.indexOf(l)===-1&&(m.data=f?l+m.data:m.data+l)})(ce[a],t,n,u),a},wn=(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 H(e){let t=this||{},r=e.call?e(t.p):e;return Cn(r.unshift?r.raw?wn(r,[].slice.call(arguments,1),t.p):r.reduce((n,o)=>Object.assign(n,o&&o.call?o(t.p):o),{}):r,bn(t.target),t.g,t.o,t.k)}H.bind({g:1}),H.bind({k:1});function xn(e,t,r,n){de.p=t}var In=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 On=H`
|
|
60
60
|
display: inline-block;
|
|
61
61
|
transition: transform 150ms;
|
|
62
62
|
user-select: none;
|